From df85da5c0cc59c7cba8dd674bf6e0d1272e35563 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 00:45:46 +0200 Subject: [PATCH 01/52] Fixed readme. Execute playbooks. --- connexion-101/README.md | 45 ++-- connexion-101/notebooks/00-intro.ipynb | 12 +- connexion-101/notebooks/02-openapi-3.ipynb | 4 +- connexion-101/notebooks/03-connexion.ipynb | 20 +- .../04-02-connexion-writing-operationid.ipynb | 8 +- .../notebooks/05-reusing-and-bundling.ipynb | 226 +++++++++++++++++- 6 files changed, 268 insertions(+), 47 deletions(-) diff --git a/connexion-101/README.md b/connexion-101/README.md index 275e133..019dfa5 100644 --- a/connexion-101/README.md +++ b/connexion-101/README.md @@ -1,14 +1,10 @@ -# Ansible 2 done right! +# Interoperable REST API ## Local Setup This course is based on Docker and Docker compose. As long as you have Docker -you can run it on: - - - linux - - mac - - windows +you can run it on any operating system. Docker should be exposed via TCP on 172.17.0.1:2375 @@ -38,11 +34,28 @@ or # firefox http://localhost:8888 -## Playing the course on DigitalOcean +## Playing the course on DigitalOcean and Ansible + +Once you have a digitalocean account, just +set your ssh key info in `site-digitalocean.yml` +then run the playbook: + +``` +$ export DO_API_TOKEN=xxxx +$ ansible-playbook -v site-digitalocean.yml +``` + +This will create one (or more) vms with +the course installed. + +Get the jupyter notebook url at the end of the deployment. + +## Playing the course on DigitalOcean -DigitalOcean is a great and cheap cloud-provider +If you don't use ansible, you can always setup everything +by hand. - - create an Ubuntu 16.04 docker droplet from the menu and ssh into your host + - create an Ubuntu 18.04 docker droplet from the menu and ssh into your host - expose docker on local http port ``` @@ -70,17 +83,3 @@ See asciicast here [![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI) -## Outline - - - - Ansible architecture - - Describe delivery layout in ansible.cfg - - Host and Group variables, Filters - - Static and dynamic inventories (docker) - - Vaults and Secrets - - Use bastions and other ssh_opts - - writing basic playbooks, test driven deployment - - Yaml pitfalls - - Inclusion and Roles - - Ansible galaxy as a role repository (bonus track) - diff --git a/connexion-101/notebooks/00-intro.ipynb b/connexion-101/notebooks/00-intro.ipynb index 2a22b8c..42f3b9b 100644 --- a/connexion-101/notebooks/00-intro.ipynb +++ b/connexion-101/notebooks/00-intro.ipynb @@ -8,11 +8,12 @@ "\n", "Welcome to the API-First training!\n", "\n", + "[Intro slides](https://docs.google.com/presentation/d/1c_pH0nVY5WwMOlMpr0vaeC1Mblpw-HvffvuECQgH4Yc/edit#slide=id.p4)\n", "\n", "## Agenda\n", "\n", "- [x] Course environment\n", - "- [x] [Interoperability](/notebooks/notebooks/01-interoperable-apis.ipynb)\n", + "- [x] [Interoperability](/notebooks/notebooks/01-interoperable-apis.ipynb): Goals, REST, RPC, Contract First.\n", "- [x] [API modeling with OpenAPI 3](/notebooks/notebooks/02-openapi-3.ipynb)\n", "- [x] [The `connexion` framework](/notebooks/notebooks/03-connexion.ipynb),\n", " mocking our API model, returning Problem objects\n", @@ -21,6 +22,7 @@ "- [x] Authorization: [basic auth](/notebooks/notebooks/06-connexion-authorization-basic.ipynb) \n", "- [x] Service management with [interoperabile throttling headers](/notebooks/notebooks/07-connexion-throttling-headers.ipynb)\n", "- [x] [Pagination](/notebooks/notebooks/08-pagination.ipynb)\n", + "- [ ] [Validation intro](/notebooks/notebooks/09-connexion-validation.ipynb)\n", "\n", "Bonus tracks:\n", "\n", @@ -31,10 +33,10 @@ "\n", "We will adopt an iterative strategy, progressively:\n", "\n", - "1- introduce more OAS3 features\n", - "2- write OAS3 specifications\n", - "3- implement the associated code\n", - "4- repeat " + "1. introduce more OAS3 features\n", + "2. write OAS3 specifications\n", + "3. implement the associated code\n", + "4. repeat " ] }, { diff --git a/connexion-101/notebooks/02-openapi-3.ipynb b/connexion-101/notebooks/02-openapi-3.ipynb index 76ca3f8..e8e5b5a 100644 --- a/connexion-101/notebooks/02-openapi-3.ipynb +++ b/connexion-101/notebooks/02-openapi-3.ipynb @@ -253,9 +253,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": { - "hide_input": true + "hide_input": false }, "outputs": [ { diff --git a/connexion-101/notebooks/03-connexion.ipynb b/connexion-101/notebooks/03-connexion.ipynb index fd1df12..cb54373 100644 --- a/connexion-101/notebooks/03-connexion.ipynb +++ b/connexion-101/notebooks/03-connexion.ipynb @@ -15,7 +15,8 @@ "- dispatch requests\n", "- serve mock responses on unimplemented methods\n", "- validate input and output of the called methods\n", - "- apply authentication policies" + "- apply authentication policies\n", + "- provide an API Documentation UI (Swagger UI) where we can browse our API." ] }, { @@ -64,12 +65,17 @@ "\n", "```\n", "connexion run /code/notebooks/oas3/ex-01-info-ok.yaml\n", - "```" + "```\n", + "\n", + "Remember:\n", + "\n", + "- default port is `:5000`\n", + "- the Swagger GUI is at the `/ui` path." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -173,7 +179,13 @@ "source": [ "### Exercise: the `servers` parameter\n", "\n", - "Edit the `servers` attribute so that it points to your actual endpoint URL (eg. your IP/port)." + "Edit the `servers` attribute so that it points to your actual endpoint URL (eg. your IP/port).\n", + "\n", + "Now check the outcome.\n", + "\n", + "```\n", + "connexion run /code/notebooks/oas3/ex-02-servers-ok.yaml\n", + "```" ] }, { diff --git a/connexion-101/notebooks/04-02-connexion-writing-operationid.ipynb b/connexion-101/notebooks/04-02-connexion-writing-operationid.ipynb index a0cc4d0..0cc01c1 100644 --- a/connexion-101/notebooks/04-02-connexion-writing-operationid.ipynb +++ b/connexion-101/notebooks/04-02-connexion-writing-operationid.ipynb @@ -2,7 +2,9 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "solution": "hidden" + }, "source": [ "# A new path: /echo\n", "\n", @@ -428,9 +430,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "solution": "hidden" - }, + "metadata": {}, "outputs": [ { "name": "stdout", diff --git a/connexion-101/notebooks/05-reusing-and-bundling.ipynb b/connexion-101/notebooks/05-reusing-and-bundling.ipynb index 0c57507..44e1931 100644 --- a/connexion-101/notebooks/05-reusing-and-bundling.ipynb +++ b/connexion-101/notebooks/05-reusing-and-bundling.ipynb @@ -53,9 +53,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: openapi_resolver in /usr/local/lib/python3.6/site-packages (0.0.5)\r\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/site-packages (from openapi_resolver) (5.1.1)\r\n", + "Requirement already satisfied: pathlib in /usr/local/lib/python3.6/site-packages (from openapi_resolver) (1.0.1)\r\n", + "Requirement already satisfied: six in /usr/local/lib/python3.6/site-packages (from openapi_resolver) (1.12.0)\r\n" + ] + } + ], "source": [ "# Exercise: creating a bundle from a $ref file\n", "# \n", @@ -65,9 +76,166 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "openapi: 3.0.0\r\n", + "info:\r\n", + " title: foo\r\n", + " version: '0.1'\r\n", + "servers:\r\n", + "- description: Development server\r\n", + " url: https://localhost:8443/datetime/v1\r\n", + "- description: Test server\r\n", + " url: https://api.example.com/datetime/v1\r\n", + " x-healthCheck:\r\n", + " interval: 300\r\n", + " timeout: 15\r\n", + " url: https://api.example.com/datetime/v1/status\r\n", + " x-sandbox: true\r\n", + "paths:\r\n", + " /echo:\r\n", + " get:\r\n", + " description: |\r\n", + " Return the current timestamp, in the specified\r\n", + " timezone. If the timezone does not\r\n", + " exist returns 400 Bad Request, specifying that\r\n", + " the given timezone is not in our database.\r\n", + " operationId: api.get_echo\r\n", + " parameters:\r\n", + " - $ref: '#/components/parameters/tz'\r\n", + " responses:\r\n", + " 503:\r\n", + " $ref: '#/components/responses/503ServiceUnavailable'\r\n", + " '200':\r\n", + " content:\r\n", + " application/problem+json:\r\n", + " example:\r\n", + " datetime: 20010507T00:00:10Z\r\n", + " schema:\r\n", + " $ref: '#/components/schemas/Datetime'\r\n", + " description: |\r\n", + " The current timestamp.\r\n", + " '400':\r\n", + " $ref: '#/components/responses/400BadRequest'\r\n", + " summary: Return the current timestamp in RFC3339\r\n", + " /status:\r\n", + " get:\r\n", + " description: |\r\n", + " Ritorna lo stato dell'applicazione. A scopo\r\n", + " di test, su base randomica puo' ritornare\r\n", + " un errore.\r\n", + " operationId: api.get_status\r\n", + " responses:\r\n", + " 503:\r\n", + " $ref: '#/components/responses/503ServiceUnavailable'\r\n", + " '200':\r\n", + " content:\r\n", + " application/problem+json:\r\n", + " example:\r\n", + " detail: The app is running smoothly.\r\n", + " status: 200\r\n", + " title: OK\r\n", + " schema:\r\n", + " $ref: '#/components/schemas/Problem'\r\n", + " description: |\r\n", + " Il server ha ritornato lo status. In caso di problemi\r\n", + " ritorna sempre un problem+json.\r\n", + " summary: Ritorna lo stato dell'applicazione.\r\n", + "components:\r\n", + " headers:\r\n", + " Retry-After:\r\n", + " description: |-\r\n", + " Retry contacting the endpoint *at least* after seconds.\r\n", + " See https://tools.ietf.org/html/rfc7231#section-7.1.3\r\n", + " schema:\r\n", + " format: int32\r\n", + " type: integer\r\n", + " parameters:\r\n", + " tz:\r\n", + " in: query\r\n", + " name: tz\r\n", + " schema:\r\n", + " $ref: '#/components/schemas/Timezone'\r\n", + " responses:\r\n", + " 400BadRequest:\r\n", + " content:\r\n", + " application/problem+json:\r\n", + " schema:\r\n", + " $ref: '#/components/schemas/Problem'\r\n", + " description: Bad Request\r\n", + " 503ServiceUnavailable:\r\n", + " content:\r\n", + " application/problem+json:\r\n", + " schema:\r\n", + " $ref: '#/components/schemas/Problem'\r\n", + " description: Service Unavailable\r\n", + " headers:\r\n", + " Retry-After:\r\n", + " $ref: '#/components/headers/Retry-After'\r\n", + " schemas:\r\n", + " Datetime:\r\n", + " properties:\r\n", + " timestamp:\r\n", + " example: 2019-01-01 00:00:00\r\n", + " format: datetime\r\n", + " type: string\r\n", + " required:\r\n", + " - timestamp\r\n", + " Problem:\r\n", + " properties:\r\n", + " detail:\r\n", + " description: |\r\n", + " A human readable explanation specific to this occurrence of the\r\n", + " problem. You MUST NOT expose internal informations, personal\r\n", + " data or implementation details through this field.\r\n", + " example: Request took too long to complete.\r\n", + " type: string\r\n", + " instance:\r\n", + " description: |\r\n", + " An absolute URI that identifies the specific occurrence of the problem.\r\n", + " It may or may not yield further information if dereferenced.\r\n", + " format: uri\r\n", + " type: string\r\n", + " status:\r\n", + " description: |\r\n", + " The HTTP status code generated by the origin server for this occurrence\r\n", + " of the problem.\r\n", + " example: 503\r\n", + " exclusiveMaximum: true\r\n", + " format: int32\r\n", + " maximum: 600\r\n", + " minimum: 100\r\n", + " type: integer\r\n", + " title:\r\n", + " description: |\r\n", + " A short, summary of the problem type. Written in english and readable\r\n", + " for engineers (usually not suited for non technical stakeholders and\r\n", + " not localized); example: Service Unavailable\r\n", + " type: string\r\n", + " type:\r\n", + " default: about:blank\r\n", + " description: |\r\n", + " An absolute URI that identifies the problem type. When dereferenced,\r\n", + " it SHOULD provide human-readable documentation for the problem type\r\n", + " (e.g., using HTML).\r\n", + " example: https://tools.ietf.org/html/rfc7231#section-6.6.4\r\n", + " format: uri\r\n", + " type: string\r\n", + " type: object\r\n", + " Timezone:\r\n", + " description: |\r\n", + " A timezone in the form of continent/city\r\n", + " or \"UTC\".\r\n", + " example: Europe/Rome\r\n", + " type: string\r\n" + ] + } + ], "source": [ "# Exercise: create a bundle from the previous file with\n", "!python -m openapi_resolver /code/notebooks/oas3/ex-05-01-bundle.yaml" @@ -96,9 +264,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#\n", + "# YAML examples from https://learnxinyminutes.com/docs/yaml/\n", + "#\n", + "\n", + "anchored_content: &anchor_name This string will appear as the value of two keys.\n", + "other_anchor: *anchor_name\n", + "\n", + "# Anchors can be used to duplicate/inherit properties\n", + "base: &base\n", + " name: Everyone has same name\n", + "\n", + "# The regexp << is called Merge Key Language-Independent Type. It is used to\n", + "# indicate that all the keys of one or more specified maps should be inserted\n", + "# into the current map.\n", + "\n", + "foo: &foo\n", + " <<: *base\n", + " age: 10\n", + "\n", + "bar: &bar\n", + " <<: *base\n", + " age: 20\n", + "\n", + "\n" + ] + } + ], "source": [ "# Check yaml file content.\n", "from pathlib import Path\n", @@ -110,9 +309,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'name': 'Everyone has same name', 'age': 10}\n", + "{'name': 'Everyone has same name', 'age': 20}\n" + ] + } + ], "source": [ "ret = yaml.safe_load(content)\n", "\n", @@ -144,7 +352,7 @@ "\n", "```\n", "\n", - "Then use the anchor to reference them.\n", + "Then use the `<<: ` keyword and `*anchor_name` to reference them.\n", "\n", "```\n", "paths:\n", From 4afb74ba9aaeb12867d0ec8de4dd0b5050d18261 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 00:52:04 +0200 Subject: [PATCH 02/52] fix readme --- connexion-101/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/connexion-101/README.md b/connexion-101/README.md index 019dfa5..6d581e6 100644 --- a/connexion-101/README.md +++ b/connexion-101/README.md @@ -6,7 +6,8 @@ This course is based on Docker and Docker compose. As long as you have Docker you can run it on any operating system. -Docker should be exposed via TCP on 172.17.0.1:2375 +Docker should be exposed via TCP on 172.17.0.1:2375. If you have concerns +in exposing docker, just use a temporary VM for the course (see below). On Linux, set @@ -28,9 +29,8 @@ Run the environemnt with: # make course -or +And point the browser on the printed URL, eg. - # docker-compose scale course=1 bastion=1 web=3 # firefox http://localhost:8888 From 842f2ea56ce6e42d09edad5f9e4a90456330605c Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 01:08:59 +0200 Subject: [PATCH 03/52] Validators --- .../notebooks/09-connexion-validation.ipynb | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/connexion-101/notebooks/09-connexion-validation.ipynb b/connexion-101/notebooks/09-connexion-validation.ipynb index 03af91a..1466ffc 100644 --- a/connexion-101/notebooks/09-connexion-validation.ipynb +++ b/connexion-101/notebooks/09-connexion-validation.ipynb @@ -67,6 +67,41 @@ "Does `connexion` always behave as you expected?" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Caveats\n", + "\n", + "Validation can be tricky as you may have different requirements and connexion behavior may not fit your goals.\n", + "\n", + "Connexion validators are quite tolerant, but you can write your own extending a validator class (eg. for request body, parameters, responses, ...)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from connexion.decorators.validation import (\n", + " RequestBodyValidator,\n", + " ResponseBodyValidator,\n", + " ParameterValidator)\n", + "\n", + "def CustomBodyValidator(RequestBodyValidator):\n", + " raise NotImplementedError\n", + "\n", + "def main():\n", + " app = FlaskApp()\n", + " app.add_api(\"simple.yaml\", \n", + " validate_responses=True,\n", + " validator_map={\n", + " 'body': CustomBodyValidator, \n", + " }\n", + " )" + ] + }, { "cell_type": "code", "execution_count": null, From 096d046fe6d307939321d22187353240c23fa8a3 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 01:11:18 +0200 Subject: [PATCH 04/52] jwt --- .../notebooks/06-connexion-authorization-basic.ipynb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/connexion-101/notebooks/06-connexion-authorization-basic.ipynb b/connexion-101/notebooks/06-connexion-authorization-basic.ipynb index 646a8e8..97bbbd1 100644 --- a/connexion-101/notebooks/06-connexion-authorization-basic.ipynb +++ b/connexion-101/notebooks/06-connexion-authorization-basic.ipynb @@ -234,6 +234,13 @@ " " ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A complete JWT example is [here](https://github.com/zalando/connexion/blob/master/examples/openapi3/jwt/app.py)" + ] + }, { "cell_type": "code", "execution_count": null, From 1cf6128102c7eff69dfbe330b9a5972577499b83 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 11:28:10 +0200 Subject: [PATCH 05/52] Cleanup cells. --- connexion-101/notebooks/00-intro.ipynb | 70 +++++-------------- connexion-101/notebooks/02-openapi-3.ipynb | 80 ++-------------------- 2 files changed, 24 insertions(+), 126 deletions(-) diff --git a/connexion-101/notebooks/00-intro.ipynb b/connexion-101/notebooks/00-intro.ipynb index 42f3b9b..e0d5f20 100644 --- a/connexion-101/notebooks/00-intro.ipynb +++ b/connexion-101/notebooks/00-intro.ipynb @@ -26,7 +26,7 @@ "\n", "Bonus tracks:\n", "\n", - "- [ ] Authorization with JWT\n", + "- [x] Authorization with JWT\n", "\n", "\n", "## Strategy\n", @@ -60,18 +60,21 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a string and the number 1\n", - "now s is increased 2\n" - ] - } - ], + "outputs": [], + "source": [ + "# An API Editor is available at the following address\n", + "print(oas_editor_url(''))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "solution": "hidden" + }, + "outputs": [], "source": [ "# You can evaluate maths and strings\n", "s = 1\n", @@ -83,19 +86,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 8\r\n", - "-rw-rw-r--. 1 1000 1000 932 Jul 4 19:43 99-last.py\r\n", - "-rw-rw-r--. 1 1000 1000 371 Jun 24 11:43 README\r\n" - ] - } - ], + "outputs": [], "source": [ "# Note: all notebooks preload the definitions in \n", "!ls -l /root/.ipython/profile_default/startup" @@ -104,35 +97,6 @@ { "cell_type": "markdown", "metadata": {}, - "source": [ - "# Git\n", - "\n", - "is the powerful versioning system used to distribute this course\n", - "\n", - "Go to your [git beginners course](/notebooks/notebooks/rendered_notebooks/git-101/01-git.ipynb)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Docker\n", - "\n", - "Docker is a lightweight container environment. Jupyter and all other \"machines\" are based on docker.\n", - "\n", - "[Slideshare presentation](https://www.slideshare.net/ioggstream/docker-virtualizzazione-leggera)\n", - "\n", - "[Reveal JS](http://www.piumalab.org/dockerslide)\n", - "\n", - "Some examples via a [local terminal](/terminals/example)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "solution": "hidden" - }, "source": [ "## Exercises\n", "\n", diff --git a/connexion-101/notebooks/02-openapi-3.ipynb b/connexion-101/notebooks/02-openapi-3.ipynb index e8e5b5a..30c0f2a 100644 --- a/connexion-101/notebooks/02-openapi-3.ipynb +++ b/connexion-101/notebooks/02-openapi-3.ipynb @@ -58,32 +58,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "hide_input": false, "tags": [ "hide_input" ] }, - "outputs": [ - { - "data": { - "text/markdown": [ - "\n", - "\n", - "[Swagger Editor](http://192.168.0.15:8080/?url=https://raw.githubusercontent.com/teamdigitale/api-starter-kit/master/openapi/simple.yaml.src) is a simple webapp\n", - "for editing OpenAPI 3 language specs.\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "remote_yaml = 'https://raw.githubusercontent.com/teamdigitale/api-starter-kit/master/openapi/simple.yaml.src'\n", "render_markdown(f'''\n", @@ -147,38 +129,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { "hide_input": true }, - "outputs": [ - { - "data": { - "text/markdown": [ - "\n", - "\n", - "1- open [this incomplete OAS3 spec](/edit/notebooks/oas3/ex-01-info.yaml).\n", - "\n", - "2- copy its content in the [Swagger Editor Online](http://192.168.0.15:8080/?url=) fixing all errors \n", - " and adding the missing informations.\n", - "\n", - "3- describe the first API we're going to implement: a service which returns the current\n", - " timestamp in [RFC5454](https://tools.ietf.org/html/rfc5424#section-6.2.3) \n", - " UTC (eg. `2019-01-01T00:00:00Z`).\n", - " \n", - "4- provide contact informations and terms of services. \n", - "\n", - "5- Feel free to add as many details as you want.\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "render_markdown(f'''\n", "\n", @@ -200,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "hide_input": true }, @@ -253,32 +208,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "hide_input": false }, - "outputs": [ - { - "data": { - "text/markdown": [ - "\n", - "\n", - "1- open [the previous OAS3 spec](/edit/notebooks/oas3/ex-01-info.yaml).\n", - "\n", - "2- copy its content in the [Swagger Editor Online](http://192.168.0.15:8080/?url=).\n", - "\n", - "3- provide further informations via custom fields: if you think of any interesting \n", - " label, define them and comment properly using `#` \n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "render_markdown(f'''\n", "\n", From d4ec79729b95eaaeb5553470cf73dc6b6748593f Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 11:42:31 +0200 Subject: [PATCH 06/52] add base file --- connexion-101/notebooks/00-intro.ipynb | 33 +++ connexion-101/notebooks/03-connexion.ipynb | 238 ++------------------- connexion-101/notebooks/oas3/openapi.yaml | 10 + 3 files changed, 59 insertions(+), 222 deletions(-) create mode 100644 connexion-101/notebooks/oas3/openapi.yaml diff --git a/connexion-101/notebooks/00-intro.ipynb b/connexion-101/notebooks/00-intro.ipynb index e0d5f20..0182b90 100644 --- a/connexion-101/notebooks/00-intro.ipynb +++ b/connexion-101/notebooks/00-intro.ipynb @@ -58,6 +58,39 @@ "FIXME: Go to the [basic python course](/tree/notebooks/rendered_notebooks/python-basic)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Course services\n", + "\n", + "- HOSTNAME:`8888/notebooks` this Jupyter notebook\n", + "- HOSTNAME:`8080` the API Documentation Web UI (Swagger UI)\n", + "- HOSTNAME:`5000` the flask application we will execute during the course\n", + "\n", + "## Customizing the flask app\n", + "\n", + "To simplify things, during the training we'll run the connexion-flask app with the `connexion run` command. \n", + "You can always provide a custom `__main__.py` like you normally do with your flask app (eg: enable TLS, ...).\n", + "\n", + "Whenever you complete an exercise, you should run\n", + "\n", + "```\n", + "connexion \n", + "```\n", + "\n", + "## If you can't do an exercise\n", + "\n", + "During the course we'll write two files:\n", + "\n", + "- openapi.yaml with the API specifications;\n", + "- api.py with the API implementation\n", + "\n", + "You can find solutions in the training directory, so if you can't complete your openapi.yaml\n", + "there\n", + "\n" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/connexion-101/notebooks/03-connexion.ipynb b/connexion-101/notebooks/03-connexion.ipynb index cb54373..47ef2f2 100644 --- a/connexion-101/notebooks/03-connexion.ipynb +++ b/connexion-101/notebooks/03-connexion.ipynb @@ -21,35 +21,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: connexion[swagger-ui] in /usr/local/lib/python3.6/site-packages (2.3.0)\n", - "Requirement already satisfied: openapi-spec-validator>=0.2.4 in /usr/local/lib/python3.6/site-packages (from connexion[swagger-ui]) (0.2.7)\n", - "Requirement already satisfied: clickclick>=1.2 in /usr/local/lib/python3.6/site-packages (from connexion[swagger-ui]) (1.2.2)\n", - "Requirement already satisfied: jsonschema<3.0.0,>=2.5.1 in /usr/local/lib/python3.6/site-packages (from connexion[swagger-ui]) (2.6.0)\n", - "Requirement already satisfied: requests>=2.9.1 in /usr/local/lib/python3.6/site-packages (from connexion[swagger-ui]) (2.22.0)\n", - "Requirement already satisfied: six>=1.9 in /usr/local/lib/python3.6/site-packages (from connexion[swagger-ui]) (1.12.0)\n", - "Requirement already satisfied: flask>=0.10.1 in /usr/local/lib/python3.6/site-packages (from connexion[swagger-ui]) (1.0.3)\n", - "Requirement already satisfied: inflection>=0.3.1 in /usr/local/lib/python3.6/site-packages (from connexion[swagger-ui]) (0.3.1)\n", - "Requirement already satisfied: PyYAML>=5.1 in /usr/local/lib/python3.6/site-packages (from connexion[swagger-ui]) (5.1.1)\n", - "Requirement already satisfied: swagger-ui-bundle>=0.0.2; extra == \"swagger-ui\" in /usr/local/lib/python3.6/site-packages (from connexion[swagger-ui]) (0.0.5)\n", - "Requirement already satisfied: click>=4.0 in /usr/local/lib/python3.6/site-packages (from clickclick>=1.2->connexion[swagger-ui]) (7.0)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/site-packages (from requests>=2.9.1->connexion[swagger-ui]) (2019.3.9)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/site-packages (from requests>=2.9.1->connexion[swagger-ui]) (1.25.3)\n", - "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/site-packages (from requests>=2.9.1->connexion[swagger-ui]) (2.8)\n", - "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/site-packages (from requests>=2.9.1->connexion[swagger-ui]) (3.0.4)\n", - "Requirement already satisfied: Werkzeug>=0.14 in /usr/local/lib/python3.6/site-packages (from flask>=0.10.1->connexion[swagger-ui]) (0.15.4)\n", - "Requirement already satisfied: Jinja2>=2.10 in /usr/local/lib/python3.6/site-packages (from flask>=0.10.1->connexion[swagger-ui]) (2.10.1)\n", - "Requirement already satisfied: itsdangerous>=0.24 in /usr/local/lib/python3.6/site-packages (from flask>=0.10.1->connexion[swagger-ui]) (1.1.0)\n", - "Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.6/site-packages (from Jinja2>=2.10->flask>=0.10.1->connexion[swagger-ui]) (1.1.1)\n" - ] - } - ], + "outputs": [], "source": [ "# At first ensure connexion is installed \n", "# together with the swagger module used to render the OAS3 spec\n", @@ -75,23 +49,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "* Rebuilt URL to: http://0.0.0.0:5000/\r\n", - "* Trying 0.0.0.0...\r\n", - "* TCP_NODELAY set\r\n", - "* connect to 0.0.0.0 port 5000 failed: Connection refused\r\n", - "* Failed to connect to 0.0.0.0 port 5000: Connection refused\r\n", - "* Closing connection 0\r\n", - "curl: (7) Failed to connect to 0.0.0.0 port 5000: Connection refused\r\n" - ] - } - ], + "outputs": [], "source": [ "# A request on a generic PATH on the server returns a \n", "# nicely formatted and explicative error.\n", @@ -101,27 +61,11 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "hide_input": true }, - "outputs": [ - { - "data": { - "text/markdown": [ - "\n", - "Open the [documentation URL](http://192.168.0.15:5000/ui) and check the outcome!\n", - "\n", - "Play a bit with Swagger UI." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "render_markdown(f'''\n", "Open the [documentation URL]({api_server_url('http://github.com/ui')}) and check the outcome!\n", @@ -320,31 +264,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": { "solution": "shown", "solution_first": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"detail\": \"So far so good.\",\n", - " \"status\": 200,\n", - " \"title\": \"OK\",\n", - " \"type\": \"about:blank\"\n", - "}\n", - "{\n", - " \"detail\": \"The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.\",\n", - " \"status\": 404,\n", - " \"title\": \"Not Found\",\n", - " \"type\": \"about:blank\"\n", - "}\n" - ] - } - ], + "outputs": [], "source": [ "# Exercise: what's the expected output of the following command?\n", "\n", @@ -409,116 +334,20 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "properties:\n", - " detail:\n", - " description: |\n", - " A human readable explanation specific to this occurrence of the\n", - " problem. You MUST NOT expose internal informations, personal\n", - " data or implementation details through this field.\n", - " example: Request took too long to complete.\n", - " type: string\n", - " instance:\n", - " description: |\n", - " An absolute URI that identifies the specific occurrence of the problem.\n", - " It may or may not yield further information if dereferenced.\n", - " format: uri\n", - " type: string\n", - " status:\n", - " description: |\n", - " The HTTP status code generated by the origin server for this occurrence\n", - " of the problem.\n", - " example: 503\n", - " exclusiveMaximum: true\n", - " format: int32\n", - " maximum: 600\n", - " minimum: 100\n", - " type: integer\n", - " title:\n", - " description: |\n", - " A short, summary of the problem type. Written in english and readable\n", - " for engineers (usually not suited for non technical stakeholders and\n", - " not localized); example: Service Unavailable\n", - " type: string\n", - " type:\n", - " default: about:blank\n", - " description: |\n", - " An absolute URI that identifies the problem type. When dereferenced,\n", - " it SHOULD provide human-readable documentation for the problem type\n", - " (e.g., using HTML).\n", - " example: https://tools.ietf.org/html/rfc7231#section-6.6.4\n", - " format: uri\n", - " type: string\n", - "type: object\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "print(show_component('https://teamdigitale.github.io/openapi/0.0.5/definitions.yaml#/schemas/Problem'))" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "solution": "shown" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "properties:\n", - " detail:\n", - " description: |\n", - " A human readable explanation specific to this occurrence of the\n", - " problem. You MUST NOT expose internal informations, personal\n", - " data or implementation details through this field.\n", - " example: Request took too long to complete.\n", - " type: string\n", - " instance:\n", - " description: |\n", - " An absolute URI that identifies the specific occurrence of the problem.\n", - " It may or may not yield further information if dereferenced.\n", - " format: uri\n", - " type: string\n", - " status:\n", - " description: |\n", - " The HTTP status code generated by the origin server for this occurrence\n", - " of the problem.\n", - " example: 503\n", - " exclusiveMaximum: true\n", - " format: int32\n", - " maximum: 600\n", - " minimum: 100\n", - " type: integer\n", - " title:\n", - " description: |\n", - " A short, summary of the problem type. Written in english and readable\n", - " for engineers (usually not suited for non technical stakeholders and\n", - " not localized); example: Service Unavailable\n", - " type: string\n", - " type:\n", - " default: about:blank\n", - " description: |\n", - " An absolute URI that identifies the problem type. When dereferenced,\n", - " it SHOULD provide human-readable documentation for the problem type\n", - " (e.g., using HTML).\n", - " example: https://tools.ietf.org/html/rfc7231#section-6.6.4\n", - " format: uri\n", - " type: string\n", - "type: object\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "# Exercise: use the yaml and requests libraries \n", "# to download the Problem schema\n", @@ -534,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "solution": "hidden", "solution_first": true @@ -550,46 +379,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": { "solution": "hidden" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "info.commit\n", - "info.date\n", - "info.description\n", - "info.version\n", - "headers.Retry-After\n", - "headers.X-RateLimit-Limit\n", - "headers.X-RateLimit-Remaining\n", - "headers.X-RateLimit-Reset\n", - "parameters.Etag\n", - "parameters.IfMatch\n", - "parameters.IfNoneMatch\n", - "parameters.citizen\n", - "parameters.cursor\n", - "parameters.fields\n", - "parameters.limit\n", - "parameters.offset\n", - "parameters.q\n", - "parameters.sort\n", - "responses.400BadRequest\n", - "responses.404NotFound\n", - "responses.429TooManyRequests\n", - "responses.503ServiceUnavailable\n", - "responses.default\n", - "schemas.CurrencyCode\n", - "schemas.Money\n", - "schemas.Person\n", - "schemas.Problem\n", - "schemas.TaxCode\n" - ] - } - ], + "outputs": [], "source": [ "for sections, v in definitions.items():\n", " for items, vv in v.items():\n", @@ -611,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/connexion-101/notebooks/oas3/openapi.yaml b/connexion-101/notebooks/oas3/openapi.yaml new file mode 100644 index 0000000..604ca21 --- /dev/null +++ b/connexion-101/notebooks/oas3/openapi.yaml @@ -0,0 +1,10 @@ +# Complete this file with the required informations +# using your swagger-editor. You should +# - fix all the eventual error +# - add the missing parameters +# so that the file become a valid OAS3 spec. +openapi: 3 +info: + version: 0.1 +paths: {} +components: {} From bbbd1070b99f5969e5b6b7f934cdd32cfb4c5a7d Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 11:50:04 +0200 Subject: [PATCH 07/52] move solutions away --- connexion-101/notebooks/00-intro.ipynb | 9 ++- .../notebooks/08-connexion-pagination.ipynb | 2 +- connexion-101/notebooks/oas3/api-solution.py | 76 +++++++++++++++++++ connexion-101/notebooks/oas3/api.py | 51 +------------ 4 files changed, 88 insertions(+), 50 deletions(-) create mode 100644 connexion-101/notebooks/oas3/api-solution.py diff --git a/connexion-101/notebooks/00-intro.ipynb b/connexion-101/notebooks/00-intro.ipynb index 0182b90..c76351a 100644 --- a/connexion-101/notebooks/00-intro.ipynb +++ b/connexion-101/notebooks/00-intro.ipynb @@ -76,7 +76,7 @@ "Whenever you complete an exercise, you should run\n", "\n", "```\n", - "connexion \n", + "connexion run /code/notebooks/oas3/openapi.yaml\n", "```\n", "\n", "## If you can't do an exercise\n", @@ -87,7 +87,12 @@ "- api.py with the API implementation\n", "\n", "You can find solutions in the training directory, so if you can't complete your openapi.yaml\n", - "there\n", + "you can run the solution (which ends with `-ok.yaml` instead, with\n", + "\n", + "```\n", + "connexion run /code/notebooks/oas3/ex-03-02-path-ok.yaml\n", + "```\n", + "\n", "\n" ] }, diff --git a/connexion-101/notebooks/08-connexion-pagination.ipynb b/connexion-101/notebooks/08-connexion-pagination.ipynb index 3a4a27d..f7aa764 100644 --- a/connexion-101/notebooks/08-connexion-pagination.ipynb +++ b/connexion-101/notebooks/08-connexion-pagination.ipynb @@ -309,7 +309,7 @@ } ], "source": [ - "!grep '^def get_timezones' oas3/api.py -A20 -B1" + "!grep '^def get_timezones' oas3/api-solution.py -A20 -B1" ] }, { diff --git a/connexion-101/notebooks/oas3/api-solution.py b/connexion-101/notebooks/oas3/api-solution.py new file mode 100644 index 0000000..0e40fa8 --- /dev/null +++ b/connexion-101/notebooks/oas3/api-solution.py @@ -0,0 +1,76 @@ +from datetime import datetime +from random import randint + +import pytz +from connexion import problem +from flask import after_this_request, request + +from throttling_quota import throttle + + +@throttle +def get_status(): + """Implement the get_status operation + :return: a problem+json with status 200, title "OK" and a successful + message in detail + """ + headers = {"Cache-Control": "no-store"} + + p = randint(1, 5) + if p == 5: + return problem( + status=503, + title="Service Temporarily Unavailable", + detail="Retry after the number of seconds specified in the the Retry-After header.", + headers={"Retry-After": p, **headers}, + ) + return problem( + status=200, title="OK", detail="So far so good.", headers=headers + ) + + +@throttle +def get_echo(tz="Zulu", user=None, token_info=None): + if tz not in pytz.all_timezones: + return problem( + status=400, + title="Bad Timezone", + detail="The specified timezone is not valid", + ext={"valid_timezones": pytz.all_timezones}, + ) + d = datetime.now(tz=pytz.timezone(tz)) + r = {"timestamp": d.isoformat().replace("+00:00", "Z")} + + # + # Eventually append user info. + # + if user: + r["user"] = user + r["ti"] = token_info + + return (r, 200, {}) + + +ALL_TIMEZONES = sorted(pytz.all_timezones) + + +# @throttle +def get_timezones(limit=5, offset=0, continent=None): + entries = ALL_TIMEZONES + + if continent is not None: + continent = str(continent).capitalize() + "/" + entries = [x for x in entries if x.startswith(continent)] + + entries = entries[offset : offset + limit] + return { + "limit": limit, + "offset": offset, + "entries": entries, + "count": len(entries), + } + + +@throttle +def get_timezones_by_continent(limit=5, offset=0, continent=None): + return get_timezones(limit, offset, continent) diff --git a/connexion-101/notebooks/oas3/api.py b/connexion-101/notebooks/oas3/api.py index 0e40fa8..cea7d5b 100644 --- a/connexion-101/notebooks/oas3/api.py +++ b/connexion-101/notebooks/oas3/api.py @@ -3,66 +3,23 @@ import pytz from connexion import problem -from flask import after_this_request, request +from flask import request -from throttling_quota import throttle - -@throttle def get_status(): """Implement the get_status operation :return: a problem+json with status 200, title "OK" and a successful message in detail """ - headers = {"Cache-Control": "no-store"} - - p = randint(1, 5) - if p == 5: - return problem( - status=503, - title="Service Temporarily Unavailable", - detail="Retry after the number of seconds specified in the the Retry-After header.", - headers={"Retry-After": p, **headers}, - ) - return problem( - status=200, title="OK", detail="So far so good.", headers=headers - ) + raise NotImplementedError -@throttle def get_echo(tz="Zulu", user=None, token_info=None): - if tz not in pytz.all_timezones: - return problem( - status=400, - title="Bad Timezone", - detail="The specified timezone is not valid", - ext={"valid_timezones": pytz.all_timezones}, - ) - d = datetime.now(tz=pytz.timezone(tz)) - r = {"timestamp": d.isoformat().replace("+00:00", "Z")} - - # - # Eventually append user info. - # - if user: - r["user"] = user - r["ti"] = token_info + raise NotImplementedError - return (r, 200, {}) - -ALL_TIMEZONES = sorted(pytz.all_timezones) - - -# @throttle def get_timezones(limit=5, offset=0, continent=None): - entries = ALL_TIMEZONES - - if continent is not None: - continent = str(continent).capitalize() + "/" - entries = [x for x in entries if x.startswith(continent)] - - entries = entries[offset : offset + limit] + raise NotImplementedError return { "limit": limit, "offset": offset, From 879cf2196e498c8d72bea775682f8df0d0c7401a Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 21:38:16 +0200 Subject: [PATCH 08/52] Add directory infos --- connexion-101/notebooks/00-intro.ipynb | 51 ++++++++++++++++++-------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/connexion-101/notebooks/00-intro.ipynb b/connexion-101/notebooks/00-intro.ipynb index c76351a..d9cf64d 100644 --- a/connexion-101/notebooks/00-intro.ipynb +++ b/connexion-101/notebooks/00-intro.ipynb @@ -62,11 +62,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Course services\n", + "## Course services and directories\n", "\n", - "- HOSTNAME:`8888/notebooks` this Jupyter notebook\n", - "- HOSTNAME:`8080` the API Documentation Web UI (Swagger UI)\n", - "- HOSTNAME:`5000` the flask application we will execute during the course\n", + "- IP:`8888/notebooks` this Jupyter notebook\n", + "- IP:`8080` the API Documentation Web UI (Swagger UI)\n", + "- IP:`5000` the flask application we will execute during the course\n", + "\n", + "Once you open the [terminal](/terminal/1) you will find\n", + "all the course under `/code`.\n", + "\n", + "```\n", + "/code/\n", + "│   \n", + "└── notebooks # All notebooks!\n", + " ├── oas3 # OpenAPI specifications, files and exercises\n", + " │  \n", + " └── startup # startup files for jupyter, don't touch ;)\n", + "```\n", "\n", "## Customizing the flask app\n", "\n", @@ -77,9 +89,14 @@ "\n", "```\n", "connexion run /code/notebooks/oas3/openapi.yaml\n", - "```\n", - "\n", - "## If you can't do an exercise\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## If you can't do an exercise...\n", "\n", "During the course we'll write two files:\n", "\n", @@ -91,16 +108,22 @@ "\n", "```\n", "connexion run /code/notebooks/oas3/ex-03-02-path-ok.yaml\n", - "```\n", - "\n", - "\n" + "```" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "http://192.168.1.86:8080/?url=\n" + ] + } + ], "source": [ "# An API Editor is available at the following address\n", "print(oas_editor_url(''))" @@ -109,9 +132,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "solution": "hidden" - }, + "metadata": {}, "outputs": [], "source": [ "# You can evaluate maths and strings\n", From 764260b48a48c9c051c58e586dc0c2a826cbae93 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 21:39:02 +0200 Subject: [PATCH 09/52] Add directory infos --- connexion-101/notebooks/00-intro.ipynb | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/connexion-101/notebooks/00-intro.ipynb b/connexion-101/notebooks/00-intro.ipynb index d9cf64d..39f2753 100644 --- a/connexion-101/notebooks/00-intro.ipynb +++ b/connexion-101/notebooks/00-intro.ipynb @@ -113,17 +113,9 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "http://192.168.1.86:8080/?url=\n" - ] - } - ], + "outputs": [], "source": [ "# An API Editor is available at the following address\n", "print(oas_editor_url(''))" From 5d7ad0b44edcc773fd33878412a77c950595d107 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 Jul 2019 21:45:55 +0200 Subject: [PATCH 10/52] clarify text --- .../notebooks/01-interoperable-apis.ipynb | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/connexion-101/notebooks/01-interoperable-apis.ipynb b/connexion-101/notebooks/01-interoperable-apis.ipynb index c579087..bbc939a 100644 --- a/connexion-101/notebooks/01-interoperable-apis.ipynb +++ b/connexion-101/notebooks/01-interoperable-apis.ipynb @@ -18,7 +18,8 @@ "- HTTPS everywhere\n", "- Service Management with standardized throttling and circuit-breaker patterns\n", "- Standardized approach to metrics\n", - "\n" + "\n", + "[See Slides](https://docs.google.com/presentation/d/1L6R4ZKhLoZAPEmai1KSED1nrq0GNrx3-TU53sGhfrO8/edit#slide=id.g3aa6058ea8_0_0)" ] }, { @@ -41,13 +42,18 @@ "source": [ "# REST and RPC\n", "\n", - "When writing an API, the historical approach was to view any interaction like a function call.\n", - "In a network environment this is seen as a `Remote Procedure Call`. This is the tipical SOAP approach,\n", - "where you bind a service to an URL and different functions to invocation methods.\n", + "The historical API approach was to view any interaction like a function call.\n", + "\n", + "In a network environment this is seen as a `Remote Procedure Call`. SOAP web services have this approach,\n", + "where you bind:\n", "\n", - "Even today there are a lot of non-SOAP APIs using an RPC approach.\n", + " * a service to an URL \n", + " * and different functions to invocation methods.\n", + "\n", + "Even today there are a lot of non-SOAP APIs using an RPC approach, including Slack APIs and Google RPC.\n", "\n", "The widespread of HTTP as a distributed computation protocol, and the rise of data give birth to REST.\n", + "\n", "REST, aka REpresentation State Transfer, is not a protocol, but an architectural style which mimics the distributed characteristics of the web.\n", "\n", "In REST, everything is a `resource`:\n", @@ -124,7 +130,7 @@ "\n", "## Contract first, Code first\n", "\n", - "We can usually find two approach:\n", + "There are two paths for API writing:\n", "\n", "- code first: where one develops a function on a specific language and then uses some tool to generate the\n", " IDL. An example function generating the above IDL could be\n", From 66db8f955f45dd95ce6d4010c7aafbd83541827b Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Fri, 29 Nov 2019 17:29:38 +0100 Subject: [PATCH 11/52] Add mongodb-101 --- mongodb-101/Dockerfile | 34 +++++++++ mongodb-101/Makefile | 41 +++++++++++ mongodb-101/README.md | 72 +++++++++++++++++++ mongodb-101/ansible.cfg | 3 + mongodb-101/config.json | 9 +++ mongodb-101/docker-compose.yml | 29 ++++++++ mongodb-101/site-digitalocean.yml | 114 ++++++++++++++++++++++++++++++ mongodb-101/tox.ini | 20 ++++++ 8 files changed, 322 insertions(+) create mode 100644 mongodb-101/Dockerfile create mode 100644 mongodb-101/Makefile create mode 100644 mongodb-101/README.md create mode 100644 mongodb-101/ansible.cfg create mode 100644 mongodb-101/config.json create mode 100644 mongodb-101/docker-compose.yml create mode 100644 mongodb-101/site-digitalocean.yml create mode 100644 mongodb-101/tox.ini diff --git a/mongodb-101/Dockerfile b/mongodb-101/Dockerfile new file mode 100644 index 0000000..8e5d72d --- /dev/null +++ b/mongodb-101/Dockerfile @@ -0,0 +1,34 @@ +# +# Docker image for ipython notebook and various +# python courses +# +FROM centos:8 + +RUN dnf install -y python36 +RUN pip3 install jupyter + + + +# Use folding extension +RUN pip3 install jupyter_contrib_nbextensions +RUN jupyter contrib nbextension install --user +RUN jupyter nbextension enable codefolding/main +RUN jupyter nbextension enable rubberband/main +RUN jupyter nbextension enable exercise/main + +# RUN jupyter nbextension install rise --py --sys-prefix +# RUN jupyter nbextension enable rise --py --sys-prefix + +COPY config.json /root/.jupyter/jupyter_notebook_config.json + +EXPOSE 8001 + +RUN dnf install -y curl +RUN dnf install -y curl dnf-plugins-core +RUN dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo +RUN dnf install -y docker-ce-cli + +RUN curl >/etc/profile.d/99-docker.sh https://gist.githubusercontent.com/ioggstream/cc7caffc8e038ac27a9390a80c8e7cc0/raw/5fd6e39141631ea9e196d31dcf01e4ccddae376f/z99-docker-profile.sh +ENV DOCKER_HOST=tcp://172.17.0.1:2375 +ENTRYPOINT jupyter notebook --ip 0.0.0.0 --port 8001 --allow-root + diff --git a/mongodb-101/Makefile b/mongodb-101/Makefile new file mode 100644 index 0000000..0efc395 --- /dev/null +++ b/mongodb-101/Makefile @@ -0,0 +1,41 @@ +# +# To run the environment, use +# +# # make course +# +.PHONY: course +.EXPORT_ALL_VARIABLES: + +MAIN_IP = $(shell ip -4 -o a s scope global | awk -F'[/ ]+' '{print $$4; exit} ') +EXTERNAL_COURSES = + + +course: .prepare .EXPORT_ALL_VARIABLES + docker-compose scale course=1 + docker-compose logs course | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" | sed -e "s/(.* or 127.0.0.1)/$(MAIN_IP)/g" + +clean: + rm *.pyc __pycache__ -fr + find notebooks -name '*_removed.nbconvert.ipynb' -delete + find notebooks -name '*_removed.ipynb' -delete + find notebooks -name '.*' -prune -o -name \*.yml -type f -exec sed -i 's/[[:space:]]*$$//' {} \; + # find notebooks -name \*.yml -type f -exec ansible-lint {} \; + find notebooks -name '.*' -prune -o -name '*.ipynb' -exec nbstripout {} \; + # $(foreach dpath, $(EXTERNAL_COURSES), rm -f notebooks/$(dpath)/*.ipynb; ) + +clean-other: + docker-compose kill dev + docker-compose rm -vf dev + +test: + docker exec -ti connexion101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' + +dev: .prepare .EXPORT_ALL_VARIABLES + docker-compose scale dev=1 + docker-compose logs dev | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" | sed -e "s/(.* or 127.0.0.1)/$(MAIN_IP)/g" + +.prepare: + # build all EXTERNAL_COURSES + $(foreach dpath, $(EXTERNAL_COURSES), cd ../$(dpath); ! test -f Makefile || make; ) + $(foreach dpath, $(EXTERNAL_COURSES), mkdir -p notebooks/rendered_notebooks/$(dpath); rsync -var ../$(dpath)/notebooks/ notebooks/rendered_notebooks/$(dpath); ) + cp ../python-for-sysadmin/requirements.txt . diff --git a/mongodb-101/README.md b/mongodb-101/README.md new file mode 100644 index 0000000..457227d --- /dev/null +++ b/mongodb-101/README.md @@ -0,0 +1,72 @@ +# MongoDB 101 + + +## Local Setup + +This course is based on Docker and Docker compose. As long as you have Docker +you can run it on: + + - linux + - mac + - windows + +Docker should be exposed via TCP on 172.17.0.1:2375 + +On Linux, set + +``` +# vim /etc/systemd/system/multi-user.target.wants/docker.service +[Service] +... +ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375 +... +``` + +On Mac, check [the FAQ and this issue](https://github.com/docker/for-mac/issues/770#issuecomment-252560286) + + +Consider having enough bandwidth for the first run to download the images. + + +Run the environemnt with: + + # make course + +or + + # docker-compose scale course=1 bastion=1 web=3 + # firefox http://localhost:8888 + + +## Playing the course on DigitalOcean + +DigitalOcean is a great and cheap cloud-provider + + - create an Ubuntu 16.04 docker droplet from the menu and ssh into your host + - expose docker on local http port + +``` +# vim /etc/systemd/system/multi-user.target.wants/docker.service +[Service] +... +ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375 +... +``` + + - clone and run the project + +``` + # git clone https://github.com/ioggstream/python-course.git + # cd python-course/mongo-101 + # make course + + +``` + + - point to the reference url + +See asciicast here + +[![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI) + + diff --git a/mongodb-101/ansible.cfg b/mongodb-101/ansible.cfg new file mode 100644 index 0000000..ca269f6 --- /dev/null +++ b/mongodb-101/ansible.cfg @@ -0,0 +1,3 @@ +[defaults] +retry_files_enabled = no +host_key_checking =no diff --git a/mongodb-101/config.json b/mongodb-101/config.json new file mode 100644 index 0000000..51bfb4a --- /dev/null +++ b/mongodb-101/config.json @@ -0,0 +1,9 @@ +{ + "NotebookApp": { + "nbserver_extensions": { + "jupyter_nbextensions_configurator": true + }, + "terminado_settings": {"shell_command": ["/usr/bin/bash"]} + } +} + diff --git a/mongodb-101/docker-compose.yml b/mongodb-101/docker-compose.yml new file mode 100644 index 0000000..3f486eb --- /dev/null +++ b/mongodb-101/docker-compose.yml @@ -0,0 +1,29 @@ +# Image for developing the course +version: "3" +services: + + test: + image: ioggstream/centos8:jupyter + volumes: + - ./notebooks:/notebooks:z + # entrypoint: tail -f /etc/hosts + + + # Official image from docker hub + course: + image: ioggstream/centos8:jupyter + hostname: course + environment: + - USE_HTTP=1 + - DOCKER_HOST=172.17.0.1 + volumes: + - ./notebooks:/notebooks:z + - ./notebooks/custom.css:/root/.jupyter/custom/custom.css + - ./notebooks/startup:/root/.ipython/profile_default/startup:z + - .:/code:z + network_mode: bridge + ports: + - 8888:8888 + entrypoint: /usr/bin/bash + command: -c "/usr/local/bin/jupyter-notebook --ip 0.0.0.0 --allow-root" + diff --git a/mongodb-101/site-digitalocean.yml b/mongodb-101/site-digitalocean.yml new file mode 100644 index 0000000..ff91804 --- /dev/null +++ b/mongodb-101/site-digitalocean.yml @@ -0,0 +1,114 @@ +# +# Provision current infrastructure on digitalocean +# $ export DO_API_TOKEN=xxxx +# $ ansible-playbook -v site-digitalocean.yml +# +# This will output a series of jupyter urls with their associate ips. +# +# BEWARE: unless you populate accordingly the digital_ocean droplet ids +# the digital_ocean module will create those droplets over and +# over again. +# +- hosts: localhost + tasks: + - name: Retrieve ssh key id. + digital_ocean: + state: present + command: ssh + name: rpolli + register: do_key + + - name: Create enough machine for the course. + digital_ocean: + state: present + unique_name: yes + command: droplet + name: "{{item}}" + ssh_key_ids: >- + {{do_key.ssh_key.id}} + size_id: 8gb + region_id: fra1 + image_id: docker-18-04 + wait_timeout: 500 + register: my_droplet + with_items: + - deleteme-3 + + - name: Dynamically add the new servers to the inventory. + add_host: + hostname: > + {{ item.droplet.networks.v4[0].ip_address }} + groups: do + ansible_user: root + host_key_checking: no + with_items: "{{my_droplet.results}}" + + + - name: Create a sample inventory file with the server ips. + file: + path: /tmp/inventory.do + state: absent + - lineinfile: + path: /tmp/inventory.do + create: yes + line: "[do]" + - lineinfile: + path: /tmp/inventory.do + line: > + {{ item.droplet.networks.v4[0].ip_address }} droplet_id={{item.droplet.id}} + with_items: "{{my_droplet.results}}" + +# +# Configure the newly created machines +# +- hosts: do + vars: + - ansible_python_interpreter: /usr/bin/python3 + - ansible_user: root + environment: + - ANSIBLE_HOST_KEY_CHECKING: False + tasks: + - name: Docker should listen on localhost. + lineinfile: + path: /etc/systemd/system/multi-user.target.wants/docker.service + regexp: "^ExecStart=.*" + line: "ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375" + register: systemd_updated + + - name: Reload docker with new systemd config + systemd: + state: restarted + name: docker + daemon_reload: yes + when: systemd_updated.changed + + - name: Check socket + shell: | + ss -tlnp | grep 2375 + + - name: Download course + git: + repo: https://github.com/ioggstream/python-course.git + dest: /root/python-course + version: master + + - name: install deps + package: + name: + - make + + - name: Make it + shell: | + make course + args: + chdir: /root/python-course/mongodb-101 + register: output + + - debug: + var: output + + + + + + diff --git a/mongodb-101/tox.ini b/mongodb-101/tox.ini new file mode 100644 index 0000000..18167f9 --- /dev/null +++ b/mongodb-101/tox.ini @@ -0,0 +1,20 @@ +# Tox (http://tox.testrun.org/) is a tool for running tests +# in multiple virtualenvs. This configuration file will run the +# test suite on all supported python versions. To use it, "pip install tox" +# and then run "tox" from this directory. + +[tox] +envlist = py36 +# skip setup.py +skipsdist=True + + +[testenv] +deps = + -rrequirements.txt + -rrequirements-api.txt + + +# To avoid loading IPython module in the current directory, change +# current directory to ".tox/py*/tmp" before running test. +#changedir = {envtmpdir} From 1013e2c567cc9ca36604a7d392a989ac6c6a6a35 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 22 Feb 2021 14:58:36 +0100 Subject: [PATCH 12/52] Upgrade python on-behalf-of: @par-tec --- connexion-101/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connexion-101/Dockerfile b/connexion-101/Dockerfile index 7f42a19..b02bdbd 100644 --- a/connexion-101/Dockerfile +++ b/connexion-101/Dockerfile @@ -2,7 +2,7 @@ # Docker image for ipython notebook and various # python courses # -FROM python:3.6 +FROM python:3.8 MAINTAINER roberto.polli@par-tec.it RUN apt-get -y update && apt-get -y install gcc make python-dev python-pip From 5172db2273edf14c7db0ff214227e3d1205e970f Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 22 Feb 2021 15:00:21 +0100 Subject: [PATCH 13/52] Revert "Upgrade python" --- connexion-101/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connexion-101/Dockerfile b/connexion-101/Dockerfile index b02bdbd..7f42a19 100644 --- a/connexion-101/Dockerfile +++ b/connexion-101/Dockerfile @@ -2,7 +2,7 @@ # Docker image for ipython notebook and various # python courses # -FROM python:3.8 +FROM python:3.6 MAINTAINER roberto.polli@par-tec.it RUN apt-get -y update && apt-get -y install gcc make python-dev python-pip From c7e44b42f89e8f129d1157bbff3b29258595878c Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 22 Feb 2021 15:02:32 +0100 Subject: [PATCH 14/52] Upgrade python on-behalf-of: @par-tec --- connexion-101/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connexion-101/Dockerfile b/connexion-101/Dockerfile index 7f42a19..b02bdbd 100644 --- a/connexion-101/Dockerfile +++ b/connexion-101/Dockerfile @@ -2,7 +2,7 @@ # Docker image for ipython notebook and various # python courses # -FROM python:3.6 +FROM python:3.8 MAINTAINER roberto.polli@par-tec.it RUN apt-get -y update && apt-get -y install gcc make python-dev python-pip From 408e765086a2f76d408d9d2fc59d1ba55d7fe459 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Wed, 22 Sep 2021 11:33:52 +0200 Subject: [PATCH 15/52] Add stuff --- mongodb-101/Makefile | 2 +- mongodb-101/requirements.txt | 22 ++++++++++++++++++++++ mongodb-101/site-digitalocean.yml | 5 +++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 mongodb-101/requirements.txt diff --git a/mongodb-101/Makefile b/mongodb-101/Makefile index 0efc395..e843b08 100644 --- a/mongodb-101/Makefile +++ b/mongodb-101/Makefile @@ -12,7 +12,7 @@ EXTERNAL_COURSES = course: .prepare .EXPORT_ALL_VARIABLES docker-compose scale course=1 - docker-compose logs course | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" | sed -e "s/(.* or 127.0.0.1)/$(MAIN_IP)/g" + docker-compose logs course | grep token | sed -e "s/0.0.0.0|course/$(MAIN_IP)/g" | sed -e "s/(.* or 127.0.0.1)/$(MAIN_IP)/g" clean: rm *.pyc __pycache__ -fr diff --git a/mongodb-101/requirements.txt b/mongodb-101/requirements.txt new file mode 100644 index 0000000..f2cfebe --- /dev/null +++ b/mongodb-101/requirements.txt @@ -0,0 +1,22 @@ +scipy +ipython +matplotlib +nose +psutil +simplejson +pyzmq +markupsafe +tornado +jsonschema +jupyter +ansible +docker-py +pyyaml + +# jupyter tools +nbstripout + +# Load jupyter extensions for exercises. +jupyter_contrib_nbextensions +RISE + diff --git a/mongodb-101/site-digitalocean.yml b/mongodb-101/site-digitalocean.yml index ff91804..1b8ddc8 100644 --- a/mongodb-101/site-digitalocean.yml +++ b/mongodb-101/site-digitalocean.yml @@ -32,7 +32,12 @@ wait_timeout: 500 register: my_droplet with_items: + - deleteme-1 + - deleteme-2 - deleteme-3 + - deleteme-4 + - deleteme-5 + - deleteme-6 - name: Dynamically add the new servers to the inventory. add_host: From 10f2dd5a69b6516661ca2474ae1692235c1372ea Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 11 Oct 2021 15:42:42 +0200 Subject: [PATCH 16/52] Add sparql course (#55) --- .travis.yml | 6 +- git-101/tox.ini | 12 ++ sparql-101/01-intro-jsonld.md | 359 ++++++++++++++++++++++++++++++++++ sparql-101/Makefile | 18 ++ sparql-101/tox.ini | 11 ++ 5 files changed, 402 insertions(+), 4 deletions(-) create mode 100644 git-101/tox.ini create mode 100644 sparql-101/01-intro-jsonld.md create mode 100644 sparql-101/Makefile create mode 100644 sparql-101/tox.ini diff --git a/.travis.yml b/.travis.yml index 832ca51..5055c66 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,9 +18,7 @@ before_install: install: - conda install --yes python=$TRAVIS_PYTHON_VERSION atlas numpy scipy matplotlib nose dateutil pandas statsmodels conda-env - conda install --yes python=$TRAVIS_PYTHON_VERSION $(python-for-sysadmin/requirements.txt) - + # Run test script: - - nosetests - - + - nosetests diff --git a/git-101/tox.ini b/git-101/tox.ini new file mode 100644 index 0000000..68f92d2 --- /dev/null +++ b/git-101/tox.ini @@ -0,0 +1,12 @@ +[tox] +envlist = py3 +skipsdist = True + +[testenv] +deps = + git+https://github.com/ioggstream/notedown +whitelist_externals = + make +commands = + make + diff --git a/sparql-101/01-intro-jsonld.md b/sparql-101/01-intro-jsonld.md new file mode 100644 index 0000000..ec72ed5 --- /dev/null +++ b/sparql-101/01-intro-jsonld.md @@ -0,0 +1,359 @@ +# Modeling Semantic APIs + +## Agenda + + - Semantics what? + - Triples & co + - Attaching semantics + - Graph databases + +*Beware*: commands contain small typos. You must fix them to properly complete the course! + +---- + +Prerequisites: + +- json, yaml, xmlschema +- HTTP, OpenAPI 3 +- SQL and database hints + +--- + + +## Intro: Semantics what? + +Semantics: the study of meaning. + +Semantics ensures that a message is understood. + +``` +name: Mario Romildo +``` + +Is this a given name or a full name? + +---- + +La mancanza di standardizzazione nel formato e significato dei dati ostacola l’interoperabilità tra le basi di dati di enti diversi e quindi la creazione di servizi digitali. + +Un primo esempio è la mancanza di interoperabilità sintattica: una entità ben definita (eg. il codice fiscale) viene rappresentata con campi o formati diversi: + +``` +{"codice_fiscale": "MRORSS77T05E472W"} +{"cf": "mrorss77T05E472W"} +{"taxCode": "MRORSS77T05E472W"} +``` + +---- + +Un altro esempio è l'interoperabilità semantica: il concetto di famiglia ha diverse accezioni (eg. fiscale, anagrafica): + +``` +{"familiari": [ + {"nome": "Mario Rossi", "relazione": "padre"}, + {"nome": "Carla Rossi", "relazione": "sorella" , "convivente": false} } + +{"familiari": [ + {"nome": "Mario Rossi", "relazione": "padre"} +} +``` + +--- + +## Semantic standardization + +Per standardizzare semanticamente i servizi e i loro contenuti, si utilizzano strumenti concettuali quali ontologie e vocabolari controllati (codelist, tassonomie, ..).  + +Ontologia: una ontologia è un insieme di assiomi logici che concettualizzano un dominio di interesse definendo dei concetti e la semantica delle relazioni tra essi. Quando le ontologie contengono ulteriori restrizioni (eg. vincoli allo schema) non sono propriamente vocabolari. + +---- + +Vocabolario controllato: un vocabolario dove i termini sono validati da un'autorità designata. Può essere di diversi tipi - eg. una lista (codelist), una struttura gerarchica (tassonomia), un glossario ed un tesauro (che aggiunge ad una tassonomia ulteriori vincoli). Esempi di vocabolari controllati europei si trovano qui https://op.europa.eu/en/web/eu-vocabularies/controlled-vocabularies + +## Syntax standardization + +Schema di dati: Uno schema è una rappresentazione/descrizione formale e machine-readable del contenuto effettivo o potenziale dei dati contenuti in un oggetto separato. In altre parole, è l'insieme di istruzioni semantiche e sequenziali che possono essere usate per controllare l'input memorizzato in un dato file, o per collegare un file che rispetta tali istruzioni a un sistema o un'applicazione di scambio di informazioni. Esistono diversi formati per descrivere degli schemi, tra cui xml-schema e json-schema. Definizione formale della sintassi di una entità. Vedi https://json-schema.org/understanding-json-schema/about.html + +Un Vocabolario controllato supporta anche la standardizzazione sintattica. + +---- + +Per standardizzare sintatticamente i servizi serve pubblicare degli schemi dati a cui tutte le organizzazioni devono conformarsi. Storicamente la standardizzazione degli schemi dati si basa sul concetto di namespace eventualmente distribuiti - vedi il formato di specifica XSD. + +Se in ecosistemi ben definiti questo approccio funziona, al crescere della dimensione si pongono una serie di problematiche legate sia alla compattezza dei dati trasportati che del contesto di sicurezza legato ad esempio alla eventuale necessità di dereferenziare gli URI (eg. https://owasp.org/www-pdf-archive/XML_Based_Attacks_-_OWASP.pdf ) . + +Mentre poi la metadatazione delle pagine tramite json-ld ha come platea principale i sistemi di processamento batch dei motori di ricerca, i dati convogliati tramite API vengono sempre più frequentemente processati da applicazioni mobile che hanno dei vincoli sia in termini di banda che di consumo di risorse (eg. batteria dei cellulari, riscaldamento) più stringenti. + +Inoltre la creazione di servizi sempre più integrati porta ad un aumento del numero di richieste, e della conseguente necessità di supportare in maniera sostenibile i carichi sui sistemi IT. + + +--- + +## Defining semantic contents + +I contenuti semantici vengono definiti +tramite proposizioni +`soggetto predicato complemento` +e loro insiemi (detti grafi) + +Ecco un grafo con 3 proposizioni: + +``` +"il cane" "ha il colore" "nero" +"nero" "è" "un colore" +"il cane" "è" "un animale" +``` + +e una sua descrizione formale + +``` +prefix animals: +prefix colors: + +animals:dog colors:hasColor colors:black +colors:black a colors:Color +animals:dog a animals:Animal +``` + +---- + +RDF: Resource Description Framework permette di rappresentare informazioni sul web basandosi su due strutture dati: + +- **grafi** (insiemi di triple soggetto-predicato-oggetto); +- **elementi** (IRI, blank e literals); + +e su dei **vocabolari** di elementi identificati tramite degli IRIs e dei namespace. + +Un rdf-dataset è un insieme di **grafi**. + +---- + + +---- + +#### Ontologie + +Per standardizzare la semantica dei contenuti +digitali si usano delle Ontologie. + +In Italia esiste l'Ontologia delle persone +che possiamo usare per descrivere univocamente +qualcuno. + +``` +@prefix cpv: . + + cpv:givenName "Roberto" . + cpv:familyName "Polli" . + +``` + +---- + +Anche l'ontologia è definita tramite triple +a partire da vocabolari di base. + +``` +@prefix xsd:   . +@prefix dct:   . + +https://w3id.org/italia/onto/CPV dct:modified  "2020-04-27"^^xsd:date ; +https://w3id.org/italia/onto/CPV dct:title     "Person Ontology"@en, "Ontologia delle persone"@it ; + +``` + +--- + +### Json-LD + +JSON-LD è un formato che permette di serializzare in JSON delle informazioni basate sul RDF data model. + https://www.w3.org/TR/json-ld11/#data-model. + +Un documento JSON-LD è quindi sia un documento RDF che JSON, e rappresenta un'istanza di un RDF data model. + +JSON-LD inoltre *estende* RDF per permettere la serializzazione di dataset RDF generalizzati. +Di seguito l'estratto di sopra serializzato in JSON-LD/yaml. + +``` +"@context": + cpv: "https://w3id.org/italia/onto/CPV" + given_name: "cpv:givenName" + family_name: "cpv:familyName" + id: "@id" +id: robipolli@gmail.com +given_name: Roberto +family_name: Polli +``` + +--- + +Oltre all'ontologia italiana, un altro vocabolario +molto usato sul web è www.schema.org. Le parole chiave +che definisce sono disponibili in formato json-ld +https://schema.org/docs/jsonldcontext.jsonld + +--- + +È anche possibile ridefinire o localizzare i campi, +eventualmente usando diversi namespace. + + +``` +"@context": + "sdo": "http://schema.org/" + "nome":"sdo:name" + "nome_proprio": "sdo:givenName" +"@type": "Person" + "nome": "Jane Doe" + "nome_proprio": "Jane" + "sdo:jobTitle": "Professor" + "sdo:telephone": "(425) 123-4567" +``` + +--- + +### Localizzazione + +JSON-LD supporta nativamente informazioni +localizzate: + +``` +-- come lista +occupation: +-  @value: "Student" +   @language: en +-  @value: "Etudiant" +   @language: fr +``` + +oppure + +``` +-- come oggetto +@context: +  occupation: +    @container: @language +occupation: +  en: Student +  fr: Etudiant +``` + +oppure + +``` +--- tramite elementi multipli, utile anche per la serializzazione di API semplici +@context: + occupation: {@language: en} + occupation_fr: {@language: fr} +occupation: Student +occupation_fr: Etudiant +``` + +--- +### Json Schema e Json-LD + +Per validare un oggetto json-ld, serve risolvere +ricorsivamente tutte le referenze: +è complesso farlo in maniera sincrona. + +Quando si crea un API, la semantica va +definita in fase di specifica +in modo da non dover risolvere a runtime +referenze ricorsive +ed evitare problemi come il "@context mangling". + +---- + +Un modo è associare un @context ad uno schema +integrandolo nella definizione attraverso +un valore `const`. +tramite un link +In questo caso, `pet` viene [disassociato dal vocabolario](https://w3c.github.io/json-ld-syntax/#example-25-using-the-null-keyword-to-ignore-data) + +``` +# Associate a json-ld context to a schema +Customer: +  type: object +  required: [email] +  properties: + "@context": + const: + "@vocab": "http://schema.org/" + pet: null + email: {type: string} +    pet: {type: string} +``` + +---- + +E' anche possibile indicare un link +``` +# Associate a json-ld context to a schema +Customer: +  type: object +  required: [email] +  properties: + "@context": + const: "https://api.example/customer-context.jsonld" + email: {type: string} +    pet: {type: string} +``` + + + +---- +O tramite `Link` header + +```http +HTTP/1.1 200 OK +Content-Type: application/json +Link: ; + rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json" + +{ "given_name": "Roberto", "family_name": "Polli" } +``` + +--- + +O tramite content-negotiation +ritornando più formati (json e json-ld) + +``` +openapi: 3.0.1 +... +paths: + /users: + get: + ... + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/Person" + application/ld+json: + schema: + allOf: + - type: object + properties: + "@context": + const: + "@vocab": "https://w3id.org/italia/onto/CPV/" + given_name: givenName + family_name: familyName + - $ref: "#/components/schemas/Person" + + +``` + + +## API e Semantica + +Quando scambiamo informazioni tramite API +la semantica non è sempre chiara: + +- è implicita; +- è in qualche pdf/xls; +- non è machine readable. + +--- diff --git a/sparql-101/Makefile b/sparql-101/Makefile new file mode 100644 index 0000000..0e32070 --- /dev/null +++ b/sparql-101/Makefile @@ -0,0 +1,18 @@ +FILES=$(wildcard *.md) +BOOKS = $(patsubst %.md,notebooks/%.ipynb,$(FILES)) +SLIDES = $(patsubst %.ipynb,%.html,$(BOOKS)) + + +all: $(BOOKS) + @echo $(BOOKS) $(SLIDES) + +notebooks/%.ipynb: %.md + + notedown --to notebook $^ > $@ + +%.html: %.ipynb + + jupyter nbconvert --to slides $^ --post serve + +clean: + rm notebooks/*.ipynb -f diff --git a/sparql-101/tox.ini b/sparql-101/tox.ini new file mode 100644 index 0000000..268e6e7 --- /dev/null +++ b/sparql-101/tox.ini @@ -0,0 +1,11 @@ +[tox] +envlist = py3 +skipsdist = True + +[testenv] +deps = + git+https://github.com/ioggstream/notedown +whitelist_externals = + make +commands = + make From ff085b3e0685067b7e9fe9ec162d75ca80dad9a3 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 11 Oct 2021 15:48:15 +0200 Subject: [PATCH 17/52] Reformat (#56) --- README.md | 7 +- ansible-101/Dockerfile.ssh | 1 - ansible-101/Makefile | 6 +- ansible-101/README.md | 5 +- ansible-101/nbclean.py | 3 +- ansible-101/notebooks/01_architecture.ipynb | 147 ++- ansible-101/notebooks/05_inventories.ipynb | 61 +- ansible-101/notebooks/ansible-101.graphml | 2 +- ansible-101/notebooks/cleanup.sh | 11 +- ansible-101/notebooks/custom.css | 2 - ansible-101/notebooks/exercise-00/ansible.cfg | 4 +- .../notebooks/exercise-00/group_vars/all | 1 - ansible-101/notebooks/exercise-00/inventory | 8 +- .../notebooks/exercise-00/mytemplate.j2 | 2 - ansible-101/notebooks/exercise-00/site.yml | 2 - ansible-101/notebooks/exercise-00/staging | 2 +- .../notebooks/exercise-01/copy-key.yml | 2 - ansible-101/notebooks/exercise-01/inventory | 3 +- .../notebooks/exercise-03/conditions.yml | 1 - .../notebooks/exercise-03/environment.yml | 1 - .../notebooks/exercise-03/get-facts.yml | 2 - ansible-101/notebooks/exercise-03/web | 2 +- ansible-101/notebooks/exercise-05/inventory | 10 +- .../exercise-05/inventory-docker-solution.py | 38 +- .../notebooks/exercise-05/inventory-docker.py | 20 +- ansible-101/notebooks/exercise-06/ssh_config | 7 +- .../notebooks/exercise-07/.add_key.yml | 2 - ansible-101/notebooks/exercise-07/add_key.yml | 2 - ansible-101/notebooks/exercise-07/debug.yml | 2 - .../notebooks/exercise-07/files-content.yml | 6 - ansible-101/notebooks/exercise-07/inventory | 1 - ansible-101/notebooks/exercise-07/lookup.yml | 1 - .../notebooks/exercise-07/mount-bind.yml | 1 - .../notebooks/exercise-07/process-facts.yml | 1 - .../notebooks/exercise-07/shell-output-01.yml | 1 - .../notebooks/exercise-07/shell-output-02.yml | 1 - ansible-101/notebooks/exercise-08/dumper.yaml | 1 - .../notebooks/exercise-08/group_vars/all | 1 - .../notebooks/exercise-08/group_vars/prod | 1 - .../notebooks/exercise-08/group_vars/test | 1 - ansible-101/notebooks/exercise-08/prod | 2 +- .../notebooks/exercise-08/sample-01.yaml | 2 +- .../notebooks/exercise-09/documentroot.yml | 2 - ansible-101/notebooks/exercise-09/web-1.yml | 1 - ansible-101/notebooks/untitled.txt | 2 +- ansible-101/notebooks/web | 3 +- ansible-101/site-digitalocean.yml | 6 - ansible-101/tox.ini | 4 +- connexion-101/Dockerfile | 2 +- connexion-101/Makefile | 4 +- connexion-101/README.md | 6 +- connexion-101/api/__init__.py | 6 +- connexion-101/api/__main__.py | 10 +- connexion-101/api/logging.yaml | 2 - connexion-101/api/simple.yaml | 1 - connexion-101/deleteme-digitalocean.yml | 1 - connexion-101/docker-compose.yml | 1 - connexion-101/notebooks/00-intro.ipynb | 2 +- .../notebooks/01-interoperable-apis.ipynb | 2 +- connexion-101/notebooks/02-openapi-3.ipynb | 34 +- connexion-101/notebooks/03-connexion.ipynb | 2 +- connexion-101/notebooks/anchors.yaml | 1 - connexion-101/notebooks/custom.css | 2 - connexion-101/notebooks/oas3/api-solution.py | 13 +- connexion-101/notebooks/oas3/api.py | 15 +- connexion-101/notebooks/oas3/ex-01-info.yaml | 2 +- .../notebooks/oas3/ex-03-02-path-ok.yaml | 3 +- .../notebooks/oas3/ex-03-02-path.yaml | 1 - .../notebooks/oas3/ex-04-01-headers-ok.yaml | 1 - .../oas3/ex-07-01-throttling-ok.yaml | 2 +- .../notebooks/oas3/ex-08-pagination-ok.yaml | 3 +- connexion-101/notebooks/oas3/openapi.yaml | 2 +- connexion-101/notebooks/oas3/security.py | 2 +- .../notebooks/oas3/throttling_quota.py | 4 +- connexion-101/notebooks/startup/99-last.py | 18 +- connexion-101/requirements.txt | 1 - connexion-101/site-digitalocean.yml | 6 - connexion-101/tox.ini | 2 +- git-101/01-git.md | 25 +- git-101/Makefile | 4 +- git-101/tox.ini | 1 - ipynbhelper.py | 7 +- mongodb-101/Dockerfile | 1 - mongodb-101/Makefile | 6 +- mongodb-101/README.md | 6 +- mongodb-101/config.json | 3 +- mongodb-101/docker-compose.yml | 1 - mongodb-101/requirements.txt | 1 - mongodb-101/site-digitalocean.yml | 6 - mysql-101/.gitignore | 1 - mysql-101/99-docker-profile.sh | 1 - mysql-101/Makefile | 7 +- mysql-101/ansible/check-cluster.js | 2 - .../ansible/initialize-innodbcluster.yml | 8 +- mysql-101/ansible/install-mysql.yml | 3 +- mysql-101/ansible/inventory | 1 - mysql-101/lesson-0-intro.md | 2 - mysql-101/lesson-1-0-installation.md | 6 +- mysql-101/lesson-1-1-authentication.md | 65 +- mysql-101/lesson-1-2-sql.md | 84 +- mysql-101/lesson-1-3-information_schema.md | 47 +- mysql-101/lesson-2-0-configuration.md | 50 +- mysql-101/lesson-2-1-importexport.md | 53 +- mysql-101/lesson-2-3-engines.md | 51 +- mysql-101/lesson-2-4-binary-logging.md | 38 +- mysql-101/lesson-2-6-backup.md | 78 +- mysql-101/lesson-2-9-tables.md | 118 ++- mysql-101/lesson-3-1-replication.md | 81 +- mysql-101/lesson-3-2-performance_schema.md | 10 +- mysql-101/lesson-7-monitoring.md | 26 +- mysql-101/main.tex | 1 - mysql-101/site-digitalocean.yml | 20 +- mysql-101/test-page.md | 4 +- mysql-101/test.tex | 1 - python-basic/00_intro_01.py | 17 +- python-basic/00_intro_02.py | 20 +- python-basic/Dockerfile | 1 - python-basic/docker-compose.yml | 2 +- python-basic/requirements.txt | 2 +- python-for-sysadmin/Dockerfile | 2 +- python-for-sysadmin/README.md | 3 +- python-for-sysadmin/README.setup | 13 +- python-for-sysadmin/docker-compose.yml | 5 +- .../images/python-for-sysadmin.graphml | 6 +- .../notebooks/02_nosetests_full.py | 6 +- .../notebooks/ansible/inventory | 5 +- .../notebooks/ansible/mytemplate.j2 | 2 - .../notebooks/ansible/site.yml | 4 +- .../notebooks/course/__init__.py | 903 +++++++++++++++++- .../notebooks/course/linux_diskstats.py | 12 +- .../notebooks/course/multiplatform_vmstat.py | 4 +- .../notebooks/course/parse_line.py | 5 +- python-for-sysadmin/notebooks/course/pgrep.py | 4 +- .../notebooks/course/ping_rtt.py | 13 +- .../notebooks/course/ping_rtt_ipython.py | 1 - python-for-sysadmin/notebooks/logger.yml | 6 +- python-for-sysadmin/requirements.txt | 1 - .../scripts/01_system_data_gathering.py | 19 +- python-for-sysadmin/scripts/02_encoding.py | 30 +- .../scripts/02_file_management.py | 10 +- .../scripts/02_nosetests_full.py | 15 +- .../scripts/03_parsing_benchmarks.py | 3 +- .../scripts/03_parsing_test.py | 14 +- .../scripts/04_simple_processing.py | 41 +- python-for-sysadmin/slide/Makefile | 2 +- python-for-sysadmin/slide/babel.tex | 2 +- python-for-sysadmin/slide/data_gathering.tex | 18 +- python-for-sysadmin/slide/encoding.tex | 90 +- python-for-sysadmin/slide/intro.tex | 2 +- python-for-sysadmin/slide/ipython.tex | 15 +- python-for-sysadmin/slide/nosetesting.tex | 26 +- python-for-sysadmin/slide/parsing.tex | 18 +- python-for-sysadmin/slide/path_management.tex | 19 +- python-for-sysadmin/slide/statistics.tex | 45 +- python-for-sysadmin/test_prerequisites.py | 31 +- scaling-mysql-with-python/00-intro.md | 5 +- scaling-mysql-with-python/01-utilities.md | 82 +- scaling-mysql-with-python/02-fabric.md | 52 +- scaling-mysql-with-python/Makefile | 2 +- scaling-mysql-with-python/main.tex | 1 - .../main_training_mysql._md | 4 +- scaling-mysql-with-python/requirements.txt | 2 +- statistics-101-for-sysadmin/Makefile | 4 +- statistics-101-for-sysadmin/stat101.tex | 36 +- texinputs/Makefile | 2 - texinputs/README.md | 4 +- texinputs/babelstyle.tex | 6 +- texinputs/minted.sty | 10 +- texinputs/test.tex | 3 +- texinputs/teststyle.tex | 24 +- tox-as-project-descriptor/Dockerfile | 1 - tox-as-project-descriptor/Makefile | 3 +- tox-as-project-descriptor/tox-grid.ini | 8 +- tox-as-project-descriptor/tox-installcmd.ini | 11 +- tox-as-project-descriptor/tox.ini | 10 +- tox-as-project-descriptor/tox_test.py | 6 +- 176 files changed, 1993 insertions(+), 1084 deletions(-) diff --git a/README.md b/README.md index 52b1e2a..98b2414 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,4 @@ An introductory course for people knowing other languages. ## TODO * intermediate python -* python for performance testing - - - - - +* python for performance testing diff --git a/ansible-101/Dockerfile.ssh b/ansible-101/Dockerfile.ssh index b639dc4..6f2ca1b 100644 --- a/ansible-101/Dockerfile.ssh +++ b/ansible-101/Dockerfile.ssh @@ -5,4 +5,3 @@ RUN apt-get -y autoremove RUN echo "UseDNS no" >> /etc/ssh/sshd_config RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config - diff --git a/ansible-101/Makefile b/ansible-101/Makefile index cfa1781..c0df8b6 100644 --- a/ansible-101/Makefile +++ b/ansible-101/Makefile @@ -23,11 +23,11 @@ clean: # $(foreach dpath, $(EXTERNAL_COURSES), rm -f notebooks/$(dpath)/*.ipynb; ) clean-other: - docker-compose kill bastion web - docker-compose rm -vf bastion web + docker-compose kill bastion web + docker-compose rm -vf bastion web test: - docker exec -ti ansible101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' + docker exec -ti ansible101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' dev: .prepare docker-compose scale dev=1 web=2 bastion=1 diff --git a/ansible-101/README.md b/ansible-101/README.md index 275e133..e66c906 100644 --- a/ansible-101/README.md +++ b/ansible-101/README.md @@ -32,7 +32,7 @@ Run the environemnt with: # make course -or +or # docker-compose scale course=1 bastion=1 web=3 # firefox http://localhost:8888 @@ -40,7 +40,7 @@ or ## Playing the course on DigitalOcean -DigitalOcean is a great and cheap cloud-provider +DigitalOcean is a great and cheap cloud-provider - create an Ubuntu 16.04 docker droplet from the menu and ssh into your host - expose docker on local http port @@ -83,4 +83,3 @@ See asciicast here - Yaml pitfalls - Inclusion and Roles - Ansible galaxy as a role repository (bonus track) - diff --git a/ansible-101/nbclean.py b/ansible-101/nbclean.py index 4fa7245..593ec04 100644 --- a/ansible-101/nbclean.py +++ b/ansible-101/nbclean.py @@ -3,9 +3,10 @@ Modified from remove_output by Minrk """ -import sys import io import os +import sys + from nbformat.current import read, write diff --git a/ansible-101/notebooks/01_architecture.ipynb b/ansible-101/notebooks/01_architecture.ipynb index ab3e914..162db31 100644 --- a/ansible-101/notebooks/01_architecture.ipynb +++ b/ansible-101/notebooks/01_architecture.ipynb @@ -57,20 +57,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "solution": "hidden" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/notebooks/exercise-00\n" + ] + } + ], "source": [ "cd /notebooks/exercise-00/" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ".\r\n", + "├── ansible.cfg\r\n", + "├── group_vars\r\n", + "│   ├── all\r\n", + "│   └── staging\r\n", + "├── inventory\r\n", + "├── mytemplate.j2\r\n", + "├── python-course-test.yml\r\n", + "├── site.yml\r\n", + "└── staging\r\n", + "\r\n", + "1 directory, 8 files\r\n" + ] + } + ], "source": [ "# Let's check our ansible directory\n", "!tree" @@ -99,9 +126,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#\r\n", + "# Always use ansible.cfg and inventory files to \r\n", + "# describe your deployment! \r\n", + "#\r\n", + "# This will save time and helps your colleagues to\r\n", + "# keep in touch with the environment.\r\n", + "#\r\n", + "[defaults]\r\n", + "# define our inventory file or ansible defaults\r\n", + "# to /etc/ansible/hosts.\r\n", + "inventory = inventory\r\n", + "\r\n", + "# It's just for testing purposes (or if you're on a secure cloud)\r\n", + "# you may want to avoid typing yes to all host keys.\r\n", + "# Once you get host keys, you can comment this out and re-enable\r\n", + "# checks.\r\n", + "host_key_checking = False\r\n", + "\r\n", + "# When an ansible plabook fails, it creates a retry file which may\r\n", + "# pollute the current directory ;) You can move this out using\r\n", + "# further variables\r\n", + "retry_files_enabled = False\r\n", + "\r\n", + "# Search password file in here\r\n", + "# vault_password_file = ~/.ssh/pin\r\n", + "\r\n", + "\r\n", + "# [ssh_connection]\r\n", + "# ssh_args = -F ./ssh_config/config -o ControlMaster=auto -o ControlPersist=30m\r\n", + "# control_path = ./ssh_config/ansible-%%r@%%h:%%p\r\n" + ] + } + ], "source": [ "!cat ansible.cfg" ] @@ -120,9 +184,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#\r\n", + "# This inventory file contains a list of server to \r\n", + "# play with - divided in groups.\r\n", + "#\r\n", + "[course]\r\n", + "# this is the local machine where you run jupyter\r\n", + "# the tutorial just works with this one.\r\n", + "pythonforsysadmin_course_1 ansible_connection=local\r\n", + "\r\n", + "\r\n", + "# Another group of servers\r\n", + "# where we can pass optional arguments\r\n", + "# Homework: you can play with this group of host\r\n", + "# once you exchange ssh-keys between the pythonforsysadmin_course_1\r\n", + "# container and the pythonforsysadmin_ansible_* ones._\r\n", + "[ansible]\r\n", + "172.17.0.[5:7] \r\n", + "\r\n", + "#\r\n", + "# Besides, ansible has two predefined groups: \r\n", + "# - all \r\n", + "# - ungrouped\r\n" + ] + } + ], "source": [ "!cat inventory" ] @@ -158,9 +251,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "group_vars\r\n", + "├── all\r\n", + "└── staging\r\n", + "\r\n", + "0 directories, 2 files\r\n" + ] + } + ], "source": [ "# group_vars - a directory containing environment files for various host groups.\n", "!tree group_vars" @@ -168,12 +273,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "group_vars/all:env_name: default\n", + "group_vars/staging:env_name: staging\n", + "#\n", + "# Pur here the variables for the staging inventory.\n", + "#\n", + "env_name: staging\n" + ] + } + ], "source": [ "# I set env_name in two different files\n", - "!grep env_name -r group_vars/" + "!grep env_name -r group_vars/\n", + "!cat group_vars/staging" ] }, { @@ -266,7 +385,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.13" + "version": "2.7.14" } }, "nbformat": 4, diff --git a/ansible-101/notebooks/05_inventories.ipynb b/ansible-101/notebooks/05_inventories.ipynb index d2b445b..33286d6 100644 --- a/ansible-101/notebooks/05_inventories.ipynb +++ b/ansible-101/notebooks/05_inventories.ipynb @@ -24,18 +24,69 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/notebooks/exercise-05\n" + ] + } + ], "source": [ "cd /notebooks/exercise-05" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# I can group hosts in inventory\r\n", + "\r\n", + "[web:children]\r\n", + "web_rome\r\n", + "web_milan\r\n", + "\r\n", + "[web_rome:children]\r\n", + "web_rome_test\r\n", + "web_rome_prod\r\n", + "\r\n", + "[web_rome_prod]\r\n", + "172.23.0.[3:4]\r\n", + "\r\n", + "[web_milan]\r\n", + "172.24.0.[5:6]\r\n", + "\r\n", + "# further host variables\r\n", + "[web_rome:vars]\r\n", + "ansible_username=root \r\n", + "\r\n", + "\r\n", + "# Connect with docker \r\n", + "[web_rome_test:vars]\r\n", + "ansible_connection=docker\r\n", + "ansible_docker_extra_args=\"-Htcp://172.17.0.1\"\r\n", + "\r\n", + "# The actual host reference\r\n", + "[web_rome_test]\r\n", + "ansible101_web_1\r\n", + "\r\n", + "# \r\n", + "# Don't need to be Ssh \r\n", + "# to be my local machine ;)\r\n", + "#\r\n", + "[course]\r\n", + "localhost ansible_connection=local " + ] + } + ], "source": [ "!cat inventory" ] @@ -361,7 +412,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.13" + "version": "2.7.14" } }, "nbformat": 4, diff --git a/ansible-101/notebooks/ansible-101.graphml b/ansible-101/notebooks/ansible-101.graphml index 234a69d..0752d6c 100644 --- a/ansible-101/notebooks/ansible-101.graphml +++ b/ansible-101/notebooks/ansible-101.graphml @@ -57,7 +57,7 @@ - 2. inventory + 2. inventory / script diff --git a/ansible-101/notebooks/cleanup.sh b/ansible-101/notebooks/cleanup.sh index 519ec95..c23fc00 100755 --- a/ansible-101/notebooks/cleanup.sh +++ b/ansible-101/notebooks/cleanup.sh @@ -1,18 +1,17 @@ #!/bin/bash -rm *_removed.ipynb +rm *_removed.ipynb -for i in *ipynb; do +for i in *ipynb; do python remove_output.py $i || exit 1 -done +done -for i in *_removed.ipynb; do +for i in *_removed.ipynb; do mv $i ${i//_removed} done for i in *.ipynb; do jupyter nbconvert --to notebook $i & -done +done wait mv *nbconvert.ipynb rendered_notebooks - diff --git a/ansible-101/notebooks/custom.css b/ansible-101/notebooks/custom.css index a8e5365..cec414c 100644 --- a/ansible-101/notebooks/custom.css +++ b/ansible-101/notebooks/custom.css @@ -13,5 +13,3 @@ div#notebook, div.CodeMirror, div.output_area pre, div.output_wrapper, div.promp font-size: 14pt; color: #5cb85c; } - - diff --git a/ansible-101/notebooks/exercise-00/ansible.cfg b/ansible-101/notebooks/exercise-00/ansible.cfg index 31b8803..e2c6f4b 100644 --- a/ansible-101/notebooks/exercise-00/ansible.cfg +++ b/ansible-101/notebooks/exercise-00/ansible.cfg @@ -1,6 +1,6 @@ # -# Always use ansible.cfg and inventory files to -# describe your deployment! +# Always use ansible.cfg and inventory files to +# describe your deployment! # # This will save time and helps your colleagues to # keep in touch with the environment. diff --git a/ansible-101/notebooks/exercise-00/group_vars/all b/ansible-101/notebooks/exercise-00/group_vars/all index c18f2d5..e1199eb 100644 --- a/ansible-101/notebooks/exercise-00/group_vars/all +++ b/ansible-101/notebooks/exercise-00/group_vars/all @@ -10,4 +10,3 @@ proxy_env: http_proxy: http://proxy:3128 https_proxy: http://proxy:3128 no_proxy: 127.0.0.1,localhost,.example.com - diff --git a/ansible-101/notebooks/exercise-00/inventory b/ansible-101/notebooks/exercise-00/inventory index befd090..4a8807a 100644 --- a/ansible-101/notebooks/exercise-00/inventory +++ b/ansible-101/notebooks/exercise-00/inventory @@ -1,5 +1,5 @@ # -# This inventory file contains a list of server to +# This inventory file contains a list of server to # play with - divided in groups. # [course] @@ -14,9 +14,9 @@ pythonforsysadmin_course_1 ansible_connection=local # once you exchange ssh-keys between the pythonforsysadmin_course_1 # container and the pythonforsysadmin_ansible_* ones._ [ansible] -172.17.0.[5:7] +172.17.0.[5:7] # -# Besides, ansible has two predefined groups: -# - all +# Besides, ansible has two predefined groups: +# - all # - ungrouped diff --git a/ansible-101/notebooks/exercise-00/mytemplate.j2 b/ansible-101/notebooks/exercise-00/mytemplate.j2 index 2bf75f6..2196903 100644 --- a/ansible-101/notebooks/exercise-00/mytemplate.j2 +++ b/ansible-101/notebooks/exercise-00/mytemplate.j2 @@ -5,5 +5,3 @@ GW=10.0.0.254 # a static line HOSTNAME={{ansible_hostname}} # a dynamic one - - diff --git a/ansible-101/notebooks/exercise-00/site.yml b/ansible-101/notebooks/exercise-00/site.yml index f720a97..ed255a9 100644 --- a/ansible-101/notebooks/exercise-00/site.yml +++ b/ansible-101/notebooks/exercise-00/site.yml @@ -14,5 +14,3 @@ - python - python-dev ignore_errors: yes # ignore errors during the course (eg. connectivity) - - diff --git a/ansible-101/notebooks/exercise-00/staging b/ansible-101/notebooks/exercise-00/staging index 96d7e2b..4cd7b47 100644 --- a/ansible-101/notebooks/exercise-00/staging +++ b/ansible-101/notebooks/exercise-00/staging @@ -1,5 +1,5 @@ # -# This inventory file contains a list of server to +# This inventory file contains a list of server to # play with - divided in groups. # [course] diff --git a/ansible-101/notebooks/exercise-01/copy-key.yml b/ansible-101/notebooks/exercise-01/copy-key.yml index e77571f..13dca46 100644 --- a/ansible-101/notebooks/exercise-01/copy-key.yml +++ b/ansible-101/notebooks/exercise-01/copy-key.yml @@ -18,5 +18,3 @@ owner: root group: root force: yes - - diff --git a/ansible-101/notebooks/exercise-01/inventory b/ansible-101/notebooks/exercise-01/inventory index f647d33..e9f44c6 100644 --- a/ansible-101/notebooks/exercise-01/inventory +++ b/ansible-101/notebooks/exercise-01/inventory @@ -1,5 +1,5 @@ # -# This is the inventory file, containing all +# This is the inventory file, containing all # ansible hosts. # # - comments starts with # @@ -7,4 +7,3 @@ # [course] 172.17.0.[2:4] ansible_password={{root_password}} # load variable from vault - diff --git a/ansible-101/notebooks/exercise-03/conditions.yml b/ansible-101/notebooks/exercise-03/conditions.yml index 54c7a49..271d84d 100644 --- a/ansible-101/notebooks/exercise-03/conditions.yml +++ b/ansible-101/notebooks/exercise-03/conditions.yml @@ -22,4 +22,3 @@ tasks: - debug: msg="Replace me" when: true - diff --git a/ansible-101/notebooks/exercise-03/environment.yml b/ansible-101/notebooks/exercise-03/environment.yml index e4fd60b..92f0d78 100644 --- a/ansible-101/notebooks/exercise-03/environment.yml +++ b/ansible-101/notebooks/exercise-03/environment.yml @@ -6,4 +6,3 @@ ansible_env.{{item}} with_items: > {{ansible_env | map('regex_search', '^PATH') | select('string') | list }} - diff --git a/ansible-101/notebooks/exercise-03/get-facts.yml b/ansible-101/notebooks/exercise-03/get-facts.yml index 744f4ea..24125eb 100644 --- a/ansible-101/notebooks/exercise-03/get-facts.yml +++ b/ansible-101/notebooks/exercise-03/get-facts.yml @@ -31,5 +31,3 @@ debug: msg="The device is {{item.device}}" with_items: > {{ansible_mounts}} - - diff --git a/ansible-101/notebooks/exercise-03/web b/ansible-101/notebooks/exercise-03/web index 09f0c5d..eefdd13 100644 --- a/ansible-101/notebooks/exercise-03/web +++ b/ansible-101/notebooks/exercise-03/web @@ -1,4 +1,4 @@ # Just web [web] -172.17.0.[3:6] ansible_password=root +172.17.0.[3:6] ansible_password=root diff --git a/ansible-101/notebooks/exercise-05/inventory b/ansible-101/notebooks/exercise-05/inventory index acc3c89..73e3cc2 100644 --- a/ansible-101/notebooks/exercise-05/inventory +++ b/ansible-101/notebooks/exercise-05/inventory @@ -16,10 +16,10 @@ web_rome_prod # further host variables [web_rome:vars] -ansible_username=root +ansible_username=root -# Connect with docker +# Connect with docker [web_rome_test:vars] ansible_connection=docker ansible_docker_extra_args="-Htcp://172.17.0.1" @@ -28,9 +28,9 @@ ansible_docker_extra_args="-Htcp://172.17.0.1" [web_rome_test] ansible101_web_1 -# -# Don't need to be Ssh +# +# Don't need to be Ssh # to be my local machine ;) # [course] -localhost ansible_connection=local \ No newline at end of file +localhost ansible_connection=local diff --git a/ansible-101/notebooks/exercise-05/inventory-docker-solution.py b/ansible-101/notebooks/exercise-05/inventory-docker-solution.py index 86adbf1..f2ca03b 100755 --- a/ansible-101/notebooks/exercise-05/inventory-docker-solution.py +++ b/ansible-101/notebooks/exercise-05/inventory-docker-solution.py @@ -1,11 +1,11 @@ #!/usr/bin/env python # List our containers. Note: this only works with docker-compose containers. from __future__ import print_function -from collections import defaultdict -import json +import json +from collections import defaultdict -# +# # Manage different docker libraries # try: @@ -14,33 +14,37 @@ from docker import APIClient as Client import logging + log = logging.getLogger() logging.basicConfig(level=logging.DEBUG) + def print_hosts(): - c=Client(base_url="http://172.17.0.1:2375/") + c = Client(base_url="http://172.17.0.1:2375/") container_fmt = lambda x: ( - x['Names'][0][1:], - x['NetworkSettings']['Networks']['bridge']['IPAddress'], + x["Names"][0][1:], + x["NetworkSettings"]["Networks"]["bridge"]["IPAddress"], ) - - inventory = dict() - + + inventory = dict() + for x in c.containers(): - log.debug("Processing entry %r", '\t\t'.join(container_fmt(x))) + log.debug("Processing entry %r", "\t\t".join(container_fmt(x))) try: - group_name = x['Labels']['com.docker.compose.service'] - ip_address = x['NetworkSettings']['Networks']['bridge']['IPAddress'] + group_name = x["Labels"]["com.docker.compose.service"] + ip_address = x["NetworkSettings"]["Networks"]["bridge"]["IPAddress"] if group_name not in inventory: inventory[group_name] = defaultdict(list) - inventory[group_name]['hosts'].append(ip_address) + inventory[group_name]["hosts"].append(ip_address) except KeyError: - log.warning("Host not run via docker-compose: skipping") - - inventory['web']['host_vars'] = {'ansible_ssh_common_args': ' -o StrictHostKeyChecking=no '} + log.warning("Host not run via docker-compose: skipping") + + inventory["web"]["host_vars"] = { + "ansible_ssh_common_args": " -o StrictHostKeyChecking=no " + } ret = json.dumps(inventory, indent=True) return ret -if __name__ == '__main__': +if __name__ == "__main__": print(print_hosts()) diff --git a/ansible-101/notebooks/exercise-05/inventory-docker.py b/ansible-101/notebooks/exercise-05/inventory-docker.py index 2a6849d..bdcbe5d 100755 --- a/ansible-101/notebooks/exercise-05/inventory-docker.py +++ b/ansible-101/notebooks/exercise-05/inventory-docker.py @@ -1,29 +1,27 @@ #!/usr/bin/env python # List our containers. Note: this only works with docker-compose containers. from __future__ import print_function -from collections import defaultdict -import json -import docker + import logging +from collections import defaultdict + log = logging.getLogger() logging.basicConfig(level=logging.DEBUG) - c = Client(base_url="http://172.17.0.1:2375/") container_fmt = lambda x: ( - x['Names'][0][1:], - x['Labels']['com.docker.compose.service'], - x['NetworkSettings']['Networks']['bridge']['IPAddress'], + x["Names"][0][1:], + x["Labels"]["com.docker.compose.service"], + x["NetworkSettings"]["Networks"]["bridge"]["IPAddress"], ) inventory = defaultdict(list) for x in c.containers(): - log.debug("Processing entry %r", '\t\t'.join(container_fmt(x))) - group_name = x['Labels']['com.docker.compose.service'] - ip_address = x['NetworkSettings']['Networks']['bridge']['IPAddress'] + log.debug("Processing entry %r", "\t\t".join(container_fmt(x))) + group_name = x["Labels"]["com.docker.compose.service"] + ip_address = x["NetworkSettings"]["Networks"]["bridge"]["IPAddress"] inventory[group_name].append(ip_address) - diff --git a/ansible-101/notebooks/exercise-06/ssh_config b/ansible-101/notebooks/exercise-06/ssh_config index 572b57e..475b467 100644 --- a/ansible-101/notebooks/exercise-06/ssh_config +++ b/ansible-101/notebooks/exercise-06/ssh_config @@ -8,7 +8,7 @@ Host 172.23.0.* User centos IdentityFile ~/id_ansible - # Just for testing purposes, we could + # Just for testing purposes, we could # want to skip host key checking StrictHostKeyChecking no @@ -18,18 +18,17 @@ Host bastion Hostname 172.17.0.5 StrictHostKeyChecking no UserKnownHostsFile /dev/null - IdentityFile ../exercise-01/id_ansible + IdentityFile ../exercise-01/id_ansible # # Here's the magic ProxyCommand stuff. # BEWARE: some ssh-client versions re-process bastion to 172.17.0.5 # and this would end in a recursive proxy transit. Always # set an EXCLUSION for your bastion host ip. -# +# Match Host 172.17.0.*,!172.17.0.5 User root StrictHostKeyChecking no UserKnownHostsFile /dev/null IdentityFile ../exercise-01/id_ansible ProxyCommand ssh -F ssh_config root@bastion -W %h:%p - diff --git a/ansible-101/notebooks/exercise-07/.add_key.yml b/ansible-101/notebooks/exercise-07/.add_key.yml index 8174a50..16f18f2 100644 --- a/ansible-101/notebooks/exercise-07/.add_key.yml +++ b/ansible-101/notebooks/exercise-07/.add_key.yml @@ -38,5 +38,3 @@ tasks: - name: Just ping shell: hostname - - diff --git a/ansible-101/notebooks/exercise-07/add_key.yml b/ansible-101/notebooks/exercise-07/add_key.yml index 662828b..be14d1f 100644 --- a/ansible-101/notebooks/exercise-07/add_key.yml +++ b/ansible-101/notebooks/exercise-07/add_key.yml @@ -45,5 +45,3 @@ tasks: - name: A test command shell: hostname - - diff --git a/ansible-101/notebooks/exercise-07/debug.yml b/ansible-101/notebooks/exercise-07/debug.yml index 3a55bbf..593a365 100644 --- a/ansible-101/notebooks/exercise-07/debug.yml +++ b/ansible-101/notebooks/exercise-07/debug.yml @@ -49,5 +49,3 @@ map('extract', hostvars, ['ansible_default_ipv4', 'address']) | reject('undefined') | list }} - - diff --git a/ansible-101/notebooks/exercise-07/files-content.yml b/ansible-101/notebooks/exercise-07/files-content.yml index 9a7307c..96739a3 100644 --- a/ansible-101/notebooks/exercise-07/files-content.yml +++ b/ansible-101/notebooks/exercise-07/files-content.yml @@ -63,9 +63,3 @@ - name: Fail if AWESOME is not in the page content fail: when: "'sysadminpy' not in webpage.content" - - - - - - diff --git a/ansible-101/notebooks/exercise-07/inventory b/ansible-101/notebooks/exercise-07/inventory index 7c625d5..38c1bd6 100644 --- a/ansible-101/notebooks/exercise-07/inventory +++ b/ansible-101/notebooks/exercise-07/inventory @@ -7,4 +7,3 @@ ansible_docker_extra_args="-Htcp://172.17.0.1" # The actual host reference [web] ansible101_web_[1:3] - diff --git a/ansible-101/notebooks/exercise-07/lookup.yml b/ansible-101/notebooks/exercise-07/lookup.yml index 1fd046e..04694c6 100644 --- a/ansible-101/notebooks/exercise-07/lookup.yml +++ b/ansible-101/notebooks/exercise-07/lookup.yml @@ -6,4 +6,3 @@ debug: msg: > {{ lookup('file', '/etc/resolv.conf') }} - diff --git a/ansible-101/notebooks/exercise-07/mount-bind.yml b/ansible-101/notebooks/exercise-07/mount-bind.yml index 2ded42e..13db09d 100644 --- a/ansible-101/notebooks/exercise-07/mount-bind.yml +++ b/ansible-101/notebooks/exercise-07/mount-bind.yml @@ -22,4 +22,3 @@ fstype: state: register: fstab - diff --git a/ansible-101/notebooks/exercise-07/process-facts.yml b/ansible-101/notebooks/exercise-07/process-facts.yml index c2b1769..a458516 100644 --- a/ansible-101/notebooks/exercise-07/process-facts.yml +++ b/ansible-101/notebooks/exercise-07/process-facts.yml @@ -16,4 +16,3 @@ {{item.device}} {{ (100 * item.size_available/item.size_total) | int }}% with_items: > {{ansible_mounts}} - diff --git a/ansible-101/notebooks/exercise-07/shell-output-01.yml b/ansible-101/notebooks/exercise-07/shell-output-01.yml index 132f6df..bb58a12 100644 --- a/ansible-101/notebooks/exercise-07/shell-output-01.yml +++ b/ansible-101/notebooks/exercise-07/shell-output-01.yml @@ -15,4 +15,3 @@ debug: var=item with_items: > {{ o.stdout_lines }} - diff --git a/ansible-101/notebooks/exercise-07/shell-output-02.yml b/ansible-101/notebooks/exercise-07/shell-output-02.yml index 06bf181..36b555c 100644 --- a/ansible-101/notebooks/exercise-07/shell-output-02.yml +++ b/ansible-101/notebooks/exercise-07/shell-output-02.yml @@ -37,4 +37,3 @@ src: /tmp/fetch dest: /tmp/sosreport.tar.bz2 format: bz2 - diff --git a/ansible-101/notebooks/exercise-08/dumper.yaml b/ansible-101/notebooks/exercise-08/dumper.yaml index 8c229db..f7a7c24 100644 --- a/ansible-101/notebooks/exercise-08/dumper.yaml +++ b/ansible-101/notebooks/exercise-08/dumper.yaml @@ -5,4 +5,3 @@ debug: var=mongo_nodes_f - name: "Dump processed configs" debug: var=mongo_uri_f - diff --git a/ansible-101/notebooks/exercise-08/group_vars/all b/ansible-101/notebooks/exercise-08/group_vars/all index ca9b680..2c08558 100644 --- a/ansible-101/notebooks/exercise-08/group_vars/all +++ b/ansible-101/notebooks/exercise-08/group_vars/all @@ -10,4 +10,3 @@ mongo_nodes_f: > |list }} mongo_uri_f: mongodb://{{mongo_nodes_f|join(",")}}/test?replicaSet={{mongo_setup._id}} - diff --git a/ansible-101/notebooks/exercise-08/group_vars/prod b/ansible-101/notebooks/exercise-08/group_vars/prod index ba0a9f7..530b426 100644 --- a/ansible-101/notebooks/exercise-08/group_vars/prod +++ b/ansible-101/notebooks/exercise-08/group_vars/prod @@ -17,4 +17,3 @@ mongo_setup: hidden : false, } ] - diff --git a/ansible-101/notebooks/exercise-08/group_vars/test b/ansible-101/notebooks/exercise-08/group_vars/test index ba0a9f7..530b426 100644 --- a/ansible-101/notebooks/exercise-08/group_vars/test +++ b/ansible-101/notebooks/exercise-08/group_vars/test @@ -17,4 +17,3 @@ mongo_setup: hidden : false, } ] - diff --git a/ansible-101/notebooks/exercise-08/prod b/ansible-101/notebooks/exercise-08/prod index 7df95da..413beda 100644 --- a/ansible-101/notebooks/exercise-08/prod +++ b/ansible-101/notebooks/exercise-08/prod @@ -1,2 +1,2 @@ [prod:children] -all +all diff --git a/ansible-101/notebooks/exercise-08/sample-01.yaml b/ansible-101/notebooks/exercise-08/sample-01.yaml index a601a93..4b48b45 100644 --- a/ansible-101/notebooks/exercise-08/sample-01.yaml +++ b/ansible-101/notebooks/exercise-08/sample-01.yaml @@ -1,6 +1,6 @@ # # Yaml comments starts with "#" -# +# # A --- signals the beginning of a document --- yaml={ 'is a superset': 'of json'} diff --git a/ansible-101/notebooks/exercise-09/documentroot.yml b/ansible-101/notebooks/exercise-09/documentroot.yml index 10936c5..a8b0483 100644 --- a/ansible-101/notebooks/exercise-09/documentroot.yml +++ b/ansible-101/notebooks/exercise-09/documentroot.yml @@ -11,5 +11,3 @@ path: /var/www/html/{{x}}/index.html line: "{{ansible_hostname}}" create: yes - - diff --git a/ansible-101/notebooks/exercise-09/web-1.yml b/ansible-101/notebooks/exercise-09/web-1.yml index 1b7c153..a657d51 100644 --- a/ansible-101/notebooks/exercise-09/web-1.yml +++ b/ansible-101/notebooks/exercise-09/web-1.yml @@ -8,4 +8,3 @@ - Rimini - Emilia-Romagna - Italia - diff --git a/ansible-101/notebooks/untitled.txt b/ansible-101/notebooks/untitled.txt index 7bda9ff..7314360 100644 --- a/ansible-101/notebooks/untitled.txt +++ b/ansible-101/notebooks/untitled.txt @@ -2,4 +2,4 @@ ## Subtitle -ciao ragazzi \ No newline at end of file +ciao ragazzi diff --git a/ansible-101/notebooks/web b/ansible-101/notebooks/web index 3e9dd9c..1cc5760 100644 --- a/ansible-101/notebooks/web +++ b/ansible-101/notebooks/web @@ -1,4 +1,4 @@ -# Connect with docker +# Connect with docker [web:vars] ansible_connection=docker ansible_docker_extra_args="-H tcp://172.17.0.1" @@ -6,4 +6,3 @@ ansible_docker_extra_args="-H tcp://172.17.0.1" # The actual host reference [web] ansible101_web_[1:3] - diff --git a/ansible-101/site-digitalocean.yml b/ansible-101/site-digitalocean.yml index fe4eca6..2a2cd50 100644 --- a/ansible-101/site-digitalocean.yml +++ b/ansible-101/site-digitalocean.yml @@ -109,9 +109,3 @@ - debug: var: output when: true # droplet_id|default(0) != 0 - - - - - - diff --git a/ansible-101/tox.ini b/ansible-101/tox.ini index da8c0c7..a8e9cf1 100644 --- a/ansible-101/tox.ini +++ b/ansible-101/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = py27, py32 +envlist = py27, py3 # skip setup.py skipsdist=True @@ -24,7 +24,7 @@ commands = easy_install -q pyzmq iptest [] -[testenv:py32] +[testenv:py3] commands = easy_install -q pyzmq iptest3 [] diff --git a/connexion-101/Dockerfile b/connexion-101/Dockerfile index b02bdbd..9409066 100644 --- a/connexion-101/Dockerfile +++ b/connexion-101/Dockerfile @@ -5,7 +5,7 @@ FROM python:3.8 MAINTAINER roberto.polli@par-tec.it -RUN apt-get -y update && apt-get -y install gcc make python-dev python-pip +RUN apt-get -y update && apt-get -y install gcc make python-dev python-pip RUN apt-get -y update && apt-get -y install build-essential libblas-dev liblapack-dev gfortran libfreetype6-dev libpng-dev RUN apt-get -y update && apt-get -y install tree sshpass openssl RUN apt-get -y clean diff --git a/connexion-101/Makefile b/connexion-101/Makefile index a37d5a8..74ba0ff 100644 --- a/connexion-101/Makefile +++ b/connexion-101/Makefile @@ -11,7 +11,7 @@ EXTERNAL_COURSES = course: .prepare .EXPORT_ALL_VARIABLES - docker-compose scale course=1 editor=1 + docker-compose scale course=1 editor=1 docker-compose logs course | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" | sed -e "s/(.* or 127.0.0.1)/$(MAIN_IP)/g" clean: @@ -28,7 +28,7 @@ clean-other: docker-compose rm -vf editor dev test: - docker exec -ti connexion101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' + docker exec -ti connexion101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' dev: .prepare .EXPORT_ALL_VARIABLES docker-compose scale dev=1 editor=1 diff --git a/connexion-101/README.md b/connexion-101/README.md index 6d581e6..f268912 100644 --- a/connexion-101/README.md +++ b/connexion-101/README.md @@ -50,9 +50,9 @@ the course installed. Get the jupyter notebook url at the end of the deployment. -## Playing the course on DigitalOcean +## Playing the course on DigitalOcean -If you don't use ansible, you can always setup everything +If you don't use ansible, you can always setup everything by hand. - create an Ubuntu 18.04 docker droplet from the menu and ssh into your host @@ -81,5 +81,3 @@ ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375 See asciicast here [![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI) - - diff --git a/connexion-101/api/__init__.py b/connexion-101/api/__init__.py index f48037d..0e91ba3 100644 --- a/connexion-101/api/__init__.py +++ b/connexion-101/api/__init__.py @@ -1,7 +1,4 @@ -from connexion import FlaskApp, problem -from os.path import isfile, dirname -from yaml import safe_load as yaml_load -from logging import basicConfig +from connexion import problem def basic_auth(username, password, required_scopes=None): @@ -35,4 +32,3 @@ def post_hello(body): ) print(f"body, {body.__class__}") return {"UNEXPECTED_STRING": 1} - diff --git a/connexion-101/api/__main__.py b/connexion-101/api/__main__.py index 4e99cfa..41e7b94 100644 --- a/connexion-101/api/__main__.py +++ b/connexion-101/api/__main__.py @@ -1,7 +1,8 @@ +from logging import basicConfig +from os.path import dirname, isfile + from connexion import FlaskApp, problem -from os.path import isfile, dirname from yaml import safe_load as yaml_load -from logging import basicConfig def basic_auth(username, password, required_scopes=None): @@ -52,7 +53,10 @@ def configure_logger(log_config="logging.yaml"): if __name__ == "__main__": configure_logger() app = FlaskApp( - "hello", port=8443, specification_dir=dirname(__file__), options={"swagger_ui": True} + "hello", + port=8443, + specification_dir=dirname(__file__), + options={"swagger_ui": True}, ) app.add_api("simple.yaml", validate_responses=True, strict_validation=True) app.run(ssl_context="adhoc", debug=True) diff --git a/connexion-101/api/logging.yaml b/connexion-101/api/logging.yaml index b117684..c00119d 100644 --- a/connexion-101/api/logging.yaml +++ b/connexion-101/api/logging.yaml @@ -21,5 +21,3 @@ root: level: DEBUG handlers: - rfc5424 - - diff --git a/connexion-101/api/simple.yaml b/connexion-101/api/simple.yaml index f919f8b..b37bae1 100644 --- a/connexion-101/api/simple.yaml +++ b/connexion-101/api/simple.yaml @@ -61,4 +61,3 @@ components: type: http scheme: basic x-basicInfoFunc: api.basic_auth - diff --git a/connexion-101/deleteme-digitalocean.yml b/connexion-101/deleteme-digitalocean.yml index dfec095..035e3c8 100644 --- a/connexion-101/deleteme-digitalocean.yml +++ b/connexion-101/deleteme-digitalocean.yml @@ -35,4 +35,3 @@ with_items: - deleteme-1 - deleteme-2 - diff --git a/connexion-101/docker-compose.yml b/connexion-101/docker-compose.yml index 472556c..cd98fd3 100644 --- a/connexion-101/docker-compose.yml +++ b/connexion-101/docker-compose.yml @@ -58,4 +58,3 @@ services: - 8888:8888 entrypoint: /bin/sh command: -c "/usr/local/bin/jupyter-notebook --ip 0.0.0.0 --allow-root" - diff --git a/connexion-101/notebooks/00-intro.ipynb b/connexion-101/notebooks/00-intro.ipynb index 39f2753..701282e 100644 --- a/connexion-101/notebooks/00-intro.ipynb +++ b/connexion-101/notebooks/00-intro.ipynb @@ -243,7 +243,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.7.7" } }, "nbformat": 4, diff --git a/connexion-101/notebooks/01-interoperable-apis.ipynb b/connexion-101/notebooks/01-interoperable-apis.ipynb index bbc939a..0cbef9c 100644 --- a/connexion-101/notebooks/01-interoperable-apis.ipynb +++ b/connexion-101/notebooks/01-interoperable-apis.ipynb @@ -205,7 +205,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.7.8" } }, "nbformat": 4, diff --git a/connexion-101/notebooks/02-openapi-3.ipynb b/connexion-101/notebooks/02-openapi-3.ipynb index 30c0f2a..6f3ad55 100644 --- a/connexion-101/notebooks/02-openapi-3.ipynb +++ b/connexion-101/notebooks/02-openapi-3.ipynb @@ -58,14 +58,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "hide_input": false, "tags": [ "hide_input" ] }, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'render_markdown' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mremote_yaml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'https://raw.githubusercontent.com/teamdigitale/api-starter-kit/master/openapi/simple.yaml.src'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m render_markdown(f'''\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mSwagger\u001b[0m \u001b[0mEditor\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0moas_editor_url\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mremote_yaml\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0ma\u001b[0m \u001b[0msimple\u001b[0m \u001b[0mwebapp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mediting\u001b[0m \u001b[0mOpenAPI\u001b[0m \u001b[0;36m3\u001b[0m \u001b[0mlanguage\u001b[0m \u001b[0mspecs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'render_markdown' is not defined" + ] + } + ], "source": [ "remote_yaml = 'https://raw.githubusercontent.com/teamdigitale/api-starter-kit/master/openapi/simple.yaml.src'\n", "render_markdown(f'''\n", @@ -208,11 +220,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "hide_input": false }, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'render_markdown' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m render_markdown(f'''\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m-\u001b[0m \u001b[0mopen\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mthe\u001b[0m \u001b[0mprevious\u001b[0m \u001b[0mOAS3\u001b[0m \u001b[0mspec\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0medit\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnotebooks\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0moas3\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mex\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0myaml\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m-\u001b[0m \u001b[0mcopy\u001b[0m \u001b[0mits\u001b[0m \u001b[0mcontent\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mthe\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mSwagger\u001b[0m \u001b[0mEditor\u001b[0m \u001b[0mOnline\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0moas_editor_url\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'render_markdown' is not defined" + ] + } + ], "source": [ "render_markdown(f'''\n", "\n", @@ -257,7 +281,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.7.8" } }, "nbformat": 4, diff --git a/connexion-101/notebooks/03-connexion.ipynb b/connexion-101/notebooks/03-connexion.ipynb index 47ef2f2..5073abc 100644 --- a/connexion-101/notebooks/03-connexion.ipynb +++ b/connexion-101/notebooks/03-connexion.ipynb @@ -432,7 +432,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.6" + "version": "3.7.7" } }, "nbformat": 4, diff --git a/connexion-101/notebooks/anchors.yaml b/connexion-101/notebooks/anchors.yaml index 871beb7..feac690 100644 --- a/connexion-101/notebooks/anchors.yaml +++ b/connexion-101/notebooks/anchors.yaml @@ -20,4 +20,3 @@ foo: &foo bar: &bar <<: *base age: 20 - diff --git a/connexion-101/notebooks/custom.css b/connexion-101/notebooks/custom.css index a8e5365..cec414c 100644 --- a/connexion-101/notebooks/custom.css +++ b/connexion-101/notebooks/custom.css @@ -13,5 +13,3 @@ div#notebook, div.CodeMirror, div.output_area pre, div.output_wrapper, div.promp font-size: 14pt; color: #5cb85c; } - - diff --git a/connexion-101/notebooks/oas3/api-solution.py b/connexion-101/notebooks/oas3/api-solution.py index 0e40fa8..ab32800 100644 --- a/connexion-101/notebooks/oas3/api-solution.py +++ b/connexion-101/notebooks/oas3/api-solution.py @@ -3,8 +3,6 @@ import pytz from connexion import problem -from flask import after_this_request, request - from throttling_quota import throttle @@ -24,9 +22,7 @@ def get_status(): detail="Retry after the number of seconds specified in the the Retry-After header.", headers={"Retry-After": p, **headers}, ) - return problem( - status=200, title="OK", detail="So far so good.", headers=headers - ) + return problem(status=200, title="OK", detail="So far so good.", headers=headers) @throttle @@ -63,12 +59,7 @@ def get_timezones(limit=5, offset=0, continent=None): entries = [x for x in entries if x.startswith(continent)] entries = entries[offset : offset + limit] - return { - "limit": limit, - "offset": offset, - "entries": entries, - "count": len(entries), - } + return {"limit": limit, "offset": offset, "entries": entries, "count": len(entries)} @throttle diff --git a/connexion-101/notebooks/oas3/api.py b/connexion-101/notebooks/oas3/api.py index cea7d5b..ffc1ffe 100644 --- a/connexion-101/notebooks/oas3/api.py +++ b/connexion-101/notebooks/oas3/api.py @@ -1,11 +1,3 @@ -from datetime import datetime -from random import randint - -import pytz -from connexion import problem -from flask import request - - def get_status(): """Implement the get_status operation :return: a problem+json with status 200, title "OK" and a successful @@ -20,12 +12,7 @@ def get_echo(tz="Zulu", user=None, token_info=None): def get_timezones(limit=5, offset=0, continent=None): raise NotImplementedError - return { - "limit": limit, - "offset": offset, - "entries": entries, - "count": len(entries), - } + return {"limit": limit, "offset": offset, "entries": entries, "count": len(entries)} @throttle diff --git a/connexion-101/notebooks/oas3/ex-01-info.yaml b/connexion-101/notebooks/oas3/ex-01-info.yaml index 604ca21..af5326d 100644 --- a/connexion-101/notebooks/oas3/ex-01-info.yaml +++ b/connexion-101/notebooks/oas3/ex-01-info.yaml @@ -1,5 +1,5 @@ # Complete this file with the required informations -# using your swagger-editor. You should +# using your swagger-editor. You should # - fix all the eventual error # - add the missing parameters # so that the file become a valid OAS3 spec. diff --git a/connexion-101/notebooks/oas3/ex-03-02-path-ok.yaml b/connexion-101/notebooks/oas3/ex-03-02-path-ok.yaml index 9718983..d6a151d 100644 --- a/connexion-101/notebooks/oas3/ex-03-02-path-ok.yaml +++ b/connexion-101/notebooks/oas3/ex-03-02-path-ok.yaml @@ -59,7 +59,7 @@ paths: content: application/problem+json: schema: - $ref: '#/components/schemas/Problem' + $ref: '#/components/schemas/Problem' example: title: Internal Server Errror status: 500 @@ -69,4 +69,3 @@ components: schemas: Problem: # EXERCIS SOLUTION, REMOVE $ref: 'https://teamdigitale.github.io/openapi/0.0.5/definitions.yaml#/schemas/Problem' - diff --git a/connexion-101/notebooks/oas3/ex-03-02-path.yaml b/connexion-101/notebooks/oas3/ex-03-02-path.yaml index e25a268..851d9de 100644 --- a/connexion-101/notebooks/oas3/ex-03-02-path.yaml +++ b/connexion-101/notebooks/oas3/ex-03-02-path.yaml @@ -52,4 +52,3 @@ components: # REMOVEME FOR EXERCISE schemas: Problem: $ref: 'https://teamdigitale.github.io/openapi/0.0.5/definitions.yaml#/schemas/Problem' - diff --git a/connexion-101/notebooks/oas3/ex-04-01-headers-ok.yaml b/connexion-101/notebooks/oas3/ex-04-01-headers-ok.yaml index 8213ffe..223dd61 100644 --- a/connexion-101/notebooks/oas3/ex-04-01-headers-ok.yaml +++ b/connexion-101/notebooks/oas3/ex-04-01-headers-ok.yaml @@ -76,4 +76,3 @@ components: schemas: Problem: $ref: 'https://teamdigitale.github.io/openapi/0.0.5/definitions.yaml#/schemas/Problem' - diff --git a/connexion-101/notebooks/oas3/ex-07-01-throttling-ok.yaml b/connexion-101/notebooks/oas3/ex-07-01-throttling-ok.yaml index 6851f2a..30f9123 100644 --- a/connexion-101/notebooks/oas3/ex-07-01-throttling-ok.yaml +++ b/connexion-101/notebooks/oas3/ex-07-01-throttling-ok.yaml @@ -34,7 +34,7 @@ x-commons: X-RateLimit-Reset: $ref: 'https://teamdigitale.github.io/openapi/0.0.5/definitions.yaml#/headers/X-RateLimit-Reset' - + common-responses: &common-responses 429: $ref: "#/components/responses/429TooManyRequests" diff --git a/connexion-101/notebooks/oas3/ex-08-pagination-ok.yaml b/connexion-101/notebooks/oas3/ex-08-pagination-ok.yaml index 0c5db21..72c3909 100644 --- a/connexion-101/notebooks/oas3/ex-08-pagination-ok.yaml +++ b/connexion-101/notebooks/oas3/ex-08-pagination-ok.yaml @@ -97,7 +97,7 @@ paths: summary: Return the supported timezones description: | Return a paginated list of supported - timezones. If offset is too high, an empty + timezones. If offset is too high, an empty list of entries is returned. operationId: api.get_timezones responses: @@ -215,4 +215,3 @@ components: example: 2019-01-01T00:00:00Z Problem: $ref: 'https://teamdigitale.github.io/openapi/0.0.5/definitions.yaml#/schemas/Problem' - diff --git a/connexion-101/notebooks/oas3/openapi.yaml b/connexion-101/notebooks/oas3/openapi.yaml index 604ca21..af5326d 100644 --- a/connexion-101/notebooks/oas3/openapi.yaml +++ b/connexion-101/notebooks/oas3/openapi.yaml @@ -1,5 +1,5 @@ # Complete this file with the required informations -# using your swagger-editor. You should +# using your swagger-editor. You should # - fix all the eventual error # - add the missing parameters # so that the file become a valid OAS3 spec. diff --git a/connexion-101/notebooks/oas3/security.py b/connexion-101/notebooks/oas3/security.py index 0e0a201..e41bfd2 100644 --- a/connexion-101/notebooks/oas3/security.py +++ b/connexion-101/notebooks/oas3/security.py @@ -8,7 +8,7 @@ def my_auth(username, password, required_scopes=None): :params: username, the username :params: password, the password :params: scopes, the scope - :returns: `{"sub": username, "scope": ""}` on success, + :returns: `{"sub": username, "scope": ""}` on success, None on failure """ if username == password: diff --git a/connexion-101/notebooks/oas3/throttling_quota.py b/connexion-101/notebooks/oas3/throttling_quota.py index 9040452..42850f6 100644 --- a/connexion-101/notebooks/oas3/throttling_quota.py +++ b/connexion-101/notebooks/oas3/throttling_quota.py @@ -9,7 +9,7 @@ class ThrottlingQuota: """ A simple class to implement quota. - + BEWARE: It's a tutorial function, don't use in production! this is not thread-safe nor process-aware and stores everything in a dict(). @@ -64,7 +64,7 @@ def throttle_user(user): def throttle(wrapped): """A decorator to apply throttling policies. - + BEWARE: It's a tutorial function, don't use in production. """ diff --git a/connexion-101/notebooks/startup/99-last.py b/connexion-101/notebooks/startup/99-last.py index c4ec3f3..c429fc7 100644 --- a/connexion-101/notebooks/startup/99-last.py +++ b/connexion-101/notebooks/startup/99-last.py @@ -1,16 +1,13 @@ # Load default libraries and functions in jupyter -import json -import os -import sys from os import environ as env -from pathlib import Path from urllib.parse import urlparse import yaml -from IPython.display import Latex, Markdown, display -from requests import get +from IPython.display import Markdown, display from openapi_resolver import OpenapiResolver +from requests import get + def render_markdown(s): return display(Markdown(s)) @@ -21,22 +18,23 @@ def render_markdown(s): # editor_url = f'http://{env["MAIN_IP"]}' + ":8080/?url=" api_url = f'http://{env["MAIN_IP"]}' + ":5000/" -defintions_yaml = "https://teamdigitale.github.io/openapi/0.0.5/definitions.yaml#/parameters" +defintions_yaml = ( + "https://teamdigitale.github.io/openapi/0.0.5/definitions.yaml#/parameters" +) def api_server_url(http://github.com/path): return api_url + path + def oas_editor_http://github.com/url(url): return editor_url + url - def show_component(url): U = urlparse(url) - fragment = U.fragment.strip('/').split('/') + fragment = U.fragment.strip("/").split("/") ret = yaml.safe_load(get(url).content) for k in fragment: ret = ret[k] return OpenapiResolver.yaml_dump_pretty(ret) - diff --git a/connexion-101/requirements.txt b/connexion-101/requirements.txt index f2cfebe..4423534 100644 --- a/connexion-101/requirements.txt +++ b/connexion-101/requirements.txt @@ -19,4 +19,3 @@ nbstripout # Load jupyter extensions for exercises. jupyter_contrib_nbextensions RISE - diff --git a/connexion-101/site-digitalocean.yml b/connexion-101/site-digitalocean.yml index 63e60ef..91f9d3b 100644 --- a/connexion-101/site-digitalocean.yml +++ b/connexion-101/site-digitalocean.yml @@ -106,9 +106,3 @@ - debug: var: output - - - - - - diff --git a/connexion-101/tox.ini b/connexion-101/tox.ini index 18167f9..c7ef538 100644 --- a/connexion-101/tox.ini +++ b/connexion-101/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = py36 +envlist = py3 # skip setup.py skipsdist=True diff --git a/git-101/01-git.md b/git-101/01-git.md index 09a46bc..dcf9783 100644 --- a/git-101/01-git.md +++ b/git-101/01-git.md @@ -70,7 +70,7 @@ Distributed approach. ## Tracing requires identification -Declare who's modifying files. This will be inserted in +Declare who's modifying files. This will be inserted in the commit. ``` @@ -93,7 +93,7 @@ Track modifications with `git` ### Exercise - - get the previous `git config ... user.email` + - get the previous `git config ... user.email` - remove the `--global` flag from the previous command - run it @@ -108,7 +108,7 @@ Enter in the repo directory and check the status: there are a lot of files we are not interested in... ``` -!git status +!git status ``` `.gitignore` lists the files we're not interested in @@ -116,7 +116,7 @@ are a lot of files we are not interested in... ``` # Ignore all files not starting with h !echo "[^h]*" >> .gitignore -!git status +!git status ``` Now we have all `host*` files to be tracked. @@ -152,15 +152,15 @@ Save files to the local index Adding a line to the file we discover that ``` -!echo "127.0.0.2 localhost2.localdomain" >> hosts +!echo "127.0.0.2 localhost2.localdomain" >> hosts !git diff hosts ``` -If we like the changes, we can stage them +If we like the changes, we can stage them ``` !git add hosts -!git status +!git status ``` and finally save them in the repo. @@ -181,7 +181,7 @@ HEAD is the last commit. ``` -!git log +!git log ``` ![Basic branch](https://git-scm.com/figures/18333fig0310-tn.png) @@ -253,7 +253,7 @@ Now some git commands, but first create a dir. --- -## Tags & Branches +## Tags & Branches Writing codes and configuration we may want to follow different strategies and save our different attempts. @@ -265,7 +265,7 @@ different strategies and save our different attempts. !git tag -l # list tags ``` - - *branch* create a modifiable copy of the code, allowing + - *branch* create a modifiable copy of the code, allowing to save and work on different features ![Branches](https://git-scm.com/figures/18333fig0313-tn.png) @@ -410,7 +410,7 @@ Exercise: You can stage partial changes with: ``` -!git add -p +!git add -p ``` @@ -440,7 +440,7 @@ cd /repo-tmp/python-course Show repository configuration. Remote origin. ``` -! git config -l +! git config -l ``` @@ -511,4 +511,3 @@ To upload changes to the remote master (default) branch, you need to ``` To make it work, you need to be authenticated/authorized with the remote repo ;) - diff --git a/git-101/Makefile b/git-101/Makefile index 202a441..1642cb3 100644 --- a/git-101/Makefile +++ b/git-101/Makefile @@ -6,7 +6,5 @@ all: $(BOOKS) @echo $(BOOKS) notebooks/%.ipynb: %.md - - notedown --to notebook $^ > $@ - + notedown --to notebook $^ > $@ diff --git a/git-101/tox.ini b/git-101/tox.ini index 68f92d2..268e6e7 100644 --- a/git-101/tox.ini +++ b/git-101/tox.ini @@ -9,4 +9,3 @@ whitelist_externals = make commands = make - diff --git a/ipynbhelper.py b/ipynbhelper.py index 9393a50..9583e5d 100644 --- a/ipynbhelper.py +++ b/ipynbhelper.py @@ -4,12 +4,13 @@ """ -import sys -import os import io -from Queue import Empty +import os +import sys from IPython.nbformat import current +from Queue import Empty + try: from IPython.kernel import KernelManager assert KernelManager # to silence pyflakes diff --git a/mongodb-101/Dockerfile b/mongodb-101/Dockerfile index 8e5d72d..8fff834 100644 --- a/mongodb-101/Dockerfile +++ b/mongodb-101/Dockerfile @@ -31,4 +31,3 @@ RUN dnf install -y docker-ce-cli RUN curl >/etc/profile.d/99-docker.sh https://gist.githubusercontent.com/ioggstream/cc7caffc8e038ac27a9390a80c8e7cc0/raw/5fd6e39141631ea9e196d31dcf01e4ccddae376f/z99-docker-profile.sh ENV DOCKER_HOST=tcp://172.17.0.1:2375 ENTRYPOINT jupyter notebook --ip 0.0.0.0 --port 8001 --allow-root - diff --git a/mongodb-101/Makefile b/mongodb-101/Makefile index e843b08..d4e8dc1 100644 --- a/mongodb-101/Makefile +++ b/mongodb-101/Makefile @@ -11,7 +11,7 @@ EXTERNAL_COURSES = course: .prepare .EXPORT_ALL_VARIABLES - docker-compose scale course=1 + docker-compose scale course=1 docker-compose logs course | grep token | sed -e "s/0.0.0.0|course/$(MAIN_IP)/g" | sed -e "s/(.* or 127.0.0.1)/$(MAIN_IP)/g" clean: @@ -28,10 +28,10 @@ clean-other: docker-compose rm -vf dev test: - docker exec -ti connexion101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' + docker exec -ti connexion101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' dev: .prepare .EXPORT_ALL_VARIABLES - docker-compose scale dev=1 + docker-compose scale dev=1 docker-compose logs dev | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" | sed -e "s/(.* or 127.0.0.1)/$(MAIN_IP)/g" .prepare: diff --git a/mongodb-101/README.md b/mongodb-101/README.md index 457227d..90663d4 100644 --- a/mongodb-101/README.md +++ b/mongodb-101/README.md @@ -32,7 +32,7 @@ Run the environemnt with: # make course -or +or # docker-compose scale course=1 bastion=1 web=3 # firefox http://localhost:8888 @@ -40,7 +40,7 @@ or ## Playing the course on DigitalOcean -DigitalOcean is a great and cheap cloud-provider +DigitalOcean is a great and cheap cloud-provider - create an Ubuntu 16.04 docker droplet from the menu and ssh into your host - expose docker on local http port @@ -68,5 +68,3 @@ ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375 See asciicast here [![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI) - - diff --git a/mongodb-101/config.json b/mongodb-101/config.json index 51bfb4a..2e6bde7 100644 --- a/mongodb-101/config.json +++ b/mongodb-101/config.json @@ -3,7 +3,6 @@ "nbserver_extensions": { "jupyter_nbextensions_configurator": true }, - "terminado_settings": {"shell_command": ["/usr/bin/bash"]} + "terminado_settings": {"shell_command": ["/usr/bin/bash"]} } } - diff --git a/mongodb-101/docker-compose.yml b/mongodb-101/docker-compose.yml index 3f486eb..dfa7b84 100644 --- a/mongodb-101/docker-compose.yml +++ b/mongodb-101/docker-compose.yml @@ -26,4 +26,3 @@ services: - 8888:8888 entrypoint: /usr/bin/bash command: -c "/usr/local/bin/jupyter-notebook --ip 0.0.0.0 --allow-root" - diff --git a/mongodb-101/requirements.txt b/mongodb-101/requirements.txt index f2cfebe..4423534 100644 --- a/mongodb-101/requirements.txt +++ b/mongodb-101/requirements.txt @@ -19,4 +19,3 @@ nbstripout # Load jupyter extensions for exercises. jupyter_contrib_nbextensions RISE - diff --git a/mongodb-101/site-digitalocean.yml b/mongodb-101/site-digitalocean.yml index 1b8ddc8..5335ec7 100644 --- a/mongodb-101/site-digitalocean.yml +++ b/mongodb-101/site-digitalocean.yml @@ -111,9 +111,3 @@ - debug: var: output - - - - - - diff --git a/mysql-101/.gitignore b/mysql-101/.gitignore index df1486c..1219071 100644 --- a/mysql-101/.gitignore +++ b/mysql-101/.gitignore @@ -1,4 +1,3 @@ # generated by Make slides.md _* - diff --git a/mysql-101/99-docker-profile.sh b/mysql-101/99-docker-profile.sh index 2464966..f4976eb 100644 --- a/mysql-101/99-docker-profile.sh +++ b/mysql-101/99-docker-profile.sh @@ -32,4 +32,3 @@ _dshell() fi } complete -F _dshell dshell - diff --git a/mysql-101/Makefile b/mysql-101/Makefile index 78e9129..344a887 100644 --- a/mysql-101/Makefile +++ b/mysql-101/Makefile @@ -13,14 +13,13 @@ revealjs: .PHONY: course MAIN_IP = $(shell ip -4 -o a s scope global | awk -F'[/ ]+' '{print $$4; exit} ') -EXTERNAL_COURSES = +EXTERNAL_COURSES = course: .prepare - docker-compose scale centos=3 mysql=3 & + docker-compose scale centos=3 mysql=3 & bash 2>/dev/null ~/.bashrc wait - + .prepare: echo "done" - diff --git a/mysql-101/ansible/check-cluster.js b/mysql-101/ansible/check-cluster.js index 685ca3f..b48f545 100644 --- a/mysql-101/ansible/check-cluster.js +++ b/mysql-101/ansible/check-cluster.js @@ -24,5 +24,3 @@ ret_config = dba.configureLocalInstance(uri, { if (ret_config["status"] != "ok") { exit(1); } - - diff --git a/mysql-101/ansible/initialize-innodbcluster.yml b/mysql-101/ansible/initialize-innodbcluster.yml index a62dd08..1d154cb 100644 --- a/mysql-101/ansible/initialize-innodbcluster.yml +++ b/mysql-101/ansible/initialize-innodbcluster.yml @@ -85,13 +85,13 @@ with_items: - create-cluster.js - add-node.js - + - name: Create cluster on local node run_once: yes delegate_to: "{{groups['innodb'][0]}}" shell: > - mysqlsh --uri icroot@{{ansible_default_ipv4_address}}:3306 - --password=Secret%2017 --log-level=DEBUG4 + mysqlsh --uri icroot@{{ansible_default_ipv4_address}}:3306 + --password=Secret%2017 --log-level=DEBUG4 --js -f /root/create-cluster.js - name: Add instances to cluster @@ -99,7 +99,7 @@ when: >- ansible_hostname in groups['innodb'][1:] shell: > - mysqlsh --uri icroot@localhost:3306 --password=Secret%2017 --log-level=DEBUG4 + mysqlsh --uri icroot@localhost:3306 --password=Secret%2017 --log-level=DEBUG4 --js -f /root/add-node.js - name: Kill mysql diff --git a/mysql-101/ansible/install-mysql.yml b/mysql-101/ansible/install-mysql.yml index 75d8e28..3ee646e 100644 --- a/mysql-101/ansible/install-mysql.yml +++ b/mysql-101/ansible/install-mysql.yml @@ -23,7 +23,7 @@ enabled: yes - name: Distribute keys - copy: + copy: src: "{{item}}" dest: /root/.ssh/ mode: 0600 @@ -33,4 +33,3 @@ - name: Configure innodb cluster include: initialize-innodbcluster.yml - diff --git a/mysql-101/ansible/inventory b/mysql-101/ansible/inventory index fe48924..eac6017 100644 --- a/mysql-101/ansible/inventory +++ b/mysql-101/ansible/inventory @@ -7,4 +7,3 @@ mysql101_innodb_3 ansible_default_ipv4_address=172.17.0.8 [all:vars] ansible_connection=docker - diff --git a/mysql-101/lesson-0-intro.md b/mysql-101/lesson-0-intro.md index d20f70b..e1d8c24 100644 --- a/mysql-101/lesson-0-intro.md +++ b/mysql-101/lesson-0-intro.md @@ -123,5 +123,3 @@ Increased for Consistency and Isolation: - Enable persistency - Transactional: InnoDB, NDB - Non Transactional: MyISAM, Memory, - - diff --git a/mysql-101/lesson-1-0-installation.md b/mysql-101/lesson-1-0-installation.md index f57cdba..93e1928 100644 --- a/mysql-101/lesson-1-0-installation.md +++ b/mysql-101/lesson-1-0-installation.md @@ -141,7 +141,7 @@ A new password is generated each time you initialize the datadir /var/lib/mysql/ -The undo files are part of the system tablespace, and cannot be deleted! +The undo files are part of the system tablespace, and cannot be deleted! ## The datadir @@ -169,7 +169,7 @@ You should tune security systems when relocating datadirs. SElinux: # Allow mysql on another port. - semanage port -a -t mysqld_port_t -p tcp 13306 + semanage port -a -t mysqld_port_t -p tcp 13306 # Allow mysql to operate on files in /datadir and beyond. semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?" @@ -324,5 +324,3 @@ You can log your session in a file with Dump the output in HTML mysql --html - - diff --git a/mysql-101/lesson-1-1-authentication.md b/mysql-101/lesson-1-1-authentication.md index 8b1818c..c3f067e 100644 --- a/mysql-101/lesson-1-1-authentication.md +++ b/mysql-101/lesson-1-1-authentication.md @@ -3,8 +3,8 @@ ## mysql.user table & co - Authentication is based on users - - A user is a **couple** $(user, host)$ - + - A user is a **couple** $(user, host)$ + mysql> SELECT user,host,authentication_string FROM mysql.user; +------+--------------+-----------------------+ | user | host | authentication_string | @@ -36,16 +36,16 @@ you can: ## mysql.user table & co - Create a user and show its privileges. By default host is '%' - + CREATE USER admin IDENTIFIED BY 'admin'; - SHOW GRANTS FOR 'admin' \G + SHOW GRANTS FOR 'admin' \G HELP CREATE USER -- read carefully! - + - Show `root` privileges, and remember **users are couples** - + SHOW GRANTS; -- explain grants SHOW GRANTS FOR 'root'; -- does it work? Why? - SHOW GRANTS FOR 'root'@'localhost'; + SHOW GRANTS FOR 'root'@'localhost'; ## mysql.user table & co @@ -53,18 +53,18 @@ you can: SELECT CURRENT_USER(); -- who am I ALTER USER CURRENT_USER() IDENTIFIED BY 'My.2018%Secret'; - + - We can change the password with - + mysqladmin -u root password 'new-password' # may use port 3306 mysqladmin -u root password -h localhost 'new-password' # uses socket mysqladmin -u root -h a02f12e917b1 password 'new-password' - -## Securing installation + +## Securing installation - Once you change the password *check* if you get extra rows. - + mysql> SELECT user,host,authentication_string FROM mysql.user; +------+--------------+-----------------------+ | user | host | authentication_string | @@ -79,18 +79,18 @@ you can: 6 rows in set (0.00 sec) - In that case, it's not secured (anonymous user)! - + mysql -u"" -e "SELECT 1;" - + ## Securing installation - 5.6 only - secure the installation! - + mysql_secure_installation - + - and check the outcome - + mysql> SELECT user,host,authentication_string FROM mysql.user; +------+-----------+-------------------------+ | user | host | authentication_string | @@ -102,11 +102,11 @@ you can: 3 rows in set (0.00 sec) -## Securing installation - 5.7 +## Securing installation - 5.7 MySQL 5.7 is secure by default: - - `--initialize` dumps a random password to error-log + - `--initialize` dumps a random password to error-log - you must change this password at first login - the password policy plugin is enabled @@ -124,27 +124,27 @@ Resetting root password requires a restart. MySQL loads authentication tables in memory and enables them after startup: Skipping this step allows unauthenticated connections - + mysqld --skip-grant-tables \ # don't load authentication --skip-networking \ # don't use TCP --socket=mysql-$RANDOM.sock # use a non-standard socket! - + Once you log-in you need to load privilege table to be able to change it. STATUS; FLUSH PRIVILEGES; -- (re)load grant tables ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; - + Now `mysqladmin shutdown` and restart normally. - -## Reset root password + +## Reset root password - You can put those instructions in `resetpassword.sql` and append `--init-file=resetpassword.sql` to `mysqld`. - - To stop mysql **never** use `SIGKILL`. - - + - To stop mysql **never** use `SIGKILL`. + + ## Authentication plugins @@ -169,9 +169,9 @@ Eg. `auth_socket` INSTALL PLUGIN 'auth_socket' SONAME 'auth_socket.so'; CREATE USER 'mysql'@'localhost' IDENTIFIED WITH 'auth_socket'; -- passwords are ignored! - -Now login with - + +Now login with + sudo -u mysql mysql -umysql # tada! This `mysql` user has no special privilege! @@ -191,10 +191,9 @@ Create a mysql user tied to the `jon` entry in `/etc/passwd` authenticating with $ cat /etc/pam.d/mysql $ grep jon /etc/passwd - SQL] CREATE USER 'jon'@'localhost' IDENTIFIED WITH authentication_pam AS 'mysql'; - + SQL] CREATE USER 'jon'@'localhost' IDENTIFIED WITH authentication_pam AS 'mysql'; + Login with `jon` using the enable-cleartext-plugin so that mysql can forward you password to PAM. $ mysql -ujon -p --enable-cleartext-plugin SQL] - diff --git a/mysql-101/lesson-1-2-sql.md b/mysql-101/lesson-1-2-sql.md index 55ecf35..eadbfd3 100644 --- a/mysql-101/lesson-1-2-sql.md +++ b/mysql-101/lesson-1-2-sql.md @@ -8,7 +8,7 @@ Data is stored using 4 [macro-types](http://dev.mysql.com/doc/mysql/en/data-type - numeric BIT, *INT*, FLOAT, DOUBLE, DECIMAL - byte BLOB, *BINARY - character *CHAR, TEXT, ENUM, SET - + MySQL 5.7 changes temporal data logic. Check the documentation! ## Data Types @@ -21,11 +21,11 @@ Joining on different data-types causes an IMPLICIT CONVERSION of data. ## Data Types Some data-types have similarities: - + - `BINARY` and `CHAR` - `TEXT` and `BLOB` - max size in bit + max size in bit TINY - MEDIUM LONG BLOB,TEXT 8 16 24 32 @@ -40,11 +40,11 @@ Create databases/tables with CREATE DATABASE IF NOT EXISTS d1; SHOW DATABASES; - + Check what happens in /var/lib/mysql, then CREATE TABLE d1.t1( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, ip INT UNSIGNED NOT NULL, name CHAR(32) CHARACTER SET utf8 DEFAULT 'Jon' ); @@ -65,12 +65,12 @@ Exercise: explain the differences between the `DESCRIBE` and the `SHOW CREATE`. Check the content of the table SELECT * FROM d1.t1; - -We can set the currently used database with + +We can set the currently used database with USE d1; - SELECT * - t1 \G + SELECT * + t1 \G Notice the difference between `;` and `\G`. @@ -81,9 +81,9 @@ Add some entries and check the results. INSERT INTO t1(id, ip, name) VALUES (1, 1, 'Sam'); INSERT INTO t1(id, ip) VALUES (2, 2); INSERT INTO t1(ip) VALUES (3); - -Now test the followings: - + +Now test the followings: + INSERT INTO t1(id) VALUES (4); INSERT INTO t1(id) VALUES (1); @@ -95,7 +95,7 @@ Speed up your work adding entries using the embedded editor Type QUERIES - INSERT INTO d1.t1(ip) VALUES + INSERT INTO d1.t1(ip) VALUES (inet_aton("10.0.0.1")), (inet_aton("10.0.0.2")), (inet_aton("10.0.0.3")) @@ -103,7 +103,7 @@ Type QUERIES Save in a file and execute, exiting from vi and typing `;` - + :w /tmp/sample.sql :q! ; @@ -115,8 +115,8 @@ Show the new entries Reload a previous file and add further entries - - + + \e -- open vi !!cat /tmp/sample.sql @@ -136,10 +136,10 @@ Grant permissions on tables OOOPS, we have `NO_AUTO_CREATE_USER`: specify a password please! GRANT ALL ON d1.* TO 'network' IDENTIFIED BY 'secret'; - + CREATE USER 'network' IDENTIFIED BY 'secret'; GRANT ALL ON d1.* TO 'network'; - + ## Creating administrative users To grant administrative privileges use @@ -148,7 +148,7 @@ To grant administrative privileges use Now create a small VIEW to query user privileges without typing all the fields - CREATE VIEW mysql.user_view AS + CREATE VIEW mysql.user_view AS SELECT USER,HOST,AUTHENTICATION_STRING FROM mysql.user; @@ -157,8 +157,8 @@ Now create a small VIEW to query user privileges without typing all the fields You can limit user resources using - GRANT ... WITH - MAX_QUERIES_PER_HOUR count + GRANT ... WITH + MAX_QUERIES_PER_HOUR count MAX_UPDATES_PER_HOUR count MAX_CONNECTIONS_PER_HOUR count MAX_USER_CONNECTIONS count @@ -169,11 +169,11 @@ Try now GRANT ALL on d2.* to 'network' WITH MAX_USER_CONNECTIONS 1; - - -## Granting permissions - - Re-authenticate with - + + +## Granting permissions + - Re-authenticate with + mysql -unetwork - Authenticate again in another session @@ -181,12 +181,12 @@ Try now mysql -unetwork # again ERROR 1226 (42000): User 'network' has exceeded the 'max_user_connections' resource (current value: 1) - + - Remove table and database with: DROP TABLE d1.t1; \! tree /var/lib/mysql - + DROP DATABASE d1; \! tree /var/lib/mysql @@ -195,36 +195,36 @@ Try now ## Revoking permissions Explain privileges. - - Revoking privileges. What happened? + - Revoking privileges. What happened? SHOW GRANTS FOR 'network'; REVOKE DROP ON d1.* FROM 'network'; - -GRANT supports - - resource quotas. +GRANT supports + + - resource quotas. - punctual privileges (eg. ```GRANT SELECT (id) ON d1.t1 TO ...```) - - HELP [GRANT|REVOKE]; - + HELP [GRANT|REVOKE]; + + ## Removing users - Revoke all privileges without removing the user; - + REVOKE ALL ON *.* FROM 'network'; SELECT * FROM mysql.user_view; -- the view defined above. - + - Remove the user; - + DROP USER 'network'; - + Remember: **users are couples** ! CREATE USER 'a'; CREATE USER 'a'@'localhost'; DROP USER 'a'; - -Which is the expected output of: - + +Which is the expected output of: + SELECT * FROM mysql.user_view; diff --git a/mysql-101/lesson-1-3-information_schema.md b/mysql-101/lesson-1-3-information_schema.md index 9c80540..f02175e 100644 --- a/mysql-101/lesson-1-3-information_schema.md +++ b/mysql-101/lesson-1-3-information_schema.md @@ -5,19 +5,19 @@ Metadata and Statistics are stored in internal databases - | db | action | scope | + | db | action | scope | |--|--|--| - | `mysql` | rw |configuration, logs, replication, user privileges| + | `mysql` | rw |configuration, logs, replication, user privileges| | `information_schema`| ro | DDL, Privileges, Server status & conf| | `performance_schema`| rw | general runtime data | | `sys`| rw | wrapper on performance_schema| - + ## Table informations MySQL stores schema infos in many mysql databases. The `SHOW` command is used to get those information. - + SHOW TABLE STATUS [FROM db_name] [like_or_where] SHOW [FULL] TABLES [FROM db_name] [like_or_where] SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where] @@ -35,12 +35,12 @@ The [information_schema](http://dev.mysql.com/doc/refman/5.6/en/information-sche - stored both on `performance_schema` and `information_schema` - will be moved to `performance_schema` - - - SELECT T1.TABLE_NAME - FROM INFORMATION_SCHEMA.TABLES T1 JOIN INFORMATION_SCHEMA.TABLES T2 - WHERE T1.TABLE_SCHEMA='performance_schema' - AND T2.TABLE_SCHEMA='information_schema' + + + SELECT T1.TABLE_NAME + FROM INFORMATION_SCHEMA.TABLES T1 JOIN INFORMATION_SCHEMA.TABLES T2 + WHERE T1.TABLE_SCHEMA='performance_schema' + AND T2.TABLE_SCHEMA='information_schema' AND T1.TABLE_NAME=T2.TABLE_NAME; ## Table informations @@ -72,13 +72,13 @@ More informations +-------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+ 3 rows in set (0.00 sec) - + ## USE information_schema; Listing databases with SQL. SELECT * FROM information_schema.schemata; -Tables +Tables SELECT table_name, table_type, engine FROM information_schema.tables @@ -89,19 +89,19 @@ Tables ## USE information_schema; More on tables - SELECT table_name, + SELECT table_name, -- format numbers with 0 decimals FORMAT(table_rows,0), - -- bitwise shift (10 for KB, 20 for MB, 30 for GB) - data_length >> 20 - FROM tables + -- bitwise shift (10 for KB, 20 for MB, 30 for GB) + data_length >> 20 + FROM tables WHERE table_schema = 'employees'; And Columns - SELECT table_name, column_name, column_default, - ordinal_position, column_key, privileges - FROM columns + SELECT table_name, column_name, column_default, + ordinal_position, column_key, privileges + FROM columns WHERE table_schema='d1'; ## USE information_schema; @@ -111,7 +111,7 @@ Or Views (treated like tables) SELECT table_name, definer FROM views WHERE table_schema not in ('mysql', 'sys'); - + Or routines SELECT routine_name, definer @@ -122,7 +122,7 @@ Or routines Net-fishing metadata from closed tables is expensive. - SELECT table_name, data_length >> 20 + SELECT table_name, data_length >> 20 FROM tables; -- all databases, all tables, all engines! causes to: @@ -131,9 +131,9 @@ causes to: - seek|read data from disk - eventually pollute `table_cache` -Be selective when [looking for metadata!](https://dev.mysql.com/doc/refman/5.7/en/information-schema-optimization.html) +Be selective when [looking for metadata!](https://dev.mysql.com/doc/refman/5.7/en/information-schema-optimization.html) -Check the [improvements on MySQL 8.0 too!](https://dev.mysql.com/doc/refman/8.0/en/information-schema-optimization.html) +Check the [improvements on MySQL 8.0 too!](https://dev.mysql.com/doc/refman/8.0/en/information-schema-optimization.html) ## Indexes Indexes can be inspected with: @@ -149,4 +149,3 @@ Indexes can be inspected with: Cardinality: 3 ... 1 row in set (0.00 sec) - diff --git a/mysql-101/lesson-2-0-configuration.md b/mysql-101/lesson-2-0-configuration.md index 396a9b7..ff5aef6 100644 --- a/mysql-101/lesson-2-0-configuration.md +++ b/mysql-101/lesson-2-0-configuration.md @@ -4,22 +4,22 @@ - Configure basic security and logging parameters - Using profiles - Get/Set variables -- Set SQL Modes +- Set SQL Modes - Populate databases - Application Logging - - + + ## Server Configuration Show all mysqld **System Variables** (aka parameters) - + mysqld --verbose --help - - + + Read from /etc/my.cnf or via mysqld --defaults-file=/etc/my-file.cnf - + Show running status via #mysqladmin variables @@ -51,21 +51,21 @@ my.cnf is made up of stanzas - syntax errors - unexistent system variables - + ## Configuration Show the parameters *to be used* my_print_defaults mysqld - + Show the *actual* values mysqladmin variables - + Show the *actual* values from `mysql` - + SHOW [GLOBAL|SESSION] VARIABLES [LIKE ...]; SHOW VARIABLES LIKE 'innodb_%'; - + ## Configuration vs Status `mysqld` provides `STATUS` insights @@ -80,7 +80,7 @@ Show the *actual* values from `mysql` |variable_name|table|note| |--|--|--| |max_used_connections|GLOBAL_STATUS|effectively used| - |max_connections|GLOBAL_VARIABLES|server-wide limit| + |max_connections|GLOBAL_VARIABLES|server-wide limit| |max_user_connections|GLOBAL_VARIABLES|per-user limit| |max_user_connections|SESSION_VARIABLES|current user limit| @@ -96,14 +96,14 @@ Global variables: - apply to every connection; - static or dynamic; - changed by `SUPER` users - + SET @@GLOBAL.max_tmp_table_size=4*(1<<20); -- eg. - + Session variables: - apply to the current session (connection) only; - dynamic. - + SET @@SESSION.sql_mode='TRADITIONAL'; -- eg. Changes to global dynamic variables (eg. max_tmp_table_size) apply to future sessions. @@ -119,7 +119,7 @@ Privilege consistency and security explicit_defaults_for_timestamp timestamp_defaults on 5.6+ are more flexible but you must use the [DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses in column definitions](http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html) - + ## Configuring security Further security tips for server... @@ -127,9 +127,9 @@ Further security tips for server... ... local-infile=0 skip-symbolic-links - + ...and client. - + [mysql] # inhibit unlimited UPDATE, DELETE, SELECT # override with --safe-updates=0 @@ -143,14 +143,14 @@ Limit max connections [mysqld] ... max_connections=100 - + Check used connections SHOW STATUS LIKE 'max_used_connections' - + ## Application logging mysqld does **not** create logs by default. - + # configure general and slow query logs # eventually using defaults general-log-file[=hostname.log] @@ -171,7 +171,7 @@ Get (or trash) data with SHOW TABLES FROM mysql LIKE '%log%'; SELECT * FROM [general_log|slow_log]; TRUNCATE mysql.general_log; - + ## Application logging If error-log is specified, stdout|err is redirected. @@ -179,7 +179,7 @@ If error-log is specified, stdout|err is redirected. # set the log file will daemonize # the server log-error[=hostname.err] - + You can use mysqld_safe to eventually restart the server in case of problems. @@ -191,7 +191,7 @@ Don't fill your disks with logs! - consider separate partitions; - rotate logs, checking the actual policy; - + cat /etc/logrotate.d/mysql - or copy and modify diff --git a/mysql-101/lesson-2-1-importexport.md b/mysql-101/lesson-2-1-importexport.md index 1d3399e..0cf82c1 100644 --- a/mysql-101/lesson-2-1-importexport.md +++ b/mysql-101/lesson-2-1-importexport.md @@ -11,10 +11,10 @@ ## Populating a database While monitoring system status with - + dstat -cgmprsy 5 - -import the [Employees database](http://bit.ly/1qEutCs) + +import the [Employees database](http://bit.ly/1qEutCs) wget http://bit.ly/1qEutCs -O employees.tar.gz tar xf employees.tar.gz -C /opt @@ -27,7 +27,7 @@ Exercise: how does `employees.sql` work? Dump a table in a file once `secure-file-priv` is enabled. - SELECT * + SELECT * INTO OUTFILE '/var/lib/mysql-files/path.tsv' FROM departments; CREATE TABLE _departments LIKE departments; @@ -35,34 +35,34 @@ Dump a table in a file once `secure-file-priv` is enabled. ## Populating a database -Show database structure +Show database structure STATUS; SELECT DATABASE(); USE employee SELECT DATABASE(); SHOW TABLE STATUS \G - + Table size in $MiB$ $2^{20}$ bytes USE information_schema; - SELECT TABLE_NAME, DATA_LENGTH>>20, INDEX_LENGTH>>20 + SELECT TABLE_NAME, DATA_LENGTH>>20, INDEX_LENGTH>>20 FROM TABLES WHERE TABLE_SCHEMA='employees'; - + ## Exporting data Export `employee` with the following parameter mysqldump employees --tables salaries \ - --skip-extended-insert | + --skip-extended-insert | gzip > salaries.sql.gz - -Import and monitor with `dstat` using: - + +Import and monitor with `dstat` using: + SET AUTOCOMMIT=1 SELECT @@AUTOCOMMIT; - + Exercise: explain the server behavior. @@ -90,28 +90,28 @@ Prepare a new table to experiment with: id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(12) DEFAULT "def" ); - INSERT INTO d1.t5(id) VALUES (1), (2), (3); + INSERT INTO d1.t5(id) VALUES (1), (2), (3); ## Autocommit -Exercise: +Exercise: - BEGIN; - INSERT INTO d1.t5(name) VALUES('implicit'); + BEGIN; + INSERT INTO d1.t5(name) VALUES('implicit'); CREATE TABLE d1.deleteme(b BINARY); -- the first time try without adding this line. - ROLLBACK; + ROLLBACK; SELECT * FROM t5; ## Autocommit -Exercise: +Exercise: - BEGIN; - INSERT INTO d1.t5(name) VALUES('implicit'); - DROP TABLE d1.deleteme; + BEGIN; + INSERT INTO d1.t5(name) VALUES('implicit'); + DROP TABLE d1.deleteme; INSERT INTO d1.t5(name) VALUES('rollback'); -- check this now! - ROLLBACK; + ROLLBACK; SELECT * FROM t5; @@ -127,17 +127,14 @@ Remember: Exercise: which is the expected output of this commands? Which will end first? And last? - + mysql -e 'BEGIN; UPDATE d1.t1 SET name="i1" WHERE id="1"; SELECT SLEEP(10) as 'one'; COMMIT' & sleep .1 mysql -e 'BEGIN; UPDATE d1.t1 SET name="i2" WHERE id="1"; SELECT SLEEP(2) as 'two'; COMMIT' & sleep .1 mysql -e 'BEGIN; UPDATE d1.t1 SET name="i3" WHERE id="3"; SELECT SLEEP(2) as 'three'; COMMIT' & -Rememeber: +Rememeber: - InnoDB locks selected rows in every transaction by default! - Other engines require SELECT ... LOCK IN SHARE MODE - - - diff --git a/mysql-101/lesson-2-3-engines.md b/mysql-101/lesson-2-3-engines.md index c1de45c..20f057f 100644 --- a/mysql-101/lesson-2-3-engines.md +++ b/mysql-101/lesson-2-3-engines.md @@ -3,9 +3,9 @@ - Storage Engines in MySQL Architecture - Memory: effects of limits - - InnoDB: + - InnoDB: - MyISAM - + ## Memory tables "Paging" in MySQL and temporary tables. @@ -28,8 +28,8 @@ Get raw values via Or format them via - SELECT VARIABLE_NAME, - VARIABLE_VALUE>>20 + SELECT VARIABLE_NAME, + VARIABLE_VALUE>>20 FROM performance_schema.global_variables WHERE VARIABLE_NAME LIKE '%table_size'; @@ -38,14 +38,14 @@ Or format them via Create a small memory table... USE employees; - CREATE TABLE _departments + CREATE TABLE _departments ENGINE=memory SELECT * FROM departments; -- one statement ;) SHOW CREATE TABLE _departments; ...and a big one (with more than `max_heap_table_size`). - CREATE TABLE _titles + CREATE TABLE _titles ENGINE=memory SELECT * FROM titles; SHOW CREATE TABLE _titles; @@ -55,13 +55,13 @@ Create a small memory table... Remember that -$max\_tmp\_table\_size \leq max\_heap\_table\_size$ +$max\_tmp\_table\_size \leq max\_heap\_table\_size$ Otherwise `max_tmp_table_size` will *always* be lowered at `max_heap_table_size` value. -Creating temporary tables. +Creating temporary tables. Limitations on [BLOB/TEXT and its effects](https://dev.mysql.com/doc/refman/5.6/en/internal-temporary-tables.html). Inspecting temporary tables on disks. @@ -74,7 +74,7 @@ Features of MyISAM are webapp driven: - full-text support - geospatioal indexes - + Caveats: - non transactional @@ -94,24 +94,24 @@ Create MyISAM table Table format: \! tree /var/lib/mysql/employees - + - .frm: table definitions - .myd: table data - .myi: table indexes for data - - + + ## InnoDB -Transactions and consistency. -Foreign Keys. +Transactions and consistency. +Foreign Keys. System and tmp Tablespace. - `ibdataXXX` - unshrinkable! - undo: `undo00X` new in 5.7, set at --initialize time, automatically managed since 8.0 - tmp: `ibtmp1` new in 5.7, created at server startup, for non-compressed tmp tables -InnoDB Log Files. - +InnoDB Log Files. + - redo: `ib_logfile{0,2}` Checkpoint interval. @@ -131,7 +131,7 @@ Avoids: WHERE TABLESPACE_NAME='innodb_temporary' \G ## InnoDB -Buffer Pool: +Buffer Pool: - contention & instances (5.7 works better) @@ -140,8 +140,8 @@ Buffer Pool: ## InnoDB - - MVCC - - row-locking + - MVCC + - row-locking - table-locking only for DDL - deadlock detection with timeout - unshrinkable system tablespace (reduce `ibdata*` requires `--initialize` or `mysql_install_db`) @@ -153,15 +153,15 @@ Configuring `innodb_buffer_pool_size`. Inspecting usage. Configuring - + - `innodb_log_file_size` - [consider `BLOB|TEXT` size on 5.6](https://bugs.mysql.com/bug.php?id=69477). - `innodb_flush_logs_at_trx_commit` - `innodb_undo_tablespaces` - reduce the system tablespace, deprecated and hardcoded to 2 since MySQL 8.0 - + ## Configuring InnoDB -Tablespaces. +Tablespaces. Configuring and Resizing Tablespaces. AutoExtend. @@ -182,11 +182,11 @@ Setup a database with the provided configuration. [mysqld] innodb_log_file_size=4M innodb_buffer_pool_size=16M - + Re-import employees and get stats via dstat and time. Retry adding - + innodb_flush_log_at_trx_commit=1 ## Configuring InnoDB @@ -195,7 +195,7 @@ Test further effects of the following parameters: innodb_buffer_pool_size innodb_log_file_size innodb_log_files_in_group - + ## Check InnoDB Status To access InnoDB statistics you can use: @@ -235,4 +235,3 @@ Copy back target files $ cp -rp /tmp/t.{idb,cfg} /var/lib/mysql/d1/ ALTER TABLE t IMPORT TABLESPACE; - diff --git a/mysql-101/lesson-2-4-binary-logging.md b/mysql-101/lesson-2-4-binary-logging.md index 0084e1c..edf566d 100644 --- a/mysql-101/lesson-2-4-binary-logging.md +++ b/mysql-101/lesson-2-4-binary-logging.md @@ -1,6 +1,6 @@ #Logging -## Effects of logging +## Effects of logging Logging impacts on performance and stability - general (text, table) @@ -35,12 +35,12 @@ You can tune `binlog_format`: ## Managing Binary Logs Binary logs are written in the following files: - SHOW BINARY LOGS; + SHOW BINARY LOGS; | Log_name | File_size | | fabric-bin.000001 | 69414 | | fabric-bin.000002 | 1268759 | - -You can show their content with + +You can show their content with SHOW BINLOG EVENTS; @@ -50,11 +50,11 @@ Use a new log file FLUSH BINARY LOGS; SHOW BINARY LOGS; -or purge them - +or purge them + -- NOW() won't remove the last one, FLUSH it before! - PURGE BINARY LOGS BEFORE NOW(); - + PURGE BINARY LOGS BEFORE NOW(); + -- You can use SUBDATE to simplify expiration PURGE BINARY LOGS BEFORE SUBDATE(CURRENT_DATE, 1); -- yesterday @@ -62,14 +62,14 @@ or purge them RESET MASTER; ## Expire binary logs - + Use `expire_logs_days` in `my.cnf` to set a policy. - select @@GLOBAL.expire_logs_days; -- 3 - FLUSH LOGS; -- closes and reopen all files and + select @@GLOBAL.expire_logs_days; -- 3 + FLUSH LOGS; -- closes and reopen all files and -- now deletes all binlogs older than 3 days - -**Before purging binary logs checks if replication slaves are using them, + +**Before purging binary logs checks if replication slaves are using them, or you'll break replication** @@ -80,7 +80,7 @@ A `SUPER` user can skip logging queries with SET @@SESSION.SQL_LOG_BIN=0; -- don't log now CREATE TABLE d1.ignore(i int); DROP TABLE d1.ignore; - + This only applies to current SESSION! **Use `SQL_LOG_BIN=0` to avoid replicating database initialization** @@ -102,22 +102,22 @@ Inspect binary logs with mysqlbinlog create table test.t(i int) And replay them on another server for: - - - PITR + + - PITR - replay load - backup. - + ## mysqlbinlog mysqlbinlog output generates SQL files that can be replayed on other servers. mysqlbinlog hostname-bin.* | mysql - + You can specify an interval on mysqlbinlog. mysqlbinlog hostname-bin.0* \ --start-datetime="2015-05-25 15:00:00" \ --stop-datetime="2015-05-25 15:01:00" | wc -l - + Exercise: modify ``--[start|end]``` -date and check that the output lines vary. Exercise: drop a table (eg. salaries) and use mysqlbinlog data to restore it. diff --git a/mysql-101/lesson-2-6-backup.md b/mysql-101/lesson-2-6-backup.md index c482730..075519f 100644 --- a/mysql-101/lesson-2-6-backup.md +++ b/mysql-101/lesson-2-6-backup.md @@ -4,30 +4,30 @@ - Backup 101 - What to backup - Use mysqldump and mysqlbackup - -## Backup + +## Backup Importance of backups. Differences between: - - Backup - - High Availability + - Backup + - High Availability - Disaster Recovery -Measure and Test backup: +Measure and Test backup: - Mean Time Between Failures; - Meat Time To Recovery; - Recovery Point Objective; - - + + ## Backup Database backups: - - - hot vs cold + + - hot vs cold - logical vs physical - full vs incremental - transactions - importance of binary logs - + Impacts of backup. @@ -41,9 +41,9 @@ Create a logical backup: mysqldump --master-data=1 --all-databases | gzip > /backup/backup-$(date -I).sql.gz - + ## mysqldump -Exercise: +Exercise: - drop *one* table from your DB; - create a new mysqld instance with `--datadir=/backup/`; @@ -53,23 +53,23 @@ Exercise: ## mysqldump solution Create a versioned datadir: - + BACKUPDIR=/backup/$(date -I) mkdir -p $BACKUPDIR chown -R mysql:mysql /backup - + Create a new instance without network: - + mysqld --socket=/backup/mysql.sock \ - --skip-networking \ + --skip-networking \ --skip-grant-tables \ --datadir=/backup/$(date -I) & Restore your db - gunzip -c /backup/backup-$(date -I).sql.gz | - mysql --socket=/backup/mysql.sock - + gunzip -c /backup/backup-$(date -I).sql.gz | + mysql --socket=/backup/mysql.sock + ## mysqldump solution @@ -87,7 +87,7 @@ With mysqlbackup you can make physical backups: - copy datafiles - apply innodb logs - save binary logs - + Configure in /etc/my.cnf [mysqlbackup] @@ -98,25 +98,25 @@ Configure in /etc/my.cnf socket=/var/lib/mysql/mysql.sock ## mysqlbackup -The `mysqlbackup` user requires at least the +The `mysqlbackup` user requires at least the [following privileges](http://dev.mysql.com/doc/mysql-enterprise-backup/3.9/en/mysqlbackup.privileges.html) GRANT RELOAD ON *.* TO 'mysqlbackup'@'localhost'; - GRANT CREATE, INSERT, DROP, UPDATE + GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_progress TO 'mysqlbackup'@'localhost'; - GRANT CREATE, INSERT, SELECT, DROP, UPDATE + GRANT CREATE, INSERT, SELECT, DROP, UPDATE ON mysql.backup_history TO 'mysqlbackup'@'localhost'; GRANT REPLICATION CLIENT ON *.* TO 'mysqlbackup'@'localhost'; GRANT SUPER ON *.* TO 'mysqlbackup'@'localhost'; - FLUSH PRIVILEGES; + FLUSH PRIVILEGES; Create a user with the given privileges copying data from mysql documentation[^mysqlbackup] -[^mysqlbackup]: http://dev.mysql.com/doc/mysql-enterprise-backup/3.9/en/mysqlbackup.privileges.html +[^mysqlbackup]: http://dev.mysql.com/doc/mysql-enterprise-backup/3.9/en/mysqlbackup.privileges.html ## mysqlbackup -Linux tip ;) +Linux tip ;) - install Mysql Enterprise Backup via rpm - list files in the `meb` package with: @@ -125,14 +125,14 @@ Linux tip ;) ## mysqlbackup To create a consistent backup: - - - create a ```--login-path=mysqlbackup``` + + - create a ```--login-path=mysqlbackup``` - run the following command - + mysqlbackup --login-path=mysqlbackup backup - - - you can apply ib_logs too with - + + - you can apply ib_logs too with + mysqlbackup --login-path=mysqlbackup backup-and-apply-log @@ -145,14 +145,14 @@ Incremental backups require a starting point. --incremental \ --incremental-base=history:last_backup \ backup - + - or a directory - + FULLDIR=/backup/full/2015-05-18_16-14-18/ mysqlbackup --login-path=mysqlbackup \ - --incremental \ + --incremental \ --incremental-base=dir:$FULLDIR \ - backup + backup ## mysqlbackup @@ -178,12 +178,12 @@ The command to restore a database is --backup-dir=$FULLDIR \ copy-back -Exercises: +Exercises: - which are the steps to validate a database backup? - validate the backup restoring the db in another place. - - + + ## Point in Time Recovery Use `binlog` to execute a PITR. diff --git a/mysql-101/lesson-2-9-tables.md b/mysql-101/lesson-2-9-tables.md index 00f028a..0f95217 100644 --- a/mysql-101/lesson-2-9-tables.md +++ b/mysql-101/lesson-2-9-tables.md @@ -1,13 +1,13 @@ # Manage tables -## Loading files +## Loading files - Load files from mysql - + SOURCE /tmp/world_innodb.sql - + - Or via shell - + mysql < /tmp/world_innodb.sql @@ -18,72 +18,72 @@ You can clone tables with SELECT * FROM t1 INTO t2; And populate them using - - INSERT INTO foo SELECT * from bar; - + INSERT INTO foo SELECT * from bar; + + ## Check tables Ensure tables are [fine or upgrade-able](http://dev.mysql.com/doc/mysql/en/table-maintenance-sql.html) stopping on errors: - CHECK TABLE d1.t1 [FOR UPGRADE]; -- implies - + CHECK TABLE d1.t1 [FOR UPGRADE]; -- implies + Update statistics on a table **read-locking** it: - + ANALYZE [LOCAL] TABLE d1.t1; -- use LOCAL to avoid spanning on replicas - + Optimize a table **locking** it: - + OPTIMIZE [LOCAL] TABLE d1.t1; Or via command line (**repair is MyISAM only**): - + mysqlcheck [--check|--analyze|--optimize|--repair] `--repair` may corrupt a table: **always backup before** - -## Restore innodb tables + +## Restore innodb tables Follow the [InnoDB documented steps]() - stop mysqld and dump the datadir - + cp -rp /var/lib/mysql /backup/datadir-dump-$(date +%s) - + - start mysqld increasing `--innodb_force_recovery` value from 1 to 6. The lower the better. - carefully check the logs - if starts successfully dump the broken table mysqldump brokendb.brokentable > table.sql DROP brokendb.brokentable - + - restart mysqld without `--innodb-force-recovery` - reimport the table - + SOURCE table.sql - - + + ## Altering tables Tables can be *altered*: - ALTER TABLE d1.t1 + ALTER TABLE d1.t1 ADD COLUMN newcol timestamp default current_timestamp(), MODIFY COLUMN name varchar(4), - DROP COLUMN ip; + DROP COLUMN ip; Where possible, mysql takes care of reshaping data. - - + + ## Partitioning Altering includes partitioning too: ALTER TABLE d1.t1 - PARTITION BY RANGE(id) ( - PARTITION p1 VALUES LESS THAN (10), - PARTITION p2 VALUES LESS THAN (20), + PARTITION BY RANGE(id) ( + PARTITION p1 VALUES LESS THAN (10), + PARTITION p2 VALUES LESS THAN (20), PARTITION p3 VALUES LESS THAN (30) ); @@ -92,34 +92,34 @@ You can partition by: - HASH, KEY: dynamic, with some limitations - support `LINEAR` hashing - RANGE, LIST: static, less limitation - - support multiple `COLUMN` - + - support multiple `COLUMN` + ## Partitioning A RANGE partition accepts only allowed values. - + INSERT INTO d1.t1 (id, name) VALUES (15, "nooo"), -- stops at the first error (4, "neither"); Fix and add partitions - ALTER TABLE d1.t1 ADD PARTITION ( + ALTER TABLE d1.t1 ADD PARTITION ( PARTITION p4 VALUES LESS THAN (10000), PARTITION p_max VALUES LESS THAN (MAXVALUE) -- MAXVALUE is a keyword! ); - + Populate the table: INSERT INTO d1.t1 (id, name) VALUES (1), (11), (21), (101); - + ## Partitioning - recap Like columns: - + - partitions can be added or dropped; ALTER TABLE d1.t1 DROP PARTITION (p1, p4); @@ -138,38 +138,38 @@ Like columns: You can: - REORGANIZE PARTITIONS (eg. split them) as you can't add further partitions after `MAXVALUE` - - ALTER TABLE d1.t1 - REORGANIZE PARTITION p_max INTO ( + + ALTER TABLE d1.t1 + REORGANIZE PARTITION p_max INTO ( PARTITION p5 VALUES LESS THAN (20000), PARTITION p_max VALUES LESS THAN (MAXVALUE) ) - - TRUNCATE PARTITION without ALTERING DDL - + - TRUNCATE PARTITION without ALTERING DDL + ALTER TABLE .. TRUNCATE PARTITION p1, p3; ## Partitioning - syntax -The followings are **lists**. +The followings are **lists**. They are always enclosed by `()` even when list length is 1. - - partition definitions - - .. ADD PARTITION ( + - partition definitions + + .. ADD PARTITION ( PARTITION p1 ..., PARTITION p2 ..., ) - - - partition boundaries - + + - partition boundaries + .. PARTITION p4 VALUES LESS THAN (5) .. -- just one item -- OR .. PARTITION p4 VALUES LESS THAN (5,1,1) .. -- more items - -[See doc for further info](https://dev.mysql.com/doc/refman/5.7/en/partitioning-columns-range.html) + +[See doc for further info](https://dev.mysql.com/doc/refman/5.7/en/partitioning-columns-range.html) ## Partition by HASH @@ -177,13 +177,13 @@ They are always enclosed by `()` even when list length is 1. Re-partition by hash with 4 partition is just ALTER TABLE d1.t1 PARTITION BY HASH(id) PARTITIONS 4; - + Check the outcome: - - SELECT * FROM INFORMATION_SCHEMA.PARTITIONS + + SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1' LIMIT 1 \G -Exercise: +Exercise: - repartition by hash with 10 partitions. - try to drop an hash-partition. @@ -196,9 +196,9 @@ You can hash-partition using a UDF or just use a table's key. CREATE TABLE plhk1 (id int not null auto_increment primary key, PARTITION BY LINEAR KEY (id) PARTITIONS 4); -Or with multiple columns +Or with multiple columns - CREATE TABLE prc1 (id int not null, name varchar(4), + CREATE TABLE prc1 (id int not null, name varchar(4), PARTITION BY RANGE COLUMNS(id,name) ); @@ -216,16 +216,14 @@ Just recreate/rework a single partition ALTER TABLE t1 ANALYZE PARTITION p3; -## Partitioning limitations +## Partitioning limitations Each partition is actually a separate innodb table: - more open files - indexes are per-partition - - no foreign keys - - no `FULLTEXT` + - no foreign keys + - no `FULLTEXT` [see doc for further limitations](https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations.html) - - diff --git a/mysql-101/lesson-3-1-replication.md b/mysql-101/lesson-3-1-replication.md index 2f26573..e2af70a 100644 --- a/mysql-101/lesson-3-1-replication.md +++ b/mysql-101/lesson-3-1-replication.md @@ -3,11 +3,11 @@ Partitioning: Synchronization reloaded. You cannot have the same level of: - - - Consistency + + - Consistency - Availability - Partition - + Instead you have to favor something respect to the other. See [the wikipedia article](https://en.wikipedia.org/wiki/CAP_theorem) @@ -19,7 +19,7 @@ You can pay to get faster - network - cpu - storage - + Price is the 4th dimension. @@ -31,11 +31,11 @@ Synchronous, asynchronous and semi-synchronous replication. # semi-sync is implemented in a separate .so plugin-load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so - rpl_semi_sync_slave_enabled=1 + rpl_semi_sync_slave_enabled=1 rpl_semi_sync_master_enabled=1 # Latency is the price. # Wait for the slave to commit on the RELAY-LOG for - # at most + # at most rpl_semi_sync_master_timeout=1000 Replication in MySQL. Topologies and GTID. @@ -52,21 +52,21 @@ Replication is $asynchronous$ and the agreements are configured on the slave onl ## Features - delayed replication - + CHANGE MASTER ... MASTER_DELAY=3600 ...; - - - different ([but with the same order](https://dev.mysql.com/doc/refman/5.7/en/replication-features-differing-tables.html)) columns between master and slaves - + - different ([but with the same order](https://dev.mysql.com/doc/refman/5.7/en/replication-features-differing-tables.html)) columns between master and slaves + + CREATE TABLE (c1 int, c2 int, m3 int); -- on master CREATE TABLE (c1 int, c2 int, /* s3 int, s4 int */); -- on slaves - + - different data types (with many limitations) - - + + ## Configuring replication Master - + - produces a changelog named binlog; - grants access to a $replica$ user; - may track slave-updates. @@ -76,14 +76,14 @@ Slave - connects to the master with the $replica$ user - retrieves the binlog and applies the changes; - ```START SLAVE;``` - + ## Configuring replication Enable replication in two or more configuration files like my-3306.cnf, my-3307.cnf. [mysqld] server-id=3306 - + log-bin=3306-bin # Relay logs are downloaded in # the relay-logs from the Slave I/O @@ -103,14 +103,14 @@ Configure a ```--login-path``` for each instance and validate the connection mysql --login-path=3306 -e "SHOW MASTER STATUS;" - + ##Replication 2.0 MySQL 5.6+ replication is based on Global Transaction ID - - - each server has a unique UUID - + + - each server has a unique UUID + eg: 3E11FA47-71CA-11E1-9E33-C80AA9429562 - every TransactionID becomes global @@ -128,7 +128,7 @@ master database first!** ## Configuring replication mysqlreplicate takes care of - + - provisioning the replica user on the master; - configure the slave to point to the master; @@ -137,16 +137,16 @@ mysqlreplicate takes care of mysqlreplicate --master=$MASTER --slave=$SLAVE \ --rpl-user=repl:rpass \ -b - + - or provision your user - + CREATE USER 'repl' IDENTIFIED BY 'rpass'; GRANT REPLICATION SLAVE ON *.* TO 'repl'; ## Configuring replication mysqldbexport can be used to provision a new slave! - + - check that replica user is provisioned on the master; - issue a ```RESET MASTER;``` to clean up previous settings; @@ -183,7 +183,7 @@ By default: - [Cascade replication](https://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html) is *OFF* by default. - # Enable binlog forwarding + # Enable binlog forwarding # in my.cnf log_slave_updates=yes @@ -192,7 +192,7 @@ By default: - relay log size is `1G` max_relay_log_size=0 # 0 means the default: 1G ;) - + - relay logs are not recovered at startup # For crash-safe replication set @@ -216,12 +216,12 @@ Large databases can be initialized from disk backups. Restore with - mysqlbackup --defaults-file=/etc/my-3307.cnf \ + mysqlbackup --defaults-file=/etc/my-3307.cnf \ --backup-dir $BACKUP_DIR \ --force \ copy-back - -Get position for old-style replication with + +Get position for old-style replication with grep -r binlog $BACKUP_DIR/meta @@ -247,7 +247,7 @@ The slave can't apply binary logs due to: - slave inconsistencies - binlog errors (including file permissions, ...) - much more (see docs) - + To skip some binlog entries, just insert empty transactions instead. ## Troubleshooting GTID replication @@ -257,7 +257,7 @@ The variables governing GTIDs are *note the scope*: select @@global.gtid_executed as applied, @@session.gtid_next as next \G applied: e311dd97-e9fe-11e6-b4d7-0242ac110005:1-4 next: automatic - + To inject an empty transaction: STOP SLAVE; @@ -269,7 +269,7 @@ To inject an empty transaction: ## Constraints -Replication +Replication ## Caveats @@ -281,8 +281,8 @@ binlogs contain the query context, eg: `@@GLOBAL.sql_mode` won't apply to replication - - + + # Failover ## Failover Basics A replicated infrastructure can be made Highly Available. @@ -290,12 +290,12 @@ A replicated infrastructure can be made Highly Available. In case of fault you should: - + - $promove$ your slave! - reconfigure the others to point there - disable the master - eventually switch the ip-address - + ## Failover - I mysqlfailover takes care of that, and can even discover your @@ -314,7 +314,7 @@ replication topology! ##Failover - II Run mysqlfailover on an existing infrastructure! - + $ mysqlfailover --master=$MASTER \ --discover-slaves-login=root:root # Discovering slaves for master at s-1.docker:3306 @@ -334,10 +334,10 @@ Run mysqlfailover on an existing infrastructure! ------------------ Binary Log File Position Binlog_Do_DB Binlog_Ignore_DB s-1-bin.000009 231 - + GTID Executed Set f01a69cd-df69-11e4-b908-0242ac110009:1-3 [...] - + --- MySQL Replication Failover Utility @@ -351,6 +351,3 @@ Run mysqlfailover on an existing infrastructure! | s-3.docker | 3306 | SLAVE | UP | ON | OK | | s-4.docker | 3306 | SLAVE | UP | ON | OK | +-------------+-------+---------+--------+------------+---------+ - - - diff --git a/mysql-101/lesson-3-2-performance_schema.md b/mysql-101/lesson-3-2-performance_schema.md index bebb03e..8b770a8 100644 --- a/mysql-101/lesson-3-2-performance_schema.md +++ b/mysql-101/lesson-3-2-performance_schema.md @@ -20,10 +20,10 @@ I/O - accessed files - - threads in disk wait + - threads in disk wait - table scans - connections attributes - - + - CPU @@ -49,6 +49,6 @@ Or `USE sys` and just check overviews. Use `information_schema` to find instruments & co: - SELECT table_name,column_name FROM information_schema.columns - WHERE column_name LIKE '%lock%' - AND table_schema LIKE 'perf%'; + SELECT table_name,column_name FROM information_schema.columns + WHERE column_name LIKE '%lock%' + AND table_schema LIKE 'perf%'; diff --git a/mysql-101/lesson-7-monitoring.md b/mysql-101/lesson-7-monitoring.md index 499f137..b274721 100644 --- a/mysql-101/lesson-7-monitoring.md +++ b/mysql-101/lesson-7-monitoring.md @@ -1,9 +1,9 @@ -## Monitoring +## Monitoring - Enterprise Monitor: java web application to be used with or without agent - Agents: java daemon gathering infos from one or more mysqld - + ## Setup Monitoring Download from the website: @@ -18,18 +18,18 @@ There's no rpm/deb! Prepare the configuration file # ./mem.sh --help > mem-setup.rsp - + Modify and backup setup.rsp # vi mem-setup.rsp - + Install #./mem.sh --answer-file mem-setup.rsp ... - + Remember to configure logrotate! - - + + ## Using MEM Connect to the webapp and provide the first credentials. @@ -41,15 +41,15 @@ Start monitoring some servers without agents. Prepare the configuration file collecting data for: - - `root` user access to the monitored instances + - `root` user access to the monitored instances - `agent`, `general`, `limited` user # ./agent.sh --help > mem-setup.rsp - + Modify and backup setup.rsp # vi mem-setup.rsp - + Install #./mem.sh --answer-file mem-setup.rsp ... @@ -64,13 +64,13 @@ Monitor servers via mysql-agents Install the audit plugin, producing an external log file. INSTALL PLUGIN audit_log SONAME 'audit_log.so'; - -Enable audit at startup so that you can't disable it online. + +Enable audit at startup so that you can't disable it online. [mysqld] plugin-load=audit_log.so audit-log=FORCE_PLUS_PERMANENT - + ## Audit Check audit logs. diff --git a/mysql-101/main.tex b/mysql-101/main.tex index 81e29bd..2757152 100644 --- a/mysql-101/main.tex +++ b/mysql-101/main.tex @@ -45,4 +45,3 @@ \input{tmpme.tex.tmp} \end{document} - diff --git a/mysql-101/site-digitalocean.yml b/mysql-101/site-digitalocean.yml index 7480a53..e8dbb10 100644 --- a/mysql-101/site-digitalocean.yml +++ b/mysql-101/site-digitalocean.yml @@ -43,7 +43,7 @@ ansible_user: root host_key_checking: no with_items: "{{my_droplet.results}}" - + - name: Create a sample inventory file with the server ips. file: @@ -55,8 +55,8 @@ line: "[do]" - lineinfile: path: /tmp/inventory.do - line: > - {{ item.droplet.networks.v4[0].ip_address }} droplet_id={{item.droplet.id}} + line: > + {{ item.droplet.networks.v4[0].ip_address }} droplet_id={{item.droplet.id}} with_items: "{{my_droplet.results}}" @@ -73,7 +73,7 @@ path: .droplet_ids create: yes line: >- - {{item.droplet.id}} + {{item.droplet.id}} with_items: "{{my_droplet.results}}" # @@ -90,14 +90,14 @@ - ansible - name: Docker should listen on localhost. - lineinfile: + lineinfile: path: /etc/systemd/system/multi-user.target.wants/docker.service regexp: "^ExecStart=.*" line: "ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375" register: systemd_updated - name: Reload docker with new systemd config - systemd: + systemd: state: restarted name: docker daemon_reload: yes @@ -135,12 +135,6 @@ args: chdir: /home/science/python-course/mysql-101 register: output - + - debug: var: output - - - - - - diff --git a/mysql-101/test-page.md b/mysql-101/test-page.md index 790b0fe..feab510 100644 --- a/mysql-101/test-page.md +++ b/mysql-101/test-page.md @@ -1,7 +1,7 @@ ## Intro ### Test slide 1 {#ref1} -Line 1: This is a test slide with a long text on the first line. This is a test slide with a long text. This is a test slide with a long text. This is a test slide with a long text. +Line 1: This is a test slide with a long text on the first line. This is a test slide with a long text. This is a test slide with a long text. This is a test slide with a long text. Line 2: No carriage and another long text. Line 2: No carriage and another long text. Line 2: No carriage and another long text.Line 2: No carriage and another long text. Line 4: a carriage and a short text. @@ -58,5 +58,3 @@ Here an image comes ![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1") Will it show? - - diff --git a/mysql-101/test.tex b/mysql-101/test.tex index 9e3bd67..cbad934 100644 --- a/mysql-101/test.tex +++ b/mysql-101/test.tex @@ -32,4 +32,3 @@ \input{test-page.md.tex} \end{document} - diff --git a/python-basic/00_intro_01.py b/python-basic/00_intro_01.py index 1495094..90f0a5f 100644 --- a/python-basic/00_intro_01.py +++ b/python-basic/00_intro_01.py @@ -12,6 +12,7 @@ def importing_new_features(): # ..is easy. Features are collected # in packages or modules. Just import telnetlib # to use a + telnetlib.Telnet # client # We can even import single classes @@ -33,7 +34,7 @@ def string_formatting(): # prefixing a string with 'r' disables the # interpretation of the string content - print('Hello' * 2 + r'World\x21') + print("Hello" * 2 + r"World\x21") # the chr() function returns the corresponding # character of an integer. While \n and \t are @@ -44,10 +45,13 @@ def string_formatting(): # %s works like in the C printf() function # but operates on strings # ord() is just the inverse of chr() - print("""The answer is + print( + """The answer is %s - """ % ord('*')) + """ + % ord("*") + ) def basic_arithmetic(): @@ -67,13 +71,12 @@ def variable_assignment(): a, b, c = 1, 2, 3 d, stringa_a, stringa_b = a + b, "pippo", "pluto" (a, b) = (b, a) # ...swap them... - e, f = c, e + \ - d # but if right-side values are not defined, I get an exception + e, f = c, e + d # but if right-side values are not defined, I get an exception # We should respect reserved words and functions, like print, ord... print(("ord:\x20", ord)) ord = 4 - ord('*') # ...ooops! + ord("*") # ...ooops! del ord # fix it up! @@ -84,7 +87,7 @@ def formatting_numbers(): # while the format() function can be more flexible # 10 = 8ciphers + 2chars for the '0b' header - binary_with_leading_zeroes = format(1, '#010b') + binary_with_leading_zeroes = format(1, "#010b") # and reversible with b1 == int(binary_with_leading_zeroes, base=2) diff --git a/python-basic/00_intro_02.py b/python-basic/00_intro_02.py index a4d4617..017321e 100644 --- a/python-basic/00_intro_02.py +++ b/python-basic/00_intro_02.py @@ -12,7 +12,7 @@ def introducing_lists(): # it's easy to create a list - list_a = ['this', 'is', 'a', 'list'] + list_a = ["this", "is", "a", "list"] # you can append items to a list # with the append method list_a.append("mutable") @@ -23,7 +23,7 @@ def introducing_lists(): len(list_a) a = 11 - #range in python 2 returns a list + # range in python 2 returns a list # of consecutive ints from_0_to_10 = range(a) len(from_0_to_10) == a @@ -38,18 +38,18 @@ def introducing_lists(): # python lists are doubly linked ;) from_0_to_10[-1] # please check the manual! - #help(list) + # help(list) def slicing(): # I can slice a list with ":" - straight = [1, 2, 3, 'star'] + straight = [1, 2, 3, "star"] straight[1:3] # take the middle of the list... k = 2 # ... or using a separator straight[0:k], straight[k:4] - straight[:k] # I can omit the first... - straight[k:] # ...and last index + straight[:k] # I can omit the first... + straight[k:] # ...and last index def str_and_list(): @@ -68,14 +68,14 @@ def str_and_list(): def iterating_with_for(): - a_list = ['is', 'iterable', 'with'] + a_list = ["is", "iterable", "with"] for x in a_list: print(x) for x in a_list: # python2 does not support the `end` argument - print((x), end=' ') + print((x), end=" ") y = x + str(2) - break # stop now + break # stop now # what's the expected output of the # following instruction? print(("x,y: ", (x, y))) @@ -84,7 +84,7 @@ def iterating_with_for(): def iterate_with_while(): - a_list = ['is', 'iterable', 'with'] + a_list = ["is", "iterable", "with"] while a_list: # pop() modifies a list removing # and returning its last element diff --git a/python-basic/Dockerfile b/python-basic/Dockerfile index e74d1c1..03f9ab9 100644 --- a/python-basic/Dockerfile +++ b/python-basic/Dockerfile @@ -10,4 +10,3 @@ COPY requirements.txt /requirements.txt # install requirements for both py2 and py3 RUN pip2 install -r /requirements.txt RUN pip install -r /requirements.txt - diff --git a/python-basic/docker-compose.yml b/python-basic/docker-compose.yml index e96f61a..42d7dbc 100644 --- a/python-basic/docker-compose.yml +++ b/python-basic/docker-compose.yml @@ -8,7 +8,7 @@ sysadminpy: - 8888:8888 volumes: - ./rendered_notebooks:/notebooks - + test: image: ioggstream/python-course:dev volumes: diff --git a/python-basic/requirements.txt b/python-basic/requirements.txt index e36ee74..231f7eb 100644 --- a/python-basic/requirements.txt +++ b/python-basic/requirements.txt @@ -4,4 +4,4 @@ simplejson pyzmq markupsafe tornado -jsonschema \ No newline at end of file +jsonschema diff --git a/python-for-sysadmin/Dockerfile b/python-for-sysadmin/Dockerfile index de9b34e..974682f 100644 --- a/python-for-sysadmin/Dockerfile +++ b/python-for-sysadmin/Dockerfile @@ -5,7 +5,7 @@ FROM python:2.7 MAINTAINER roberto.polli@par-tec.it -RUN apt-get -y update && apt-get -y install gcc make python-dev python-pip +RUN apt-get -y update && apt-get -y install gcc make python-dev python-pip RUN apt-get -y update && apt-get -y install build-essential libblas-dev liblapack-dev gfortran libfreetype6-dev libpng-dev RUN apt-get -y update && apt-get -y install tree sshpass openssl RUN apt-get -y clean diff --git a/python-for-sysadmin/README.md b/python-for-sysadmin/README.md index 1bd8e7f..935dea0 100644 --- a/python-for-sysadmin/README.md +++ b/python-for-sysadmin/README.md @@ -29,7 +29,7 @@ Each notebook is associated to a python file in scripts/. ## Outline -- If you are a novice, consider reading the +- If you are a novice, consider reading the introductory crash course in ../python-basic/ - Introducing ipython @@ -54,4 +54,3 @@ Each notebook is associated to a python file in scripts/. - Ansible - 05_ansible.py - diff --git a/python-for-sysadmin/README.setup b/python-for-sysadmin/README.setup index 489cea2..da12597 100644 --- a/python-for-sysadmin/README.setup +++ b/python-for-sysadmin/README.setup @@ -7,15 +7,15 @@ The course requires: * see requirements.txt Use the following instructions to setup your environment -and try the python crash course reading and typing on -you shiny ipython console the exercises contained in +and try the python crash course reading and typing on +you shiny ipython console the exercises contained in #python-basic NB Python3.0 is not the default python version on many distributions so it's still not time to switch to it for system administration tasks. Moreover you may not find - precompiled packages. Anyway once you have a compiler and the needed headers, pip should build - everything you need (at least to me it worked). + precompiled packages. Anyway once you have a compiler and the needed headers, pip should build + everything you need (at least to me it worked). ## Generic Python @@ -71,7 +71,7 @@ From the console, install pyreadline, psutil, ipython, ansible and pyparsing markupsafe tornado jsonschema psutil ansible -To install numpy scipy matplotlib just download and install the binaries for your windows version in the given order from +To install numpy scipy matplotlib just download and install the binaries for your windows version in the given order from http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy @@ -82,9 +82,8 @@ To install numpy scipy matplotlib just download and install the binaries for you Test your ipython installation running it c:\python27\Scripts\ipython -Test if the libraries are fine +Test if the libraries are fine - download the test_course_environment.py from github - running ipython *after* you've installed all of them - run the following command c:\python27\Scripts\nosetests test_prerequisites.py - diff --git a/python-for-sysadmin/docker-compose.yml b/python-for-sysadmin/docker-compose.yml index 1355f06..37f0278 100644 --- a/python-for-sysadmin/docker-compose.yml +++ b/python-for-sysadmin/docker-compose.yml @@ -9,7 +9,7 @@ dev: - 8888:8888 volumes: - ./rendered_notebooks:/notebooks - + test: image: ioggstream/python-course volumes: @@ -30,5 +30,4 @@ course: ansible: image: itscaro/debian-ssh:latest volumes: - - .:/code:z - + - .:/code:z diff --git a/python-for-sysadmin/images/python-for-sysadmin.graphml b/python-for-sysadmin/images/python-for-sysadmin.graphml index c4d2e5d..d53d963 100644 --- a/python-for-sysadmin/images/python-for-sysadmin.graphml +++ b/python-for-sysadmin/images/python-for-sysadmin.graphml @@ -53,7 +53,7 @@ - FAULTY + FAULTY MASTER @@ -116,7 +116,7 @@ Parser - Play in + Play in iPython @@ -253,7 +253,7 @@ Queries, Caches - Binary + Binary Logs + Dump diff --git a/python-for-sysadmin/notebooks/02_nosetests_full.py b/python-for-sysadmin/notebooks/02_nosetests_full.py index fb17580..27cc812 100644 --- a/python-for-sysadmin/notebooks/02_nosetests_full.py +++ b/python-for-sysadmin/notebooks/02_nosetests_full.py @@ -7,7 +7,6 @@ class TestB: - @classmethod def setup_class(self): # Run once at startup, eg. create database structure @@ -38,7 +37,6 @@ def test_c(self): def assert_exists(f): # Write assertions inside or outside tests. assert os.path.isfile(f) - - for f in ['a.txt', 'b.txt', 'c.txt']: - yield assert_exists, f, "Missing file: %r" % f + for f in ["a.txt", "b.txt", "c.txt"]: + yield assert_exists, f, "Missing file: %r" % f diff --git a/python-for-sysadmin/notebooks/ansible/inventory b/python-for-sysadmin/notebooks/ansible/inventory index 430eba5..395aff0 100644 --- a/python-for-sysadmin/notebooks/ansible/inventory +++ b/python-for-sysadmin/notebooks/ansible/inventory @@ -1,5 +1,5 @@ # -# This inventory file contains a list of server to +# This inventory file contains a list of server to # play with - divided in groups. # [course] @@ -14,5 +14,4 @@ pythonforsysadmin_course_1 ansible_connection=local # once you exchange ssh-keys between the pythonforsysadmin_course_1 # container and the pythonforsysadmin_ansible_* ones._ [ansible] -172.17.0.[5:7] - +172.17.0.[5:7] diff --git a/python-for-sysadmin/notebooks/ansible/mytemplate.j2 b/python-for-sysadmin/notebooks/ansible/mytemplate.j2 index 2bf75f6..2196903 100644 --- a/python-for-sysadmin/notebooks/ansible/mytemplate.j2 +++ b/python-for-sysadmin/notebooks/ansible/mytemplate.j2 @@ -5,5 +5,3 @@ GW=10.0.0.254 # a static line HOSTNAME={{ansible_hostname}} # a dynamic one - - diff --git a/python-for-sysadmin/notebooks/ansible/site.yml b/python-for-sysadmin/notebooks/ansible/site.yml index e0e4292..c561d0c 100644 --- a/python-for-sysadmin/notebooks/ansible/site.yml +++ b/python-for-sysadmin/notebooks/ansible/site.yml @@ -4,7 +4,7 @@ # - hosts: course tasks: - + - name: Create a file from a template template: src=mytemplate.j2 dest=/tmp/template.conf @@ -14,5 +14,3 @@ - python - python-dev # ignore_errors: yes # ignore errors during the course (eg. connectivity) - - diff --git a/python-for-sysadmin/notebooks/course/__init__.py b/python-for-sysadmin/notebooks/course/__init__.py index 8c4ebf0..3b7a50d 100644 --- a/python-for-sysadmin/notebooks/course/__init__.py +++ b/python-for-sysadmin/notebooks/course/__init__.py @@ -14,7 +14,7 @@ Reply from 192.168.239.132: bytes=32 time=120ms TTL=124 """ -from __future__ import print_function, unicode_literals, division +from __future__ import division, print_function, unicode_literals # # For hiding course @@ -30,8 +30,8 @@ def show_solution(bcode): # # For parsing section # -mail_sent = 'May 31 08:00:00 test-fe1 postfix/smtp[16669]: 7CD8E730020: to=, relay=examplemx2.doe.it[222.33.44.555]:25, delay=0.8, delays=0.17/0.01/0.43/0.19, dsn=2.0.0, status=sent(250 ok: Message 2108406157 accepted)' -mail_delivered = 'May 31 08:00:00 test-fe1 postfix/smtp[16669]: 7CD8E730020: removed' +mail_sent = "May 31 08:00:00 test-fe1 postfix/smtp[16669]: 7CD8E730020: to=, relay=examplemx2.doe.it[222.33.44.555]:25, delay=0.8, delays=0.17/0.01/0.43/0.19, dsn=2.0.0, status=sent(250 ok: Message 2108406157 accepted)" +mail_delivered = "May 31 08:00:00 test-fe1 postfix/smtp[16669]: 7CD8E730020: removed" # # For enconding section @@ -44,7 +44,8 @@ def create_wuerstelstrasse(dirname="/tmp"): @param dirname - The base directory, default '/tmp' """ from os.path import isdir - win = 'cp1252' + + win = "cp1252" prefix = "w\u00fcrstelstra\u00dfe" assert isdir(dirname), "Directory not found: %s" % dirname touch_encoded_filenames(dirname, prefix, encoding=win) @@ -56,24 +57,26 @@ def create_espana(dirname="/tmp"): @param dirname - The base directory, default '/tmp' """ from os.path import isdir - win = 'cp1252' + + win = "cp1252" prefix = "Espa\u00e9a" assert isdir(dirname), "Directory not found: %s" % dirname touch_encoded_filenames(dirname, prefix, encoding=win) -def touch_encoded_filenames(dirname, prefix, ext='txt', encoding='utf-8'): +def touch_encoded_filenames(dirname, prefix, ext="txt", encoding="utf-8"): """ Create filenames with a given encoding Python2 default encoding is ascii. """ from os.path import join as pjoin + for i in range(3): # Before encoding I can join unicode strings # and os.path.join - fpath = '.'.join((prefix, str(i), ext)) + fpath = ".".join((prefix, str(i), ext)) fpath = pjoin(dirname, fpath) bytepath = fpath.encode(encoding) - with open(bytepath, 'wb') as fh: + with open(bytepath, "wb") as fh: fh.write(b"My name is: ") fh.write(bytepath) fh.write(b"\n") @@ -82,10 +85,12 @@ def touch_encoded_filenames(dirname, prefix, ext='txt', encoding='utf-8'): # # for data gathering section # -diskstats_headers = ('major minor device' - ' reads reads_merged reads_sectors reads_ms' - ' writes writes_merged writes_sectors writes_ms' - ' io_in_progress io_ms_spent io_ms_weight').split() +diskstats_headers = ( + "major minor device" + " reads reads_merged reads_sectors reads_ms" + " writes writes_merged writes_sectors writes_ms" + " io_in_progress io_ms_spent io_ms_weight" +).split() def sh(cmd): @@ -93,8 +98,9 @@ def sh(cmd): Use shlex to honor quoted spaces like "my document.docx" """ - from subprocess import check_output from shlex import split + from subprocess import check_output + return check_output(split(cmd)).splitlines() @@ -105,8 +111,9 @@ def grep(expr, fpath): re.match matches from the beginning of the line. """ - import re import os + import re + re_expr = re.compile(expr) fpath = os.path.normpath(fpath) with open(fpath) as fp: @@ -115,9 +122,11 @@ def grep(expr, fpath): def igrep(expr, iterable): import re + re_expr = re.compile(expr) return [x for x in iterable if re_expr.search(x)] + # # data analysis # @@ -126,25 +135,865 @@ def in_chunks(dataset, size=10): @return a generator """ for i in range(0, len(dataset), size): - yield dataset[i:i+size] + yield dataset[i : i + size] table = { # cpu data - 'cpu_wait': (2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 6, 0, 0, 32, 12, 3, 0, 0, 2, 46, 41, 48, 44, 48, 43, 44, 44, 43, 45, 47, 46, 46, 44, 47, 46, 46, 46, 43, 48, 46, 47, 47, 44, 40, 49, 47, 43, 41, 46, 49, 45, 45, 45, 45, 43, 42, 46, 46, 47, 45), - 'cpu_sys': (6, 2, 2, 1, 3, 2, 2, 1, 1, 2, 1, 1, 2, 2, 3, 1, 2, 3, 5, 1, 2, 2, 6, 2, 1, 1, 3, 3, 5, 4, 2, 1, 4, 3, 2, 3, 2, 2, 2, 2, 1, 2, 1, 1, 2, 2, 3, 1, 2, 2, 2, 3, 5, 1, 2, 2, 4, 2, 2, 3, 4, 1, 2, 2, 3, 3, 2, 2, 3), - 'cpu_usr': (23, 9, 7, 6, 7, 8, 9, 5, 5, 3, 7, 4, 4, 4, 9, 6, 10, 14, 16, 8, 7, 5, 12, 9, 11, 7, 47, 15, 6, 11, 6, 5, 8, 7, 9, 8, 10, 4, 3, 2, 6, 7, 2, 5, 5, 3, 7, 3, 6, 3, 3, 5, 14, 9, 4, 10, 8, 4, 6, 7, 4, 4, 4, 9, 12, 5, 4, 3, 4), - 'cpu_id': (69, 90, 92, 93, 90, 87, 88, 94, 95, 96, 91, 93, 95, 92, 88, 93, 88, 83, 79, 86, 92, 93, 49, 78, 85, 92, 50, 80, 43, 44, 44, 49, 39, 46, 46, 44, 46, 49, 48, 50, 47, 47, 49, 48, 48, 49, 46, 49, 46, 49, 49, 48, 41, 42, 47, 45, 47, 48, 44, 46, 47, 49, 49, 46, 42, 46, 48, 49, 49), + "cpu_wait": ( + 2, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 6, + 0, + 0, + 32, + 12, + 3, + 0, + 0, + 2, + 46, + 41, + 48, + 44, + 48, + 43, + 44, + 44, + 43, + 45, + 47, + 46, + 46, + 44, + 47, + 46, + 46, + 46, + 43, + 48, + 46, + 47, + 47, + 44, + 40, + 49, + 47, + 43, + 41, + 46, + 49, + 45, + 45, + 45, + 45, + 43, + 42, + 46, + 46, + 47, + 45, + ), + "cpu_sys": ( + 6, + 2, + 2, + 1, + 3, + 2, + 2, + 1, + 1, + 2, + 1, + 1, + 2, + 2, + 3, + 1, + 2, + 3, + 5, + 1, + 2, + 2, + 6, + 2, + 1, + 1, + 3, + 3, + 5, + 4, + 2, + 1, + 4, + 3, + 2, + 3, + 2, + 2, + 2, + 2, + 1, + 2, + 1, + 1, + 2, + 2, + 3, + 1, + 2, + 2, + 2, + 3, + 5, + 1, + 2, + 2, + 4, + 2, + 2, + 3, + 4, + 1, + 2, + 2, + 3, + 3, + 2, + 2, + 3, + ), + "cpu_usr": ( + 23, + 9, + 7, + 6, + 7, + 8, + 9, + 5, + 5, + 3, + 7, + 4, + 4, + 4, + 9, + 6, + 10, + 14, + 16, + 8, + 7, + 5, + 12, + 9, + 11, + 7, + 47, + 15, + 6, + 11, + 6, + 5, + 8, + 7, + 9, + 8, + 10, + 4, + 3, + 2, + 6, + 7, + 2, + 5, + 5, + 3, + 7, + 3, + 6, + 3, + 3, + 5, + 14, + 9, + 4, + 10, + 8, + 4, + 6, + 7, + 4, + 4, + 4, + 9, + 12, + 5, + 4, + 3, + 4, + ), + "cpu_id": ( + 69, + 90, + 92, + 93, + 90, + 87, + 88, + 94, + 95, + 96, + 91, + 93, + 95, + 92, + 88, + 93, + 88, + 83, + 79, + 86, + 92, + 93, + 49, + 78, + 85, + 92, + 50, + 80, + 43, + 44, + 44, + 49, + 39, + 46, + 46, + 44, + 46, + 49, + 48, + 50, + 47, + 47, + 49, + 48, + 48, + 49, + 46, + 49, + 46, + 49, + 49, + 48, + 41, + 42, + 47, + 45, + 47, + 48, + 44, + 46, + 47, + 49, + 49, + 46, + 42, + 46, + 48, + 49, + 49, + ), # I/O - 'byte_in': (348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2832, 220, 0, 0, 0, 0, 2616, 1456, 1060, 768, 2492, 1504, 464, 512, 656, 584, 436, 748, 568, 456, 1088, 352, 564, 1548, 1764, 612, 680, 648, 928, 1128, 2384, 1712, 1240, 1040, 1104, 964, 716, 1076, 804, 792, 940, 960, 872, 540, 488, 544, 568), - 'byte_out': (383, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 56, 0, 116, 16, 0, 52, 0, 0, 120, 0, 0, 0, 0, 79, 0, 0, 300, 180, 0, 120, 4, 360, 0, 0, 0, 0, 104, 0, 0, 0, 0, 48, 4, 0, 0, 8, 0, 60, 0, 0, 144, 0, 46, 29, 0, 0, 0, 192, 0, 0, 292, 0, 96, 0, 0, 0, 0, 0), + "byte_in": ( + 348, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2832, + 220, + 0, + 0, + 0, + 0, + 2616, + 1456, + 1060, + 768, + 2492, + 1504, + 464, + 512, + 656, + 584, + 436, + 748, + 568, + 456, + 1088, + 352, + 564, + 1548, + 1764, + 612, + 680, + 648, + 928, + 1128, + 2384, + 1712, + 1240, + 1040, + 1104, + 964, + 716, + 1076, + 804, + 792, + 940, + 960, + 872, + 540, + 488, + 544, + 568, + ), + "byte_out": ( + 383, + 0, + 0, + 0, + 0, + 72, + 0, + 0, + 0, + 0, + 0, + 56, + 0, + 116, + 16, + 0, + 52, + 0, + 0, + 120, + 0, + 0, + 0, + 0, + 79, + 0, + 0, + 300, + 180, + 0, + 120, + 4, + 360, + 0, + 0, + 0, + 0, + 104, + 0, + 0, + 0, + 0, + 48, + 4, + 0, + 0, + 8, + 0, + 60, + 0, + 0, + 144, + 0, + 46, + 29, + 0, + 0, + 0, + 192, + 0, + 0, + 292, + 0, + 96, + 0, + 0, + 0, + 0, + 0, + ), # 'paging' - 'swap_in': (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), - 'swap_out': (2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), + "swap_in": ( + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 96, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ), + "swap_out": ( + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ), # 'memory' - 'cache': (2214824, 2215216, 2215068, 2215076, 2215092, 2215108, 2215108, 2215116, 2214856, 2214860, 2214860, 2214864, 2214868, 2214864, 2215100, 2215132, 2215132, 2214888, 2214888, 2214876, 2214880, 2214880, 2215104, 2215128, 2215332, 2215336, 2215020, 2215012, 2215360, 2215576, 2215372, 2215168, 2215128, 2215156, 2214964, 2214956, 2214940, 2215012, 2214980, 2215076, 2214984, 2215000, 2215004, 2214988, 2214972, 2215056, 2214848, 2215092, 2215076, 2214964, 2214956, 2215032, 2215044, 2215060, 2214976, 2215100, 2215292, 2215268, 2215112, 2215044, 2215084, 2215080, 2214984, 2215272, 2215360, 2215276, 2215288, 2215008, 2215140), - 'buff': (375192, 375192, 375192, 375192, 375192, 375196, 375196, 375196, 375196, 375196, 375196, 375200, 375200, 375204, 375204, 375204, 375204, 375204, 375204, 375208, 375208, 375208, 377976, 378196, 378204, 378204, 378204, 378212, 380836, 382292, 383356, 384124, 386636, 388140, 388604, 389116, 389772, 390360, 390796, 391544, 392112, 392568, 393656, 394012, 394576, 396124, 397888, 398496, 399184, 399832, 400664, 401792, 404176, 405888, 407128, 408168, 409272, 410236, 410956, 412032, 412836, 413628, 414568, 415536, 416408, 416948, 417436, 417980, 418544), + "cache": ( + 2214824, + 2215216, + 2215068, + 2215076, + 2215092, + 2215108, + 2215108, + 2215116, + 2214856, + 2214860, + 2214860, + 2214864, + 2214868, + 2214864, + 2215100, + 2215132, + 2215132, + 2214888, + 2214888, + 2214876, + 2214880, + 2214880, + 2215104, + 2215128, + 2215332, + 2215336, + 2215020, + 2215012, + 2215360, + 2215576, + 2215372, + 2215168, + 2215128, + 2215156, + 2214964, + 2214956, + 2214940, + 2215012, + 2214980, + 2215076, + 2214984, + 2215000, + 2215004, + 2214988, + 2214972, + 2215056, + 2214848, + 2215092, + 2215076, + 2214964, + 2214956, + 2215032, + 2215044, + 2215060, + 2214976, + 2215100, + 2215292, + 2215268, + 2215112, + 2215044, + 2215084, + 2215080, + 2214984, + 2215272, + 2215360, + 2215276, + 2215288, + 2215008, + 2215140, + ), + "buff": ( + 375192, + 375192, + 375192, + 375192, + 375192, + 375196, + 375196, + 375196, + 375196, + 375196, + 375196, + 375200, + 375200, + 375204, + 375204, + 375204, + 375204, + 375204, + 375204, + 375208, + 375208, + 375208, + 377976, + 378196, + 378204, + 378204, + 378204, + 378212, + 380836, + 382292, + 383356, + 384124, + 386636, + 388140, + 388604, + 389116, + 389772, + 390360, + 390796, + 391544, + 392112, + 392568, + 393656, + 394012, + 394576, + 396124, + 397888, + 398496, + 399184, + 399832, + 400664, + 401792, + 404176, + 405888, + 407128, + 408168, + 409272, + 410236, + 410956, + 412032, + 412836, + 413628, + 414568, + 415536, + 416408, + 416948, + 417436, + 417980, + 418544, + ), # 'system' - 'irq': (4, 904, 939, 912, 919, 1072, 1072, 868, 873, 945, 1028, 871, 869, 887, 1002, 923, 1091, 1256, 1253, 1009, 934, 940, 2072, 1138, 1050, 972, 1307, 1088, 2060, 1722, 1482, 1339, 2342, 1506, 1231, 1343, 1357, 1368, 1289, 1467, 1314, 1265, 1456, 1156, 1328, 1527, 1671, 1218, 1446, 1280, 1404, 1588, 2091, 1722, 1577, 1466, 1536, 1371, 1349, 1392, 1432, 1480, 1332, 1520, 1547, 1313, 1317, 1325, 1247), - 'csw': (6, 1651, 1646, 1534, 1647, 1809, 1652, 1361, 1412, 1373, 1419, 1279, 1275, 1453, 1958, 1332, 2610, 3207, 3072, 1764, 1663, 1627, 11546, 2302, 1839, 1486, 1618, 2044, 5631, 4960, 5547, 4245, 7619, 2662, 2870, 3059, 3448, 3241, 3069, 3933, 3270, 2899, 3878, 2603, 2781, 2714, 2569, 2916, 3517, 3014, 3422, 4144, 5855, 5015, 3765, 3627, 4123, 3087, 3466, 2952, 3899, 3878, 2763, 4115, 4178, 3296, 3390, 3423, 3367) + "irq": ( + 4, + 904, + 939, + 912, + 919, + 1072, + 1072, + 868, + 873, + 945, + 1028, + 871, + 869, + 887, + 1002, + 923, + 1091, + 1256, + 1253, + 1009, + 934, + 940, + 2072, + 1138, + 1050, + 972, + 1307, + 1088, + 2060, + 1722, + 1482, + 1339, + 2342, + 1506, + 1231, + 1343, + 1357, + 1368, + 1289, + 1467, + 1314, + 1265, + 1456, + 1156, + 1328, + 1527, + 1671, + 1218, + 1446, + 1280, + 1404, + 1588, + 2091, + 1722, + 1577, + 1466, + 1536, + 1371, + 1349, + 1392, + 1432, + 1480, + 1332, + 1520, + 1547, + 1313, + 1317, + 1325, + 1247, + ), + "csw": ( + 6, + 1651, + 1646, + 1534, + 1647, + 1809, + 1652, + 1361, + 1412, + 1373, + 1419, + 1279, + 1275, + 1453, + 1958, + 1332, + 2610, + 3207, + 3072, + 1764, + 1663, + 1627, + 11546, + 2302, + 1839, + 1486, + 1618, + 2044, + 5631, + 4960, + 5547, + 4245, + 7619, + 2662, + 2870, + 3059, + 3448, + 3241, + 3069, + 3933, + 3270, + 2899, + 3878, + 2603, + 2781, + 2714, + 2569, + 2916, + 3517, + 3014, + 3422, + 4144, + 5855, + 5015, + 3765, + 3627, + 4123, + 3087, + 3466, + 2952, + 3899, + 3878, + 2763, + 4115, + 4178, + 3296, + 3390, + 3423, + 3367, + ), } diff --git a/python-for-sysadmin/notebooks/course/linux_diskstats.py b/python-for-sysadmin/notebooks/course/linux_diskstats.py index 7ce7fe5..d441f8a 100644 --- a/python-for-sysadmin/notebooks/course/linux_diskstats.py +++ b/python-for-sysadmin/notebooks/course/linux_diskstats.py @@ -1,5 +1,6 @@ -__author__ = 'rpolli' +__author__ = "rpolli" from __future__ import print_function + from . import grep @@ -13,9 +14,12 @@ def linux_diskstats(disk): goal: use *magic with print+sep, splitting and slicing """ from time import sleep - info = ('reads reads_merged reads_sectors reads_ms' - ' writes writes_merged writes_sectors writes_ms' - ' io_in_progress io_ms_weight').split() + + info = ( + "reads reads_merged reads_sectors reads_ms" + " writes writes_merged writes_sectors writes_ms" + " io_in_progress io_ms_weight" + ).split() print(*info, sep=",") old, cur = dict(), dict() while True: diff --git a/python-for-sysadmin/notebooks/course/multiplatform_vmstat.py b/python-for-sysadmin/notebooks/course/multiplatform_vmstat.py index 0aa5e25..9473122 100644 --- a/python-for-sysadmin/notebooks/course/multiplatform_vmstat.py +++ b/python-for-sysadmin/notebooks/course/multiplatform_vmstat.py @@ -2,8 +2,10 @@ def multiplatform_vmstat(count): """Get data in a multiplatform way """ - import psutil import time + + import psutil + cpu_percent, io_stat, io_stat_0 = 0, 0, 0 print("cpu%", "iops(r+w)") for x in range(-count, 1): diff --git a/python-for-sysadmin/notebooks/course/parse_line.py b/python-for-sysadmin/notebooks/course/parse_line.py index d87be03..62465ce 100644 --- a/python-for-sysadmin/notebooks/course/parse_line.py +++ b/python-for-sysadmin/notebooks/course/parse_line.py @@ -1,11 +1,12 @@ -__author__ = 'rpolli' +__author__ = "rpolli" def parse_line(line): import re + _, _, hour, host, _, _, dest = line.split()[:7] try: - dest = re.split(r'[<>]', dest)[1] + dest = re.split(r"[<>]", dest)[1] except (IndexError, TypeError): dest = None return (hour, host, dest) diff --git a/python-for-sysadmin/notebooks/course/pgrep.py b/python-for-sysadmin/notebooks/course/pgrep.py index 968a58f..2ef91cd 100644 --- a/python-for-sysadmin/notebooks/course/pgrep.py +++ b/python-for-sysadmin/notebooks/course/pgrep.py @@ -1,5 +1,6 @@ -__author__ = 'rpolli' +__author__ = "rpolli" from __future__ import absolute_import + from course import sh @@ -11,6 +12,7 @@ def system_info_from_command_output_solution(): """Exercise: write a multiplatform pgrep-like function """ + def pgrep(expr): # linux or mac return igrep(expr, sh("ps -fe")) diff --git a/python-for-sysadmin/notebooks/course/ping_rtt.py b/python-for-sysadmin/notebooks/course/ping_rtt.py index 7ead807..19af5db 100644 --- a/python-for-sysadmin/notebooks/course/ping_rtt.py +++ b/python-for-sysadmin/notebooks/course/ping_rtt.py @@ -1,4 +1,4 @@ -__author__ = 'rpolli' +__author__ = "rpolli" def ping_rtt(): @@ -6,18 +6,19 @@ def ping_rtt(): goal: slicing data goal: using zip to transpose data """ - from course import sh import sys + + from course import sh + cmd = "ping -c10 www.google.it" - if 'win' in sys.platform: + if "win" in sys.platform: cmd = "ping -n10 www.google.it" ping_output = sh(cmd) - filter_lines = (x.split() for x in ping_output if 'time' in x) - if 'win' in sys.platform: + filter_lines = (x.split() for x in ping_output if "time" in x) + if "win" in sys.platform: ping_output = [x[6::2] for x in filter_lines] else: ping_output = [x[-4:-1:2] for x in filter_lines] ttl, rtt = zip(*ping_output) return [float(x.split("=")[1]) for x in rtt] - diff --git a/python-for-sysadmin/notebooks/course/ping_rtt_ipython.py b/python-for-sysadmin/notebooks/course/ping_rtt_ipython.py index 30affb1..65d9e3d 100644 --- a/python-for-sysadmin/notebooks/course/ping_rtt_ipython.py +++ b/python-for-sysadmin/notebooks/course/ping_rtt_ipython.py @@ -6,4 +6,3 @@ def ping_rtt(): rtt = ret.grep("time=").fields(-2) rtt = [float(x[5:]) for x in rtt] return rtt - diff --git a/python-for-sysadmin/notebooks/logger.yml b/python-for-sysadmin/notebooks/logger.yml index 7470e9d..4b327bc 100644 --- a/python-for-sysadmin/notebooks/logger.yml +++ b/python-for-sysadmin/notebooks/logger.yml @@ -1,14 +1,14 @@ version: 1 formatters: - detailed: + detailed: class: logging.Formatter format: '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s' handlers: - console: + console: class: logging.StreamHandler level: INFO - syslog: + syslog: class: logging.handlers.SysLogHandler formatter: detailed level: DEBUG diff --git a/python-for-sysadmin/requirements.txt b/python-for-sysadmin/requirements.txt index f2cfebe..4423534 100644 --- a/python-for-sysadmin/requirements.txt +++ b/python-for-sysadmin/requirements.txt @@ -19,4 +19,3 @@ nbstripout # Load jupyter extensions for exercises. jupyter_contrib_nbextensions RISE - diff --git a/python-for-sysadmin/scripts/01_system_data_gathering.py b/python-for-sysadmin/scripts/01_system_data_gathering.py index 3165b64..9b90137 100644 --- a/python-for-sysadmin/scripts/01_system_data_gathering.py +++ b/python-for-sysadmin/scripts/01_system_data_gathering.py @@ -29,8 +29,9 @@ def linux_threads(pid): goal: startswith accepts tuple arguments """ import glob + path = "/proc/{}/task/*/status".format(pid) - t_info = ('Pid', 'Tgid', 'voluntary') # this is a tuple! + t_info = ("Pid", "Tgid", "voluntary") # this is a tuple! for t in glob.glob(path): t_info = [x for x in open(t) if x.startswith(t_info)] print(t_info) @@ -51,8 +52,9 @@ def sh(cmd, shell=False, timeout=0): goal: use sys to check python features goal: use subprocess.check_output """ - from sys import version_info as python_version from subprocess import check_output + from sys import version_info as python_version + if python_version < (3, 3): if timeout: raise ValueError("Timeout not supported until Python 3.3") @@ -68,6 +70,7 @@ def system_info_from_command_output(): Solution is at the EOF """ + def pgrep(expr): raise NotImplementedError @@ -77,6 +80,7 @@ def zip_iterables(): like a zip fastener """ from sys import version_info as python_version + a_list = [0, 1, 2, 3] b_list = ["a", "b", "c", "d"] zipper = zip(a_list, b_list) @@ -95,9 +99,12 @@ def linux_diskstats(disk): goal: use *magic with print+sep, splitting and slicing """ from time import sleep - info = ('reads reads_merged reads_sectors reads_ms' - ' writes writes_merged writes_sectors writes_ms' - ' io_in_progress io_ms_weight').split() + + info = ( + "reads reads_merged reads_sectors reads_ms" + " writes writes_merged writes_sectors writes_ms" + " io_in_progress io_ms_weight" + ).split() print(*info[:8], sep="\t") old = [0] * 11 @@ -114,7 +121,7 @@ def linux_diskstats(disk): old = cur sleep(1) + # # A more complex exercise using a lot of stuff # - diff --git a/python-for-sysadmin/scripts/02_encoding.py b/python-for-sysadmin/scripts/02_encoding.py index d7bf4c0..920c6a3 100644 --- a/python-for-sysadmin/scripts/02_encoding.py +++ b/python-for-sysadmin/scripts/02_encoding.py @@ -4,7 +4,7 @@ from a vfat filesystem """ -from __future__ import unicode_literals, print_function +from __future__ import print_function, unicode_literals def encoding_basic(): @@ -22,18 +22,19 @@ def encoding_basic(): """ -def touch_encoded_filenames(dirname, prefix, ext='txt', encoding='utf-8'): +def touch_encoded_filenames(dirname, prefix, ext="txt", encoding="utf-8"): """ Create filenames with a given encoding Python2 default encoding is ascii. """ from os.path import join as pjoin + for i in range(3): # Before encoding I can join unicode strings # and os.path.join - fpath = '.'.join((prefix, str(i), ext)) + fpath = ".".join((prefix, str(i), ext)) fpath = pjoin(dirname, fpath) bytepath = fpath.encode(encoding) - with open(bytepath, 'wb') as fh: + with open(bytepath, "wb") as fh: # in python3 you always convert to bytes fh.write(b"My name is: ") fh.write(bytepath) @@ -53,9 +54,10 @@ def windows_filenames(): moreover we use "{!r}".format to avoid further encoding issues in the printing part """ - from os.path import join as pjoin from os import listdir as ls - win = 'cp1252' + from os.path import join as pjoin + + win = "cp1252" prefix = "w\u00fcrstelstra\u00dfe" touch_encoded_filenames("/tmp/course", prefix, encoding=win) @@ -63,15 +65,15 @@ def windows_filenames(): try: utf_path = pjoin(basedir, f) print("file: {!r}".format(utf_path)) - except UnicodeDecodeError as e: + except UnicodeDecodeError: print("Error decoding {!r}".format(f)) bytebasedir = bytes(basedir) for b in ls(bytebasedir): try: - byte_path = pjoin(bytebasedir, b) + pjoin(bytebasedir, b) print("file: {!r}".format(utf_path)) - except UnicodeDecodeError as e: + except UnicodeDecodeError: print("Error decoding {!r}".format(b)) @@ -89,8 +91,8 @@ def windows_filenames_short(): issues in the printing part """ from glob import glob - from os.path import join as pjoin - win = 'cp1252' + + win = "cp1252" prefix = "w\u00fcrstelstra\u00dfe" touch_encoded_filenames("/tmp/course", prefix, encoding=win) @@ -98,8 +100,8 @@ def windows_filenames_short(): # glob fails while mangling those filenames # as encoded strings try: - files = glob("/tmp/course/*.txt") - except UnicodeDecodeError as e: + glob("/tmp/course/*.txt") + except UnicodeDecodeError: print("Error decoding files in {!r}".format("/tmp/course")) # while everything works fine mangling them as @@ -107,5 +109,5 @@ def windows_filenames_short(): for f in glob(b"/tmp/course/*.txt"): try: print("file: {!r}".format(f)) - except UnicodeDecodeError as e: + except UnicodeDecodeError: print("Error decoding {!r}".format(f)) diff --git a/python-for-sysadmin/scripts/02_file_management.py b/python-for-sysadmin/scripts/02_file_management.py index 89715d6..4d91c24 100644 --- a/python-for-sysadmin/scripts/02_file_management.py +++ b/python-for-sysadmin/scripts/02_file_management.py @@ -4,7 +4,8 @@ modules: os, sys, shutil, glob """ -from __future__ import unicode_literals, print_function +from __future__ import print_function, unicode_literals + basedir = "/tmp/course" @@ -23,9 +24,10 @@ def simple_path_management(): # and prepend the right path import os import sys + hosts, basedir = "etc/hosts", "/" - if sys.platform.startswith('win'): - basedir = 'c:/windows/system32/drivers' + if sys.platform.startswith("win"): + basedir = "c:/windows/system32/drivers" hosts = os.path.join(basedir, hosts) hosts = os.path.normpath(hosts) print("Normalized path is", hosts) @@ -48,6 +50,7 @@ def create_and_move_tree(): from os import makedirs from os.path import isdir from shutil import copytree, rmtree + makedirs("/tmp/course/foo/bar") assert isdir("/tmp/course/foo/bar") @@ -60,6 +63,7 @@ def create_and_move_tree(): # Just use the errno module to # check the error value import errno + assert e.errno == errno.EEXIST copytree("/tmp/course/foo", "/tmp/course/foo2") diff --git a/python-for-sysadmin/scripts/02_nosetests_full.py b/python-for-sysadmin/scripts/02_nosetests_full.py index 9825368..f58f21c 100644 --- a/python-for-sysadmin/scripts/02_nosetests_full.py +++ b/python-for-sysadmin/scripts/02_nosetests_full.py @@ -3,14 +3,14 @@ - setup_class() and setup() increase flexibility """ -import os import errno +import os # Import assert_* tools from nose.tools import * -class TestB(object): +class TestB(object): @classmethod def setup_class(self): # Run once at startup, eg. create database structure @@ -41,25 +41,24 @@ def test_b(self): # Bonus examples: # # - testing exceptions - # - parametrized tests + # - parametrized tests # @raises(IOError) def test_except(self): - assert open('/tmp/MISSING') + assert open("/tmp/MISSING") def test_except_complex(self): with assert_raises(IOError) as ex: - fh = open('/tmp/MISSING') + open("/tmp/MISSING") # Verify exception *and* errno! assert_equals(ex.exception.errno, errno.ENOENT) def test_parametrized(self): # Runs 3 tests using the nosetest generator syntax. for i in range(3): - # You have to yield a method to make it work into + # You have to yield a method to make it work into # a class - yield self.harn_greater, i, 0 + yield self.harn_greater, i, 0 def harn_greater(self, a, b): assert_greater(a, b) - diff --git a/python-for-sysadmin/scripts/03_parsing_benchmarks.py b/python-for-sysadmin/scripts/03_parsing_benchmarks.py index 8592721..404e753 100644 --- a/python-for-sysadmin/scripts/03_parsing_benchmarks.py +++ b/python-for-sysadmin/scripts/03_parsing_benchmarks.py @@ -22,8 +22,8 @@ def grep(expr, fpath): re.match matches from the beginning of the line. """ - import re import os + import re re_expr = re.compile(expr) fpath = os.path.normpath(fpath) with open(fpath) as fp: @@ -46,6 +46,7 @@ def splitting_with_findall(): goal: improve string readability """ from re import findall # can be misused too; + # eg for adding the ":" to a mac_address = "00""24""e8""b4""33""20" re_s_1 = "[0-9a-fA-F]" diff --git a/python-for-sysadmin/scripts/03_parsing_test.py b/python-for-sysadmin/scripts/03_parsing_test.py index 6ed5e62..ac4d1d1 100644 --- a/python-for-sysadmin/scripts/03_parsing_test.py +++ b/python-for-sysadmin/scripts/03_parsing_test.py @@ -13,21 +13,21 @@ # For now we're just interested in the following cases # 1- a mail is sent # 2- a mail is delivered -test_str_1 = 'Nov 31 08:00:00 test-fe1 postfix/smtp[16669]: 7CD8E730020: to=, relay=examplemx2.doe.it[222.33.44.555]:25, delay=0.8, delays=0.17/0.01/0.43/0.19, dsn=2.0.0, status=sent(250 ok: Message 2108406157 accepted)' -test_str_2 = 'Nov 31 08:00:00 test-fe1 postfix/smtp[16669]: 7CD8E730020: removed' +test_str_1 = "Nov 31 08:00:00 test-fe1 postfix/smtp[16669]: 7CD8E730020: to=, relay=examplemx2.doe.it[222.33.44.555]:25, delay=0.8, delays=0.17/0.01/0.43/0.19, dsn=2.0.0, status=sent(250 ok: Message 2108406157 accepted)" +test_str_2 = "Nov 31 08:00:00 test-fe1 postfix/smtp[16669]: 7CD8E730020: removed" def test_sent(): hour, host, destination = parse_line(test_str_1) - assert hour == '08:00:00' - assert host == 'test-fe1' - assert destination == 'jon@doe.it' + assert hour == "08:00:00" + assert host == "test-fe1" + assert destination == "jon@doe.it" def test_delivered(): hour, host, destination = parse_line(test_str_2) - assert hour == '08:00:00' - assert host == 'test-fe1' + assert hour == "08:00:00" + assert host == "test-fe1" assert destination is None diff --git a/python-for-sysadmin/scripts/04_simple_processing.py b/python-for-sysadmin/scripts/04_simple_processing.py index be6d985..e464bcb 100644 --- a/python-for-sysadmin/scripts/04_simple_processing.py +++ b/python-for-sysadmin/scripts/04_simple_processing.py @@ -1,7 +1,7 @@ """ """ -import sys + def sh(cmd): """A quick and dirty check_output wrapper. @@ -9,6 +9,7 @@ def sh(cmd): quoted spaces like "my document.docx" """ from subprocess import check_output + return check_output(cmd.split()).splitlines() @@ -17,14 +18,16 @@ def ping_rtt(): goal: slicing data goal: using zip to transpose data """ - from notebooks.course import sh import sys + + from notebooks.course import sh + cmd = "ping -c10 www.google.it" - if 'win' in sys.platform: + if "win" in sys.platform: cmd = "ping -n10 www.google.it" ping_output = sh(cmd) - if 'win' in sys.platform: + if "win" in sys.platform: ping_output = [ping_output[6::2] for x in ping_output] else: ping_output = [ping_output[-4:-1:2] for x in ping_output] @@ -38,9 +41,10 @@ def ping_stats(): goal: use scipy goal: check stdev """ - from scipy import std, mean + from scipy import mean, std + rtt = ping_rtt() - fmt_s = 'stdev: {}, mean: {}, min: {}, max: {}' + fmt_s = "stdev: {}, mean: {}, min: {}, max: {}" rtt_std, rtt_mean = std(rtt), mean(ping_rtt) rtt_max, rtt_min = max(rtt), min(ping_rtt) print(fmt_s.format(rtt_std, rtt_mean, rtt_max, rtt_min)) @@ -48,6 +52,7 @@ def ping_stats(): def distributions(): from collections import defaultdict + """generate data distribution using set or defaultdict """ distro = {x: rtt.count(x) for x in set(rtt)} @@ -59,8 +64,10 @@ def distributions(): def netfishing_correlation(): from itertools import combinations - from scipy.stats.stats import pearsonr + from course import table + from scipy.stats.stats import pearsonr + """table = { 'cpu_percent': [10, 23, 55, ...] 'iops': [2132, 3212, 3942, ...] @@ -69,15 +76,16 @@ def netfishing_correlation(): """ for k1, k2 in combinations(table, 2): r_coeff, probability = pearsonr(table[k1], table[k2]) - print("linear correlation between {} and {} is {}".format( - k1, k2, r_coeff)) + print("linear correlation between {} and {} is {}".format(k1, k2, r_coeff)) def netfishing_correlation_plot(): - from itertools import combinations, cycle - from scipy.stats.stats import pearsonr + from itertools import combinations + from course import table from matplotlib import pyplot as plt + from scipy.stats.stats import pearsonr + for (k1, v1), (k2, v2) in combinations(table.items(), 2): r_coeff, probability = pearsonr(table[k1], table[k2]) if r_coeff < 0.6: @@ -92,12 +100,15 @@ def netfishing_correlation_plot(): def netfishing_correlation_colored_plot(): from itertools import combinations, cycle - from scipy.stats.stats import pearsonr - from course import table, in_chunks + + from course import in_chunks, table from matplotlib import pyplot as plt - max_color, nbins = 1<<23, 12 + from scipy.stats.stats import pearsonr + + max_color, nbins = 1 << 23, 12 colors = cycle( - '#'+format(x, '06X') for x in range(0, max_color, max_color / nbins)) + "#" + format(x, "06X") for x in range(0, max_color, max_color / nbins) + ) for (k1, v1), (k2, v2) in combinations(table.items(), 2): r_coeff, probability = pearsonr(table[k1], table[k2]) diff --git a/python-for-sysadmin/slide/Makefile b/python-for-sysadmin/slide/Makefile index 683db2a..827b874 100644 --- a/python-for-sysadmin/slide/Makefile +++ b/python-for-sysadmin/slide/Makefile @@ -7,7 +7,7 @@ default: check: lacheck babel.tex | egrep -v "Dots should be |Whitespace before punctation|to (begin|end) quotation|possible unwanted space" -all: +all: pdflatex --shell-escape -interaction=nonstopmode babel.tex mv babel.pdf python-for-sysadmin-draft-2016.pdf diff --git a/python-for-sysadmin/slide/babel.tex b/python-for-sysadmin/slide/babel.tex index 4f87acd..119aa21 100644 --- a/python-for-sysadmin/slide/babel.tex +++ b/python-for-sysadmin/slide/babel.tex @@ -27,7 +27,7 @@ \author{Roberto Polli - \href{mailto:roberto.polli@par-tec.it}{roberto.polli@par-tec.it}} %\date{24 July 2014} \institute{Par-Tec Spa - Rome Operation Unit \\ - P.zza S. Benedetto da Norcia, 33\\ + P.zza S. Benedetto da Norcia, 33\\ 00040, Pomezia (RM) - www.par-tec.it% } diff --git a/python-for-sysadmin/slide/data_gathering.tex b/python-for-sysadmin/slide/data_gathering.tex index 351721e..66a93dd 100644 --- a/python-for-sysadmin/slide/data_gathering.tex +++ b/python-for-sysadmin/slide/data_gathering.tex @@ -8,7 +8,7 @@ \section{Data Gathering: 20'} Gathering System Data with multiplatform and platform-dependent tools. \begin{itemize} -\item Get infos from files, /proc and /sys +\item Get infos from files, /proc and /sys \item Capture command output \item Use psutil to get IO, CPU and memory data \item Parse files with a strategy @@ -27,7 +27,7 @@ \section{Data Gathering: 20'} goal: comprehension can filter iterables """ return [x for x in open(fpath) if needle in x] - + # Do we have "localhost" in our "/etc/hosts"? grep("localhost", "/etc/hosts") \end{pycode} @@ -113,9 +113,9 @@ \subsection{module: subprocess} output = check_output(split(cmd), shell=shell, timeout=timeout) return output.|\pyver{splitlines}|() - - - + + + \end{pycode*} \end{pyframe} @@ -146,12 +146,12 @@ \subsection{The /proc filesystem} """The Linux /proc filesystem is a cool place to get infos.""" from glob import glob # replaces * and ? path = "/proc/{}/task/*/status".format(pid) - + # Pick a set of fields to gather... t_info = ('Pid', 'Tgid', 'voluntary') # a tuple for t_path in glob(path): # ...and use comprehension to get interesting data. - print([x for x in open(t_path) + print([x for x in open(t_path) if x.|\pyver{startswith}|(t_info)] # accepts tuples! ) \end{pycode*} @@ -166,7 +166,7 @@ \subsection{The /proc filesystem} # To gather that data we put the headers in a multi-line string from course import diskstats_headers as headers - + disk_info = disk_l[0].split() # Take the 1st entry, split the datas ... zip(headers, disk_info) # ...and tie them with the headers list(_) # On py3 you need to iterate the generator! @@ -186,7 +186,7 @@ \subsection{The /proc filesystem} dstat.device, dstat.writes_ms # Homework: check further features with -help(collections) +help(collections) \end{pycode*} \end{pyframe} diff --git a/python-for-sysadmin/slide/encoding.tex b/python-for-sysadmin/slide/encoding.tex index 071e293..05df1ad 100644 --- a/python-for-sysadmin/slide/encoding.tex +++ b/python-for-sysadmin/slide/encoding.tex @@ -6,7 +6,7 @@ \section{Encoding: 10'} \item A string more than a sequence of bytes \item \emph{A string is a couple (bytes, encoding)} \item Use unicode\_literals in python2 -\item Manage differently encoded filenames +\item Manage differently encoded filenames \item A string is not a sequence of bytes \end{itemize} modules: \pymodule{os, os.path, glob} @@ -18,19 +18,19 @@ \section{Encoding: 10'} \column[c]{.15\textwidth} \tiny -\textit{Als das Kind Kind war, ging es mit hängenden Armen, -wollte der Bach sei ein Flu\ss, der Flu\ss sei ein Strom, +\textit{Als das Kind Kind war, ging es mit hängenden Armen, +wollte der Bach sei ein Flu\ss, der Flu\ss sei ein Strom, und diese Pf\"utze das Meer. \newline -Als das Kind Kind war, wu\sste es nicht, da\ss es Kind war, +Als das Kind Kind war, wu\sste es nicht, da\ss es Kind war, alles war ihm beseelt, und alle Seelen waren eins. \newline -Als das Kind Kind war, -hatte es von nichts eine Meinung, -hatte keine Gewohnheit, -sa\ss oft im Schneidersitz, -lief aus dem Stand, -hatte einen Wirbel im Haar +Als das Kind Kind war, +hatte es von nichts eine Meinung, +hatte keine Gewohnheit, +sa\ss oft im Schneidersitz, +lief aus dem Stand, +hatte einen Wirbel im Haar und machte kein Gesicht beim fotografieren. } \column[c]{.7\textwidth} @@ -46,21 +46,21 @@ \section{Encoding: 10'} \end{verse} \column[c]{.15\textwidth} -\tiny \textit{Als das Kind Kind war, -fielen ihm die Beeren wie nur Beeren in die Hand -und jetzt immer noch, -machten ihm die frischen Waln\"usse eine rauhe Zunge -und jetzt immer noch, -hatte es auf jedem Berg -die Sehnsucht nach dem immer h\"oheren Berg, -und in jeder Stadt -die Sehnsucht nach der noch gr\"o\sseren Stadt, -und das ist immer noch so, -griff im Wipfel eines Baums nach dem Kirschen in einemHochgef\"uhl -wie auch heute noch, -eine Scheu vor jedem Fremden -und hat sie immer noch, -wartete es auf den ersten Schnee, +\tiny \textit{Als das Kind Kind war, +fielen ihm die Beeren wie nur Beeren in die Hand +und jetzt immer noch, +machten ihm die frischen Waln\"usse eine rauhe Zunge +und jetzt immer noch, +hatte es auf jedem Berg +die Sehnsucht nach dem immer h\"oheren Berg, +und in jeder Stadt +die Sehnsucht nach der noch gr\"o\sseren Stadt, +und das ist immer noch so, +griff im Wipfel eines Baums nach dem Kirschen in einemHochgef\"uhl +wie auch heute noch, +eine Scheu vor jedem Fremden +und hat sie immer noch, +wartete es auf den ersten Schnee, und wartet so immer noch. } \end{columns} @@ -70,7 +70,7 @@ \section{Encoding: 10'} \begin{pyframe}{Encoding is a map} \begin{itemize} \item The \emph{type()} of a byte-sequence is bytes -\item Encoding is a one-to-one map between a typographical character and a byte-sequence +\item Encoding is a one-to-one map between a typographical character and a byte-sequence \item Decoding is its reverse map \end{itemize} @@ -78,7 +78,7 @@ \section{Encoding: 10'} \column[c]{.6\textwidth} \begin{pycode*}{escapeinside=||} # heading $\pyver{u}$ only py2 and py3.3+ -b1 = |\pyver{u}|"S\u00fcd".encode('utf-8') +b1 = |\pyver{u}|"S\u00fcd".encode('utf-8') b2 = |\pyver{u}|"S\u00fcd".encode('cp1252') # it's always true that @@ -94,10 +94,10 @@ \section{Encoding: 10'} \column[c]{.4\textwidth} \small -\begin{tabular}{|c||c|c|c|}\hline +\begin{tabular}{|c||c|c|c|}\hline & \multicolumn{3}{|c|}{bytes} \\ \hline char & ascii & utf-8 & cp1252 \\ \hline -a & [97] & [97] & [97] \\ \hline +a & [97] & [97] & [97] \\ \hline $\ddot{u}$ & - & [195, 188] & [\pyver{252}] \\ \hline \`{e} & - & [196, 168] & [232]\\ \hline \end{tabular} @@ -112,7 +112,7 @@ \section{Encoding: 10'} \begin{pycode*}{escapeinside=||} -# Py3 doesn't need the $\pyver{u}$ +# Py3 doesn't need the $\pyver{u}$ the_string = |\pyver{u}|"S\u00fcd" # $S\ddot{u}d$ # can be encoded in different @@ -133,16 +133,16 @@ \section{Encoding: 10'} \column[c]{.4\textwidth} \begin{itemize} -\item Encoding is a one-to-one map between a typographical character and a byte-sequence +\item Encoding is a one-to-one map between a typographical character and a byte-sequence \item Decoding is its reverse map %\item The \emph{type()} of a byte-sequence is bytes \end{itemize} \small -\begin{tabular}{|c||c|c|c|}\hline +\begin{tabular}{|c||c|c|c|}\hline % & \multicolumn{3}{|c|}{bytes} \\ \hline char & ascii & utf-8 & cp1252 \\ \hline -a & [97] & [97] & [97] \\ \hline +a & [97] & [97] & [97] \\ \hline $\ddot{u}$ & - & [195, 188] & [252] \\ \hline %\`{e} & - & [196, 168] & [232]\\ \hline \end{tabular} @@ -157,13 +157,13 @@ \section{Encoding: 10'} \iffalse \begin{pyframe}{De} \begin{itemize} -\item A string is a couple: (bytes, encoding) +\item A string is a couple: (bytes, encoding) \item The same string can be encoded using different maps. \end{itemize} \begin{table} -\begin{tabular}{|c|l|} \hline -encoding & the string S\pyver{\"u}d results in bytes \\ \hline +\begin{tabular}{|c|l|} \hline +encoding & the string S\pyver{\"u}d results in bytes \\ \hline utf-8 &([83, \pyver{195, 188}, 100] \\ cp1252 &([83, \pyver{252}, 100]\\ \hline @@ -178,9 +178,9 @@ \section{Encoding: 10'} \begin{center} \Large -\"{u} $\xmapsto[encode]{utf-8}$ - [\red{198}, \blue{188}] - $\xmapsto[decode]{cp1252}$ +\"{u} $\xmapsto[encode]{utf-8}$ + [\red{198}, \blue{188}] + $\xmapsto[decode]{cp1252}$ \red{\~{A}} \blue{$\sfrac{1}{4}$} \end{center} @@ -194,7 +194,7 @@ \section{Encoding: 10'} # To make python2 encoding-aware we should from __future__ import unicode_literals -# Create 3 windows-encoded filenames in +# Create 3 windows-encoded filenames in basedir = "/tmp/py" # using the provided function @@ -218,7 +218,7 @@ \section{Encoding: 10'} # $\emphred{UnicodeDecodeError:}$ 'ascii' codec can't decode $\pyver{byte 0xFC}$ # in position 2: ordinal not in range(128) -|\pyver{0xFC}| == 252 # remember the $\ddot{u}$ in cp1252 map? +|\pyver{0xFC}| == 252 # remember the $\ddot{u}$ in cp1252 map? \end{pycode*} \end{pyframe} @@ -234,18 +234,18 @@ \section{Encoding: 10'} # we use $\pyver{"{!r}"}$.format to avoid further encoding # issues when printing or logging print("file: {!r}".format(utf_path)) - + \end{pycode*} \end{pyframe} \fi \begin{pyframe}{Encoded filenames: glob} \begin{pycode*}{escapeinside=||} -from glob import glob as ls # expands wildcards like a shell. +from glob import glob as ls # expands wildcards like a shell. files = ls("/tmp/py/*.txt") # To avoid encoding issues ... # $\red{UnicodeDecodeError:}$ 'ascii' codec can't decode $\pyver{byte 0xFC}$ -|\pyver{0xFC}| == 252 # remember the $\ddot{u}$ in cp1252 map? +|\pyver{0xFC}| == 252 # remember the $\ddot{u}$ in cp1252 map? files = ls(|\pyver{b}|"/tmp/py/*.txt") #..we explicitly use bytes @@ -268,7 +268,7 @@ \section{Encoding: 10'} bytebasedir = bytes(basedir) list_files(basedir) # which one ... list_files(bytebasedir) # ...will work? - + \end{pycode} \end{pyframe} \fi diff --git a/python-for-sysadmin/slide/intro.tex b/python-for-sysadmin/slide/intro.tex index 572f418..d06f703 100644 --- a/python-for-sysadmin/slide/intro.tex +++ b/python-for-sysadmin/slide/intro.tex @@ -21,7 +21,7 @@ \section{Intro} \begin{pyframe}{Requirements} \begin{itemize} -\item Docker and docker-compose with python 2.7+ +\item Docker and docker-compose with python 2.7+ \item course code from github \\\\ \end{itemize} diff --git a/python-for-sysadmin/slide/ipython.tex b/python-for-sysadmin/slide/ipython.tex index 451c37c..69b5a08 100644 --- a/python-for-sysadmin/slide/ipython.tex +++ b/python-for-sysadmin/slide/ipython.tex @@ -4,13 +4,13 @@ \section{ipython} \begin{pyframe}{iPython I} \begin{itemize} -\item Interactive interpreter with tons of functionalities, and the main tool of our training. +\item Interactive interpreter with tons of functionalities, and the main tool of our training. \item The most fun way to learn and use python! -\item Supports \pyver{tab-completion}, \pyver{readline}, inline help +\item Supports \pyver{tab-completion}, \pyver{readline}, inline help -\item Allows pasting from clipboard with \pyver{\%paste} , - %elementary benchmarking with \pyver{\%timeit}, +\item Allows pasting from clipboard with \pyver{\%paste} , + %elementary benchmarking with \pyver{\%timeit}, and multi-line editing with \pyver{\%edit} \item Run it enabling plotting support: \\ @@ -37,13 +37,13 @@ \section{ipython} \begin{pyframe}{iPython III} \begin{pycode*}{escapeinside=||} -# returned objects can be filtered with +# returned objects can be filtered with ret.|\pyver{grep}|('localhost') # Now get the first space-splitted column of the output ret.|\pyver{fields}|(0) ret.grep('localhost').fields(0) -# And the last returned value is stored in +# And the last returned value is stored in localip = _ # We can type long commands in an editor like `vi' using @@ -52,6 +52,5 @@ \section{ipython} \end{pycode*} %# An ipython script $must$ have the $\pyver{.ipy}$ extension -%# and begin with #!/usr/bin/ipython +%# and begin with #!/usr/bin/ipython \end{pyframe} - diff --git a/python-for-sysadmin/slide/nosetesting.tex b/python-for-sysadmin/slide/nosetesting.tex index 535c96f..e9e3386 100644 --- a/python-for-sysadmin/slide/nosetesting.tex +++ b/python-for-sysadmin/slide/nosetesting.tex @@ -22,10 +22,10 @@ \section{Nosetest Intermezzo: 15'} \item Now run the following command from a shell \begin{minted}{bash} -# nosetests -vs 03_parsing_test.py -03_parsing_test.test_sent ... ok -03_parsing_test.test_delivered ... ok -Ran 2 tests in 0.001s +# nosetests -vs 03_parsing_test.py +03_parsing_test.test_sent ... ok +03_parsing_test.test_delivered ... ok +Ran 2 tests in 0.001s \end{minted} \item Nose is a test framework. \item Nose runs every file matching test\_* @@ -43,10 +43,10 @@ \section{Nosetest Intermezzo: 15'} print("after all tests") def test_one(): # name a function like test_* to run it! - assert 1 == 1 + assert 1 == 1 def test_two(): # and use assert to test for success - assert 1 == 0, "I was expecting 0" + assert 1 == 0, "I was expecting 0" \end{pycode} \end{itemize} \end{pyframe} @@ -58,7 +58,7 @@ \section{Nosetest Intermezzo: 15'} \begin{pycode} class Test(object): @classmethod - def setup_class(self): # is run once at startup, + def setup_class(self): # is run once at startup, # ..eg. to create database structure print("setup testsuite environment") open("/tmp/test2.out", "w").write("0") @@ -68,8 +68,8 @@ \section{Nosetest Intermezzo: 15'} print("cleanup testsuite environment") os.unlink("/tmp/test2.out") - -\end{pycode} + +\end{pycode} \end{itemize} \end{pyframe} @@ -80,15 +80,15 @@ \section{Nosetest Intermezzo: 15'} class Test(object): ... # Using a Test class... - def setup(self): + def setup(self): print("is_run_before_every_test") #..and.. - def teardown(self): + def teardown(self): print("after_every_test") # eg truncate a table # each test can use the prepared environment - def test_a(self): + def test_a(self): assert os.path.isfile("/tmp/test2.out") - + \end{pycode} \end{itemize} \end{pyframe} diff --git a/python-for-sysadmin/slide/parsing.tex b/python-for-sysadmin/slide/parsing.tex index 7298224..4932165 100644 --- a/python-for-sysadmin/slide/parsing.tex +++ b/python-for-sysadmin/slide/parsing.tex @@ -36,10 +36,10 @@ \section{Parsing: 60'} \begin{pyframe}{Parsing postfix logs} \begin{pycode} # Before writing the parser, collect samples of -# the interesting lines. For now just +# the interesting lines. For now just from course import mail_sent, mail_delivered -# and \%edit a simple +# and \%edit a simple def test_sent(): hour, host, to = parse_line(mail_sent) assert hour == '08:00:00' @@ -54,7 +54,7 @@ \section{Parsing: 60'} \begin{pycode*}{escapeinside=||} mail_sent.split() # Start using basic strings in ipython -# Then tie them with zip/zip() +# Then tie them with zip/zip() fields, counting = _, zip(range(20), _) fields = fields[:7] # We just care for the first 7 values @@ -108,7 +108,7 @@ \subsection{Regular Expressions} # Let's gather some ping stats if sys.platform.startswith('win'): - cmd = "ping -n10 www.google.it" + cmd = "ping -n10 www.google.it" else: cmd = "ping -c10 -w10 www.google.it" @@ -121,7 +121,7 @@ \subsection{Regular Expressions} %if sys.platform.startswith('linux'): % cmd = "ping -c10 -w10 www.google.it" %elif sys.platform.startswith('win'): -% cmd = "ping -n10 www.google.it" +% cmd = "ping -n10 www.google.it" %else: # 'darwin' in sys.platform? % raise ValueError("Are you really using OSX?") % @@ -129,16 +129,16 @@ \subsection{Regular Expressions} \begin{pycode} from re import findall # can be misused too ;) -# eg. for adding the ":" to a +# eg. for adding the ":" to a mac = "00""24""e8""b4""33""20" -# ...using this +# ...using this re_hex = '[0-9A-Fa-f]{2}' mac_address = ':'.join(findall(re_hex, mac)) print("The mac address is ", mac_address) \end{pycode} -\emph{Actually this does a bit of validation, +\emph{Actually this does a bit of validation, requiring all chars to be in the 0-F range} \end{pyframe} @@ -170,7 +170,7 @@ \subsection{Regular Expressions} \begin{pyframe}{Benchmarking in iPython II} -Or find other methods: +Or find other methods: \begin{itemize} \item complex... \begin{pycode} diff --git a/python-for-sysadmin/slide/path_management.tex b/python-for-sysadmin/slide/path_management.tex index 2df547c..1126151 100644 --- a/python-for-sysadmin/slide/path_management.tex +++ b/python-for-sysadmin/slide/path_management.tex @@ -14,14 +14,14 @@ \section{Path management: 10'} \begin{pyframe}{Path management: os.path, sys} % This slide is the core one. Required for data gathering! \begin{pycode*}{escapeinside=||} -basedir, hosts = "/", "etc/hosts" +basedir, hosts = "/", "etc/hosts" # Check the hosting platform with the sys module from sys import platform if platform.startswith('win'): basedir = 'c:/windows/system32/drivers' # Always use the os.path module! -from os.path import join, normpath +from os.path import join, normpath hosts = join(basedir, hosts) hosts = normpath(hosts) print("Normalized path is", hosts) @@ -37,7 +37,7 @@ \section{Path management: 10'} \item multiplatform \item safe \end{itemize} - + \item \emph{join} removes redundant "/" \item \emph{normpath} fixes "/" orientation and redundant ".." \item \emph{realpath} resolves symlinks @@ -48,13 +48,13 @@ \section{Path management: 10'} \begin{pyframe}{Move trees: shutil, os, os.path} \begin{pycode} from os import makedirs # ...tree creation... -from os.path import isdir # ...checking... -from shutil import copytree, rmtree +from os.path import isdir # ...checking... +from shutil import copytree, rmtree makedirs("/tmp/py/foo/bar") # We can copy a whole tree and test it -copytree("/tmp/py/foo", "/tmp/py/foo2") -assert isdir("/tmp/py/foo2/bar") +copytree("/tmp/py/foo", "/tmp/py/foo2") +assert isdir("/tmp/py/foo2/bar") rmtree("/tmp/py/foo") # ... and finally delete it assert not isdir("/tmp/py/foo/bar") @@ -67,14 +67,13 @@ \section{Path management: 10'} # We can use exception handlers to investigate errors try: # python2 does not allow to ignore existing directories... - |\typeonly{makedirs}|("/tmp/py/foo/bar") + |\typeonly{makedirs}|("/tmp/py/foo/bar") # ...and raises an OSError except OSError as e: # Just use the errno module to check the error value import errno assert e.errno == errno.EEXIST - + help(makedirs) \end{pycode*} \end{pyframe} - diff --git a/python-for-sysadmin/slide/statistics.tex b/python-for-sysadmin/slide/statistics.tex index acc65c7..3f00f34 100644 --- a/python-for-sysadmin/slide/statistics.tex +++ b/python-for-sysadmin/slide/statistics.tex @@ -74,7 +74,7 @@ \subsection{Distributions} \begin{pyframe}{Distributions: set, defaultdict} -A distribution or $\delta$ shows the frequency of events, like +A distribution or $\delta$ shows the frequency of events, like how many people ate $x$ chickens ;) \begin{columns} \column[t]{.6\textwidth} @@ -88,14 +88,14 @@ \subsection{Distributions} d = defaultdict(int) for x in rtt: distro[x] += 1 - + \end{pycode} \column[t]{.4\textwidth} \footnotesize Distributions and Mean are both important! -%\includegraphics[height=6cm, width=7cm]{ping_distribution.pdf} +%\includegraphics[height=6cm, width=7cm]{ping_distribution.pdf} \includegraphics[height=5.5cm, width=7cm]{histo_gauss.pdf} \end{columns} \end{pyframe} @@ -109,9 +109,9 @@ \subsection{Deviation} \item Standard deviation or $\sigma$ formula is {\large $\sigma^{2}(X) := \frac{ \sum(x-\bar{x})^{2} }{n} $ } \item $\sigma$ tells if $\delta$ is fair or not, and how much the mean ($\bar{x}$) is representative \item \pymodule{matplotlib.mlab}.normpdf is a smooth function approximating the histogram -% Gauss function smoothly approximates the histogram {\Large -% $ \frac{n}{\sigma \sqrt{2\pi}}e^{-\frac{1}{2} \big( \frac{x-\bar{x}} {\sigma} \big)^{2} } $ -%} +% Gauss function smoothly approximates the histogram {\Large +% $ \frac{n}{\sigma \sqrt{2\pi}}e^{-\frac{1}{2} \big( \frac{x-\bar{x}} {\sigma} \big)^{2} } $ +%} \end{itemize} \column[t]{.6\textwidth} @@ -131,8 +131,8 @@ \subsection{Deviation} \begin{pyframe}{Simple processing: scipy} -Check your computed values vs the $\sigma$ returned by ping -(didn't you notice ping returned it?) +Check your computed values vs the $\sigma$ returned by ping +(didn't you notice ping returned it?) \begin{pycode*}{escapeinside=||} """goal: remember to convert to numeric / float goal: use scipy @@ -152,7 +152,7 @@ \subsection{Deviation} \begin{pyframe}{Time Distributions: Exercise} \begin{itemize} \item Parse the \href{https://github.com/ioggstream/python-course/blob/master/python-for-sysadmin/data/maillog}{provided maillog} in ipython using its ! magic and get an hourly email $\delta$ -\item Expected output: +\item Expected output: \begin{pycode} time_d = { # mail delivered (removed) between 0: xxx # 00:00 - 00:59 @@ -162,16 +162,16 @@ \subsection{Deviation} \end{pycode} \end{itemize} \end{pyframe} - + \iftrue \begin{pyframe}{Time Distributions: Exercise Solution} %def get_slot(ts): % n = int(ts[:2]) % return n - (n%4) \begin{pycode} -# deliveder emails are like the following +# deliveder emails are like the following #May 14 16:00:04 rpolli postfix/qmgr[122]: 4DC3DA: removed" - + ret = !grep removed maillog # get the interesting lines ts = ret.fields(2) # find the timestamp (3rd column) @@ -181,7 +181,7 @@ \subsection{Deviation} \end{pycode} \end{pyframe} -\fi +\fi \begin{pyframe}{Plotting distributions} \begin{columns} @@ -192,11 +192,11 @@ \subsection{Deviation} # and set the interactive mode plt.ion() -# Plotting an histogram... +# Plotting an histogram... frequency, bins, _ = hist(hours) -# .. returns a -distribution = dict(zip(slots, +# .. returns a +distribution = dict(zip(slots, frequency)) \end{pycode} \column[t]{.4\textwidth} @@ -245,10 +245,10 @@ \subsection{Correlation} \begin{pycode} # Let's plot the following datasets # taken from a 4-hour distribution -mail_sent = [1, 5, 500, 250, 100, 7] +mail_sent = [1, 5, 500, 250, 100, 7] kB_s = [70, 300, 29000, 12500, 450, 500] -# A scatter plot can suggest relations +# A scatter plot can suggest relations # between data plt.scatter(mail_sent, kB_s) @@ -266,11 +266,11 @@ \subsection{Correlation} \begin{pyframe}{Linear Correlation} -The Pearson Coefficient $\rho$ is a relation indicator. +The Pearson Coefficient $\rho$ is a relation indicator. \begin{description} \item[0] no relation \item[1] direct relation (both dataset increase together) -\item[-1] inverse relation (one increase as the other decrease) +\item[-1] inverse relation (one increase as the other decrease) \end{description} \begin{equation} \rho(X,Y) = \frac{ @@ -389,7 +389,7 @@ \subsection{Plotting Time} list(_) # ... which iterates to... > [[0, 1, 2, 3], # Plotted in Red [4, 5, 6, 7], # ..Green - [8, 9]] # ..Blue + [8, 9]] # ..Blue \end{pycode*} \end{pyframe} \fi @@ -415,6 +415,3 @@ \subsection{Plotting Time} plt.savefig("timed_{}_{}.png".format(k1, k2)); plt.close() \end{pycode*} \end{pyframe} - - - diff --git a/python-for-sysadmin/test_prerequisites.py b/python-for-sysadmin/test_prerequisites.py index 3e296c8..2f4d61d 100644 --- a/python-for-sysadmin/test_prerequisites.py +++ b/python-for-sysadmin/test_prerequisites.py @@ -31,21 +31,22 @@ def test_imports(): def test_further(): required = [ - '__future__:print_function unicode_literals division', - 'collections:defaultdict', - 'glob:glob', - 'itertools:combinations', - 'os:listdir makedirs', - 'os.path:expanduser isdir join', - 're:findall match', - 'scipy:std mean', - 'scipy.stats.stats:pearsonr', - 'shutil:copytree rmtree', - 'subprocess:check_output', - 'sys:version_info', - 'telnetlib:Telnet', - 'matplotlib:pyplot mlab', - 'time:sleep'] + "__future__:print_function unicode_literals division", + "collections:defaultdict", + "glob:glob", + "itertools:combinations", + "os:listdir makedirs", + "os.path:expanduser isdir join", + "re:findall match", + "scipy:std mean", + "scipy.stats.stats:pearsonr", + "shutil:copytree rmtree", + "subprocess:check_output", + "sys:version_info", + "telnetlib:Telnet", + "matplotlib:pyplot mlab", + "time:sleep", + ] for m in required: m, ps = m.split(":", 1) for p in ps.split(): diff --git a/scaling-mysql-with-python/00-intro.md b/scaling-mysql-with-python/00-intro.md index c816bab..cbc5ff2 100644 --- a/scaling-mysql-with-python/00-intro.md +++ b/scaling-mysql-with-python/00-intro.md @@ -6,10 +6,10 @@ ## Who? What? Why? -**Roberto Polli** - Solutions Architect @ par-tec.it. Loves writing in C, +**Roberto Polli** - Solutions Architect @ par-tec.it. Loves writing in C, Java and Python. Red Hat Certified Engineer and Virtualization Administrator. -**Par-Tec** – Proud sponsor of this talk ;) Contributes to various FLOSS. +**Par-Tec** – Proud sponsor of this talk ;) Contributes to various FLOSS. Provides: - IT Infrastructure \& Services expertise; @@ -17,4 +17,3 @@ Java and Python. Red Hat Certified Engineer and Virtualization Administrator. - Vertical Applications for the financial market. **Manage, replicate, scale** MySQL is easy with **python** (and Docker). - diff --git a/scaling-mysql-with-python/01-utilities.md b/scaling-mysql-with-python/01-utilities.md index 646f73a..cfefecd 100644 --- a/scaling-mysql-with-python/01-utilities.md +++ b/scaling-mysql-with-python/01-utilities.md @@ -1,4 +1,4 @@ -#MySQL +#MySQL ##MySQL @@ -7,9 +7,9 @@ * Connection + SQL * Storage Backend - Greatly improved in 5.6 - - More to come in 5.7: Dynamic Buffers \& Multi\-source replication - - + - More to come in 5.7: Dynamic Buffers \& Multi\-source replication + + ##MySQL Many Backends aka Storage Engines: @@ -29,23 +29,23 @@ Replication based on changelog files (binary logs). \column[t]{.5\textwidth} Monitor: - - Database size: Tables, Indexes, + - Database size: Tables, Indexes, Binary Logs - + - Replication inconsistencies - + - Failover \column[t]{.5\textwidth} Connect: - - Native Drivers - + - Native Drivers + * for Python 2.6, 2.7 and 3.3 * SSL \& compression - + - Orchestrate - + \columnsend @@ -61,7 +61,7 @@ A python package with **utilities, drivers, fabric orchestrator** \columnsbegin \column{.5\textwidth} - $ wget http://bit.ly/1CxNuZe + $ wget http://bit.ly/1CxNuZe $ tar xf mysql-utilities-1.6.1.tar.gz $ cd mysql-utilities-1.6.1 $ python setup.py install @@ -89,26 +89,26 @@ Start with ```mysqluc``` for a single entrypoint - entrypoint for all utilities - contextual help - TAB completion - + Or access each utility separately. Specify server URIs as `user:pass@host[:port]`. - + ##MySQL Utilities - mysqluc> help utilities - - Utility Description + mysqluc> help utilities + + Utility Description ----------------- -------------------------------------------------------- - mysqlauditadmin audit log maintenance utility - mysqlauditgrep audit log search utility + mysqlauditadmin audit log maintenance utility + mysqlauditgrep audit log search utility ... - mysqldbcompare compare databases for consistency + mysqldbcompare compare databases for consistency ... - mysqldiskusage show disk usage for databases - mysqlfailover automatic replication health monitoring and failover + mysqldiskusage show disk usage for databases + mysqlfailover automatic replication health monitoring and failover ##Disk Usage @@ -133,14 +133,14 @@ A single command to show all disk usage infos (excluded system logs) ## Connectors from django.db.backends import BaseDatabaseValidation - + if django.VERSION < (1, 7): from django.db import models else: from django.core import checks from django.db import connection - - + + class DatabaseValidation(BaseDatabaseValidation): if django.VERSION < (1, 7): @@ -151,7 +151,7 @@ A single command to show all disk usage infos (excluded system logs) Replication is $asynchronous$ or $semi-synchronous$. A Master with a Unique Server ID - + - produces a changelog named **binary log**; - assign each transaction a Global Transaction ID; - grants access to a $replica$ user; @@ -172,7 +172,7 @@ Slave - retrieves the binlog; - applies the changes; - $\forall$ slave $\exists !$ master; - + Optionally - forbids local changes from non-root users; @@ -190,15 +190,15 @@ master database first! ##Benefits of replication \columnsbegin \column[t]{.5\textwidth} - + * Availability. * Scaling reads with R/W split. - + * Scaling reads differencing indexes. * Backup and data warehouse strategies. - + \column[t]{.5\textwidth} # mysqlrplshow output @@ -224,7 +224,7 @@ Configuring replication with one command: # master uuid = 2cda700... # slave uuid = 7520cf0... # Checking for binary logging on master... - # Granting replication access to + # Granting replication access to # replication user... # Connecting slave to master... # CHANGE MASTER TO MASTER_HOST = '172.17.0.5',... @@ -245,19 +245,19 @@ Beware! 1. Avoid replicating user provisioning and other host-related setup! @SESSION.SQL_LOG_BIN=0; - + 2. Binlogs are usually retained for a fixed period - eg 15days. -To provision new slave after that period you must: - +To provision new slave after that period you must: + - start from a backup or a snapshot; - apply the binlogs. - + mysqldbexport >> data.sql --server=root:pass@master --rpl-user=repl:rpass \ --export=both --rpl=master --all mysqldbimport --server=root:pass@slave data.sql - - + + #Failover ##Failover Basics @@ -266,18 +266,18 @@ From replication to high availability, automagically discovering slaves. \columnsbegin \column[t]{.5\textwidth} - + - $promote$ the most updated slave - reconfigure the others - disable the master - eventually fix ip-address \includegraphics[width=3.5cm]{images/mysql-failover-1.png} - + \column[t]{.5\textwidth} - + # Read carefully the docs of - # mysqlfailover and of all + # mysqlfailover and of all # the supported parameters! mysqlfailover --master=$MASTER \ --discover-slaves-login=root:password \ diff --git a/scaling-mysql-with-python/02-fabric.md b/scaling-mysql-with-python/02-fabric.md index 4c468ca..e865205 100644 --- a/scaling-mysql-with-python/02-fabric.md +++ b/scaling-mysql-with-python/02-fabric.md @@ -1,7 +1,7 @@ -# Fabric +# Fabric ##Fabric Orchestrator -You can try the content of those slides downloading +You can try the content of those slides downloading code and baked docker images from here: git clone https://github.com/ioggstream/mysql-community @@ -54,14 +54,14 @@ Configure in `/etc/fabric.cfg` - admin user (eg. $fabric$ to manage servers) - applicative user credentials - db to store fabric data - -Setup and start the service + +Setup and start the service mysqlfabric manage setup mysqlfabric manage start --daemon -## Replication Groups +## Replication Groups Groups are managed via @@ -75,7 +75,7 @@ servers. \column[t]{0.8\textwidth} mysqlfabric group create $GROUP - mysqlfabric group add $GROUP my-host-1:3306 + mysqlfabric group add $GROUP my-host-1:3306 mysqlfabric group add $GROUP my-host-2:3306 mysqlfabric group add $GROUP my-host-3:3306 @@ -86,7 +86,7 @@ servers. ##Replication Groups Promote one server as a master, eventually picking one. - + mysqlfabric group promote $GROUP [--slave_id=UUID] Show the server group @@ -103,16 +103,16 @@ Show the server group ##Replication Groups Fabric support spare servers. - + mysqlfabric server set_status $UUID spare -Monitoring failover and deactivating the master. - +Monitoring failover and deactivating the master. + mysqlfabric group activate $GROUP mysqladmin -h $MASTER shutdown - + Checking group health we'll see that... - + mysqlfabric group health ha uuid is_alive status ..error status..io_error sql_error @@ -123,13 +123,13 @@ Checking group health we'll see that... ## Connecting programmatically - + from mysql.connector import connect, fabric # Ask for a connection to the fabric server. c = connect(fabric={host: .., port: .., user: ..}, autocommit=True, database='sample', **sql_user) - + # Fabric will point you to a suitable host # - in this case the master - of the given # group @@ -140,7 +140,7 @@ Checking group health we'll see that... ## Provisioning a new slave Fabric uses `mysqldump` + `mysql` internally to clone a new slave. - # Always reset TARGET configuration + # Always reset TARGET configuration # before reinitializing mysql -e ' SET @SESSION.SQL_LOG_BIN=0; @@ -156,10 +156,10 @@ Cloning doesn't attach the server to a group, nor starts the replica. ## Reingesting a failed master Reingesting a failed master is not trivial. - + - non-replicated transactions; - corrupt data; - + Always reset it! mysqlfabric server set_status f484...110039 spare @@ -196,15 +196,15 @@ We implemented a DockerProvider: deploy containers, not machines. ## Docker Provisioning # Register a provider (requires docker in http) - mysqlfabric provider register mydocker - user password - http://172.17.42.1:2375 + mysqlfabric provider register mydocker + user password + http://172.17.42.1:2375 --provider_type=DOCKER # Create or remove Containers - mysqlfabric server create mydocker + mysqlfabric server create mydocker --image=name=ioggstream/mysql-community - --flavor=name=v1 + --flavor=name=v1 --meta=command="mysqld --log-bin=foo" # List servers @@ -214,10 +214,10 @@ We implemented a DockerProvider: deploy containers, not machines. ## Next steps Openstack interface supports machine snapshots via NovaClient. -Docker volumes doesn't support snapshots, but something is moving +Docker volumes doesn't support snapshots, but something is moving (in the experimental tree). -VM Snapshot alternatives require root access to docker host +VM Snapshot alternatives require root access to docker host and a FLUSH TABLES on the source container: - rsync on volumes @@ -232,11 +232,11 @@ and a FLUSH TABLES on the source container: - Don't re-ingest failed masters (luckily;) - Try Fabric with Docker! - Play with docker volumes - + ## That's all folks! -Thank you for the attention! +Thank you for the attention! \insertauthor diff --git a/scaling-mysql-with-python/Makefile b/scaling-mysql-with-python/Makefile index 12a13da..a0dcda5 100644 --- a/scaling-mysql-with-python/Makefile +++ b/scaling-mysql-with-python/Makefile @@ -10,4 +10,4 @@ export TEXINPUTS = .:../texinputs/:./images/:/tmp/tox: include ../texinputs/Makefile training: 99-training.md.tex - pdflatex --shell-escape -interaction=nonstopmode training.tex + pdflatex --shell-escape -interaction=nonstopmode training.tex diff --git a/scaling-mysql-with-python/main.tex b/scaling-mysql-with-python/main.tex index 717813a..5db2da1 100644 --- a/scaling-mysql-with-python/main.tex +++ b/scaling-mysql-with-python/main.tex @@ -40,4 +40,3 @@ \input{tmpme.tex.tmp} \end{document} - diff --git a/scaling-mysql-with-python/main_training_mysql._md b/scaling-mysql-with-python/main_training_mysql._md index 318346b..f1e06b2 100644 --- a/scaling-mysql-with-python/main_training_mysql._md +++ b/scaling-mysql-with-python/main_training_mysql._md @@ -462,11 +462,11 @@ mysqldbcopy --source=$MASTER --destination=$SLAVE \iffalse ##Provisioning a new slave Provision a new slave in two steps (eg. large database or requiring tweaks) - + - check that replica user is provisioned on the master; - create a custom dump.sql; - add --rpl=master; - + \begin{minted} cat > data.sql < .6: print("Series", k1, k2, "can be correlated", corr) elif prob < 0.05: print("Series", k1, k2, "probability lower than 5%%", prob) - + \end{pycode} \end{pyframe} @@ -250,7 +250,7 @@ \section{Intro} plt.xlabel(k1); plt.ylabel(k2) # save and close the plot - plt.savefig("{}_{}.png".format(k1, k2)); plt.close() + plt.savefig("{}_{}.png".format(k1, k2)); plt.close() \end{pycode} \end{pyframe} @@ -265,14 +265,14 @@ \section{Intro} colors = cycle("rgb") # use more than 3 colors! labels = cycle("morning afternoon night".split()) size = datalen / 3 # 3 colors, right? -for (k1,v1), (k2,v2) in combinations(T.items(), 2): - [ plt.scatter(|\pyver{t1[i:i+size]}|, t2[i:i+size], - color=next(colors), +for (k1,v1), (k2,v2) in combinations(T.items(), 2): + [ plt.scatter(|\pyver{t1[i:i+size]}|, t2[i:i+size], + color=next(colors), label=next(labels) ) for i in range(0, datalen, size) ] # set title, save plot & co - + \end{pycode*} \end{pyframe} @@ -291,7 +291,7 @@ \section{Intro} \begin{itemize} \item Latency wasn't related to packet size or system throughput \item Errors were not related to packet size -\item Discovered system throughput +\item Discovered system throughput \end{itemize} \end{pyframe} diff --git a/texinputs/Makefile b/texinputs/Makefile index 8f8109c..fde5dd0 100644 --- a/texinputs/Makefile +++ b/texinputs/Makefile @@ -30,5 +30,3 @@ clean: *.snm *.toc *.vrb *.idx *.ind *.upa \ *.md.tex *.tmp *.stderr \ main.pdf main.sh - - diff --git a/texinputs/README.md b/texinputs/README.md index 351f464..47473f5 100644 --- a/texinputs/README.md +++ b/texinputs/README.md @@ -9,7 +9,7 @@ all the [0-9]*.md.tex files generated by pandoc. # Columns You can define columns like the following - + \columnsbegin \column[t]{.5\textwidth} @@ -18,4 +18,4 @@ This is a top-aligned column \column[t]{.5\textwidth} Of a two-column page. -\columnsend \ No newline at end of file +\columnsend diff --git a/texinputs/babelstyle.tex b/texinputs/babelstyle.tex index 1e2da18..2b1aa7b 100644 --- a/texinputs/babelstyle.tex +++ b/texinputs/babelstyle.tex @@ -21,7 +21,7 @@ %\showboxbreadth=5 % Slides in 16:9 -\usepackage[orientation=landscape,size=custom,width=16,height=9,scale=0.5,debug]{beamerposter} +\usepackage[orientation=landscape,size=custom,width=16,height=9,scale=0.5,debug]{beamerposter} % % Macros @@ -52,13 +52,13 @@ % \newenvironment{pyframe}[1] {\begin{frame}[fragile,environment=pyframe]\frametitle{#1} - + } {\end{frame}} % environments -\newminted{py}{mathescape,escapeinside=||}% +\newminted{py}{mathescape,escapeinside=||}% % python highlights: module, method diff --git a/texinputs/minted.sty b/texinputs/minted.sty index 6a7d338..c437466 100644 --- a/texinputs/minted.sty +++ b/texinputs/minted.sty @@ -6,7 +6,7 @@ %% %% minted.dtx (with options: `package') %% Copyright 2010--2011 Konrad Rudolph -%% +%% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 %% of this license or (at your option) any later version. @@ -14,14 +14,14 @@ %% http://www.latex-project.org/lppl.txt %% and version 1.3 or later is part of all distributions of LaTeX %% version 2005/12/01 or later. -%% +%% %% Additionally, the project may be distributed under the terms of the new BSD %% license. -%% +%% %% This work has the LPPL maintenance status `maintained'. -%% +%% %% The Current Maintainer of this work is Konrad Rudolph. -%% +%% %% This work consists of the files minted.dtx and minted.ins %% and the derived file minted.sty. \NeedsTeXFormat{LaTeX2e} diff --git a/texinputs/test.tex b/texinputs/test.tex index 0e9ff90..f475a27 100644 --- a/texinputs/test.tex +++ b/texinputs/test.tex @@ -4,7 +4,7 @@ \title{Test Python Style} \subtitle{EuroPython 2014, $24^{th}$ July - Berlin} -\author{Roberto Polli - +\author{Roberto Polli - \href{mailto:roberto.polli@babel.it}{roberto.polli@babel.it}} \date{24 July 2014} \institute{Babel Srl P.zza S. Benedetto da Norcia, 33\\ 00040, Pomezia (RM) – www.babel.it} @@ -33,4 +33,3 @@ \end{document} - diff --git a/texinputs/teststyle.tex b/texinputs/teststyle.tex index 7853b09..7ea46de 100644 --- a/texinputs/teststyle.tex +++ b/texinputs/teststyle.tex @@ -25,7 +25,7 @@ \section{Test} # $a \rightarrow b^{c}$ |\index{return}return| False \end{pycode*} -\item Bullet Item 3 +\item Bullet Item 3 \end{itemize} \end{pyframe} @@ -35,12 +35,12 @@ \section{Test} \begin{enumerate} \item EnumerateA \pyver{w\"urstel re}sults \item \texttt{Inline minted ipython} - \item Una linea + \item Una linea \item w\"urstelstra\ss e \end{enumerate} -\item Enumerate2 \`{e} - [\red{196}, \blue{168}] +\item Enumerate2 \`{e} + [\red{196}, \blue{168}] \begin{pycode*}{escapeinside=||} @|\pyver{decorator}| def foo(tmp): @@ -57,13 +57,13 @@ \section{Test} A Tabular follows \\ \begin{tabular}{|c|c|}\hline Cell 1 & Cell 2 \\ -\hline +\hline \end{tabular} \\ \begin{table} \begin{tabular}{|c|c|}\hline \includegraphics[height=4cm]{ping_distribution.pdf} & \includegraphics[height=4cm]{ping_distribution.pdf} \\ -\hline +\hline \end{tabular} \end{table} \end{pyframe} @@ -74,20 +74,20 @@ \section{Test} \begin{pycode} """using set and dict """ -distro = {x: rtt.count(x) +distro = {x: rtt.count(x) for x in set(rtt)} # or using a from collections import defaultdict distro = defaultdict(int) for x in rtt: distro[x] += 1 - + \end{pycode} \column[t]{5cm} -skip-\\ -skip-\\ -\includegraphics[height=4cm, width=4dm]{ping_distribution.pdf} +\includegraphics[height=4cm, width=4dm]{ping_distribution.pdf} \end{columns} \end{pyframe} @@ -107,7 +107,7 @@ \section{Test} \end{verbatim} \column[t]{5cm} -\includegraphics[height=4cm,width=5cm]{ping_distribution.pdf} +\includegraphics[height=4cm,width=5cm]{ping_distribution.pdf} \end{columns} \end{pyframe} @@ -119,7 +119,7 @@ \section{Test} \column[t]{6cm} \begin{pycode} """using set and dict """ -distro = {x: rtt.count(x) +distro = {x: rtt.count(x) for x in set(rtt)} # or using a from collections import defaultdict @@ -128,7 +128,7 @@ \section{Test} distro[x] += 1 \end{pycode} \column[t]{4cm} -\includegraphics[width=4cm,height=4cm]{ping_distribution.pdf} +\includegraphics[width=4cm,height=4cm]{ping_distribution.pdf} \end{columns} \end{pyframe} diff --git a/tox-as-project-descriptor/Dockerfile b/tox-as-project-descriptor/Dockerfile index 64211f7..0b8d825 100644 --- a/tox-as-project-descriptor/Dockerfile +++ b/tox-as-project-descriptor/Dockerfile @@ -1,4 +1,3 @@ FROM python:{envname} RUN apt-get -y update && apt-get -y install python-pip - diff --git a/tox-as-project-descriptor/Makefile b/tox-as-project-descriptor/Makefile index f807c9a..7994ad9 100644 --- a/tox-as-project-descriptor/Makefile +++ b/tox-as-project-descriptor/Makefile @@ -1,6 +1,5 @@ prepare: - - python -c 'print open("Dockerfile").read().format(envname=2.7)' | docker build -t test-2.7 - + python -c 'print open("Dockerfile").read().format(envname=2.7)' | docker build -t test-2.7 - diff --git a/tox-as-project-descriptor/tox-grid.ini b/tox-as-project-descriptor/tox-grid.ini index 31d0474..8acf594 100644 --- a/tox-as-project-descriptor/tox-grid.ini +++ b/tox-as-project-descriptor/tox-grid.ini @@ -7,14 +7,14 @@ # # tox # # To pass arguments to test command, run: -# +# # # tox -- nose_args # [tox] # List all supported python implementations. envlist = py27-twisted{13,14}, python3, pypy -# Don't use distutils, because we're just +# Don't use distutils, because we're just # loading packages from the local directory. # More complex cases may require setuptools. skipsdist = True @@ -30,12 +30,12 @@ basepython = pypy: pypy # Use pip for dependency resolution. -deps = +deps = nose twisted13: twisted == 13 twisted14: twisted == 14 -setenv = +setenv = # Replace environment variables PYTHONPATH=:. # Append stuff to environment variables. diff --git a/tox-as-project-descriptor/tox-installcmd.ini b/tox-as-project-descriptor/tox-installcmd.ini index 51ba5e5..f0e9e28 100644 --- a/tox-as-project-descriptor/tox-installcmd.ini +++ b/tox-as-project-descriptor/tox-installcmd.ini @@ -7,14 +7,14 @@ # # tox # # To pass arguments to test command, run: -# +# # # tox -- nose_args # [tox] # List all supported python implementations. envlist = deps,py27 -# Don't use distutils, because we're just +# Don't use distutils, because we're just # loading packages from the local directory. # More complex cases may require setuptools. skipsdist = True @@ -26,7 +26,7 @@ skipsdist = True # Use pip for dependency resolution. deps = -rrequirements.txt -setenv = +setenv = # Replace environment variables PYTHONPATH=:. # Append stuff to environment variables. @@ -37,9 +37,8 @@ setenv = commands = nosetests {posargs} [testenv:deps] -whitelist_externals = +whitelist_externals = touch yum commands= - sudo yum -y install dstat - + sudo yum -y install dstat diff --git a/tox-as-project-descriptor/tox.ini b/tox-as-project-descriptor/tox.ini index bb1cc82..8b64a16 100644 --- a/tox-as-project-descriptor/tox.ini +++ b/tox-as-project-descriptor/tox.ini @@ -7,14 +7,14 @@ # # tox # # To pass arguments to test command, run: -# +# # # tox -- nose_args # [tox] # List all supported python implementations. envlist = py27-twisted{13,14}, py3, pypy -# Don't use distutils, because we're just +# Don't use distutils, because we're just # loading packages from the local directory. # More complex cases may require setuptools. skipsdist = True @@ -27,12 +27,12 @@ skipsdist = True deps = -rrequirements.txt # Forward environment. -passenv = +passenv = http_proxy https_proxy - + # Modify current environment. -setenv = +setenv = # Replace environment variables PYTHONPATH=:. # Append stuff to environment variables. diff --git a/tox-as-project-descriptor/tox_test.py b/tox-as-project-descriptor/tox_test.py index fbc42d4..919dce8 100644 --- a/tox-as-project-descriptor/tox_test.py +++ b/tox-as-project-descriptor/tox_test.py @@ -1,10 +1,8 @@ import os import sys -import pprint + def test_tox(): print("Command: ", sys.argv[0]) - for x in 'PYTHONPATH LD_LIBRARY_PATH'.split(): + for x in "PYTHONPATH LD_LIBRARY_PATH".split(): print(x, os.environ.get(x)) - - From d5bc268234bd50d8414ce5b2dfb7498390514d49 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 11 Oct 2021 15:51:05 +0200 Subject: [PATCH 18/52] More sparql. Pre-commit. (#57) --- .pre-commit-config.yaml | 62 +++++++++++++++++++++++++++++++++++ sparql-101/01-intro-jsonld.md | 4 +-- 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..a177b1d --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,62 @@ +# +# Run pre-commit hooks. You can run them without installing +# the hook with +# +# $ pre-commit run --all-files +# +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + args: [--allow-multiple-documents] + - id: check-added-large-files +- repo: https://github.com/myint/autoflake + rev: b330072a26bb13aea8843f8083cee5332d71f78f + hooks: + - id: autoflake + args: + - --in-place + - --remove-unused-variables + - --remove-all-unused-imports +- repo: https://github.com/psf/black + rev: 19.3b0 + hooks: + - id: black +- repo: https://github.com/pycqa/isort + rev: 5.8.0 + hooks: + - id: isort + name: isort (python) + # Use black profile for isort to avoid conflicts + # see https://github.com/PyCQA/isort/issues/1518 + args: ["--profile", "black"] + - id: isort + name: isort (cython) + types: [cython] + - id: isort + name: isort (pyi) + types: [pyi] +- repo: https://gitlab.com/pycqa/flake8 + rev: 3.9.0 + hooks: + - id: flake8 +- repo: https://github.com/PyCQA/bandit + rev: 1.7.0 + hooks: + - id: bandit + name: bandit + args: ["-c", ".bandit.yaml"] + description: 'Bandit is a tool for finding common security issues in Python code' + entry: bandit + language: python + language_version: python3 + types: [python] +- repo: https://github.com/Lucas-C/pre-commit-hooks-safety + rev: v1.2.1 + hooks: + - id: python-safety-dependencies-check diff --git a/sparql-101/01-intro-jsonld.md b/sparql-101/01-intro-jsonld.md index ec72ed5..c0486d2 100644 --- a/sparql-101/01-intro-jsonld.md +++ b/sparql-101/01-intro-jsonld.md @@ -286,7 +286,7 @@ Customer: ---- -E' anche possibile indicare un link +E' anche possibile indicare un link ``` # Associate a json-ld context to a schema Customer: @@ -340,7 +340,7 @@ paths: const: "@vocab": "https://w3id.org/italia/onto/CPV/" given_name: givenName - family_name: familyName + family_name: familyName - $ref: "#/components/schemas/Person" From b1c5d754d30d552981011e1bf890aaaf74a69022 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 8 May 2023 16:41:38 +0200 Subject: [PATCH 19/52] more sparql (#58) * foo * More stuff * add precommit --- sparql-101/01-intro-jsonld.md | 157 ++++++------------- sparql-101/02-sparql.md | 260 +++++++++++++++++++++++++++++++ sparql-101/03-syntax-semantic.md | 222 ++++++++++++++++++++++++++ 3 files changed, 529 insertions(+), 110 deletions(-) create mode 100644 sparql-101/02-sparql.md create mode 100644 sparql-101/03-syntax-semantic.md diff --git a/sparql-101/01-intro-jsonld.md b/sparql-101/01-intro-jsonld.md index c0486d2..107ba35 100644 --- a/sparql-101/01-intro-jsonld.md +++ b/sparql-101/01-intro-jsonld.md @@ -2,10 +2,11 @@ ## Agenda - - Semantics what? - - Triples & co - - Attaching semantics - - Graph databases +- Semantics what? +- Triples & co +- Attaching semantics +- Graph databases +- JsonLD *Beware*: commands contain small typos. You must fix them to properly complete the course! @@ -19,7 +20,6 @@ Prerequisites: --- - ## Intro: Semantics what? Semantics: the study of meaning. @@ -66,8 +66,6 @@ Per standardizzare semanticamente i servizi e i loro contenuti, si utilizzano st Ontologia: una ontologia è un insieme di assiomi logici che concettualizzano un dominio di interesse definendo dei concetti e la semantica delle relazioni tra essi. Quando le ontologie contengono ulteriori restrizioni (eg. vincoli allo schema) non sono propriamente vocabolari. ----- - Vocabolario controllato: un vocabolario dove i termini sono validati da un'autorità designata. Può essere di diversi tipi - eg. una lista (codelist), una struttura gerarchica (tassonomia), un glossario ed un tesauro (che aggiunge ad una tassonomia ulteriori vincoli). Esempi di vocabolari controllati europei si trovano qui https://op.europa.eu/en/web/eu-vocabularies/controlled-vocabularies ## Syntax standardization @@ -158,7 +156,8 @@ a partire da vocabolari di base. @prefix dct:   . https://w3id.org/italia/onto/CPV dct:modified  "2020-04-27"^^xsd:date ; -https://w3id.org/italia/onto/CPV dct:title     "Person Ontology"@en, "Ontologia delle persone"@it ; +https://w3id.org/italia/onto/CPV dct:title     "Person Ontology"@en, + "Ontologia delle persone"@it ; ``` @@ -166,13 +165,23 @@ https://w3id.org/italia/onto/CPV dct:title     "Person Ontology"@en, "Ontologi ### Json-LD -JSON-LD è un formato che permette di serializzare in JSON delle informazioni basate sul RDF data model. - https://www.w3.org/TR/json-ld11/#data-model. +JSON-LD è un formato che permette di serializzare in JSON delle informazioni basate sul +[RDF data model](https://www.w3.org/TR/json-ld11/#data-model). Un documento JSON-LD è quindi sia un documento RDF che JSON, e rappresenta un'istanza di un RDF data model. JSON-LD inoltre *estende* RDF per permettere la serializzazione di dataset RDF generalizzati. -Di seguito l'estratto di sopra serializzato in JSON-LD/yaml. + +---- +Dato un oggetto JSON + +``` +id: robipolli@gmail.com +given_name: Roberto +family_name: Polli +``` + +JSON-LD permette di trasformarlo in un grafo RDF associandogli un contesto. ``` "@context": @@ -197,8 +206,7 @@ https://schema.org/docs/jsonldcontext.jsonld È anche possibile ridefinire o localizzare i campi, eventualmente usando diversi namespace. - -``` +```yaml "@context": "sdo": "http://schema.org/" "nome":"sdo:name" @@ -217,7 +225,7 @@ eventualmente usando diversi namespace. JSON-LD supporta nativamente informazioni localizzate: -``` +```yaml -- come lista occupation: -  @value: "Student" @@ -228,7 +236,7 @@ occupation: oppure -``` +```yaml -- come oggetto @context:   occupation: @@ -240,7 +248,7 @@ occupation: oppure -``` +```yaml --- tramite elementi multipli, utile anche per la serializzazione di API semplici @context: occupation: {@language: en} @@ -250,110 +258,39 @@ occupation_fr: Etudiant ``` --- -### Json Schema e Json-LD - -Per validare un oggetto json-ld, serve risolvere -ricorsivamente tutte le referenze: -è complesso farlo in maniera sincrona. -Quando si crea un API, la semantica va -definita in fase di specifica -in modo da non dover risolvere a runtime -referenze ricorsive -ed evitare problemi come il "@context mangling". +#### Context mangling ----- +@context mangling: modificando il contesto di un oggetto +se ne altera il significato. -Un modo è associare un @context ad uno schema -integrandolo nella definizione attraverso -un valore `const`. -tramite un link -In questo caso, `pet` viene [disassociato dal vocabolario](https://w3c.github.io/json-ld-syntax/#example-25-using-the-null-keyword-to-ignore-data) - -``` -# Associate a json-ld context to a schema -Customer: -  type: object -  required: [email] -  properties: - "@context": - const: - "@vocab": "http://schema.org/" - pet: null - email: {type: string} -    pet: {type: string} +```yaml +payment_from: alice@foo.example +payment_to: bob@foo.example +"@context": https://payment/context.jsonld ``` ----- - -E' anche possibile indicare un link -``` -# Associate a json-ld context to a schema -Customer: -  type: object -  required: [email] -  properties: - "@context": - const: "https://api.example/customer-context.jsonld" - email: {type: string} -    pet: {type: string} -``` - - - ----- -O tramite `Link` header - -```http -HTTP/1.1 200 OK -Content-Type: application/json -Link: ; - rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json" - -{ "given_name": "Roberto", "family_name": "Polli" } -``` - ---- - -O tramite content-negotiation -ritornando più formati (json e json-ld) +Alterando la risposta del server https://payment/context.jsonld +possiamo invertire il verso del pagamento! +```yaml +@context: + payment_from: http://banking#debtor + payment_to: http://banking#creditor ``` -openapi: 3.0.1 -... -paths: - /users: - get: - ... - responses: - "200": - content: - application/json: - schema: - $ref: "#/components/schemas/Person" - application/ld+json: - schema: - allOf: - - type: object - properties: - "@context": - const: - "@vocab": "https://w3id.org/italia/onto/CPV/" - given_name: givenName - family_name: familyName - - $ref: "#/components/schemas/Person" +-> +```yaml +@context: + payment_to: http://banking#debtor + payment_from: http://banking#creditor ``` +---- -## API e Semantica - -Quando scambiamo informazioni tramite API -la semantica non è sempre chiara: - -- è implicita; -- è in qualche pdf/xls; -- non è machine readable. +Esistono diverse ipotesi tecnologiche basate +sull'elaborazione semantica dei dati a runtime. +Tutte queste implementazioni devono indirizzare +questo tipo di rischi. ---- diff --git a/sparql-101/02-sparql.md b/sparql-101/02-sparql.md new file mode 100644 index 0000000..d184303 --- /dev/null +++ b/sparql-101/02-sparql.md @@ -0,0 +1,260 @@ +# Graph databases & SparQL + +## Agenda + + - Storing and retrieving triples + - Virtuoso + - GraphDB + +*Beware*: commands contain small typos. You must fix them to properly complete the course! + +---- + +Prerequisites: + +- json, yaml, xmlschema +- HTTP, OpenAPI 3 +- SQL and database hints + + +--- + +## Graphs (again) + +A graph is a set (unordered) of triples. + +Each triple consists of a `subject`, `predicate`, `object`. + +Graph databases such as [Virtuoso (opensource)](), +[GraphDB (proprietary)](), +[Amazon Nepture (proprietary SaaS)]() +support the [SparQL]() language. +Other databases - [Neo4j (opensource)]() use +custom language. + +---- + +Let's populate some entries in SparQL +and see how it works. + +Open [sample.ttl](sample.ttl) and list +all entries + +```sparql +SELECT * WHERE { + ?subject ?predicate ?object +} +``` + +(describe sparql query) + +---- + +SparQL can then be used to correlate +entries using semantically defined +vocabularies such as FOAF. + +```sparql +@prefix foaf: . + +SELECT * WHERE { + ?s foaf:name ?o +} +``` + +| s | o | +| --- | --- | +| | "Roberto"| +| | "Jon"| + +In this case `foaf:name` has a very specific meaning. +You don't need to create indexes in your database +to search for specific predicates. + +---- + +Graph databases have an inference engine that can be used +to process complex queries. + +```sparql +@prefix foaf: . + +SELECT * WHERE { + ?s foaf:knows ?o +``` + +| s | o | +| --- | --- | +| r@example | j@example | + +---- + +And using multiple lines we can infer things +such as friend-of-a-friend emails. + +```sparql +@prefix foaf: . + +SELECT DISTINCT ?mail1, ?mail3 WHERE { + ?user1 foaf:knows ?user2 + . ?user2 foaf:knows ?user3 + + . ?user1 foaf:mbox ?mail1 + . ?user3 foaf:mbox ?mail3 +``` + +Note that the query describes each relation +ignoring the way data is stored. + +--- + +# Querying DBPedia + +[DBPedia](https://dbpedia.org/sparql) is a graph database with a lot of data inside. + +We can use it to learn sparql. + +- list concepts + +``` +select distinct ?Concept where {[] a ?Concept} LIMIT 20 +``` + +---- + +Now we want to list all `Person` + +```sparql +@prefix foaf: . + +SELECT DISTINCT * WHERE { + ?s a foaf:Person +} LIMIT 10 +``` + +---- + +All `Person`s born in Pisa + +```sparql + +@prefix foaf: . +@prefix dbp: . +@prefix dbr: . + +select distinct * where { + ?s a foaf:Person . + ?s dbp:birthPlace dbr:Pisa +} LIMIT 10 + +``` + +... with their deathplaces + +```sparql +@prefix foaf: . +@prefix dbp: . +@prefix dbr: . +@prefix dbo: . + + +select distinct * where { +?s a foaf:Person . +?s dbp:birthPlace dbr:Pisa . +?s dbp:deathPlace ?death_place +} LIMIT 10 +``` + +---- + +If deathplace is in UK + +```sparql + +@prefix foaf: . +@prefix dbp: . +@prefix dbr: . +@prefix dbo: . + +select distinct * where { + ?s a foaf:Person . + ?s dbp:birthPlace dbr:Rome . + ?s dbp:deathPlace ?deathPlace . + ?deathPlace dbo:country dbr:United_Kingdom +} LIMIT 50 + +``` + +---- + +We can extend the search to every person +born in Italy and dead in UK: + +- replacing `dbr:Rome` with `?birth_place` +- restricting `?birth_place` to `dbr:Italy` + +```sparql +@prefix foaf: . +@prefix dbp: . +@prefix dbr: . +@prefix dbo: . + +SELECT DISTINCT * WHERE { + +?s a foaf:Person . +?s dbp:birthPlace ?birth_place . +?s dbp:deathPlace ?deathPlace . + +?deathPlace dbo:country dbr:United_Kingdom . +?birth_place dbo:country dbr:Italy + +} LIMIT 50 +``` + +---- + +There's no limit to the inference, for example +we could require that the birthplace of that +person should match the one of a Pope. + +```sparql +@prefix foaf: . +@prefix dbp: . +@prefix dbr: . +@prefix dbo: . +@prefix rdf: . + +select distinct * where { + ?s a foaf:Person . + ?s dbp:birthPlace ?birth_place . + ?birth_place dbo:country dbr:Italy . + ?s dbp:deathPlace ?death_place . + ?death_place dbo:country dbr:France . + + ?pope rdf:type dbo:Pope . + ?pope dbp:birthPlace ?birth_place . # relation with the birth_place +} LIMIT 50 +``` + +---- + +Shortening sparql queries + +```sparql +@prefix foaf: . +@prefix dbp: . +@prefix dbr: . +@prefix dbo: . +@prefix rdf: . + +select distinct * where { + ?s a foaf:Person ; + dbp:birthPlace ?birth_place ; + dbp:deathPlace ?death_place . + ?birth_place dbo:country dbr:Italy . + ?death_place dbo:country dbr:France . + + ?pope rdf:type dbo:Pope ; + dbp:birthPlace ?birth_place . # relation with the birth_place +} LIMIT 50 +``` diff --git a/sparql-101/03-syntax-semantic.md b/sparql-101/03-syntax-semantic.md new file mode 100644 index 0000000..b2cb3d9 --- /dev/null +++ b/sparql-101/03-syntax-semantic.md @@ -0,0 +1,222 @@ +# Modeling Semantic APIs + +## Agenda + +- API e Semantica +- json-schema e json-ld + +--- + +## API e Semantica + +Quando scambiamo informazioni tramite API +la semantica non è sempre chiara: + +- è implicita; +- è in qualche pdf/xls; +- non è machine readable. + +Descrivendo un'API con un IDL (wsdl o OAS3) +possiamo descrivere la semantica includendola +nell'IDL. + +--- + +### Semantica e Sintassi + +La descrizione semantica di un'API +non abilita necessariamente delle comunicazioni +efficienti e sicure. + +Per validare un oggetto json-ld, serve risolverne +ricorsivamente tutte le referenze: +è complesso farlo in maniera sincrona. + +La possibilità di validare sintatticamente +i dati inoltre semplifica molto il quadro di interoperabilità. + +Definendo inoltre la semantica va +definita in fase di specifica +evita di dover risolvere a runtime +referenze ricorsive +ed evita problemi di "@context mangling". + +---- + +#### Collegare context e dati + +Le specifiche json-ld definiscono un meccanismo per +per descrivere il contesto di un content json tramite `Link` header. + +```http +HTTP/1.1 200 OK +Content-Type: application/json +Link: ; + rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json" + +{ "given_name": "Roberto", "family_name": "Polli" } +``` + +Ma non un meccanismo per associare queste informazioni ad uno schema. + +---- + +#### Collegare context e schema + +RDF non permette sempre di associare uno schema univoco agli +elementi di un grafo. + +Anche associando una `Location` al luogo di nascita +di una persona tramite `rdfs:range` con + +```turtle +prefix cpv: . +prefix l0: . + +cpv:hasBirthPlace rdfs:range l0:Location +``` + +non è detto che sia semplice associare una sintassi +a `Location` che, in questo caso potrebbe essere ad esempio: + +- un indirizzo +- una coppia di coordinate +- l'URI di un luogo + +---- + +Uno scambio efficiente di informazioni in tempo reale +richiede una sintassi ben definita +validabile a runtime in modo efficiente. + +La sintassi può essere validata con specifiche quali +[json-schema]() e [xmlschema](). + +json-schema può essere usato anche per validare +la sintassi di un file json-ld. + +---- + +Per dichiarare il @context associandolo ad uno schema +possiamo integrarlo nella definizione attraverso +un valore `const`. +Se una property è esterna al vocabolario, +basta +[disassociarla dal vocabolario](https://w3c.github.io/json-ld-syntax/#example-25-using-the-null-keyword-to-ignore-data) +assegnandole il valore `null`. + +```yaml +# Associate a json-ld context to a schema +Customer: +  type: object +  required: [email] +  properties: + "@context": + const: + "@vocab": "http://schema.org/" + pet: null + email: {type: string} +    pet: {type: string} +``` + +---- + +E' anche possibile indicare un link, +evitando però di usarlo per poi alterare +la semantica dei dati. + +```yaml +# Associate a json-ld context to a schema +Customer: +  type: object +  required: [email] +  properties: + "@context": + const: "https://api.example/customer-context.jsonld" + email: {type: string} +    pet: {type: string} +``` + +---- + +Descrivendo un'API in formato OAS3 possiamo +descrivere i diversi formati usando i meccanismi +di content-negotiation. + +```yaml +openapi: 3.0.1 +... +paths: + /users: + get: + ... + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/Person" + application/ld+json: + schema: + allOf: + - type: object + properties: + "@context": + const: + "@vocab": "https://w3id.org/italia/onto/CPV/" + given_name: givenName + family_name: familyName + - $ref: "#/components/schemas/Person" + + +``` + +--- + +### Vocabolario per la semantica + +Un altro meccanismo per collegare @context +e schema, è quello di utilizzare un vocabolario +e delle parole chiavi all'interno dello schema. + +Questo meccanismo è più semplice, ma richiede +di generare il @context a partire da un vocabolario esterno. + +```yaml +Person: + type: object + properties: + givenName: + type: string + x-refersTo: https://w3id.org/italia/onto/CPV/givenName + familyName: + x-refersTo: https://w3id.org/italia/onto/CPV/familyName + type: string + +``` + +### Ontologia per json-schema + +Il progetto [Web of Things](https://w3.org/ns/td.jsonld) definisce invece +un vocabolario per "Thing description" in formato json-ld dove ad ogni property viene associato +sia un valore semantico che uno sintattico tramite il vocabolario +[json-schema](https://w3.org/ns/json-schema/). + +## Trasformare dati semantici + +E' possibile trasformare dei dati semanticamente definiti in diversi formati +usando una serie di specifiche. + +- https://www.w3.org/2013/csvw/wiki/CSV-LD +- https://www.w3.org/TR/json-ld-framing/ force a specific tree layout to a JSON-LD document. + + + + +```mermaid +flowchart + + RDF--Framing--> JSON --context--> RDF + CSV --csv-ld--> RDF + +``` \ No newline at end of file From efb21fbf9a99e2ec0562ba80a29c6293eebacf0f Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Thu, 8 Jun 2023 16:43:09 +0200 Subject: [PATCH 20/52] Update 2023 (still ansible 2.4) (#59) Update course to 2023 version. --------- Co-authored-by: tucsolo --- ansible-101/.gitignore | 4 + ansible-101/Dockerfile.ssh | 12 +- ansible-101/Makefile | 2 +- ansible-101/README.md | 80 +- ansible-101/cloudinit.txt | 12 + ansible-101/deleteme-digitalocean.yml | 26 + ansible-101/notebooks/00_teaser.ipynb | 40 +- ansible-101/notebooks/01_architecture.ipynb | 270 +- .../notebooks/02_delivery_layout.ipynb | 96 +- ansible-101/notebooks/02_vaults.ipynb | 214 +- .../notebooks/03_facts_and_variables.ipynb | 76 +- .../notebooks/04_loops_and_conditions.ipynb | 55 +- ansible-101/notebooks/05_inventories.ipynb | 181 +- .../notebooks/06_bastion_and_ssh.ipynb | 126 +- ansible-101/notebooks/07_playbooks.ipynb | 230 +- ansible-101/notebooks/07_templates.ipynb | 6 +- ansible-101/notebooks/08_yaml_pitfalls.ipynb | 98 +- ansible-101/notebooks/diagrams.md | 108 + ansible-101/notebooks/exercise-01/.pin | 1 - ansible-101/notebooks/exercise-01/ansible.cfg | 10 +- .../notebooks/exercise-01/copy-key.yml | 7 +- .../notebooks/exercise-01/inventory.docker | 15 + ansible-101/notebooks/exercise-03/ansible.cfg | 3 + .../notebooks/exercise-03/cartesian.yml | 15 +- .../notebooks/exercise-03/conditions.yml | 26 +- .../notebooks/exercise-03/environment.yml | 13 +- .../notebooks/exercise-03/fileglob.yml | 32 +- .../exercise-03/get-facts-solution.yml | 27 + .../notebooks/exercise-03/get-facts.yml | 33 +- .../exercise-03/vars-and-facts-solution.yml | 38 + .../notebooks/exercise-03/vars-and-facts.yml | 40 +- ansible-101/notebooks/exercise-05/inventory | 13 +- .../exercise-05/inventory-docker-solution.py | 44 +- .../notebooks/exercise-05/inventory-docker.py | 42 +- ansible-101/notebooks/exercise-06/ansible.cfg | 13 +- .../exercise-06/ansible.cfg-solution | 7 + ansible-101/notebooks/exercise-06/inventory | 5 +- .../notebooks/exercise-06/inventory-solution | 2 + ansible-101/notebooks/exercise-06/vault.yml | 3 + ansible-101/notebooks/exercise-07/debug.yml | 40 +- .../notebooks/exercise-07/hostvars.yml | 43 + ansible-101/notebooks/exercise-07/inventory | 4 +- .../notebooks/exercise-07/package-user.yml | 9 +- .../notebooks/exercise-07/process-facts.yml | 4 + .../notebooks/exercise-07/shell-output-01.yml | 6 +- ansible-101/notebooks/intro.ipynb | 111 +- ansible-101/site-digitalocean.yml | 80 +- docker-101/01-docker.md | 96 + docker-101/02-docker.md | 372 + docker-101/Dockerfile | 22 + docker-101/Makefile | 11 + docker-101/notebooks/01-docker.ipynb | 190 + docker-101/notebooks/02-docker.ipynb | 832 + docker-101/notebooks/Dockerfile | 22 + docker-101/tox.ini | 11 + git-101/01-git.md | 162 +- git-101/notebooks/01-git.ipynb | 592 +- git-101/notebooks/01-git.slides.html | 15318 ++++++++++++++++ git-101/tox.ini | 2 +- 59 files changed, 19059 insertions(+), 893 deletions(-) create mode 100644 ansible-101/cloudinit.txt create mode 100644 ansible-101/deleteme-digitalocean.yml create mode 100644 ansible-101/notebooks/diagrams.md delete mode 100644 ansible-101/notebooks/exercise-01/.pin create mode 100644 ansible-101/notebooks/exercise-01/inventory.docker create mode 100644 ansible-101/notebooks/exercise-03/get-facts-solution.yml create mode 100644 ansible-101/notebooks/exercise-03/vars-and-facts-solution.yml create mode 100644 ansible-101/notebooks/exercise-06/ansible.cfg-solution create mode 100644 ansible-101/notebooks/exercise-06/inventory-solution create mode 100644 ansible-101/notebooks/exercise-07/hostvars.yml create mode 100644 docker-101/01-docker.md create mode 100644 docker-101/02-docker.md create mode 100644 docker-101/Dockerfile create mode 100644 docker-101/Makefile create mode 100644 docker-101/notebooks/01-docker.ipynb create mode 100644 docker-101/notebooks/02-docker.ipynb create mode 100644 docker-101/notebooks/Dockerfile create mode 100644 docker-101/tox.ini create mode 100644 git-101/notebooks/01-git.slides.html diff --git a/ansible-101/.gitignore b/ansible-101/.gitignore index 80185ac..5c88495 100644 --- a/ansible-101/.gitignore +++ b/ansible-101/.gitignore @@ -7,3 +7,7 @@ *.retry core* *_python_intro.ipynb +notebooks/rendered_notebooks/ +vault.yml +vault.yaml +.pin diff --git a/ansible-101/Dockerfile.ssh b/ansible-101/Dockerfile.ssh index 6f2ca1b..89df961 100644 --- a/ansible-101/Dockerfile.ssh +++ b/ansible-101/Dockerfile.ssh @@ -1,7 +1,15 @@ -FROM itscaro/debian-ssh:latest -RUN apt-get -y update && apt-get -y install python sshpass +FROM debian:stable-slim +RUN apt-get -y update && apt-get -y install python sshpass openssh-server RUN apt-get -y clean RUN apt-get -y autoremove +# Since this is a tutorial machine, we +# need to simplify things a bit. RUN echo "UseDNS no" >> /etc/ssh/sshd_config RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config + +# Create privilege separation directory. +RUN mkdir -p /run/sshd + +ENTRYPOINT ["/usr/sbin/sshd"] +CMD [ "-D", "-e"] diff --git a/ansible-101/Makefile b/ansible-101/Makefile index c0df8b6..e692fa1 100644 --- a/ansible-101/Makefile +++ b/ansible-101/Makefile @@ -6,7 +6,7 @@ .PHONY: course MAIN_IP = $(shell ip -4 -o a s scope global | awk -F'[/ ]+' '{print $$4; exit} ') -EXTERNAL_COURSES = git-101 python-basic +EXTERNAL_COURSES = git-101 python-basic docker-101 course: .prepare diff --git a/ansible-101/README.md b/ansible-101/README.md index e66c906..2556d33 100644 --- a/ansible-101/README.md +++ b/ansible-101/README.md @@ -6,16 +6,16 @@ This course is based on Docker and Docker compose. As long as you have Docker you can run it on: - - linux - - mac - - windows +- linux +- mac +- windows Docker should be exposed via TCP on 172.17.0.1:2375 On Linux, set -``` -# vim /etc/systemd/system/multi-user.target.wants/docker.service +```bash +$ vim /etc/systemd/system/multi-user.target.wants/docker.service [Service] ... ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375 @@ -24,28 +24,29 @@ ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375 On Mac, check [the FAQ and this issue](https://github.com/docker/for-mac/issues/770#issuecomment-252560286) - Consider having enough bandwidth for the first run to download the images. - Run the environemnt with: - # make course +```bash +make course +``` or - # docker-compose scale course=1 bastion=1 web=3 - # firefox http://localhost:8888 - +```bash +docker-compose scale course=1 bastion=1 web=3 +firefox http://localhost:8888 +``` ## Playing the course on DigitalOcean DigitalOcean is a great and cheap cloud-provider - - create an Ubuntu 16.04 docker droplet from the menu and ssh into your host - - expose docker on local http port +- create an Ubuntu 16.04 docker droplet from the menu and ssh into your host +- expose docker on local http port -``` +```bash # vim /etc/systemd/system/multi-user.target.wants/docker.service [Service] ... @@ -53,33 +54,48 @@ ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375 ... ``` - - clone and run the project +- clone and run the project +```bash +git clone https://github.com/ioggstream/python-course.git +cd python-course/ansible-101 +make course ``` - # git clone https://github.com/ioggstream/python-course.git - # cd python-course/ansible-101 - # make course - -``` - - - point to the reference url +- point to the reference url See asciicast here [![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI) +## Prerequisites + +After `make course`, prerequisites are in `/notebooks/rendered_notebooks`. + +Prerequisites can be found in the home directory: + +- Introduction to jupyter: logging in, showing the python interface, working with notebooks, opening terminals. +- [Git 101](https://github.com/ioggstream/python-course/blob/master/git-101/notebooks/01-git.ipynb) +- [Python basics](https://github.com/ioggstream/python-course/blob/master/python-basic/README.md) +- Docker ## Outline +- 1. Prerequisites linked in [intro.ipynb](intro.ipynb) +- Ansible architecture +- Describe delivery layout in ansible.cfg +- Host and Group variables, Filters + +- 2. Static and dynamic inventories (docker) +- Vaults and Secrets +- Use bastions and other ssh_opts + +- 3. writing basic playbooks, test driven deployment +- YAML pitfalls +- Inclusion and Roles +- Ansible galaxy as a role repository + +## Advanced topics - - Ansible architecture - - Describe delivery layout in ansible.cfg - - Host and Group variables, Filters - - Static and dynamic inventories (docker) - - Vaults and Secrets - - Use bastions and other ssh_opts - - writing basic playbooks, test driven deployment - - Yaml pitfalls - - Inclusion and Roles - - Ansible galaxy as a role repository (bonus track) +- 4. AWX Introduction +- Example usage of AWX diff --git a/ansible-101/cloudinit.txt b/ansible-101/cloudinit.txt new file mode 100644 index 0000000..46a9e9a --- /dev/null +++ b/ansible-101/cloudinit.txt @@ -0,0 +1,12 @@ +#!/bin/bash +# This is NOT a cloud-init file +# as https://docs.digitalocean.com/products/droplets/how-to/provide-user-data/ suggests, +# we may insert a payload script. + +# If we had cloud-init file, we could have used this: +# package_update: false +# package_upgrade: false + +# but we are simply rewriting this config file +echo "APT::Periodic::Update-Package-Lists \"0\";" > /etc/apt/apt.conf.d/20auto-upgrades +echo "APT::Periodic::Unattended-Upgrade \"0\";" >> /etc/apt/apt.conf.d/20auto-upgrades diff --git a/ansible-101/deleteme-digitalocean.yml b/ansible-101/deleteme-digitalocean.yml new file mode 100644 index 0000000..86279e6 --- /dev/null +++ b/ansible-101/deleteme-digitalocean.yml @@ -0,0 +1,26 @@ +# +# Delete the current infrastructure on digitalocean +# $ export DO_API_TOKEN=xxxx +# $ ansible-playbook -v deleteme-digitalocean.yml +# +# This will output a series of jupyter urls with their associate ips. +# +# BEWARE: unless you populate accordingly the digital_ocean droplet ids +# the digital_ocean module will create those droplets over and +# over again. +# +- hosts: localhost + gather_facts: false + tasks: + - name: Delete machine for the course. + community.digitalocean.digital_ocean_droplet: + state: absent + name: "{{item}}" + unique_name: yes + region: fra1 + image: docker-18-04 + wait_timeout: 500 + register: my_droplet + with_items: + - deleteme-1 + - deleteme-2 diff --git a/ansible-101/notebooks/00_teaser.ipynb b/ansible-101/notebooks/00_teaser.ipynb index 2a4a719..8341c00 100644 --- a/ansible-101/notebooks/00_teaser.ipynb +++ b/ansible-101/notebooks/00_teaser.ipynb @@ -1,17 +1,12 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Ansible\n", - "\n", - "\n", - "Ansible is a configuration management software.\n", - "\n", - "Connects via ssh or docker to a list of inventory machines and executes a series of tasks eventually grouped in playbooks.\n", - "\n", - "At first, create an inventory file with all your hosts." + "#### ([exercise directory](/tree/notebooks/exercise-00))" ] }, { @@ -23,6 +18,20 @@ "cd /notebooks/exercise-00 " ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "Ansible is a configuration management software.\n", + "\n", + "Connects via ssh or docker to a list of inventory machines and executes a series of tasks eventually grouped in playbooks.\n", + "\n", + "At first, create an inventory file with all your hosts." + ] + }, { "cell_type": "code", "execution_count": null, @@ -33,6 +42,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -63,6 +73,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -70,6 +81,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -105,6 +117,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -151,6 +164,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -178,6 +192,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -206,6 +221,15 @@ "!ansible-playbook -i inventory site.yml --limit=course # in this case the --limit does not change anything ;)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!ansible --version" + ] + }, { "cell_type": "code", "execution_count": null, @@ -230,7 +254,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.15" + "version": "2.7.14" } }, "nbformat": 4, diff --git a/ansible-101/notebooks/01_architecture.ipynb b/ansible-101/notebooks/01_architecture.ipynb index 162db31..6471831 100644 --- a/ansible-101/notebooks/01_architecture.ipynb +++ b/ansible-101/notebooks/01_architecture.ipynb @@ -1,120 +1,129 @@ { "cells": [ { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Architecture\n", + "#### ([exercise directory](/tree/notebooks/exercise-00))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "solution": "hidden" + }, + "outputs": [], + "source": [ + "cd /notebooks/exercise-00/" + ] + }, + { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Ansible is\n", "\n", - "\n", - " - configuration manager \n", - " - simple \n", - " - extensible via modules\n", - " - written in python\n", - " - broad community\n", - " - many external tools\n", - " - playbook repository\n", - " - used by openstack, openshift & tonns of project\n", - " \n", - " \n", + "- configuration manager \n", + "- simple \n", + "- extensible via modules\n", + "- written in python\n", + "- broad community\n", + "- many external tools\n", + "- playbook repository\n", + "- used by openstack & tonns of project" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ " # Configuration Manager\n", " \n", - "Explain infrastructure as code\n", - " " + "Explain infrastructure as code (e.g., remember `docker-compose`?):\n", + "\n", + "- managing data centers through machine-readable definition files;\n", + "- install, configure, decommission physical and virtual resources;\n", + "- avoid manual processes;\n", + "- speed ++, costs --, risk -- (see [Google SRE Book](https://sre.google/workbook/postmortem-culture/) );\n", + "- declarative (describe the expected state) or imperative (describe the steps) approaches;\n", + "- push or pull model;\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNrNVMFu2zAM_RVBhyEB4sB2Yjfxhh7W9RB0RYclp0U9KDaTGLElT5LbuXH-fZQVdw3QATvuYpP0I_keKetIU5kBTajneUyY3BSQkIXYKq6NqlNTKyBckxsEMdFhdopXe_L1OxNMZPA0GDD6QWx09dE9tzzZcq_WoIgzC14ZWb2FsC7xbNPh0Ba-Jq2DWzpeVReFp-BnDdog2rrk7LZoVHI9-INGgA3p3EjVoKNTlVdGo2WgrApuwNp7qY0ePrpeIHa5AKvAWQSVkfYaYQ93Lckv5HdkLaD9hN_vHto-uU8de7LdgSEZN7wli9Xyfm0fZ_k4iKfXWeyAK40cdL1xY3Q11gt-Q25duUsgF7xodK672ZMnXuTYJZfimO4hPZxcOIOqkE0JwlhSmZX12uBSy_pys9ggyxWktiJZfcZBK5mtGf2Gr7qLouJ3ZLzj9Dg7hA3XvY6_uD1agHmW6uA9I4uM_GOM0Ue7Wm2Q6codkP-T43kXRS4OS9MUQCYERy8PkFjEm3jYx3cKADPoiJagSp5n-GMemSCEUbOHEhhN0Mxgy-vCMMrECaF1hZThNrPnnya4WxhRXhu5bETa-w7zJed4KkqKdAuN0YqLH1KWPQhdmhzpL5oE0-l46kdR4E_DyWzuz0e0oUk4j8ZxNI8nYRyH4Sy4Oo3oS5fvj-MgCv0oiGdX4dSP_WBEoSN0726X7pI5_QYwkpLJ?type=png)](https://mermaid.live/edit#pako:eNrNVMFu2zAM_RVBhyEB4sB2Yjfxhh7W9RB0RYclp0U9KDaTGLElT5LbuXH-fZQVdw3QATvuYpP0I_keKetIU5kBTajneUyY3BSQkIXYKq6NqlNTKyBckxsEMdFhdopXe_L1OxNMZPA0GDD6QWx09dE9tzzZcq_WoIgzC14ZWb2FsC7xbNPh0Ba-Jq2DWzpeVReFp-BnDdog2rrk7LZoVHI9-INGgA3p3EjVoKNTlVdGo2WgrApuwNp7qY0ePrpeIHa5AKvAWQSVkfYaYQ93Lckv5HdkLaD9hN_vHto-uU8de7LdgSEZN7wli9Xyfm0fZ_k4iKfXWeyAK40cdL1xY3Q11gt-Q25duUsgF7xodK672ZMnXuTYJZfimO4hPZxcOIOqkE0JwlhSmZX12uBSy_pys9ggyxWktiJZfcZBK5mtGf2Gr7qLouJ3ZLzj9Dg7hA3XvY6_uD1agHmW6uA9I4uM_GOM0Ue7Wm2Q6codkP-T43kXRS4OS9MUQCYERy8PkFjEm3jYx3cKADPoiJagSp5n-GMemSCEUbOHEhhN0Mxgy-vCMMrECaF1hZThNrPnnya4WxhRXhu5bETa-w7zJed4KkqKdAuN0YqLH1KWPQhdmhzpL5oE0-l46kdR4E_DyWzuz0e0oUk4j8ZxNI8nYRyH4Sy4Oo3oS5fvj-MgCv0oiGdX4dSP_WBEoSN0726X7pI5_QYwkpLJ)\n" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, + "source": [ + "\n", + "Trick: use a light development environment based on the introductory session.\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNp1Uk1v2zAM_SsCD0MCxEVqp67jFru0OwxoL91tVjEoNpMYtSVNH0HdJP99lK1g62EwRJDy4-MjqSPUqkEoIUkSLl3rOizZd7k1wjrja-cNMmHZA4G4HDE7I_SePb1wGb4GD7MZhy9yY_XdZLei3IrEWzRscjuhndL_QviYGH2YzwOT9ZuJ2qBW1QsZ2zplhkgSZJK7Cf6uda_E0BqsXavkKCZk_apmuhPDRqk3OydErxrfoa1m0bnk68HtlQwIlE3sInT3lZ3-Fku077rE4G-P1pHgELIYnkaRUwrKXSvxUwdEh_JQPeKB_h4-TYFq1qqn3rB6UNIJSjWW2KOyRtVv49z-G71GtVF5JGO0mtP9KVRmXMICejS9aBta7JFLxji4PfbIoSS3wa3wnePA5ZmgXjfC4bcmTBtK2jouQHinfgyyvsQT5rEV1GAPpKazdKuF_KlUfwFRCOUR3qG8zourPF2u8tt0nRbrfFUsYKDroriis86DSW-y2-y8gI-RYUn4LE2z6_Rmna3y5ZIycJT0PL3P8Zme_wCRge2O?type=png)](https://mermaid.live/edit#pako:eNp1Uk1v2zAM_SsCD0MCxEVqp67jFru0OwxoL91tVjEoNpMYtSVNH0HdJP99lK1g62EwRJDy4-MjqSPUqkEoIUkSLl3rOizZd7k1wjrja-cNMmHZA4G4HDE7I_SePb1wGb4GD7MZhy9yY_XdZLei3IrEWzRscjuhndL_QviYGH2YzwOT9ZuJ2qBW1QsZ2zplhkgSZJK7Cf6uda_E0BqsXavkKCZk_apmuhPDRqk3OydErxrfoa1m0bnk68HtlQwIlE3sInT3lZ3-Fku077rE4G-P1pHgELIYnkaRUwrKXSvxUwdEh_JQPeKB_h4-TYFq1qqn3rB6UNIJSjWW2KOyRtVv49z-G71GtVF5JGO0mtP9KVRmXMICejS9aBta7JFLxji4PfbIoSS3wa3wnePA5ZmgXjfC4bcmTBtK2jouQHinfgyyvsQT5rEV1GAPpKazdKuF_KlUfwFRCOUR3qG8zourPF2u8tt0nRbrfFUsYKDroriis86DSW-y2-y8gI-RYUn4LE2z6_Rmna3y5ZIycJT0PL3P8Zme_wCRge2O)\n", + "\n", + "Ansible uses the push model and supports both declarative and imperative approaches." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "solution": "hidden" + }, "source": [ " # Advantages\n", " \n", " No agents: ansible copies python and all deployment scripts/modules to the target machine via ssh and executes them remotely. Some modules though require that target hosts contain specific python libraries.\n", " \n", " Jobs are executed in parallel, but you can configure for serialization using different strategies for speed up, rollout or other purposes: (link)\n", - " \n", - " ![Ansible architecture](https://cdn.pbrd.co/images/390yWc9H0.png \"Ansible architecture\")\n", - " \n", + " \n", " Authentication can be passwordless (ssh/pki, kerberos) or with password.\n", " \n", - " Automation jobs (Playbooks) are described via YAML - a very concise and simple language. You can validate and lint files with yamllint and ansible-lint.\n", + " Automation jobs (Playbooks) are described via YAML - a very concise and simple language.\n", + " You can validate and lint files with yamllint and [ansible-lint](https://github.com/ansible/ansible-lint).\n", " \n", - "```\n", + "```yaml\n", "this_is:\n", " a: yaml\n", "\n", "file:\n", "- with dict\n", "- a list\n", - " \n", - " \n", "```\n", " \n", - " Passwords are supported, but SSH keys with ssh-agent are one of the best ways to use Ansible. Though if you want to use Kerberos, that's good too. \n", + "Passwords are supported, but SSH keys with ssh-agent are one of the best ways to use Ansible. Though if you want to use Kerberos, that's good too. \n", " \n", "You have a lot of options! Root logins are not required, you can login as any user, and then su or sudo to any user." ] }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "solution": "hidden" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/notebooks/exercise-00\n" - ] - } - ], - "source": [ - "cd /notebooks/exercise-00/" - ] - }, - { - "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ".\r\n", - "├── ansible.cfg\r\n", - "├── group_vars\r\n", - "│   ├── all\r\n", - "│   └── staging\r\n", - "├── inventory\r\n", - "├── mytemplate.j2\r\n", - "├── python-course-test.yml\r\n", - "├── site.yml\r\n", - "└── staging\r\n", - "\r\n", - "1 directory, 8 files\r\n" - ] - } - ], + "outputs": [], "source": [ "# Let's check our ansible directory\n", "!tree" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## ansible.cfg \n", "\n", - "It's the main configuration file. While all ansible are in `yaml`, ansible.cfg is in .ini format. Eg.\n", + "It's the main configuration file. While all ansible are in YAML, `ansible.cfg` is in .ini format. Eg.\n", "\n", "```\n", + "# This is a .ini file.\n", "[stanza]\n", "key = value\n", - "\n", "```\n", "\n", "Let's check the content of a sample ansible.cfg:\n", @@ -126,96 +135,31 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#\r\n", - "# Always use ansible.cfg and inventory files to \r\n", - "# describe your deployment! \r\n", - "#\r\n", - "# This will save time and helps your colleagues to\r\n", - "# keep in touch with the environment.\r\n", - "#\r\n", - "[defaults]\r\n", - "# define our inventory file or ansible defaults\r\n", - "# to /etc/ansible/hosts.\r\n", - "inventory = inventory\r\n", - "\r\n", - "# It's just for testing purposes (or if you're on a secure cloud)\r\n", - "# you may want to avoid typing yes to all host keys.\r\n", - "# Once you get host keys, you can comment this out and re-enable\r\n", - "# checks.\r\n", - "host_key_checking = False\r\n", - "\r\n", - "# When an ansible plabook fails, it creates a retry file which may\r\n", - "# pollute the current directory ;) You can move this out using\r\n", - "# further variables\r\n", - "retry_files_enabled = False\r\n", - "\r\n", - "# Search password file in here\r\n", - "# vault_password_file = ~/.ssh/pin\r\n", - "\r\n", - "\r\n", - "# [ssh_connection]\r\n", - "# ssh_args = -F ./ssh_config/config -o ControlMaster=auto -o ControlPersist=30m\r\n", - "# control_path = ./ssh_config/ansible-%%r@%%h:%%p\r\n" - ] - } - ], + "outputs": [], "source": [ "!cat ansible.cfg" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Inventories\n", "\n", - "a simple inventory file contains a static list of nodes to contact.\n", + "A simple inventory file contains a static list of nodes to contact.\n", "\n", - "Generally, an [inventory can be static or dynamic](http://docs.ansible.com/ansible/intro_inventory.html), as we will see in the following lessons.\n", + "Generally, an [inventory can be static or dynamic](https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html), as we will see in the following lessons.\n", "\n" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#\r\n", - "# This inventory file contains a list of server to \r\n", - "# play with - divided in groups.\r\n", - "#\r\n", - "[course]\r\n", - "# this is the local machine where you run jupyter\r\n", - "# the tutorial just works with this one.\r\n", - "pythonforsysadmin_course_1 ansible_connection=local\r\n", - "\r\n", - "\r\n", - "# Another group of servers\r\n", - "# where we can pass optional arguments\r\n", - "# Homework: you can play with this group of host\r\n", - "# once you exchange ssh-keys between the pythonforsysadmin_course_1\r\n", - "# container and the pythonforsysadmin_ansible_* ones._\r\n", - "[ansible]\r\n", - "172.17.0.[5:7] \r\n", - "\r\n", - "#\r\n", - "# Besides, ansible has two predefined groups: \r\n", - "# - all \r\n", - "# - ungrouped\r\n" - ] - } - ], + "outputs": [], "source": [ "!cat inventory" ] @@ -231,6 +175,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -238,34 +183,27 @@ "\n", "**N.B. ansible environment variables are not related with process environment**\n", "\n", + "#### Exercise:\n", + "\n", + "- using [the terminal](/terminals/ps) identify the process executing this notebook by the current working directory `/proc/*/cwd`;\n", + "- check the environment variables of the process with `cat /proc//environ | od -a`;\n", + "\n", "You defined your host groups in the environment, eg:\n", "\n", " - course\n", " - ansible\n", " - staging\n", " \n", - "Ansible defines [two default groups: all and ungrouped](http://docs.ansible.com/ansible/intro_inventory.html#default-groups).\n", + "Ansible defines [two default groups: all and ungrouped](http://docs.ansible.com/ansible/latest/intro_inventory.html#default-groups).\n", "\n", "You can assign variables to all hosts using the `all` group." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "group_vars\r\n", - "├── all\r\n", - "└── staging\r\n", - "\r\n", - "0 directories, 2 files\r\n" - ] - } - ], + "outputs": [], "source": [ "# group_vars - a directory containing environment files for various host groups.\n", "!tree group_vars" @@ -273,22 +211,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "group_vars/all:env_name: default\n", - "group_vars/staging:env_name: staging\n", - "#\n", - "# Pur here the variables for the staging inventory.\n", - "#\n", - "env_name: staging\n" - ] - } - ], + "outputs": [], "source": [ "# I set env_name in two different files\n", "!grep env_name -r group_vars/\n", @@ -305,13 +230,14 @@ "source": [ "# The debug module (-m debug) shows variables' content or dumps messages.\n", "# by default uses the inventory set into ansible.cfg, thus writing\n", - "!ansible all -m debug -a 'var=env_name'\n" + "!ansible all -m debug -a 'var=env_name'" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { - "solution": "hidden", + "solution": "shown", "solution_first": true }, "source": [ @@ -330,12 +256,11 @@ "code_folding": [ 0 ], - "solution": "hidden" + "solution": "shown" }, "outputs": [], "source": [ "# Solution\n", - "\n", "!ansible all -i staging -m debug -a 'var=env_name'" ] }, @@ -349,10 +274,15 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "#### Exercise" + "#### Exercise\n", + "\n", + "- Read the inventory and try to predict the output of the following command\n", + "- Rename the `staging` inventory file to `foobar`. What happens?\n", + "- Restore the original name." ] }, { diff --git a/ansible-101/notebooks/02_delivery_layout.ipynb b/ansible-101/notebooks/02_delivery_layout.ipynb index 9e9af69..ba13836 100644 --- a/ansible-101/notebooks/02_delivery_layout.ipynb +++ b/ansible-101/notebooks/02_delivery_layout.ipynb @@ -1,10 +1,28 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Delivery Layout - ansible.cfg\n", + "#### ([exercise directory](/tree/notebooks/exercise-00))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cd /notebooks/exercise-00" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", "When you deliver something you'll probably have a layout:\n", "\n", @@ -14,21 +32,13 @@ " - whether to do privilege escalation (eg. sudo, ...) before running tasks\n", " - if nodes should be accessed via a bastion host, docker, ...\n", " \n", - "Put those informations, together with a brief description of the playbook usage (eg. 2/3 lines) into ansible.cfg\n", + "Put those information, together with a brief description of the playbook usage (eg. 2/3 lines) into `ansible.cfg`\n", "\n", - "![delivery layout](https://cdn.pbrd.co/images/39e3p1vlg.png)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cd /notebooks/exercise-00" + "[![](https://mermaid.ink/img/pako:eNplUz2TmzAQ_SuaLVIBARk4m-KqpEyVLuLmRkYLZg4kRgImjs__PZLAn9eIt0-r3fdW4gSVEggFNJoPB1LKUs586kbmV1LzouZhp6qPt1J-4NEwYw7EgXXLQrtjpv1ynkvT7juMqrphd3hNrtsOiU1X4wH12ui9UrJum1LyaTxcA5TCSbnWbeWMclT6yK7ovub3NWg6tUenJ2GDVmJlDeoZtaMpG9GMX-gN84qiKHreetbRaDUN7zPXht3gRYnqBOpHLc5tMy9qPFwU3CrfDykMXz811qhRVmg-b6adIRJGIbGlnIsV0-ttrXNzFYgnHsbpaXdnXxs-deyVmDo05BvRyn6ZXx_svUEAPeqet8I-mlMpCSnBDq_HEgoLBda-P5TybFOnQfARf4rW2oBi1BMGYJWp30dZXeIl50fL7Yh7sK06Y9mByz9K9ZckG0Jxgr9QJGkapXGWJXFKN9tdvAvgCAXdZVGe7fINzXNKt8nLOYB__nwc5UlG4yzJty80jfM4CQC9oF_Ly_c_wPk_d6YQxA?type=png)](https://mermaid.live/edit#pako:eNplUz2TmzAQ_SuaLVIBARk4m-KqpEyVLuLmRkYLZg4kRgImjs__PZLAn9eIt0-r3fdW4gSVEggFNJoPB1LKUs586kbmV1LzouZhp6qPt1J-4NEwYw7EgXXLQrtjpv1ynkvT7juMqrphd3hNrtsOiU1X4wH12ui9UrJum1LyaTxcA5TCSbnWbeWMclT6yK7ovub3NWg6tUenJ2GDVmJlDeoZtaMpG9GMX-gN84qiKHreetbRaDUN7zPXht3gRYnqBOpHLc5tMy9qPFwU3CrfDykMXz811qhRVmg-b6adIRJGIbGlnIsV0-ttrXNzFYgnHsbpaXdnXxs-deyVmDo05BvRyn6ZXx_svUEAPeqet8I-mlMpCSnBDq_HEgoLBda-P5TybFOnQfARf4rW2oBi1BMGYJWp30dZXeIl50fL7Yh7sK06Y9mByz9K9ZckG0Jxgr9QJGkapXGWJXFKN9tdvAvgCAXdZVGe7fINzXNKt8nLOYB__nwc5UlG4yzJty80jfM4CQC9oF_Ly_c_wPk_d6YQxA)" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -36,7 +46,7 @@ "\n", "When running ansible, the first file read is ansible.cfg, resolved in the following order:\n", "\n", - " - `ANSIBLE_CONFIG` (env var)\n", + " - `ANSIBLE_CONFIG` (process environment variable)\n", " - `./ansible.cfg` (in the current directory)\n", " - `~/ansible.cfg` (in the home directory)\n", " - `/etc/ansible/ansible.cfg`\n", @@ -54,12 +64,13 @@ "\n", "```\n", "\n", - "Always check [ansible source code](https://raw.github.com/ansible/ansible/devel/examples/ansible.cfg) to get in touch with new parameters.\n", + "Always check [ansible source code](https://raw.github.com/ansible/ansible/devel/examples/ansible.cfg) to get in touch with new parameters, for example see the [ansible.cfg stable-2.4](https://github.com/ansible/ansible/blob/stable-2.4/examples/ansible.cfg)\n", "\n", - "We'll create a new ansible.cfg for every project!" + "We'll create a new `ansible.cfg` for every project!" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -90,6 +101,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "solution": "shown", @@ -107,30 +119,31 @@ "cell_type": "code", "execution_count": null, "metadata": { - "code_folding": [], "solution": "shown" }, "outputs": [], "source": [ - "# Solution\n", - "!sed -i 's/^inventory/#inventory/' ansible.cfg\n", - "!ansible -m ping all\n", - "!sed -i 's/#inventory/inventory/' ansible.cfg" + "# Use this cell for the exercise\n", + "!ansible -m ping all" ] }, { "cell_type": "code", "execution_count": null, "metadata": { + "code_folding": [], "solution": "shown" }, "outputs": [], "source": [ - "# Use this cell for the exercise\n", - "!ansible -m ping all" + "# Solution\n", + "!sed -i 's/^inventory/#inventory/' ansible.cfg\n", + "!ansible -m ping all\n", + "!sed -i 's/#inventory/inventory/' ansible.cfg" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "solution": "hidden", @@ -148,29 +161,29 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "code_folding": [ - 0 - ], - "solution": "hidden" - }, + "metadata": {}, "outputs": [], "source": [ - "# Solution\n", - "!ansible -m ping all[0]" + "# Use this cell for the exercise" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "code_folding": [ + 0 + ], + "solution": "hidden" + }, "outputs": [], "source": [ - "# Use this cell for the exercise\n", + "# Solution\n", "!ansible -m ping all[0]" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -182,6 +195,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -215,12 +229,11 @@ }, "outputs": [], "source": [ - "# Write here the answer!\n", - "[defaults] # ansible.cfg\n", - "private_key_file = " + "# Write here the answer!" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -238,6 +251,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -260,6 +274,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -268,7 +283,7 @@ "A bastion host is the unique management entrypoint for an infrastructure.\n", "\n", "Ansible *leverages ssh functionalities* to manage resources from your local machine thru a bastion.\n", - "With a proper configuration you can run your commands/playbooks without continusly moving files to and fro your bastion.\n", + "With a proper configuration you can run your commands/playbooks **without** continusly moving files to and fro your bastion.\n", "\n", "Those includes:\n", " \n", @@ -281,6 +296,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -303,21 +319,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.13" + "pygments_lexer": "ipython3", + "version": "3.9.9" } }, "nbformat": 4, diff --git a/ansible-101/notebooks/02_vaults.ipynb b/ansible-101/notebooks/02_vaults.ipynb index ba1832e..6e381f6 100644 --- a/ansible-101/notebooks/02_vaults.ipynb +++ b/ansible-101/notebooks/02_vaults.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -11,15 +12,16 @@ " - ansible.cfg\n", " - inventory\n", "\n", + "[![](https://mermaid.ink/img/pako:eNpVkUFTgzAQhf9KZg-eKAMp0MLBk3rSi94kjpPC0mYKCZMAim3_uwFKxdt7mW_37WZPkKkcIYG95vWBPL8yyaRpd5Pl0ohdiW5W7NOFJgVPCr4qRInkg0mU-VC1BFar-7PGAjXKDM2ZDOhnx9uyIXeTOWJvrBayQ9ko3f_LHQjTmwar9GmQi0Cb99csnVrW3JgvpfMrVqrsOGNDTGrMgdRadLxBYh-umFWWug2Q3tQYf4UM6g71vCQ4UKGuuMjtj52YJIRBc8AKGSRW5lgM8zBg8mLRts5t4mMubFNIGt2iA7xt1Fsvs9lPzIPgdvEKbGJp7GvN5btS1QxZC8kJviHxg8ANvDD0vYCut7EXO9BDQuPQjcI4WtMoonTrby4O_Iz1nhv5IfVCP9puaOBFnu8AjgO9TGcfr3_5BZh-syk?type=png)](https://mermaid.live/edit#pako:eNpVkUFTgzAQhf9KZg-eKAMp0MLBk3rSi94kjpPC0mYKCZMAim3_uwFKxdt7mW_37WZPkKkcIYG95vWBPL8yyaRpd5Pl0ohdiW5W7NOFJgVPCr4qRInkg0mU-VC1BFar-7PGAjXKDM2ZDOhnx9uyIXeTOWJvrBayQ9ko3f_LHQjTmwar9GmQi0Cb99csnVrW3JgvpfMrVqrsOGNDTGrMgdRadLxBYh-umFWWug2Q3tQYf4UM6g71vCQ4UKGuuMjtj52YJIRBc8AKGSRW5lgM8zBg8mLRts5t4mMubFNIGt2iA7xt1Fsvs9lPzIPgdvEKbGJp7GvN5btS1QxZC8kJviHxg8ANvDD0vYCut7EXO9BDQuPQjcI4WtMoonTrby4O_Iz1nhv5IfVCP9puaOBFnu8AjgO9TGcfr3_5BZh-syk)\n", "\n", "We're going to describe the following setup:\n", "\n", - " - direct access to client machines (eg. no bastion)\n", - " - one `inventory` file\n", - " - no host_key_check\n", - " - no retry files\n", - " - client machine username/password is `root:root`\n", - " - no public key is installed by default\n", + " - direct access to client machines (eg. no bastion);\n", + " - one `inventory` file;\n", + " - no host_key_check;\n", + " - no retry files;\n", + " - client machines' username is `root`. The password will be generated via the ansible `lookup()` plugin;\n", + " - no public key is installed by default.\n", "\n" ] }, @@ -33,16 +35,17 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Preparation\n", "\n", - "The first steps include creating:\n", + "The preparation steps include creating:\n", "\n", - " - all secret files (ssh identity, vault pin file)\n", - " - ansible.cfg (the deployment descriptor) \n", - " - and the inventory." + "1. all secret files (ssh keypair, vault pin file)\n", + "1. the inventory\n", + "1. [`ansible.cfg`](/edit/notebooks/exercise-01/ansible.cfg) (the deployment descriptor) referencing the created files" ] }, { @@ -51,17 +54,60 @@ "metadata": {}, "outputs": [], "source": [ - "# At first create a proper ssh key for the project\n", + "# Prepare a deployment descriptor referencing the .pin file.\n", + "# Exercise: open ansible.cfg in the editor add the missing comment lines.\n", + "!cat ansible.cfg" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "✅ Create a new ssh keypair for the project:\n", + "\n", + "- cleanup previously existing keys;\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Remove existing keys.\n", "! rm id_ansible.pub id_ansible -rf" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "- the key filename is `id_ansible`;\n", + "- the algorithm is `ed25519`, which is the most efficient one. For further information on ed25519 see [RFC8032](https://datatracker.ietf.org/doc/html/rfc8032).\n", + "\n", + "\n" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "! test -f id_ansible || ssh-keygen -q -t ecdsa -f id_ansible -N ''" + "# Eventually create the new keypair.\n", + "! test -f id_ansible || ssh-keygen -q -t ed25519 -f id_ansible -N ''" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "✅ Create the vault password file named `.pin` using the `lookup` plugin. We'll use this password to encrypt the vault later on.\n", + "**NB: if ansible.cfg references a missing or invalid `vault_password_file`, this task will fail.**\n" ] }, { @@ -70,8 +116,8 @@ "metadata": {}, "outputs": [], "source": [ - "# Now a `secret` password ;) We'll reference this in ansible.cfg\n", - "!echo secret > .pin " + "# Use the `lookup` plugin to create a password file named `.pin`.\n", + "!ansible localhost -m copy -a \"content='{{ lookup('password', '/dev/null length=64') }}' dest=$PWD/.pin\"" ] }, { @@ -80,11 +126,42 @@ "metadata": {}, "outputs": [], "source": [ - "# then prepare a deployment descriptor referencing the .pin file\n", - "!cat ansible.cfg" + "# Let's show the vault password :)\n", + "! cat .pin" ] }, { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "✅ Uncomment the vault_password_file in [ansible.cfg](/edit/notebooks/exercise-01/ansible.cfg)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Uncomment the vault_password_file line in ansible.cfg\n", + "! sed -i 's/#vault_password_file/vault_password_file/' ansible.cfg" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Exercise\n", + "\n", + "What is the meaning of the `-q` and `-N` options of `ssh-keygen`?\n", + "\n", + "Hint: open a [terminal](/terminals/man) and use `man ssh-keygen`.\n" + ] + }, + { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -104,14 +181,76 @@ ] }, { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- use the `copy` module to generate the `vault.yaml` file with the following content\n", + "\n", + "```yaml\n", + "root_password: \"\"\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "!ansible localhost -mcopy \\\n", + " -a \"content='root_password: \\\"{{ lookup('password','/dev/null') }}\\\"' dest=$PWD/vault.yaml\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "- use the `ansible_connection=docker` method specified in `inventory.docker` to copy the ssh key to the docker containers. Without this, the ssh key will not be available to the docker containers and you cannot access them via ssh.\n", + "\n", + "In real infrastructures, the ssh keys are usually provisioned at boot.\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNp1U1Fr2zAQ_itCDyMFK8xKnLmmFArdw6CFsr3NCkORLo2pLQVJbpsl-e87W3bTdBQ_6O6-T3efPll7qqwGWlDGmDChCjUU5Mb4alUDUdYYUKGyhjQQNlZ7YXreo5PbDbn7KYwwvl3FVFv1BK6MC1nLVbGWLGbLd7St1CXBgkpL7B9kZcClSO_Yql1BB_ETxM8hn04mPx7IuMFAeLHuib1UDvTFBeK8x_lnOBgtTBSl_WQSIyEM7vlkx0Auy9uR68E998EozT76D-ddDpN8StiUXROVdtKGmJ_ZJqPZf05mI-g3rDLPYIJ1uxIz0ljd4o3EgTUOWY7K3hEH69-45zfQC_rQmzB2fcDKgaDSL8Tz_7v2lFg8kNG5k4cdPMSku1TsovCgjB2u3ug0oQ24RlYaf7Q9-kYEDRtoQNACQw1r2dZBUGGOSG23Wgb4riucTovgWkiobIP9tTNqzCPntpLoYUPxmLXH6laa39Y2IwlTWuzpKy3SLJ_OUz6bZXnOZxn_xhO6owW_XEwX2eUiz_LZfJ7hd0zo377D12mWUOg13McH0r-T4z9VnhsC?type=png)](https://mermaid.live/edit#pako:eNp1U1Fr2zAQ_itCDyMFK8xKnLmmFArdw6CFsr3NCkORLo2pLQVJbpsl-e87W3bTdBQ_6O6-T3efPll7qqwGWlDGmDChCjUU5Mb4alUDUdYYUKGyhjQQNlZ7YXreo5PbDbn7KYwwvl3FVFv1BK6MC1nLVbGWLGbLd7St1CXBgkpL7B9kZcClSO_Yql1BB_ETxM8hn04mPx7IuMFAeLHuib1UDvTFBeK8x_lnOBgtTBSl_WQSIyEM7vlkx0Auy9uR68E998EozT76D-ddDpN8StiUXROVdtKGmJ_ZJqPZf05mI-g3rDLPYIJ1uxIz0ljd4o3EgTUOWY7K3hEH69-45zfQC_rQmzB2fcDKgaDSL8Tz_7v2lFg8kNG5k4cdPMSku1TsovCgjB2u3ug0oQ24RlYaf7Q9-kYEDRtoQNACQw1r2dZBUGGOSG23Wgb4riucTovgWkiobIP9tTNqzCPntpLoYUPxmLXH6laa39Y2IwlTWuzpKy3SLJ_OUz6bZXnOZxn_xhO6owW_XEwX2eUiz_LZfJ7hd0zo377D12mWUOg13McH0r-T4z9VnhsC)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!cat inventory.docker" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Provision the ssh keys using the docker_connector.\n", + "# Why do we need to use double braces?\n", + "!ansible docker -i inventory.docker -m shell \\\n", + " -a \"echo 'root:{{{{root_password}}}}' | chpasswd\" \\\n", + " -e@vault.yaml " + ] + }, + { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Gotta ping 'em all\n", "\n", - "Everything set up now. \n", + "Our Ansible environment is all set, but we still need to check if we can reach all the hosts.\n", "\n", - "Ping all hosts now, eventually adjusting ip ranges in then [inventory](/edit/notebooks/exercise-01/inventory)." + "Let's ping all hosts, eventually adjusting the ip ranges in the [inventory](/edit/notebooks/exercise-01/inventory).\n", + "\n", + "Open a [terminal](/terminals/man) and use `docker inspect` to retrieve the container IPs." ] }, { @@ -121,10 +260,11 @@ "outputs": [], "source": [ "# Let's get an error: root_password is UNDEFINED. \n", - "!ansible -m ping all\n" + "!ansible -m ping all" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -141,9 +281,8 @@ "source": [ "# A vault is just a yaml file containing a dictionary of secrets.\n", "# We can put here as many information as we want, but for now\n", - "# just put the `root_password`.\n", - "\n", - "!echo \"root_password: root\" > vault.yml" + "# just set a `root_password` generated using the lookup plugin.\n", + "!cat vault.yaml" ] }, { @@ -153,18 +292,19 @@ "outputs": [], "source": [ "# We need to encrypt it. \n", - "!ansible-vault encrypt vault.yml" + "!ansible-vault encrypt vault.yaml" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise\n", "\n", - " - which secret is used to encrypt vault.yml ?\n", + " - which secret is used to encrypt vault.yaml ?\n", " - where is it specified?\n", - " - what happens if you try to re-encrypt the vault.yml" + " - what happens if you try to re-encrypt the vault.yaml" ] }, { @@ -174,7 +314,7 @@ "outputs": [], "source": [ "# And show the anatomy of the vault.\n", - "!cat vault.yml" + "!cat vault.yaml" ] }, { @@ -184,7 +324,7 @@ "outputs": [], "source": [ "# Can we decrypt it?\n", - "!ansible-vault view vault.yml" + "!ansible-vault view vault.yaml" ] }, { @@ -193,10 +333,11 @@ "metadata": {}, "outputs": [], "source": [ - "!ansible -m ping all -e@vault.yml" + "!ansible -m ping all -e@vault.yaml" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -216,12 +357,13 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## SSH Authentication\n", "\n", - "We want to switch from password to ssh authentication. Create a playbook to install ssh keys: it reads the password from vault.yml\n" + "We want to switch from password to ssh authentication. Create a playbook to install ssh keys: it reads the password from vault.yaml\n" ] }, { @@ -252,6 +394,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "solution": "shown", @@ -292,17 +435,20 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise\n", "\n", "Run ansible in verbose mode to se all the injected ssh argument. If the output is too verbose, reduce it either with:\n", - " - `--limit ipaddress` to contact only one node\n", - " - host indexing/subscript eg: `all[0]` " + "\n", + "- `--limit ipaddress` to contact only one node\n", + "- host indexing/subscript eg: `all[0]` " ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -314,9 +460,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -328,7 +474,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.13" + "version": "3.9.9" } }, "nbformat": 4, diff --git a/ansible-101/notebooks/03_facts_and_variables.ipynb b/ansible-101/notebooks/03_facts_and_variables.ipynb index 1a32289..e489012 100644 --- a/ansible-101/notebooks/03_facts_and_variables.ipynb +++ b/ansible-101/notebooks/03_facts_and_variables.ipynb @@ -1,16 +1,12 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Facts and variables\n", - "\n", - "When connecting to an host, ansible creates a dictionary with a huge set of useful informations.\n", - "\n", - "This step is named **fact gathering**. \n", - "\n", - "You can inspect facts using the `setup` module." + "#### ([exercise directory](/tree/notebooks/exercise-03))" ] }, { @@ -22,6 +18,19 @@ "cd /notebooks/exercise-03" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "When connecting to an host, ansible creates a dictionary with a huge set of useful informations.\n", + "\n", + "This step is named **fact gathering**. \n", + "\n", + "You can inspect facts using the `setup` module." + ] + }, { "cell_type": "code", "execution_count": null, @@ -29,20 +38,20 @@ "outputs": [], "source": [ "# Let's run the setup module\n", - "\n", "!ansible -i inventory -m setup localhost " ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise\n", "\n", - " - run the following command\n", - " - what does it do?\n", - " - where's its output ?\n", - " - use the json module to reindent it" + "Run the following command\n", + "- what does it do?\n", + "- where's its output ?\n", + "- use the json python module to make it readable. **Hint: you need to `import json` to parse the output**" ] }, { @@ -75,12 +84,13 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise\n", "\n", - "Gather the following infos from the output of the previous command.\n", + "Using python, `print()` the following information from the output of the previous command:\n", "\n", " - hostname\n", " - first ip address\n", @@ -99,13 +109,13 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise\n", "\n", - "modify [this playbook](/edit/notebooks/exercise-03/get-facts.yml) to print:\n", - "\n", + "modify [this playbook](/edit/notebooks/exercise-03/get-facts.yml) to dump:\n", "\n", " - hostname\n", " - first ip address\n", @@ -123,6 +133,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -130,11 +141,11 @@ "\n", "Essentially, facts are per-host variables gathered by ansible.\n", "\n", - "In the vault lesson we've seen variables in action loaded it via -e @variables.yml.\n", + "In the vault lesson, we've seen variables in action loaded it via `-e @variables.yml`.\n", "\n", "Now we'll define them with \n", "\n", - "```\n", + "```yaml\n", "- hosts: localhost\n", " vars:\n", " - one_variable: 1\n", @@ -144,6 +155,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -157,13 +169,13 @@ "\n", "Here's a template example\n", "\n", - "```\n", + "```html\n", "\n", " \n", "\n", "# template.j2\n", "This is a static line while the following one\n", - "expands the ansible_hostname variable {{ansible_hostname}} \n", + "expands the ansible_hostname variable {{ ansible_hostname }} \n", "\n", "Now we process a simple number {{ 3.1415 | int }}\n", "\n", @@ -206,12 +218,23 @@ ] }, { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Extra Exercise\n", + "\n", + "Re-run the above playbook disabling fact gathering setting the process environment variable `ANSIBLE_GATHERING=explicit`." + ] + }, + { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## filters\n", "\n", - "Inside {{ braces }} you can process expressions using filters.\n", + "Inside `{{` braces `}}` you can process expressions using filters.\n", "\n", "```\n", "\n", @@ -266,6 +289,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -273,12 +297,12 @@ "\n", "Edit [the last section of vars-and-facts.yml](/edit/notebooks/exercise-03/vars-and-facts.yml) so that it shows:\n", " \n", - " - the free percentage of every device\n", + "- the free percentage of every block device\n", "\n", "Hints:\n", " \n", - " - use the playbook as a reference\n", - " - iterate thru server facts" + "- use the playbook as a reference\n", + "- iterate thru server facts" ] }, { @@ -295,7 +319,11 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# Check the difference between the output of ansible\n", + "# and the one of the OS.\n", + "!df -h" + ] } ], "metadata": { @@ -314,7 +342,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.13" + "version": "2.7.14" } }, "nbformat": 4, diff --git a/ansible-101/notebooks/04_loops_and_conditions.ipynb b/ansible-101/notebooks/04_loops_and_conditions.ipynb index b23cbbe..af3476a 100644 --- a/ansible-101/notebooks/04_loops_and_conditions.ipynb +++ b/ansible-101/notebooks/04_loops_and_conditions.ipynb @@ -1,10 +1,28 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Loops\n", + "#### ([exercise directory](/tree/notebooks/exercise-03))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cd /notebooks/exercise-03" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", "To repeat a *single task* multiple times, you can use *`with_items`*.\n", "\n", @@ -64,15 +82,7 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cd /notebooks/exercise-03" - ] - }, - { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -123,7 +133,7 @@ "\n", "Remember on `when` and `with_items`\n", "\n", - "#### `when` statements should not include jinja2 templating delimiters such as {{ }} or {% %}\n", + "#### `when` statements should not include jinja2 templating delimiters such as {{ }} or {% %} because they are evaluated as python code.\n", "\n", "#### `with_items` [requires proper templating and braces](http://docs.ansible.com/ansible/porting_guide_2.0.html#other-caveats). Do it for all expressions everywhere except conditionals (`when`):\n" ] @@ -138,6 +148,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -149,10 +160,12 @@ "- hosts: localhost \n", " tags: assert\n", " tasks: \n", - " - fail: msg=\"This is Linux!\"\n", + " - fail:\n", + " msg: \"This is Linux!\"\n", " when: ansible_system != 'Linux'\n", "\n", - " - fail: msg=\"Stop processing now!\"\n", + " - fail:\n", + " msg: \"Stop processing now!\"\n", " when: ansible_architecture == 'x86_64'\n", "\n", "```" @@ -168,6 +181,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -191,6 +205,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -198,13 +213,10 @@ "\n", "There is a set of predefined variables too:\n", "\n", - " - group_names\n", - " - groups\n", - " - environment \n", - " \n", - "When using playbooks, we'll get this one too:\n", - "\n", - " - hostvars\n" + " - `group_names`\n", + " - `groups`\n", + " - `environment`\n", + " - `hostvars`\n" ] }, { @@ -213,10 +225,11 @@ "metadata": {}, "outputs": [], "source": [ - "!ansible all[0] -i ../web -m debug -a \"var=groups\"" + "!ansible all[0] -i web -m debug -a \"var=groups\"" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -238,6 +251,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -287,6 +301,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/ansible-101/notebooks/05_inventories.ipynb b/ansible-101/notebooks/05_inventories.ipynb index 33286d6..8df02b5 100644 --- a/ansible-101/notebooks/05_inventories.ipynb +++ b/ansible-101/notebooks/05_inventories.ipynb @@ -1,97 +1,55 @@ { "cells": [ { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Inventories \n", + "#### ([exercise directory](/tree/notebooks/exercise-05))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cd /notebooks/exercise-05" + ] + }, + { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Inventories\n", "\n", "Inventories are a fundamental doc entrypoint for our infrastructures. \n", "\n", "They contain a lot of informations, including:\n", " \n", - " - ansible_user\n", - " - configuration variables in [group_name:vars]\n", - " - host grouping eg. by geographical zones in [group_name:children]\n", + "- `ansible_user`\n", + "- configuration variables in `[group_name:vars]`\n", + "- host grouping eg. by geographical zones in `[group_name:children]`\n", " \n", " \n", "Files:\n", "\n", - "\n", - " - [inventory](/edit/notebooks/exercise-05/inventory)\n", + "- [open the inventory](/edit/notebooks/exercise-05/inventory) file or print it\n", " " ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/notebooks/exercise-05\n" - ] - } - ], - "source": [ - "cd /notebooks/exercise-05" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "# I can group hosts in inventory\r\n", - "\r\n", - "[web:children]\r\n", - "web_rome\r\n", - "web_milan\r\n", - "\r\n", - "[web_rome:children]\r\n", - "web_rome_test\r\n", - "web_rome_prod\r\n", - "\r\n", - "[web_rome_prod]\r\n", - "172.23.0.[3:4]\r\n", - "\r\n", - "[web_milan]\r\n", - "172.24.0.[5:6]\r\n", - "\r\n", - "# further host variables\r\n", - "[web_rome:vars]\r\n", - "ansible_username=root \r\n", - "\r\n", - "\r\n", - "# Connect with docker \r\n", - "[web_rome_test:vars]\r\n", - "ansible_connection=docker\r\n", - "ansible_docker_extra_args=\"-Htcp://172.17.0.1\"\r\n", - "\r\n", - "# The actual host reference\r\n", - "[web_rome_test]\r\n", - "ansible101_web_1\r\n", - "\r\n", - "# \r\n", - "# Don't need to be Ssh \r\n", - "# to be my local machine ;)\r\n", - "#\r\n", - "[course]\r\n", - "localhost ansible_connection=local " - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "!cat inventory" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -108,6 +66,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -115,7 +74,7 @@ "\n", "Use `ansible` to show:\n", " \n", - " - all hosts of the web group." + "- all hosts of the web group." ] }, { @@ -139,10 +98,13 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "## Inventory scripts" + "## Inventory scripts\n", + "\n", + "To create custom inventory scripts just use python ;) and set the script path in `inventory`." ] }, { @@ -151,11 +113,11 @@ "metadata": {}, "outputs": [], "source": [ - "#To create custom inventory scripts just use python ;) and set it in\n", "!grep inventory ansible.cfg # inventory = ./docker-inventory.py" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -164,6 +126,14 @@ "in the official ansible documentation find at least 3 `ansible_connection=docker` parameters " ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An example python inventory script." + ] + }, { "cell_type": "code", "execution_count": null, @@ -188,20 +158,31 @@ "c = Client(base_url=\"http://172.17.0.1:2375/")\n", "\n", "# Define a function to make it clear!\n", - "container_fmt = lambda x: (\n", - " x['Names'][0][1:],\n", - " x['Labels']['com.docker.compose.service'], \n", - " x['NetworkSettings']['Networks']['bridge']['IPAddress'],\n", - ")\n", + "def get_inventory_data(container):\n", + " return {\n", + " \"container_name\": container[\"Names\"][0][1:],\n", + " \"ip_address\": container[\"NetworkSettings\"][\"Networks\"][\"bridge\"][\"IPAddress\"],\n", + " \"group_name\": container[\"Labels\"].get(\"com.docker.compose.service\"),\n", + " }\n", "\n", - "for x in c.containers():\n", + "for container in c.containers():\n", + " # The following exercises will ask you to\n", + " # modify the code in the loop in order to create a correct inventory.\n", " try:\n", - " print(*container_fmt(x), sep='\\t\\t')\n", + " print(get_inventory_data(container))\n", " except KeyError:\n", " # skip non-docker-compose containers\n", " pass" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "JSON inventories" + ] + }, { "cell_type": "code", "execution_count": null, @@ -232,26 +213,28 @@ "outputs": [], "source": [ "# You can pass variables to generated inventories too\n", - "inventories['web']['host_vars'] = {\n", + "inventories['web']['vars'] = {\n", " 'ansible_ssh_common_args': ' -o GSSApiAuthentication=no'\n", "}\n", "print(json.dumps(inventories, indent=1))" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise: \n", "\n", - "Reuse the code in [inventory-docker.py](/edit/notebooks/exercise-05/inventory-docker.py) to print a json inventory that:\n", + "Reuse the code in [inventory-docker.py](/edit/notebooks/exercise-05/inventory-docker.py) to print a JSON inventory that:\n", "\n", - " - connects via docker to \"web\" hosts\n", - " - connects via ssh to \"ansible\" hosts \n", + "- connects via docker to \"web\" hosts\n", + "- connects via ssh to \"ansible\" hosts \n", "\n", "Test it in the cell below.\n", "\n", - "** NOTE: there's a [docker inventory](https://github.com/ansible/ansible/blob/devel/contrib/inventory/docker.py) script shipped with ansible **" + "**NOTE: there's a [docker inventory](https://github.com/ansible-community/contrib-scripts/blob/main/inventory/docker.py) script shipped with ansible**\n", + "\n" ] }, { @@ -264,6 +247,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "code_folding": [] @@ -284,15 +268,17 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Configurations\n", "\n", - "You may want to split inventory files and separate prod and test environment." + "You may want to split inventory files and separate production and test environments." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -316,6 +302,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -337,6 +324,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -358,6 +346,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -374,6 +363,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -384,6 +374,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -391,28 +382,34 @@ "\n", "Host vars can be used in automated or cloud deployments where:\n", "\n", - " - every new host or vm, at boot, populate its own entries in `host_vars` (Eg. via file)\n", - " - ansible is run after that setup and uses `host_vars` to configure the server and expose that values to the other machines." + " - every new host or vm, at boot, populate its own entries in `host_vars` (e.g., via file)\n", + " - ansible is run after that setup, and uses `host_vars` to configure the server and to expose that values to the other machines." ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.14" + "pygments_lexer": "ipython3", + "version": "3.9.9" } }, "nbformat": 4, diff --git a/ansible-101/notebooks/06_bastion_and_ssh.ipynb b/ansible-101/notebooks/06_bastion_and_ssh.ipynb index ae8602f..af6db31 100644 --- a/ansible-101/notebooks/06_bastion_and_ssh.ipynb +++ b/ansible-101/notebooks/06_bastion_and_ssh.ipynb @@ -1,47 +1,82 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Bastion hosts\n", + "#### ([exercise directory](/tree/notebooks/exercise-06))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cd /notebooks/exercise-06/" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", "There are many reasons for using bastion hosts:\n", "\n", - " - security access eg in cloud environment\n", - " - vpn eg via windows hosts\n", + "- security access eg in cloud environment\n", + "- vpn eg via Windows hosts\n", " \n", - "The latter case is quite boring as ansible doesn't support windows as a client platform.\n", + "The latter case is not interesting as [ansible doesn't support windows as a client platform](https://docs.ansible.com/ansible/latest/os_guide/windows_faq.html#does-ansible-work-with-windows-xp-or-server-2003).\n", "\n", "A standard approach is:\n", "\n", - " - have a ssh server or a proxy installed on the bastion\n", - " - connecto the bastion to the remote network (eg. via vpn)\n", - " - configure ssh options in ansible to connect thru the bastion\n", + "- to have an ssh server or a proxy installed on the bastion\n", + "- connecto the bastion to the remote network (eg. via vpn)\n", + "- configure ssh options in ansible to connect through the bastion\n", " \n", "We'll do this via two configuration files:\n", "\n", - " - a standard ssh_config where we put the passthru configuration\n", - " - a simple ansible.cfg referencing ssh_config\n", + "- a standard `ssh_config` where we put the \"passthru\" configuration\n", + "- a simple `ansible.cfg` referencing `ssh_config`\n", " \n", "This approach allows us:\n", "\n", - " 1. to test the standard ssh connection thru the bastion without messing with ansible\n", - " 2. keep ansible.cfg simple in case we want to reuse them from the intranet (Eg. without traversing the bastion)\n", + "1. to test the standard ssh connection thru the bastion without messing with ansible\n", + "2. keep `ansible.cfg` simple in case we want to reuse them from the intranet (Eg. without traversing the bastion)\n", " \n", - " " + "[![](https://mermaid.ink/img/pako:eNp1UsuOmzAU_RXrLqoZCSwwCSEsKlVqF5XaTbsrjioHLolVuI7AaDLD8O81wekgjbq6r8N5CI9Qmgohh1OnLmf27YckSWWjkezDA14tdqQaKelsestqldcqHHrswhOq7vFxBivq9bFBXtanYtV7cK0bPEjq-_Pv0lCtT8Vbu4awkIcf2dttZu6H4-LK0xaflnq4O5w_Mmwt-o4FqVoREdriKy2h5uHJdH-8Cz-FT7rD6rAEjtkHNlfha-L5VoxV-1IwBz-q3mpD4yjBt5IWYrRnp4eWxZuYi4RvEn59f9uJ-Rbx2LHDNEly239qPiELw_DVhXtlXmJesP8YhQBa7FqlK_dzR0mMSXBqLUrIXVthrYbGSpA0OehwqZTFL5W2poPcdgMGoAZrfj5TeZ8XzGetXPIWnP2md9uLol_GtHeQGyEf4Qq5yFKeiWifxdtkm0ZZtgngGfI423GRZtF2t0_cLYrFFMDLjSHi6T5O0iTdC5G5GiUB4M3S9-WN3p7q9BcAcurg?type=png)](https://mermaid.live/edit#pako:eNp1UsuOmzAU_RXrLqoZCSwwCSEsKlVqF5XaTbsrjioHLolVuI7AaDLD8O81wekgjbq6r8N5CI9Qmgohh1OnLmf27YckSWWjkezDA14tdqQaKelsestqldcqHHrswhOq7vFxBivq9bFBXtanYtV7cK0bPEjq-_Pv0lCtT8Vbu4awkIcf2dttZu6H4-LK0xaflnq4O5w_Mmwt-o4FqVoREdriKy2h5uHJdH-8Cz-FT7rD6rAEjtkHNlfha-L5VoxV-1IwBz-q3mpD4yjBt5IWYrRnp4eWxZuYi4RvEn59f9uJ-Rbx2LHDNEly239qPiELw_DVhXtlXmJesP8YhQBa7FqlK_dzR0mMSXBqLUrIXVthrYbGSpA0OehwqZTFL5W2poPcdgMGoAZrfj5TeZ8XzGetXPIWnP2md9uLol_GtHeQGyEf4Qq5yFKeiWifxdtkm0ZZtgngGfI423GRZtF2t0_cLYrFFMDLjSHi6T5O0iTdC5G5GiUB4M3S9-WN3p7q9BcAcurg) " ] }, { - "cell_type": "code", - "execution_count": null, + "attachments": {}, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "cd /notebooks/exercise-06/" + "## SSH basics\n", + "\n", + "SSH connections follows roughly this basic schema (more information in [RFC4254](https://www.rfc-editor.org/rfc/rfc4253) and further revisions):\n", + "\n", + "1. client connects to server\n", + "2. server sends its public key\n", + "3. client checks the public key against its `known_hosts` file\n", + "4. if the key is not found, the client asks the user to confirm the key\n", + "5. if the key is confirmed, the client saves it in `known_hosts`\n", + "6. client sends its public key\n", + "\n", + "### SSH Caveats\n", + "\n", + "Host key checking is important. Incorrect validation can lead to:\n", + "\n", + "- persisting an insecure key in your `known_hosts` file\n", + "- connecting to the wrong host, that could be a malicious one, and leak credentials and other sensitive information\n", + "- connecting to the wrong host (e.g., because someone assigned a wrong IP), and execute commands on it" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -60,6 +95,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -70,24 +106,24 @@ "\n", "Inhibit PKI authentication is insecure by design:\n", "\n", - " - passwords will surely ends in cleartext files\n", - " - people ends doing things like the following\n", + "- passwords will end on post-it\n", + "- people will save them in cleartext files, doing things like the following\n", " \n", - "```\n", + "```bash\n", "#\n", "# the password is sent to the bastion via a\n", "# cleartext file.\n", "Match Host 172.25.0.*\n", - " ProxyCommand sshpass -f cleartext-bastion-password ssh -F config jump@bastion -W %h:%p \n", + " ProxyCommand sshpass -f /home/user/.cleartext-bastion-password ssh -F config jump@bastion -W %h:%p \n", "\n", "```\n", "\n", "\n", "## Connect to the bastion\n", "\n", - "Test connectivity to the bastion. Check your host ips and modify [`ssh_config`](/edit/notebooks/exercise-06/ssh_config) accordingly.\n", + "Test connectivity to the bastion. Check your host IPs and modify [`ssh_config`](/edit/notebooks/exercise-06/ssh_config) accordingly.\n", "\n", - "** Replace ALL bastion occurrencies, including the one below the BEWARE note**" + "**Replace ALL bastion IP address occurrencies, including the one below the BEWARE note**" ] }, { @@ -97,10 +133,11 @@ "outputs": [], "source": [ "fmt=r'{{.NetworkSettings.IPAddress}}'\n", - "!docker -H tcp://172.17.0.1:2375 inspect ansible101_bastion_1 --format {fmt} # pass variables *before* commands ;)" + "!docker -H tcp://172.17.0.1:2375 inspect ansible-101_bastion_1 --format {fmt} # pass variables *before* commands ;)" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -108,29 +145,31 @@ "\n", "Write the [ssh-copy-id.yml](/edit/notebooks/exercise-06/ssh-copy-id.yml) playbook to install an ssh key to the bastion.\n", "\n", + "NOTE: a cooler version of this exercise includes generating random passwords for `root` and for the vault using the `lookup()` plugin,\n", + "like we did in 02_vaults.\n", "\n", - "Bastion credentials are:\n", + "Set the bastion credentials to:\n", "\n", - " - user: `root`\n", - " - password `root`\n", + "- user: `root`\n", + "- password `root`\n", " \n", "Try to do it without watching the previous exercises:\n", "\n", - " - modify the empty [`ansible.cfg`](/edit/notebooks/exercise-06/ansible.cfg)\n", - " * referencing a pin file \n", - " * passing [`[ssh_connection]`](http://docs.ansible.com/ansible/intro_configuration.html#openssh-specific-settings) arguments to avoid ssh key mismatches\n", - " * pointing to the local inventory\n", - " - store credentials in the encrypted [`vault.yml`](/edit/notebooks/exercise-06/vault.yml). \n", - " - provide an [`inventory`](/edit/notebooks/exercise-06/inventory) file \n", + "- modify the empty [`ansible.cfg`](/edit/notebooks/exercise-06/ansible.cfg)\n", + " * referencing the vault password file named `pin` \n", + " * passing [`[ssh_connection]`](http://docs.ansible.com/ansible/intro_configuration.html#openssh-specific-settings) arguments to avoid ssh key mismatches\n", + " * pointing to the local inventory\n", + "- store credentials in the encrypted [`vault.yml`](/edit/notebooks/exercise-06/vault.yml). \n", + "- provide an [`inventory`](/edit/notebooks/exercise-06/inventory) file \n", "\n", "You can reuse the old id_ansible key or:\n", "\n", - " - create a new one and adjust the reference in [` ssh_config`](/edit/notebooks/exercise-06/ssh_config) \n", + "- create a new one and adjust the reference in [` ssh_config`](/edit/notebooks/exercise-06/ssh_config) \n", " \n", "Hint:\n", "\n", - " - if you provide an IdentityFile, password authentication won't work on the `bastion` node;\n", - " - you *must* copy ssh id file using password authentication and eventually clean up your known_host file" + "- if you provide an `IdentityFile`, password authentication won't work on the `bastion` node;\n", + "- you *must* copy ssh id file using password authentication and eventually clean up your `known_host` file" ] }, { @@ -161,6 +200,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -170,18 +210,19 @@ "\n", "We can instead just set\n", "\n", - "```\n", + "```ini\n", "[ssh_connection]\n", "ssh_args = -F ssh_config\n", "```\n", "\n", - "Write everything in ssh_config.\n", + "Write everything in `ssh_config`.\n", "\n", "\n", "Connecting via bastion in ansible enforcing multiple references to ssh_config" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -198,7 +239,7 @@ "outputs": [], "source": [ "fmt=r'{{.NetworkSettings.IPAddress}}'\n", - "!docker -H tcp://172.17.0.1:2375 inspect ansible101_web_1 --format {fmt} # pass variables *before* commands ;)" + "!docker -H tcp://172.17.0.1:2375 inspect ansible-101_web_1 --format {fmt} # pass variables *before* commands ;)" ] }, { @@ -207,20 +248,21 @@ "metadata": {}, "outputs": [], "source": [ - "!ssh -F ssh_config root@172.17.0.4 ip -4 -o a # get host ip" + "!ssh -F ssh_config root@172.17.0.4 env # get host ip" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise\n", "\n", - "Configure your `ansible.cfg` so that every web host is accessed via the bastion.\n", + "Configure your [`ansible.cfg`](/edit/notebooks/exercise-06/ansible.cfg) so that every host in the `web` group is accessed via the bastion.\n", "\n", - " - recycle your dynamic inventory script to access web hosts\n", - " - your id_ansible key should already be on your web hosts \n", - " - use ansible -m ping to check host connectivity\n", + " - recycle your dynamic inventory script to access the hosts in the `web` group\n", + " - your id_ansible key should already be on your hosts \n", + " - use `ansible -m ping` to check host connectivity\n", " - run `ps -ef | grep ssh` on your docker host to check all the `ProxyCommand` processes." ] }, diff --git a/ansible-101/notebooks/07_playbooks.ipynb b/ansible-101/notebooks/07_playbooks.ipynb index 3833f94..73e631f 100644 --- a/ansible-101/notebooks/07_playbooks.ipynb +++ b/ansible-101/notebooks/07_playbooks.ipynb @@ -1,30 +1,58 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Playbooks\n", + "#### ([exercise directory](/tree/notebooks/exercise-07))\n", + "#### NB: This lesson requires that the target nodes are reachable via ssh key exchange. Complete lesson 02_vaults (again :) before starting this lesson." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cd /notebooks/exercise-07" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", "\n", - "As we already learn in the other lessons, playbooks are yaml files where we group tasks.\n", + "As we already learn in the other lessons, playbooks are YAML files where we group **tasks**.\n", "\n", - "A playbook starts with an hosts mark specifying the hosts to run the playbook to.\n", + "A playbook starts with an `hosts` mark specifying the target hosts to run the playbook on.\n", "\n", - "```\n", - "# Yaml files usually start with 3 dashes: ---\n", - "# It's just a separator.\n", + "```yaml\n", + "# Since you can have multiple YAML documents in a single file,\n", + "# YAML files usually start with 3 dashes: ---\n", + "# and may end with 3 dots: ...\n", "---\n", "- hosts: web\n", " tasks: \n", - " ...\n", - "```\n", - "\n", + " ..\n", + "...\n", + "```" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", - "In yaml, a playbook is a *list* of `hosts` entries.\n", + "A playbook is a *list* of `hosts` entries in a single YAML document.\n", "\n", "\n", - "```\n", + "```yaml\n", + "---\n", "- hosts: localhost\n", " tasks:\n", " - name: one or more tasks to be run on localhost\n", @@ -38,7 +66,7 @@ "\n", "We can even pick a single element in an host group, or add `tags` entries to restrict executions\n", "\n", - "```\n", + "```yaml\n", "- hosts: db[0]\n", " tags: beware\n", " tasks:\n", @@ -46,25 +74,33 @@ " ...\n", " - name: run many tasks...\n", "\n", - "```\n", + "```\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", - "You can limit execution of a single task on a single host within a group using `run_once` .\n", - "```\n", + "You can limit execution of a single task on a single host within a group using `run_once`.\n", + "\n", + "```yaml\n", "- hosts: db\n", " tags: beware\n", " tasks:\n", - " - name: Only this task is run on one of the db nodes\n", + " - name: Only this task is run on one of the db nodes.\n", " run_once: yes\n", " \n", " - name: Other tasks are run on all nodes!\n", "```\n", "\n", - "We can even delegate the execution on a given host (eg. the ansible one)\n", + "We can even delegate the execution on a given host (e.g., the ansible one)\n", "\n", - "```\n", + "```yaml\n", "- hosts: db\n", " tasks:\n", - " - name: run this task from the local ansible host\n", + " - name: Run this task from the local ansible host.\n", " run_once: yes\n", " delegate_to: localhost\n", " shell: |\n", @@ -73,15 +109,7 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cd /notebooks/exercise-07" - ] - }, - { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -94,8 +122,6 @@ " - curl\n", " - file, copy & fetch\n", "\n", - "Creating small reports.\n", - "\n", "More fun with:\n", "\n", " - iterations\n", @@ -107,6 +133,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -117,7 +144,7 @@ "\n", "Gathering facts may be time-consuming, so you can [tune it via ansible.cfg](http://docs.ansible.com/ansible/intro_configuration.html#gathering) or disable it\n", "\n", - "```\n", + "```yaml\n", "- hosts: web\n", " gather_facts: no\n", " tasks:\n", @@ -142,6 +169,16 @@ ] }, { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!ansible-playbook debug.yml --tags groups" + ] + }, + { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -160,18 +197,20 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Hints\n", "\n", " - use `ansible_facts` as possible \n", - " - avoid gathering facts with uname & co\n", - " - test and template your iterations statically instead of continuosly gathering facts\n", + " - avoid gathering facts using system commands like `uname` & co\n", + " - test and template your iterations statically instead of continuosly gathering facts (do you remember lesson 03_facts_and_variables?) )\n", " " ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -181,9 +220,17 @@ "\n", "Between set variables we have:\n", "\n", - " - hostvars\n", - " - groups\n", - " \n" + "- `groups`\n", + "- `hostvars`\n", + "\n", + "⚠ Fact gathering requires that specific tools are installed on the target host.\n", + "For example, gathering IP addresses requires the `iproute2` package to be installed.\n", + "\n", + "#### Exercise:\n", + "\n", + "1. Run the following playbook and look at the error message: which fact is missing?\n", + "1. Can you gather the missing fact using the `setup` module? Why? **Hint: access the container and try to run `ip addr`.**\n", + "1. Can you fix the playbook to ensure that the `ip` fact is gathered?" ] }, { @@ -192,10 +239,11 @@ "metadata": {}, "outputs": [], "source": [ - "!ansible-playbook debug.yml --tags hostvars" + "!ansible-playbook hostvars.yml" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "solution": "hidden", @@ -208,6 +256,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "solution": "hidden" @@ -217,24 +266,33 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Filters\n", "\n", - "We can process hostvars using jinja filters (see the facts and variable lesson). \n", + "We can process hostvars using jinja filters (see the \"facts and variables\" lesson). \n", "\n", "Here is a [list of useful filters](http://docs.ansible.com/ansible/latest/playbooks_filters.html)\n", "\n", "\n", "Remember: a filter is essentially a function returning a function, like a [python lambda](https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions).\n", "\n", - "```\n", + "```python\n", "int_filter = lambda x: int(x)\n", - "```\n", + "```" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", "A more complex filter: \n", - "```\n", + "\n", + "```yaml\n", "- name: This is a getter\n", " debug:\n", " msg: >\n", @@ -244,9 +302,69 @@ "```\n", "\n", "where\n", - "```\n", + "\n", + "```python\n", "hostvars_getter = lambda host: hostvars[host]['key1'][..]['keyN']\n", "```\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Exercise\n", + "\n", + "Given the data in the cell below, identify the output of the following filter:\n", + "\n", + "```yaml\n", + "debug:\n", + " msg: >-\n", + " hosts | map('extract', hostvars, ['ipv4', 'address'])\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Given the following data, identify the output of\n", + "hosts = [ \"host1\", \"host2\" ]\n", + "hostvars = {\n", + " \"host2\": {\n", + " \"ipv4\": {\n", + " \"address\": \"172.17.0.1\"\n", + " }\n", + " },\n", + " \"host2\": {\n", + " \"ipv4\": {\n", + " \"address\": \"172.17.0.2\"\n", + " }\n", + " }\n", + "}\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Exercise (advanced)\n", + "\n", + "Write a python function fmap associated to the above filter.\n", + "Hints:\n", + "1. `fmap` returns a function that takes a list as input;\n", + "1. `fmap` takes hostvars as a closure." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", "You can pipeline filters and test incrementally." ] @@ -261,6 +379,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -268,15 +387,18 @@ "\n", "Creating user and installing packages is easy\n", "\n", - "```\n", + "```yaml\n", " - name: Install apache\n", - " apt: item=\"{{item}}\" state=present\n", + " apt:\n", + " item: \"{{item}}\" state=present\n", " with_items:\n", " - apache2\n", " - curl\n", " \n", " - name: Remove wget\n", - " apt: item=wget state=absent\n", + " apt:\n", + " item: wget \n", + " state: absent\n", "```" ] }, @@ -308,6 +430,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -339,6 +462,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -368,6 +492,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -379,6 +504,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -389,7 +515,7 @@ " - every command stdout/stderr is redirected to a given file\n", " - before and after every command output print a header and a footer (eg. the expected output is like\n", " \n", - "```\n", + "```text\n", "--- START COMMAND: cat /etc/resolv.conf --\n", "nameserver 172.17.0.1\n", "-- END COMMAND: cat /etc/resolv.conf\n", @@ -412,6 +538,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -429,7 +556,7 @@ "\n", "Here's a full example!\n", "\n", - "```\n", + "```yaml\n", " - name: This shell task will not modify the system\n", " shell: |\n", " pgrep -fa tomcat\n", @@ -471,6 +598,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -485,7 +613,7 @@ " \n", "*service* manages and enables services\n", "\n", - "```\n", + "```yaml\n", " - name: Restart httpd\n", " service: \n", " name: httpd\n", @@ -496,21 +624,18 @@ "*systemd* manages and enables services with systemd. It can reload systemd configuration too\n", "\n", "\n", - "```\n", - "\n", + "```yaml\n", " - name: Reload docker with new systemd config\n", " systemd:\n", " state: restarted\n", " name: docker\n", " daemon_reload: yes\n", - "\n", - "\n", "```\n", " \n", "*mount* populates entries in /etc/fstab and mounts associate filesystem.\n", "\n", "\n", - "```\n", + "```yaml\n", " - name: Check if mongod LUN is mounted\n", " register: mongod_on_storage\n", " mount:\n", @@ -518,7 +643,6 @@ " src: /dev/sdc\n", " fstype: xfs\n", " state: present # creates an entry in /etc/fstab. `mounted` does the actual mount.\n", - "\n", "```\n", "\n", "#### Exercise\n", diff --git a/ansible-101/notebooks/07_templates.ipynb b/ansible-101/notebooks/07_templates.ipynb index 1dfcc88..46e0c28 100644 --- a/ansible-101/notebooks/07_templates.ipynb +++ b/ansible-101/notebooks/07_templates.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -21,6 +22,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -91,6 +93,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -127,6 +130,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -140,7 +144,7 @@ "In this recap exercise, write the [add_key.yml](/edit/notebooks/exercises-07/add_key.yml) playbook which:\n", "\n", " - authenticates with `root:root` credentials on remote hosts\n", - " - generate a new ecdsa PK for local `root`\n", + " - generate a new ed25519 PK for local `root`\n", " - creates the fizz user on remote hosts with:\n", " * a keypair\n", " * a password\n", diff --git a/ansible-101/notebooks/08_yaml_pitfalls.ipynb b/ansible-101/notebooks/08_yaml_pitfalls.ipynb index e5192bb..dcb7115 100644 --- a/ansible-101/notebooks/08_yaml_pitfalls.ipynb +++ b/ansible-101/notebooks/08_yaml_pitfalls.ipynb @@ -1,27 +1,12 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Yaml\n", - "\n", - "Except for `ansible.cfg` which is an .ini file, all ansible files are in `yaml`, so let's spent some time on YAML.\n", - "\n", - "At the end of [inventories chapter](/notebooks/notebooks/05_inventories.ipynb) we showed how to use yaml to define list and maps variables.\n", - "\n", - "In this chapter we'll go a bit further.\n", - "\n", - "## Goals\n", - "\n", - " - what's yaml\n", - " - parsing and dumping yaml with python\n", - " - strings: quotes and multi-line\n", - " \n", - "## See also\n", - "\n", - " - [Yaml in ansible](http://docs.ansible.com/ansible/YAMLSyntax.html)\n", - " - [Yaml reference](http://www.yaml.org/spec/1.2/spec.html)" + "# YAML Pitfalls\n", + "#### ([exercise directory](/tree/notebooks/exercise-06))" ] }, { @@ -34,10 +19,35 @@ ] }, { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Except for `ansible.cfg` which is an .ini file, all ansible files are in YAML, so let's spent some time on YAML.\n", + "\n", + "At the end of [inventories chapter](/notebooks/notebooks/05_inventories.ipynb) we showed how to use YAML to define list and maps variables.\n", + "\n", + "In this chapter we'll go a bit further.\n", + "\n", + "## Goals\n", + "\n", + "- what's YAML\n", + "- parsing and dumping yaml with python\n", + "- strings: quotes and multi-line\n", + "\n", + "## See also\n", + "\n", + "- [YAML in ansible](https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html)\n", + "- [YAML reference](http://www.yaml.org/spec/1.2/spec.html)" + ] + }, + { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "## What's yaml?" + "## What's YAML?" ] }, { @@ -49,9 +59,9 @@ "import yaml\n", "\n", "txt = \"\"\"\n", - "{ \"yaml\": 'is', 'a superset': 'of json'}\n", + "{ \"YAML\": 'is', '~ a superset': 'of JSON'}\n", "\"\"\"\n", - "ret = yaml.load(txt)\n", + "ret = yaml.safe_load(txt)\n", "print(ret)" ] }, @@ -62,7 +72,7 @@ "outputs": [], "source": [ "# Yoda loves dictionaries ;)\n", - "print(yaml.dump(ret))" + "print(yaml.safe_dump(ret))" ] }, { @@ -72,7 +82,7 @@ "outputs": [], "source": [ "# Customized dumper\n", - "print(yaml.dump(ret, default_flow_style=False))" + "print(yaml.safe_dump(ret, default_flow_style=False))" ] }, { @@ -86,8 +96,8 @@ "you: {'can':'use', 'brace':'syntax'}\n", "\"\"\"\n", "\n", - "ret = yaml.load(txt)\n", - "print(yaml.dump(ret))" + "ret = yaml.safe_load(txt)\n", + "print(yaml.safe_dump(ret))" ] }, { @@ -96,7 +106,7 @@ "metadata": {}, "outputs": [], "source": [ - "print(yaml.dump(ret, default_flow_style=False))" + "print(yaml.safe_dump(ret, default_flow_style=False))" ] }, { @@ -106,14 +116,14 @@ "outputs": [], "source": [ "# Yaml can describe list..\n", - "print(yaml.load(\"\"\"\n", + "print(yaml.safe_load(\"\"\"\n", "- tasks:\n", " - contains \n", " - a\n", " - list\n", " - of\n", " - modules\n", - "\"\"\"))\n" + "\"\"\"))" ] }, { @@ -123,7 +133,7 @@ "outputs": [], "source": [ "# .. and maps / dicts\n", - "print(yaml.load(\"\"\"\n", + "print(yaml.safe_load(\"\"\"\n", "- tasks:\n", " - name: \"this dict has two keys: name and debug\"\n", " debug: msg=\"Welcome to Rimini!\"\n", @@ -131,6 +141,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -152,7 +163,7 @@ "metadata": {}, "outputs": [], "source": [ - "print(yaml.load(\"\"\"\n", + "print(yaml.safe_load(\"\"\"\n", "this_works: http://no-spaces-after-colon:8080\n", "\"\"\"))\n" ] @@ -163,7 +174,7 @@ "metadata": {}, "outputs": [], "source": [ - "print(yaml.load(\"\"\"this_no: spaces: after colon\"\"\")) \n" + "print(yaml.safe_load(\"\"\"this_no: spaces: after colon\"\"\")) \n" ] }, { @@ -173,7 +184,7 @@ "outputs": [], "source": [ "# Quoting is important!\n", - "print(yaml.load(\"\"\"\n", + "print(yaml.safe_load(\"\"\"\n", "that: \"works: though\"\n", "\"\"\"))" ] @@ -185,23 +196,24 @@ "outputs": [], "source": [ "# This is fine \n", - "print(yaml.load(\"\"\"\n", + "print(yaml.safe_load(\"\"\"\n", "this_is: fine={{in_yaml}} but\n", "\"\"\"))\n", "\n", "# but with ansible you should\n", - "print(yaml.load(\"\"\"\n", - "always: quote=\"{{moustaches}}\"\n", + "print(yaml.safe_load(\"\"\"\n", + "always: quote=\"{{ moustaches }}\"\n", "\"\"\"))" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Long texts\n", "\n", - "Long texts are easy and clean as long as you *** use `>` and `|` instead of quoting ***." + "Long texts are easy and clean as long as you ***use `>` and `|` instead of quoting***." ] }, { @@ -231,6 +243,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -258,7 +271,7 @@ " Rimini, or the ancient Ariminum, \n", " is an art heritage city with over 22 centuries of history. \n", " \n", - " In 268 B.C., the Roman Senate nsent six thousand settlers \n", + " In 268 B.C., the Roman Senate sent six thousand settlers \n", " who founded the city that was meant to be strategically central \n", " and to develop to this day.\n", "\n", @@ -266,7 +279,7 @@ " Rimini, or the ancient Ariminum, \n", " is an art heritage city with over 22 centuries of history. \n", " \n", - " In 268 B.C., the Roman Senate nsent six thousand settlers \n", + " In 268 B.C., the Roman Senate sent six thousand settlers \n", " who founded the city that was meant to be strategically central \n", " and to develop to this day.\n", "\n", @@ -278,6 +291,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -298,14 +312,15 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Yaml and Ansible recap\n", + "# YAML and Ansible recap\n", "\n", - "## Yaml\n", + "## YAML\n", "\n", - " - all files are yaml but inventories (for now) and ansible.cfg\n", + " - all files are yaml but inventories (for now) and `ansible.cfg`\n", " - prefer `>` and `|` over quote hell\n", " - ALWAYS QUOTE `:`\n", "\n", @@ -323,6 +338,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/ansible-101/notebooks/diagrams.md b/ansible-101/notebooks/diagrams.md new file mode 100644 index 0000000..1f38588 --- /dev/null +++ b/ansible-101/notebooks/diagrams.md @@ -0,0 +1,108 @@ +# Docker connectors + + +```mermaid +graph LR + +subgraph docker[docker fab:fa-docker] +subgraph pad[ ] +c1[container1 fa:fa-cube] +c2[container2 fa:fa-cube] +s1((IP 1 fa:fa-network-wired)) +s2((IP 2 fa:fa-network-wired)) +end +dockerds((docker\nIP fa:fa-network-wired)) +dockerd[[Docker\nserver\n fa:fa-cogs fab:fa-docker]] +end +s1 -.-> c1 +s2 -.-> c2 + +subgraph ansible_connection +ssh-inventory[ssh module fa:fa-lock] +docker-inventory[docker module fab:fa-docker] +end + +ssh-inventory -->|ssh| s1 & s2 +docker-inventory -->|docker| dockerds +dockerds -->dockerd +c1 & c2 ---|<| dockerd + +``` + +# Ansible architecture + +```mermaid +graph + +vault[vault fa:fa-lock] +keys[ssh keys fa:fa-key] +subgraph ansible.cfg[ansible.cfg fa:fa-file ] +other +vault_config +auth_config +end + +subgraph inventory[inventory fa:fa-file / fa:fa-globe] +s1[prod fa:fa-server] +s2[test fa:fa-server] +s3[other... fa:fa-server] +end + +subgraph group_vars[group_vars fa:fa-folder / fa:fa-globe ] +gv1[prod] +gv2[test] +end + +ansible.cfg -->|references| inventory +s1 -.- gv1 +s2 -.- gv2 + +vault_config --> vault +auth_config --> keys + +ansible.cfg --->|references| modules & roles[roles fa:fa-folder] +``` + + +# IaC + +```mermaid +--- +title: Infrastructure as Code +--- +graph LR + +dev(("  fa:fa-user fa:fa-laptop  \ndev ")) +--> |fa:fa-code-pull-request\npull request| repo[(fa:fa-code\nrepository\nscripts\ntemplates\nhosts)] +--> engine + +engine --- |>\nOK| infrastructure +dev ---|<\nKO|engine +engine -.-o|get data| ITSM[ITSM fa:fa-server fa:fa-gears] +subgraph engine[IaC Engine fa:fa-gears] +analysis +--- validation{check} +--- deployment +end + +subgraph infrastructure[Infrastructure] +direction TB +prod["Production\nfa:fa-server fa:fa-server fa:fa-server +fa:fa-database fa:fa-database fa:fa-database +fa:fa-network-wired fa:fa-network-wired fa:fa-network-wired"] +test["Test\nfa:fa-server fa:fa-server fa:fa-server +fa:fa-database fa:fa-database fa:fa-database +fa:fa-network-wired fa:fa-network-wired fa:fa-network-wired"] +end + +linkStyle 3 stroke:red +linkStyle 2 stroke:green +``` + +# Ansible + +- a static or dynamic inventory of all the nodes to manage +- ssh keys to use +- users and secrets to connect to the hosts +- whether to do privilege escalation (eg. sudo, ...) before running tasks +- if nodes should be accessed via a bastion host, docker, ... diff --git a/ansible-101/notebooks/exercise-01/.pin b/ansible-101/notebooks/exercise-01/.pin deleted file mode 100644 index d97c5ea..0000000 --- a/ansible-101/notebooks/exercise-01/.pin +++ /dev/null @@ -1 +0,0 @@ -secret diff --git a/ansible-101/notebooks/exercise-01/ansible.cfg b/ansible-101/notebooks/exercise-01/ansible.cfg index 84cb2fe..d8e7bdb 100644 --- a/ansible-101/notebooks/exercise-01/ansible.cfg +++ b/ansible-101/notebooks/exercise-01/ansible.cfg @@ -10,5 +10,11 @@ host_key_checking = no private_key_file = id_ansible # We want to store root password in an encrypted file -# but don't want to be prompted for a password each time -vault_password_file = .pin +# but don't want to be prompted for a password each time. +# N.B. If this file is not present, ansible will show an error! +# vault_password_file = .pin + + +[ssh_connection] +# We will discuss this line later on. +ssh_args = -o UserKnownHostsFile=/dev/null diff --git a/ansible-101/notebooks/exercise-01/copy-key.yml b/ansible-101/notebooks/exercise-01/copy-key.yml index 13dca46..9a370f1 100644 --- a/ansible-101/notebooks/exercise-01/copy-key.yml +++ b/ansible-101/notebooks/exercise-01/copy-key.yml @@ -2,7 +2,7 @@ # Load variables from the following files - hosts: course vars_files: - - vault.yml + - vault.yaml tasks: - name: Ensure /root/.ssh is present file: @@ -18,3 +18,8 @@ owner: root group: root force: yes +# +# Bonus track: +# search on the Internet an Ansible module to +# manage the authorized_keys. +# diff --git a/ansible-101/notebooks/exercise-01/inventory.docker b/ansible-101/notebooks/exercise-01/inventory.docker new file mode 100644 index 0000000..35423e7 --- /dev/null +++ b/ansible-101/notebooks/exercise-01/inventory.docker @@ -0,0 +1,15 @@ +# +# This inventory file is used to access the course machines +# using the docker connection plugin and perform +# some management tasks. For example, you can change the root +# password of the machines using the following command: +# +# ansible -i inventory.docker \ +# -m shell \ +# -a "echo 'root:{{root_password}}' | chpasswd" \ +# -e@vault.yml \ +# docker +# +[docker] +ansible-101_web_[1:2] ansible_connection=docker +ansible-101_bastion_1 ansible_connection=docker diff --git a/ansible-101/notebooks/exercise-03/ansible.cfg b/ansible-101/notebooks/exercise-03/ansible.cfg index da925d1..9dd8bad 100644 --- a/ansible-101/notebooks/exercise-03/ansible.cfg +++ b/ansible-101/notebooks/exercise-03/ansible.cfg @@ -1,3 +1,6 @@ +# +# Exercise: insert comments for every parameter. +# [defaults] inventory = inventory retry_files_enabled = no diff --git a/ansible-101/notebooks/exercise-03/cartesian.yml b/ansible-101/notebooks/exercise-03/cartesian.yml index 2d679b9..4ab37f5 100644 --- a/ansible-101/notebooks/exercise-03/cartesian.yml +++ b/ansible-101/notebooks/exercise-03/cartesian.yml @@ -1,3 +1,4 @@ +--- # # Ansible can generate cartesian products # which are useful for checking @@ -5,10 +6,10 @@ # - hosts: localhost tasks: - - name: Here is a cartesian product - debug: - msg: > - {{ 'Installing ' + item[0] + "-" + item[1] }} - with_cartesian: - - ["python", "python3"] - - [ "tox", "nose", "dnspython" ] + - name: Here is a cartesian product + debug: + msg: > + {{ 'Installing ' + item[0] + "-" + item[1] }} + with_cartesian: + - [python, python3] + - [tox, nose, dnspython] diff --git a/ansible-101/notebooks/exercise-03/conditions.yml b/ansible-101/notebooks/exercise-03/conditions.yml index 271d84d..5e1bf17 100644 --- a/ansible-101/notebooks/exercise-03/conditions.yml +++ b/ansible-101/notebooks/exercise-03/conditions.yml @@ -1,24 +1,26 @@ - +--- - hosts: localhost tags: when tasks: - - debug: msg="This always happens" - when: true - - debug: msg="This never does" - when: false + - debug: msg="This always happens" + when: true + - debug: msg="This never does" + when: false - hosts: localhost tags: assert tasks: - - debug: msg="This is Linux!" - when: ansible_system == 'Linux' - - - fail: msg="Stop processing now!" - when: ansible_architecture == 'x86_64' + - debug: + msg: "This is Linux!" + when: ansible_system == 'Linux' + - fail: + msg: "Stop processing now!" + when: ansible_architecture == 'x86_64' - hosts: localhost tags: exercise tasks: - - debug: msg="Replace me" - when: true + - debug: + msg: "Replace me" + when: true diff --git a/ansible-101/notebooks/exercise-03/environment.yml b/ansible-101/notebooks/exercise-03/environment.yml index 92f0d78..f0de447 100644 --- a/ansible-101/notebooks/exercise-03/environment.yml +++ b/ansible-101/notebooks/exercise-03/environment.yml @@ -1,8 +1,9 @@ +--- - hosts: localhost tasks: - - name: Iterate thru environment - debug: - var: > - ansible_env.{{item}} - with_items: > - {{ansible_env | map('regex_search', '^PATH') | select('string') | list }} + - name: Iterate thru environment + debug: + var: > + ansible_env.{{ item }} + with_items: > + {{ ansible_env | map('regex_search', '^PATH') | select('string') | list }} diff --git a/ansible-101/notebooks/exercise-03/fileglob.yml b/ansible-101/notebooks/exercise-03/fileglob.yml index 874070c..0721028 100644 --- a/ansible-101/notebooks/exercise-03/fileglob.yml +++ b/ansible-101/notebooks/exercise-03/fileglob.yml @@ -1,15 +1,18 @@ +--- - hosts: web tags: fileglob tasks: - - name: You can implement a remote fileglob in 2 steps - shell: > - ls /etc/host* - register: fileglob_remote + - name: You can implement a remote fileglob in 2 steps + shell: > + ls /etc/host* + register: fileglob_remote - - name: Here we go - debug: msg="{{item}}" - with_items: > - {{fileglob_remote.stdout_lines}} + - name: Here we go + debug: + msg: >- + {{ item }} + with_items: > + {{ fileglob_remote.stdout_lines }} - hosts: web, localhost @@ -17,9 +20,10 @@ environment: WELCOME: Benvenuti a Rimini! tasks: - - name: Passing a shell variable to the whole play - shell: > - echo $WELCOME - register: o - - name: EuroPython is here - debug: var=o.stdout + - name: Passing a shell variable to the whole play + shell: > + echo $WELCOME + register: o + - name: EuroPython is here + debug: + var: o.stdout diff --git a/ansible-101/notebooks/exercise-03/get-facts-solution.yml b/ansible-101/notebooks/exercise-03/get-facts-solution.yml new file mode 100644 index 0000000..b89fba1 --- /dev/null +++ b/ansible-101/notebooks/exercise-03/get-facts-solution.yml @@ -0,0 +1,27 @@ +--- +# +# Use this playbook to dump ansible facts +# +- hosts: localhost + name: > + Use this section to complete the exercise, + and the next section as a reference for + the debug module. + tasks: + - name: Dump the requested facts. + debug: + msg: A string + - name: Hostname + debug: + msg: >- + {{ ansible_hostname }} + - name: First ip address + debug: + msg: >- + {{ ansible_all_ipv4_addresses[0] }} + - name: Distribution + debug: + msg: "{{ ansible_distribution }}" + - name: Kernel release + debug: + msg: "{{ ansible_kernel }}" diff --git a/ansible-101/notebooks/exercise-03/get-facts.yml b/ansible-101/notebooks/exercise-03/get-facts.yml index 24125eb..afb9dd0 100644 --- a/ansible-101/notebooks/exercise-03/get-facts.yml +++ b/ansible-101/notebooks/exercise-03/get-facts.yml @@ -1,3 +1,4 @@ +--- # # Use this playbook to dump ansible facts # @@ -7,9 +8,9 @@ and the next section as a reference for the debug module. tasks: - - name: Dump the requested facts. - debug: msg="A string" - + - name: Dump the requested facts. + debug: + msg: A string # # Read this for reference @@ -17,17 +18,21 @@ - hosts: localhost name: Those tasks are run on localhost only tasks: - - name: This is the debug module. - debug: msg="A string" + - name: This is the debug module. + debug: + msg: A string - - name: The debug module can print variables too - debug: var=ansible_hostname + - name: The debug module can print variables too + debug: + var: ansible_hostname - - name: We can iterate too - debug: msg="{{item}}" - with_items: "{{ansible_system_capabilities}}" + - name: We can iterate too... + debug: + msg: "{{ item }}" + with_items: "{{ ansible_system_capabilities }}" - - name: and inspect/format variables - debug: msg="The device is {{item.device}}" - with_items: > - {{ansible_mounts}} + - name: ..and inspect/format variables + debug: + msg: The device is {{ item.device }} + with_items: > + {{ ansible_mounts }} diff --git a/ansible-101/notebooks/exercise-03/vars-and-facts-solution.yml b/ansible-101/notebooks/exercise-03/vars-and-facts-solution.yml new file mode 100644 index 0000000..ba9f4e6 --- /dev/null +++ b/ansible-101/notebooks/exercise-03/vars-and-facts-solution.yml @@ -0,0 +1,38 @@ +--- +- hosts: localhost + tags: variables + vars: + - one: 1 + - pi: 3.1415 + tasks: + - debug: + msg: > + {{ ansible_hostname }} {{ one }} + - debug: + msg: > + The output is {{ one + pi }} + + +- hosts: localhost + tags: filters + vars: + - one: 1 + - pi: 3.1415 + tasks: + - name: Ansible can process expressions using filters + debug: + msg: > + Floor it {{ ( one + pi ) | int }} + +- hosts: localhost + tags: exercise + name: Use this cell for the exercise + tasks: + - name: > + Show the free percentage of the local disk using + facts and filters. Restricted to unique devices. + debug: + msg: > + {{ item.device }} {{ (100 * item.size_available / item.size_total) | int }}% + with_items: >- + {{ ansible_mounts}} diff --git a/ansible-101/notebooks/exercise-03/vars-and-facts.yml b/ansible-101/notebooks/exercise-03/vars-and-facts.yml index 289edfc..f35e902 100644 --- a/ansible-101/notebooks/exercise-03/vars-and-facts.yml +++ b/ansible-101/notebooks/exercise-03/vars-and-facts.yml @@ -1,34 +1,38 @@ --- +# +# This playbook has 3 tasklists, each with a different tag. +# - hosts: localhost tags: variables vars: - - one: 1 - - pi: 3.1415 + - one: 1 + - pi: 3.1415 tasks: - - debug: - msg: > - {{ansible_hostname }} {{ one }} - - debug: - msg: > - The output is {{ one + pi }} + - debug: + msg: > + {{ ansible_hostname }} {{ one }} + - debug: + msg: > + The output is {{ one + pi }} - hosts: localhost tags: filters vars: - - one: 1 - - pi: 3.1415 + - one: 1 + - pi: 3.1415 tasks: - - name: Ansible can process expressions using filters - debug: - msg: > - Floor it {{ ( one + pi ) | int }} + - name: Ansible can process expressions using filters + debug: + msg: > + Floor it {{ ( one + pi ) | int }} - hosts: localhost tags: exercise name: Use this cell for the exercise tasks: - - name: > - Show the free percentage of the local disk using - facts and filters - debug: msg="Replace me" + - name: > + Show the free percentage of the local disk using + facts and filters + debug: + msg: "Replace me" diff --git a/ansible-101/notebooks/exercise-05/inventory b/ansible-101/notebooks/exercise-05/inventory index 73e3cc2..0b65463 100644 --- a/ansible-101/notebooks/exercise-05/inventory +++ b/ansible-101/notebooks/exercise-05/inventory @@ -1,4 +1,4 @@ -# I can group hosts in inventory +# I can group hosts in an inventory. [web:children] web_rome @@ -8,28 +8,29 @@ web_milan web_rome_test web_rome_prod +# Fix IP addresses if they don't match. [web_rome_prod] -172.23.0.[3:4] +172.17.0.[3:4] [web_milan] 172.24.0.[5:6] -# further host variables +# Further host variables. [web_rome:vars] ansible_username=root -# Connect with docker +# Connect with docker. [web_rome_test:vars] ansible_connection=docker ansible_docker_extra_args="-Htcp://172.17.0.1" -# The actual host reference +# The actual host reference. [web_rome_test] ansible101_web_1 # -# Don't need to be Ssh +# Don't need to be ssh # to be my local machine ;) # [course] diff --git a/ansible-101/notebooks/exercise-05/inventory-docker-solution.py b/ansible-101/notebooks/exercise-05/inventory-docker-solution.py index f2ca03b..b7c7cdb 100755 --- a/ansible-101/notebooks/exercise-05/inventory-docker-solution.py +++ b/ansible-101/notebooks/exercise-05/inventory-docker-solution.py @@ -6,7 +6,7 @@ from collections import defaultdict # -# Manage different docker libraries +# Support different docker libraries. # try: from docker import Client @@ -19,32 +19,48 @@ logging.basicConfig(level=logging.DEBUG) -def print_hosts(): +def get_inventory_data(container): + return { + "container_name": container["Names"][0][1:], + "ip_address": container["NetworkSettings"]["Networks"]["bridge"]["IPAddress"], + "group_name": container["Labels"].get("com.docker.compose.service"), + } + + +def create_inventory(): + # + # Create a Docker client connecting to the docker daemon port. + # c = Client(base_url="http://172.17.0.1:2375/") - container_fmt = lambda x: ( - x["Names"][0][1:], - x["NetworkSettings"]["Networks"]["bridge"]["IPAddress"], - ) + inventory = {} - inventory = dict() + for container in c.containers(): + # Use str.format to log the container information. + host = get_inventory_data(container) + log.debug("Processing entry: {container_name}\t\t{ip_address}".format(**host)) - for x in c.containers(): - log.debug("Processing entry %r", "\t\t".join(container_fmt(x))) + # Skip parsing errors, and log a warning. try: - group_name = x["Labels"]["com.docker.compose.service"] - ip_address = x["NetworkSettings"]["Networks"]["bridge"]["IPAddress"] + group_name = host["group_name"] + ip_address = host["ip_address"] if group_name not in inventory: inventory[group_name] = defaultdict(list) inventory[group_name]["hosts"].append(ip_address) except KeyError: log.warning("Host not run via docker-compose: skipping") - inventory["web"]["host_vars"] = { + # + # Replace host variables for the "web" group. + # + inventory["web"]["vars"] = { "ansible_ssh_common_args": " -o StrictHostKeyChecking=no " } ret = json.dumps(inventory, indent=True) return ret - +# +# Execute the script. +# if __name__ == "__main__": - print(print_hosts()) + inventory_text = create_inventory() + print(inventory_text) diff --git a/ansible-101/notebooks/exercise-05/inventory-docker.py b/ansible-101/notebooks/exercise-05/inventory-docker.py index bdcbe5d..1455e44 100755 --- a/ansible-101/notebooks/exercise-05/inventory-docker.py +++ b/ansible-101/notebooks/exercise-05/inventory-docker.py @@ -1,27 +1,41 @@ #!/usr/bin/env python -# List our containers. Note: this only works with docker-compose containers. +# +# Exercise: Complete this inventory script. +# +# Note: this only works with docker-compose containers +# setting the "com.docker.compose.service" label. +# from __future__ import print_function import logging -from collections import defaultdict log = logging.getLogger() logging.basicConfig(level=logging.DEBUG) - +# +# Run this script in jupyter and fix one issue at a time. +# c = Client(base_url="http://172.17.0.1:2375/") -container_fmt = lambda x: ( - x["Names"][0][1:], - x["Labels"]["com.docker.compose.service"], - x["NetworkSettings"]["Networks"]["bridge"]["IPAddress"], -) +def get_inventory_data(container): + return { + "container_name": container["Names"][0][1:], + "ip_address": container["NetworkSettings"]["Networks"]["bridge"]["IPAddress"], + "group_name": container["Labels"].get("com.docker.compose.service"), + } + + +inventory = {} + +for container in c.containers(): + # Use str.format to log the container information. + host = get_inventory_data(container) + log.debug("Processing entry: {container_name}\t\t{ip_address}".format(**host)) + group_name = host["group_name"] + ip_address = host["ip_address"] -inventory = defaultdict(list) + if group_name not in inventory: + inventory[group_name]= {"hosts": []} -for x in c.containers(): - log.debug("Processing entry %r", "\t\t".join(container_fmt(x))) - group_name = x["Labels"]["com.docker.compose.service"] - ip_address = x["NetworkSettings"]["Networks"]["bridge"]["IPAddress"] - inventory[group_name].append(ip_address) + inventory[group_name]["hosts"].append(ip_address) diff --git a/ansible-101/notebooks/exercise-06/ansible.cfg b/ansible-101/notebooks/exercise-06/ansible.cfg index 8b2c0ff..b983eff 100644 --- a/ansible-101/notebooks/exercise-06/ansible.cfg +++ b/ansible-101/notebooks/exercise-06/ansible.cfg @@ -1,7 +1,6 @@ -[defaults] -inventory = inventory -host_key_checking = False -vault_password_file = pin - -[ssh_connection] -ssh_args = -F ssh_config +# +# Write here your ansible.cfg +# +# * reference a pin file +# * pass [`[ssh_connection]`](http://docs.ansible.com/ansible/intro_configuration.html#openssh-specific-settings) arguments to avoid ssh key mismatches +# * point to the local inventory diff --git a/ansible-101/notebooks/exercise-06/ansible.cfg-solution b/ansible-101/notebooks/exercise-06/ansible.cfg-solution new file mode 100644 index 0000000..8b2c0ff --- /dev/null +++ b/ansible-101/notebooks/exercise-06/ansible.cfg-solution @@ -0,0 +1,7 @@ +[defaults] +inventory = inventory +host_key_checking = False +vault_password_file = pin + +[ssh_connection] +ssh_args = -F ssh_config diff --git a/ansible-101/notebooks/exercise-06/inventory b/ansible-101/notebooks/exercise-06/inventory index 12bf354..e4ef255 100644 --- a/ansible-101/notebooks/exercise-06/inventory +++ b/ansible-101/notebooks/exercise-06/inventory @@ -1,2 +1,3 @@ -[course] -172.17.0.[3:9] ansible_password=root +# +# Inventory file for the 06_bastion exercise. +# diff --git a/ansible-101/notebooks/exercise-06/inventory-solution b/ansible-101/notebooks/exercise-06/inventory-solution new file mode 100644 index 0000000..12bf354 --- /dev/null +++ b/ansible-101/notebooks/exercise-06/inventory-solution @@ -0,0 +1,2 @@ +[course] +172.17.0.[3:9] ansible_password=root diff --git a/ansible-101/notebooks/exercise-06/vault.yml b/ansible-101/notebooks/exercise-06/vault.yml index e69de29..e1e7dc5 100644 --- a/ansible-101/notebooks/exercise-06/vault.yml +++ b/ansible-101/notebooks/exercise-06/vault.yml @@ -0,0 +1,3 @@ +# +# Provide credentials in this vault file. +# diff --git a/ansible-101/notebooks/exercise-07/debug.yml b/ansible-101/notebooks/exercise-07/debug.yml index 593a365..a09b27c 100644 --- a/ansible-101/notebooks/exercise-07/debug.yml +++ b/ansible-101/notebooks/exercise-07/debug.yml @@ -4,48 +4,16 @@ tasks: - name: This is the debug module. debug: msg="A string" - - - name: The debug module can print a variable too + - name: The debug module can print a variable too... debug: var=ansible_hostname - hosts: web tags: groups - name: those tasks are run on every web host - tasks: - - name: Iterating over a list - debug: - msg: > - Host: {{item}} - with_items: > - {{ groups['web'] }} - -- hosts: web[0] - tags: hostvars - name: Run only on first host + name: Those tasks are run on every web host tasks: - - name: Iterating over a map yields the keys - debug: - msg: > - Host: {{item}} - with_items: > - {{ hostvars }} - - name: Use subscript to access entries + - name: Iterating over the host in the "web" group. debug: msg: > - address: {{ hostvars[item]['ansible_default_ipv4']['address'] }} + Host: {{ item }} with_items: > {{ groups['web'] }} - - -- hosts: web[0] - tags: filters - name: Get a list of defined host ips. - tasks: - - - name: Using filters - debug: - msg: > - {{ groups['web'] | - map('extract', hostvars, ['ansible_default_ipv4', 'address']) | - reject('undefined') | - list }} diff --git a/ansible-101/notebooks/exercise-07/hostvars.yml b/ansible-101/notebooks/exercise-07/hostvars.yml new file mode 100644 index 0000000..618f5ee --- /dev/null +++ b/ansible-101/notebooks/exercise-07/hostvars.yml @@ -0,0 +1,43 @@ +# - hosts: web +# tasks: +# - name: >- +# Ensure iproute2 is installed on every node. +# NB: This may require specific python modules. +# apt: +# name: iproute2 +# state: present +- hosts: web + tags: hostvars + name: Last task runs only on first host + tasks: + - name: hostvars is a dictionary + debug: + var: hostvars + - name: Iterating over a dictionary yields the keys + debug: + msg: > + Host: {{ item }} + with_items: > + {{ hostvars }} + - name: >- + Use subscript to access entries. + NB: This task requires iproute2 installed on the remote host. + run_once: true + debug: + msg: > + address: {{ item }} -> {{ hostvars[item]['ansible_default_ipv4']['address'] }} + with_items: > + {{ groups['web'] }} + + +- hosts: web[0] + tags: filters + name: Get a list of defined host IPs. + tasks: + - name: Using filters + debug: + msg: > + {{ groups['web'] | + map('extract', hostvars, ['ansible_default_ipv4', 'address']) | + reject('undefined') | + list }} diff --git a/ansible-101/notebooks/exercise-07/inventory b/ansible-101/notebooks/exercise-07/inventory index 38c1bd6..8a992a9 100644 --- a/ansible-101/notebooks/exercise-07/inventory +++ b/ansible-101/notebooks/exercise-07/inventory @@ -2,8 +2,6 @@ ansible_connection=docker ansible_docker_extra_args="-Htcp://172.17.0.1" - - # The actual host reference [web] -ansible101_web_[1:3] +ansible-101_web_[1:2] diff --git a/ansible-101/notebooks/exercise-07/package-user.yml b/ansible-101/notebooks/exercise-07/package-user.yml index 38a6434..7b4e992 100644 --- a/ansible-101/notebooks/exercise-07/package-user.yml +++ b/ansible-101/notebooks/exercise-07/package-user.yml @@ -1,13 +1,16 @@ - hosts: web tasks: - name: Install apache and other packages eventually iterating - apt: name="{{item}}" + apt: + name: "{{item}}" with_items: - apache2 - curl - name: Remove wget - apt: name=wget state=absent + apt: + name: wget + state: absent - name: Create user user: @@ -24,7 +27,7 @@ src: package-user.yml dest: "{{ '~foo' | expanduser }}" - - name: > + - name: |- We can fetch files too (eg. logs): - files are dispatched to different directories. - we can avoid enforcing checksum as we're messing with diff --git a/ansible-101/notebooks/exercise-07/process-facts.yml b/ansible-101/notebooks/exercise-07/process-facts.yml index a458516..74998af 100644 --- a/ansible-101/notebooks/exercise-07/process-facts.yml +++ b/ansible-101/notebooks/exercise-07/process-facts.yml @@ -1,3 +1,7 @@ +# +# This playbook shows how to process facts without gathering them, +# e.g., for testing purposes. +# --- - hosts: localhost gather_facts: no diff --git a/ansible-101/notebooks/exercise-07/shell-output-01.yml b/ansible-101/notebooks/exercise-07/shell-output-01.yml index bb58a12..91cc241 100644 --- a/ansible-101/notebooks/exercise-07/shell-output-01.yml +++ b/ansible-101/notebooks/exercise-07/shell-output-01.yml @@ -9,9 +9,11 @@ register: o - name: Show output in a single block... - debug: var=o.stdout + debug: + var: o.stdout - name: ... or one per line - debug: var=item + debug: + var: item with_items: > {{ o.stdout_lines }} diff --git a/ansible-101/notebooks/intro.ipynb b/ansible-101/notebooks/intro.ipynb index 13065c3..ae81eee 100644 --- a/ansible-101/notebooks/intro.ipynb +++ b/ansible-101/notebooks/intro.ipynb @@ -28,14 +28,26 @@ " - [edit an existing file](/edit/notebooks/untitled.txt)\n", " - add more cells with `ALT+ENTER`\n", " \n", - "Go to the [basic python course](/tree/notebooks/rendered_notebooks/python-basic)" + "## Python terminal\n", + "\n", + "With Jupyter, you have a Python terminal at your disposal.\n", + "You can run Python code:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a string and the number 1\n", + "now s is increased 2\n" + ] + } + ], "source": [ "# You can evaluate maths and strings\n", "s = 1\n", @@ -45,6 +57,88 @@ "print(\"now s is increased \" + str(s))" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run simple, non interactive bash commands in a python cell, prefix them with `!`.\n", + "When you run a cell, the output is displayed below the cell.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "totale 576\n", + "-rw-rw-r--. 1 rpolli rpolli 16659 12 mag 17.10 00_teaser.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 8833 11 mag 11.38 01_architecture.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 9772 12 mag 15.25 02_delivery_layout.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 8312 15 mag 10.50 02_vaults.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 7433 15 mag 10.24 03_facts_and_variables.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 8258 6 lug 2019 04_loops_and_conditions.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 9868 22 set 2021 05_inventories.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 7306 6 lug 2019 06_bastion_and_ssh.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 14130 6 lug 2019 07_playbooks.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 5240 6 lug 2019 07_templates.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 8942 6 lug 2019 08_yaml_pitfalls.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 5892 6 lug 2019 09_roles.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 3260 6 lug 2019 10_galaxy_ok.ipynb\n", + "-rw-rw-r--. 1 rpolli rpolli 408823 22 set 2021 ansible-101.graphml\n", + "-rwxrwxr-x. 1 rpolli rpolli 263 22 set 2021 cleanup.sh\n", + "-rw-rw-r--. 1 rpolli rpolli 395 22 set 2021 custom.css\n", + "-rw-rw-r--. 1 rpolli rpolli 1718 15 mag 15.19 diagrams.md\n", + "drwxrwxr-x. 3 rpolli rpolli 142 11 mag 11.22 exercise-00\n", + "drwxrwxr-x. 2 rpolli rpolli 116 15 mag 10.48 exercise-01\n", + "drwxrwxr-x. 2 rpolli rpolli 169 11 mag 11.22 exercise-03\n", + "drwxrwxr-x. 3 rpolli rpolli 147 11 mag 11.21 exercise-05\n", + "drwxrwxr-x. 2 rpolli rpolli 129 11 mag 11.22 exercise-06\n", + "drwxrwxr-x. 2 rpolli rpolli 4096 11 mag 11.22 exercise-07\n", + "drwxrwxr-x. 3 rpolli rpolli 89 6 lug 2019 exercise-08\n", + "drwxrwxr-x. 2 rpolli rpolli 87 11 mag 11.22 exercise-09\n", + "drwxrwxr-x. 2 rpolli rpolli 67 6 lug 2019 images\n", + "-rw-rw-r--. 1 rpolli rpolli 5519 15 mag 15.31 intro.ipynb\n", + "drwxrwxr-x. 5 rpolli rpolli 59 15 mag 10.58 rendered_notebooks\n", + "-rw-rw-r--. 1 rpolli rpolli 35 22 set 2021 untitled.txt\n", + "-rw-rw-r--. 1 rpolli rpolli 163 22 set 2021 web\n" + ] + } + ], + "source": [ + "! ls -l" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "During the course, you will need to execute some shell code, that is rendered like the following\n", + "\n", + "```bash\n", + "# This is a bash cell.\n", + "echo \"What is your name?\"\n", + "read name\n", + "echo \"Hello $name!\"\n", + "```\n", + "\n", + "In these cases, you need to [open a terminal on the local machine](/terminals/example), for example following links like [this one](/terminals/example) and type the commands there. This is especially required for interactive tasks. \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python\n", + "\n", + "Go to the [basic python course](/tree/notebooks/rendered_notebooks/python-basic)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -64,14 +158,9 @@ "\n", "Docker is a lightweight container environment. Jupyter and all other \"machines\" are based on docker.\n", "\n", - "[Slideshare presentation](https://www.slideshare.net/ioggstream/docker-virtualizzazione-leggera)\n", - "\n", - "[Reveal JS](http://www.piumalab.org/dockerslide)\n", - "\n", - "Some examples via a [local terminal](/terminals/example)\n", - "\n", + "[Presentation (in Italian)](https://docs.google.com/presentation/d/15swQ2gHWAKYAm_ZbBme9rmzV1CpLNl1npvgrUyODu1s/)\n", "\n", - "Go to your [docker-101course](/notebooks/notebooks/rendered_notebooks/docker-101/01-docker.ipynb)" + "Go to your [docker beginners course](/notebooks/notebooks/rendered_notebooks/docker-101/)\n" ] }, { @@ -176,7 +265,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.13" + "version": "2.7.14" } }, "nbformat": 4, diff --git a/ansible-101/site-digitalocean.yml b/ansible-101/site-digitalocean.yml index 2a2cd50..8f4a9cb 100644 --- a/ansible-101/site-digitalocean.yml +++ b/ansible-101/site-digitalocean.yml @@ -9,42 +9,67 @@ # the digital_ocean module will create those droplets over and # over again. # +# You can retrieve the list of provisioned hosts with +# +# $ ansible --user=root -i /tmp/inventory.do -mshell \ +# -a 'docker exec -ti ansible-101_course_1 jupyter-notebook list | sed -e "s/0.0.0.0/{{ansible_host}}/" ' do +# - hosts: localhost + gather_facts: false + vars: + oauth_token: "{{ lookup('ansible.builtin.env', 'DO_API_TOKEN') }}" + ssh_pubkeys: + - rpolli-ed25519 + - esavo-rsa + - dabbasciano-rsa + droplet_names: + - deleteme-1 + - deleteme-2 + tasks: - name: Retrieve ssh key id. - digital_ocean: - state: present - command: ssh - name: rpolli - register: do_key + community.digitalocean.digital_ocean_sshkey_info: + oauth_token: "{{ oauth_token }}" + register: ssh_keys check_mode: no + - name: Set facts based on the gathered information + set_fact: + do_key: "{{ do_key | default([]) + ssh_keys | community.general.json_query(search_query) | default(item) }}" + vars: + search_query: "data[?name=='{{ item }}'].fingerprint" + # search_query: "data[?(@.name.match('{{ ssh_pubkeys | join ('|') }}'))].fingerprint" + # + # This should be the correct query, but Ansible fatals: + # + # fatal: [localhost]: FAILED! => {"msg": "JMESPathError in json_query filter plugin:\nUnknown function: match()"} + loop: "{{ ssh_pubkeys }}" + - name: Create enough machine for the course. - digital_ocean: + community.digitalocean.digital_ocean_droplet: state: present - command: droplet name: "{{item}}" unique_name: yes - ssh_key_ids: >- - {{do_key.ssh_key.id}} - size_id: 2gb - region_id: fra1 - image_id: docker-18-04 + ssh_keys: "{{ do_key }}" + size: s-2vcpu-4gb + region: fra1 + image: docker-18-04 wait_timeout: 500 + user_data: "{{ lookup('file', 'cloudinit.txt') }}" # b64encode is not needed in Ansible register: my_droplet - with_items: - - deleteme-1 - - deleteme-2 + with_items: "{{ droplet_names }}" - name: Dynamically add the new servers to the inventory. add_host: - hostname: > - {{ item.droplet.networks.v4[0].ip_address }} - groups: do + hostname: >- + {{ item.data.droplet.networks.v4 | community.general.json_query(jq) | first }} + groups: + - do ansible_user: root host_key_checking: no with_items: "{{my_droplet.results}}" - + vars: + jq: "[?(@.type=='public')].ip_address" - name: Create a sample inventory file with the server ips. file: @@ -57,13 +82,17 @@ - lineinfile: path: /tmp/inventory.do line: > - {{ item.droplet.networks.v4[0].ip_address }} droplet_id={{item.droplet.id}} + {{ item.data.droplet.networks.v4 | community.general.json_query(jq) | first }} droplet_id={{item.data.droplet.id}} with_items: "{{my_droplet.results}}" + vars: + jq: "[?(@.type=='public')].ip_address" # # Configure the newly created machines # - hosts: do + tags: + - setup vars: - ansible_python_interpreter: /usr/bin/python3 - ansible_user: root @@ -72,6 +101,15 @@ tasks: - ping: - block: + - name: Automatic shutdown crontab entry + cron: + name: "shutdown" + hour: 2 # timezone is Etc/UTC + minute: 25 + state: present + disabled: false + job: "/sbin/shutdown -r now" + - name: Docker should listen on localhost. lineinfile: path: /etc/systemd/system/multi-user.target.wants/docker.service @@ -87,7 +125,6 @@ state: restarted name: docker daemon_reload: yes - when: systemd_updated.changed - name: Check socket shell: | @@ -96,6 +133,7 @@ - name: Download course git: repo: https://github.com/ioggstream/python-course.git + version: ansible-2023 dest: /root/python-course ignore_errors: true diff --git a/docker-101/01-docker.md b/docker-101/01-docker.md new file mode 100644 index 0000000..c7b6c69 --- /dev/null +++ b/docker-101/01-docker.md @@ -0,0 +1,96 @@ + +# Docker 101 + +This is a crash docker course. + +## What is? + +Docker is a platform for developers and sysadmins to develop, + ship, and run applications. + +--- + +## Why it was born? + +To resolve a necessity + +Mobility workload in cloud systems + +- Cargo transport pre-1960 +- Solution: Intermodal Shipping Container + +--- + +### Docker is a Container System for Code + +Docker leverages LXC (Linux Containers), which encompasses Linux +features like cgroups and namespaces for strong process isolation and +resource control. + +They are lightweight and consume less resources than a virtual machine. + +--- + +## Benefits for developers + +- portability, build once... run anywhere +- no worries about missing dependencies, packages and other pain + points during subsequent deployments +- tracking changes +- run each app in its own isolated container, so you can run various + versions of libraries and other dependencies for each app without + worrying +- reduce/eliminate concerns about compatibility on different + platforms, either your own or your customers'. + +--- + +## Benefits for sysadmins + +- portability, configure once... run anywhere +- tracking changes +- simple to understand what application do +- simplify to upgrade application processes. Significantly improves + the speed and reliability of continuous deployment and continuous + integration systems +- eliminate inconsistencies between different enviroments (develop, testing, production) +- re-use other people images +- do you not need an hypervisor. Because the containers are so + lightweight, address significant performance, costs, deployment, and + portability issues normally associated with VMs + +--- + +## Docker Concepts and Interactions + +- **Host**, the machine that is running the containers. +- **Image**, a hierarchy of files, with meta-data for how to run a container. +- **Container**, a contained running process, started from an image. +- **Registry**, a repository of images. +- **Volume**, storage outside the container. +- **Dockerfile**, a script for creating images. + +---- + +[![](https://mermaid.ink/img/pako:eNptU8lu2zAQ_RWBZ8moZctVdOilKdAeekmBHirmMJLGFhMuAjkM6lr-91JbbCcBD3qjefM4G0-sNg2ygiVJwjUJklhE96Z-RhsJTWihJmG043okHCx0LddcO1-NOHrAg3Bkj-UDKkP4akd7qIo9JM2o9ci1WJec_VBwQBd8g6v2FTo-qM1ci00LtET6ymvyi_UEL7Dg7kit0ZwFVdTNTTrfjSOupwL2QmJ5gfOtM7xN7sVIr9CVv6fvTG2AoAKHgVAbTSA0WleWX1_xVSGPgSRNDTJUMXfkfbGXhIdzlVqSfOkrL2TTR7cigyfqCQ5vHdcpTaTaKCXoA4HBab3uo0vE2-hemdDsPpr78M7tCCzFjkwXWxyNWzWuh8aP1M67NgxVDMVf195fVmOiSfkxbRohi5lCq0A0YTlPXEcRZ9SiQs6KABvcg5fEGdfnQPVdmBV-awQZywqyHmMGnsyvo64Xe-LcCwiboli4ULrwtwP9xxi1kILJihP7y4p1lq-263SzyfI83WTp5zRmR1akd7vVLrvb5Vm-2W6zcM4x-zcqfFplMcMxh5_Toxrf1vk_Byk2hw?type=png)](https://mermaid.live/edit#pako:eNptU8lu2zAQ_RWBZ8moZctVdOilKdAeekmBHirmMJLGFhMuAjkM6lr-91JbbCcBD3qjefM4G0-sNg2ygiVJwjUJklhE96Z-RhsJTWihJmG043okHCx0LddcO1-NOHrAg3Bkj-UDKkP4akd7qIo9JM2o9ci1WJec_VBwQBd8g6v2FTo-qM1ci00LtET6ymvyi_UEL7Dg7kit0ZwFVdTNTTrfjSOupwL2QmJ5gfOtM7xN7sVIr9CVv6fvTG2AoAKHgVAbTSA0WleWX1_xVSGPgSRNDTJUMXfkfbGXhIdzlVqSfOkrL2TTR7cigyfqCQ5vHdcpTaTaKCXoA4HBab3uo0vE2-hemdDsPpr78M7tCCzFjkwXWxyNWzWuh8aP1M67NgxVDMVf195fVmOiSfkxbRohi5lCq0A0YTlPXEcRZ9SiQs6KABvcg5fEGdfnQPVdmBV-awQZywqyHmMGnsyvo64Xe-LcCwiboli4ULrwtwP9xxi1kILJihP7y4p1lq-263SzyfI83WTp5zRmR1akd7vVLrvb5Vm-2W6zcM4x-zcqfFplMcMxh5_Toxrf1vk_Byk2hw) + + +---- + +--- + +## Separation of concerns + +- inside the container: + - libreries + - package manager + - application + - data + - code +- outside the container: + - logging + - remote access + - network configuration + - monitoring + +--- diff --git a/docker-101/02-docker.md b/docker-101/02-docker.md new file mode 100644 index 0000000..de238a4 --- /dev/null +++ b/docker-101/02-docker.md @@ -0,0 +1,372 @@ +## Inspect the Docker host + +At first, we will inspect this machine: the operating system, the IP address and the rest. + +```python +# Distro +!cat /etc/issue +``` + +```python +# Linux version +!uname -a +``` + +```python +# IP address +! ip -4 -o address show eth0 +``` + +--- + +## Docker installation + +Check docker tools. + +```python +# Docker CLI version. +!docker --version +``` + +```python +# Docker server version +!dockerd --version +``` + +--- + +## Running a container + +Docker comes with a catalog of possible operating systems and applications named Docker Registry. You can deploy your custom registry too. + +Let's pull and run an image + +[![](https://mermaid.ink/img/pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s?type=png)](https://mermaid.live/edit#pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s) + +```python +# Search images from catalog +!docker search ubuntu|head +``` + +Download an image from the remote registry. + +```python +# Download the ubuntu image +!docker pull ubuntu:22.04 +``` + +Open a [terminal](/terminals/docker) and run an **interactive shell** (`--interactive`) with a terminal (`--tty`) +in a new container based on `ubuntu:22.04`. The `--rm` option removes the container when it exits. + +**NB: run the following commands in the terminal, not in the jupyter notebook** + +```bash +docker run --rm --tty --interactive ubuntu:22.04 /bin/bash +``` + +Then run the above commands to ensure that you are on another virtual hosts. + +```bash +# Operating System +cat /etc/issue +# Linux version +uname -a +``` + +--- + +#### Exercise + +What happens if you try to get the IP address using the following command? + +```bash +ip -4 -o a +``` + +Can you retrieve the IP address in another way? +**Hint: the `/proc` filesystem contains information about the system. Try to find the IP address in one of the files in `/proc`.** + +--- + +## Dockerizing Applications + +`busybox` is a lightweight Linux distribution. You can run an one-shot command in a container. + +```bash +docker run busybox /bin/echo 'Hello world' +``` + +--- + +## Docker commands + +Here is a list of docker commands. + +```text +docker create # creates a container but does not start it. +docker run # creates and starts a container. +docker stop # stops it. +docker start # will start it again. +docker restart # restarts a container. +docker rm # deletes a container. +docker kill # sends a SIGKILL to a container. +docker attach # will connect to a running container. +docker wait # blocks until container stops. +docker exec # executes a command in a running container. +``` + +You can inspect containers + +```text +docker ps # shows running containers. +docker inspect # information on a container (incl. IP address). +docker logs # gets logs from container. +docker events # gets events from container. +docker port # shows public facing port of container. +docker top # shows running processes in container. +docker diff # shows changed files in container's FS. +docker stats # shows metrics, memory, cpu, filsystem +``` + +#### Exercise + +1. List the running containers. + +```python +# Use this cell to run the correct docker command. +``` + +1. Inspect the `ansible-101_bastion_1` container. +1. Use the `--format` option to get the IP address on a [terminal](/terminals/docker). + **Hint 1: you can google for the solution.** +1. Try to run the `docker inspect --format ...` command above in the jupyter notebook. + Does it work? If not, why? + +```python +# Use this cell to run the correct docker command. +``` + +💬 Discuss how python treats the `{` character. + +--- + +## Images + +### Like VMs template images + +Docker leverages a [copy-on-write filesystem](https://docs.docker.com/storage/storagedriver/). +This allows Docker to instantiate containers very quickly. +Docker use to layering one container filesytem on top of another. +For example, you might create a container that is based on +a base Debian image, and then in turn create another container that is +based on the first container. + +[![](https://mermaid.ink/img/pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA?type=png)](https://mermaid.live/edit#pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA) + +This mechanism allows an efficient storage usage, since multiple containers can +reuse the same filesystem layers. + +[![](https://mermaid.ink/img/pako:eNqlkk2P0zAQhv_KyAdOSRU7cb4OHBY4ILQnONEg5MaTrUVsV44ttnT733GTDaQSN-LL2HnmnZnXvpDeSiQteXLidOxMZ6ZwmGPorfFCGXR0_24NgcJPp7w4jAijOKP71hn_7On-y1FNywlYM57X5KmL_48IgxpxAn8UHoRD0FaqQaGM2Wjkv2qyTU22LcX-s9TdiEqLJ_w-a-0_ah2WwcIhGB9axnZZsSAwiHYQ6Wj7H1HnICZMWbpNbhrO874CoNmnhxWhd0glWSUzCsDyxz9IdocMWZmLPAcosxl5bfjvRcCbjUOQpm_hxaGQ6c2HOL7DMCHchNe2b168bMe86ZGEaHRaKBnv_dIZgI5E5zR2pI2hxEGE0XekM9eIhpMUHj9I5a0jrXcBEyKCt5_Ppl_3C_NeiWirJtGqcYqnJ2G-WqtXKG5JeyHPpKW83hWU5Tmva5ZzVrGEnEnLmnJX8qaseZ0XBY_rmpBfs0K249nyFVXDGOc0ITi39Lg83_kVX38DC_v2ew?type=png)](https://mermaid.live/edit#pako:eNqlkk2P0zAQhv_KyAdOSRU7cb4OHBY4ILQnONEg5MaTrUVsV44ttnT733GTDaQSN-LL2HnmnZnXvpDeSiQteXLidOxMZ6ZwmGPorfFCGXR0_24NgcJPp7w4jAijOKP71hn_7On-y1FNywlYM57X5KmL_48IgxpxAn8UHoRD0FaqQaGM2Wjkv2qyTU22LcX-s9TdiEqLJ_w-a-0_ah2WwcIhGB9axnZZsSAwiHYQ6Wj7H1HnICZMWbpNbhrO874CoNmnhxWhd0glWSUzCsDyxz9IdocMWZmLPAcosxl5bfjvRcCbjUOQpm_hxaGQ6c2HOL7DMCHchNe2b168bMe86ZGEaHRaKBnv_dIZgI5E5zR2pI2hxEGE0XekM9eIhpMUHj9I5a0jrXcBEyKCt5_Ppl_3C_NeiWirJtGqcYqnJ2G-WqtXKG5JeyHPpKW83hWU5Tmva5ZzVrGEnEnLmnJX8qaseZ0XBY_rmpBfs0K249nyFVXDGOc0ITi39Lg83_kVX38DC_v2ew) + +---- + + +## Commands for interacting with images + +```text +docker images # shows all images. +docker import # creates an image from a tarball. +docker build # creates image from Dockerfile. +docker commit # creates image from a container. +docker rmi # removes an image. +docker history # list changes of an image. +``` +---- + +Images are stored in a Docker registry such as [Docker Hub](https://hub.docker.com/) +or Github's [Container Registry](). You can also host your own registry. + +`docker commit` can create an image from a container: +this is the process used when building a `Dockerfile`. + +NB. This is similar to the snapshot feature of Virtual Machines. + +[![](https://mermaid.ink/img/pako:eNqtlV1vmzAUhv-K5WuIwDak4WIXXXcxbd3FVmnS4qpysEmsgImwUcu6_vc5diCQfkxre3fMeY3f8_jj3MO85gJmcN2w3QZcnVNFVV4yrS9EAVYlU1ugTVNvRaZqJYJClqWLRqr1ptbmoAo50xvWNKzLQDJWU6XblV9EVuubdtUq0y4_V1Vr2KoUwH_IEJpFxCrYWoCCZQULyzrfXlPFZSNyI2sFvn6nasW0CFHodDcl60SzXCySBOdzAOLoy_n1QRJPJHOO5jyKAUD4cpBEE0kRpZhhDEAaOYlQ_JF3JW6X38StjXvzL_rdM41Dc2eWVxupgVsH1KrsQF4rw6TSlCqzEaCquSyk4MBiE_p6sm4cekA3eb3r_gNbHDaiWIK-ktNyGrGWduO6U77HLfKxLXmYPJrO7SKiiZcffSG2LvSo9EGMQi71dvmzkd56PkzySLxvzmzW7svJfwBV6FUMnemRh9dhRE9gPKFARhTi5ymQN1Ig70CBvJICefIwPSKBRiTw8yTwG0ngdyCBJyT-eanxy7dpqEBbs_5q9AHqAzJMc28CCMMP08u9P2x7MC6DphlyzJBpBh8zeJo5GNmn_vjY-qwqaSyhvBHMCP2nf9bAYBeEM6tv9Sg5VHCa6x-KYaWn04eOAdyTFLgbFTiggTtXvtkcRaMiggmGYFJgMAHhexFVMICVaComuW1t91QBQKE9DpWgMLMhFwVrS0MhVQ9W2u7sKROfuDR1AzPTtCKArDX1j07l_dhrLiSzW11BeyZKbb_umPpV11UvskOY3cM7mKGEzNJFksYoTlCULlIcwA5mcURmhJAIz9P5GUJnCX4I4G_3h2g2X0QojhYpQvtWhlAAhbN06Tu0a9QPfwEgtsUC?type=png)](https://mermaid.live/edit#pako:eNqtlV1vmzAUhv-K5WuIwDak4WIXXXcxbd3FVmnS4qpysEmsgImwUcu6_vc5diCQfkxre3fMeY3f8_jj3MO85gJmcN2w3QZcnVNFVV4yrS9EAVYlU1ugTVNvRaZqJYJClqWLRqr1ptbmoAo50xvWNKzLQDJWU6XblV9EVuubdtUq0y4_V1Vr2KoUwH_IEJpFxCrYWoCCZQULyzrfXlPFZSNyI2sFvn6nasW0CFHodDcl60SzXCySBOdzAOLoy_n1QRJPJHOO5jyKAUD4cpBEE0kRpZhhDEAaOYlQ_JF3JW6X38StjXvzL_rdM41Dc2eWVxupgVsH1KrsQF4rw6TSlCqzEaCquSyk4MBiE_p6sm4cekA3eb3r_gNbHDaiWIK-ktNyGrGWduO6U77HLfKxLXmYPJrO7SKiiZcffSG2LvSo9EGMQi71dvmzkd56PkzySLxvzmzW7svJfwBV6FUMnemRh9dhRE9gPKFARhTi5ymQN1Ig70CBvJICefIwPSKBRiTw8yTwG0ngdyCBJyT-eanxy7dpqEBbs_5q9AHqAzJMc28CCMMP08u9P2x7MC6DphlyzJBpBh8zeJo5GNmn_vjY-qwqaSyhvBHMCP2nf9bAYBeEM6tv9Sg5VHCa6x-KYaWn04eOAdyTFLgbFTiggTtXvtkcRaMiggmGYFJgMAHhexFVMICVaComuW1t91QBQKE9DpWgMLMhFwVrS0MhVQ9W2u7sKROfuDR1AzPTtCKArDX1j07l_dhrLiSzW11BeyZKbb_umPpV11UvskOY3cM7mKGEzNJFksYoTlCULlIcwA5mcURmhJAIz9P5GUJnCX4I4G_3h2g2X0QojhYpQvtWhlAAhbN06Tu0a9QPfwEgtsUC) + +--- + +## Building images with Dockerfile + +The Dockerfile is a text file that contains all the commands a user could +call on the command line to assemble an image. + +``` +! cat Dockerfile +``` + +Docker will execute all the commands in the Dockerfile and create a new image. + +```python +!docker build -t apache-example . +``` + +Open the [terminal](/terminals/docker) and: + +- inspect the image +- run the image with + +```bash +docker run --rm --detach apache-example +``` + +#### Exercise + +Open the [terminal](/terminals/docker) and: + +- check if the container is running `docker ps` +- use `curl` to check if the webserver works +- stop the container with `docker stop` +- check the container status with `docker ps -a` +- remove the container with `docker rm` + +--- + +## docker-compose + +[Docker Compose](https://docs.docker.com/compose/) is a tool for defining and running complex applications with +Docker. + +With Compose, you define a multi-container application in a +single file, then spin your application up in a single command which +does everything that needs to be done to get it running. + +---- + +## docker-compose + +Using Compose is basically a three-step process: + +1. define your app's image with a `Dockerfile` +1. define the services that make up your app in +`docker-compose.yaml` so they can be run together in an isolated +environment. +1. run `docker-compose up` and Compose will start and run your + entire app. + +---- + +## docker-compose + +docker-compose.yaml + +```docker-compose +version: '2' +services: + web: + build: . + command: python app.py + ports: + - "5000:5000" + volumes: + - .:/code + links: + - redis + redis: + image: redis +``` + +Now run docker-compose up and Compose will start and run your entire app. + +Docker Compose is a basic example of Infrastructure as Code. +The infrastructure setup is defined in a file and can be versioned. +All the changes are tracked and can be reverted. +Administrators do not have to run commands on the server to setup the infrastructure. + +```bash +docker-compose up -d +``` + +--- + +## docker-compose example + +``` +version: "2" +services: + web: + image: piuma/phpsysinfo + ports: + - "80:80" +``` + +---- + +## docker-compose example + +```docker-compose +version: "2" +services: + web1: + image: piuma/phpsysinfo + web2: + image: piuma/phpsysinfo + proxy: + image: tutum/haproxy + links: + - web1 + - web2 + ports: + - "80:80" +``` + +---- + +## docker-compose example + +``` +version: "2" +services: + web1: + image: piuma/phpsysinfo + web2: + image: piuma/phpsysinfo + web3: + image: piuma/phpsysinfo + proxy: + image: tutum/haproxy + links: + - web1 + - web2 + - web3 + ports: + - "80:80" +``` + +---- + +## docker-compose example + +``` +version: "2" +services: + phpmyadmin: + image: nazarpc/phpmyadmin + links: + - mysql + ports: + - "8080:80" + mysql: + image: mysql + environment: + - MYSQL_ROOT_PASSWORD=secret +``` + +--- + +## What next? + +```python +!docker run --rm mribeiro/cowsay "Any questions?" +``` + +--- diff --git a/docker-101/Dockerfile b/docker-101/Dockerfile new file mode 100644 index 0000000..8f70b36 --- /dev/null +++ b/docker-101/Dockerfile @@ -0,0 +1,22 @@ +# +# This is a simple Dockerfile to build an image with Apache2. +# You can build it with: +# +# $ docker build -t test-apache2 . +# +FROM debian:stable-slim + +# Set the maintainer. See https://docs.docker.com/engine/reference/builder/#maintainer-deprecated +LABEL org.opencontainers.image.authors="piuma@piumalab.org" + +# Install Apache2 and finally clean up the APT cache. +# There are different opinions on whether to `apt-get -y upgrade` or not. +# Check this interesting discussion: https://github.com/docker/docs/pull/12571 +RUN apt-get update && apt-get -y install apache2 && apt-get clean + +# Expose the default ports. https://docs.docker.com/engine/reference/builder/#expose +EXPOSE 80/tcp +EXPOSE 443/tcp + +# Set the default command to run when starting the container +CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] diff --git a/docker-101/Makefile b/docker-101/Makefile new file mode 100644 index 0000000..7d2e24f --- /dev/null +++ b/docker-101/Makefile @@ -0,0 +1,11 @@ +FILES=$(wildcard *.md) +BOOKS = $(patsubst %.md,notebooks/%.ipynb,$(FILES)) + + +all: $(BOOKS) + @echo $(BOOKS) + cp Dockerfile notebooks/Dockerfile + +notebooks/%.ipynb: %.md + + notedown --to notebook $^ > $@ diff --git a/docker-101/notebooks/01-docker.ipynb b/docker-101/notebooks/01-docker.ipynb new file mode 100644 index 0000000..d2c5383 --- /dev/null +++ b/docker-101/notebooks/01-docker.ipynb @@ -0,0 +1,190 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bd72a566", + "metadata": {}, + "source": [ + "# Docker 101\n", + "\n", + "This is a crash docker course.\n", + "\n", + "## What is?\n", + "\n", + "Docker is a platform for developers and sysadmins to develop,\n", + " ship, and run applications." + ] + }, + { + "cell_type": "markdown", + "id": "819672e8", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Why it was born?\n", + "\n", + "To resolve a necessity\n", + "\n", + "Mobility workload in cloud systems\n", + "\n", + "- Cargo transport pre-1960\n", + "- Solution: Intermodal Shipping Container" + ] + }, + { + "cell_type": "markdown", + "id": "c8a2c20e", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "### Docker is a Container System for Code\n", + "\n", + "Docker leverages LXC (Linux Containers), which encompasses Linux\n", + "features like cgroups and namespaces for strong process isolation and\n", + "resource control.\n", + "\n", + "They are lightweight and consume less resources than a virtual machine." + ] + }, + { + "cell_type": "markdown", + "id": "69ef6e0c", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Benefits for developers\n", + "\n", + "- portability, build once... run anywhere\n", + "- no worries about missing dependencies, packages and other pain\n", + " points during subsequent deployments\n", + "- tracking changes\n", + "- run each app in its own isolated container, so you can run various\n", + " versions of libraries and other dependencies for each app without\n", + " worrying\n", + "- reduce/eliminate concerns about compatibility on different\n", + " platforms, either your own or your customers'." + ] + }, + { + "cell_type": "markdown", + "id": "6fbc76a7", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Benefits for sysadmins\n", + "\n", + "- portability, configure once... run anywhere\n", + "- tracking changes\n", + "- simple to understand what application do\n", + "- simplify to upgrade application processes. Significantly improves\n", + " the speed and reliability of continuous deployment and continuous\n", + " integration systems\n", + "- eliminate inconsistencies between different enviroments (develop, testing, production)\n", + "- re-use other people images\n", + "- do you not need an hypervisor. Because the containers are so\n", + " lightweight, address significant performance, costs, deployment, and\n", + " portability issues normally associated with VMs" + ] + }, + { + "cell_type": "markdown", + "id": "bfae8933", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Docker Concepts and Interactions\n", + "\n", + "- **Host**, the machine that is running the containers.\n", + "- **Image**, a hierarchy of files, with meta-data for how to run a container.\n", + "- **Container**, a contained running process, started from an image.\n", + "- **Registry**, a repository of images.\n", + "- **Volume**, storage outside the container.\n", + "- **Dockerfile**, a script for creating images." + ] + }, + { + "cell_type": "markdown", + "id": "fed50018", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNptU8lu2zAQ_RWBZ8moZctVdOilKdAeekmBHirmMJLGFhMuAjkM6lr-91JbbCcBD3qjefM4G0-sNg2ygiVJwjUJklhE96Z-RhsJTWihJmG043okHCx0LddcO1-NOHrAg3Bkj-UDKkP4akd7qIo9JM2o9ci1WJec_VBwQBd8g6v2FTo-qM1ci00LtET6ymvyi_UEL7Dg7kit0ZwFVdTNTTrfjSOupwL2QmJ5gfOtM7xN7sVIr9CVv6fvTG2AoAKHgVAbTSA0WleWX1_xVSGPgSRNDTJUMXfkfbGXhIdzlVqSfOkrL2TTR7cigyfqCQ5vHdcpTaTaKCXoA4HBab3uo0vE2-hemdDsPpr78M7tCCzFjkwXWxyNWzWuh8aP1M67NgxVDMVf195fVmOiSfkxbRohi5lCq0A0YTlPXEcRZ9SiQs6KABvcg5fEGdfnQPVdmBV-awQZywqyHmMGnsyvo64Xe-LcCwiboli4ULrwtwP9xxi1kILJihP7y4p1lq-263SzyfI83WTp5zRmR1akd7vVLrvb5Vm-2W6zcM4x-zcqfFplMcMxh5_Toxrf1vk_Byk2hw?type=png)](https://mermaid.live/edit#pako:eNptU8lu2zAQ_RWBZ8moZctVdOilKdAeekmBHirmMJLGFhMuAjkM6lr-91JbbCcBD3qjefM4G0-sNg2ygiVJwjUJklhE96Z-RhsJTWihJmG043okHCx0LddcO1-NOHrAg3Bkj-UDKkP4akd7qIo9JM2o9ci1WJec_VBwQBd8g6v2FTo-qM1ci00LtET6ymvyi_UEL7Dg7kit0ZwFVdTNTTrfjSOupwL2QmJ5gfOtM7xN7sVIr9CVv6fvTG2AoAKHgVAbTSA0WleWX1_xVSGPgSRNDTJUMXfkfbGXhIdzlVqSfOkrL2TTR7cigyfqCQ5vHdcpTaTaKCXoA4HBab3uo0vE2-hemdDsPpr78M7tCCzFjkwXWxyNWzWuh8aP1M67NgxVDMVf195fVmOiSfkxbRohi5lCq0A0YTlPXEcRZ9SiQs6KABvcg5fEGdfnQPVdmBV-awQZywqyHmMGnsyvo64Xe-LcCwiboli4ULrwtwP9xxi1kILJihP7y4p1lq-263SzyfI83WTp5zRmR1akd7vVLrvb5Vm-2W6zcM4x-zcqfFplMcMxh5_Toxrf1vk_Byk2hw)" + ] + }, + { + "cell_type": "markdown", + "id": "cd2f36a2", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "markdown", + "id": "30d28c29", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Separation of concerns\n", + "\n", + "- inside the container:\n", + " - libreries\n", + " - package manager\n", + " - application\n", + " - data\n", + " - code\n", + "- outside the container:\n", + " - logging\n", + " - remote access\n", + " - network configuration\n", + " - monitoring" + ] + }, + { + "cell_type": "markdown", + "id": "b1141f06", + "metadata": {}, + "source": [ + "---" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docker-101/notebooks/02-docker.ipynb b/docker-101/notebooks/02-docker.ipynb new file mode 100644 index 0000000..401fd03 --- /dev/null +++ b/docker-101/notebooks/02-docker.ipynb @@ -0,0 +1,832 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "eb5b8406", + "metadata": {}, + "source": [ + "## Inspect the Docker host\n", + "\n", + "At first, we will inspect this machine: the operating system, the IP address and the rest." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4898c92a", + "metadata": {}, + "outputs": [], + "source": [ + "# Distro\n", + "!cat /etc/issue" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba0748fc", + "metadata": {}, + "outputs": [], + "source": [ + "# Linux version\n", + "!uname -a" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3bdab09c", + "metadata": {}, + "outputs": [], + "source": [ + "# IP address\n", + "! ip -4 -o address show eth0" + ] + }, + { + "cell_type": "markdown", + "id": "0c69d0dd", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Docker installation\n", + "\n", + "Check docker tools." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d480e5f2", + "metadata": {}, + "outputs": [], + "source": [ + "# Docker CLI version.\n", + "!docker --version" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "269567ae", + "metadata": {}, + "outputs": [], + "source": [ + "# Docker server version\n", + "!dockerd --version" + ] + }, + { + "cell_type": "markdown", + "id": "fe7be5d8", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Running a container\n", + "\n", + "Docker comes with a catalog of possible operating systems and applications named Docker Registry. You can deploy your custom registry too.\n", + "\n", + "Let's pull and run an image\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s?type=png)](https://mermaid.live/edit#pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ca14dd5", + "metadata": {}, + "outputs": [], + "source": [ + "# Search images from catalog\n", + "!docker search ubuntu|head" + ] + }, + { + "cell_type": "markdown", + "id": "3de53199", + "metadata": {}, + "source": [ + "Download an image from the remote registry." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0ea32a09", + "metadata": {}, + "outputs": [], + "source": [ + "# Download the ubuntu image\n", + "!docker pull ubuntu:22.04" + ] + }, + { + "cell_type": "markdown", + "id": "6e6ab248", + "metadata": {}, + "source": [ + "Open a [terminal](/terminals/docker) and run an **interactive shell** (`--interactive`) with a terminal (`--tty`)\n", + "in a new container based on `ubuntu:22.04`. The `--rm` option removes the container when it exits.\n", + "\n", + "**NB: run the following commands in the terminal, not in the jupyter notebook**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d543fe9", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "docker run --rm --tty --interactive ubuntu:22.04 /bin/bash" + ] + }, + { + "cell_type": "markdown", + "id": "336b13a3", + "metadata": {}, + "source": [ + "Then run the above commands to ensure that you are on another virtual hosts." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ac722e8", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# Operating System\n", + "cat /etc/issue\n", + "# Linux version\n", + "uname -a" + ] + }, + { + "cell_type": "markdown", + "id": "cf05b683", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "#### Exercise\n", + "\n", + "What happens if you try to get the IP address using the following command?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8075910d", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "ip -4 -o a" + ] + }, + { + "cell_type": "markdown", + "id": "bb09c003", + "metadata": {}, + "source": [ + "Can you retrieve the IP address in another way?\n", + "**Hint: the `/proc` filesystem contains information about the system. Try to find the IP address in one of the files in `/proc`.**" + ] + }, + { + "cell_type": "markdown", + "id": "38f7fd1b", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Dockerizing Applications\n", + "\n", + "`busybox` is a lightweight Linux distribution. You can run an one-shot command in a container." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc56d63a", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "docker run busybox /bin/echo 'Hello world'" + ] + }, + { + "cell_type": "markdown", + "id": "e252e3ee", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Docker commands\n", + "\n", + "Here is a list of docker commands." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12fb7df7", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "docker create # creates a container but does not start it.\n", + "docker run # creates and starts a container.\n", + "docker stop # stops it.\n", + "docker start # will start it again.\n", + "docker restart # restarts a container.\n", + "docker rm # deletes a container.\n", + "docker kill # sends a SIGKILL to a container.\n", + "docker attach # will connect to a running container.\n", + "docker wait # blocks until container stops.\n", + "docker exec # executes a command in a running container." + ] + }, + { + "cell_type": "markdown", + "id": "419f82ed", + "metadata": {}, + "source": [ + "You can inspect containers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bdaaa415", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "docker ps # shows running containers.\n", + "docker inspect # information on a container (incl. IP address).\n", + "docker logs # gets logs from container.\n", + "docker events # gets events from container.\n", + "docker port # shows public facing port of container.\n", + "docker top # shows running processes in container.\n", + "docker diff # shows changed files in container's FS.\n", + "docker stats # shows metrics, memory, cpu, filsystem" + ] + }, + { + "cell_type": "markdown", + "id": "17e88f16", + "metadata": {}, + "source": [ + "#### Exercise\n", + "\n", + "1. List the running containers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7eefeab", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell to run the correct docker command." + ] + }, + { + "cell_type": "markdown", + "id": "ad3bbc4d", + "metadata": {}, + "source": [ + "1. Inspect the `ansible-101_bastion_1` container.\n", + "1. Use the `--format` option to get the IP address on a [terminal](/terminals/docker).\n", + " **Hint 1: you can google for the solution.**\n", + "1. Try to run the `docker inspect --format ...` command above in the jupyter notebook.\n", + " Does it work? If not, why?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90c84b58", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell to run the correct docker command." + ] + }, + { + "cell_type": "markdown", + "id": "d0204b9a", + "metadata": {}, + "source": [ + "💬 Discuss how python treats the `{` character." + ] + }, + { + "cell_type": "markdown", + "id": "5a76021d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Images\n", + "\n", + "### Like VMs template images\n", + "\n", + "Docker leverages a [copy-on-write filesystem](https://docs.docker.com/storage/storagedriver/).\n", + "This allows Docker to instantiate containers very quickly.\n", + "Docker use to layering one container filesytem on top of another.\n", + "For example, you might create a container that is based on\n", + "a base Debian image, and then in turn create another container that is\n", + "based on the first container.\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA?type=png)](https://mermaid.live/edit#pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA)\n", + "\n", + "This mechanism allows an efficient storage usage, since multiple containers can\n", + "reuse the same filesystem layers.\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNqlkk2P0zAQhv_KyAdOSRU7cb4OHBY4ILQnONEg5MaTrUVsV44ttnT733GTDaQSN-LL2HnmnZnXvpDeSiQteXLidOxMZ6ZwmGPorfFCGXR0_24NgcJPp7w4jAijOKP71hn_7On-y1FNywlYM57X5KmL_48IgxpxAn8UHoRD0FaqQaGM2Wjkv2qyTU22LcX-s9TdiEqLJ_w-a-0_ah2WwcIhGB9axnZZsSAwiHYQ6Wj7H1HnICZMWbpNbhrO874CoNmnhxWhd0glWSUzCsDyxz9IdocMWZmLPAcosxl5bfjvRcCbjUOQpm_hxaGQ6c2HOL7DMCHchNe2b168bMe86ZGEaHRaKBnv_dIZgI5E5zR2pI2hxEGE0XekM9eIhpMUHj9I5a0jrXcBEyKCt5_Ppl_3C_NeiWirJtGqcYqnJ2G-WqtXKG5JeyHPpKW83hWU5Tmva5ZzVrGEnEnLmnJX8qaseZ0XBY_rmpBfs0K249nyFVXDGOc0ITi39Lg83_kVX38DC_v2ew?type=png)](https://mermaid.live/edit#pako:eNqlkk2P0zAQhv_KyAdOSRU7cb4OHBY4ILQnONEg5MaTrUVsV44ttnT733GTDaQSN-LL2HnmnZnXvpDeSiQteXLidOxMZ6ZwmGPorfFCGXR0_24NgcJPp7w4jAijOKP71hn_7On-y1FNywlYM57X5KmL_48IgxpxAn8UHoRD0FaqQaGM2Wjkv2qyTU22LcX-s9TdiEqLJ_w-a-0_ah2WwcIhGB9axnZZsSAwiHYQ6Wj7H1HnICZMWbpNbhrO874CoNmnhxWhd0glWSUzCsDyxz9IdocMWZmLPAcosxl5bfjvRcCbjUOQpm_hxaGQ6c2HOL7DMCHchNe2b168bMe86ZGEaHRaKBnv_dIZgI5E5zR2pI2hxEGE0XekM9eIhpMUHj9I5a0jrXcBEyKCt5_Ppl_3C_NeiWirJtGqcYqnJ2G-WqtXKG5JeyHPpKW83hWU5Tmva5ZzVrGEnEnLmnJX8qaseZ0XBY_rmpBfs0K249nyFVXDGOc0ITi39Lg83_kVX38DC_v2ew)" + ] + }, + { + "cell_type": "markdown", + "id": "5a4f0b77", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "\n", + "## Commands for interacting with images" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "858ca912", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "docker images # shows all images.\n", + "docker import # creates an image from a tarball.\n", + "docker build # creates image from Dockerfile.\n", + "docker commit # creates image from a container.\n", + "docker rmi # removes an image.\n", + "docker history # list changes of an image." + ] + }, + { + "cell_type": "markdown", + "id": "9883df86", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Images are stored in a Docker registry such as [Docker Hub](https://hub.docker.com/)\n", + "or Github's [Container Registry](). You can also host your own registry.\n", + "\n", + "`docker commit` can create an image from a container:\n", + "this is the process used when building a `Dockerfile`.\n", + "\n", + "NB. This is similar to the snapshot feature of Virtual Machines.\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNqtlV1vmzAUhv-K5WuIwDak4WIXXXcxbd3FVmnS4qpysEmsgImwUcu6_vc5diCQfkxre3fMeY3f8_jj3MO85gJmcN2w3QZcnVNFVV4yrS9EAVYlU1ugTVNvRaZqJYJClqWLRqr1ptbmoAo50xvWNKzLQDJWU6XblV9EVuubdtUq0y4_V1Vr2KoUwH_IEJpFxCrYWoCCZQULyzrfXlPFZSNyI2sFvn6nasW0CFHodDcl60SzXCySBOdzAOLoy_n1QRJPJHOO5jyKAUD4cpBEE0kRpZhhDEAaOYlQ_JF3JW6X38StjXvzL_rdM41Dc2eWVxupgVsH1KrsQF4rw6TSlCqzEaCquSyk4MBiE_p6sm4cekA3eb3r_gNbHDaiWIK-ktNyGrGWduO6U77HLfKxLXmYPJrO7SKiiZcffSG2LvSo9EGMQi71dvmzkd56PkzySLxvzmzW7svJfwBV6FUMnemRh9dhRE9gPKFARhTi5ymQN1Ig70CBvJICefIwPSKBRiTw8yTwG0ngdyCBJyT-eanxy7dpqEBbs_5q9AHqAzJMc28CCMMP08u9P2x7MC6DphlyzJBpBh8zeJo5GNmn_vjY-qwqaSyhvBHMCP2nf9bAYBeEM6tv9Sg5VHCa6x-KYaWn04eOAdyTFLgbFTiggTtXvtkcRaMiggmGYFJgMAHhexFVMICVaComuW1t91QBQKE9DpWgMLMhFwVrS0MhVQ9W2u7sKROfuDR1AzPTtCKArDX1j07l_dhrLiSzW11BeyZKbb_umPpV11UvskOY3cM7mKGEzNJFksYoTlCULlIcwA5mcURmhJAIz9P5GUJnCX4I4G_3h2g2X0QojhYpQvtWhlAAhbN06Tu0a9QPfwEgtsUC?type=png)](https://mermaid.live/edit#pako:eNqtlV1vmzAUhv-K5WuIwDak4WIXXXcxbd3FVmnS4qpysEmsgImwUcu6_vc5diCQfkxre3fMeY3f8_jj3MO85gJmcN2w3QZcnVNFVV4yrS9EAVYlU1ugTVNvRaZqJYJClqWLRqr1ptbmoAo50xvWNKzLQDJWU6XblV9EVuubdtUq0y4_V1Vr2KoUwH_IEJpFxCrYWoCCZQULyzrfXlPFZSNyI2sFvn6nasW0CFHodDcl60SzXCySBOdzAOLoy_n1QRJPJHOO5jyKAUD4cpBEE0kRpZhhDEAaOYlQ_JF3JW6X38StjXvzL_rdM41Dc2eWVxupgVsH1KrsQF4rw6TSlCqzEaCquSyk4MBiE_p6sm4cekA3eb3r_gNbHDaiWIK-ktNyGrGWduO6U77HLfKxLXmYPJrO7SKiiZcffSG2LvSo9EGMQi71dvmzkd56PkzySLxvzmzW7svJfwBV6FUMnemRh9dhRE9gPKFARhTi5ymQN1Ig70CBvJICefIwPSKBRiTw8yTwG0ngdyCBJyT-eanxy7dpqEBbs_5q9AHqAzJMc28CCMMP08u9P2x7MC6DphlyzJBpBh8zeJo5GNmn_vjY-qwqaSyhvBHMCP2nf9bAYBeEM6tv9Sg5VHCa6x-KYaWn04eOAdyTFLgbFTiggTtXvtkcRaMiggmGYFJgMAHhexFVMICVaComuW1t91QBQKE9DpWgMLMhFwVrS0MhVQ9W2u7sKROfuDR1AzPTtCKArDX1j07l_dhrLiSzW11BeyZKbb_umPpV11UvskOY3cM7mKGEzNJFksYoTlCULlIcwA5mcURmhJAIz9P5GUJnCX4I4G_3h2g2X0QojhYpQvtWhlAAhbN06Tu0a9QPfwEgtsUC)" + ] + }, + { + "cell_type": "markdown", + "id": "d2d7cb30", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Building images with Dockerfile\n", + "\n", + "The Dockerfile is a text file that contains all the commands a user could\n", + "call on the command line to assemble an image." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cafb03b5", + "metadata": {}, + "outputs": [], + "source": [ + "! cat Dockerfile" + ] + }, + { + "cell_type": "markdown", + "id": "97f1b55d", + "metadata": {}, + "source": [ + "Docker will execute all the commands in the Dockerfile and create a new image." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb16a508", + "metadata": {}, + "outputs": [], + "source": [ + "!docker build -t apache-example ." + ] + }, + { + "cell_type": "markdown", + "id": "90a1aff7", + "metadata": {}, + "source": [ + "Open the [terminal](/terminals/docker) and:\n", + "\n", + "- inspect the image\n", + "- run the image with" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0faf5382", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "docker run --rm --detach apache-example" + ] + }, + { + "cell_type": "markdown", + "id": "ec99d74c", + "metadata": {}, + "source": [ + "#### Exercise\n", + "\n", + "Open the [terminal](/terminals/docker) and:\n", + "\n", + "- check if the container is running `docker ps`\n", + "- use `curl` to check if the webserver works\n", + "- stop the container with `docker stop`\n", + "- check the container status with `docker ps -a`\n", + "- remove the container with `docker rm`" + ] + }, + { + "cell_type": "markdown", + "id": "beca5e0c", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## docker-compose\n", + "\n", + "[Docker Compose](https://docs.docker.com/compose/) is a tool for defining and running complex applications with\n", + "Docker.\n", + "\n", + "With Compose, you define a multi-container application in a\n", + "single file, then spin your application up in a single command which\n", + "does everything that needs to be done to get it running." + ] + }, + { + "cell_type": "markdown", + "id": "6a07e434", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## docker-compose\n", + "\n", + "Using Compose is basically a three-step process:\n", + "\n", + "1. define your app's image with a `Dockerfile`\n", + "1. define the services that make up your app in\n", + "`docker-compose.yaml` so they can be run together in an isolated\n", + "environment.\n", + "1. run `docker-compose up` and Compose will start and run your\n", + " entire app." + ] + }, + { + "cell_type": "markdown", + "id": "b1d11fd0", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## docker-compose\n", + "\n", + "docker-compose.yaml" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "052b3886", + "metadata": { + "attributes": { + "classes": [ + "docker-compose" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "version: '2'\n", + "services:\n", + " web:\n", + " build: .\n", + " command: python app.py\n", + " ports:\n", + " - \"5000:5000\"\n", + " volumes:\n", + " - .:/code\n", + " links:\n", + " - redis\n", + " redis:\n", + " image: redis" + ] + }, + { + "cell_type": "markdown", + "id": "3a6a7da0", + "metadata": {}, + "source": [ + "Now run docker-compose up and Compose will start and run your entire app.\n", + "\n", + "Docker Compose is a basic example of Infrastructure as Code.\n", + "The infrastructure setup is defined in a file and can be versioned.\n", + "All the changes are tracked and can be reverted.\n", + "Administrators do not have to run commands on the server to setup the infrastructure." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a042f1ae", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "docker-compose up -d" + ] + }, + { + "cell_type": "markdown", + "id": "87bcbac1", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## docker-compose example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa756444", + "metadata": {}, + "outputs": [], + "source": [ + "version: \"2\"\n", + "services:\n", + " web:\n", + " image: piuma/phpsysinfo\n", + " ports:\n", + " - \"80:80\"" + ] + }, + { + "cell_type": "markdown", + "id": "b80ee452", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## docker-compose example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e9e3bf9", + "metadata": { + "attributes": { + "classes": [ + "docker-compose" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "version: \"2\"\n", + "services:\n", + " web1:\n", + " image: piuma/phpsysinfo\n", + " web2:\n", + " image: piuma/phpsysinfo\n", + " proxy:\n", + " image: tutum/haproxy\n", + " links:\n", + " - web1\n", + " - web2\n", + " ports:\n", + " - \"80:80\"" + ] + }, + { + "cell_type": "markdown", + "id": "9787fa9a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## docker-compose example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dce3e371", + "metadata": {}, + "outputs": [], + "source": [ + "version: \"2\"\n", + "services:\n", + " web1:\n", + " image: piuma/phpsysinfo\n", + " web2:\n", + " image: piuma/phpsysinfo\n", + " web3:\n", + " image: piuma/phpsysinfo\n", + " proxy:\n", + " image: tutum/haproxy\n", + " links:\n", + " - web1\n", + " - web2\n", + " - web3\n", + " ports:\n", + " - \"80:80\"" + ] + }, + { + "cell_type": "markdown", + "id": "c14d280d", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## docker-compose example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1eefc329", + "metadata": {}, + "outputs": [], + "source": [ + "version: \"2\"\n", + "services:\n", + " phpmyadmin:\n", + " image: nazarpc/phpmyadmin\n", + " links:\n", + " - mysql\n", + " ports:\n", + " - \"8080:80\"\n", + " mysql:\n", + " image: mysql\n", + " environment:\n", + " - MYSQL_ROOT_PASSWORD=secret" + ] + }, + { + "cell_type": "markdown", + "id": "6fd5c054", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## What next?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e118edc5", + "metadata": {}, + "outputs": [], + "source": [ + "!docker run --rm mribeiro/cowsay \"Any questions?\"" + ] + }, + { + "cell_type": "markdown", + "id": "628ca78e", + "metadata": {}, + "source": [ + "---" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docker-101/notebooks/Dockerfile b/docker-101/notebooks/Dockerfile new file mode 100644 index 0000000..8f70b36 --- /dev/null +++ b/docker-101/notebooks/Dockerfile @@ -0,0 +1,22 @@ +# +# This is a simple Dockerfile to build an image with Apache2. +# You can build it with: +# +# $ docker build -t test-apache2 . +# +FROM debian:stable-slim + +# Set the maintainer. See https://docs.docker.com/engine/reference/builder/#maintainer-deprecated +LABEL org.opencontainers.image.authors="piuma@piumalab.org" + +# Install Apache2 and finally clean up the APT cache. +# There are different opinions on whether to `apt-get -y upgrade` or not. +# Check this interesting discussion: https://github.com/docker/docs/pull/12571 +RUN apt-get update && apt-get -y install apache2 && apt-get clean + +# Expose the default ports. https://docs.docker.com/engine/reference/builder/#expose +EXPOSE 80/tcp +EXPOSE 443/tcp + +# Set the default command to run when starting the container +CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] diff --git a/docker-101/tox.ini b/docker-101/tox.ini new file mode 100644 index 0000000..cee54b2 --- /dev/null +++ b/docker-101/tox.ini @@ -0,0 +1,11 @@ +[tox] +envlist = py3 +skipsdist = True + +[testenv] +deps = + git+https://github.com/ioggstream/notedown +allowlist_externals = + make +commands = + make diff --git a/git-101/01-git.md b/git-101/01-git.md index dcf9783..ba77430 100644 --- a/git-101/01-git.md +++ b/git-101/01-git.md @@ -2,10 +2,10 @@ ## Agenda - - VCS intro - - tracking modifications - - using a local git repository - - remote repositories +- VCS intro +- tracking modifications +- using a local git repository +- remote repositories *Beware*: commands contain small typos. You must fix them to properly complete the course! @@ -15,10 +15,10 @@ The importance of tracking changes. VCS basics: - - initialize a local repo - - change the software - - acknowledge (commit) changes - - eventually revert changes +- initialize a local repo +- change the software +- acknowledge (commit) changes +- eventually revert changes --- @@ -28,7 +28,7 @@ Track modifications of our config files without messing with the real /etc. ``` -! mkdir -p /repo-path +!mkdir -p /repo-path !cp -v /etc/host* /etc/s* /repo-path ``` @@ -47,7 +47,6 @@ Always timestamp backup copies, don't `.ori`. Exercise: Use `date +%s` to timestamp a backup copy of `hosts`. - ``` # Use this cell for the exercise. ``` @@ -62,10 +61,8 @@ Used to maintain the Linux Kernel. Distributed approach. - ![Checkout and Push](https://git-scm.com/figures/18333fig0106-tn.png) - --- ## Tracing requires identification @@ -93,15 +90,16 @@ Track modifications with `git` ### Exercise - - get the previous `git config ... user.email` - - remove the `--global` flag from the previous command - - run it +- get the previous `git config ... user.email` +- remove the `--global` flag from the previous command +- run it ``` # Write here the command # and show the git config file. !cat .git/config ``` + --- Enter in the repo directory and check the status: there @@ -128,7 +126,7 @@ Now we have all `host*` files to be tracked. Add files to the index ``` -! git add hosts +!git add hosts ``` The file is now *staged* for commit. It's not archived though. @@ -140,7 +138,7 @@ The file is now *staged* for commit. It's not archived though. Save files to the local index ``` -! git commit -m "Initial snapshot of hosts" +!git commit -m "Initial snapshot of hosts" ``` ![Git areas](https://git-scm.com/images/about/index1@2x.png) @@ -168,18 +166,18 @@ and finally save them in the repo. ``` !git commit "Added localhost2 to hosts" ``` + --- ## History changes Now we have an history with two changes, containing: - - commit messages - - a commit hash +- commit messages +- a commit hash HEAD is the last commit. - ``` !git log ``` @@ -193,7 +191,7 @@ HEAD is the last commit. We can revert a change using the hash or an history log ``` -! git checkout HEAD~1 -- hosts # revert hosts to the previous commit +!git checkout HEAD~1 -- hosts # revert hosts to the previous commit ``` --- @@ -203,10 +201,11 @@ We can revert a change using the hash or an history log Now some git commands, but first create a dir. ``` -! mkdir -p /repo-path +!mkdir -p /repo-path !date >> /repo-path/file.txt !date >> /repo-path/hi.txt ``` + --- ``` @@ -217,7 +216,7 @@ Now some git commands, but first create a dir. ### Exercise - - add `file.txt` to the index and commit +- add `file.txt` to the index and commit ``` # Use this cell for the exercise @@ -225,7 +224,6 @@ Now some git commands, but first create a dir. --- - ``` !date >> /repo-path/file.txt !git diff @@ -234,7 +232,6 @@ Now some git commands, but first create a dir. --- - ``` !git log /repo-path/file.txt # show changes ``` @@ -258,14 +255,14 @@ Now some git commands, but first create a dir. Writing codes and configuration we may want to follow different strategies and save our different attempts. - - *tag* makes an unmodifiable snapshot of the repo instead. +- *tag* makes an unmodifiable snapshot of the repo instead. ``` !git tag myconfig-v1 # create a tag !git tag -l # list tags ``` - - *branch* create a modifiable copy of the code, allowing +- *branch* create a modifiable copy of the code, allowing to save and work on different features ![Branches](https://git-scm.com/figures/18333fig0313-tn.png) @@ -341,10 +338,10 @@ And switch back ### Exercise - - Create a new branch named `antani` - - modify `new-file.txt` as you please - - open a terminal, and use `git add -p` to stage the changes. What does it do? - - commit the changes +- Create a new branch named `antani` +- modify `new-file.txt` as you please +- [open a terminal](/terminals/git), and use `git add -p` to stage the changes. What does it do? +- commit the changes ``` # Use this cell for the exercise @@ -368,23 +365,34 @@ You have to remove the changes or commit them (in another branch too) # Use this cell for the exercise. ``` - --- ## Merge -Once we have consolidated some changes (Eg. test, ...) +Once we have consolidated some changes (e.g., test, ...) we can *merge* the changes into the master branch ``` !git checkout master +``` + +Before merging, we have to check the differences + +``` !git diff work-on-my-changes +``` + +And finally merge + +``` !git merge work-on-my-changes ``` --- After a merge, if the branch is no more useful, we can remove it. +Note: before deleting a branch, you can double-check available +branches with `git branch -a`. ``` !git branch -d work-on-changes @@ -394,9 +402,9 @@ If there are unmerged changes, git doesn't allow deleting a branch. Exercise: - - use `git branch -d` to remove the `antani` branch - - what happens? - - replace `-d` with `-D`. Does it work now? +- use `git branch -d` to remove the `antani` branch +- what happens? +- replace `-d` with `-D`. Does it work now? ``` # use this cell for the exrcise @@ -413,16 +421,28 @@ You can stage partial changes with: !git add -p ``` - --- ## Remote repositories Remote repos may be either https, ssh or files. +``` +! mkdir -p /repo-tmp && cd /repo-tmp && pwd # use another directory ;) +``` + +Exercise: + +- what happens in the following cell? ``` -! mkdir -p /repo-tmp && cd /repo-tmp # use another directory +!pwd +``` + +Go to the correct directory now. + +``` +cd /repo-tmp ``` --- @@ -433,18 +453,23 @@ Git clone downloads a remote repo, with all its changes and history. Try with a remote https repo. ``` -! git clone https://github.com/ioggstream/python-course/ python-course -cd /repo-tmp/python-course +!git clone https://github.com/ioggstream/python-course/ python-course ``` -Show repository configuration. Remote origin. +Now enter in the repo directory ``` -! git config -l +cd /repo-tmp/python-course +``` +Show repository configuration. Which is the remote origin? + +``` +!git config -l ``` The remote repo is retrieved with all its changes and history + ``` ! du -ms .git ``` @@ -454,22 +479,28 @@ And `log` can show branches and merges. ``` !git log --graph ``` + --- ### file repo A local repo can be cloned too, and has the same features -of a remote one. It's actually a remote file:// uri. +of a remote one. It's actually a remote `file://` uri. ``` -! git clone /repo-tmp/python-course /repo-tmp/my-course +!git clone /repo-tmp/python-course /repo-tmp/my-course ``` -Show repository configuration. Remote origin. +Now move to the new directory ``` -! git config -l +cd /repo-tmp/my-course +``` +Show repository configuration. Which is the remote origin? + +``` +!git config -l ``` --- @@ -478,33 +509,54 @@ Show repository configuration. Remote origin. You can add new files to a repo with the above workflow: - - create a branch with `git checkout -b test-1` - - add a new file - - stage changes with `git add` - - commit with `git commit` +- create a branch with `git checkout -b test-1` +- add a new file +- stage changes with `git add` +- commit with `git commit` + +``` +# Use this cell for the exercise +``` Now that your changes are on your local repo, you can synchronize / upload them to the remote copy with: ``` -! git push origin test-1 +!git push origin test-1 ``` Remember: - - origin is the URI specified by `git config -l` - - `test-1` is the branch name where you want to upload +- origin is the URI specified by `git config -l` +- `test-1` is the branch name where you want to upload To upload changes to the remote master (default) branch, you need to - - merge the changes to your local master +- merge the changes to your local master ``` !git checkout master +``` + +Check the differences + +``` +!git diff test-1 +``` + +And finally merge + +``` !git merge test-1 ``` - - push changes to master +Exercise: + +- check the master history; +- check the difference with the last commit. + + +Finally, push changes to `origin/master` ``` !git push origin master diff --git a/git-101/notebooks/01-git.ipynb b/git-101/notebooks/01-git.ipynb index f9f779e..cd265cf 100644 --- a/git-101/notebooks/01-git.ipynb +++ b/git-101/notebooks/01-git.ipynb @@ -2,16 +2,17 @@ "cells": [ { "cell_type": "markdown", + "id": "7f120a0a", "metadata": {}, "source": [ "# Git - simple repository management\n", "\n", "## Agenda\n", "\n", - " - VCS intro\n", - " - tracking modifications\n", - " - using a local git repository\n", - " - remote repositories\n", + "- VCS intro\n", + "- tracking modifications\n", + "- using a local git repository\n", + "- remote repositories\n", "\n", "*Beware*: commands contain small typos. You must fix them to properly complete the course!\n", "\n", @@ -21,16 +22,23 @@ "\n", "VCS basics:\n", "\n", - " - initialize a local repo\n", - " - change the software\n", - " - acknowledge (commit) changes\n", - " - eventually revert changes" + "- initialize a local repo\n", + "- change the software\n", + "- acknowledge (commit) changes\n", + "- eventually revert changes" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "c4538aef", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Tracking modifications\n", "\n", "Track modifications of our config files without messing\n", @@ -40,15 +48,17 @@ { "cell_type": "code", "execution_count": null, + "id": "700a7a3a", "metadata": {}, "outputs": [], "source": [ - "! mkdir -p /repo-path\n", + "!mkdir -p /repo-path\n", "!cp -v /etc/host* /etc/s* /repo-path" ] }, { "cell_type": "markdown", + "id": "9d560d87", "metadata": {}, "source": [ "All operations are local to /repo-path" @@ -57,6 +67,7 @@ { "cell_type": "code", "execution_count": null, + "id": "4e7bc3b2", "metadata": {}, "outputs": [], "source": [ @@ -65,6 +76,7 @@ }, { "cell_type": "markdown", + "id": "99c3bcd9", "metadata": {}, "source": [ "Always timestamp backup copies, don't `.ori`." @@ -73,6 +85,7 @@ { "cell_type": "code", "execution_count": null, + "id": "cd27bc4d", "metadata": {}, "outputs": [], "source": [ @@ -82,6 +95,7 @@ }, { "cell_type": "markdown", + "id": "d6cd9236", "metadata": {}, "source": [ "Exercise: Use `date +%s` to timestamp a backup copy of `hosts`." @@ -90,6 +104,7 @@ { "cell_type": "code", "execution_count": null, + "id": "000235a9", "metadata": {}, "outputs": [], "source": [ @@ -98,8 +113,15 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "01f6ef62", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Git\n", "\n", "A better way of tracking changes.\n", @@ -108,23 +130,30 @@ "\n", "Distributed approach.\n", "\n", - "\n", "![Checkout and Push](https://git-scm.com/figures/18333fig0106-tn.png)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "4786f164", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Tracing requires identification\n", "\n", - "Declare who's modifying files. This will be inserted in \n", + "Declare who's modifying files. This will be inserted in\n", "the commit." ] }, { "cell_type": "code", "execution_count": null, + "id": "7319e718", "metadata": {}, "outputs": [], "source": [ @@ -134,6 +163,7 @@ }, { "cell_type": "markdown", + "id": "8d9e2062", "metadata": {}, "source": [ "Note: authentication can not be enforced on a local repository." @@ -141,8 +171,15 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6051c86d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Create a repository\n", "\n", "Track modifications with `git`" @@ -151,6 +188,7 @@ { "cell_type": "code", "execution_count": null, + "id": "fdf04eb4", "metadata": {}, "outputs": [], "source": [ @@ -160,18 +198,20 @@ }, { "cell_type": "markdown", + "id": "b8c78e39", "metadata": {}, "source": [ "### Exercise\n", "\n", - " - get the previous `git config ... user.email` \n", - " - remove the `--global` flag from the previous command\n", - " - run it" + "- get the previous `git config ... user.email`\n", + "- remove the `--global` flag from the previous command\n", + "- run it" ] }, { "cell_type": "code", "execution_count": null, + "id": "69557bf0", "metadata": {}, "outputs": [], "source": [ @@ -182,7 +222,12 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "a981eecc", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ "---\n", "\n", @@ -193,14 +238,16 @@ { "cell_type": "code", "execution_count": null, + "id": "29a73ba6", "metadata": {}, "outputs": [], "source": [ - "!git status " + "!git status" ] }, { "cell_type": "markdown", + "id": "d9e41818", "metadata": {}, "source": [ "`.gitignore` lists the files we're not interested in" @@ -209,16 +256,18 @@ { "cell_type": "code", "execution_count": null, + "id": "7e24aaf6", "metadata": {}, "outputs": [], "source": [ "# Ignore all files not starting with h\n", "!echo \"[^h]*\" >> .gitignore\n", - "!git status " + "!git status" ] }, { "cell_type": "markdown", + "id": "c0463059", "metadata": {}, "source": [ "Now we have all `host*` files to be tracked." @@ -226,8 +275,15 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "93276090", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Populate the repo\n", "\n", "Add files to the index" @@ -236,14 +292,16 @@ { "cell_type": "code", "execution_count": null, + "id": "ba250a13", "metadata": {}, "outputs": [], "source": [ - "! git add hosts" + "!git add hosts" ] }, { "cell_type": "markdown", + "id": "7fdde7cd", "metadata": {}, "source": [ "The file is now *staged* for commit. It's not archived though." @@ -252,6 +310,7 @@ { "cell_type": "code", "execution_count": null, + "id": "4a45be06", "metadata": {}, "outputs": [], "source": [ @@ -260,6 +319,7 @@ }, { "cell_type": "markdown", + "id": "ced6d9a3", "metadata": {}, "source": [ "Save files to the local index" @@ -268,14 +328,16 @@ { "cell_type": "code", "execution_count": null, + "id": "2246b5da", "metadata": {}, "outputs": [], "source": [ - "! git commit -m \"Initial snapshot of hosts\"" + "!git commit -m \"Initial snapshot of hosts\"" ] }, { "cell_type": "markdown", + "id": "e40f0406", "metadata": {}, "source": [ "![Git areas](https://git-scm.com/images/about/index1@2x.png)" @@ -283,8 +345,15 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "5c47fc45", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Basic workflow\n", "\n", "Adding a line to the file we discover that" @@ -293,15 +362,17 @@ { "cell_type": "code", "execution_count": null, + "id": "61a489ee", "metadata": {}, "outputs": [], "source": [ - "!echo \"127.0.0.2 localhost2.localdomain\" >> hosts \n", + "!echo \"127.0.0.2 localhost2.localdomain\" >> hosts\n", "!git diff hosts" ] }, { "cell_type": "markdown", + "id": "7b3d7ccc", "metadata": {}, "source": [ "If we like the changes, we can stage them" @@ -310,15 +381,17 @@ { "cell_type": "code", "execution_count": null, + "id": "89f6d0d0", "metadata": {}, "outputs": [], "source": [ "!git add hosts\n", - "!git status " + "!git status" ] }, { "cell_type": "markdown", + "id": "4f57b9e5", "metadata": {}, "source": [ "and finally save them in the repo." @@ -327,6 +400,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0b48ff38", "metadata": {}, "outputs": [], "source": [ @@ -335,7 +409,12 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "75973a82", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ "---\n", "\n", @@ -343,8 +422,8 @@ "\n", "Now we have an history with two changes, containing:\n", "\n", - " - commit messages\n", - " - a commit hash\n", + "- commit messages\n", + "- a commit hash\n", "\n", "HEAD is the last commit." ] @@ -352,14 +431,16 @@ { "cell_type": "code", "execution_count": null, + "id": "b1a64497", "metadata": {}, "outputs": [], "source": [ - "!git log " + "!git log" ] }, { "cell_type": "markdown", + "id": "42aad7f8", "metadata": {}, "source": [ "![Basic branch](https://git-scm.com/figures/18333fig0310-tn.png)" @@ -367,8 +448,15 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "f45574e8", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Reverting changes\n", "\n", "We can revert a change using the hash or an history log" @@ -377,16 +465,24 @@ { "cell_type": "code", "execution_count": null, + "id": "ec0651ef", "metadata": {}, "outputs": [], "source": [ - "! git checkout HEAD~1 -- hosts # revert hosts to the previous commit" + "!git checkout HEAD~1 -- hosts # revert hosts to the previous commit" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "96eba2fc", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Cheatsheet\n", "\n", "Now some git commands, but first create a dir." @@ -395,16 +491,18 @@ { "cell_type": "code", "execution_count": null, + "id": "c7f5263e", "metadata": {}, "outputs": [], "source": [ - "! mkdir -p /repo-path\n", + "!mkdir -p /repo-path\n", "!date >> /repo-path/file.txt\n", "!date >> /repo-path/hi.txt" ] }, { "cell_type": "markdown", + "id": "1b486c01", "metadata": {}, "source": [ "---" @@ -413,6 +511,7 @@ { "cell_type": "code", "execution_count": null, + "id": "d625983f", "metadata": {}, "outputs": [], "source": [ @@ -423,25 +522,36 @@ }, { "cell_type": "markdown", + "id": "12c36cb1", "metadata": {}, "source": [ "### Exercise\n", "\n", - " - add `file.txt` to the index and commit" + "- add `file.txt` to the index and commit" ] }, { "cell_type": "code", "execution_count": null, + "id": "f2875a20", "metadata": {}, "outputs": [], "source": [ "# Use this cell for the exercise" ] }, + { + "cell_type": "markdown", + "id": "176dabc2", + "metadata": {}, + "source": [ + "---" + ] + }, { "cell_type": "code", "execution_count": null, + "id": "2786502f", "metadata": {}, "outputs": [], "source": [ @@ -450,9 +560,18 @@ "!git commit -a -m \"Save all previously added files\"" ] }, + { + "cell_type": "markdown", + "id": "5e605932", + "metadata": {}, + "source": [ + "---" + ] + }, { "cell_type": "code", "execution_count": null, + "id": "f3aa8b5d", "metadata": {}, "outputs": [], "source": [ @@ -462,6 +581,7 @@ { "cell_type": "code", "execution_count": null, + "id": "809cb347", "metadata": {}, "outputs": [], "source": [ @@ -471,6 +591,7 @@ { "cell_type": "code", "execution_count": null, + "id": "5f408bf2", "metadata": {}, "outputs": [], "source": [ @@ -480,6 +601,7 @@ { "cell_type": "code", "execution_count": null, + "id": "51681f21", "metadata": {}, "outputs": [], "source": [ @@ -488,19 +610,27 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ff306b1d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ - "## Tags & Branches \n", + "---\n", + "\n", + "## Tags & Branches\n", "\n", "Writing codes and configuration we may want to follow\n", "different strategies and save our different attempts.\n", "\n", - " - *tag* makes an unmodifiable snapshot of the repo instead." + "- *tag* makes an unmodifiable snapshot of the repo instead." ] }, { "cell_type": "code", "execution_count": null, + "id": "effd478b", "metadata": {}, "outputs": [], "source": [ @@ -510,9 +640,10 @@ }, { "cell_type": "markdown", + "id": "4b05fced", "metadata": {}, "source": [ - "- *branch* create a modifiable copy of the code, allowing \n", + "- *branch* create a modifiable copy of the code, allowing\n", " to save and work on different features\n", "\n", "![Branches](https://git-scm.com/figures/18333fig0313-tn.png)" @@ -520,8 +651,15 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "65f48039", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Branches\n", "\n", "`master` is the default branch" @@ -530,6 +668,7 @@ { "cell_type": "code", "execution_count": null, + "id": "d0f52580", "metadata": {}, "outputs": [], "source": [ @@ -538,6 +677,7 @@ }, { "cell_type": "markdown", + "id": "440c9e9d", "metadata": {}, "source": [ "Create a branch" @@ -546,6 +686,7 @@ { "cell_type": "code", "execution_count": null, + "id": "1cbdaefc", "metadata": {}, "outputs": [], "source": [ @@ -554,6 +695,7 @@ }, { "cell_type": "markdown", + "id": "15d4499e", "metadata": {}, "source": [ "And list the branches, check the active one!" @@ -562,6 +704,7 @@ { "cell_type": "code", "execution_count": null, + "id": "15b4fb9e", "metadata": {}, "outputs": [], "source": [ @@ -570,14 +713,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7a767353", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "Modify a file in a branch" ] }, { "cell_type": "code", "execution_count": null, + "id": "a4631b97", "metadata": {}, "outputs": [], "source": [ @@ -587,6 +738,7 @@ }, { "cell_type": "markdown", + "id": "38365710", "metadata": {}, "source": [ "With commit we consolidate the new file in the branch" @@ -595,6 +747,7 @@ { "cell_type": "code", "execution_count": null, + "id": "0f8e151b", "metadata": {}, "outputs": [], "source": [ @@ -603,14 +756,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "284b07da", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "Compare branches" ] }, { "cell_type": "code", "execution_count": null, + "id": "64d828f6", "metadata": {}, "outputs": [], "source": [ @@ -619,6 +780,7 @@ }, { "cell_type": "markdown", + "id": "af639d85", "metadata": {}, "source": [ "Diff supports some parameters" @@ -627,6 +789,7 @@ { "cell_type": "code", "execution_count": null, + "id": "ce494335", "metadata": {}, "outputs": [], "source": [ @@ -635,14 +798,22 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "ff806888", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "We can now switch between branches" ] }, { "cell_type": "code", "execution_count": null, + "id": "f9fcf98f", "metadata": {}, "outputs": [], "source": [ @@ -652,6 +823,7 @@ }, { "cell_type": "markdown", + "id": "8eceeeb6", "metadata": {}, "source": [ "And switch back" @@ -660,6 +832,7 @@ { "cell_type": "code", "execution_count": null, + "id": "4a90452a", "metadata": {}, "outputs": [], "source": [ @@ -669,19 +842,27 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "60f1a8f7", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "### Exercise\n", "\n", - " - Create a new branch named `antani`\n", - " - modify `new-file.txt` as you please\n", - " - open a terminal, and use `git add -p` to stage the changes. What does it do?\n", - " - commit the changes" + "- Create a new branch named `antani`\n", + "- modify `new-file.txt` as you please\n", + "- [open a terminal](/terminals/git), and use `git add -p` to stage the changes. What does it do?\n", + "- commit the changes" ] }, { "cell_type": "code", "execution_count": null, + "id": "e2c7bd22", "metadata": {}, "outputs": [], "source": [ @@ -690,8 +871,15 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "1cd00765", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Checkout troubleshooting\n", "\n", "If you change a file, git won't make you checkout\n", @@ -701,6 +889,7 @@ { "cell_type": "code", "execution_count": null, + "id": "59e5a254", "metadata": {}, "outputs": [], "source": [ @@ -710,6 +899,7 @@ }, { "cell_type": "markdown", + "id": "71da518c", "metadata": {}, "source": [ "You have to remove the changes or commit them (in another branch too)" @@ -718,6 +908,7 @@ { "cell_type": "code", "execution_count": null, + "id": "e22fd009", "metadata": {}, "outputs": [], "source": [ @@ -726,35 +917,87 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "0b77d8f6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Merge\n", "\n", - "Once we have consolidated some changes (Eg. test, ...)\n", + "Once we have consolidated some changes (e.g., test, ...)\n", "we can *merge* the changes into the master branch" ] }, { "cell_type": "code", "execution_count": null, + "id": "770704f3", "metadata": {}, "outputs": [], "source": [ - "!git checkout master\n", - "!git diff work-on-my-changes\n", - "!git merge work-on-my-changes" + "!git checkout master" + ] + }, + { + "cell_type": "markdown", + "id": "92138e82", + "metadata": {}, + "source": [ + "Before merging, we have to check the differences" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f91d8d41", + "metadata": {}, + "outputs": [], + "source": [ + "!git diff work-on-my-changes" ] }, { "cell_type": "markdown", + "id": "c3610538", "metadata": {}, "source": [ - "After a merge, if the branch is no more useful, we can remove it." + "And finally merge" ] }, { "cell_type": "code", "execution_count": null, + "id": "e64c822b", + "metadata": {}, + "outputs": [], + "source": [ + "!git merge work-on-my-changes" + ] + }, + { + "cell_type": "markdown", + "id": "a31db651", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "After a merge, if the branch is no more useful, we can remove it.\n", + "Note: before deleting a branch, you can double-check available\n", + "branches with `git branch -a`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71b22af5", "metadata": {}, "outputs": [], "source": [ @@ -763,20 +1006,22 @@ }, { "cell_type": "markdown", + "id": "3216d35a", "metadata": {}, "source": [ "If there are unmerged changes, git doesn't allow deleting a branch.\n", "\n", "Exercise:\n", "\n", - " - use `git branch -d` to remove the `antani` branch\n", - " - what happens?\n", - " - replace `-d` with `-D`. Does it work now?" + "- use `git branch -d` to remove the `antani` branch\n", + "- what happens?\n", + "- replace `-d` with `-D`. Does it work now?" ] }, { "cell_type": "code", "execution_count": null, + "id": "762915dd", "metadata": {}, "outputs": [], "source": [ @@ -785,8 +1030,15 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "869b3fda", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Selective adding\n", "\n", "You can stage partial changes with:" @@ -795,16 +1047,24 @@ { "cell_type": "code", "execution_count": null, + "id": "e49ff846", "metadata": {}, "outputs": [], "source": [ - "!git add -p " + "!git add -p" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "1ffb0b4b", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Remote repositories\n", "\n", "Remote repos may be either https, ssh or files." @@ -813,16 +1073,62 @@ { "cell_type": "code", "execution_count": null, + "id": "e4db9adc", + "metadata": {}, + "outputs": [], + "source": [ + "! mkdir -p /repo-tmp && cd /repo-tmp && pwd # use another directory ;)" + ] + }, + { + "cell_type": "markdown", + "id": "3f42676a", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- what happens in the following cell?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aaa4aac3", "metadata": {}, "outputs": [], "source": [ - "! mkdir -p /repo-tmp && cd /repo-tmp # use another directory" + "!pwd" ] }, { "cell_type": "markdown", + "id": "5558113b", "metadata": {}, "source": [ + "Go to the correct directory now." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c80c152", + "metadata": {}, + "outputs": [], + "source": [ + "cd /repo-tmp" + ] + }, + { + "cell_type": "markdown", + "id": "00d2f691", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", "### https repo\n", "\n", "Git clone downloads a remote repo, with all its changes and history.\n", @@ -832,31 +1138,52 @@ { "cell_type": "code", "execution_count": null, + "id": "93194032", + "metadata": {}, + "outputs": [], + "source": [ + "!git clone https://github.com/ioggstream/python-course/ python-course" + ] + }, + { + "cell_type": "markdown", + "id": "7e364def", + "metadata": {}, + "source": [ + "Now enter in the repo directory" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "908d6e35", "metadata": {}, "outputs": [], "source": [ - "! git clone https://github.com/ioggstream/python-course/ python-course\n", "cd /repo-tmp/python-course" ] }, { "cell_type": "markdown", + "id": "f67f6120", "metadata": {}, "source": [ - "Show repository configuration. Remote origin." + "Show repository configuration. Which is the remote origin?" ] }, { "cell_type": "code", "execution_count": null, + "id": "9d125c4b", "metadata": {}, "outputs": [], "source": [ - "! git config -l \n" + "!git config -l" ] }, { "cell_type": "markdown", + "id": "74dccdd3", "metadata": {}, "source": [ "The remote repo is retrieved with all its changes and history" @@ -865,6 +1192,7 @@ { "cell_type": "code", "execution_count": null, + "id": "72d8a61c", "metadata": {}, "outputs": [], "source": [ @@ -873,6 +1201,7 @@ }, { "cell_type": "markdown", + "id": "ce9dc27b", "metadata": {}, "source": [ "And `log` can show branches and merges." @@ -881,6 +1210,7 @@ { "cell_type": "code", "execution_count": null, + "id": "99152bbc", "metadata": {}, "outputs": [], "source": [ @@ -889,54 +1219,103 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "da3f94c6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ "---\n", "\n", "### file repo\n", "\n", "A local repo can be cloned too, and has the same features\n", - "of a remote one. It's actually a remote file:// uri." + "of a remote one. It's actually a remote `file://` uri." ] }, { "cell_type": "code", "execution_count": null, + "id": "172e28c4", "metadata": {}, "outputs": [], "source": [ - "! git clone /repo-tmp/python-course /repo-tmp/my-course" + "!git clone /repo-tmp/python-course /repo-tmp/my-course" ] }, { "cell_type": "markdown", + "id": "5142954c", "metadata": {}, "source": [ - "Show repository configuration. Remote origin." + "Now move to the new directory" ] }, { "cell_type": "code", "execution_count": null, + "id": "024280c5", "metadata": {}, "outputs": [], "source": [ - "! git config -l\n" + "cd /repo-tmp/my-course" ] }, { "cell_type": "markdown", + "id": "99ee299e", "metadata": {}, "source": [ + "Show repository configuration. Which is the remote origin?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "505037a8", + "metadata": {}, + "outputs": [], + "source": [ + "!git config -l" + ] + }, + { + "cell_type": "markdown", + "id": "22ce0715", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", "## Pull & push\n", "\n", "You can add new files to a repo with the above workflow:\n", "\n", - " - create a branch with `git checkout -b test-1`\n", - " - add a new file\n", - " - stage changes with `git add`\n", - " - commit with `git commit`\n", - "\n", + "- create a branch with `git checkout -b test-1`\n", + "- add a new file\n", + "- stage changes with `git add`\n", + "- commit with `git commit`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42505c18", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise" + ] + }, + { + "cell_type": "markdown", + "id": "73ce1851", + "metadata": {}, + "source": [ "Now that your changes are on your local repo, you can synchronize / upload them to the remote copy\n", "with:" ] @@ -944,46 +1323,92 @@ { "cell_type": "code", "execution_count": null, + "id": "420e52e1", "metadata": {}, "outputs": [], "source": [ - "! git push origin test-1" + "!git push origin test-1" ] }, { "cell_type": "markdown", + "id": "af356259", "metadata": {}, "source": [ "Remember:\n", "\n", - " - origin is the URI specified by `git config -l`\n", - " - `test-1` is the branch name where you want to upload\n", + "- origin is the URI specified by `git config -l`\n", + "- `test-1` is the branch name where you want to upload\n", "\n", "To upload changes to the remote master (default) branch, you need to\n", "\n", - " - merge the changes to your local master" + "- merge the changes to your local master" ] }, { "cell_type": "code", "execution_count": null, + "id": "f1cc68b6", + "metadata": {}, + "outputs": [], + "source": [ + "!git checkout master" + ] + }, + { + "cell_type": "markdown", + "id": "3d948893", + "metadata": {}, + "source": [ + "Check the differences" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62cdee76", + "metadata": {}, + "outputs": [], + "source": [ + "!git diff test-1" + ] + }, + { + "cell_type": "markdown", + "id": "0b3bf0a4", + "metadata": {}, + "source": [ + "And finally merge" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "583a589e", "metadata": {}, "outputs": [], "source": [ - "!git checkout master\n", "!git merge test-1" ] }, { "cell_type": "markdown", + "id": "bc785752", "metadata": {}, "source": [ - "- push changes to master" + "Exercise:\n", + "\n", + "- check the master history;\n", + "- check the difference with the last commit.\n", + "\n", + "\n", + "Finally, push changes to `origin/master`" ] }, { "cell_type": "code", "execution_count": null, + "id": "81dfa372", "metadata": {}, "outputs": [], "source": [ @@ -992,6 +1417,7 @@ }, { "cell_type": "markdown", + "id": "a65f7a63", "metadata": {}, "source": [ "To make it work, you need to be authenticated/authorized with the remote repo ;)" @@ -1000,5 +1426,5 @@ ], "metadata": {}, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 5 } diff --git a/git-101/notebooks/01-git.slides.html b/git-101/notebooks/01-git.slides.html new file mode 100644 index 0000000..1c72edd --- /dev/null +++ b/git-101/notebooks/01-git.slides.html @@ -0,0 +1,15318 @@ + + + + + + + + + +01-git slides + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + diff --git a/git-101/tox.ini b/git-101/tox.ini index 268e6e7..cee54b2 100644 --- a/git-101/tox.ini +++ b/git-101/tox.ini @@ -5,7 +5,7 @@ skipsdist = True [testenv] deps = git+https://github.com/ioggstream/notedown -whitelist_externals = +allowlist_externals = make commands = make From da874a23f45a270158cdf2bb076115c2a96f061c Mon Sep 17 00:00:00 2001 From: Fiblan Date: Sun, 11 Jun 2023 21:13:47 +0200 Subject: [PATCH 21/52] Use an environment variable to override EXTERNAL_COURSES (#65) Co-authored-by: Fabio Sfuncia --- ansible-101/Makefile | 6 ++++++ ansible-101/README.md | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ansible-101/Makefile b/ansible-101/Makefile index e692fa1..a4d2a29 100644 --- a/ansible-101/Makefile +++ b/ansible-101/Makefile @@ -3,10 +3,16 @@ # # # make course # +# # or if you want override default value of EXTERNAL_COURSES, please use an environment variable +# # EXTERNAL_COURSES=git-101 make course +# .PHONY: course MAIN_IP = $(shell ip -4 -o a s scope global | awk -F'[/ ]+' '{print $$4; exit} ') + +ifndef EXTERNAL_COURSES EXTERNAL_COURSES = git-101 python-basic docker-101 +endif course: .prepare diff --git a/ansible-101/README.md b/ansible-101/README.md index 2556d33..d04479a 100644 --- a/ansible-101/README.md +++ b/ansible-101/README.md @@ -32,7 +32,13 @@ Run the environemnt with: make course ``` -or +if you want override default value of EXTERNAL_COURSES, please use an environment variable + +```bash +EXTERNAL_COURSES=git-101 make course +``` + +or run docker-compose manually ```bash docker-compose scale course=1 bastion=1 web=3 From ba584b7b33caee5d86800ac3f25aa49680221e88 Mon Sep 17 00:00:00 2001 From: dom__ico <54236030+DomenicoCutrupi@users.noreply.github.com> Date: Sun, 11 Jun 2023 21:14:49 +0200 Subject: [PATCH 22/52] ansible-101: use different debian image in sshd container (#64) * changed source image of Dockerfile.ssh --------- Co-authored-by: Domenico Cutrupi --- ansible-101/Dockerfile.ssh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible-101/Dockerfile.ssh b/ansible-101/Dockerfile.ssh index 89df961..50ddeb4 100644 --- a/ansible-101/Dockerfile.ssh +++ b/ansible-101/Dockerfile.ssh @@ -1,4 +1,4 @@ -FROM debian:stable-slim +FROM debian:bullseye RUN apt-get -y update && apt-get -y install python sshpass openssh-server RUN apt-get -y clean RUN apt-get -y autoremove From fdd66da8b0ff2cf86c2d5520982c0e7033e51812 Mon Sep 17 00:00:00 2001 From: dom__ico <54236030+DomenicoCutrupi@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:23:03 +0200 Subject: [PATCH 23/52] Different debian image (#66) * ansible-101: changing reference to master branch --------- Co-authored-by: Domenico Cutrupi --- ansible-101/site-digitalocean.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible-101/site-digitalocean.yml b/ansible-101/site-digitalocean.yml index 8f4a9cb..e822a2e 100644 --- a/ansible-101/site-digitalocean.yml +++ b/ansible-101/site-digitalocean.yml @@ -133,7 +133,7 @@ - name: Download course git: repo: https://github.com/ioggstream/python-course.git - version: ansible-2023 + version: master dest: /root/python-course ignore_errors: true From 9e3858e9a4ebce776f546badae4a2bac1dffc395 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Tue, 25 Jul 2023 16:23:19 +0200 Subject: [PATCH 24/52] Editorial improvements (language, build, ..) (#68) * Improve texts. * Use bash shell. * Improve python basics. * Python markdown * Create image on ghcr.io --- .dockerfile-security.rego | 97 ++ README.md | 35 +- ansible-101/README.md | 2 +- ansible-101/notebooks/intro.ipynb | 10 +- python-basic/00_intro.md | 352 ++++++++ python-basic/00_intro_01.py | 2 +- python-basic/00_intro_02.py | 2 +- python-basic/01_intro.md | 238 +++++ python-basic/Makefile | 13 + python-basic/README.md | 33 +- python-basic/docker-compose.yml | 1 + python-basic/notebooks/00_intro.ipynb | 1204 ++++++++++++------------- python-basic/notebooks/01_intro.ipynb | 279 ++++-- python-basic/requirements.txt | 7 - python-basic/tox.ini | 11 + sparql-101/01-intro-jsonld.md | 3 +- sparql-101/02-sparql.md | 6 +- sparql-101/03-syntax-semantic.md | 6 +- tools-101/Makefile | 46 + tools-101/docker-compose.yml | 68 ++ tools-101/intro.md | 192 ++++ tools-101/markdown.mak | 10 + tools-101/notebooks/intro.ipynb | 394 ++++++++ tools-101/python27.dockerfile | 39 + tools-101/requirements.txt | 21 + tools-101/tox.ini | 11 + 26 files changed, 2318 insertions(+), 764 deletions(-) create mode 100644 .dockerfile-security.rego create mode 100644 python-basic/00_intro.md create mode 100644 python-basic/01_intro.md create mode 100644 python-basic/Makefile delete mode 100644 python-basic/requirements.txt create mode 100644 python-basic/tox.ini create mode 100644 tools-101/Makefile create mode 100644 tools-101/docker-compose.yml create mode 100644 tools-101/intro.md create mode 100644 tools-101/markdown.mak create mode 100644 tools-101/notebooks/intro.ipynb create mode 100644 tools-101/python27.dockerfile create mode 100644 tools-101/requirements.txt create mode 100644 tools-101/tox.ini diff --git a/.dockerfile-security.rego b/.dockerfile-security.rego new file mode 100644 index 0000000..4cb914a --- /dev/null +++ b/.dockerfile-security.rego @@ -0,0 +1,97 @@ +package main + +# Do Not store secrets in ENV variables +secrets_env = [ + "passwd", + "password", + "pass", + "secret", + "key", + "access", + "api_key", + "apikey", + "token", + "tkn" +] + +deny[msg] { + input[i].Cmd == "env" + val := input[i].Value + contains(lower(val[_]), secrets_env[_]) + msg = sprintf("Line %d: Potential secret in ENV key found: %s", [i, val]) +} + +# Only use base images from trusted registries +trusted_registries = [ + "registry.access.redhat.com", + "ghcr.io/par-tec", + "docker.io/python", +] +deny_untrusted_base_image[msg] { + input[i].Cmd == "from" + val := split(input[i].Value[0], " ") + trusted_registries_re = concat("|", trusted_registries) + ret := regex.match(trusted_registries_re, lower(val[0])) + not ret + msg = sprintf("Line %d: use trusted, FQDN base image: %s", [i, ret]) +} + +# Do not use 'latest' tag for base imagedeny[msg] { +deny[msg] { + input[i].Cmd == "from" + val := split(input[i].Value[0], ":") + contains(lower(val[1]), "latest") + msg = sprintf("Line %d: do not use 'latest' tag for base images", [i]) +} + +# Avoid curl bashing +deny_curl_bashing[msg] { + input[i].Cmd == "run" + val := concat(" ", input[i].Value) + matches := regex.find_n("(curl|wget)[^|^>]*[|>]", lower(val), -1) + count(matches) > 0 + msg = sprintf("Line %d: Avoid curl bashing", [i]) +} + +# Do not upgrade your system packages +upgrade_commands = [ + "dist-upgrade", +] + +deny[msg] { + input[i].Cmd == "run" + val := concat(" ", input[i].Value) + contains(val, upgrade_commands[_]) + msg = sprintf("Line: %d: Do not upgrade your distribution", [i]) +} + +# Do not use ADD if possible +deny[msg] { + input[i].Cmd == "add" + msg = sprintf("Line %d: Use COPY instead of ADD", [i]) +} + +# Do not root +any_user { + input[i].Cmd == "user" + } + +deny_root_user[msg] { + not any_user + msg = "Do not run as root, use USER instead" +} + +# Do not sudo +deny[msg] { + input[i].Cmd == "run" + val := concat(" ", input[i].Value) + contains(lower(val), "sudo") + msg = sprintf("Line %d: Do not use 'sudo' command", [i]) +} + +exception[rules] { + input[i].Cmd == "from" + input[i].Value[0] == "maven:3.8.7-eclipse-temurin-11" + + rules := ["untrusted_base_image"] +} diff --git a/README.md b/README.md index 98b2414..cd43e88 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -#python-course - +# python-course Python exercises and materials for various courses. @@ -7,28 +6,40 @@ Python exercises and materials for various courses. An introductory course for people knowing other languages. - - lessons: 2 - - duration: 2 hours +- lessons: 2 +- duration: 2 hours ## python for system administrator - A course for system administrators (Linux, Windows, Mac) - +A course for system administrators (Linux, Windows, Mac) ## MySQL 101 - 5.7 - A MySQL course featuring data management basics +A MySQL course featuring data management basics ## Ansible 101 - The training presented ad EuroPython 2017, with further revisions. +The training presented ad EuroPython 2017, with further revisions. ## Git 101 - A fastrack for learning git. +A fastrack for learning git. + +## Docker 101 + +A fast track for learning docker and IoC basics. + +## Further ideas + +- intermediate python +- python for performance testing + +--- +## Developing -## TODO +Many courses are written in markdown and converted in jupyter notebooks. +This is done to allow for a better versioning of the materials. -* intermediate python -* python for performance testing +The docker image is provided via ghcr.io. You can test it locally with +`act`. See https://github.com/nektos/act. diff --git a/ansible-101/README.md b/ansible-101/README.md index d04479a..21bf8f2 100644 --- a/ansible-101/README.md +++ b/ansible-101/README.md @@ -34,7 +34,7 @@ make course if you want override default value of EXTERNAL_COURSES, please use an environment variable -```bash +```bash EXTERNAL_COURSES=git-101 make course ``` diff --git a/ansible-101/notebooks/intro.ipynb b/ansible-101/notebooks/intro.ipynb index ae81eee..81dcb54 100644 --- a/ansible-101/notebooks/intro.ipynb +++ b/ansible-101/notebooks/intro.ipynb @@ -251,21 +251,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.14" + "pygments_lexer": "ipython3", + "version": "3.9.9" } }, "nbformat": 4, diff --git a/python-basic/00_intro.md b/python-basic/00_intro.md new file mode 100644 index 0000000..4118581 --- /dev/null +++ b/python-basic/00_intro.md @@ -0,0 +1,352 @@ +# Python for System Administrator + + Author: + +--- + +## Introducing Python + +Python is an interpreted, object oriented language with +a lot of built in features. + +This is a fast-track course for sysadmin with knowledge +of languages like Perl, PHP, C and Java + +---- + +## Agenda + +- Importing features +- Getting help +- Printing +- Basic Arithmetic +- Variable assignment +- Formatting + +---- + +```python +# Importing_new_features +# ..is easy. Features are collected +# in packages or modules. Just +import telnetlib # to use a +telnetlib.Telnet # client +``` + +```python +# We can even import single classes +# from a module, like +from telnetlib import Telnet + +``` + +---- + +Modules contain documentation in the form of docstrings, +that jupyter presents in scrollable boxes. + +```python + +# Read the module documentation... +help(telnetlib) +``` + +```python +# ...or the class documentation +help(Telnet) + +``` + +--- + +## Basic functions + +There are basic functions for printing and +managing variables. + +```python +# you can print with the print() function +print("Hello world!") +``` + +```python +# concatenate string with a + sign +# and using hex notation +print("Hello" + " " + "World\x21") +``` + +```python +print("Ciao") +``` + +```python +# prefixing a string with 'r' disables the +# interpretation of the string content +print('Hello' * 2 + r'World\x21') +``` + +---- + +```python +# the chr() function returns the corresponding +# character of an integer. While \n and \t are +# just the usual notation for linefeed and tab +print(chr(72) + "ello\n\tWorld!") +``` + +```python +# triple-quoting allows multi-line strings +# %s works like in the C printf() function +# but operates on strings +# ord() is just the inverse of chr() +print("""The answer is + +%s +""" % ord('*')) + +``` + +--- + +## Basic Arithmetic + +```python +# This is a comment, while +a = 1 # is an integer variable +b = 0x10 # is another integer in hex notation +``` + +---- + +```python +# Exercise: use the print() function to print the value of a and b. + +``` + +---- + +```python +# c = 011 # ...another one in C-style oct on python 2... +c = 0o11 # ...in python 2 and 3 +``` + +---- + +```python +# I can sum, multiply, and modulus +print(a + b, 5 % 2) +``` + +---- + +```python +# Exercise: which is the expected value of 2 * c? +print(2 * c) +``` + +--- + +## Variable assignment + +```python +# variable_assignment +# I can assign more than one variable on the same line +a, b, c = 1, 2, 3 +d, string_a, string_b = a + b, "foo", "bar" +``` + +```python + +# ...swap them... +(a, b) = (b, a) +``` + +```python +# Exercise: print the values of the above variables +``` + +```python +# but if right-side values are not defined, I get an exception +e, f = c, e + d +``` + +---- + +```python +# The function ord() returns the integer value of a character. +ord('*') +``` + +```python +# The function chr() returns the character corresponding to an integer. +ord("\n") +``` + +--- + +#### Bonus topic: reserved words + +Python has a set of reserved words that cannot be used as variable names, including: + +- `if, else, for, while, and, or, not, in, is, break, continue, pass, def, class, return, try, except, finally, lambda`. + +Sadly, some core, built-in function names in python 2 can be used as variable names, including: + +- `file, print, len, type, list, exit`. + +This means that a programmer can accidentally overwrite the built-in function with a variable of the same name, causing unexpected results. + +Now we will see an example of this, and how to fix it using the built-in module. + +```python +# We should respect reserved words and built-in functions, like print, ord... +print(("ord:\x20", ord)) + +``` + +---- + +```python +# We can discover the original module of an object with +print(ord.__module__) +``` + +---- + +Note: + +- python 2 uses the `__builtin__` module, while +- python 3 uses the `builtins` module. + +In both cases, you should never use the `__builtins__` module (note the final **s**), because it's implementation dependent. +For further information on this topic, see [the python execution model documentation](https://docs.python.org/3/reference/executionmodel.html#builtins-and-restricted-execution) + +---- + +```python +# If we override a function and call it... +ord = 4 +ord('*') # ...ooops! +``` + +```python +# We can fix it up importing the version specific built-in module +# and reassigning the variable to the original function + +try: # Try the python 2 syntax... + import __builtin__ as builtins +except ImportError: # And if it fails, use the python 3 syntax. + import builtins + +ord = builtins.ord +ord('*') # ...ooops! +``` + +--- + +## Formatting numbers + +```python +# bin() and hex() returns a string representation +# of a number +a, b1 = hex(10), bin(1) +``` + +```python +# Exercise: which is the type of a? And the type of b1? +type(a) +``` + +---- + +```python +# while the format() function can be more flexible +# 10 = 8ciphers + 2chars for the '0b' header +binary_with_leading_zeroes = format(1, '#010b') +``` + +---- + +```python +# and reversible with +b1 == int(binary_with_leading_zeroes, base=2) +``` + +---- + +```python +# Exercise: use this cell to inspect the values of the above variables. +``` + +--- + +## Formatting + +---- + +```python +# The new str.format function just replaces +# %s and %d with {}. +s_a = "is a string " + +print(s_a) +``` + +---- + +```python +# A string +s_a += "that can {} extended".format("be") +``` + +---- + +```python +# Exercise: print the value of s_a +``` + +---- + +```python +# Further formatting is done using ":", eg. +# %.6s -> {:.6} +# %3.2d -> {:3.2} +s_a = "{} even with {:.6} formatting.\n".format(s_a, "positional") +``` + +---- + +```python +# Alignment identifiers are simpler: < left , ^ center, > right +s_a = "Align {:>10}% python!".format(100) +print(s_a) +print("just prints a string") +``` + +---- + +```python +# Exercise: modify s_a to align the string to the left and to the center. +``` + +--- + +### Formatting with names + +---- + +```python +# You can name variables to get +# a better formatting experience ;) +fmt_a = "{name:<.3} {nick:^.8} {sn:>30}" +print(fmt_a.format(name="-"*10, nick="*"*15, sn="-"*40)) +print(fmt_a.format(name="Roberto", nick="ioggstream", sn="Polli")) +``` + +---- + +```python + +``` + +---- diff --git a/python-basic/00_intro_01.py b/python-basic/00_intro_01.py index 90f0a5f..28f864a 100644 --- a/python-basic/00_intro_01.py +++ b/python-basic/00_intro_01.py @@ -1,5 +1,5 @@ """ - Author: roberto.polli@babel.it + Author: roberto.polli@par-tec.it This file contains an introduction to the python for sysadmins course. diff --git a/python-basic/00_intro_02.py b/python-basic/00_intro_02.py index 017321e..d5d07ca 100644 --- a/python-basic/00_intro_02.py +++ b/python-basic/00_intro_02.py @@ -1,6 +1,6 @@ """Introducing lists - Roberto Polli - rpolli@babel.it + Roberto Polli - roberto.polli@par-tec.it """ # before starting this lesson # import the python3 print capabilities diff --git a/python-basic/01_intro.md b/python-basic/01_intro.md new file mode 100644 index 0000000..27ff7c3 --- /dev/null +++ b/python-basic/01_intro.md @@ -0,0 +1,238 @@ +# Python for System Administrators + +Introductory Lesson 2 + +- Roberto Polli - + +```python +# before starting this lesson +# import the python3 print capabilities +# using the following statement +# NB since now you *must* always use +# parenthesis with print! +from __future__ import print_function, unicode_literals, division +import sys + +# Import further python3 features. +if sys.version_info.major < 3: + from future_builtins import * + import __builtin__ as builtins +``` + +## Introducing Lists + +```python +# it's easy to create a list +list_a = ['this', 'is', 'a', 'list'] + +``` + +```python + +# you can append items to a list +# with the append method +list_a.append("mutable") +``` + +```python +# Print its content +print(list_a) +``` + +```python +# See its length +len(list_a) +``` + +--- + +#### Lists and Generators + +In python you can create lists of subsequent numbers. +In python 2, the `range` function returns a list, +while in python 3 it returns an iterable object. + +This is to avoid memory issues when dealing with large lists. + +```python +a = 11 +#range in python 2 returns a list +# of consecutive ints +from_0_to_10 = range(a) +l = len(from_0_to_10) +l == a +print(l) +``` + +```python +# in python 3 things are slightly different +# so the above code won't work. +import sys +if sys.version_info.major < 3: + range = xrange # Override the range function with the xrange function. +from_0_to_10 = range(a) +``` + +```python +# Exercise: can you print the content of from_0_to_10 +print(from_0_to_10) +``` + +```python + +# In python 3, you need to create a list from the range object. +# The above code +# should be replaced with the following +from_0_to_10 = list(range(a)) +print(from_0_to_10) +``` + +--- + +## Getting list items + +```python +# you can get list items by index +from_0_to_10[0] +``` + +```python +# Exercise: what happens if I get the 11th element? +from_0_to_10[11] +``` + +```python +# python is calling under the hood +from_0_to_10.__getitem__(0) +``` + + +```python +# python lists are doubly linked ;) +from_0_to_10[-1] + +``` + +```python + +# Exercise: please check the manual! +help(list) +``` + +--- + +## Slicing a list + +```python +straight = [1, 2, 3, 'star'] +print(straight) +``` + +```python +# I can take the middle of the list... +straight[1:3] +``` + +```python +k = 2 # ... or using a separator +straight[0:k], straight[k:4] +``` + +```python +straight[:k] # I can omit the first... +``` + +```python +straight[k:] # ...and last index +``` + +--- + +## Strings and Lists + +```python +# Strings behaves like lists +s_a = "Counting: 123" + +``` + +```python + +# Have length.. +l_a = len(s_a) +print(l_a) +``` + +```python +# ..indexes +print(s_a[0], " ", s_a[-1]) +``` + +```python +# and a last element +s_a[l_a] # ...what's happening there? +``` + +```python +# ...we can even slice them +f = "prova.txt" +f[:-4], f[-4], f[-3:] +``` + +```python +# Note: use the os.path module for path manipulation. +# The above code will break with 4-letter extensions! +from os.path import splitext +splitext("prova.foo.yaml") +``` + +--- + +## Iterations: for + +```python +a_list = ['is', 'iterable', 'with'] +for x in a_list: + print(x) +``` + +```python +for x in a_list: + # You need `from __future__ import print_function` + # for python2 to support the `end` argument + print((x), end=' ') + y = x + str(2) + break # stop now +``` + +```python +# what's the expected output of the +# following instruction? +print(("x,y: ", (x, y))) +# Differently from C, `for` does not create +# a scope +``` + +--- + +## Iterations: while + +```python +a_list = ['is', 'iterable', 'with'] +while a_list: + # pop() modifies a list removing + # and returning its last element + x = a_list.pop() + print(("pop out %s" % x)) + break # what happens if I remove this break? + +print(a_list) +``` + +```python +# What's the expected behavior of the +# following instructions? +for x in a_list: + print((x + a_list.pop())) +# for + pop() is not always a good idea ;) +``` diff --git a/python-basic/Makefile b/python-basic/Makefile new file mode 100644 index 0000000..fbbd0b1 --- /dev/null +++ b/python-basic/Makefile @@ -0,0 +1,13 @@ +FILES=$(wildcard *.md) +BOOKS = $(patsubst %.md,notebooks/%.ipynb,$(FILES)) + + +all: $(BOOKS) + @echo $(BOOKS) + +notebooks/%.ipynb: %.md + + notedown --to notebook $^ > $@ + +run: all + jupyter notebook notebooks diff --git a/python-basic/README.md b/python-basic/README.md index 1b831f3..ddf70fb 100644 --- a/python-basic/README.md +++ b/python-basic/README.md @@ -8,32 +8,11 @@ and use it: - via ipython - via ipython notebook +## Run -## Setup on Linux +Use tox -Install the dependencies either with: - - - #pip install -r requirements.txt - - - #sudo apt-get install ipython-notebook - - - #sudo yum install ipython-notebook - - -## Setup with Docker Compose - -If you have docker and compose you can just run (and wait for download): - - #docker-compose up - - -## Setup on Windows and Mac OS - -Download python from [Continuum](http://continuum.io/downloads) and -install following the [provided instructions](http://docs.continuum.io/anaconda/install.html) - -Then from the terminal: - - #conda update conda - #conda update ipython ipython-notebook ipython-qtconsole \ - readline psutil matplotlib scipy numpy nose +```bash +pip install tox +tox -- run +``` diff --git a/python-basic/docker-compose.yml b/python-basic/docker-compose.yml index 42d7dbc..cad8615 100644 --- a/python-basic/docker-compose.yml +++ b/python-basic/docker-compose.yml @@ -4,6 +4,7 @@ sysadminpy: environment: - USE_HTTP=1 - PASSWORD=secret + - SHELL=/bin/bash ports: - 8888:8888 volumes: diff --git a/python-basic/notebooks/00_intro.ipynb b/python-basic/notebooks/00_intro.ipynb index 5ba0c0a..2f872e1 100644 --- a/python-basic/notebooks/00_intro.ipynb +++ b/python-basic/notebooks/00_intro.ipynb @@ -2,15 +2,24 @@ "cells": [ { "cell_type": "markdown", + "id": "868f7bff", + "metadata": {}, + "source": [ + "# Python for System Administrator\n", + "\n", + " Author: " + ] + }, + { + "cell_type": "markdown", + "id": "e621dedc", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ - "# Python for System Administrator\n", - " \n", - " Author: roberto.polli@par-tec.it\n", + "---\n", "\n", "## Introducing Python\n", "\n", @@ -18,42 +27,44 @@ "a lot of built in features.\n", "\n", "This is a fast-track course for sysadmin with knowledge\n", - "of languages like Perl, PHP, C and Java\n" + "of languages like Perl, PHP, C and Java" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "00e87a69", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, "source": [ + "----\n", "\n", "## Agenda\n", "\n", - " - Importing features\n", - " - Getting help\n", - " - Printing \n", - " - Basic Arithmetic\n", - " - Variable assignment\n", - " - Formatting\n" + "- Importing features\n", + "- Getting help\n", + "- Printing\n", + "- Basic Arithmetic\n", + "- Variable assignment\n", + "- Formatting" + ] + }, + { + "cell_type": "markdown", + "id": "8b7290ba", + "metadata": {}, + "source": [ + "----" ] }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "id": "778e7f5a", + "metadata": {}, + "outputs": [], "source": [ "# Importing_new_features\n", "# ..is easy. Features are collected\n", @@ -64,549 +75,130 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on module telnetlib:\n", - "\n", - "NAME\n", - " telnetlib - TELNET client class.\n", - "\n", - "FILE\n", - " /usr/local/lib/python2.7/telnetlib.py\n", - "\n", - "MODULE DOCS\n", - " http://docs.python.org/library/telnetlib\n", - "\n", - "DESCRIPTION\n", - " Based on RFC 854: TELNET Protocol Specification, by J. Postel and\n", - " J. Reynolds\n", - " \n", - " Example:\n", - " \n", - " >>> from telnetlib import Telnet\n", - " >>> tn = Telnet('www.python.org', 79) # connect to finger port\n", - " >>> tn.write('guido\\r\\n')\n", - " >>> print tn.read_all()\n", - " Login Name TTY Idle When Where\n", - " guido Guido van Rossum pts/2 snag.cnri.reston..\n", - " \n", - " >>>\n", - " \n", - " Note that read_all() won't read until eof -- it just reads some data\n", - " -- but it guarantees to read at least one byte unless EOF is hit.\n", - " \n", - " It is possible to pass a Telnet object to select.select() in order to\n", - " wait until more data is available. Note that in this case,\n", - " read_eager() may return '' even if there was data on the socket,\n", - " because the protocol negotiation may have eaten the data. This is why\n", - " EOFError is needed in some cases to distinguish between \"no data\" and\n", - " \"connection closed\" (since the socket also appears ready for reading\n", - " when it is closed).\n", - " \n", - " To do:\n", - " - option negotiation\n", - " - timeout should be intrinsic to the connection object instead of an\n", - " option on one of the read calls only\n", - "\n", - "CLASSES\n", - " Telnet\n", - " \n", - " class Telnet\n", - " | Telnet interface class.\n", - " | \n", - " | An instance of this class represents a connection to a telnet\n", - " | server. The instance is initially not connected; the open()\n", - " | method must be used to establish a connection. Alternatively, the\n", - " | host name and optional port number can be passed to the\n", - " | constructor, too.\n", - " | \n", - " | Don't try to reopen an already connected instance.\n", - " | \n", - " | This class has many read_*() methods. Note that some of them\n", - " | raise EOFError when the end of the connection is read, because\n", - " | they can return an empty string for other reasons. See the\n", - " | individual doc strings.\n", - " | \n", - " | read_until(expected, [timeout])\n", - " | Read until the expected string has been seen, or a timeout is\n", - " | hit (default is no timeout); may block.\n", - " | \n", - " | read_all()\n", - " | Read all data until EOF; may block.\n", - " | \n", - " | read_some()\n", - " | Read at least one byte or EOF; may block.\n", - " | \n", - " | read_very_eager()\n", - " | Read all data available already queued or on the socket,\n", - " | without blocking.\n", - " | \n", - " | read_eager()\n", - " | Read either data already queued or some data available on the\n", - " | socket, without blocking.\n", - " | \n", - " | read_lazy()\n", - " | Read all data in the raw queue (processing it first), without\n", - " | doing any socket I/O.\n", - " | \n", - " | read_very_lazy()\n", - " | Reads all data in the cooked queue, without doing any socket\n", - " | I/O.\n", - " | \n", - " | read_sb_data()\n", - " | Reads available data between SB ... SE sequence. Don't block.\n", - " | \n", - " | set_option_negotiation_callback(callback)\n", - " | Each time a telnet option is read on the input flow, this callback\n", - " | (if set) is called with the following parameters :\n", - " | callback(telnet socket, command, option)\n", - " | option will be chr(0) when there is no option.\n", - " | No other action is done afterwards by telnetlib.\n", - " | \n", - " | Methods defined here:\n", - " | \n", - " | __del__(self)\n", - " | Destructor -- close the connection.\n", - " | \n", - " | __init__(self, host=None, port=0, timeout=)\n", - " | Constructor.\n", - " | \n", - " | When called without arguments, create an unconnected instance.\n", - " | With a hostname argument, it connects the instance; port number\n", - " | and timeout are optional.\n", - " | \n", - " | close(self)\n", - " | Close the connection.\n", - " | \n", - " | expect(self, list, timeout=None)\n", - " | Read until one from a list of a regular expressions matches.\n", - " | \n", - " | The first argument is a list of regular expressions, either\n", - " | compiled (re.RegexObject instances) or uncompiled (strings).\n", - " | The optional second argument is a timeout, in seconds; default\n", - " | is no timeout.\n", - " | \n", - " | Return a tuple of three items: the index in the list of the\n", - " | first regular expression that matches; the match object\n", - " | returned; and the text read up till and including the match.\n", - " | \n", - " | If EOF is read and no text was read, raise EOFError.\n", - " | Otherwise, when nothing matches, return (-1, None, text) where\n", - " | text is the text received so far (may be the empty string if a\n", - " | timeout happened).\n", - " | \n", - " | If a regular expression ends with a greedy match (e.g. '.*')\n", - " | or if more than one expression can match the same input, the\n", - " | results are undeterministic, and may depend on the I/O timing.\n", - " | \n", - " | fileno(self)\n", - " | Return the fileno() of the socket object used internally.\n", - " | \n", - " | fill_rawq(self)\n", - " | Fill raw queue from exactly one recv() system call.\n", - " | \n", - " | Block if no data is immediately available. Set self.eof when\n", - " | connection is closed.\n", - " | \n", - " | get_socket(self)\n", - " | Return the socket object used internally.\n", - " | \n", - " | interact(self)\n", - " | Interaction function, emulates a very dumb telnet client.\n", - " | \n", - " | listener(self)\n", - " | Helper for mt_interact() -- this executes in the other thread.\n", - " | \n", - " | msg(self, msg, *args)\n", - " | Print a debug message, when the debug level is > 0.\n", - " | \n", - " | If extra arguments are present, they are substituted in the\n", - " | message using the standard string formatting operator.\n", - " | \n", - " | mt_interact(self)\n", - " | Multithreaded version of interact().\n", - " | \n", - " | open(self, host, port=0, timeout=)\n", - " | Connect to a host.\n", - " | \n", - " | The optional second argument is the port number, which\n", - " | defaults to the standard telnet port (23).\n", - " | \n", - " | Don't try to reopen an already connected instance.\n", - " | \n", - " | process_rawq(self)\n", - " | Transfer from raw queue to cooked queue.\n", - " | \n", - " | Set self.eof when connection is closed. Don't block unless in\n", - " | the midst of an IAC sequence.\n", - " | \n", - " | rawq_getchar(self)\n", - " | Get next char from raw queue.\n", - " | \n", - " | Block if no data is immediately available. Raise EOFError\n", - " | when connection is closed.\n", - " | \n", - " | read_all(self)\n", - " | Read all data until EOF; block until connection closed.\n", - " | \n", - " | read_eager(self)\n", - " | Read readily available data.\n", - " | \n", - " | Raise EOFError if connection closed and no cooked data\n", - " | available. Return '' if no cooked data available otherwise.\n", - " | Don't block unless in the midst of an IAC sequence.\n", - " | \n", - " | read_lazy(self)\n", - " | Process and return data that's already in the queues (lazy).\n", - " | \n", - " | Raise EOFError if connection closed and no data available.\n", - " | Return '' if no cooked data available otherwise. Don't block\n", - " | unless in the midst of an IAC sequence.\n", - " | \n", - " | read_sb_data(self)\n", - " | Return any data available in the SB ... SE queue.\n", - " | \n", - " | Return '' if no SB ... SE available. Should only be called\n", - " | after seeing a SB or SE command. When a new SB command is\n", - " | found, old unread SB data will be discarded. Don't block.\n", - " | \n", - " | read_some(self)\n", - " | Read at least one byte of cooked data unless EOF is hit.\n", - " | \n", - " | Return '' if EOF is hit. Block if no data is immediately\n", - " | available.\n", - " | \n", - " | read_until(self, match, timeout=None)\n", - " | Read until a given string is encountered or until timeout.\n", - " | \n", - " | When no match is found, return whatever is available instead,\n", - " | possibly the empty string. Raise EOFError if the connection\n", - " | is closed and no cooked data is available.\n", - " | \n", - " | read_very_eager(self)\n", - " | Read everything that's possible without blocking in I/O (eager).\n", - " | \n", - " | Raise EOFError if connection closed and no cooked data\n", - " | available. Return '' if no cooked data available otherwise.\n", - " | Don't block unless in the midst of an IAC sequence.\n", - " | \n", - " | read_very_lazy(self)\n", - " | Return any data available in the cooked queue (very lazy).\n", - " | \n", - " | Raise EOFError if connection closed and no data available.\n", - " | Return '' if no cooked data available otherwise. Don't block.\n", - " | \n", - " | set_debuglevel(self, debuglevel)\n", - " | Set the debug level.\n", - " | \n", - " | The higher it is, the more debug output you get (on sys.stdout).\n", - " | \n", - " | set_option_negotiation_callback(self, callback)\n", - " | Provide a callback function called after each receipt of a telnet option.\n", - " | \n", - " | sock_avail(self)\n", - " | Test whether data is available on the socket.\n", - " | \n", - " | write(self, buffer)\n", - " | Write a string to the socket, doubling any IAC characters.\n", - " | \n", - " | Can block if the connection is blocked. May raise\n", - " | socket.error if the connection is closed.\n", - "\n", - "DATA\n", - " __all__ = ['Telnet']\n", - "\n", - "\n", - "Help on class Telnet in module telnetlib:\n", - "\n", - "class Telnet\n", - " | Telnet interface class.\n", - " | \n", - " | An instance of this class represents a connection to a telnet\n", - " | server. The instance is initially not connected; the open()\n", - " | method must be used to establish a connection. Alternatively, the\n", - " | host name and optional port number can be passed to the\n", - " | constructor, too.\n", - " | \n", - " | Don't try to reopen an already connected instance.\n", - " | \n", - " | This class has many read_*() methods. Note that some of them\n", - " | raise EOFError when the end of the connection is read, because\n", - " | they can return an empty string for other reasons. See the\n", - " | individual doc strings.\n", - " | \n", - " | read_until(expected, [timeout])\n", - " | Read until the expected string has been seen, or a timeout is\n", - " | hit (default is no timeout); may block.\n", - " | \n", - " | read_all()\n", - " | Read all data until EOF; may block.\n", - " | \n", - " | read_some()\n", - " | Read at least one byte or EOF; may block.\n", - " | \n", - " | read_very_eager()\n", - " | Read all data available already queued or on the socket,\n", - " | without blocking.\n", - " | \n", - " | read_eager()\n", - " | Read either data already queued or some data available on the\n", - " | socket, without blocking.\n", - " | \n", - " | read_lazy()\n", - " | Read all data in the raw queue (processing it first), without\n", - " | doing any socket I/O.\n", - " | \n", - " | read_very_lazy()\n", - " | Reads all data in the cooked queue, without doing any socket\n", - " | I/O.\n", - " | \n", - " | read_sb_data()\n", - " | Reads available data between SB ... SE sequence. Don't block.\n", - " | \n", - " | set_option_negotiation_callback(callback)\n", - " | Each time a telnet option is read on the input flow, this callback\n", - " | (if set) is called with the following parameters :\n", - " | callback(telnet socket, command, option)\n", - " | option will be chr(0) when there is no option.\n", - " | No other action is done afterwards by telnetlib.\n", - " | \n", - " | Methods defined here:\n", - " | \n", - " | __del__(self)\n", - " | Destructor -- close the connection.\n", - " | \n", - " | __init__(self, host=None, port=0, timeout=)\n", - " | Constructor.\n", - " | \n", - " | When called without arguments, create an unconnected instance.\n", - " | With a hostname argument, it connects the instance; port number\n", - " | and timeout are optional.\n", - " | \n", - " | close(self)\n", - " | Close the connection.\n", - " | \n", - " | expect(self, list, timeout=None)\n", - " | Read until one from a list of a regular expressions matches.\n", - " | \n", - " | The first argument is a list of regular expressions, either\n", - " | compiled (re.RegexObject instances) or uncompiled (strings).\n", - " | The optional second argument is a timeout, in seconds; default\n", - " | is no timeout.\n", - " | \n", - " | Return a tuple of three items: the index in the list of the\n", - " | first regular expression that matches; the match object\n", - " | returned; and the text read up till and including the match.\n", - " | \n", - " | If EOF is read and no text was read, raise EOFError.\n", - " | Otherwise, when nothing matches, return (-1, None, text) where\n", - " | text is the text received so far (may be the empty string if a\n", - " | timeout happened).\n", - " | \n", - " | If a regular expression ends with a greedy match (e.g. '.*')\n", - " | or if more than one expression can match the same input, the\n", - " | results are undeterministic, and may depend on the I/O timing.\n", - " | \n", - " | fileno(self)\n", - " | Return the fileno() of the socket object used internally.\n", - " | \n", - " | fill_rawq(self)\n", - " | Fill raw queue from exactly one recv() system call.\n", - " | \n", - " | Block if no data is immediately available. Set self.eof when\n", - " | connection is closed.\n", - " | \n", - " | get_socket(self)\n", - " | Return the socket object used internally.\n", - " | \n", - " | interact(self)\n", - " | Interaction function, emulates a very dumb telnet client.\n", - " | \n", - " | listener(self)\n", - " | Helper for mt_interact() -- this executes in the other thread.\n", - " | \n", - " | msg(self, msg, *args)\n", - " | Print a debug message, when the debug level is > 0.\n", - " | \n", - " | If extra arguments are present, they are substituted in the\n", - " | message using the standard string formatting operator.\n", - " | \n", - " | mt_interact(self)\n", - " | Multithreaded version of interact().\n", - " | \n", - " | open(self, host, port=0, timeout=)\n", - " | Connect to a host.\n", - " | \n", - " | The optional second argument is the port number, which\n", - " | defaults to the standard telnet port (23).\n", - " | \n", - " | Don't try to reopen an already connected instance.\n", - " | \n", - " | process_rawq(self)\n", - " | Transfer from raw queue to cooked queue.\n", - " | \n", - " | Set self.eof when connection is closed. Don't block unless in\n", - " | the midst of an IAC sequence.\n", - " | \n", - " | rawq_getchar(self)\n", - " | Get next char from raw queue.\n", - " | \n", - " | Block if no data is immediately available. Raise EOFError\n", - " | when connection is closed.\n", - " | \n", - " | read_all(self)\n", - " | Read all data until EOF; block until connection closed.\n", - " | \n", - " | read_eager(self)\n", - " | Read readily available data.\n", - " | \n", - " | Raise EOFError if connection closed and no cooked data\n", - " | available. Return '' if no cooked data available otherwise.\n", - " | Don't block unless in the midst of an IAC sequence.\n", - " | \n", - " | read_lazy(self)\n", - " | Process and return data that's already in the queues (lazy).\n", - " | \n", - " | Raise EOFError if connection closed and no data available.\n", - " | Return '' if no cooked data available otherwise. Don't block\n", - " | unless in the midst of an IAC sequence.\n", - " | \n", - " | read_sb_data(self)\n", - " | Return any data available in the SB ... SE queue.\n", - " | \n", - " | Return '' if no SB ... SE available. Should only be called\n", - " | after seeing a SB or SE command. When a new SB command is\n", - " | found, old unread SB data will be discarded. Don't block.\n", - " | \n", - " | read_some(self)\n", - " | Read at least one byte of cooked data unless EOF is hit.\n", - " | \n", - " | Return '' if EOF is hit. Block if no data is immediately\n", - " | available.\n", - " | \n", - " | read_until(self, match, timeout=None)\n", - " | Read until a given string is encountered or until timeout.\n", - " | \n", - " | When no match is found, return whatever is available instead,\n", - " | possibly the empty string. Raise EOFError if the connection\n", - " | is closed and no cooked data is available.\n", - " | \n", - " | read_very_eager(self)\n", - " | Read everything that's possible without blocking in I/O (eager).\n", - " | \n", - " | Raise EOFError if connection closed and no cooked data\n", - " | available. Return '' if no cooked data available otherwise.\n", - " | Don't block unless in the midst of an IAC sequence.\n", - " | \n", - " | read_very_lazy(self)\n", - " | Return any data available in the cooked queue (very lazy).\n", - " | \n", - " | Raise EOFError if connection closed and no data available.\n", - " | Return '' if no cooked data available otherwise. Don't block.\n", - " | \n", - " | set_debuglevel(self, debuglevel)\n", - " | Set the debug level.\n", - " | \n", - " | The higher it is, the more debug output you get (on sys.stdout).\n", - " | \n", - " | set_option_negotiation_callback(self, callback)\n", - " | Provide a callback function called after each receipt of a telnet option.\n", - " | \n", - " | sock_avail(self)\n", - " | Test whether data is available on the socket.\n", - " | \n", - " | write(self, buffer)\n", - " | Write a string to the socket, doubling any IAC characters.\n", - " | \n", - " | Can block if the connection is blocked. May raise\n", - " | socket.error if the connection is closed.\n", - "\n" - ] - } - ], + "execution_count": null, + "id": "d77c08d9", + "metadata": {}, + "outputs": [], "source": [ "# We can even import single classes\n", "# from a module, like\n", - "from telnetlib import Telnet\n", + "from telnetlib import Telnet\n" + ] + }, + { + "cell_type": "markdown", + "id": "e31af69a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", "\n", - "# And read the module or class docs\n", - "help(telnetlib)\n", - "help(Telnet)\n" + "Modules contain documentation in the form of docstrings,\n", + "that jupyter presents in scrollable boxes." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, + "id": "fbd25497", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Read the module documentation...\n", + "help(telnetlib)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa42e358", + "metadata": {}, + "outputs": [], + "source": [ + "# ...or the class documentation\n", + "help(Telnet)\n" + ] + }, + { + "cell_type": "markdown", + "id": "664bdf8d", "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello world!\n", - "Hello World!\n", - "Ciao\n" - ] + "slideshow": { + "slide_type": "slide" } - ], + }, "source": [ - "# you can print with the print() function\n", - "print(\"Hello world!\")\n", + "---\n", "\n", + "## Basic functions\n", + "\n", + "There are basic functions for printing and\n", + "managing variables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a64153cf", + "metadata": {}, + "outputs": [], + "source": [ + "# you can print with the print() function\n", + "print(\"Hello world!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ac21495", + "metadata": {}, + "outputs": [], + "source": [ "# concatenate string with a + sign\n", "# and using hex notation\n", - "print(\"Hello\" + \" \" + \"World\\x21\")\n", - "\n", + "print(\"Hello\" + \" \" + \"World\\x21\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58240301", + "metadata": {}, + "outputs": [], + "source": [ "print(\"Ciao\")" ] }, { "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HelloHelloWorld\\x21\n" - ] - } - ], + "execution_count": null, + "id": "8cada63b", + "metadata": {}, + "outputs": [], "source": [ "# prefixing a string with 'r' disables the\n", "# interpretation of the string content\n", "print('Hello' * 2 + r'World\\x21')" ] }, + { + "cell_type": "markdown", + "id": "61946ce4", + "metadata": {}, + "source": [ + "----" + ] + }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HelloHelloWorld\\x21\n", - "Hello\n", - "\tWorld!\n" - ] - } - ], + "execution_count": null, + "id": "f2a83ec6", + "metadata": {}, + "outputs": [], "source": [ "# the chr() function returns the corresponding\n", "# character of an integer. While \\n and \\t are\n", @@ -616,22 +208,10 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The answer is\n", - "\n", - "42\n", - "\n" - ] - } - ], + "execution_count": null, + "id": "8605dc4b", + "metadata": {}, + "outputs": [], "source": [ "# triple-quoting allows multi-line strings\n", "# %s works like in the C printf() function\n", @@ -645,220 +225,567 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "285b177a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Basic Arithmetic" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "id": "a09910f2", + "metadata": {}, "outputs": [], "source": [ "# This is a comment, while\n", "a = 1 # is an integer variable\n", - "b = 0x10 # is another integer in hex notation\n", + "b = 0x10 # is another integer in hex notation" + ] + }, + { + "cell_type": "markdown", + "id": "5cbf6d75", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd3ad7c6", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: use the print() function to print the value of a and b.\n" + ] + }, + { + "cell_type": "markdown", + "id": "046b572c", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ed0089a4", + "metadata": {}, + "outputs": [], + "source": [ "# c = 011 # ...another one in C-style oct on python 2...\n", - "c = 0o11 # ...in python 2 and 3\n" + "c = 0o11 # ...in python 2 and 3" + ] + }, + { + "cell_type": "markdown", + "id": "e5d8ee5d", + "metadata": {}, + "source": [ + "----" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "id": "e5dfddca", + "metadata": {}, "outputs": [], "source": [ - "\n", "# I can sum, multiply, and modulus\n", - "print(a + b, 5 % 2)\n", - "print(2 * c)\n" + "print(a + b, 5 % 2)" ] }, { "cell_type": "markdown", + "id": "754385fb", "metadata": {}, "source": [ - "## Variable assignment" + "----" ] }, { "cell_type": "code", "execution_count": null, + "id": "2c7440a8", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: which is the expected value of 2 * c?\n", + "print(2 * c)" + ] + }, + { + "cell_type": "markdown", + "id": "e3efa402", "metadata": { - "collapsed": false + "slideshow": { + "slide_type": "slide" + } }, + "source": [ + "---\n", + "\n", + "## Variable assignment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a346a079", + "metadata": {}, "outputs": [], "source": [ "# variable_assignment\n", "# I can assign more than one variable on the same line\n", "a, b, c = 1, 2, 3\n", - "d, stringa_a, stringa_b = a + b, \"pippo\", \"pluto\"\n", + "d, string_a, string_b = a + b, \"foo\", \"bar\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b9330033", + "metadata": {}, + "outputs": [], + "source": [ "\n", "# ...swap them...\n", - "(a, b) = (b, a) \n", - "\n", - "\n" + "(a, b) = (b, a) " ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "id": "49b4e765", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: print the values of the above variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21140751", + "metadata": {}, "outputs": [], "source": [ "# but if right-side values are not defined, I get an exception\n", - "e, f = c, e + d \n" + "e, f = c, e + d " + ] + }, + { + "cell_type": "markdown", + "id": "c6cbe9b6", + "metadata": {}, + "source": [ + "----" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "id": "52d1ad07", + "metadata": {}, "outputs": [], "source": [ - "# We should respect reserved words and functions, like print, ord...\n", - "print((\"ord:\\x20\", ord))\n", - "ord = 4\n" + "# The function ord() returns the integer value of a character.\n", + "ord('*')" ] }, { "cell_type": "code", "execution_count": null, + "id": "cdea0001", + "metadata": {}, + "outputs": [], + "source": [ + "# The function chr() returns the character corresponding to an integer.\n", + "ord(\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "9b3e5f28", "metadata": { - "collapsed": false + "slideshow": { + "slide_type": "slide" + } }, + "source": [ + "---\n", + "\n", + "#### Bonus topic: reserved words\n", + "\n", + "Python has a set of reserved words that cannot be used as variable names, including:\n", + "\n", + "- `if, else, for, while, and, or, not, in, is, break, continue, pass, def, class, return, try, except, finally, lambda`.\n", + "\n", + "Sadly, some core, built-in function names in python 2 can be used as variable names, including:\n", + "\n", + "- `file, print, len, type, list, exit`.\n", + "\n", + "This means that a programmer can accidentally overwrite the built-in function with a variable of the same name, causing unexpected results.\n", + "\n", + "Now we will see an example of this, and how to fix it using the built-in module." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf1017d4", + "metadata": {}, "outputs": [], "source": [ - "ord('*') # ...ooops!\n" + "# We should respect reserved words and built-in functions, like print, ord...\n", + "print((\"ord:\\x20\", ord))\n" + ] + }, + { + "cell_type": "markdown", + "id": "ffdbd1f6", + "metadata": {}, + "source": [ + "----" ] }, { "cell_type": "code", "execution_count": null, + "id": "b8ae6385", + "metadata": {}, + "outputs": [], + "source": [ + "# We can discover the original module of an object with\n", + "print(ord.__module__)" + ] + }, + { + "cell_type": "markdown", + "id": "a4559354", "metadata": { - "collapsed": false + "slideshow": { + "slide_type": "subslide" + } }, - "outputs": [], "source": [ - "del ord # fix it up!\n", - "ord('*') # ...ooops!\n" + "----\n", + "\n", + "Note:\n", + "\n", + "- python 2 uses the `__builtin__` module, while\n", + "- python 3 uses the `builtins` module.\n", + "\n", + "In both cases, you should never use the `__builtins__` module (note the final **s**), because it's implementation dependent.\n", + "For further information on this topic, see [the python execution model documentation](https://docs.python.org/3/reference/executionmodel.html#builtins-and-restricted-execution)" ] }, { "cell_type": "markdown", + "id": "f8334a59", "metadata": {}, "source": [ - "## Formatting numbers" + "----" ] }, { "cell_type": "code", "execution_count": null, + "id": "d5e99280", + "metadata": {}, + "outputs": [], + "source": [ + "# If we override a function and call it...\n", + "ord = 4\n", + "ord('*') # ...ooops!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e5abbfa", + "metadata": {}, + "outputs": [], + "source": [ + "# We can fix it up importing the version specific built-in module\n", + "# and reassigning the variable to the original function\n", + "\n", + "try: # Try the python 2 syntax...\n", + " import __builtin__ as builtins \n", + "except ImportError: # And if it fails, use the python 3 syntax.\n", + " import builtins\n", + "\n", + "ord = builtins.ord\n", + "ord('*') # ...ooops!" + ] + }, + { + "cell_type": "markdown", + "id": "770719ea", "metadata": { - "collapsed": false + "slideshow": { + "slide_type": "slide" + } }, + "source": [ + "---\n", + "\n", + "## Formatting numbers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "511bfa01", + "metadata": {}, "outputs": [], "source": [ - "## def formatting_numbers():\n", "# bin() and hex() returns a string representation\n", "# of a number\n", - "a, b1 = hex(10), bin(1)\n", - "\n" + "a, b1 = hex(10), bin(1)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "id": "b3a81ab5", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: which is the type of a? And the type of b1?\n", + "type(a)" + ] + }, + { + "cell_type": "markdown", + "id": "b7dc2cba", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "898a52d4", + "metadata": {}, "outputs": [], "source": [ "# while the format() function can be more flexible\n", "# 10 = 8ciphers + 2chars for the '0b' header\n", - "binary_with_leading_zeroes = format(1, '#010b') \n", - "\n", + "binary_with_leading_zeroes = format(1, '#010b') " + ] + }, + { + "cell_type": "markdown", + "id": "210930e9", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "148f2d6b", + "metadata": {}, + "outputs": [], + "source": [ "# and reversible with\n", - "b1 == int(binary_with_leading_zeroes, base=2)\n" + "b1 == int(binary_with_leading_zeroes, base=2)" ] }, { "cell_type": "markdown", + "id": "3e6f0310", "metadata": {}, "source": [ - "## Formatting" + "----" ] }, { "cell_type": "code", "execution_count": null, + "id": "92a41808", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: use this cell to inspect the values of the above variables." + ] + }, + { + "cell_type": "markdown", + "id": "0f7cabad", "metadata": { - "collapsed": false + "slideshow": { + "slide_type": "slide" + } }, + "source": [ + "---\n", + "\n", + "## Formatting" + ] + }, + { + "cell_type": "markdown", + "id": "0cfdc5f6", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d7c22eb8", + "metadata": {}, "outputs": [], "source": [ - "#def new_formatting():\n", "# The new str.format function just replaces\n", - "# %s or %d with {}.\n", + "# %s and %d with {}.\n", "s_a = \"is a string \"\n", - "s_a += \"that can {} extended\".format(\"be\")\n", - "\n" + "\n", + "print(s_a)" + ] + }, + { + "cell_type": "markdown", + "id": "35368584", + "metadata": {}, + "source": [ + "----" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "id": "785e280a", + "metadata": {}, + "outputs": [], + "source": [ + "# A string\n", + "s_a += \"that can {} extended\".format(\"be\")" + ] + }, + { + "cell_type": "markdown", + "id": "684f795f", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f64944a", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: print the value of s_a" + ] + }, + { + "cell_type": "markdown", + "id": "d174e70e", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92136fbd", + "metadata": {}, "outputs": [], "source": [ "# Further formatting is done using \":\", eg.\n", "# %.6s -> {:.6}\n", "# %3.2d -> {:3.2}\n", - "s_a = \"{} even with {:.6} formatting.\\n\".format(s_a, \"positional\")\n", - "\n" + "s_a = \"{} even with {:.6} formatting.\\n\".format(s_a, \"positional\")" + ] + }, + { + "cell_type": "markdown", + "id": "564fc26d", + "metadata": {}, + "source": [ + "----" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "id": "98311c2e", + "metadata": {}, "outputs": [], "source": [ "# Alignment identifiers are simpler: < left , ^ center, > right\n", "s_a = \"Align {:>10}% python!\".format(100)\n", "print(s_a)\n", - "print(\"just prints a string\")\n" + "print(\"just prints a string\")" ] }, { "cell_type": "markdown", + "id": "325417f1", "metadata": {}, "source": [ - "### Formatting with names" + "----" ] }, { "cell_type": "code", "execution_count": null, + "id": "ef9e7be3", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: modify s_a to align the string to the left and to the center." + ] + }, + { + "cell_type": "markdown", + "id": "a0e37bbc", "metadata": { - "collapsed": false + "slideshow": { + "slide_type": "slide" + } }, + "source": [ + "---\n", + "\n", + "### Formatting with names" + ] + }, + { + "cell_type": "markdown", + "id": "cfb3c7e5", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b94757a", + "metadata": {}, "outputs": [], "source": [ - "# you can name variables to get\n", + "# You can name variables to get\n", "# a better formatting experience ;)\n", "fmt_a = \"{name:<.3} {nick:^.8} {sn:>30}\"\n", "print(fmt_a.format(name=\"-\"*10, nick=\"*\"*15, sn=\"-\"*40))\n", @@ -866,34 +793,41 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [] + "cell_type": "markdown", + "id": "e716d4f1", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "markdown", + "id": "a3baaf45", + "metadata": {}, + "source": [ + "----" + ] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.9.9" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 5 } diff --git a/python-basic/notebooks/01_intro.ipynb b/python-basic/notebooks/01_intro.ipynb index 133c4c6..0ebbff3 100644 --- a/python-basic/notebooks/01_intro.ipynb +++ b/python-basic/notebooks/01_intro.ipynb @@ -2,21 +2,21 @@ "cells": [ { "cell_type": "markdown", + "id": "619e51ea", "metadata": {}, "source": [ "# Python for System Administrators\n", "\n", "Introductory Lesson 2\n", - " - Roberto Polli - roberto.polli@par-tec.it\n", - " " + "\n", + "- Roberto Polli - " ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "id": "3c5b7924", + "metadata": {}, "outputs": [], "source": [ "# before starting this lesson\n", @@ -24,11 +24,18 @@ "# using the following statement\n", "# NB since now you *must* always use\n", "# parenthesis with print!\n", - "from __future__ import print_function, unicode_literals, division" + "from __future__ import print_function, unicode_literals, division\n", + "import sys\n", + "\n", + "# Import further python3 features.\n", + "if sys.version_info.major < 3:\n", + " from future_builtins import *\n", + " import __builtin__ as builtins" ] }, { "cell_type": "markdown", + "id": "8d1e8d28", "metadata": {}, "source": [ "## Introducing Lists" @@ -37,14 +44,22 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "id": "1a4b92cd", + "metadata": {}, "outputs": [], "source": [ - "##def introducing_lists():\n", "# it's easy to create a list\n", - "list_a = ['this', 'is', 'a', 'list']\n", + "list_a = ['this', 'is', 'a', 'list']\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8da0cd06", + "metadata": {}, + "outputs": [], + "source": [ + "\n", "# you can append items to a list\n", "# with the append method\n", "list_a.append(\"mutable\")" @@ -53,18 +68,49 @@ { "cell_type": "code", "execution_count": null, + "id": "f9e6b787", "metadata": {}, "outputs": [], "source": [ - "# check its content with print\n", - "print(list_a)\n", - "# see its length\n", + "# Print its content\n", + "print(list_a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad04ceb2", + "metadata": {}, + "outputs": [], + "source": [ + "# See its length\n", "len(list_a)" ] }, + { + "cell_type": "markdown", + "id": "2b4a5443", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "#### Lists and Generators\n", + "\n", + "In python you can create lists of subsequent numbers.\n", + "In python 2, the `range` function returns a list,\n", + "while in python 3 it returns an iterable object.\n", + "\n", + "This is to avoid memory issues when dealing with large lists." + ] + }, { "cell_type": "code", "execution_count": null, + "id": "cda4ba95", "metadata": {}, "outputs": [], "source": [ @@ -80,38 +126,84 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "id": "a93c7dbc", + "metadata": {}, "outputs": [], "source": [ "# in python 3 things are slightly different\n", - "# so the above code won't work and should\n", + "# so the above code won't work.\n", + "import sys\n", + "if sys.version_info.major < 3:\n", + " range = xrange # Override the range function with the xrange function.\n", + "from_0_to_10 = range(a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2af773e3", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: can you print the content of from_0_to_10 \n", + "print(from_0_to_10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19305ad7", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# In python 3, you need to create a list from the range object.\n", + "# The above code \n", "# should be replaced with the following\n", - "from_0_to_10 = list(range(a))" + "from_0_to_10 = list(range(a))\n", + "print(from_0_to_10)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "6b7703f5", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Getting list items" ] }, { "cell_type": "code", "execution_count": null, + "id": "2998597d", "metadata": {}, "outputs": [], "source": [ "# you can get list items by index\n", - "from_0_to_10[0]\n", + "from_0_to_10[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a797865e", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: what happens if I get the 11th element?\n", "from_0_to_10[11]" ] }, { "cell_type": "code", "execution_count": null, + "id": "bc99aebd", "metadata": {}, "outputs": [], "source": [ @@ -122,25 +214,44 @@ { "cell_type": "code", "execution_count": null, + "id": "4dc07f23", "metadata": {}, "outputs": [], "source": [ "# python lists are doubly linked ;)\n", - "from_0_to_10[-1]\n", - "# please check the manual!\n", - "#help(list)" + "from_0_to_10[-1]\n" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, + "id": "8377f72c", "metadata": {}, + "outputs": [], "source": [ + "\n", + "# Exercise: please check the manual!\n", + "help(list)" + ] + }, + { + "cell_type": "markdown", + "id": "03e95ce1", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", "## Slicing a list" ] }, { "cell_type": "code", "execution_count": null, + "id": "fc53f651", "metadata": {}, "outputs": [], "source": [ @@ -151,6 +262,7 @@ { "cell_type": "code", "execution_count": null, + "id": "ffbd2dd7", "metadata": {}, "outputs": [], "source": [ @@ -161,6 +273,7 @@ { "cell_type": "code", "execution_count": null, + "id": "a42544a9", "metadata": {}, "outputs": [], "source": [ @@ -171,6 +284,7 @@ { "cell_type": "code", "execution_count": null, + "id": "70d1d5a6", "metadata": {}, "outputs": [], "source": [ @@ -180,6 +294,7 @@ { "cell_type": "code", "execution_count": null, + "id": "169c8e6f", "metadata": {}, "outputs": [], "source": [ @@ -188,19 +303,37 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "d3329033", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Strings and Lists" ] }, { "cell_type": "code", "execution_count": null, + "id": "5f584b60", "metadata": {}, "outputs": [], "source": [ "# Strings behaves like lists\n", - "s_a = \"Counting: 123\"\n", + "s_a = \"Counting: 123\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfde77ee", + "metadata": {}, + "outputs": [], + "source": [ + "\n", "# Have length..\n", "l_a = len(s_a)\n", "print(l_a)" @@ -209,11 +342,21 @@ { "cell_type": "code", "execution_count": null, + "id": "cb639382", "metadata": {}, "outputs": [], "source": [ "# ..indexes\n", - "print(s_a[0], \" \", s_a[-1])\n", + "print(s_a[0], \" \", s_a[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "275377e8", + "metadata": {}, + "outputs": [], + "source": [ "# and a last element\n", "s_a[l_a] # ...what's happening there?" ] @@ -221,6 +364,7 @@ { "cell_type": "code", "execution_count": null, + "id": "79a5577e", "metadata": {}, "outputs": [], "source": [ @@ -232,20 +376,35 @@ { "cell_type": "code", "execution_count": null, + "id": "d5f2fa62", + "metadata": {}, + "outputs": [], + "source": [ + "# Note: use the os.path module for path manipulation.\n", + "# The above code will break with 4-letter extensions!\n", + "from os.path import splitext\n", + "splitext(\"prova.foo.yaml\")" + ] + }, + { + "cell_type": "markdown", + "id": "189cffa7", "metadata": { - "collapsed": true + "slideshow": { + "slide_type": "slide" + } }, - "outputs": [], "source": [ + "---\n", + "\n", "## Iterations: for" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "id": "03c67c08", + "metadata": {}, "outputs": [], "source": [ "a_list = ['is', 'iterable', 'with']\n", @@ -256,13 +415,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "id": "6cd0419b", + "metadata": {}, "outputs": [], "source": [ "for x in a_list:\n", - " # python2 does not support the `end` argument\n", + " # You need `from __future__ import print_function`\n", + " # for python2 to support the `end` argument\n", " print((x), end=' ')\n", " y = x + str(2)\n", " break # stop now" @@ -271,9 +430,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "id": "30a8ab44", + "metadata": {}, "outputs": [], "source": [ "# what's the expected output of the\n", @@ -285,17 +443,23 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "6f2fb444", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "## Iterations: while" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "id": "16ebf903", + "metadata": {}, "outputs": [], "source": [ "a_list = ['is', 'iterable', 'with']\n", @@ -312,9 +476,8 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "id": "914a5a92", + "metadata": {}, "outputs": [], "source": [ "# What's the expected behavior of the\n", @@ -325,25 +488,7 @@ ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.13" - } - }, + "metadata": {}, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 5 } diff --git a/python-basic/requirements.txt b/python-basic/requirements.txt deleted file mode 100644 index 231f7eb..0000000 --- a/python-basic/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -ipython -nose -simplejson -pyzmq -markupsafe -tornado -jsonschema diff --git a/python-basic/tox.ini b/python-basic/tox.ini new file mode 100644 index 0000000..efd3230 --- /dev/null +++ b/python-basic/tox.ini @@ -0,0 +1,11 @@ +[tox] +envlist = py3 +skipsdist = True + +[testenv] +deps = + git+https://github.com/ioggstream/notedown +allowlist_externals = + make +commands = + make {posargs} diff --git a/sparql-101/01-intro-jsonld.md b/sparql-101/01-intro-jsonld.md index 107ba35..a663142 100644 --- a/sparql-101/01-intro-jsonld.md +++ b/sparql-101/01-intro-jsonld.md @@ -165,7 +165,7 @@ https://w3id.org/italia/onto/CPV dct:title     "Person Ontology"@en, ### Json-LD -JSON-LD è un formato che permette di serializzare in JSON delle informazioni basate sul +JSON-LD è un formato che permette di serializzare in JSON delle informazioni basate sul [RDF data model](https://www.w3.org/TR/json-ld11/#data-model). Un documento JSON-LD è quindi sia un documento RDF che JSON, e rappresenta un'istanza di un RDF data model. @@ -293,4 +293,3 @@ Esistono diverse ipotesi tecnologiche basate sull'elaborazione semantica dei dati a runtime. Tutte queste implementazioni devono indirizzare questo tipo di rischi. - diff --git a/sparql-101/02-sparql.md b/sparql-101/02-sparql.md index d184303..e1a4a95 100644 --- a/sparql-101/02-sparql.md +++ b/sparql-101/02-sparql.md @@ -80,7 +80,7 @@ to process complex queries. @prefix foaf: . SELECT * WHERE { - ?s foaf:knows ?o + ?s foaf:knows ?o ``` | s | o | @@ -99,8 +99,8 @@ SELECT DISTINCT ?mail1, ?mail3 WHERE { ?user1 foaf:knows ?user2 . ?user2 foaf:knows ?user3 - . ?user1 foaf:mbox ?mail1 - . ?user3 foaf:mbox ?mail3 + . ?user1 foaf:mbox ?mail1 + . ?user3 foaf:mbox ?mail3 ``` Note that the query describes each relation diff --git a/sparql-101/03-syntax-semantic.md b/sparql-101/03-syntax-semantic.md index b2cb3d9..f1909c1 100644 --- a/sparql-101/03-syntax-semantic.md +++ b/sparql-101/03-syntax-semantic.md @@ -192,7 +192,7 @@ Person: familyName: x-refersTo: https://w3id.org/italia/onto/CPV/familyName type: string - + ``` ### Ontologia per json-schema @@ -218,5 +218,5 @@ flowchart RDF--Framing--> JSON --context--> RDF CSV --csv-ld--> RDF - -``` \ No newline at end of file + +``` diff --git a/tools-101/Makefile b/tools-101/Makefile new file mode 100644 index 0000000..6cccdb2 --- /dev/null +++ b/tools-101/Makefile @@ -0,0 +1,46 @@ +# +# To run the environment, use +# +# # make course +# +# # or if you want override default value of EXTERNAL_COURSES, please use an environment variable +# # EXTERNAL_COURSES=git-101 make course +# +.PHONY: course + +MAIN_IP = $(shell ip -4 -o a s scope global | awk -F'[/ ]+' '{print $$4; exit} ') + +ifndef EXTERNAL_COURSES +EXTERNAL_COURSES = git-101 python-basic docker-101 +endif + + +course: .prepare + docker-compose scale course=1 web=2 bastion=1 + docker-compose logs course | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" + +clean: + rm *.pyc __pycache__ -fr + find notebooks -name '*_removed.nbconvert.ipynb' -delete + find notebooks -name '*_removed.ipynb' -delete + find notebooks -name \*.yml -type f -exec sed -i 's/[[:space:]]*$$//' {} \; + # find notebooks -name \*.yml -type f -exec ansible-lint {} \; + find notebooks -name '*.ipynb' -exec nbstripout {} \; + # $(foreach dpath, $(EXTERNAL_COURSES), rm -f notebooks/$(dpath)/*.ipynb; ) + +clean-other: + docker-compose kill bastion web + docker-compose rm -vf bastion web + +test: + docker exec -ti ansible101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' + +dev: .prepare + docker-compose scale dev=1 web=2 bastion=1 + docker-compose logs dev | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" | sed -e "s/(sysadminpy or 127.0.0.1)/$(MAIN_IP)/g" + +.prepare: + # build all EXTERNAL_COURSES + $(foreach dpath, $(EXTERNAL_COURSES), cd ../$(dpath); ! test -f Makefile || make; ) + $(foreach dpath, $(EXTERNAL_COURSES), mkdir -p notebooks/rendered_notebooks/$(dpath); rsync -var ../$(dpath)/notebooks/ notebooks/rendered_notebooks/$(dpath); ) + cp ../python-for-sysadmin/requirements.txt . diff --git a/tools-101/docker-compose.yml b/tools-101/docker-compose.yml new file mode 100644 index 0000000..4274c93 --- /dev/null +++ b/tools-101/docker-compose.yml @@ -0,0 +1,68 @@ +# Image for developing the course +version: "2" +services: + dev: + build: + dockerfile: python27.dockerfile + context: . + hostname: sysadminpy + environment: + - USE_HTTP=1 + - PASSWORD=secret + - SHELL=/bin/bash + ports: + - 8888:8888 + volumes: + - ./notebooks:/notebooks:z + - ./notebooks/custom.css:/root/.jupyter/custom/custom.css + - .:/code:z + network_mode: bridge + entrypoint: /bin/sh + command: -c "/usr/local/bin/jupyter-notebook --ip 0.0.0.0 --allow-root" + + + test: + image: ioggstream/python-course + volumes: + - ./notebooks:/notebooks:z + # entrypoint: tail -f /etc/hosts + + + # Official image from docker hub + course: + image: ioggstream/python-course + environment: + - USE_HTTP=1 + - DOCKER_HOST=172.17.0.1 + volumes: + - ./notebooks:/notebooks:z + - ./notebooks/custom.css:/root/.jupyter/custom/custom.css + - .:/code:z + network_mode: bridge + ports: + - 8888:8888 + entrypoint: /bin/sh + command: -c "/usr/local/bin/jupyter-notebook --ip 0.0.0.0 --allow-root" + + + # Some ssh-enabled docker containers + # for student homework + bastion: + build: + context: . + dockerfile: Dockerfile.ssh + volumes: + - .:/code:z + network_mode: bridge + + + # Some ssh-enabled docker containers + # for student homework + web: + build: + context: . + dockerfile: Dockerfile.ssh + volumes: + - .:/code:z + # - ./notebooks/exercise-01/id_ansible.pub:/root/.ssh/authorized_keys:z + network_mode: bridge diff --git a/tools-101/intro.md b/tools-101/intro.md new file mode 100644 index 0000000..95f0498 --- /dev/null +++ b/tools-101/intro.md @@ -0,0 +1,192 @@ + +# Devops Tools 101 + +This is a course on the tools you will need to work using the devops methodology. + +The course is based on an hands-on approach, so you will need to do the exercises +and execute the commands on the course environment. + +We will start presenting the course environment, then we will go through the tools: + +Docker, Git and Python. + + +--- + +# Jupyter + +Is the course environment in your browser. +It requires a modern browser and an internet connection supporting +websockets. If your proxy does not support websockets, you will not be able to +execute the code. + +While you might find the exercises' solutions in the environment, +it is important for you to spend some time trying to do your homework! +This will help you to remember the concepts and to learn how to use the tools. + +--- + +## What can I do with Jupyter? + +You can: + +- [open a (named) terminal on the local machine](/terminals/example) +- [edit an existing file](/edit/notebooks/untitled.txt) +- add more cells with `ALT+ENTER` + +---- + +Try to add a cell below this one and write some text in it. + +```python +# Add a new python cell with ALT+ENTER. +``` + +--- + +## Python terminal + +With Jupyter, you have a Python terminal at your disposal. +You can run Python code: + +```python +# You can evaluate maths and strings +s = 1 +print("a string and the number " + str(s)) +``` + +Jupyter remembers the variables you define in a cell, so you can use them in the next cells. + +```python +# Evaluate this cell with SHIFT+ENTER +s = s + 1 +print("now s is increased " + str(s)) +``` + +Since Jupyter remembers the variables, you can run the cells in any order you want. +This means that sometimes, you need to "reset" the environment, to start from scratch. + +This can be done with the "Kernel > Restart" or "Kernel > Restart & Clear output" menu. + +---- + +To run simple, non interactive bash commands in a python cell, prefix them with `!`. +When you run a cell, the output is displayed below the cell. + +```python +! ls -l +``` + +---- + +Another way to run bash commands is to use the `%%bash` magic keyword. + +```python +%%bash +A=1 +echo $A +``` + +---- + + + +During the course, you will need to execute some shell code, that is rendered like the following + +```bash +# Don't execute this non-interactive cell. +echo "What is your name?" +read name +echo "Hello $name!" +``` + +In these cases, you need to [open a terminal on the local machine](/terminals/example), for example following links like [this one](/terminals/example) and type the commands there. This is especially required for interactive tasks. + + + + +#### Exercises + +Exercise solutions are folded. You can show them clicking on the `+` sign. + + + +```python + +``` + + +# Don't do that :D just try and + +![Do your homework](http://s2.quickmeme.com/img/43/438ccdc454bc53dfe79f6190ee43b2be19bd578ad002426efcf90f7a327cedd1.jpg) + + +```python solution="hidden" + +``` + +--- + +# Python + +Go to the [basic python course](/tree/notebooks/rendered_notebooks/python-basic) + +--- + +# Git + +is the powerful versioning system used to distribute this course + +Go to your [git beginners course](/notebooks/notebooks/rendered_notebooks/git-101/01-git.ipynb) + +--- + +# Docker + +Docker is a lightweight container environment. Jupyter and all other "machines" are based on docker. + +[Presentation (in Italian)](https://docs.google.com/presentation/d/15swQ2gHWAKYAm_ZbBme9rmzV1CpLNl1npvgrUyODu1s/) + +Go to your [docker beginners course](/notebooks/notebooks/rendered_notebooks/docker-101/) + + +## Setup with digitalocean (if you don't have your server) + +Create and `ssh` into your docker droplet. + +![Create droplet](https://cdn.pbrd.co/images/GA8dkaJ.png) + +## Setup example + +[![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI) + +## Docker must listen on 172.17.0.1:2735 + +``` +# vim /etc/systemd/system/multi-user.target.wants/docker.service +[Service] +... +ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375 +... +#wq! + +systemctl daemon-reload +systemctl restart docker +``` + +## Clone and start + +``` +git clone https://github.com/ioggstream/python-course.git +cd python-course/ansible-101 +make course + +``` + +## Connect to jupyter + +``` +firefox http://43.32.54.212:8888/tree/notebooks/?token=.... +``` + + diff --git a/tools-101/markdown.mak b/tools-101/markdown.mak new file mode 100644 index 0000000..1642cb3 --- /dev/null +++ b/tools-101/markdown.mak @@ -0,0 +1,10 @@ +FILES=$(wildcard *.md) +BOOKS = $(patsubst %.md,notebooks/%.ipynb,$(FILES)) + + +all: $(BOOKS) + @echo $(BOOKS) + +notebooks/%.ipynb: %.md + + notedown --to notebook $^ > $@ diff --git a/tools-101/notebooks/intro.ipynb b/tools-101/notebooks/intro.ipynb new file mode 100644 index 0000000..ad2cca8 --- /dev/null +++ b/tools-101/notebooks/intro.ipynb @@ -0,0 +1,394 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "df9f8c5f", + "metadata": {}, + "source": [ + "\n", + "# Devops Tools 101\n", + "\n", + "This is a course on the tools you will need to work using the devops methodology.\n", + "\n", + "The course is based on an hands-on approach, so you will need to do the exercises\n", + "and execute the commands on the course environment.\n", + "\n", + "We will start presenting the course environment, then we will go through the tools:\n", + "\n", + "Docker, Git and Python.\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "489b4546", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "# Jupyter\n", + "\n", + "Is the course environment in your browser.\n", + "It requires a modern browser and an internet connection supporting\n", + "websockets. If your proxy does not support websockets, you will not be able to\n", + "execute the code.\n", + "\n", + "While you might find the exercises' solutions in the environment,\n", + "it is important for you to spend some time trying to do your homework!\n", + "This will help you to remember the concepts and to learn how to use the tools." + ] + }, + { + "cell_type": "markdown", + "id": "f0836235", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## What can I do with Jupyter?\n", + "\n", + "You can:\n", + "\n", + "- [open a (named) terminal on the local machine](/terminals/example)\n", + "- [edit an existing file](/edit/notebooks/untitled.txt)\n", + "- add more cells with `ALT+ENTER`" + ] + }, + { + "cell_type": "markdown", + "id": "34704de7", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Try to add a cell below this one and write some text in it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ed7f0a1", + "metadata": {}, + "outputs": [], + "source": [ + "# Add a new python cell with ALT+ENTER." + ] + }, + { + "cell_type": "markdown", + "id": "f45a9532", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Python terminal\n", + "\n", + "With Jupyter, you have a Python terminal at your disposal.\n", + "You can run Python code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b453a359", + "metadata": {}, + "outputs": [], + "source": [ + "# You can evaluate maths and strings\n", + "s = 1\n", + "print(\"a string and the number \" + str(s))" + ] + }, + { + "cell_type": "markdown", + "id": "dc748d01", + "metadata": {}, + "source": [ + "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8aa80a69", + "metadata": {}, + "outputs": [], + "source": [ + "# Evaluate this cell with SHIFT+ENTER\n", + "s = s + 1\n", + "print(\"now s is increased \" + str(s))" + ] + }, + { + "cell_type": "markdown", + "id": "3831eef1", + "metadata": {}, + "source": [ + "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", + "This means that sometimes, you need to \"reset\" the environment, to start from scratch.\n", + "\n", + "This can be done with the \"Kernel > Restart\" or \"Kernel > Restart & Clear output\" menu." + ] + }, + { + "cell_type": "markdown", + "id": "2a5d9914", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "To run simple, non interactive bash commands in a python cell, prefix them with `!`.\n", + "When you run a cell, the output is displayed below the cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "610fe25d", + "metadata": {}, + "outputs": [], + "source": [ + "! ls -l" + ] + }, + { + "cell_type": "markdown", + "id": "c6d34a09", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Another way to run bash commands is to use the `%%bash` magic keyword." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9271d5a6", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "A=1\n", + "echo $A" + ] + }, + { + "cell_type": "markdown", + "id": "4f2370e8", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "\n", + "\n", + "During the course, you will need to execute some shell code, that is rendered like the following" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85cecbfb", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# Don't execute this non-interactive cell.\n", + "echo \"What is your name?\"\n", + "read name\n", + "echo \"Hello $name!\"" + ] + }, + { + "cell_type": "markdown", + "id": "aca9fb9c", + "metadata": {}, + "source": [ + "In these cases, you need to [open a terminal on the local machine](/terminals/example), for example following links like [this one](/terminals/example) and type the commands there. This is especially required for interactive tasks.\n", + "\n", + "\n", + "\n", + "\n", + "#### Exercises\n", + "\n", + "Exercise solutions are folded. You can show them clicking on the `+` sign.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "90d89535", + "metadata": {}, + "source": [ + "\n", + "# Don't do that :D just try and\n", + "\n", + "![Do your homework](http://s2.quickmeme.com/img/43/438ccdc454bc53dfe79f6190ee43b2be19bd578ad002426efcf90f7a327cedd1.jpg)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "52932a94", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "# Python\n", + "\n", + "Go to the [basic python course](/tree/notebooks/rendered_notebooks/python-basic)" + ] + }, + { + "cell_type": "markdown", + "id": "48294e9d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "# Git\n", + "\n", + "is the powerful versioning system used to distribute this course\n", + "\n", + "Go to your [git beginners course](/notebooks/notebooks/rendered_notebooks/git-101/01-git.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "32a6db18", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "# Docker\n", + "\n", + "Docker is a lightweight container environment. Jupyter and all other \"machines\" are based on docker.\n", + "\n", + "[Presentation (in Italian)](https://docs.google.com/presentation/d/15swQ2gHWAKYAm_ZbBme9rmzV1CpLNl1npvgrUyODu1s/)\n", + "\n", + "Go to your [docker beginners course](/notebooks/notebooks/rendered_notebooks/docker-101/)\n", + "\n", + "\n", + "## Setup with digitalocean (if you don't have your server)\n", + "\n", + "Create and `ssh` into your docker droplet.\n", + "\n", + "![Create droplet](https://cdn.pbrd.co/images/GA8dkaJ.png)\n", + "\n", + "## Setup example\n", + "\n", + "[![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI)\n", + "\n", + "## Docker must listen on 172.17.0.1:2735" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f898e25", + "metadata": {}, + "outputs": [], + "source": [ + "# vim /etc/systemd/system/multi-user.target.wants/docker.service\n", + "[Service]\n", + "...\n", + "ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375\n", + "...\n", + "#wq!\n", + "\n", + "systemctl daemon-reload\n", + "systemctl restart docker" + ] + }, + { + "cell_type": "markdown", + "id": "6d582a04", + "metadata": {}, + "source": [ + "## Clone and start" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "814c03bf", + "metadata": {}, + "outputs": [], + "source": [ + "git clone https://github.com/ioggstream/python-course.git\n", + "cd python-course/ansible-101\n", + "make course\n" + ] + }, + { + "cell_type": "markdown", + "id": "9461e4a7", + "metadata": {}, + "source": [ + "## Connect to jupyter" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d0272cd", + "metadata": {}, + "outputs": [], + "source": [ + "firefox http://43.32.54.212:8888/tree/notebooks/?token=...." + ] + }, + { + "cell_type": "markdown", + "id": "5303d0d1", + "metadata": {}, + "source": [ + "" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools-101/python27.dockerfile b/tools-101/python27.dockerfile new file mode 100644 index 0000000..cfe2e01 --- /dev/null +++ b/tools-101/python27.dockerfile @@ -0,0 +1,39 @@ +# +# Docker image for ipython notebook and various +# python courses +# +FROM docker.io/python:2.7 +LABEL maintainer="roberto.polli@par-tec.it" + +RUN ulimit -n 1024 && apt-get -y update && apt-get -y install gcc make python-dev python-pip +RUN ulimit -n 1024 && apt-get -y update && apt-get -y install build-essential libblas-dev liblapack-dev gfortran libfreetype6-dev libpng-dev +RUN ulimit -n 1024 && apt-get -y update && apt-get -y install tree sshpass openssl +RUN ulimit -n 1024 && apt-get -y clean + +RUN apt-get -y update && apt-get -y install curl apt-transport-https +RUN wget -O/root/foo.key https://download.docker.com/linux/debian/gpg && apt-key add /root/foo.key && rm /root/foo.key +RUN echo "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" >> /etc/apt/sources.list +RUN apt-get -y update && apt-get -y install docker-ce +RUN apt-get -y clean + +RUN apt-get -y autoremove + +RUN pip2 install -U pip + +COPY requirements.txt /requirements.txt + +# install requirements for both py2 and py3 +RUN pip2 install -r /requirements.txt +RUN pip install -r /requirements.txt + +# Use folding extension +# RUN pip install jupyter_contrib_nbextensions +# RUN jupyter contrib nbextension install --user +# RUN jupyter nbextension enable codefolding/main +# RUN jupyter nbextension enable rubberband/main +# RUN jupyter nbextension enable exercise/main + +# RUN jupyter nbextension install rise --py --sys-prefix +# RUN jupyter nbextension enable rise --py --sys-prefix +USER 1000 +ENTRYPOINT /usr/local/bin/jupyter-notebook --ip 0.0.0.0 diff --git a/tools-101/requirements.txt b/tools-101/requirements.txt new file mode 100644 index 0000000..4423534 --- /dev/null +++ b/tools-101/requirements.txt @@ -0,0 +1,21 @@ +scipy +ipython +matplotlib +nose +psutil +simplejson +pyzmq +markupsafe +tornado +jsonschema +jupyter +ansible +docker-py +pyyaml + +# jupyter tools +nbstripout + +# Load jupyter extensions for exercises. +jupyter_contrib_nbextensions +RISE diff --git a/tools-101/tox.ini b/tools-101/tox.ini new file mode 100644 index 0000000..5a9d96e --- /dev/null +++ b/tools-101/tox.ini @@ -0,0 +1,11 @@ +[tox] +envlist = py3 +skipsdist = True + +[testenv] +deps = + git+https://github.com/ioggstream/notedown +allowlist_externals = + make +commands = + make -f markdown.mak From 5407e5c7dca12c89e24f52d380bee1d382d558d7 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Tue, 25 Jul 2023 16:29:30 +0200 Subject: [PATCH 25/52] Add image. (#69) --- .github/workflows/publish.yaml | 88 ++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 .github/workflows/publish.yaml diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 0000000..2fca8d3 --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,88 @@ +name: CI Test and Publish Workflow + +on: + push: + branches: [main] + paths-ignore: + - '**/*.md' + - '**/*.txt' + - 'docs/*' + # This re-includes the requirements file + # while not touching any other previously + # excluded .txt files. For more information, + # see https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet + - '!requirements.txt' + - '!requirements-dev.txt' + pull_request: + branches: [main] + paths-ignore: + - '**/*.md' + - '**/*.txt' + - 'docs/*' + - '!requirements.txt' + - '!requirements-dev.txt' +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + DOCKER_BUILDKIT: "1" + TERM: linux + +jobs: + security: + strategy: + matrix: + version: [python27] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: docker-security + uses: instrumenta/conftest-action@master + with: + files: tools-101/${{ matrix.version }}.dockerfile + policy: .dockerfile-security.rego + publish: + strategy: + matrix: + version: [python27] + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' + permissions: + contents: read + packages: write + needs: + - security + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Log in to the Github Container registry + uses: docker/login-action@v1 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Extract branch name + shell: bash + run: echo "branch=${GITHUB_REF##*/}" >> $GITHUB_OUTPUT + id: extract_branch + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v3 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + labels: | + maintainer=robipolli@gmail.com + org.opencontainers.image.source.branch=${{ steps.extract_branch.outputs.branch }} + tags: | + type=raw,value=${{ matrix.version }}-{{date 'YYYYMMDD'}}-${{github.run_number}}-{{sha}} + type=raw,value=${{ matrix.version }} + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: tools-101/ + # no-cache: true + sbom: true + ulimit: nofile=2048:2048 + file: ${{ matrix.version }}.dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file From 598ecd46aef4b09fc55e8a3e05b668dab1b292f5 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Tue, 25 Jul 2023 16:37:26 +0200 Subject: [PATCH 26/52] Add tox documentation. --- .github/workflows/publish.yaml | 8 ++++---- docker-101/tox.ini | 2 +- git-101/Makefile | 4 +++- git-101/tox.ini | 14 +++++++++++++- python-basic/tox.ini | 12 ++++++++++++ 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 2fca8d3..e65ea50 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -76,13 +76,13 @@ jobs: type=raw,value=${{ matrix.version }}-{{date 'YYYYMMDD'}}-${{github.run_number}}-{{sha}} type=raw,value=${{ matrix.version }} - name: Build and push Docker image - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v4 with: context: tools-101/ # no-cache: true - sbom: true + # sbom: true ulimit: nofile=2048:2048 - file: ${{ matrix.version }}.dockerfile + file: tools-101/${{ matrix.version }}.dockerfile push: true tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file + labels: ${{ steps.meta.outputs.labels }} diff --git a/docker-101/tox.ini b/docker-101/tox.ini index cee54b2..efd3230 100644 --- a/docker-101/tox.ini +++ b/docker-101/tox.ini @@ -8,4 +8,4 @@ deps = allowlist_externals = make commands = - make + make {posargs} diff --git a/git-101/Makefile b/git-101/Makefile index 1642cb3..64cfa07 100644 --- a/git-101/Makefile +++ b/git-101/Makefile @@ -6,5 +6,7 @@ all: $(BOOKS) @echo $(BOOKS) notebooks/%.ipynb: %.md - notedown --to notebook $^ > $@ + +run: all + jupyter notebook notebooks diff --git a/git-101/tox.ini b/git-101/tox.ini index cee54b2..01b4418 100644 --- a/git-101/tox.ini +++ b/git-101/tox.ini @@ -1,3 +1,15 @@ +# +# This file will either build or run current notebooks +# calling a Makefile. +# +# To build, run: +# +# $ tox +# +# To run the course, run: +# +# $ tox -- run +# [tox] envlist = py3 skipsdist = True @@ -8,4 +20,4 @@ deps = allowlist_externals = make commands = - make + make {posargs} diff --git a/python-basic/tox.ini b/python-basic/tox.ini index efd3230..01b4418 100644 --- a/python-basic/tox.ini +++ b/python-basic/tox.ini @@ -1,3 +1,15 @@ +# +# This file will either build or run current notebooks +# calling a Makefile. +# +# To build, run: +# +# $ tox +# +# To run the course, run: +# +# $ tox -- run +# [tox] envlist = py3 skipsdist = True From 62ac15cc7f7ae91e450a9bfb7f644f3c72988054 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Tue, 25 Jul 2023 18:06:15 +0200 Subject: [PATCH 27/52] Cleanum --- ansible-101/Makefile | 4 +- ansible-101/docker-compose.yml | 4 +- ansible-101/notebooks/00_teaser.ipynb | 10 +- ansible-101/notebooks/intro.ipynb | 273 -------------------------- ansible-101/site-digitalocean.yml | 2 +- docker-101/01-docker.md | 2 - docker-101/02-docker.md | 77 +++++--- docker-101/Makefile | 1 - docker-101/notebooks/01-docker.ipynb | 26 +-- docker-101/notebooks/02-docker.ipynb | 233 +++++++++++++--------- tools-101/Makefile | 30 +-- tools-101/docker-compose.yml | 26 +-- tools-101/intro.md | 26 ++- tools-101/markdown.mak | 1 - tools-101/notebooks/intro.ipynb | 20 +- tools-101/tox.ini | 2 +- 16 files changed, 261 insertions(+), 476 deletions(-) delete mode 100644 ansible-101/notebooks/intro.ipynb diff --git a/ansible-101/Makefile b/ansible-101/Makefile index a4d2a29..f1df5c6 100644 --- a/ansible-101/Makefile +++ b/ansible-101/Makefile @@ -11,7 +11,7 @@ MAIN_IP = $(shell ip -4 -o a s scope global | awk -F'[/ ]+' '{print $$4; exit} ') ifndef EXTERNAL_COURSES -EXTERNAL_COURSES = git-101 python-basic docker-101 +EXTERNAL_COURSES = git-101 python-basic docker-101 tools-101 endif @@ -43,4 +43,4 @@ dev: .prepare # build all EXTERNAL_COURSES $(foreach dpath, $(EXTERNAL_COURSES), cd ../$(dpath); ! test -f Makefile || make; ) $(foreach dpath, $(EXTERNAL_COURSES), mkdir -p notebooks/rendered_notebooks/$(dpath); rsync -var ../$(dpath)/notebooks/ notebooks/rendered_notebooks/$(dpath); ) - cp ../python-for-sysadmin/Dockerfile ../python-for-sysadmin/requirements.txt . + cp ../python-for-sysadmin/requirements.txt . diff --git a/ansible-101/docker-compose.yml b/ansible-101/docker-compose.yml index 14c5fdd..4c784e3 100644 --- a/ansible-101/docker-compose.yml +++ b/ansible-101/docker-compose.yml @@ -27,10 +27,12 @@ services: # Official image from docker hub course: - image: ioggstream/python-course + image: ghcr.io/ioggstream/python-course:python27 + user: root environment: - USE_HTTP=1 - DOCKER_HOST=172.17.0.1 + - SHELL=/bin/bash volumes: - ./notebooks:/notebooks:z - ./notebooks/custom.css:/root/.jupyter/custom/custom.css diff --git a/ansible-101/notebooks/00_teaser.ipynb b/ansible-101/notebooks/00_teaser.ipynb index 8341c00..d43d107 100644 --- a/ansible-101/notebooks/00_teaser.ipynb +++ b/ansible-101/notebooks/00_teaser.ipynb @@ -1,7 +1,6 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -19,7 +18,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -42,7 +40,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -73,7 +70,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -81,7 +77,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -117,7 +112,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -164,7 +158,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -192,7 +185,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -254,7 +246,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.14" + "version": "2.7.18" } }, "nbformat": 4, diff --git a/ansible-101/notebooks/intro.ipynb b/ansible-101/notebooks/intro.ipynb deleted file mode 100644 index 81dcb54..0000000 --- a/ansible-101/notebooks/intro.ipynb +++ /dev/null @@ -1,273 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "solution": "hidden" - }, - "source": [ - "# Ansible 2 done right\n", - "\n", - "Welcome to the Ansible 2 training!\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Jupyter\n", - "\n", - "is the course environment in your browser.\n", - "\n", - "It's not a way for not doing your homework ;)\n", - "\n", - "You can:\n", - "\n", - " - [open a terminal on the local machine](/terminals/example)\n", - " - [edit an existing file](/edit/notebooks/untitled.txt)\n", - " - add more cells with `ALT+ENTER`\n", - " \n", - "## Python terminal\n", - "\n", - "With Jupyter, you have a Python terminal at your disposal.\n", - "You can run Python code:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a string and the number 1\n", - "now s is increased 2\n" - ] - } - ], - "source": [ - "# You can evaluate maths and strings\n", - "s = 1\n", - "print(\"a string and the number \" + str(s))\n", - "\n", - "s = s + 1\n", - "print(\"now s is increased \" + str(s))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run simple, non interactive bash commands in a python cell, prefix them with `!`.\n", - "When you run a cell, the output is displayed below the cell.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "totale 576\n", - "-rw-rw-r--. 1 rpolli rpolli 16659 12 mag 17.10 00_teaser.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 8833 11 mag 11.38 01_architecture.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 9772 12 mag 15.25 02_delivery_layout.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 8312 15 mag 10.50 02_vaults.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 7433 15 mag 10.24 03_facts_and_variables.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 8258 6 lug 2019 04_loops_and_conditions.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 9868 22 set 2021 05_inventories.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 7306 6 lug 2019 06_bastion_and_ssh.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 14130 6 lug 2019 07_playbooks.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 5240 6 lug 2019 07_templates.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 8942 6 lug 2019 08_yaml_pitfalls.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 5892 6 lug 2019 09_roles.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 3260 6 lug 2019 10_galaxy_ok.ipynb\n", - "-rw-rw-r--. 1 rpolli rpolli 408823 22 set 2021 ansible-101.graphml\n", - "-rwxrwxr-x. 1 rpolli rpolli 263 22 set 2021 cleanup.sh\n", - "-rw-rw-r--. 1 rpolli rpolli 395 22 set 2021 custom.css\n", - "-rw-rw-r--. 1 rpolli rpolli 1718 15 mag 15.19 diagrams.md\n", - "drwxrwxr-x. 3 rpolli rpolli 142 11 mag 11.22 exercise-00\n", - "drwxrwxr-x. 2 rpolli rpolli 116 15 mag 10.48 exercise-01\n", - "drwxrwxr-x. 2 rpolli rpolli 169 11 mag 11.22 exercise-03\n", - "drwxrwxr-x. 3 rpolli rpolli 147 11 mag 11.21 exercise-05\n", - "drwxrwxr-x. 2 rpolli rpolli 129 11 mag 11.22 exercise-06\n", - "drwxrwxr-x. 2 rpolli rpolli 4096 11 mag 11.22 exercise-07\n", - "drwxrwxr-x. 3 rpolli rpolli 89 6 lug 2019 exercise-08\n", - "drwxrwxr-x. 2 rpolli rpolli 87 11 mag 11.22 exercise-09\n", - "drwxrwxr-x. 2 rpolli rpolli 67 6 lug 2019 images\n", - "-rw-rw-r--. 1 rpolli rpolli 5519 15 mag 15.31 intro.ipynb\n", - "drwxrwxr-x. 5 rpolli rpolli 59 15 mag 10.58 rendered_notebooks\n", - "-rw-rw-r--. 1 rpolli rpolli 35 22 set 2021 untitled.txt\n", - "-rw-rw-r--. 1 rpolli rpolli 163 22 set 2021 web\n" - ] - } - ], - "source": [ - "! ls -l" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "During the course, you will need to execute some shell code, that is rendered like the following\n", - "\n", - "```bash\n", - "# This is a bash cell.\n", - "echo \"What is your name?\"\n", - "read name\n", - "echo \"Hello $name!\"\n", - "```\n", - "\n", - "In these cases, you need to [open a terminal on the local machine](/terminals/example), for example following links like [this one](/terminals/example) and type the commands there. This is especially required for interactive tasks. \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Python\n", - "\n", - "Go to the [basic python course](/tree/notebooks/rendered_notebooks/python-basic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Git\n", - "\n", - "is the powerful versioning system used to distribute this course\n", - "\n", - "Go to your [git beginners course](/notebooks/notebooks/rendered_notebooks/git-101/01-git.ipynb)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Docker\n", - "\n", - "Docker is a lightweight container environment. Jupyter and all other \"machines\" are based on docker.\n", - "\n", - "[Presentation (in Italian)](https://docs.google.com/presentation/d/15swQ2gHWAKYAm_ZbBme9rmzV1CpLNl1npvgrUyODu1s/)\n", - "\n", - "Go to your [docker beginners course](/notebooks/notebooks/rendered_notebooks/docker-101/)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "solution": "hidden", - "solution_first": true - }, - "source": [ - "#### Exercises\n", - "\n", - "Exercise solutions are folded. You can show them clicking on the `+` sign.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "solution": "hidden", - "solution_first": true - }, - "source": [ - "# Don't do that :D just try and ...\n", - "![Do your homework](http://s2.quickmeme.com/img/43/438ccdc454bc53dfe79f6190ee43b2be19bd578ad002426efcf90f7a327cedd1.jpg)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "solution": "hidden" - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup with digitalocean (if you don't have your server)\n", - "\n", - "Create and `ssh` into your docker droplet.\n", - "\n", - "![Create droplet](https://cdn.pbrd.co/images/GA8dkaJ.png)\n", - "\n", - "## Setup example\n", - "\n", - "[![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI)\n", - "\n", - "\n", - "## Docker must listen on 172.17.0.1:2735\n", - "\n", - "```\n", - "# vim /etc/systemd/system/multi-user.target.wants/docker.service\n", - "[Service]\n", - "...\n", - "ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375\n", - "...\n", - "#wq!\n", - "\n", - "systemctl daemon-reload\n", - "systemctl restart docker\n", - "```\n", - "\n", - "## Clone and start\n", - "\n", - "```\n", - "git clone https://github.com/ioggstream/python-course.git\n", - "cd python-course/ansible-101\n", - "make course\n", - "\n", - "```\n", - "\n", - "## Connect to jupyter\n", - "\n", - "```\n", - "firefox http://43.32.54.212:8888/tree/notebooks/?token=....\n", - "```\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/ansible-101/site-digitalocean.yml b/ansible-101/site-digitalocean.yml index e822a2e..7dddca8 100644 --- a/ansible-101/site-digitalocean.yml +++ b/ansible-101/site-digitalocean.yml @@ -133,7 +133,7 @@ - name: Download course git: repo: https://github.com/ioggstream/python-course.git - version: master + version: main dest: /root/python-course ignore_errors: true diff --git a/docker-101/01-docker.md b/docker-101/01-docker.md index c7b6c69..bb1de6a 100644 --- a/docker-101/01-docker.md +++ b/docker-101/01-docker.md @@ -75,8 +75,6 @@ They are lightweight and consume less resources than a virtual machine. [![](https://mermaid.ink/img/pako:eNptU8lu2zAQ_RWBZ8moZctVdOilKdAeekmBHirmMJLGFhMuAjkM6lr-91JbbCcBD3qjefM4G0-sNg2ygiVJwjUJklhE96Z-RhsJTWihJmG043okHCx0LddcO1-NOHrAg3Bkj-UDKkP4akd7qIo9JM2o9ci1WJec_VBwQBd8g6v2FTo-qM1ci00LtET6ymvyi_UEL7Dg7kit0ZwFVdTNTTrfjSOupwL2QmJ5gfOtM7xN7sVIr9CVv6fvTG2AoAKHgVAbTSA0WleWX1_xVSGPgSRNDTJUMXfkfbGXhIdzlVqSfOkrL2TTR7cigyfqCQ5vHdcpTaTaKCXoA4HBab3uo0vE2-hemdDsPpr78M7tCCzFjkwXWxyNWzWuh8aP1M67NgxVDMVf195fVmOiSfkxbRohi5lCq0A0YTlPXEcRZ9SiQs6KABvcg5fEGdfnQPVdmBV-awQZywqyHmMGnsyvo64Xe-LcCwiboli4ULrwtwP9xxi1kILJihP7y4p1lq-263SzyfI83WTp5zRmR1akd7vVLrvb5Vm-2W6zcM4x-zcqfFplMcMxh5_Toxrf1vk_Byk2hw?type=png)](https://mermaid.live/edit#pako:eNptU8lu2zAQ_RWBZ8moZctVdOilKdAeekmBHirmMJLGFhMuAjkM6lr-91JbbCcBD3qjefM4G0-sNg2ygiVJwjUJklhE96Z-RhsJTWihJmG043okHCx0LddcO1-NOHrAg3Bkj-UDKkP4akd7qIo9JM2o9ci1WJec_VBwQBd8g6v2FTo-qM1ci00LtET6ymvyi_UEL7Dg7kit0ZwFVdTNTTrfjSOupwL2QmJ5gfOtM7xN7sVIr9CVv6fvTG2AoAKHgVAbTSA0WleWX1_xVSGPgSRNDTJUMXfkfbGXhIdzlVqSfOkrL2TTR7cigyfqCQ5vHdcpTaTaKCXoA4HBab3uo0vE2-hemdDsPpr78M7tCCzFjkwXWxyNWzWuh8aP1M67NgxVDMVf195fVmOiSfkxbRohi5lCq0A0YTlPXEcRZ9SiQs6KABvcg5fEGdfnQPVdmBV-awQZywqyHmMGnsyvo64Xe-LcCwiboli4ULrwtwP9xxi1kILJihP7y4p1lq-263SzyfI83WTp5zRmR1akd7vVLrvb5Vm-2W6zcM4x-zcqfFplMcMxh5_Toxrf1vk_Byk2hw) ----- - --- ## Separation of concerns diff --git a/docker-101/02-docker.md b/docker-101/02-docker.md index de238a4..0953ab6 100644 --- a/docker-101/02-docker.md +++ b/docker-101/02-docker.md @@ -21,7 +21,7 @@ At first, we will inspect this machine: the operating system, the IP address and ## Docker installation -Check docker tools. +Check that the docker tools are installed on your test environment. ```python # Docker CLI version. @@ -37,15 +37,16 @@ Check docker tools. ## Running a container -Docker comes with a catalog of possible operating systems and applications named Docker Registry. You can deploy your custom registry too. +Docker comes with a catalog of possible operating systems and applications named [Docker Registry](https://hub.docker.com). +You can deploy your custom registry too. -Let's pull and run an image +Let's pull (download) and run an image [![](https://mermaid.ink/img/pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s?type=png)](https://mermaid.live/edit#pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s) ```python # Search images from catalog -!docker search ubuntu|head +!docker search ubuntu | head ``` Download an image from the remote registry. @@ -55,18 +56,23 @@ Download an image from the remote registry. !docker pull ubuntu:22.04 ``` -Open a [terminal](/terminals/docker) and run an **interactive shell** (`--interactive`) with a terminal (`--tty`) -in a new container based on `ubuntu:22.04`. The `--rm` option removes the container when it exits. +Open a [terminal](/terminals/docker) +and run an **interactive shell** (`--interactive`) with a terminal (`--tty`) +in a new container +based on `ubuntu:22.04`. +The `--rm` option removes the container when it exits. -**NB: run the following commands in the terminal, not in the jupyter notebook** +**NB: run the following commands [in the terminal](/terminals/docker), not in the jupyter notebook** -```bash +```text docker run --rm --tty --interactive ubuntu:22.04 /bin/bash ``` -Then run the above commands to ensure that you are on another virtual hosts. +Now that you are on a "separate machine", +run the following commands in the new terminal +and ensure that you are on another "virtual host". -```bash +```text # Operating System cat /etc/issue # Linux version @@ -77,20 +83,22 @@ uname -a #### Exercise -What happens if you try to get the IP address using the following command? +Now that you are in the [container's terminal](/terminals/docker), +what happens if you try to get the IP address using the following command? -```bash +```text ip -4 -o a ``` -Can you retrieve the IP address in another way? +Can you retrieve the container's IP address in another way? **Hint: the `/proc` filesystem contains information about the system. Try to find the IP address in one of the files in `/proc`.** --- ## Dockerizing Applications -`busybox` is a lightweight Linux distribution. You can run an one-shot command in a container. +`busybox` is a lightweight Linux distribution. +You can run an one-shot command in a container. ```bash docker run busybox /bin/echo 'Hello world' @@ -139,7 +147,7 @@ docker stats # shows metrics, memory, cpu, filsystem 1. Inspect the `ansible-101_bastion_1` container. 1. Use the `--format` option to get the IP address on a [terminal](/terminals/docker). **Hint 1: you can google for the solution.** -1. Try to run the `docker inspect --format ...` command above in the jupyter notebook. +1. Try to run the above `docker inspect --format ...` command in the jupyter notebook. Does it work? If not, why? ```python @@ -156,10 +164,11 @@ docker stats # shows metrics, memory, cpu, filsystem Docker leverages a [copy-on-write filesystem](https://docs.docker.com/storage/storagedriver/). This allows Docker to instantiate containers very quickly. -Docker use to layering one container filesytem on top of another. -For example, you might create a container that is based on -a base Debian image, and then in turn create another container that is -based on the first container. +Docker layers one container filesytem on top of another. +For example, you might: + +- create a container image from a base Debian image; +- then create another container based on the first image. [![](https://mermaid.ink/img/pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA?type=png)](https://mermaid.live/edit#pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA) @@ -170,7 +179,6 @@ reuse the same filesystem layers. ---- - ## Commands for interacting with images ```text @@ -181,6 +189,7 @@ docker commit # creates image from a container. docker rmi # removes an image. docker history # list changes of an image. ``` + ---- Images are stored in a Docker registry such as [Docker Hub](https://hub.docker.com/) @@ -200,7 +209,7 @@ NB. This is similar to the snapshot feature of Virtual Machines. The Dockerfile is a text file that contains all the commands a user could call on the command line to assemble an image. -``` +```python ! cat Dockerfile ``` @@ -210,7 +219,7 @@ Docker will execute all the commands in the Dockerfile and create a new image. !docker build -t apache-example . ``` -Open the [terminal](/terminals/docker) and: +Open the [terminal](/terminals/docker-1) and: - inspect the image - run the image with @@ -221,7 +230,7 @@ docker run --rm --detach apache-example #### Exercise -Open the [terminal](/terminals/docker) and: +Open the [terminal](/terminals/docker-1) and: - check if the container is running `docker ps` - use `curl` to check if the webserver works @@ -248,10 +257,10 @@ Using Compose is basically a three-step process: 1. define your app's image with a `Dockerfile` 1. define the services that make up your app in -`docker-compose.yaml` so they can be run together in an isolated + `docker-compose.yaml` so they can be run together in an isolated environment. 1. run `docker-compose up` and Compose will start and run your - entire app. + entire app. ---- @@ -259,7 +268,13 @@ environment. docker-compose.yaml -```docker-compose +```yaml +# This is a compose file defining a simple python +# application with a redis database. +# +# Run with: +# +# docker-compose up version: '2' services: web: @@ -278,7 +293,7 @@ services: Now run docker-compose up and Compose will start and run your entire app. Docker Compose is a basic example of Infrastructure as Code. -The infrastructure setup is defined in a file and can be versioned. +The infrastructure setup is defined in a file, and can be versioned. All the changes are tracked and can be reverted. Administrators do not have to run commands on the server to setup the infrastructure. @@ -290,7 +305,7 @@ docker-compose up -d ## docker-compose example -``` +```yaml version: "2" services: web: @@ -303,7 +318,7 @@ services: ## docker-compose example -```docker-compose +```yaml version: "2" services: web1: @@ -323,7 +338,7 @@ services: ## docker-compose example -``` +```yaml version: "2" services: web1: @@ -346,7 +361,7 @@ services: ## docker-compose example -``` +```yaml version: "2" services: phpmyadmin: diff --git a/docker-101/Makefile b/docker-101/Makefile index 7d2e24f..285062d 100644 --- a/docker-101/Makefile +++ b/docker-101/Makefile @@ -7,5 +7,4 @@ all: $(BOOKS) cp Dockerfile notebooks/Dockerfile notebooks/%.ipynb: %.md - notedown --to notebook $^ > $@ diff --git a/docker-101/notebooks/01-docker.ipynb b/docker-101/notebooks/01-docker.ipynb index d2c5383..269d8d5 100644 --- a/docker-101/notebooks/01-docker.ipynb +++ b/docker-101/notebooks/01-docker.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "bd72a566", + "id": "2ad9ffcd", "metadata": {}, "source": [ "# Docker 101\n", @@ -17,7 +17,7 @@ }, { "cell_type": "markdown", - "id": "819672e8", + "id": "591cbcad", "metadata": { "slideshow": { "slide_type": "slide" @@ -38,7 +38,7 @@ }, { "cell_type": "markdown", - "id": "c8a2c20e", + "id": "db2dd42f", "metadata": { "slideshow": { "slide_type": "slide" @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "69ef6e0c", + "id": "13ba802d", "metadata": { "slideshow": { "slide_type": "slide" @@ -82,7 +82,7 @@ }, { "cell_type": "markdown", - "id": "6fbc76a7", + "id": "aae50434", "metadata": { "slideshow": { "slide_type": "slide" @@ -108,7 +108,7 @@ }, { "cell_type": "markdown", - "id": "bfae8933", + "id": "60480f6b", "metadata": { "slideshow": { "slide_type": "slide" @@ -129,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "fed50018", + "id": "8fabce9e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -143,15 +143,7 @@ }, { "cell_type": "markdown", - "id": "cd2f36a2", - "metadata": {}, - "source": [ - "----" - ] - }, - { - "cell_type": "markdown", - "id": "30d28c29", + "id": "7ffa392b", "metadata": { "slideshow": { "slide_type": "slide" @@ -177,7 +169,7 @@ }, { "cell_type": "markdown", - "id": "b1141f06", + "id": "65381401", "metadata": {}, "source": [ "---" diff --git a/docker-101/notebooks/02-docker.ipynb b/docker-101/notebooks/02-docker.ipynb index 401fd03..8081fe3 100644 --- a/docker-101/notebooks/02-docker.ipynb +++ b/docker-101/notebooks/02-docker.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "eb5b8406", + "id": "32b877fa", "metadata": {}, "source": [ "## Inspect the Docker host\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4898c92a", + "id": "54268220", "metadata": {}, "outputs": [], "source": [ @@ -24,7 +24,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ba0748fc", + "id": "c60a8f35", "metadata": {}, "outputs": [], "source": [ @@ -35,7 +35,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3bdab09c", + "id": "4afd3cf9", "metadata": {}, "outputs": [], "source": [ @@ -45,7 +45,7 @@ }, { "cell_type": "markdown", - "id": "0c69d0dd", + "id": "bd7c453a", "metadata": { "slideshow": { "slide_type": "slide" @@ -56,13 +56,13 @@ "\n", "## Docker installation\n", "\n", - "Check docker tools." + "Check that the docker tools are installed on your test environment." ] }, { "cell_type": "code", "execution_count": null, - "id": "d480e5f2", + "id": "1af1a9b8", "metadata": {}, "outputs": [], "source": [ @@ -73,7 +73,7 @@ { "cell_type": "code", "execution_count": null, - "id": "269567ae", + "id": "17246e07", "metadata": {}, "outputs": [], "source": [ @@ -83,7 +83,7 @@ }, { "cell_type": "markdown", - "id": "fe7be5d8", + "id": "75098a8c", "metadata": { "slideshow": { "slide_type": "slide" @@ -94,9 +94,10 @@ "\n", "## Running a container\n", "\n", - "Docker comes with a catalog of possible operating systems and applications named Docker Registry. You can deploy your custom registry too.\n", + "Docker comes with a catalog of possible operating systems and applications named [Docker Registry](https://hub.docker.com).\n", + "You can deploy your custom registry too.\n", "\n", - "Let's pull and run an image\n", + "Let's pull (download) and run an image\n", "\n", "[![](https://mermaid.ink/img/pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s?type=png)](https://mermaid.live/edit#pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s)" ] @@ -104,17 +105,17 @@ { "cell_type": "code", "execution_count": null, - "id": "6ca14dd5", + "id": "7f635d85", "metadata": {}, "outputs": [], "source": [ "# Search images from catalog\n", - "!docker search ubuntu|head" + "!docker search ubuntu | head" ] }, { "cell_type": "markdown", - "id": "3de53199", + "id": "76aeb81e", "metadata": {}, "source": [ "Download an image from the remote registry." @@ -123,7 +124,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0ea32a09", + "id": "face4e7d", "metadata": {}, "outputs": [], "source": [ @@ -133,42 +134,59 @@ }, { "cell_type": "markdown", - "id": "6e6ab248", + "id": "c44b981c", "metadata": {}, "source": [ - "Open a [terminal](/terminals/docker) and run an **interactive shell** (`--interactive`) with a terminal (`--tty`)\n", - "in a new container based on `ubuntu:22.04`. The `--rm` option removes the container when it exits.\n", + "Open a [terminal](/terminals/docker)\n", + "and run an **interactive shell** (`--interactive`) with a terminal (`--tty`)\n", + "in a new container\n", + "based on `ubuntu:22.04`.\n", + "The `--rm` option removes the container when it exits.\n", "\n", - "**NB: run the following commands in the terminal, not in the jupyter notebook**" + "**NB: run the following commands [in the terminal](/terminals/docker), not in the jupyter notebook**" ] }, { "cell_type": "code", "execution_count": null, - "id": "7d543fe9", - "metadata": {}, + "id": "6cf4526d", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, "outputs": [], "source": [ - "%%bash\n", "docker run --rm --tty --interactive ubuntu:22.04 /bin/bash" ] }, { "cell_type": "markdown", - "id": "336b13a3", + "id": "5b769a75", "metadata": {}, "source": [ - "Then run the above commands to ensure that you are on another virtual hosts." + "Now that you are on a \"separate machine\",\n", + "run the following commands in the new terminal\n", + "and ensure that you are on another \"virtual host\"." ] }, { "cell_type": "code", "execution_count": null, - "id": "7ac722e8", - "metadata": {}, + "id": "fd62081e", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, "outputs": [], "source": [ - "%%bash\n", "# Operating System\n", "cat /etc/issue\n", "# Linux version\n", @@ -177,7 +195,7 @@ }, { "cell_type": "markdown", - "id": "cf05b683", + "id": "c1df0552", "metadata": { "slideshow": { "slide_type": "slide" @@ -188,32 +206,39 @@ "\n", "#### Exercise\n", "\n", - "What happens if you try to get the IP address using the following command?" + "Now that you are in the [container's terminal](/terminals/docker),\n", + "what happens if you try to get the IP address using the following command?" ] }, { "cell_type": "code", "execution_count": null, - "id": "8075910d", - "metadata": {}, + "id": "46acf031", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, "outputs": [], "source": [ - "%%bash\n", "ip -4 -o a" ] }, { "cell_type": "markdown", - "id": "bb09c003", + "id": "fe22f83c", "metadata": {}, "source": [ - "Can you retrieve the IP address in another way?\n", + "Can you retrieve the container's IP address in another way?\n", "**Hint: the `/proc` filesystem contains information about the system. Try to find the IP address in one of the files in `/proc`.**" ] }, { "cell_type": "markdown", - "id": "38f7fd1b", + "id": "81fe5ef4", "metadata": { "slideshow": { "slide_type": "slide" @@ -224,13 +249,14 @@ "\n", "## Dockerizing Applications\n", "\n", - "`busybox` is a lightweight Linux distribution. You can run an one-shot command in a container." + "`busybox` is a lightweight Linux distribution.\n", + "You can run an one-shot command in a container." ] }, { "cell_type": "code", "execution_count": null, - "id": "cc56d63a", + "id": "4bda4e35", "metadata": {}, "outputs": [], "source": [ @@ -240,7 +266,7 @@ }, { "cell_type": "markdown", - "id": "e252e3ee", + "id": "c1df5f48", "metadata": { "slideshow": { "slide_type": "slide" @@ -257,7 +283,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12fb7df7", + "id": "3e1dcf41", "metadata": { "attributes": { "classes": [ @@ -282,7 +308,7 @@ }, { "cell_type": "markdown", - "id": "419f82ed", + "id": "bddf7383", "metadata": {}, "source": [ "You can inspect containers" @@ -291,7 +317,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bdaaa415", + "id": "ec0f72a2", "metadata": { "attributes": { "classes": [ @@ -314,7 +340,7 @@ }, { "cell_type": "markdown", - "id": "17e88f16", + "id": "a5ecaa5a", "metadata": {}, "source": [ "#### Exercise\n", @@ -325,7 +351,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f7eefeab", + "id": "470c41ec", "metadata": {}, "outputs": [], "source": [ @@ -334,20 +360,20 @@ }, { "cell_type": "markdown", - "id": "ad3bbc4d", + "id": "f11421d4", "metadata": {}, "source": [ "1. Inspect the `ansible-101_bastion_1` container.\n", "1. Use the `--format` option to get the IP address on a [terminal](/terminals/docker).\n", " **Hint 1: you can google for the solution.**\n", - "1. Try to run the `docker inspect --format ...` command above in the jupyter notebook.\n", + "1. Try to run the above `docker inspect --format ...` command in the jupyter notebook.\n", " Does it work? If not, why?" ] }, { "cell_type": "code", "execution_count": null, - "id": "90c84b58", + "id": "3a8321e8", "metadata": {}, "outputs": [], "source": [ @@ -356,7 +382,7 @@ }, { "cell_type": "markdown", - "id": "d0204b9a", + "id": "25c720a3", "metadata": {}, "source": [ "💬 Discuss how python treats the `{` character." @@ -364,7 +390,7 @@ }, { "cell_type": "markdown", - "id": "5a76021d", + "id": "a1e5f3e3", "metadata": { "slideshow": { "slide_type": "slide" @@ -379,10 +405,11 @@ "\n", "Docker leverages a [copy-on-write filesystem](https://docs.docker.com/storage/storagedriver/).\n", "This allows Docker to instantiate containers very quickly.\n", - "Docker use to layering one container filesytem on top of another.\n", - "For example, you might create a container that is based on\n", - "a base Debian image, and then in turn create another container that is\n", - "based on the first container.\n", + "Docker layers one container filesytem on top of another.\n", + "For example, you might:\n", + "\n", + "- create a container image from a base Debian image;\n", + "- then create another container based on the first image.\n", "\n", "[![](https://mermaid.ink/img/pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA?type=png)](https://mermaid.live/edit#pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA)\n", "\n", @@ -394,7 +421,7 @@ }, { "cell_type": "markdown", - "id": "5a4f0b77", + "id": "b055eb54", "metadata": { "slideshow": { "slide_type": "subslide" @@ -403,14 +430,13 @@ "source": [ "----\n", "\n", - "\n", "## Commands for interacting with images" ] }, { "cell_type": "code", "execution_count": null, - "id": "858ca912", + "id": "41ad9774", "metadata": { "attributes": { "classes": [ @@ -431,7 +457,7 @@ }, { "cell_type": "markdown", - "id": "9883df86", + "id": "1d3bc484", "metadata": { "slideshow": { "slide_type": "subslide" @@ -453,7 +479,7 @@ }, { "cell_type": "markdown", - "id": "d2d7cb30", + "id": "f021fe60", "metadata": { "slideshow": { "slide_type": "slide" @@ -471,7 +497,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cafb03b5", + "id": "c8a3dce3", "metadata": {}, "outputs": [], "source": [ @@ -480,7 +506,7 @@ }, { "cell_type": "markdown", - "id": "97f1b55d", + "id": "9a7f8106", "metadata": {}, "source": [ "Docker will execute all the commands in the Dockerfile and create a new image." @@ -489,7 +515,7 @@ { "cell_type": "code", "execution_count": null, - "id": "eb16a508", + "id": "15338147", "metadata": {}, "outputs": [], "source": [ @@ -498,10 +524,10 @@ }, { "cell_type": "markdown", - "id": "90a1aff7", + "id": "f0e47459", "metadata": {}, "source": [ - "Open the [terminal](/terminals/docker) and:\n", + "Open the [terminal](/terminals/docker-1) and:\n", "\n", "- inspect the image\n", "- run the image with" @@ -510,7 +536,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0faf5382", + "id": "d4e59f18", "metadata": {}, "outputs": [], "source": [ @@ -520,12 +546,12 @@ }, { "cell_type": "markdown", - "id": "ec99d74c", + "id": "a71c1980", "metadata": {}, "source": [ "#### Exercise\n", "\n", - "Open the [terminal](/terminals/docker) and:\n", + "Open the [terminal](/terminals/docker-1) and:\n", "\n", "- check if the container is running `docker ps`\n", "- use `curl` to check if the webserver works\n", @@ -536,7 +562,7 @@ }, { "cell_type": "markdown", - "id": "beca5e0c", + "id": "2fa3d10a", "metadata": { "slideshow": { "slide_type": "slide" @@ -557,7 +583,7 @@ }, { "cell_type": "markdown", - "id": "6a07e434", + "id": "31925e30", "metadata": { "slideshow": { "slide_type": "subslide" @@ -572,15 +598,15 @@ "\n", "1. define your app's image with a `Dockerfile`\n", "1. define the services that make up your app in\n", - "`docker-compose.yaml` so they can be run together in an isolated\n", + " `docker-compose.yaml` so they can be run together in an isolated\n", "environment.\n", "1. run `docker-compose up` and Compose will start and run your\n", - " entire app." + " entire app." ] }, { "cell_type": "markdown", - "id": "b1d11fd0", + "id": "7f610ccc", "metadata": { "slideshow": { "slide_type": "subslide" @@ -597,17 +623,23 @@ { "cell_type": "code", "execution_count": null, - "id": "052b3886", + "id": "42d511dc", "metadata": { "attributes": { "classes": [ - "docker-compose" + "yaml" ], "id": "" } }, "outputs": [], "source": [ + "# This is a compose file defining a simple python\n", + "# application with a redis database.\n", + "#\n", + "# Run with:\n", + "#\n", + "# docker-compose up\n", "version: '2'\n", "services:\n", " web:\n", @@ -625,13 +657,13 @@ }, { "cell_type": "markdown", - "id": "3a6a7da0", + "id": "54d398d7", "metadata": {}, "source": [ "Now run docker-compose up and Compose will start and run your entire app.\n", "\n", "Docker Compose is a basic example of Infrastructure as Code.\n", - "The infrastructure setup is defined in a file and can be versioned.\n", + "The infrastructure setup is defined in a file, and can be versioned.\n", "All the changes are tracked and can be reverted.\n", "Administrators do not have to run commands on the server to setup the infrastructure." ] @@ -639,7 +671,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a042f1ae", + "id": "78f04cb5", "metadata": {}, "outputs": [], "source": [ @@ -649,7 +681,7 @@ }, { "cell_type": "markdown", - "id": "87bcbac1", + "id": "15958e0b", "metadata": { "slideshow": { "slide_type": "slide" @@ -664,8 +696,15 @@ { "cell_type": "code", "execution_count": null, - "id": "fa756444", - "metadata": {}, + "id": "e6aa6bce", + "metadata": { + "attributes": { + "classes": [ + "yaml" + ], + "id": "" + } + }, "outputs": [], "source": [ "version: \"2\"\n", @@ -678,7 +717,7 @@ }, { "cell_type": "markdown", - "id": "b80ee452", + "id": "db9bb858", "metadata": { "slideshow": { "slide_type": "subslide" @@ -693,11 +732,11 @@ { "cell_type": "code", "execution_count": null, - "id": "4e9e3bf9", + "id": "81ecd31a", "metadata": { "attributes": { "classes": [ - "docker-compose" + "yaml" ], "id": "" } @@ -721,7 +760,7 @@ }, { "cell_type": "markdown", - "id": "9787fa9a", + "id": "1839a534", "metadata": { "slideshow": { "slide_type": "subslide" @@ -736,8 +775,15 @@ { "cell_type": "code", "execution_count": null, - "id": "dce3e371", - "metadata": {}, + "id": "3fdce95f", + "metadata": { + "attributes": { + "classes": [ + "yaml" + ], + "id": "" + } + }, "outputs": [], "source": [ "version: \"2\"\n", @@ -760,7 +806,7 @@ }, { "cell_type": "markdown", - "id": "c14d280d", + "id": "a2835582", "metadata": { "slideshow": { "slide_type": "subslide" @@ -775,8 +821,15 @@ { "cell_type": "code", "execution_count": null, - "id": "1eefc329", - "metadata": {}, + "id": "161cacf3", + "metadata": { + "attributes": { + "classes": [ + "yaml" + ], + "id": "" + } + }, "outputs": [], "source": [ "version: \"2\"\n", @@ -795,7 +848,7 @@ }, { "cell_type": "markdown", - "id": "6fd5c054", + "id": "ef403254", "metadata": { "slideshow": { "slide_type": "slide" @@ -810,7 +863,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e118edc5", + "id": "e082a995", "metadata": {}, "outputs": [], "source": [ @@ -819,7 +872,7 @@ }, { "cell_type": "markdown", - "id": "628ca78e", + "id": "3f929045", "metadata": {}, "source": [ "---" diff --git a/tools-101/Makefile b/tools-101/Makefile index 6cccdb2..aba17c8 100644 --- a/tools-101/Makefile +++ b/tools-101/Makefile @@ -16,8 +16,6 @@ endif course: .prepare - docker-compose scale course=1 web=2 bastion=1 - docker-compose logs course | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" clean: rm *.pyc __pycache__ -fr @@ -27,20 +25,24 @@ clean: # find notebooks -name \*.yml -type f -exec ansible-lint {} \; find notebooks -name '*.ipynb' -exec nbstripout {} \; # $(foreach dpath, $(EXTERNAL_COURSES), rm -f notebooks/$(dpath)/*.ipynb; ) - -clean-other: - docker-compose kill bastion web - docker-compose rm -vf bastion web - -test: - docker exec -ti ansible101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' - -dev: .prepare - docker-compose scale dev=1 web=2 bastion=1 - docker-compose logs dev | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" | sed -e "s/(sysadminpy or 127.0.0.1)/$(MAIN_IP)/g" - + +# clean-other: +# docker-compose kill bastion web +# docker-compose rm -vf bastion web +# +# test: +# docker exec -ti tools101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' +# +# dev: .prepare +# docker-compose scale dev=1 +# docker-compose logs dev | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" | sed -e "s/(sysadminpy or 127.0.0.1)/$(MAIN_IP)/g" +# .prepare: # build all EXTERNAL_COURSES $(foreach dpath, $(EXTERNAL_COURSES), cd ../$(dpath); ! test -f Makefile || make; ) $(foreach dpath, $(EXTERNAL_COURSES), mkdir -p notebooks/rendered_notebooks/$(dpath); rsync -var ../$(dpath)/notebooks/ notebooks/rendered_notebooks/$(dpath); ) cp ../python-for-sysadmin/requirements.txt . + make -f markdown.mak + +run: course + jupyter notebook notebooks \ No newline at end of file diff --git a/tools-101/docker-compose.yml b/tools-101/docker-compose.yml index 4274c93..6c22c88 100644 --- a/tools-101/docker-compose.yml +++ b/tools-101/docker-compose.yml @@ -22,7 +22,7 @@ services: test: - image: ioggstream/python-course + image: ghcr.io/ioggstream/python-course:python27 volumes: - ./notebooks:/notebooks:z # entrypoint: tail -f /etc/hosts @@ -30,7 +30,8 @@ services: # Official image from docker hub course: - image: ioggstream/python-course + image: ghcr.io/ioggstream/python-course:python27 + user: root environment: - USE_HTTP=1 - DOCKER_HOST=172.17.0.1 @@ -45,24 +46,3 @@ services: command: -c "/usr/local/bin/jupyter-notebook --ip 0.0.0.0 --allow-root" - # Some ssh-enabled docker containers - # for student homework - bastion: - build: - context: . - dockerfile: Dockerfile.ssh - volumes: - - .:/code:z - network_mode: bridge - - - # Some ssh-enabled docker containers - # for student homework - web: - build: - context: . - dockerfile: Dockerfile.ssh - volumes: - - .:/code:z - # - ./notebooks/exercise-01/id_ansible.pub:/root/.ssh/authorized_keys:z - network_mode: bridge diff --git a/tools-101/intro.md b/tools-101/intro.md index 95f0498..8eddc90 100644 --- a/tools-101/intro.md +++ b/tools-101/intro.md @@ -20,6 +20,8 @@ It requires a modern browser and an internet connection supporting websockets. If your proxy does not support websockets, you will not be able to execute the code. +---- + While you might find the exercises' solutions in the environment, it is important for you to spend some time trying to do your homework! This will help you to remember the concepts and to learn how to use the tools. @@ -32,6 +34,10 @@ You can: - [open a (named) terminal on the local machine](/terminals/example) - [edit an existing file](/edit/notebooks/untitled.txt) +- execute the next cell with `SHIFT+ENTER` (try it now!) + +--- + - add more cells with `ALT+ENTER` ---- @@ -70,7 +76,7 @@ This can be done with the "Kernel > Restart" or "Kernel > Restart & Clear output ---- -To run simple, non interactive bash commands in a python cell, prefix them with `!`. +To run simple, non interactive bash commands in a python cell, prefix them with `!` (we call it "bang"). When you run a cell, the output is displayed below the cell. ```python @@ -93,29 +99,31 @@ echo $A During the course, you will need to execute some shell code, that is rendered like the following -```bash +```text # Don't execute this non-interactive cell. echo "What is your name?" read name echo "Hello $name!" ``` -In these cases, you need to [open a terminal on the local machine](/terminals/example), for example following links like [this one](/terminals/example) and type the commands there. This is especially required for interactive tasks. +In these cases, you need to [open a terminal on the local machine](/terminals/example), +for example following links like [this one](/terminals/example) and type the commands there. +This is especially required for interactive tasks. - +--- - #### Exercises -Exercise solutions are folded. You can show them clicking on the `+` sign. - - +Exercise solutions may be hidden. +You can show them double-clicking on the cell. + +--> + # Don't do that :D just try and ![Do your homework](http://s2.quickmeme.com/img/43/438ccdc454bc53dfe79f6190ee43b2be19bd578ad002426efcf90f7a327cedd1.jpg) diff --git a/tools-101/markdown.mak b/tools-101/markdown.mak index 1642cb3..98ebf7a 100644 --- a/tools-101/markdown.mak +++ b/tools-101/markdown.mak @@ -6,5 +6,4 @@ all: $(BOOKS) @echo $(BOOKS) notebooks/%.ipynb: %.md - notedown --to notebook $^ > $@ diff --git a/tools-101/notebooks/intro.ipynb b/tools-101/notebooks/intro.ipynb index ad2cca8..d58752f 100644 --- a/tools-101/notebooks/intro.ipynb +++ b/tools-101/notebooks/intro.ipynb @@ -388,7 +388,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.9" + } + }, "nbformat": 4, "nbformat_minor": 5 } diff --git a/tools-101/tox.ini b/tools-101/tox.ini index 5a9d96e..efd3230 100644 --- a/tools-101/tox.ini +++ b/tools-101/tox.ini @@ -8,4 +8,4 @@ deps = allowlist_externals = make commands = - make -f markdown.mak + make {posargs} From 6088739ef0b522d8184482f8ad4384105c46d68b Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Tue, 25 Jul 2023 21:53:05 +0200 Subject: [PATCH 28/52] Reorganize build --- .github/workflows/publish.yaml | 22 +-- docker-101/01-docker.md | 2 +- docker-101/notebooks/01-docker.ipynb | 20 +-- tools-101/Makefile | 10 +- tools-101/docker-compose.yml | 2 - tools-101/intro.md | 64 ++------ tools-101/notebooks/intro.ipynb | 233 ++++++++++++--------------- 7 files changed, 134 insertions(+), 219 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index e65ea50..522ac99 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -3,24 +3,14 @@ name: CI Test and Publish Workflow on: push: branches: [main] - paths-ignore: - - '**/*.md' - - '**/*.txt' - - 'docs/*' - # This re-includes the requirements file - # while not touching any other previously - # excluded .txt files. For more information, - # see https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet - - '!requirements.txt' - - '!requirements-dev.txt' + paths: + - 'tools-101/python27.dockerfile' + - 'tools-101/requirements.txt' pull_request: branches: [main] - paths-ignore: - - '**/*.md' - - '**/*.txt' - - 'docs/*' - - '!requirements.txt' - - '!requirements-dev.txt' + paths: + - 'tools-101/python27.dockerfile' + - 'tools-101/requirements.txt' env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} diff --git a/docker-101/01-docker.md b/docker-101/01-docker.md index bb1de6a..3188ab1 100644 --- a/docker-101/01-docker.md +++ b/docker-101/01-docker.md @@ -6,7 +6,7 @@ This is a crash docker course. ## What is? Docker is a platform for developers and sysadmins to develop, - ship, and run applications. +ship, and run applications. --- diff --git a/docker-101/notebooks/01-docker.ipynb b/docker-101/notebooks/01-docker.ipynb index 269d8d5..43084f5 100644 --- a/docker-101/notebooks/01-docker.ipynb +++ b/docker-101/notebooks/01-docker.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2ad9ffcd", + "id": "df8eaaa1", "metadata": {}, "source": [ "# Docker 101\n", @@ -12,12 +12,12 @@ "## What is?\n", "\n", "Docker is a platform for developers and sysadmins to develop,\n", - " ship, and run applications." + "ship, and run applications." ] }, { "cell_type": "markdown", - "id": "591cbcad", + "id": "7c24c405", "metadata": { "slideshow": { "slide_type": "slide" @@ -38,7 +38,7 @@ }, { "cell_type": "markdown", - "id": "db2dd42f", + "id": "f8686724", "metadata": { "slideshow": { "slide_type": "slide" @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "13ba802d", + "id": "67787178", "metadata": { "slideshow": { "slide_type": "slide" @@ -82,7 +82,7 @@ }, { "cell_type": "markdown", - "id": "aae50434", + "id": "180366bf", "metadata": { "slideshow": { "slide_type": "slide" @@ -108,7 +108,7 @@ }, { "cell_type": "markdown", - "id": "60480f6b", + "id": "d3e37174", "metadata": { "slideshow": { "slide_type": "slide" @@ -129,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "8fabce9e", + "id": "5ef8df6c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -143,7 +143,7 @@ }, { "cell_type": "markdown", - "id": "7ffa392b", + "id": "79749319", "metadata": { "slideshow": { "slide_type": "slide" @@ -169,7 +169,7 @@ }, { "cell_type": "markdown", - "id": "65381401", + "id": "b3df5e3e", "metadata": {}, "source": [ "---" diff --git a/tools-101/Makefile b/tools-101/Makefile index aba17c8..3b46002 100644 --- a/tools-101/Makefile +++ b/tools-101/Makefile @@ -25,18 +25,18 @@ clean: # find notebooks -name \*.yml -type f -exec ansible-lint {} \; find notebooks -name '*.ipynb' -exec nbstripout {} \; # $(foreach dpath, $(EXTERNAL_COURSES), rm -f notebooks/$(dpath)/*.ipynb; ) - + # clean-other: # docker-compose kill bastion web # docker-compose rm -vf bastion web -# +# # test: # docker exec -ti tools101_dev_1 bash -c ' (cd /notebooks; ./cleanup.sh ) ' -# +# # dev: .prepare # docker-compose scale dev=1 # docker-compose logs dev | grep token | sed -e "s/0.0.0.0/$(MAIN_IP)/g" | sed -e "s/(sysadminpy or 127.0.0.1)/$(MAIN_IP)/g" -# +# .prepare: # build all EXTERNAL_COURSES $(foreach dpath, $(EXTERNAL_COURSES), cd ../$(dpath); ! test -f Makefile || make; ) @@ -45,4 +45,4 @@ clean: make -f markdown.mak run: course - jupyter notebook notebooks \ No newline at end of file + jupyter notebook notebooks diff --git a/tools-101/docker-compose.yml b/tools-101/docker-compose.yml index 6c22c88..be0801d 100644 --- a/tools-101/docker-compose.yml +++ b/tools-101/docker-compose.yml @@ -44,5 +44,3 @@ services: - 8888:8888 entrypoint: /bin/sh command: -c "/usr/local/bin/jupyter-notebook --ip 0.0.0.0 --allow-root" - - diff --git a/tools-101/intro.md b/tools-101/intro.md index 8eddc90..71ceddc 100644 --- a/tools-101/intro.md +++ b/tools-101/intro.md @@ -115,23 +115,22 @@ This is especially required for interactive tasks. #### Exercises Exercise solutions may be hidden. -You can show them double-clicking on the cell. +You can show them double-clicking on cells +like this one. -`. + +--- + # Don't do that :D just try and ![Do your homework](http://s2.quickmeme.com/img/43/438ccdc454bc53dfe79f6190ee43b2be19bd578ad002426efcf90f7a327cedd1.jpg) - - -```python solution="hidden" - -``` --- @@ -151,50 +150,9 @@ Go to your [git beginners course](/notebooks/notebooks/rendered_notebooks/git-10 # Docker -Docker is a lightweight container environment. Jupyter and all other "machines" are based on docker. +Docker is a lightweight virtualization environment. +Jupyter and all other "machines" are based on docker. [Presentation (in Italian)](https://docs.google.com/presentation/d/15swQ2gHWAKYAm_ZbBme9rmzV1CpLNl1npvgrUyODu1s/) Go to your [docker beginners course](/notebooks/notebooks/rendered_notebooks/docker-101/) - - -## Setup with digitalocean (if you don't have your server) - -Create and `ssh` into your docker droplet. - -![Create droplet](https://cdn.pbrd.co/images/GA8dkaJ.png) - -## Setup example - -[![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI) - -## Docker must listen on 172.17.0.1:2735 - -``` -# vim /etc/systemd/system/multi-user.target.wants/docker.service -[Service] -... -ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375 -... -#wq! - -systemctl daemon-reload -systemctl restart docker -``` - -## Clone and start - -``` -git clone https://github.com/ioggstream/python-course.git -cd python-course/ansible-101 -make course - -``` - -## Connect to jupyter - -``` -firefox http://43.32.54.212:8888/tree/notebooks/?token=.... -``` - - diff --git a/tools-101/notebooks/intro.ipynb b/tools-101/notebooks/intro.ipynb index d58752f..7c8658e 100644 --- a/tools-101/notebooks/intro.ipynb +++ b/tools-101/notebooks/intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "df9f8c5f", + "id": "ff2225e4", "metadata": {}, "source": [ "\n", @@ -21,7 +21,7 @@ }, { "cell_type": "markdown", - "id": "489b4546", + "id": "949265c1", "metadata": { "slideshow": { "slide_type": "slide" @@ -35,7 +35,19 @@ "Is the course environment in your browser.\n", "It requires a modern browser and an internet connection supporting\n", "websockets. If your proxy does not support websockets, you will not be able to\n", - "execute the code.\n", + "execute the code." + ] + }, + { + "cell_type": "markdown", + "id": "ddd05bc1", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", "\n", "While you might find the exercises' solutions in the environment,\n", "it is important for you to spend some time trying to do your homework!\n", @@ -44,7 +56,7 @@ }, { "cell_type": "markdown", - "id": "f0836235", + "id": "a6ecfb2e", "metadata": { "slideshow": { "slide_type": "slide" @@ -59,12 +71,26 @@ "\n", "- [open a (named) terminal on the local machine](/terminals/example)\n", "- [edit an existing file](/edit/notebooks/untitled.txt)\n", + "- execute the next cell with `SHIFT+ENTER` (try it now!)" + ] + }, + { + "cell_type": "markdown", + "id": "f5cfb2c2", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", "- add more cells with `ALT+ENTER`" ] }, { "cell_type": "markdown", - "id": "34704de7", + "id": "6f26761c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -79,7 +105,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1ed7f0a1", + "id": "c0ac33d2", "metadata": {}, "outputs": [], "source": [ @@ -88,7 +114,7 @@ }, { "cell_type": "markdown", - "id": "f45a9532", + "id": "fb5c0ea6", "metadata": { "slideshow": { "slide_type": "slide" @@ -106,7 +132,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b453a359", + "id": "89a48a53", "metadata": {}, "outputs": [], "source": [ @@ -117,7 +143,7 @@ }, { "cell_type": "markdown", - "id": "dc748d01", + "id": "d507c246", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -126,7 +152,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8aa80a69", + "id": "798c8bd1", "metadata": {}, "outputs": [], "source": [ @@ -137,7 +163,7 @@ }, { "cell_type": "markdown", - "id": "3831eef1", + "id": "e26b8c23", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -148,7 +174,7 @@ }, { "cell_type": "markdown", - "id": "2a5d9914", + "id": "276692a6", "metadata": { "slideshow": { "slide_type": "subslide" @@ -157,14 +183,14 @@ "source": [ "----\n", "\n", - "To run simple, non interactive bash commands in a python cell, prefix them with `!`.\n", + "To run simple, non interactive bash commands in a python cell, prefix them with `!` (we call it \"bang\").\n", "When you run a cell, the output is displayed below the cell." ] }, { "cell_type": "code", "execution_count": null, - "id": "610fe25d", + "id": "d2a81759", "metadata": {}, "outputs": [], "source": [ @@ -173,7 +199,7 @@ }, { "cell_type": "markdown", - "id": "c6d34a09", + "id": "7d2fdef3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -188,7 +214,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9271d5a6", + "id": "c0c4990e", "metadata": {}, "outputs": [], "source": [ @@ -199,7 +225,7 @@ }, { "cell_type": "markdown", - "id": "4f2370e8", + "id": "7728933d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -216,11 +242,17 @@ { "cell_type": "code", "execution_count": null, - "id": "85cecbfb", - "metadata": {}, + "id": "d357f875", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, "outputs": [], "source": [ - "%%bash\n", "# Don't execute this non-interactive cell.\n", "echo \"What is your name?\"\n", "read name\n", @@ -229,36 +261,67 @@ }, { "cell_type": "markdown", - "id": "aca9fb9c", + "id": "b1962d7d", "metadata": {}, "source": [ - "In these cases, you need to [open a terminal on the local machine](/terminals/example), for example following links like [this one](/terminals/example) and type the commands there. This is especially required for interactive tasks.\n", - "\n", - "\n", + "In these cases, you need to [open a terminal on the local machine](/terminals/example),\n", + "for example following links like [this one](/terminals/example) and type the commands there.\n", + "This is especially required for interactive tasks." + ] + }, + { + "cell_type": "markdown", + "id": "ddd44cdd", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", "\n", - "\n", "#### Exercises\n", "\n", - "Exercise solutions are folded. You can show them clicking on the `+` sign.\n", + "Exercise solutions may be hidden.\n", + "You can show them double-clicking on cells\n", + "like this one.\n", "\n", - "" + "They will appear as ``.\n", + "\n", + "\n", + "--\n", + "def solution():\n", + " print(\"Hey! I am a solution!\")\n", + " print(\"Copy & paste me in a cell\")\n", + "-->" + ] + }, + { + "cell_type": "markdown", + "id": "e08e67c6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", "# Don't do that :D just try and\n", "\n", - "![Do your homework](http://s2.quickmeme.com/img/43/438ccdc454bc53dfe79f6190ee43b2be19bd578ad002426efcf90f7a327cedd1.jpg)\n", - "" + "![Do your homework](http://s2.quickmeme.com/img/43/438ccdc454bc53dfe79f6190ee43b2be19bd578ad002426efcf90f7a327cedd1.jpg)" ] }, { "cell_type": "markdown", - "id": "52932a94", + "id": "d708f132", "metadata": { "slideshow": { "slide_type": "slide" @@ -274,7 +337,7 @@ }, { "cell_type": "markdown", - "id": "48294e9d", + "id": "6e38ecb9", "metadata": { "slideshow": { "slide_type": "slide" @@ -292,7 +355,7 @@ }, { "cell_type": "markdown", - "id": "32a6db18", + "id": "8a5a039d", "metadata": { "slideshow": { "slide_type": "slide" @@ -303,110 +366,16 @@ "\n", "# Docker\n", "\n", - "Docker is a lightweight container environment. Jupyter and all other \"machines\" are based on docker.\n", + "Docker is a lightweight virtualization environment.\n", + "Jupyter and all other \"machines\" are based on docker.\n", "\n", "[Presentation (in Italian)](https://docs.google.com/presentation/d/15swQ2gHWAKYAm_ZbBme9rmzV1CpLNl1npvgrUyODu1s/)\n", "\n", - "Go to your [docker beginners course](/notebooks/notebooks/rendered_notebooks/docker-101/)\n", - "\n", - "\n", - "## Setup with digitalocean (if you don't have your server)\n", - "\n", - "Create and `ssh` into your docker droplet.\n", - "\n", - "![Create droplet](https://cdn.pbrd.co/images/GA8dkaJ.png)\n", - "\n", - "## Setup example\n", - "\n", - "[![asciicast](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI.png)](https://asciinema.org/a/9xqX4akNND7Yc0Q1sTb3ZnEhI)\n", - "\n", - "## Docker must listen on 172.17.0.1:2735" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1f898e25", - "metadata": {}, - "outputs": [], - "source": [ - "# vim /etc/systemd/system/multi-user.target.wants/docker.service\n", - "[Service]\n", - "...\n", - "ExecStart=/usr/bin/dockerd -H fd:// -H tcp://172.17.0.1:2375\n", - "...\n", - "#wq!\n", - "\n", - "systemctl daemon-reload\n", - "systemctl restart docker" - ] - }, - { - "cell_type": "markdown", - "id": "6d582a04", - "metadata": {}, - "source": [ - "## Clone and start" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "814c03bf", - "metadata": {}, - "outputs": [], - "source": [ - "git clone https://github.com/ioggstream/python-course.git\n", - "cd python-course/ansible-101\n", - "make course\n" - ] - }, - { - "cell_type": "markdown", - "id": "9461e4a7", - "metadata": {}, - "source": [ - "## Connect to jupyter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3d0272cd", - "metadata": {}, - "outputs": [], - "source": [ - "firefox http://43.32.54.212:8888/tree/notebooks/?token=...." - ] - }, - { - "cell_type": "markdown", - "id": "5303d0d1", - "metadata": {}, - "source": [ - "" + "Go to your [docker beginners course](/notebooks/notebooks/rendered_notebooks/docker-101/)" ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.9" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } From d6cfcff9d27979fbe56f64e7ef7c86ae59fcee8e Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Tue, 25 Jul 2023 23:02:08 +0200 Subject: [PATCH 29/52] Merging slides in docker. --- docker-101/00-docker.md | 130 ++++++++++++++++++++++++++++++++++++++++ docker-101/01-docker.md | 6 +- 2 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 docker-101/00-docker.md diff --git a/docker-101/00-docker.md b/docker-101/00-docker.md new file mode 100644 index 0000000..a75824c --- /dev/null +++ b/docker-101/00-docker.md @@ -0,0 +1,130 @@ + +# Docker 101 + +This is an introductory course to containerization +and [Docker](https://docker.com). + +The course will cover: + +1. computational resources and the Operating System's Kernel +1. Virtualization: pros and cons +1. Processes & isolation tools +1. Containers & Docker +1. Containerization as an application packaging system +1. Practice session + +--- + +## Computational resources + +Computational resources are basically: + +- RAM +- Storage +- Network +- CPU + +--- + +## Meet the Kernel + +The (Linux) kernel decides *who* and *when* +can access to RAM, CPU and disks using abstractions. + +| Physical | Abstraction | +| --- | --- | +| RAM | Virtual Memory | +| CPU | Computational Shares | +| Storage & Network | File descriptors | + +```mermaid +graph LR + + +subgraph apps[ ] +direction LR +browser[Browser fab:fa-firefox-browser] +game[Games fa:fa-chess-knight fa:fa-chess-rook] +word[Editor fa:fa-file-word] +end + +subgraph k [ ] +kernel[K\ne\nr\nn\ne\nl\n \nfab:fa-linux] +end + +subgraph hw[ ] +direction LR +cpu[CPU fa:fa-cpu] +ram[RAM fa:fa-memory] +storage[HD fa:fa-hdd] +%% net[Net fa:fa-ethernet] +end + +apps ~~~ kernel ~~~ hw +``` + +--- + +## A process is a cage + +The Kernel cages programs. + +It only shows them a part of the global resources. + +Programs think they have a complete operating system +at their disposal. + +A software requests access to resources invoking system calls. + +[Image from deviantart](https://www.deviantart.com/mirinata/art/Lucky-Luke-and-the-Daltons-524439744) +![Alt text](https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/4a9529e8-cf9b-4b7b-a70d-ad27fd90ae1c/d8o8kao-2be99487-2c9f-45f3-9cb1-9343e05d2900.jpg/v1/fill/w_1020,h_783,q_70,strp/lucky_luke_and_the_daltons_by_mirinata_d8o8kao-pre.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7InBhdGgiOiJcL2ZcLzRhOTUyOWU4LWNmOWItNGI3Yi1hNzBkLWFkMjdmZDkwYWUxY1wvZDhvOGthby0yYmU5OTQ4Ny0yYzlmLTQ1ZjMtOWNiMS05MzQzZTA1ZDI5MDAuanBnIiwiaGVpZ2h0IjoiPD03ODYiLCJ3aWR0aCI6Ijw9MTAyNCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS53YXRlcm1hcmsiXSwid21rIjp7InBhdGgiOiJcL3dtXC80YTk1MjllOC1jZjliLTRiN2ItYTcwZC1hZDI3ZmQ5MGFlMWNcL21pcmluYXRhLTQucG5nIiwib3BhY2l0eSI6OTUsInByb3BvcnRpb25zIjowLjQ1LCJncmF2aXR5IjoiY2VudGVyIn19.J8HEQiHvVmvXba88H0knHm5ZD7xlgMeFAG_rmsW9DXE) +--- + +## The cage is named "process" + +The `ps` command lists the "cages" showing the assigned virtual resources. + +```bash +# process id, executable, %cpu, virtual memory size +! ps -o pid,cmd,pcpu,vsize +``` + +These resources are retrieved from the `/proc/$PID/stat` and other files. + +```bash +! ls /proc/[0-9]*/stat +``` + +--- + +## To access hardware, you need syscall + +An imaginary dialogue between your browser and your Kernel. + +```mermaid +graph TB + +subgraph hw +direction LR +cpu[CPU fa:fa-cpu] +ram[RAM fa:fa-memory] +storage[HD fa:fa-hdd] + +end +subgraph Linux +l1 +l2 +l3[...] +end + +subgraph Firefox +f1 +f2 +f3 +end + +f1("Hey Kernel, I want to save a file on disk!") +l1("Can you tell the magic words?") +f2("open(..);\nwrite(..);\nclose(..);") +l2("Correct!\nThree syscalls!\nI'll notify you when I'm done.") +f3("OK, I'm waiting for you!") diff --git a/docker-101/01-docker.md b/docker-101/01-docker.md index 3188ab1..3b50433 100644 --- a/docker-101/01-docker.md +++ b/docker-101/01-docker.md @@ -1,9 +1,5 @@ -# Docker 101 - -This is a crash docker course. - -## What is? +# Docker 101 - Containerization as an application packaging mechanism. Docker is a platform for developers and sysadmins to develop, ship, and run applications. From 522a0ddf86a56b9f8195b2a3bfea64c0f0a0d64e Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Wed, 26 Jul 2023 11:03:06 +0200 Subject: [PATCH 30/52] bump docker. --- docker-101/00-docker.md | 142 +++++++---- docker-101/notebooks/00-docker.ipynb | 352 +++++++++++++++++++++++++++ docker-101/notebooks/01-docker.ipynb | 24 +- 3 files changed, 460 insertions(+), 58 deletions(-) create mode 100644 docker-101/notebooks/00-docker.ipynb diff --git a/docker-101/00-docker.md b/docker-101/00-docker.md index a75824c..990a8c0 100644 --- a/docker-101/00-docker.md +++ b/docker-101/00-docker.md @@ -37,31 +37,7 @@ can access to RAM, CPU and disks using abstractions. | CPU | Computational Shares | | Storage & Network | File descriptors | -```mermaid -graph LR - - -subgraph apps[ ] -direction LR -browser[Browser fab:fa-firefox-browser] -game[Games fa:fa-chess-knight fa:fa-chess-rook] -word[Editor fa:fa-file-word] -end - -subgraph k [ ] -kernel[K\ne\nr\nn\ne\nl\n \nfab:fa-linux] -end - -subgraph hw[ ] -direction LR -cpu[CPU fa:fa-cpu] -ram[RAM fa:fa-memory] -storage[HD fa:fa-hdd] -%% net[Net fa:fa-ethernet] -end - -apps ~~~ kernel ~~~ hw -``` +[![](https://mermaid.ink/img/pako:eNptUl1r4zAQ_CtioW9OiO04Tvx2bY8r9HocPfpS-R4Uax2LWJKRZZJcSH77rT9CKRSx0mpmVsxKOkNhJUIGOyeaiv18zU0_2m47AqJpWs7-5kYqh4VX1gyarbOHFh2_H1dWim1WillJotIeZxNNZTuhkf-gqSVNLykqbNvZ3qhd5T9Bzto9FRysk_y7VN66iS5VjbMeJhaN_GRvzwZze3QGa_6ck4LCUZgprykYxeSwVqY7fnFQdfiiy6Lp-MPvt8mHVoWzRaUa0jmh-eu3lxuD2roTwS25FjvkT48TU8ne9d0dM-j5L7x1jL7qHfsPI_09s-v1ysZWhrQ65AYC0Oi0UJLe6EytsByoWGMOGaUSS9HVPofcXEjaNVJ4HG8PMu86DEB03v45meK2HzWPSlDjGshN3RLaCPNurb6JaAvZGY6QRat0HtG0CJNkvYpX4TKAE2Rhsp4v43AdLtJNGi2SMLoE8G84YTFfJXEaJmm0ScN4GW82AeBg6WX8asOPu_wH3KjcpA?type=png)](https://mermaid.live/edit#pako:eNptUl1r4zAQ_CtioW9OiO04Tvx2bY8r9HocPfpS-R4Uax2LWJKRZZJcSH77rT9CKRSx0mpmVsxKOkNhJUIGOyeaiv18zU0_2m47AqJpWs7-5kYqh4VX1gyarbOHFh2_H1dWim1WillJotIeZxNNZTuhkf-gqSVNLykqbNvZ3qhd5T9Bzto9FRysk_y7VN66iS5VjbMeJhaN_GRvzwZze3QGa_6ck4LCUZgprykYxeSwVqY7fnFQdfiiy6Lp-MPvt8mHVoWzRaUa0jmh-eu3lxuD2roTwS25FjvkT48TU8ne9d0dM-j5L7x1jL7qHfsPI_09s-v1ysZWhrQ65AYC0Oi0UJLe6EytsByoWGMOGaUSS9HVPofcXEjaNVJ4HG8PMu86DEB03v45meK2HzWPSlDjGshN3RLaCPNurb6JaAvZGY6QRat0HtG0CJNkvYpX4TKAE2Rhsp4v43AdLtJNGi2SMLoE8G84YTFfJXEaJmm0ScN4GW82AeBg6WX8asOPu_wH3KjcpA) --- @@ -101,30 +77,108 @@ These resources are retrieved from the `/proc/$PID/stat` and other files. An imaginary dialogue between your browser and your Kernel. +![Foo](https://mermaid.ink/img/pako:eNplUk2P0zAQ_StTXxakbGiSpmktFKQCUqsI7QFOKJchnmwtHLvYDiFU_e_rpFskdn2w_Pzemw_NnFljBDHOHP3qSTf0SeKjxa7WEM4JrZeNPKH2sAN0sLNmcGRfs9XEVmQ1qdfkfiL3aMWAlq70Du7LsuKwp_HZFsEBhkntDTj8TYDQSkVgNAjpfl5tFdwH347DR9Qwmj4oR_BHgg4fZQODscJ9-D-DOZF-E8dv3_-w5WClpxtolHEz-Be6LPccDu8eJjaO45cpjbXU-AV8O1oicKNrUCm3mNSHO6VAGy_bcS5rOJKGw10HwugXHT9UC5jlA0oPrbGTgUWsI9uhFGEU58lQs9BWRzXj4SmoxV75mtX6EqT9SaCnz0J6Yxn3tqeIYe_N11E3N3zVPE-T8RaVC79hHN-N6W6iABk_sz-Mp-siTsO1TPJ8s87WySpiI-NJvolXWbJJlsW2SJd5kl4i9neOsIzXeVYkeZFuiyRbZdttxGgu6ct1o-bFujwBJp-7ig?type=png) + + +--- + +## Kernel isolates applications and resources + +[![](https://mermaid.ink/img/pako:eNptkvGrmzAQx_8VOXiwgZaqtbYyBtve2GB7j_HGflncD6k5a1ATiZG2a_u_74z2jQcPvXi5-yR-75IzFFogZLA3vKu870-5Gp9-2E0B3nU98_7kSkiDhZVaOWZn9KFHwz5OX6_ku6zkQUlQqY_BnKZle94i-0JDT8yIFBX2fVArua_si5DRuqYFB20E-yyk1WZOl7LBYAxTFpV4Ia_2nLgajcKGfcuJIDNkavYbMo-M3llkI9VwfGWv6vBKoUU3sE8_fs1SWlkYXVSyI87wlj19eLhlsNXmROGehPM9sq_3c6YSo_C7O0-hZY94KxptNYq2_4XUXhC8JxXOWwSXdxc3mXs5Ji856A7Vm7dUzMFIi-TBxaunNs_EztQOaHrE-hkY-zcDUhe2cUhPf7b6mQEfWjQtl4Luw5na5uVAKlvMISNXYMmHxuaQqyuhQye4xemkILNmQB_4YPXPkypu84m5l5w63AKVTaJ86Lj6rXV7g2gK2RmOkEXrdBHRsAyTZLOO1-HKhxNkYbJZrOJwEy7TbRotkzC6-vDX7bBcrJM4DZM02qZhvIq3Wx_QSXqYrrW73dd_YMj_AQ?type=png)](https://mermaid.live/edit#pako:eNptkvGrmzAQx_8VOXiwgZaqtbYyBtve2GB7j_HGflncD6k5a1ATiZG2a_u_74z2jQcPvXi5-yR-75IzFFogZLA3vKu870-5Gp9-2E0B3nU98_7kSkiDhZVaOWZn9KFHwz5OX6_ku6zkQUlQqY_BnKZle94i-0JDT8yIFBX2fVArua_si5DRuqYFB20E-yyk1WZOl7LBYAxTFpV4Ia_2nLgajcKGfcuJIDNkavYbMo-M3llkI9VwfGWv6vBKoUU3sE8_fs1SWlkYXVSyI87wlj19eLhlsNXmROGehPM9sq_3c6YSo_C7O0-hZY94KxptNYq2_4XUXhC8JxXOWwSXdxc3mXs5Ji856A7Vm7dUzMFIi-TBxaunNs_EztQOaHrE-hkY-zcDUhe2cUhPf7b6mQEfWjQtl4Luw5na5uVAKlvMISNXYMmHxuaQqyuhQye4xemkILNmQB_4YPXPkypu84m5l5w63AKVTaJ86Lj6rXV7g2gK2RmOkEXrdBHRsAyTZLOO1-HKhxNkYbJZrOJwEy7TbRotkzC6-vDX7bBcrJM4DZM02qZhvIq3Wx_QSXqYrrW73dd_YMj_AQ) + + +## Multitasking, Virtualization & Co + +Isolation enables multi-tasking and multiple users: +more people using the same computer at the same time. + +Virtualization goes a step further: + +- vCPU, vStorage +- virtualized kernels (Linux, Windows, ..) +- processes are executed by virtualized kernels + +[![](https://mermaid.ink/img/pako:eNptUlFr2zAQ_itC0Kc5wbGbONFbWQaBtWV028usPSjWpRa2JCPJTrKQ_Pae7bSjtOAPn-777tOdpBMtrATK6LMTTUnun7jhpqiF92vYkeCEJz44WwEz1kBP-nY7aqt8c2zAdcpb95ebTjPG-gJu6m5Sd3nFMYnQCPy-jL8aoRDbK9vHDhHQogJnoM43uLQI36cR3xFwlZlr3NuQ0XEntmwnJrUy7QFNwMh3bZb7nGBaKgdFUNYMMxZNm3_98Xuo7ou1KpwtStWg0gmdP909_OdAW3dEwgfrxDPkm_UbV0qJhIGQP0IgYw5C2c8RPuml05_0YsKkyh_R8te7efbKSLv3KK-Rv78eVS9oEYePg9_ckN6KXC4XgiVvu3eaDLmRKffc0IhqcFooiRd_woMknGLTGjhlGErYibYOnHJzRmnbSBHgm1Q4PsUbbiGiog3259EUr-tRs1YC59QUu6o9Zhth_lirX0W4pOxED5Rl2TRN4yTJ4mwxSzCI6JGyJI2nWZols1WymMW3yWp5jui_wSCeLpZpMp-ns9tlslgt5mlEYejoYXy-wys-vwD1sf5s?type=png)](https://mermaid.live/edit#pako:eNptUlFr2zAQ_itC0Kc5wbGbONFbWQaBtWV028usPSjWpRa2JCPJTrKQ_Pae7bSjtOAPn-777tOdpBMtrATK6LMTTUnun7jhpqiF92vYkeCEJz44WwEz1kBP-nY7aqt8c2zAdcpb95ebTjPG-gJu6m5Sd3nFMYnQCPy-jL8aoRDbK9vHDhHQogJnoM43uLQI36cR3xFwlZlr3NuQ0XEntmwnJrUy7QFNwMh3bZb7nGBaKgdFUNYMMxZNm3_98Xuo7ou1KpwtStWg0gmdP909_OdAW3dEwgfrxDPkm_UbV0qJhIGQP0IgYw5C2c8RPuml05_0YsKkyh_R8te7efbKSLv3KK-Rv78eVS9oEYePg9_ckN6KXC4XgiVvu3eaDLmRKffc0IhqcFooiRd_woMknGLTGjhlGErYibYOnHJzRmnbSBHgm1Q4PsUbbiGiog3259EUr-tRs1YC59QUu6o9Zhth_lirX0W4pOxED5Rl2TRN4yTJ4mwxSzCI6JGyJI2nWZols1WymMW3yWp5jui_wSCeLpZpMp-ns9tlslgt5mlEYejoYXy-wys-vwD1sf5s) + +--- + +Every virtualized kernel manages virtual resources +believing they are physical. + +Every virtual machine "lives" in a process! + +[![](https://mermaid.ink/img/pako:eNqNVE2PmzAQ_SvIh15KogQ2IaGnqqkUqburatteintw8LBYGBvZhiSNNr99B-ejTZWoCzxr8Mx4Zp7H3pFccyApeTasKYP7J6qoyiWzdgFF4AyzgXVGV5AqraBX2nZ1sK2y5bYB0wmrzS-qujpN096BKtkNZEdVBUaBzJaUKo2wCIf4ggCEQaijLBEBAr-CrdKCDaRQ7QaXBcUvovq1swA1yg2qgckoQVd8Cta71VBrsw3eqZVtPvw9nvQiNzovRfMmp1sjZkQwAzmQtxL4J9obov_Xw4c8FB3s93tkAt-D1OcR9Lzjm1VdHbwPpFh1wrgrDJZrTx8XBnIntPKbnjdt9unrD8__RVy0NKzOnj4-_NH5hFFhnTbsGbLl4qwrOe-zBJc9gjvWAK7sO-FaLl19JZe-xuwRl_x-0RFrobheW897ld2jQhw7qEVsbrYO0uFZqvxYri863AA_NTiKYSGkPHb62UTpVXCeDy9Og7c5bgSaUUVCUoOpmeB4pHb9LlOC1ddASYoih4K10vUd84KmbcOZg89cII8Ez04LIWGt09-2KidYibRwMloIhozV59mGqZ9a1ycv_CXpjmxImiTDOB5FUTJKpuMIhZBsSRrFo2ESJ9F4Hk3Ho7toPnsJyW-_wGg4ncXRZBKP72bRdD6doAf4lB4ON4O_IF5eAbnjeP4?type=png)](https://mermaid.live/edit#pako:eNqNVE2PmzAQ_SvIh15KogQ2IaGnqqkUqburatteintw8LBYGBvZhiSNNr99B-ejTZWoCzxr8Mx4Zp7H3pFccyApeTasKYP7J6qoyiWzdgFF4AyzgXVGV5AqraBX2nZ1sK2y5bYB0wmrzS-qujpN096BKtkNZEdVBUaBzJaUKo2wCIf4ggCEQaijLBEBAr-CrdKCDaRQ7QaXBcUvovq1swA1yg2qgckoQVd8Cta71VBrsw3eqZVtPvw9nvQiNzovRfMmp1sjZkQwAzmQtxL4J9obov_Xw4c8FB3s93tkAt-D1OcR9Lzjm1VdHbwPpFh1wrgrDJZrTx8XBnIntPKbnjdt9unrD8__RVy0NKzOnj4-_NH5hFFhnTbsGbLl4qwrOe-zBJc9gjvWAK7sO-FaLl19JZe-xuwRl_x-0RFrobheW897ld2jQhw7qEVsbrYO0uFZqvxYri863AA_NTiKYSGkPHb62UTpVXCeDy9Og7c5bgSaUUVCUoOpmeB4pHb9LlOC1ddASYoih4K10vUd84KmbcOZg89cII8Ez04LIWGt09-2KidYibRwMloIhozV59mGqZ9a1ycv_CXpjmxImiTDOB5FUTJKpuMIhZBsSRrFo2ESJ9F4Hk3Ho7toPnsJyW-_wGg4ncXRZBKP72bRdD6doAf4lB4ON4O_IF5eAbnjeP4) + +--- + +You can check if your CPU supports virtualization + +```bash +egrep 'vmx|svm' /proc/cpuinfo +``` + +Virtualization is not cheap. +There is a lot of communication going on, +and some instructions need to be serialized +and conveyed over the network. + ```mermaid -graph TB +--- +title: libvirt architecture +--- +graph LR -subgraph hw -direction LR -cpu[CPU fa:fa-cpu] -ram[RAM fa:fa-memory] -storage[HD fa:fa-hdd] +client <--> api +subgraph api[public API] +remote end -subgraph Linux -l1 -l2 -l3[...] + +subgraph Node +libvirtd +libvirt-qemu +guest end -subgraph Firefox -f1 -f2 -f3 +subgraph guest +guest-agent end -f1("Hey Kernel, I want to save a file on disk!") -l1("Can you tell the magic words?") -f2("open(..);\nwrite(..);\nclose(..);") -l2("Correct!\nThree syscalls!\nI'll notify you when I'm done.") -f3("OK, I'm waiting for you!") +api <-->|RPC\nURI| libvirtd <--> libvirt-qemu + +libvirt-qemu <-->|monitor| guest +libvirt-qemu -->|qemu-kvm| guest +libvirt-qemu <-->|agent\nmonitor| guest-agent + +``` + +--- + +## Containerization + +Containerization is a way to isolate processes +without different kernels. + +It is enabled by the isolation features that the Linux kernel provided +over time. + +- chroot: changes the root directory confing applications to see a different filesystem hierarchy (1979) +- capabilities: restrict user privileges (1999) +- SELinux: defines access control policies for kernel resources (2000) +- namespaces: partition kernel resources, including networks and host names (2002) +- cgroups: limit and isolate resource usage (2008) + +--- + +## Docker simplifies containers + +Executes linux processes in an isolated environment +that **looks like** a virtual machine. + +Every container can have one or more IP addresses. + +Container's processes communicate directly with the host kernel. diff --git a/docker-101/notebooks/00-docker.ipynb b/docker-101/notebooks/00-docker.ipynb new file mode 100644 index 0000000..eb0652e --- /dev/null +++ b/docker-101/notebooks/00-docker.ipynb @@ -0,0 +1,352 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "149f3af7", + "metadata": {}, + "source": [ + "# Docker 101\n", + "\n", + "This is an introductory course to containerization\n", + "and [Docker](https://docker.com).\n", + "\n", + "The course will cover:\n", + "\n", + "1. computational resources and the Operating System's Kernel\n", + "1. Virtualization: pros and cons\n", + "1. Processes & isolation tools\n", + "1. Containers & Docker\n", + "1. Containerization as an application packaging system\n", + "1. Practice session" + ] + }, + { + "cell_type": "markdown", + "id": "2170a758", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Computational resources\n", + "\n", + "Computational resources are basically:\n", + "\n", + "- RAM\n", + "- Storage\n", + "- Network\n", + "- CPU" + ] + }, + { + "cell_type": "markdown", + "id": "78fe2cd5", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Meet the Kernel\n", + "\n", + "The (Linux) kernel decides *who* and *when*\n", + "can access to RAM, CPU and disks using abstractions.\n", + "\n", + "| Physical | Abstraction |\n", + "| --- | --- |\n", + "| RAM | Virtual Memory |\n", + "| CPU | Computational Shares |\n", + "| Storage & Network | File descriptors |\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNptUl1r4zAQ_CtioW9OiO04Tvx2bY8r9HocPfpS-R4Uax2LWJKRZZJcSH77rT9CKRSx0mpmVsxKOkNhJUIGOyeaiv18zU0_2m47AqJpWs7-5kYqh4VX1gyarbOHFh2_H1dWim1WillJotIeZxNNZTuhkf-gqSVNLykqbNvZ3qhd5T9Bzto9FRysk_y7VN66iS5VjbMeJhaN_GRvzwZze3QGa_6ck4LCUZgprykYxeSwVqY7fnFQdfiiy6Lp-MPvt8mHVoWzRaUa0jmh-eu3lxuD2roTwS25FjvkT48TU8ne9d0dM-j5L7x1jL7qHfsPI_09s-v1ysZWhrQ65AYC0Oi0UJLe6EytsByoWGMOGaUSS9HVPofcXEjaNVJ4HG8PMu86DEB03v45meK2HzWPSlDjGshN3RLaCPNurb6JaAvZGY6QRat0HtG0CJNkvYpX4TKAE2Rhsp4v43AdLtJNGi2SMLoE8G84YTFfJXEaJmm0ScN4GW82AeBg6WX8asOPu_wH3KjcpA?type=png)](https://mermaid.live/edit#pako:eNptUl1r4zAQ_CtioW9OiO04Tvx2bY8r9HocPfpS-R4Uax2LWJKRZZJcSH77rT9CKRSx0mpmVsxKOkNhJUIGOyeaiv18zU0_2m47AqJpWs7-5kYqh4VX1gyarbOHFh2_H1dWim1WillJotIeZxNNZTuhkf-gqSVNLykqbNvZ3qhd5T9Bzto9FRysk_y7VN66iS5VjbMeJhaN_GRvzwZze3QGa_6ck4LCUZgprykYxeSwVqY7fnFQdfiiy6Lp-MPvt8mHVoWzRaUa0jmh-eu3lxuD2roTwS25FjvkT48TU8ne9d0dM-j5L7x1jL7qHfsPI_09s-v1ysZWhrQ65AYC0Oi0UJLe6EytsByoWGMOGaUSS9HVPofcXEjaNVJ4HG8PMu86DEB03v45meK2HzWPSlDjGshN3RLaCPNurb6JaAvZGY6QRat0HtG0CJNkvYpX4TKAE2Rhsp4v43AdLtJNGi2SMLoE8G84YTFfJXEaJmm0ScN4GW82AeBg6WX8asOPu_wH3KjcpA)" + ] + }, + { + "cell_type": "markdown", + "id": "cd2a332a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## A process is a cage\n", + "\n", + "The Kernel cages programs.\n", + "\n", + "It only shows them a part of the global resources.\n", + "\n", + "Programs think they have a complete operating system\n", + "at their disposal.\n", + "\n", + "A software requests access to resources invoking system calls.\n", + "\n", + "[Image from deviantart](https://www.deviantart.com/mirinata/art/Lucky-Luke-and-the-Daltons-524439744)\n", + "![Alt text](https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/4a9529e8-cf9b-4b7b-a70d-ad27fd90ae1c/d8o8kao-2be99487-2c9f-45f3-9cb1-9343e05d2900.jpg/v1/fill/w_1020,h_783,q_70,strp/lucky_luke_and_the_daltons_by_mirinata_d8o8kao-pre.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7InBhdGgiOiJcL2ZcLzRhOTUyOWU4LWNmOWItNGI3Yi1hNzBkLWFkMjdmZDkwYWUxY1wvZDhvOGthby0yYmU5OTQ4Ny0yYzlmLTQ1ZjMtOWNiMS05MzQzZTA1ZDI5MDAuanBnIiwiaGVpZ2h0IjoiPD03ODYiLCJ3aWR0aCI6Ijw9MTAyNCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS53YXRlcm1hcmsiXSwid21rIjp7InBhdGgiOiJcL3dtXC80YTk1MjllOC1jZjliLTRiN2ItYTcwZC1hZDI3ZmQ5MGFlMWNcL21pcmluYXRhLTQucG5nIiwib3BhY2l0eSI6OTUsInByb3BvcnRpb25zIjowLjQ1LCJncmF2aXR5IjoiY2VudGVyIn19.J8HEQiHvVmvXba88H0knHm5ZD7xlgMeFAG_rmsW9DXE)" + ] + }, + { + "cell_type": "markdown", + "id": "d0a9c750", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## The cage is named \"process\"\n", + "\n", + "The `ps` command lists the \"cages\" showing the assigned virtual resources." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2eebd856", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "# process id, executable, %cpu, virtual memory size\n", + "! ps -o pid,cmd,pcpu,vsize" + ] + }, + { + "cell_type": "markdown", + "id": "c79b7d5a", + "metadata": {}, + "source": [ + "These resources are retrieved from the `/proc/$PID/stat` and other files." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7073a441", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "! ls /proc/[0-9]*/stat" + ] + }, + { + "cell_type": "markdown", + "id": "b215b5e2", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## To access hardware, you need syscall\n", + "\n", + "An imaginary dialogue between your browser and your Kernel.\n", + "\n", + "![Foo](https://mermaid.ink/img/pako:eNplUk2P0zAQ_StTXxakbGiSpmktFKQCUqsI7QFOKJchnmwtHLvYDiFU_e_rpFskdn2w_Pzemw_NnFljBDHOHP3qSTf0SeKjxa7WEM4JrZeNPKH2sAN0sLNmcGRfs9XEVmQ1qdfkfiL3aMWAlq70Du7LsuKwp_HZFsEBhkntDTj8TYDQSkVgNAjpfl5tFdwH347DR9Qwmj4oR_BHgg4fZQODscJ9-D-DOZF-E8dv3_-w5WClpxtolHEz-Be6LPccDu8eJjaO45cpjbXU-AV8O1oicKNrUCm3mNSHO6VAGy_bcS5rOJKGw10HwugXHT9UC5jlA0oPrbGTgUWsI9uhFGEU58lQs9BWRzXj4SmoxV75mtX6EqT9SaCnz0J6Yxn3tqeIYe_N11E3N3zVPE-T8RaVC79hHN-N6W6iABk_sz-Mp-siTsO1TPJ8s87WySpiI-NJvolXWbJJlsW2SJd5kl4i9neOsIzXeVYkeZFuiyRbZdttxGgu6ct1o-bFujwBJp-7ig?type=png)\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "3a9d1b96", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Kernel isolates applications and resources\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNptkvGrmzAQx_8VOXiwgZaqtbYyBtve2GB7j_HGflncD6k5a1ATiZG2a_u_74z2jQcPvXi5-yR-75IzFFogZLA3vKu870-5Gp9-2E0B3nU98_7kSkiDhZVaOWZn9KFHwz5OX6_ku6zkQUlQqY_BnKZle94i-0JDT8yIFBX2fVArua_si5DRuqYFB20E-yyk1WZOl7LBYAxTFpV4Ia_2nLgajcKGfcuJIDNkavYbMo-M3llkI9VwfGWv6vBKoUU3sE8_fs1SWlkYXVSyI87wlj19eLhlsNXmROGehPM9sq_3c6YSo_C7O0-hZY94KxptNYq2_4XUXhC8JxXOWwSXdxc3mXs5Ji856A7Vm7dUzMFIi-TBxaunNs_EztQOaHrE-hkY-zcDUhe2cUhPf7b6mQEfWjQtl4Luw5na5uVAKlvMISNXYMmHxuaQqyuhQye4xemkILNmQB_4YPXPkypu84m5l5w63AKVTaJ86Lj6rXV7g2gK2RmOkEXrdBHRsAyTZLOO1-HKhxNkYbJZrOJwEy7TbRotkzC6-vDX7bBcrJM4DZM02qZhvIq3Wx_QSXqYrrW73dd_YMj_AQ?type=png)](https://mermaid.live/edit#pako:eNptkvGrmzAQx_8VOXiwgZaqtbYyBtve2GB7j_HGflncD6k5a1ATiZG2a_u_74z2jQcPvXi5-yR-75IzFFogZLA3vKu870-5Gp9-2E0B3nU98_7kSkiDhZVaOWZn9KFHwz5OX6_ku6zkQUlQqY_BnKZle94i-0JDT8yIFBX2fVArua_si5DRuqYFB20E-yyk1WZOl7LBYAxTFpV4Ia_2nLgajcKGfcuJIDNkavYbMo-M3llkI9VwfGWv6vBKoUU3sE8_fs1SWlkYXVSyI87wlj19eLhlsNXmROGehPM9sq_3c6YSo_C7O0-hZY94KxptNYq2_4XUXhC8JxXOWwSXdxc3mXs5Ji856A7Vm7dUzMFIi-TBxaunNs_EztQOaHrE-hkY-zcDUhe2cUhPf7b6mQEfWjQtl4Luw5na5uVAKlvMISNXYMmHxuaQqyuhQye4xemkILNmQB_4YPXPkypu84m5l5w63AKVTaJ86Lj6rXV7g2gK2RmOkEXrdBHRsAyTZLOO1-HKhxNkYbJZrOJwEy7TbRotkzC6-vDX7bBcrJM4DZM02qZhvIq3Wx_QSXqYrrW73dd_YMj_AQ)\n", + "\n", + "\n", + "## Multitasking, Virtualization & Co\n", + "\n", + "Isolation enables multi-tasking and multiple users:\n", + "more people using the same computer at the same time.\n", + "\n", + "Virtualization goes a step further:\n", + "\n", + "- vCPU, vStorage\n", + "- virtualized kernels (Linux, Windows, ..)\n", + "- processes are executed by virtualized kernels\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNptUlFr2zAQ_itC0Kc5wbGbONFbWQaBtWV028usPSjWpRa2JCPJTrKQ_Pae7bSjtOAPn-777tOdpBMtrATK6LMTTUnun7jhpqiF92vYkeCEJz44WwEz1kBP-nY7aqt8c2zAdcpb95ebTjPG-gJu6m5Sd3nFMYnQCPy-jL8aoRDbK9vHDhHQogJnoM43uLQI36cR3xFwlZlr3NuQ0XEntmwnJrUy7QFNwMh3bZb7nGBaKgdFUNYMMxZNm3_98Xuo7ou1KpwtStWg0gmdP909_OdAW3dEwgfrxDPkm_UbV0qJhIGQP0IgYw5C2c8RPuml05_0YsKkyh_R8te7efbKSLv3KK-Rv78eVS9oEYePg9_ckN6KXC4XgiVvu3eaDLmRKffc0IhqcFooiRd_woMknGLTGjhlGErYibYOnHJzRmnbSBHgm1Q4PsUbbiGiog3259EUr-tRs1YC59QUu6o9Zhth_lirX0W4pOxED5Rl2TRN4yTJ4mwxSzCI6JGyJI2nWZols1WymMW3yWp5jui_wSCeLpZpMp-ns9tlslgt5mlEYejoYXy-wys-vwD1sf5s?type=png)](https://mermaid.live/edit#pako:eNptUlFr2zAQ_itC0Kc5wbGbONFbWQaBtWV028usPSjWpRa2JCPJTrKQ_Pae7bSjtOAPn-777tOdpBMtrATK6LMTTUnun7jhpqiF92vYkeCEJz44WwEz1kBP-nY7aqt8c2zAdcpb95ebTjPG-gJu6m5Sd3nFMYnQCPy-jL8aoRDbK9vHDhHQogJnoM43uLQI36cR3xFwlZlr3NuQ0XEntmwnJrUy7QFNwMh3bZb7nGBaKgdFUNYMMxZNm3_98Xuo7ou1KpwtStWg0gmdP909_OdAW3dEwgfrxDPkm_UbV0qJhIGQP0IgYw5C2c8RPuml05_0YsKkyh_R8te7efbKSLv3KK-Rv78eVS9oEYePg9_ckN6KXC4XgiVvu3eaDLmRKffc0IhqcFooiRd_woMknGLTGjhlGErYibYOnHJzRmnbSBHgm1Q4PsUbbiGiog3259EUr-tRs1YC59QUu6o9Zhth_lirX0W4pOxED5Rl2TRN4yTJ4mwxSzCI6JGyJI2nWZols1WymMW3yWp5jui_wSCeLpZpMp-ns9tlslgt5mlEYejoYXy-wys-vwD1sf5s)" + ] + }, + { + "cell_type": "markdown", + "id": "e80c73c7", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "Every virtualized kernel manages virtual resources\n", + "believing they are physical.\n", + "\n", + "Every virtual machine \"lives\" in a process!\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNqNVE2PmzAQ_SvIh15KogQ2IaGnqqkUqburatteintw8LBYGBvZhiSNNr99B-ejTZWoCzxr8Mx4Zp7H3pFccyApeTasKYP7J6qoyiWzdgFF4AyzgXVGV5AqraBX2nZ1sK2y5bYB0wmrzS-qujpN096BKtkNZEdVBUaBzJaUKo2wCIf4ggCEQaijLBEBAr-CrdKCDaRQ7QaXBcUvovq1swA1yg2qgckoQVd8Cta71VBrsw3eqZVtPvw9nvQiNzovRfMmp1sjZkQwAzmQtxL4J9obov_Xw4c8FB3s93tkAt-D1OcR9Lzjm1VdHbwPpFh1wrgrDJZrTx8XBnIntPKbnjdt9unrD8__RVy0NKzOnj4-_NH5hFFhnTbsGbLl4qwrOe-zBJc9gjvWAK7sO-FaLl19JZe-xuwRl_x-0RFrobheW897ld2jQhw7qEVsbrYO0uFZqvxYri863AA_NTiKYSGkPHb62UTpVXCeDy9Og7c5bgSaUUVCUoOpmeB4pHb9LlOC1ddASYoih4K10vUd84KmbcOZg89cII8Ez04LIWGt09-2KidYibRwMloIhozV59mGqZ9a1ycv_CXpjmxImiTDOB5FUTJKpuMIhZBsSRrFo2ESJ9F4Hk3Ho7toPnsJyW-_wGg4ncXRZBKP72bRdD6doAf4lB4ON4O_IF5eAbnjeP4?type=png)](https://mermaid.live/edit#pako:eNqNVE2PmzAQ_SvIh15KogQ2IaGnqqkUqburatteintw8LBYGBvZhiSNNr99B-ejTZWoCzxr8Mx4Zp7H3pFccyApeTasKYP7J6qoyiWzdgFF4AyzgXVGV5AqraBX2nZ1sK2y5bYB0wmrzS-qujpN096BKtkNZEdVBUaBzJaUKo2wCIf4ggCEQaijLBEBAr-CrdKCDaRQ7QaXBcUvovq1swA1yg2qgckoQVd8Cta71VBrsw3eqZVtPvw9nvQiNzovRfMmp1sjZkQwAzmQtxL4J9obov_Xw4c8FB3s93tkAt-D1OcR9Lzjm1VdHbwPpFh1wrgrDJZrTx8XBnIntPKbnjdt9unrD8__RVy0NKzOnj4-_NH5hFFhnTbsGbLl4qwrOe-zBJc9gjvWAK7sO-FaLl19JZe-xuwRl_x-0RFrobheW897ld2jQhw7qEVsbrYO0uFZqvxYri863AA_NTiKYSGkPHb62UTpVXCeDy9Og7c5bgSaUUVCUoOpmeB4pHb9LlOC1ddASYoih4K10vUd84KmbcOZg89cII8Ez04LIWGt09-2KidYibRwMloIhozV59mGqZ9a1ycv_CXpjmxImiTDOB5FUTJKpuMIhZBsSRrFo2ESJ9F4Hk3Ho7toPnsJyW-_wGg4ncXRZBKP72bRdD6doAf4lB4ON4O_IF5eAbnjeP4)" + ] + }, + { + "cell_type": "markdown", + "id": "3ac5a5f6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "You can check if your CPU supports virtualization" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c7a4b460", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "egrep 'vmx|svm' /proc/cpuinfo" + ] + }, + { + "cell_type": "markdown", + "id": "f8913afc", + "metadata": {}, + "source": [ + "Virtualization is not cheap.\n", + "There is a lot of communication going on,\n", + "and some instructions need to be serialized\n", + "and conveyed over the network." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5ebb2ab", + "metadata": { + "attributes": { + "classes": [ + "mermaid" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "---\n", + "title: libvirt architecture\n", + "---\n", + "graph LR\n", + "\n", + "client <--> api\n", + "\n", + "subgraph api[public API]\n", + "remote\n", + "end\n", + "\n", + "subgraph Node\n", + "libvirtd\n", + "libvirt-qemu\n", + "guest\n", + "end\n", + "\n", + "subgraph guest\n", + "guest-agent\n", + "end\n", + "\n", + "api <-->|RPC\\nURI| libvirtd <--> libvirt-qemu\n", + "\n", + "libvirt-qemu <-->|monitor| guest\n", + "libvirt-qemu -->|qemu-kvm| guest\n", + "libvirt-qemu <-->|agent\\nmonitor| guest-agent\n" + ] + }, + { + "cell_type": "markdown", + "id": "a2ebba3c", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Containerization\n", + "\n", + "Containerization is a way to isolate processes\n", + "without different kernels.\n", + "\n", + "It is enabled by the isolation features that the Linux kernel provided\n", + "over time.\n", + "\n", + "- chroot: changes the root directory confing applications to see a different filesystem hierarchy (1979)\n", + "- capabilities: restrict user privileges (1999)\n", + "- SELinux: defines access control policies for kernel resources (2000)\n", + "- namespaces: partition kernel resources, including networks and host names (2002)\n", + "- cgroups: limit and isolate resource usage (2008)" + ] + }, + { + "cell_type": "markdown", + "id": "082f3e17", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Docker simplifies containers\n", + "\n", + "Executes linux processes in an isolated environment\n", + "that **looks like** a virtual machine.\n", + "\n", + "Every container can have one or more IP addresses.\n", + "\n", + "Container's processes communicate directly with the host kernel." + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docker-101/notebooks/01-docker.ipynb b/docker-101/notebooks/01-docker.ipynb index 43084f5..c51e025 100644 --- a/docker-101/notebooks/01-docker.ipynb +++ b/docker-101/notebooks/01-docker.ipynb @@ -2,14 +2,10 @@ "cells": [ { "cell_type": "markdown", - "id": "df8eaaa1", + "id": "7195aa09", "metadata": {}, "source": [ - "# Docker 101\n", - "\n", - "This is a crash docker course.\n", - "\n", - "## What is?\n", + "# Docker 101 - Containerization as an application packaging mechanism.\n", "\n", "Docker is a platform for developers and sysadmins to develop,\n", "ship, and run applications." @@ -17,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "7c24c405", + "id": "115d48f2", "metadata": { "slideshow": { "slide_type": "slide" @@ -38,7 +34,7 @@ }, { "cell_type": "markdown", - "id": "f8686724", + "id": "ceeda20c", "metadata": { "slideshow": { "slide_type": "slide" @@ -58,7 +54,7 @@ }, { "cell_type": "markdown", - "id": "67787178", + "id": "15bdf4b2", "metadata": { "slideshow": { "slide_type": "slide" @@ -82,7 +78,7 @@ }, { "cell_type": "markdown", - "id": "180366bf", + "id": "585d7308", "metadata": { "slideshow": { "slide_type": "slide" @@ -108,7 +104,7 @@ }, { "cell_type": "markdown", - "id": "d3e37174", + "id": "29e7ebdc", "metadata": { "slideshow": { "slide_type": "slide" @@ -129,7 +125,7 @@ }, { "cell_type": "markdown", - "id": "5ef8df6c", + "id": "f36103dc", "metadata": { "slideshow": { "slide_type": "subslide" @@ -143,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "79749319", + "id": "de8bd11b", "metadata": { "slideshow": { "slide_type": "slide" @@ -169,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "b3df5e3e", + "id": "f29af929", "metadata": {}, "source": [ "---" From 1fb8bda87bdcd83adeefd5417216ef9f744ed1e8 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Wed, 26 Jul 2023 11:04:20 +0200 Subject: [PATCH 31/52] Remove old file. --- python-basic/README.md | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 python-basic/README.md diff --git a/python-basic/README.md b/python-basic/README.md deleted file mode 100644 index ddf70fb..0000000 --- a/python-basic/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Python Basic - -This is a python crash course. - -You can read it [here](http://nbviewer.ipython.org/github/ioggstream/python-course/tree/master/python-basic/notebooks/) -and use it: - - - via ipython - - via ipython notebook - -## Run - -Use tox - -```bash -pip install tox -tox -- run -``` From 29139d9cdc7085a032524e70ae0cf49850dacf32 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Wed, 26 Jul 2023 12:20:41 +0200 Subject: [PATCH 32/52] Editorial. --- docker-101/01-docker.md | 18 +- docker-101/notebooks/00-docker.ipynb | 36 +-- docker-101/notebooks/01-docker.ipynb | 37 +-- git-101/01-git.md | 67 ++++-- git-101/notebooks/01-git.ipynb | 338 +++++++++++++++------------ tools-101/intro.md | 6 +- tools-101/notebooks/intro.ipynb | 62 +++-- 7 files changed, 306 insertions(+), 258 deletions(-) diff --git a/docker-101/01-docker.md b/docker-101/01-docker.md index 3b50433..c79c187 100644 --- a/docker-101/01-docker.md +++ b/docker-101/01-docker.md @@ -1,20 +1,21 @@ -# Docker 101 - Containerization as an application packaging mechanism. +# Docker 101 - Containerization as an application packaging mechanism -Docker is a platform for developers and sysadmins to develop, +Docker is more than containers: +it is a platform for developers and sysadmins to develop, ship, and run applications. --- ## Why it was born? -To resolve a necessity - -Mobility workload in cloud systems +To resolve the needs of mobility workload in cloud systems - Cargo transport pre-1960 - Solution: Intermodal Shipping Container +[![Cargo ship](https://zegetech.com/assets/images/blog/docker/docker_ship.png)] + --- ### Docker is a Container System for Code @@ -59,18 +60,17 @@ They are lightweight and consume less resources than a virtual machine. ## Docker Concepts and Interactions -- **Host**, the machine that is running the containers. -- **Image**, a hierarchy of files, with meta-data for how to run a container. +- **Host**, the machine that runs the containers. +- **Image**, a hierarchy of files, with meta-data for running a container. - **Container**, a contained running process, started from an image. - **Registry**, a repository of images. - **Volume**, storage outside the container. -- **Dockerfile**, a script for creating images. +- **Dockerfile**, instruction for creating images. ---- [![](https://mermaid.ink/img/pako:eNptU8lu2zAQ_RWBZ8moZctVdOilKdAeekmBHirmMJLGFhMuAjkM6lr-91JbbCcBD3qjefM4G0-sNg2ygiVJwjUJklhE96Z-RhsJTWihJmG043okHCx0LddcO1-NOHrAg3Bkj-UDKkP4akd7qIo9JM2o9ci1WJec_VBwQBd8g6v2FTo-qM1ci00LtET6ymvyi_UEL7Dg7kit0ZwFVdTNTTrfjSOupwL2QmJ5gfOtM7xN7sVIr9CVv6fvTG2AoAKHgVAbTSA0WleWX1_xVSGPgSRNDTJUMXfkfbGXhIdzlVqSfOkrL2TTR7cigyfqCQ5vHdcpTaTaKCXoA4HBab3uo0vE2-hemdDsPpr78M7tCCzFjkwXWxyNWzWuh8aP1M67NgxVDMVf195fVmOiSfkxbRohi5lCq0A0YTlPXEcRZ9SiQs6KABvcg5fEGdfnQPVdmBV-awQZywqyHmMGnsyvo64Xe-LcCwiboli4ULrwtwP9xxi1kILJihP7y4p1lq-263SzyfI83WTp5zRmR1akd7vVLrvb5Vm-2W6zcM4x-zcqfFplMcMxh5_Toxrf1vk_Byk2hw?type=png)](https://mermaid.live/edit#pako:eNptU8lu2zAQ_RWBZ8moZctVdOilKdAeekmBHirmMJLGFhMuAjkM6lr-91JbbCcBD3qjefM4G0-sNg2ygiVJwjUJklhE96Z-RhsJTWihJmG043okHCx0LddcO1-NOHrAg3Bkj-UDKkP4akd7qIo9JM2o9ci1WJec_VBwQBd8g6v2FTo-qM1ci00LtET6ymvyi_UEL7Dg7kit0ZwFVdTNTTrfjSOupwL2QmJ5gfOtM7xN7sVIr9CVv6fvTG2AoAKHgVAbTSA0WleWX1_xVSGPgSRNDTJUMXfkfbGXhIdzlVqSfOkrL2TTR7cigyfqCQ5vHdcpTaTaKCXoA4HBab3uo0vE2-hemdDsPpr78M7tCCzFjkwXWxyNWzWuh8aP1M67NgxVDMVf195fVmOiSfkxbRohi5lCq0A0YTlPXEcRZ9SiQs6KABvcg5fEGdfnQPVdmBV-awQZywqyHmMGnsyvo64Xe-LcCwiboli4ULrwtwP9xxi1kILJihP7y4p1lq-263SzyfI83WTp5zRmR1akd7vVLrvb5Vm-2W6zcM4x-zcqfFplMcMxh5_Toxrf1vk_Byk2hw) - --- ## Separation of concerns diff --git a/docker-101/notebooks/00-docker.ipynb b/docker-101/notebooks/00-docker.ipynb index eb0652e..e604d85 100644 --- a/docker-101/notebooks/00-docker.ipynb +++ b/docker-101/notebooks/00-docker.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "149f3af7", + "id": "f7aabe8f", "metadata": {}, "source": [ "# Docker 101\n", @@ -22,7 +22,7 @@ }, { "cell_type": "markdown", - "id": "2170a758", + "id": "acd7bd45", "metadata": { "slideshow": { "slide_type": "slide" @@ -43,7 +43,7 @@ }, { "cell_type": "markdown", - "id": "78fe2cd5", + "id": "0d0237bc", "metadata": { "slideshow": { "slide_type": "slide" @@ -68,7 +68,7 @@ }, { "cell_type": "markdown", - "id": "cd2a332a", + "id": "4c524d17", "metadata": { "slideshow": { "slide_type": "slide" @@ -94,7 +94,7 @@ }, { "cell_type": "markdown", - "id": "d0a9c750", + "id": "43666b39", "metadata": { "slideshow": { "slide_type": "slide" @@ -111,7 +111,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2eebd856", + "id": "58813363", "metadata": {}, "outputs": [], "source": [ @@ -122,7 +122,7 @@ }, { "cell_type": "markdown", - "id": "c79b7d5a", + "id": "afd2d81d", "metadata": {}, "source": [ "These resources are retrieved from the `/proc/$PID/stat` and other files." @@ -131,7 +131,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7073a441", + "id": "62a71dda", "metadata": {}, "outputs": [], "source": [ @@ -141,7 +141,7 @@ }, { "cell_type": "markdown", - "id": "b215b5e2", + "id": "a889045b", "metadata": { "slideshow": { "slide_type": "slide" @@ -161,7 +161,7 @@ }, { "cell_type": "markdown", - "id": "0a2370d6", + "id": "4f578fc1", "metadata": {}, "source": [ "--\n", @@ -173,7 +173,7 @@ }, { "cell_type": "markdown", - "id": "3a9d1b96", + "id": "6f0da10b", "metadata": { "slideshow": { "slide_type": "slide" @@ -203,7 +203,7 @@ }, { "cell_type": "markdown", - "id": "e80c73c7", + "id": "c2acab57", "metadata": { "slideshow": { "slide_type": "slide" @@ -222,7 +222,7 @@ }, { "cell_type": "markdown", - "id": "3ac5a5f6", + "id": "0ab64c7c", "metadata": { "slideshow": { "slide_type": "slide" @@ -237,7 +237,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c7a4b460", + "id": "280602dc", "metadata": {}, "outputs": [], "source": [ @@ -247,7 +247,7 @@ }, { "cell_type": "markdown", - "id": "f8913afc", + "id": "622707c9", "metadata": {}, "source": [ "Virtualization is not cheap.\n", @@ -259,7 +259,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c5ebb2ab", + "id": "cf5be40f", "metadata": { "attributes": { "classes": [ @@ -300,7 +300,7 @@ }, { "cell_type": "markdown", - "id": "a2ebba3c", + "id": "a3e14b29", "metadata": { "slideshow": { "slide_type": "slide" @@ -326,7 +326,7 @@ }, { "cell_type": "markdown", - "id": "082f3e17", + "id": "8488a5fa", "metadata": { "slideshow": { "slide_type": "slide" diff --git a/docker-101/notebooks/01-docker.ipynb b/docker-101/notebooks/01-docker.ipynb index c51e025..ac78887 100644 --- a/docker-101/notebooks/01-docker.ipynb +++ b/docker-101/notebooks/01-docker.ipynb @@ -2,18 +2,19 @@ "cells": [ { "cell_type": "markdown", - "id": "7195aa09", + "id": "0ffe1b13", "metadata": {}, "source": [ - "# Docker 101 - Containerization as an application packaging mechanism.\n", + "# Docker 101 - Containerization as an application packaging mechanism\n", "\n", - "Docker is a platform for developers and sysadmins to develop,\n", + "Docker is more than containers:\n", + "it is a platform for developers and sysadmins to develop,\n", "ship, and run applications." ] }, { "cell_type": "markdown", - "id": "115d48f2", + "id": "3b5e5743", "metadata": { "slideshow": { "slide_type": "slide" @@ -24,17 +25,17 @@ "\n", "## Why it was born?\n", "\n", - "To resolve a necessity\n", - "\n", - "Mobility workload in cloud systems\n", + "To resolve the needs of mobility workload in cloud systems\n", "\n", "- Cargo transport pre-1960\n", - "- Solution: Intermodal Shipping Container" + "- Solution: Intermodal Shipping Container\n", + "\n", + "[![Cargo ship](https://zegetech.com/assets/images/blog/docker/docker_ship.png)]" ] }, { "cell_type": "markdown", - "id": "ceeda20c", + "id": "13a8185c", "metadata": { "slideshow": { "slide_type": "slide" @@ -54,7 +55,7 @@ }, { "cell_type": "markdown", - "id": "15bdf4b2", + "id": "644ef255", "metadata": { "slideshow": { "slide_type": "slide" @@ -78,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "585d7308", + "id": "757c9094", "metadata": { "slideshow": { "slide_type": "slide" @@ -104,7 +105,7 @@ }, { "cell_type": "markdown", - "id": "29e7ebdc", + "id": "ffdb9b93", "metadata": { "slideshow": { "slide_type": "slide" @@ -115,17 +116,17 @@ "\n", "## Docker Concepts and Interactions\n", "\n", - "- **Host**, the machine that is running the containers.\n", - "- **Image**, a hierarchy of files, with meta-data for how to run a container.\n", + "- **Host**, the machine that runs the containers.\n", + "- **Image**, a hierarchy of files, with meta-data for running a container.\n", "- **Container**, a contained running process, started from an image.\n", "- **Registry**, a repository of images.\n", "- **Volume**, storage outside the container.\n", - "- **Dockerfile**, a script for creating images." + "- **Dockerfile**, instruction for creating images." ] }, { "cell_type": "markdown", - "id": "f36103dc", + "id": "3b9e15a5", "metadata": { "slideshow": { "slide_type": "subslide" @@ -139,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "de8bd11b", + "id": "3f8d802a", "metadata": { "slideshow": { "slide_type": "slide" @@ -165,7 +166,7 @@ }, { "cell_type": "markdown", - "id": "f29af929", + "id": "1c0a5404", "metadata": {}, "source": [ "---" diff --git a/git-101/01-git.md b/git-101/01-git.md index ba77430..856956b 100644 --- a/git-101/01-git.md +++ b/git-101/01-git.md @@ -9,6 +9,8 @@ *Beware*: commands contain small typos. You must fix them to properly complete the course! +--- + ## VCS The importance of tracking changes. @@ -27,27 +29,36 @@ VCS basics: Track modifications of our config files without messing with the real /etc. -``` +```python !mkdir -p /repo-path !cp -v /etc/host* /etc/s* /repo-path ``` All operations are local to /repo-path -``` +```python cd /repo-path ``` Always timestamp backup copies, don't `.ori`. -``` +```python ! SIMPLE_BACKUP_SUFFIX="$(date -I)" cp -v -bf hosts hosts !ls -l hosts* ``` -Exercise: Use `date +%s` to timestamp a backup copy of `hosts`. +Exercise: -``` +- what happens if you run the `cp -v -bf hosts hosts` command again? + +- use `date +%s` to timestamp a backup copy of `hosts` + + +```python # Use this cell for the exercise. ``` @@ -95,8 +106,10 @@ Track modifications with `git` - run it ``` -# Write here the command -# and show the git config file. +# Write the command here. + + +# Then, show the git config file. !cat .git/config ``` @@ -112,12 +125,12 @@ are a lot of files we are not interested in... `.gitignore` lists the files we're not interested in ``` -# Ignore all files not starting with h +# Ignore all files not starting with "h" !echo "[^h]*" >> .gitignore !git status ``` -Now we have all `host*` files to be tracked. +Now we trace all `host*` files! --- @@ -176,7 +189,7 @@ Now we have an history with two changes, containing: - commit messages - a commit hash -HEAD is the last commit. +`HEAD` is a shorthand for the last commit. ``` !git log @@ -191,7 +204,9 @@ HEAD is the last commit. We can revert a change using the hash or an history log ``` -!git checkout HEAD~1 -- hosts # revert hosts to the previous commit +# revert the "hosts" file +# to the previous commit +!git checkout HEAD~1 -- hosts ``` --- @@ -233,26 +248,30 @@ Now some git commands, but first create a dir. --- ``` -!git log /repo-path/file.txt # show changes +# show changes +!git log /repo-path/file.txt ``` ``` -!git checkout HEAD~1 -- file.txt # revert file +# revert file +!git checkout HEAD~1 -- file.txt ``` ``` -!git diff HEAD # diff with reverted +# diff with the reverted file +!git diff HEAD ``` ``` -!git checkout HEAD -- . # get *all files* from the latest commit +# get *all files* from the latest commit +!git checkout HEAD -- . ``` --- ## Tags & Branches -Writing codes and configuration we may want to follow +When writing code and configuration we may want to follow different strategies and save our different attempts. - *tag* makes an unmodifiable snapshot of the repo instead. @@ -283,7 +302,7 @@ Create a branch !git checkout -b work-on-my-changes ``` -And list the branches, check the active one! +List the branches again, check the active one! ``` !git branch -a @@ -338,7 +357,7 @@ And switch back ### Exercise -- Create a new branch named `antani` +- Create a new branch named `foobar` - modify `new-file.txt` as you please - [open a terminal](/terminals/git), and use `git add -p` to stage the changes. What does it do? - commit the changes @@ -352,7 +371,7 @@ And switch back ## Checkout troubleshooting If you change a file, git won't make you checkout -to avoid missing changes. +to avoid overwriting unsaved changes. ``` !date >> new-file.txt @@ -388,8 +407,6 @@ And finally merge !git merge work-on-my-changes ``` ---- - After a merge, if the branch is no more useful, we can remove it. Note: before deleting a branch, you can double-check available branches with `git branch -a`. @@ -402,7 +419,7 @@ If there are unmerged changes, git doesn't allow deleting a branch. Exercise: -- use `git branch -d` to remove the `antani` branch +- use `git branch -d` to remove the `foobar` branch - what happens? - replace `-d` with `-D`. Does it work now? @@ -415,10 +432,10 @@ Exercise: ## Selective adding -You can stage partial changes with: +Using an interactive [terminal](/terminals/git-partial) you can stage partial changes with: -``` -!git add -p +```text +git add -p ``` --- diff --git a/git-101/notebooks/01-git.ipynb b/git-101/notebooks/01-git.ipynb index cd265cf..1925d8b 100644 --- a/git-101/notebooks/01-git.ipynb +++ b/git-101/notebooks/01-git.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "7f120a0a", + "id": "61a3bfca", "metadata": {}, "source": [ "# Git - simple repository management\n", @@ -14,7 +14,19 @@ "- using a local git repository\n", "- remote repositories\n", "\n", - "*Beware*: commands contain small typos. You must fix them to properly complete the course!\n", + "*Beware*: commands contain small typos. You must fix them to properly complete the course!" + ] + }, + { + "cell_type": "markdown", + "id": "45d099d7", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", "\n", "## VCS\n", "\n", @@ -30,7 +42,7 @@ }, { "cell_type": "markdown", - "id": "c4538aef", + "id": "77b54503", "metadata": { "slideshow": { "slide_type": "slide" @@ -48,7 +60,7 @@ { "cell_type": "code", "execution_count": null, - "id": "700a7a3a", + "id": "7d513d13", "metadata": {}, "outputs": [], "source": [ @@ -58,7 +70,7 @@ }, { "cell_type": "markdown", - "id": "9d560d87", + "id": "89430564", "metadata": {}, "source": [ "All operations are local to /repo-path" @@ -67,7 +79,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4e7bc3b2", + "id": "8b9a05b3", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +88,7 @@ }, { "cell_type": "markdown", - "id": "99c3bcd9", + "id": "b2492e7c", "metadata": {}, "source": [ "Always timestamp backup copies, don't `.ori`." @@ -85,7 +97,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cd27bc4d", + "id": "a814e710", "metadata": {}, "outputs": [], "source": [ @@ -95,16 +107,25 @@ }, { "cell_type": "markdown", - "id": "d6cd9236", + "id": "232e9cec", "metadata": {}, "source": [ - "Exercise: Use `date +%s` to timestamp a backup copy of `hosts`." + "Exercise:\n", + "\n", + "- what happens if you run the `cp -v -bf hosts hosts` command again?\n", + "\n", + "- use `date +%s` to timestamp a backup copy of `hosts`\n", + "" ] }, { "cell_type": "code", "execution_count": null, - "id": "000235a9", + "id": "87a3a8a5", "metadata": {}, "outputs": [], "source": [ @@ -113,7 +134,7 @@ }, { "cell_type": "markdown", - "id": "01f6ef62", + "id": "95a26541", "metadata": { "slideshow": { "slide_type": "slide" @@ -135,7 +156,7 @@ }, { "cell_type": "markdown", - "id": "4786f164", + "id": "0c54d7ad", "metadata": { "slideshow": { "slide_type": "slide" @@ -153,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7319e718", + "id": "49224870", "metadata": {}, "outputs": [], "source": [ @@ -163,7 +184,7 @@ }, { "cell_type": "markdown", - "id": "8d9e2062", + "id": "a035a594", "metadata": {}, "source": [ "Note: authentication can not be enforced on a local repository." @@ -171,7 +192,7 @@ }, { "cell_type": "markdown", - "id": "6051c86d", + "id": "0b40ecf4", "metadata": { "slideshow": { "slide_type": "slide" @@ -188,7 +209,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fdf04eb4", + "id": "cafd12f0", "metadata": {}, "outputs": [], "source": [ @@ -198,7 +219,7 @@ }, { "cell_type": "markdown", - "id": "b8c78e39", + "id": "77f33c07", "metadata": {}, "source": [ "### Exercise\n", @@ -211,18 +232,20 @@ { "cell_type": "code", "execution_count": null, - "id": "69557bf0", + "id": "fba7629a", "metadata": {}, "outputs": [], "source": [ - "# Write here the command\n", - "# and show the git config file.\n", + "# Write the command here.\n", + "\n", + "\n", + "# Then, show the git config file.\n", "!cat .git/config" ] }, { "cell_type": "markdown", - "id": "a981eecc", + "id": "8b3e351e", "metadata": { "slideshow": { "slide_type": "slide" @@ -238,7 +261,7 @@ { "cell_type": "code", "execution_count": null, - "id": "29a73ba6", + "id": "0ac06e94", "metadata": {}, "outputs": [], "source": [ @@ -247,7 +270,7 @@ }, { "cell_type": "markdown", - "id": "d9e41818", + "id": "648e6ad5", "metadata": {}, "source": [ "`.gitignore` lists the files we're not interested in" @@ -256,26 +279,26 @@ { "cell_type": "code", "execution_count": null, - "id": "7e24aaf6", + "id": "9a16d864", "metadata": {}, "outputs": [], "source": [ - "# Ignore all files not starting with h\n", + "# Ignore all files not starting with \"h\"\n", "!echo \"[^h]*\" >> .gitignore\n", "!git status" ] }, { "cell_type": "markdown", - "id": "c0463059", + "id": "d7df661a", "metadata": {}, "source": [ - "Now we have all `host*` files to be tracked." + "Now we trace all `host*` files!" ] }, { "cell_type": "markdown", - "id": "93276090", + "id": "f3cb93f9", "metadata": { "slideshow": { "slide_type": "slide" @@ -292,7 +315,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ba250a13", + "id": "58b01ddc", "metadata": {}, "outputs": [], "source": [ @@ -301,7 +324,7 @@ }, { "cell_type": "markdown", - "id": "7fdde7cd", + "id": "4f6287a3", "metadata": {}, "source": [ "The file is now *staged* for commit. It's not archived though." @@ -310,7 +333,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4a45be06", + "id": "03cde4e6", "metadata": {}, "outputs": [], "source": [ @@ -319,7 +342,7 @@ }, { "cell_type": "markdown", - "id": "ced6d9a3", + "id": "50e38730", "metadata": {}, "source": [ "Save files to the local index" @@ -328,7 +351,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2246b5da", + "id": "d2c7b1d0", "metadata": {}, "outputs": [], "source": [ @@ -337,7 +360,7 @@ }, { "cell_type": "markdown", - "id": "e40f0406", + "id": "e0b0233d", "metadata": {}, "source": [ "![Git areas](https://git-scm.com/images/about/index1@2x.png)" @@ -345,7 +368,7 @@ }, { "cell_type": "markdown", - "id": "5c47fc45", + "id": "ca800655", "metadata": { "slideshow": { "slide_type": "slide" @@ -362,7 +385,7 @@ { "cell_type": "code", "execution_count": null, - "id": "61a489ee", + "id": "a3a832c9", "metadata": {}, "outputs": [], "source": [ @@ -372,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "7b3d7ccc", + "id": "2b92dffe", "metadata": {}, "source": [ "If we like the changes, we can stage them" @@ -381,7 +404,7 @@ { "cell_type": "code", "execution_count": null, - "id": "89f6d0d0", + "id": "640f3472", "metadata": {}, "outputs": [], "source": [ @@ -391,7 +414,7 @@ }, { "cell_type": "markdown", - "id": "4f57b9e5", + "id": "419b85ce", "metadata": {}, "source": [ "and finally save them in the repo." @@ -400,7 +423,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0b48ff38", + "id": "6ec39a6f", "metadata": {}, "outputs": [], "source": [ @@ -409,7 +432,7 @@ }, { "cell_type": "markdown", - "id": "75973a82", + "id": "9d47d497", "metadata": { "slideshow": { "slide_type": "slide" @@ -425,13 +448,13 @@ "- commit messages\n", "- a commit hash\n", "\n", - "HEAD is the last commit." + "`HEAD` is a shorthand for the last commit." ] }, { "cell_type": "code", "execution_count": null, - "id": "b1a64497", + "id": "b9178f4b", "metadata": {}, "outputs": [], "source": [ @@ -440,7 +463,7 @@ }, { "cell_type": "markdown", - "id": "42aad7f8", + "id": "e0b320dc", "metadata": {}, "source": [ "![Basic branch](https://git-scm.com/figures/18333fig0310-tn.png)" @@ -448,7 +471,7 @@ }, { "cell_type": "markdown", - "id": "f45574e8", + "id": "4dcafd72", "metadata": { "slideshow": { "slide_type": "slide" @@ -465,16 +488,18 @@ { "cell_type": "code", "execution_count": null, - "id": "ec0651ef", + "id": "c4ff84f1", "metadata": {}, "outputs": [], "source": [ - "!git checkout HEAD~1 -- hosts # revert hosts to the previous commit" + "# revert the \"hosts\" file\n", + "# to the previous commit\n", + "!git checkout HEAD~1 -- hosts" ] }, { "cell_type": "markdown", - "id": "96eba2fc", + "id": "3111f925", "metadata": { "slideshow": { "slide_type": "slide" @@ -491,7 +516,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c7f5263e", + "id": "5909beea", "metadata": {}, "outputs": [], "source": [ @@ -502,7 +527,7 @@ }, { "cell_type": "markdown", - "id": "1b486c01", + "id": "920ca2b4", "metadata": {}, "source": [ "---" @@ -511,7 +536,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d625983f", + "id": "e01ac680", "metadata": {}, "outputs": [], "source": [ @@ -522,7 +547,7 @@ }, { "cell_type": "markdown", - "id": "12c36cb1", + "id": "82ae79fe", "metadata": {}, "source": [ "### Exercise\n", @@ -533,7 +558,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f2875a20", + "id": "6d3c9442", "metadata": {}, "outputs": [], "source": [ @@ -542,7 +567,7 @@ }, { "cell_type": "markdown", - "id": "176dabc2", + "id": "60cfa8c0", "metadata": {}, "source": [ "---" @@ -551,7 +576,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2786502f", + "id": "e72b017e", "metadata": {}, "outputs": [], "source": [ @@ -562,7 +587,7 @@ }, { "cell_type": "markdown", - "id": "5e605932", + "id": "7a686d7c", "metadata": {}, "source": [ "---" @@ -571,46 +596,50 @@ { "cell_type": "code", "execution_count": null, - "id": "f3aa8b5d", + "id": "96169b79", "metadata": {}, "outputs": [], "source": [ - "!git log /repo-path/file.txt # show changes" + "# show changes\n", + "!git log /repo-path/file.txt" ] }, { "cell_type": "code", "execution_count": null, - "id": "809cb347", + "id": "654b2a21", "metadata": {}, "outputs": [], "source": [ - "!git checkout HEAD~1 -- file.txt # revert file" + "# revert file\n", + "!git checkout HEAD~1 -- file.txt" ] }, { "cell_type": "code", "execution_count": null, - "id": "5f408bf2", + "id": "67c4d4ba", "metadata": {}, "outputs": [], "source": [ - "!git diff HEAD # diff with reverted" + "# diff with the reverted file\n", + "!git diff HEAD" ] }, { "cell_type": "code", "execution_count": null, - "id": "51681f21", + "id": "62d59644", "metadata": {}, "outputs": [], "source": [ - "!git checkout HEAD -- . # get *all files* from the latest commit" + "# get *all files* from the latest commit\n", + "!git checkout HEAD -- ." ] }, { "cell_type": "markdown", - "id": "ff306b1d", + "id": "4a98625a", "metadata": { "slideshow": { "slide_type": "slide" @@ -621,7 +650,7 @@ "\n", "## Tags & Branches\n", "\n", - "Writing codes and configuration we may want to follow\n", + "When writing code and configuration we may want to follow\n", "different strategies and save our different attempts.\n", "\n", "- *tag* makes an unmodifiable snapshot of the repo instead." @@ -630,7 +659,7 @@ { "cell_type": "code", "execution_count": null, - "id": "effd478b", + "id": "462371dd", "metadata": {}, "outputs": [], "source": [ @@ -640,7 +669,7 @@ }, { "cell_type": "markdown", - "id": "4b05fced", + "id": "ea4a6801", "metadata": {}, "source": [ "- *branch* create a modifiable copy of the code, allowing\n", @@ -651,7 +680,7 @@ }, { "cell_type": "markdown", - "id": "65f48039", + "id": "3b15b5cf", "metadata": { "slideshow": { "slide_type": "slide" @@ -668,7 +697,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d0f52580", + "id": "e146c866", "metadata": {}, "outputs": [], "source": [ @@ -677,7 +706,7 @@ }, { "cell_type": "markdown", - "id": "440c9e9d", + "id": "1375b30e", "metadata": {}, "source": [ "Create a branch" @@ -686,7 +715,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1cbdaefc", + "id": "362ab51e", "metadata": {}, "outputs": [], "source": [ @@ -695,16 +724,16 @@ }, { "cell_type": "markdown", - "id": "15d4499e", + "id": "1efb0cb3", "metadata": {}, "source": [ - "And list the branches, check the active one!" + "List the branches again, check the active one!" ] }, { "cell_type": "code", "execution_count": null, - "id": "15b4fb9e", + "id": "11015f86", "metadata": {}, "outputs": [], "source": [ @@ -713,7 +742,7 @@ }, { "cell_type": "markdown", - "id": "7a767353", + "id": "92700250", "metadata": { "slideshow": { "slide_type": "slide" @@ -728,7 +757,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a4631b97", + "id": "107e3b9d", "metadata": {}, "outputs": [], "source": [ @@ -738,7 +767,7 @@ }, { "cell_type": "markdown", - "id": "38365710", + "id": "7774e258", "metadata": {}, "source": [ "With commit we consolidate the new file in the branch" @@ -747,7 +776,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0f8e151b", + "id": "e4a08718", "metadata": {}, "outputs": [], "source": [ @@ -756,7 +785,7 @@ }, { "cell_type": "markdown", - "id": "284b07da", + "id": "b794f588", "metadata": { "slideshow": { "slide_type": "slide" @@ -771,7 +800,7 @@ { "cell_type": "code", "execution_count": null, - "id": "64d828f6", + "id": "4626e833", "metadata": {}, "outputs": [], "source": [ @@ -780,7 +809,7 @@ }, { "cell_type": "markdown", - "id": "af639d85", + "id": "94295ac2", "metadata": {}, "source": [ "Diff supports some parameters" @@ -789,7 +818,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ce494335", + "id": "ef624d58", "metadata": {}, "outputs": [], "source": [ @@ -798,7 +827,7 @@ }, { "cell_type": "markdown", - "id": "ff806888", + "id": "01afa918", "metadata": { "slideshow": { "slide_type": "slide" @@ -813,7 +842,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f9fcf98f", + "id": "ce59dbd8", "metadata": {}, "outputs": [], "source": [ @@ -823,7 +852,7 @@ }, { "cell_type": "markdown", - "id": "8eceeeb6", + "id": "b6ea0767", "metadata": {}, "source": [ "And switch back" @@ -832,7 +861,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4a90452a", + "id": "4d73a154", "metadata": {}, "outputs": [], "source": [ @@ -842,7 +871,7 @@ }, { "cell_type": "markdown", - "id": "60f1a8f7", + "id": "95550e38", "metadata": { "slideshow": { "slide_type": "slide" @@ -853,7 +882,7 @@ "\n", "### Exercise\n", "\n", - "- Create a new branch named `antani`\n", + "- Create a new branch named `foobar`\n", "- modify `new-file.txt` as you please\n", "- [open a terminal](/terminals/git), and use `git add -p` to stage the changes. What does it do?\n", "- commit the changes" @@ -862,7 +891,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e2c7bd22", + "id": "a7f699a9", "metadata": {}, "outputs": [], "source": [ @@ -871,7 +900,7 @@ }, { "cell_type": "markdown", - "id": "1cd00765", + "id": "8f4c0860", "metadata": { "slideshow": { "slide_type": "slide" @@ -883,13 +912,13 @@ "## Checkout troubleshooting\n", "\n", "If you change a file, git won't make you checkout\n", - "to avoid missing changes." + "to avoid overwriting unsaved changes." ] }, { "cell_type": "code", "execution_count": null, - "id": "59e5a254", + "id": "bf3f5c71", "metadata": {}, "outputs": [], "source": [ @@ -899,7 +928,7 @@ }, { "cell_type": "markdown", - "id": "71da518c", + "id": "25f26a2e", "metadata": {}, "source": [ "You have to remove the changes or commit them (in another branch too)" @@ -908,7 +937,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e22fd009", + "id": "f3e93b06", "metadata": {}, "outputs": [], "source": [ @@ -917,7 +946,7 @@ }, { "cell_type": "markdown", - "id": "0b77d8f6", + "id": "fb89a405", "metadata": { "slideshow": { "slide_type": "slide" @@ -935,7 +964,7 @@ { "cell_type": "code", "execution_count": null, - "id": "770704f3", + "id": "988da588", "metadata": {}, "outputs": [], "source": [ @@ -944,7 +973,7 @@ }, { "cell_type": "markdown", - "id": "92138e82", + "id": "25d00022", "metadata": {}, "source": [ "Before merging, we have to check the differences" @@ -953,7 +982,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f91d8d41", + "id": "816f4fd7", "metadata": {}, "outputs": [], "source": [ @@ -962,7 +991,7 @@ }, { "cell_type": "markdown", - "id": "c3610538", + "id": "551398d1", "metadata": {}, "source": [ "And finally merge" @@ -971,7 +1000,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e64c822b", + "id": "44d149f1", "metadata": {}, "outputs": [], "source": [ @@ -980,15 +1009,9 @@ }, { "cell_type": "markdown", - "id": "a31db651", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "ff845c8f", + "metadata": {}, "source": [ - "---\n", - "\n", "After a merge, if the branch is no more useful, we can remove it.\n", "Note: before deleting a branch, you can double-check available\n", "branches with `git branch -a`." @@ -997,7 +1020,7 @@ { "cell_type": "code", "execution_count": null, - "id": "71b22af5", + "id": "216e8606", "metadata": {}, "outputs": [], "source": [ @@ -1006,14 +1029,14 @@ }, { "cell_type": "markdown", - "id": "3216d35a", + "id": "7c9fa183", "metadata": {}, "source": [ "If there are unmerged changes, git doesn't allow deleting a branch.\n", "\n", "Exercise:\n", "\n", - "- use `git branch -d` to remove the `antani` branch\n", + "- use `git branch -d` to remove the `foobar` branch\n", "- what happens?\n", "- replace `-d` with `-D`. Does it work now?" ] @@ -1021,7 +1044,7 @@ { "cell_type": "code", "execution_count": null, - "id": "762915dd", + "id": "b36f9a33", "metadata": {}, "outputs": [], "source": [ @@ -1030,7 +1053,7 @@ }, { "cell_type": "markdown", - "id": "869b3fda", + "id": "ea6ab016", "metadata": { "slideshow": { "slide_type": "slide" @@ -1041,22 +1064,29 @@ "\n", "## Selective adding\n", "\n", - "You can stage partial changes with:" + "Using an interactive [terminal](/terminals/git-partial) you can stage partial changes with:" ] }, { "cell_type": "code", "execution_count": null, - "id": "e49ff846", - "metadata": {}, + "id": "59cd9ed0", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, "outputs": [], "source": [ - "!git add -p" + "git add -p" ] }, { "cell_type": "markdown", - "id": "1ffb0b4b", + "id": "81c160e8", "metadata": { "slideshow": { "slide_type": "slide" @@ -1073,7 +1103,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e4db9adc", + "id": "68e9d429", "metadata": {}, "outputs": [], "source": [ @@ -1082,7 +1112,7 @@ }, { "cell_type": "markdown", - "id": "3f42676a", + "id": "b93f6e9e", "metadata": {}, "source": [ "Exercise:\n", @@ -1093,7 +1123,7 @@ { "cell_type": "code", "execution_count": null, - "id": "aaa4aac3", + "id": "657b5177", "metadata": {}, "outputs": [], "source": [ @@ -1102,7 +1132,7 @@ }, { "cell_type": "markdown", - "id": "5558113b", + "id": "c367c17d", "metadata": {}, "source": [ "Go to the correct directory now." @@ -1111,7 +1141,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2c80c152", + "id": "6821d4f8", "metadata": {}, "outputs": [], "source": [ @@ -1120,7 +1150,7 @@ }, { "cell_type": "markdown", - "id": "00d2f691", + "id": "71ff4c26", "metadata": { "slideshow": { "slide_type": "slide" @@ -1138,7 +1168,7 @@ { "cell_type": "code", "execution_count": null, - "id": "93194032", + "id": "a0209a8c", "metadata": {}, "outputs": [], "source": [ @@ -1147,7 +1177,7 @@ }, { "cell_type": "markdown", - "id": "7e364def", + "id": "9c01d650", "metadata": {}, "source": [ "Now enter in the repo directory" @@ -1156,7 +1186,7 @@ { "cell_type": "code", "execution_count": null, - "id": "908d6e35", + "id": "66963bf3", "metadata": {}, "outputs": [], "source": [ @@ -1165,7 +1195,7 @@ }, { "cell_type": "markdown", - "id": "f67f6120", + "id": "840eb376", "metadata": {}, "source": [ "Show repository configuration. Which is the remote origin?" @@ -1174,7 +1204,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9d125c4b", + "id": "f79866fe", "metadata": {}, "outputs": [], "source": [ @@ -1183,7 +1213,7 @@ }, { "cell_type": "markdown", - "id": "74dccdd3", + "id": "ec7e864d", "metadata": {}, "source": [ "The remote repo is retrieved with all its changes and history" @@ -1192,7 +1222,7 @@ { "cell_type": "code", "execution_count": null, - "id": "72d8a61c", + "id": "d3b9d69f", "metadata": {}, "outputs": [], "source": [ @@ -1201,7 +1231,7 @@ }, { "cell_type": "markdown", - "id": "ce9dc27b", + "id": "496bc04e", "metadata": {}, "source": [ "And `log` can show branches and merges." @@ -1210,7 +1240,7 @@ { "cell_type": "code", "execution_count": null, - "id": "99152bbc", + "id": "5322c826", "metadata": {}, "outputs": [], "source": [ @@ -1219,7 +1249,7 @@ }, { "cell_type": "markdown", - "id": "da3f94c6", + "id": "b9055667", "metadata": { "slideshow": { "slide_type": "slide" @@ -1237,7 +1267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "172e28c4", + "id": "8b157cce", "metadata": {}, "outputs": [], "source": [ @@ -1246,7 +1276,7 @@ }, { "cell_type": "markdown", - "id": "5142954c", + "id": "07e8235e", "metadata": {}, "source": [ "Now move to the new directory" @@ -1255,7 +1285,7 @@ { "cell_type": "code", "execution_count": null, - "id": "024280c5", + "id": "26de2f34", "metadata": {}, "outputs": [], "source": [ @@ -1264,7 +1294,7 @@ }, { "cell_type": "markdown", - "id": "99ee299e", + "id": "9f4cb9b9", "metadata": {}, "source": [ "Show repository configuration. Which is the remote origin?" @@ -1273,7 +1303,7 @@ { "cell_type": "code", "execution_count": null, - "id": "505037a8", + "id": "9cee008f", "metadata": {}, "outputs": [], "source": [ @@ -1282,7 +1312,7 @@ }, { "cell_type": "markdown", - "id": "22ce0715", + "id": "78a7e81f", "metadata": { "slideshow": { "slide_type": "slide" @@ -1304,7 +1334,7 @@ { "cell_type": "code", "execution_count": null, - "id": "42505c18", + "id": "eea299f9", "metadata": {}, "outputs": [], "source": [ @@ -1313,7 +1343,7 @@ }, { "cell_type": "markdown", - "id": "73ce1851", + "id": "e37f4e49", "metadata": {}, "source": [ "Now that your changes are on your local repo, you can synchronize / upload them to the remote copy\n", @@ -1323,7 +1353,7 @@ { "cell_type": "code", "execution_count": null, - "id": "420e52e1", + "id": "23dfa380", "metadata": {}, "outputs": [], "source": [ @@ -1332,7 +1362,7 @@ }, { "cell_type": "markdown", - "id": "af356259", + "id": "10786c4e", "metadata": {}, "source": [ "Remember:\n", @@ -1348,7 +1378,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f1cc68b6", + "id": "f33a14ea", "metadata": {}, "outputs": [], "source": [ @@ -1357,7 +1387,7 @@ }, { "cell_type": "markdown", - "id": "3d948893", + "id": "7a4005eb", "metadata": {}, "source": [ "Check the differences" @@ -1366,7 +1396,7 @@ { "cell_type": "code", "execution_count": null, - "id": "62cdee76", + "id": "65f8afcc", "metadata": {}, "outputs": [], "source": [ @@ -1375,7 +1405,7 @@ }, { "cell_type": "markdown", - "id": "0b3bf0a4", + "id": "f7709b9f", "metadata": {}, "source": [ "And finally merge" @@ -1384,7 +1414,7 @@ { "cell_type": "code", "execution_count": null, - "id": "583a589e", + "id": "5fe9627b", "metadata": {}, "outputs": [], "source": [ @@ -1393,7 +1423,7 @@ }, { "cell_type": "markdown", - "id": "bc785752", + "id": "affb4021", "metadata": {}, "source": [ "Exercise:\n", @@ -1408,7 +1438,7 @@ { "cell_type": "code", "execution_count": null, - "id": "81dfa372", + "id": "f9befedb", "metadata": {}, "outputs": [], "source": [ @@ -1417,7 +1447,7 @@ }, { "cell_type": "markdown", - "id": "a65f7a63", + "id": "aa483f7a", "metadata": {}, "source": [ "To make it work, you need to be authenticated/authorized with the remote repo ;)" diff --git a/tools-101/intro.md b/tools-101/intro.md index 71ceddc..9cfbc85 100644 --- a/tools-101/intro.md +++ b/tools-101/intro.md @@ -120,10 +120,14 @@ like this one. They will appear as ``. - --- diff --git a/tools-101/notebooks/intro.ipynb b/tools-101/notebooks/intro.ipynb index 7c8658e..72c8e79 100644 --- a/tools-101/notebooks/intro.ipynb +++ b/tools-101/notebooks/intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "ff2225e4", + "id": "3c5fc7b1", "metadata": {}, "source": [ "\n", @@ -21,7 +21,7 @@ }, { "cell_type": "markdown", - "id": "949265c1", + "id": "16351791", "metadata": { "slideshow": { "slide_type": "slide" @@ -40,7 +40,7 @@ }, { "cell_type": "markdown", - "id": "ddd05bc1", + "id": "67f5d3dc", "metadata": { "slideshow": { "slide_type": "subslide" @@ -56,7 +56,7 @@ }, { "cell_type": "markdown", - "id": "a6ecfb2e", + "id": "0f716130", "metadata": { "slideshow": { "slide_type": "slide" @@ -76,7 +76,7 @@ }, { "cell_type": "markdown", - "id": "f5cfb2c2", + "id": "2c0f7f79", "metadata": { "slideshow": { "slide_type": "slide" @@ -90,7 +90,7 @@ }, { "cell_type": "markdown", - "id": "6f26761c", + "id": "15626215", "metadata": { "slideshow": { "slide_type": "subslide" @@ -105,7 +105,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c0ac33d2", + "id": "bdf7ce9d", "metadata": {}, "outputs": [], "source": [ @@ -114,7 +114,7 @@ }, { "cell_type": "markdown", - "id": "fb5c0ea6", + "id": "c58f0dc6", "metadata": { "slideshow": { "slide_type": "slide" @@ -132,7 +132,7 @@ { "cell_type": "code", "execution_count": null, - "id": "89a48a53", + "id": "a4448ef0", "metadata": {}, "outputs": [], "source": [ @@ -143,7 +143,7 @@ }, { "cell_type": "markdown", - "id": "d507c246", + "id": "f36c6306", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -152,7 +152,7 @@ { "cell_type": "code", "execution_count": null, - "id": "798c8bd1", + "id": "a0dcd281", "metadata": {}, "outputs": [], "source": [ @@ -163,7 +163,7 @@ }, { "cell_type": "markdown", - "id": "e26b8c23", + "id": "4203af27", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -174,7 +174,7 @@ }, { "cell_type": "markdown", - "id": "276692a6", + "id": "60408b64", "metadata": { "slideshow": { "slide_type": "subslide" @@ -190,7 +190,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d2a81759", + "id": "a6828a0a", "metadata": {}, "outputs": [], "source": [ @@ -199,7 +199,7 @@ }, { "cell_type": "markdown", - "id": "7d2fdef3", + "id": "1c79aa70", "metadata": { "slideshow": { "slide_type": "subslide" @@ -214,7 +214,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c0c4990e", + "id": "998e64ee", "metadata": {}, "outputs": [], "source": [ @@ -225,7 +225,7 @@ }, { "cell_type": "markdown", - "id": "7728933d", + "id": "93638f83", "metadata": { "slideshow": { "slide_type": "subslide" @@ -242,7 +242,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d357f875", + "id": "8de5a9a2", "metadata": { "attributes": { "classes": [ @@ -261,7 +261,7 @@ }, { "cell_type": "markdown", - "id": "b1962d7d", + "id": "12ea1bbb", "metadata": {}, "source": [ "In these cases, you need to [open a terminal on the local machine](/terminals/example),\n", @@ -271,7 +271,7 @@ }, { "cell_type": "markdown", - "id": "ddd44cdd", + "id": "69985b74", "metadata": { "slideshow": { "slide_type": "slide" @@ -288,24 +288,20 @@ "\n", "They will appear as ``.\n", "\n", - "" ] }, { "cell_type": "markdown", - "id": "e08e67c6", + "id": "9fd29a9f", "metadata": { "slideshow": { "slide_type": "slide" @@ -321,7 +317,7 @@ }, { "cell_type": "markdown", - "id": "d708f132", + "id": "f85254b4", "metadata": { "slideshow": { "slide_type": "slide" @@ -337,7 +333,7 @@ }, { "cell_type": "markdown", - "id": "6e38ecb9", + "id": "2dc340c3", "metadata": { "slideshow": { "slide_type": "slide" @@ -355,7 +351,7 @@ }, { "cell_type": "markdown", - "id": "8a5a039d", + "id": "f273a9c3", "metadata": { "slideshow": { "slide_type": "slide" From b45d7fdf6092c66fcc403976292bc5471ecdbe2a Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Wed, 26 Jul 2023 15:07:06 +0200 Subject: [PATCH 33/52] update --- git-101/01-git.md | 19 ++- git-101/notebooks/01-git.ipynb | 293 ++++++++++++++++++-------------- tools-101/intro.md | 4 - tools-101/notebooks/intro.ipynb | 54 +++--- 4 files changed, 207 insertions(+), 163 deletions(-) diff --git a/git-101/01-git.md b/git-101/01-git.md index 856956b..895f06c 100644 --- a/git-101/01-git.md +++ b/git-101/01-git.md @@ -180,6 +180,12 @@ and finally save them in the repo. !git commit "Added localhost2 to hosts" ``` +Exercise: what is the result of the previous command? + + + --- ## History changes @@ -237,7 +243,12 @@ Now some git commands, but first create a dir. # Use this cell for the exercise ``` ---- +Don't check the solution :) + + ``` !date >> /repo-path/file.txt @@ -252,11 +263,17 @@ Now some git commands, but first create a dir. !git log /repo-path/file.txt ``` +Hint: if you completed all the previous exercises, +you should have at least two commits in the history! + ``` # revert file !git checkout HEAD~1 -- file.txt ``` +Hint: if the previous command didn't work, +ensure you have completed all the previous exercises. + ``` # diff with the reverted file !git diff HEAD diff --git a/git-101/notebooks/01-git.ipynb b/git-101/notebooks/01-git.ipynb index 1925d8b..65f27a1 100644 --- a/git-101/notebooks/01-git.ipynb +++ b/git-101/notebooks/01-git.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "61a3bfca", + "id": "295385de", "metadata": {}, "source": [ "# Git - simple repository management\n", @@ -19,7 +19,7 @@ }, { "cell_type": "markdown", - "id": "45d099d7", + "id": "2de55476", "metadata": { "slideshow": { "slide_type": "slide" @@ -42,7 +42,7 @@ }, { "cell_type": "markdown", - "id": "77b54503", + "id": "17bef8be", "metadata": { "slideshow": { "slide_type": "slide" @@ -60,7 +60,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7d513d13", + "id": "ad249a7f", "metadata": {}, "outputs": [], "source": [ @@ -70,7 +70,7 @@ }, { "cell_type": "markdown", - "id": "89430564", + "id": "9af65a45", "metadata": {}, "source": [ "All operations are local to /repo-path" @@ -79,7 +79,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8b9a05b3", + "id": "a6f3fb9f", "metadata": {}, "outputs": [], "source": [ @@ -88,7 +88,7 @@ }, { "cell_type": "markdown", - "id": "b2492e7c", + "id": "587bd117", "metadata": {}, "source": [ "Always timestamp backup copies, don't `.ori`." @@ -97,7 +97,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a814e710", + "id": "8428f513", "metadata": {}, "outputs": [], "source": [ @@ -107,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "232e9cec", + "id": "c6da066e", "metadata": {}, "source": [ "Exercise:\n", @@ -125,7 +125,7 @@ { "cell_type": "code", "execution_count": null, - "id": "87a3a8a5", + "id": "89cab394", "metadata": {}, "outputs": [], "source": [ @@ -134,7 +134,7 @@ }, { "cell_type": "markdown", - "id": "95a26541", + "id": "93c15561", "metadata": { "slideshow": { "slide_type": "slide" @@ -156,7 +156,7 @@ }, { "cell_type": "markdown", - "id": "0c54d7ad", + "id": "d8f61172", "metadata": { "slideshow": { "slide_type": "slide" @@ -174,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "49224870", + "id": "ff3ec4aa", "metadata": {}, "outputs": [], "source": [ @@ -184,7 +184,7 @@ }, { "cell_type": "markdown", - "id": "a035a594", + "id": "0671bd45", "metadata": {}, "source": [ "Note: authentication can not be enforced on a local repository." @@ -192,7 +192,7 @@ }, { "cell_type": "markdown", - "id": "0b40ecf4", + "id": "2bfdfe4c", "metadata": { "slideshow": { "slide_type": "slide" @@ -209,7 +209,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cafd12f0", + "id": "a325a5f4", "metadata": {}, "outputs": [], "source": [ @@ -219,7 +219,7 @@ }, { "cell_type": "markdown", - "id": "77f33c07", + "id": "df357555", "metadata": {}, "source": [ "### Exercise\n", @@ -232,7 +232,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fba7629a", + "id": "f107953e", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +245,7 @@ }, { "cell_type": "markdown", - "id": "8b3e351e", + "id": "9aa812a6", "metadata": { "slideshow": { "slide_type": "slide" @@ -261,7 +261,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0ac06e94", + "id": "78dc8089", "metadata": {}, "outputs": [], "source": [ @@ -270,7 +270,7 @@ }, { "cell_type": "markdown", - "id": "648e6ad5", + "id": "104cadef", "metadata": {}, "source": [ "`.gitignore` lists the files we're not interested in" @@ -279,7 +279,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9a16d864", + "id": "ebbbf2ee", "metadata": {}, "outputs": [], "source": [ @@ -290,7 +290,7 @@ }, { "cell_type": "markdown", - "id": "d7df661a", + "id": "18f0912a", "metadata": {}, "source": [ "Now we trace all `host*` files!" @@ -298,7 +298,7 @@ }, { "cell_type": "markdown", - "id": "f3cb93f9", + "id": "9d01763c", "metadata": { "slideshow": { "slide_type": "slide" @@ -315,7 +315,7 @@ { "cell_type": "code", "execution_count": null, - "id": "58b01ddc", + "id": "8668827f", "metadata": {}, "outputs": [], "source": [ @@ -324,7 +324,7 @@ }, { "cell_type": "markdown", - "id": "4f6287a3", + "id": "bf7b45cd", "metadata": {}, "source": [ "The file is now *staged* for commit. It's not archived though." @@ -333,7 +333,7 @@ { "cell_type": "code", "execution_count": null, - "id": "03cde4e6", + "id": "338844fb", "metadata": {}, "outputs": [], "source": [ @@ -342,7 +342,7 @@ }, { "cell_type": "markdown", - "id": "50e38730", + "id": "8402608a", "metadata": {}, "source": [ "Save files to the local index" @@ -351,7 +351,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d2c7b1d0", + "id": "be0d11d1", "metadata": {}, "outputs": [], "source": [ @@ -360,7 +360,7 @@ }, { "cell_type": "markdown", - "id": "e0b0233d", + "id": "97671598", "metadata": {}, "source": [ "![Git areas](https://git-scm.com/images/about/index1@2x.png)" @@ -368,7 +368,7 @@ }, { "cell_type": "markdown", - "id": "ca800655", + "id": "778eb751", "metadata": { "slideshow": { "slide_type": "slide" @@ -385,7 +385,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a3a832c9", + "id": "9ac08061", "metadata": {}, "outputs": [], "source": [ @@ -395,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "2b92dffe", + "id": "f7111d21", "metadata": {}, "source": [ "If we like the changes, we can stage them" @@ -404,7 +404,7 @@ { "cell_type": "code", "execution_count": null, - "id": "640f3472", + "id": "ae319754", "metadata": {}, "outputs": [], "source": [ @@ -414,7 +414,7 @@ }, { "cell_type": "markdown", - "id": "419b85ce", + "id": "d483a2d7", "metadata": {}, "source": [ "and finally save them in the repo." @@ -423,7 +423,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6ec39a6f", + "id": "9d9ea95b", "metadata": {}, "outputs": [], "source": [ @@ -432,7 +432,19 @@ }, { "cell_type": "markdown", - "id": "9d47d497", + "id": "d88f260d", + "metadata": {}, + "source": [ + "Exercise: what is the result of the previous command?\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "61b49fab", "metadata": { "slideshow": { "slide_type": "slide" @@ -454,7 +466,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b9178f4b", + "id": "818bb24b", "metadata": {}, "outputs": [], "source": [ @@ -463,7 +475,7 @@ }, { "cell_type": "markdown", - "id": "e0b320dc", + "id": "830e55ba", "metadata": {}, "source": [ "![Basic branch](https://git-scm.com/figures/18333fig0310-tn.png)" @@ -471,7 +483,7 @@ }, { "cell_type": "markdown", - "id": "4dcafd72", + "id": "6cadf2c2", "metadata": { "slideshow": { "slide_type": "slide" @@ -488,7 +500,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c4ff84f1", + "id": "e73cd005", "metadata": {}, "outputs": [], "source": [ @@ -499,7 +511,7 @@ }, { "cell_type": "markdown", - "id": "3111f925", + "id": "1ff848fc", "metadata": { "slideshow": { "slide_type": "slide" @@ -516,7 +528,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5909beea", + "id": "593d33d0", "metadata": {}, "outputs": [], "source": [ @@ -527,7 +539,7 @@ }, { "cell_type": "markdown", - "id": "920ca2b4", + "id": "8a909ea6", "metadata": {}, "source": [ "---" @@ -536,7 +548,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e01ac680", + "id": "b2c406c7", "metadata": {}, "outputs": [], "source": [ @@ -547,7 +559,7 @@ }, { "cell_type": "markdown", - "id": "82ae79fe", + "id": "1c7c2342", "metadata": {}, "source": [ "### Exercise\n", @@ -558,7 +570,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6d3c9442", + "id": "862d3d0f", "metadata": {}, "outputs": [], "source": [ @@ -567,16 +579,21 @@ }, { "cell_type": "markdown", - "id": "60cfa8c0", + "id": "5ba2c449", "metadata": {}, "source": [ - "---" + "Don't check the solution :)\n", + "\n", + "" ] }, { "cell_type": "code", "execution_count": null, - "id": "e72b017e", + "id": "0e34ae1d", "metadata": {}, "outputs": [], "source": [ @@ -587,7 +604,7 @@ }, { "cell_type": "markdown", - "id": "7a686d7c", + "id": "b4dc6806", "metadata": {}, "source": [ "---" @@ -596,7 +613,7 @@ { "cell_type": "code", "execution_count": null, - "id": "96169b79", + "id": "30d7e8d2", "metadata": {}, "outputs": [], "source": [ @@ -604,10 +621,19 @@ "!git log /repo-path/file.txt" ] }, + { + "cell_type": "markdown", + "id": "49ec0546", + "metadata": {}, + "source": [ + "Hint: if you completed all the previous exercises,\n", + "you should have at least two commits in the history!" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "654b2a21", + "id": "540f265f", "metadata": {}, "outputs": [], "source": [ @@ -615,10 +641,19 @@ "!git checkout HEAD~1 -- file.txt" ] }, + { + "cell_type": "markdown", + "id": "76970bc1", + "metadata": {}, + "source": [ + "Hint: if the previous command didn't work,\n", + "ensure you have completed all the previous exercises." + ] + }, { "cell_type": "code", "execution_count": null, - "id": "67c4d4ba", + "id": "8b2d0cd1", "metadata": {}, "outputs": [], "source": [ @@ -629,7 +664,7 @@ { "cell_type": "code", "execution_count": null, - "id": "62d59644", + "id": "8abfdd48", "metadata": {}, "outputs": [], "source": [ @@ -639,7 +674,7 @@ }, { "cell_type": "markdown", - "id": "4a98625a", + "id": "d0235344", "metadata": { "slideshow": { "slide_type": "slide" @@ -659,7 +694,7 @@ { "cell_type": "code", "execution_count": null, - "id": "462371dd", + "id": "a3ee2e68", "metadata": {}, "outputs": [], "source": [ @@ -669,7 +704,7 @@ }, { "cell_type": "markdown", - "id": "ea4a6801", + "id": "3212ef4c", "metadata": {}, "source": [ "- *branch* create a modifiable copy of the code, allowing\n", @@ -680,7 +715,7 @@ }, { "cell_type": "markdown", - "id": "3b15b5cf", + "id": "9f26036d", "metadata": { "slideshow": { "slide_type": "slide" @@ -697,7 +732,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e146c866", + "id": "b36b84fc", "metadata": {}, "outputs": [], "source": [ @@ -706,7 +741,7 @@ }, { "cell_type": "markdown", - "id": "1375b30e", + "id": "7790a34a", "metadata": {}, "source": [ "Create a branch" @@ -715,7 +750,7 @@ { "cell_type": "code", "execution_count": null, - "id": "362ab51e", + "id": "3a4aa9a4", "metadata": {}, "outputs": [], "source": [ @@ -724,7 +759,7 @@ }, { "cell_type": "markdown", - "id": "1efb0cb3", + "id": "1d9ac90f", "metadata": {}, "source": [ "List the branches again, check the active one!" @@ -733,7 +768,7 @@ { "cell_type": "code", "execution_count": null, - "id": "11015f86", + "id": "05c961cb", "metadata": {}, "outputs": [], "source": [ @@ -742,7 +777,7 @@ }, { "cell_type": "markdown", - "id": "92700250", + "id": "af15a2eb", "metadata": { "slideshow": { "slide_type": "slide" @@ -757,7 +792,7 @@ { "cell_type": "code", "execution_count": null, - "id": "107e3b9d", + "id": "1e77f925", "metadata": {}, "outputs": [], "source": [ @@ -767,7 +802,7 @@ }, { "cell_type": "markdown", - "id": "7774e258", + "id": "6dd319e5", "metadata": {}, "source": [ "With commit we consolidate the new file in the branch" @@ -776,7 +811,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e4a08718", + "id": "0e8a7391", "metadata": {}, "outputs": [], "source": [ @@ -785,7 +820,7 @@ }, { "cell_type": "markdown", - "id": "b794f588", + "id": "02683e7a", "metadata": { "slideshow": { "slide_type": "slide" @@ -800,7 +835,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4626e833", + "id": "ced98ad2", "metadata": {}, "outputs": [], "source": [ @@ -809,7 +844,7 @@ }, { "cell_type": "markdown", - "id": "94295ac2", + "id": "435688e4", "metadata": {}, "source": [ "Diff supports some parameters" @@ -818,7 +853,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ef624d58", + "id": "db3ad316", "metadata": {}, "outputs": [], "source": [ @@ -827,7 +862,7 @@ }, { "cell_type": "markdown", - "id": "01afa918", + "id": "9b659deb", "metadata": { "slideshow": { "slide_type": "slide" @@ -842,7 +877,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ce59dbd8", + "id": "e2fdabd9", "metadata": {}, "outputs": [], "source": [ @@ -852,7 +887,7 @@ }, { "cell_type": "markdown", - "id": "b6ea0767", + "id": "200dc0fa", "metadata": {}, "source": [ "And switch back" @@ -861,7 +896,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4d73a154", + "id": "3c89095c", "metadata": {}, "outputs": [], "source": [ @@ -871,7 +906,7 @@ }, { "cell_type": "markdown", - "id": "95550e38", + "id": "5e102ba4", "metadata": { "slideshow": { "slide_type": "slide" @@ -891,7 +926,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a7f699a9", + "id": "d58947e2", "metadata": {}, "outputs": [], "source": [ @@ -900,7 +935,7 @@ }, { "cell_type": "markdown", - "id": "8f4c0860", + "id": "ef364f2a", "metadata": { "slideshow": { "slide_type": "slide" @@ -918,7 +953,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bf3f5c71", + "id": "ae9bf47f", "metadata": {}, "outputs": [], "source": [ @@ -928,7 +963,7 @@ }, { "cell_type": "markdown", - "id": "25f26a2e", + "id": "63eb2cf7", "metadata": {}, "source": [ "You have to remove the changes or commit them (in another branch too)" @@ -937,7 +972,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f3e93b06", + "id": "79c19689", "metadata": {}, "outputs": [], "source": [ @@ -946,7 +981,7 @@ }, { "cell_type": "markdown", - "id": "fb89a405", + "id": "5799286c", "metadata": { "slideshow": { "slide_type": "slide" @@ -964,7 +999,7 @@ { "cell_type": "code", "execution_count": null, - "id": "988da588", + "id": "a3d57969", "metadata": {}, "outputs": [], "source": [ @@ -973,7 +1008,7 @@ }, { "cell_type": "markdown", - "id": "25d00022", + "id": "157f9bf8", "metadata": {}, "source": [ "Before merging, we have to check the differences" @@ -982,7 +1017,7 @@ { "cell_type": "code", "execution_count": null, - "id": "816f4fd7", + "id": "a79262b5", "metadata": {}, "outputs": [], "source": [ @@ -991,7 +1026,7 @@ }, { "cell_type": "markdown", - "id": "551398d1", + "id": "e40f95e5", "metadata": {}, "source": [ "And finally merge" @@ -1000,7 +1035,7 @@ { "cell_type": "code", "execution_count": null, - "id": "44d149f1", + "id": "a5f7ea5d", "metadata": {}, "outputs": [], "source": [ @@ -1009,7 +1044,7 @@ }, { "cell_type": "markdown", - "id": "ff845c8f", + "id": "f1896242", "metadata": {}, "source": [ "After a merge, if the branch is no more useful, we can remove it.\n", @@ -1020,7 +1055,7 @@ { "cell_type": "code", "execution_count": null, - "id": "216e8606", + "id": "485dfba6", "metadata": {}, "outputs": [], "source": [ @@ -1029,7 +1064,7 @@ }, { "cell_type": "markdown", - "id": "7c9fa183", + "id": "c8e4d115", "metadata": {}, "source": [ "If there are unmerged changes, git doesn't allow deleting a branch.\n", @@ -1044,7 +1079,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b36f9a33", + "id": "50218799", "metadata": {}, "outputs": [], "source": [ @@ -1053,7 +1088,7 @@ }, { "cell_type": "markdown", - "id": "ea6ab016", + "id": "c533269b", "metadata": { "slideshow": { "slide_type": "slide" @@ -1070,7 +1105,7 @@ { "cell_type": "code", "execution_count": null, - "id": "59cd9ed0", + "id": "94b67b58", "metadata": { "attributes": { "classes": [ @@ -1086,7 +1121,7 @@ }, { "cell_type": "markdown", - "id": "81c160e8", + "id": "04fe0d05", "metadata": { "slideshow": { "slide_type": "slide" @@ -1103,7 +1138,7 @@ { "cell_type": "code", "execution_count": null, - "id": "68e9d429", + "id": "25e12b7a", "metadata": {}, "outputs": [], "source": [ @@ -1112,7 +1147,7 @@ }, { "cell_type": "markdown", - "id": "b93f6e9e", + "id": "11c51b36", "metadata": {}, "source": [ "Exercise:\n", @@ -1123,7 +1158,7 @@ { "cell_type": "code", "execution_count": null, - "id": "657b5177", + "id": "20182c9d", "metadata": {}, "outputs": [], "source": [ @@ -1132,7 +1167,7 @@ }, { "cell_type": "markdown", - "id": "c367c17d", + "id": "9d417cdc", "metadata": {}, "source": [ "Go to the correct directory now." @@ -1141,7 +1176,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6821d4f8", + "id": "6dc07ec3", "metadata": {}, "outputs": [], "source": [ @@ -1150,7 +1185,7 @@ }, { "cell_type": "markdown", - "id": "71ff4c26", + "id": "8adcfcc6", "metadata": { "slideshow": { "slide_type": "slide" @@ -1168,7 +1203,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a0209a8c", + "id": "cb6b0c30", "metadata": {}, "outputs": [], "source": [ @@ -1177,7 +1212,7 @@ }, { "cell_type": "markdown", - "id": "9c01d650", + "id": "a2df281d", "metadata": {}, "source": [ "Now enter in the repo directory" @@ -1186,7 +1221,7 @@ { "cell_type": "code", "execution_count": null, - "id": "66963bf3", + "id": "20f6c29b", "metadata": {}, "outputs": [], "source": [ @@ -1195,7 +1230,7 @@ }, { "cell_type": "markdown", - "id": "840eb376", + "id": "79631be5", "metadata": {}, "source": [ "Show repository configuration. Which is the remote origin?" @@ -1204,7 +1239,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f79866fe", + "id": "65227c4a", "metadata": {}, "outputs": [], "source": [ @@ -1213,7 +1248,7 @@ }, { "cell_type": "markdown", - "id": "ec7e864d", + "id": "97bda0eb", "metadata": {}, "source": [ "The remote repo is retrieved with all its changes and history" @@ -1222,7 +1257,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d3b9d69f", + "id": "4cfbb2c9", "metadata": {}, "outputs": [], "source": [ @@ -1231,7 +1266,7 @@ }, { "cell_type": "markdown", - "id": "496bc04e", + "id": "12b6577d", "metadata": {}, "source": [ "And `log` can show branches and merges." @@ -1240,7 +1275,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5322c826", + "id": "b1bad4a5", "metadata": {}, "outputs": [], "source": [ @@ -1249,7 +1284,7 @@ }, { "cell_type": "markdown", - "id": "b9055667", + "id": "d2c8af30", "metadata": { "slideshow": { "slide_type": "slide" @@ -1267,7 +1302,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8b157cce", + "id": "0785c30e", "metadata": {}, "outputs": [], "source": [ @@ -1276,7 +1311,7 @@ }, { "cell_type": "markdown", - "id": "07e8235e", + "id": "a26acd5e", "metadata": {}, "source": [ "Now move to the new directory" @@ -1285,7 +1320,7 @@ { "cell_type": "code", "execution_count": null, - "id": "26de2f34", + "id": "3f943f8a", "metadata": {}, "outputs": [], "source": [ @@ -1294,7 +1329,7 @@ }, { "cell_type": "markdown", - "id": "9f4cb9b9", + "id": "2a18da8b", "metadata": {}, "source": [ "Show repository configuration. Which is the remote origin?" @@ -1303,7 +1338,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9cee008f", + "id": "8abfbe9f", "metadata": {}, "outputs": [], "source": [ @@ -1312,7 +1347,7 @@ }, { "cell_type": "markdown", - "id": "78a7e81f", + "id": "097686a5", "metadata": { "slideshow": { "slide_type": "slide" @@ -1334,7 +1369,7 @@ { "cell_type": "code", "execution_count": null, - "id": "eea299f9", + "id": "91a8adef", "metadata": {}, "outputs": [], "source": [ @@ -1343,7 +1378,7 @@ }, { "cell_type": "markdown", - "id": "e37f4e49", + "id": "5bd20272", "metadata": {}, "source": [ "Now that your changes are on your local repo, you can synchronize / upload them to the remote copy\n", @@ -1353,7 +1388,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23dfa380", + "id": "14c9d7c4", "metadata": {}, "outputs": [], "source": [ @@ -1362,7 +1397,7 @@ }, { "cell_type": "markdown", - "id": "10786c4e", + "id": "0ae007d7", "metadata": {}, "source": [ "Remember:\n", @@ -1378,7 +1413,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f33a14ea", + "id": "88048f4c", "metadata": {}, "outputs": [], "source": [ @@ -1387,7 +1422,7 @@ }, { "cell_type": "markdown", - "id": "7a4005eb", + "id": "cd233831", "metadata": {}, "source": [ "Check the differences" @@ -1396,7 +1431,7 @@ { "cell_type": "code", "execution_count": null, - "id": "65f8afcc", + "id": "1070a1f3", "metadata": {}, "outputs": [], "source": [ @@ -1405,7 +1440,7 @@ }, { "cell_type": "markdown", - "id": "f7709b9f", + "id": "58a52c08", "metadata": {}, "source": [ "And finally merge" @@ -1414,7 +1449,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5fe9627b", + "id": "20a107f5", "metadata": {}, "outputs": [], "source": [ @@ -1423,7 +1458,7 @@ }, { "cell_type": "markdown", - "id": "affb4021", + "id": "747346e6", "metadata": {}, "source": [ "Exercise:\n", @@ -1438,7 +1473,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f9befedb", + "id": "15d22d6d", "metadata": {}, "outputs": [], "source": [ @@ -1447,7 +1482,7 @@ }, { "cell_type": "markdown", - "id": "aa483f7a", + "id": "ae1e0a21", "metadata": {}, "source": [ "To make it work, you need to be authenticated/authorized with the remote repo ;)" diff --git a/tools-101/intro.md b/tools-101/intro.md index 9cfbc85..946386b 100644 --- a/tools-101/intro.md +++ b/tools-101/intro.md @@ -1,4 +1,3 @@ - # Devops Tools 101 This is a course on the tools you will need to work using the devops methodology. @@ -9,7 +8,6 @@ and execute the commands on the course environment. We will start presenting the course environment, then we will go through the tools: Docker, Git and Python. - --- @@ -95,8 +93,6 @@ echo $A ---- - - During the course, you will need to execute some shell code, that is rendered like the following ```text diff --git a/tools-101/notebooks/intro.ipynb b/tools-101/notebooks/intro.ipynb index 72c8e79..18a5c34 100644 --- a/tools-101/notebooks/intro.ipynb +++ b/tools-101/notebooks/intro.ipynb @@ -2,10 +2,9 @@ "cells": [ { "cell_type": "markdown", - "id": "3c5fc7b1", + "id": "c6ec9afa", "metadata": {}, "source": [ - "\n", "# Devops Tools 101\n", "\n", "This is a course on the tools you will need to work using the devops methodology.\n", @@ -15,13 +14,12 @@ "\n", "We will start presenting the course environment, then we will go through the tools:\n", "\n", - "Docker, Git and Python.\n", - "" + "Docker, Git and Python." ] }, { "cell_type": "markdown", - "id": "16351791", + "id": "dffaaf12", "metadata": { "slideshow": { "slide_type": "slide" @@ -40,7 +38,7 @@ }, { "cell_type": "markdown", - "id": "67f5d3dc", + "id": "9e717ce2", "metadata": { "slideshow": { "slide_type": "subslide" @@ -56,7 +54,7 @@ }, { "cell_type": "markdown", - "id": "0f716130", + "id": "8649150f", "metadata": { "slideshow": { "slide_type": "slide" @@ -76,7 +74,7 @@ }, { "cell_type": "markdown", - "id": "2c0f7f79", + "id": "13c9cd32", "metadata": { "slideshow": { "slide_type": "slide" @@ -90,7 +88,7 @@ }, { "cell_type": "markdown", - "id": "15626215", + "id": "0cb01ea3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -105,7 +103,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bdf7ce9d", + "id": "b1b4f5ce", "metadata": {}, "outputs": [], "source": [ @@ -114,7 +112,7 @@ }, { "cell_type": "markdown", - "id": "c58f0dc6", + "id": "8d97d0b9", "metadata": { "slideshow": { "slide_type": "slide" @@ -132,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a4448ef0", + "id": "126339d1", "metadata": {}, "outputs": [], "source": [ @@ -143,7 +141,7 @@ }, { "cell_type": "markdown", - "id": "f36c6306", + "id": "4d89e743", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -152,7 +150,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a0dcd281", + "id": "4a1d3500", "metadata": {}, "outputs": [], "source": [ @@ -163,7 +161,7 @@ }, { "cell_type": "markdown", - "id": "4203af27", + "id": "468c1134", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -174,7 +172,7 @@ }, { "cell_type": "markdown", - "id": "60408b64", + "id": "25ecdbe4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -190,7 +188,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a6828a0a", + "id": "aa438598", "metadata": {}, "outputs": [], "source": [ @@ -199,7 +197,7 @@ }, { "cell_type": "markdown", - "id": "1c79aa70", + "id": "318b2241", "metadata": { "slideshow": { "slide_type": "subslide" @@ -214,7 +212,7 @@ { "cell_type": "code", "execution_count": null, - "id": "998e64ee", + "id": "2264d713", "metadata": {}, "outputs": [], "source": [ @@ -225,7 +223,7 @@ }, { "cell_type": "markdown", - "id": "93638f83", + "id": "5d2d04a8", "metadata": { "slideshow": { "slide_type": "subslide" @@ -234,15 +232,13 @@ "source": [ "----\n", "\n", - "\n", - "\n", "During the course, you will need to execute some shell code, that is rendered like the following" ] }, { "cell_type": "code", "execution_count": null, - "id": "8de5a9a2", + "id": "a7f30297", "metadata": { "attributes": { "classes": [ @@ -261,7 +257,7 @@ }, { "cell_type": "markdown", - "id": "12ea1bbb", + "id": "fc4b41ac", "metadata": {}, "source": [ "In these cases, you need to [open a terminal on the local machine](/terminals/example),\n", @@ -271,7 +267,7 @@ }, { "cell_type": "markdown", - "id": "69985b74", + "id": "969e264e", "metadata": { "slideshow": { "slide_type": "slide" @@ -301,7 +297,7 @@ }, { "cell_type": "markdown", - "id": "9fd29a9f", + "id": "9b2e73ae", "metadata": { "slideshow": { "slide_type": "slide" @@ -317,7 +313,7 @@ }, { "cell_type": "markdown", - "id": "f85254b4", + "id": "8b971d5d", "metadata": { "slideshow": { "slide_type": "slide" @@ -333,7 +329,7 @@ }, { "cell_type": "markdown", - "id": "2dc340c3", + "id": "bbd506e6", "metadata": { "slideshow": { "slide_type": "slide" @@ -351,7 +347,7 @@ }, { "cell_type": "markdown", - "id": "f273a9c3", + "id": "10566e31", "metadata": { "slideshow": { "slide_type": "slide" From 7c754c3db77e70d2adece42a3b0b7cd8e0b2d3d6 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Thu, 27 Jul 2023 09:58:14 +0200 Subject: [PATCH 34/52] Improve docker stuff. --- docker-101/00-docker.md | 39 ++------------------- docker-101/02-docker.md | 75 +++++++++++++++++++++++++++-------------- docker-101/Dockerfile | 2 +- 3 files changed, 52 insertions(+), 64 deletions(-) diff --git a/docker-101/00-docker.md b/docker-101/00-docker.md index 990a8c0..db01850 100644 --- a/docker-101/00-docker.md +++ b/docker-101/00-docker.md @@ -79,18 +79,12 @@ An imaginary dialogue between your browser and your Kernel. ![Foo](https://mermaid.ink/img/pako:eNplUk2P0zAQ_StTXxakbGiSpmktFKQCUqsI7QFOKJchnmwtHLvYDiFU_e_rpFskdn2w_Pzemw_NnFljBDHOHP3qSTf0SeKjxa7WEM4JrZeNPKH2sAN0sLNmcGRfs9XEVmQ1qdfkfiL3aMWAlq70Du7LsuKwp_HZFsEBhkntDTj8TYDQSkVgNAjpfl5tFdwH347DR9Qwmj4oR_BHgg4fZQODscJ9-D-DOZF-E8dv3_-w5WClpxtolHEz-Be6LPccDu8eJjaO45cpjbXU-AV8O1oicKNrUCm3mNSHO6VAGy_bcS5rOJKGw10HwugXHT9UC5jlA0oPrbGTgUWsI9uhFGEU58lQs9BWRzXj4SmoxV75mtX6EqT9SaCnz0J6Yxn3tqeIYe_N11E3N3zVPE-T8RaVC79hHN-N6W6iABk_sz-Mp-siTsO1TPJ8s87WySpiI-NJvolXWbJJlsW2SJd5kl4i9neOsIzXeVYkeZFuiyRbZdttxGgu6ct1o-bFujwBJp-7ig?type=png) - --- ## Kernel isolates applications and resources [![](https://mermaid.ink/img/pako:eNptkvGrmzAQx_8VOXiwgZaqtbYyBtve2GB7j_HGflncD6k5a1ATiZG2a_u_74z2jQcPvXi5-yR-75IzFFogZLA3vKu870-5Gp9-2E0B3nU98_7kSkiDhZVaOWZn9KFHwz5OX6_ku6zkQUlQqY_BnKZle94i-0JDT8yIFBX2fVArua_si5DRuqYFB20E-yyk1WZOl7LBYAxTFpV4Ia_2nLgajcKGfcuJIDNkavYbMo-M3llkI9VwfGWv6vBKoUU3sE8_fs1SWlkYXVSyI87wlj19eLhlsNXmROGehPM9sq_3c6YSo_C7O0-hZY94KxptNYq2_4XUXhC8JxXOWwSXdxc3mXs5Ji856A7Vm7dUzMFIi-TBxaunNs_EztQOaHrE-hkY-zcDUhe2cUhPf7b6mQEfWjQtl4Luw5na5uVAKlvMISNXYMmHxuaQqyuhQye4xemkILNmQB_4YPXPkypu84m5l5w63AKVTaJ86Lj6rXV7g2gK2RmOkEXrdBHRsAyTZLOO1-HKhxNkYbJZrOJwEy7TbRotkzC6-vDX7bBcrJM4DZM02qZhvIq3Wx_QSXqYrrW73dd_YMj_AQ?type=png)](https://mermaid.live/edit#pako:eNptkvGrmzAQx_8VOXiwgZaqtbYyBtve2GB7j_HGflncD6k5a1ATiZG2a_u_74z2jQcPvXi5-yR-75IzFFogZLA3vKu870-5Gp9-2E0B3nU98_7kSkiDhZVaOWZn9KFHwz5OX6_ku6zkQUlQqY_BnKZle94i-0JDT8yIFBX2fVArua_si5DRuqYFB20E-yyk1WZOl7LBYAxTFpV4Ia_2nLgajcKGfcuJIDNkavYbMo-M3llkI9VwfGWv6vBKoUU3sE8_fs1SWlkYXVSyI87wlj19eLhlsNXmROGehPM9sq_3c6YSo_C7O0-hZY94KxptNYq2_4XUXhC8JxXOWwSXdxc3mXs5Ji856A7Vm7dUzMFIi-TBxaunNs_EztQOaHrE-hkY-zcDUhe2cUhPf7b6mQEfWjQtl4Luw5na5uVAKlvMISNXYMmHxuaQqyuhQye4xemkILNmQB_4YPXPkypu84m5l5w63AKVTaJ86Lj6rXV7g2gK2RmOkEXrdBHRsAyTZLOO1-HKhxNkYbJZrOJwEy7TbRotkzC6-vDX7bBcrJM4DZM02qZhvIq3Wx_QSXqYrrW73dd_YMj_AQ) - ## Multitasking, Virtualization & Co Isolation enables multi-tasking and multiple users: @@ -126,36 +120,7 @@ There is a lot of communication going on, and some instructions need to be serialized and conveyed over the network. -```mermaid ---- -title: libvirt architecture ---- -graph LR - -client <--> api - -subgraph api[public API] -remote -end - -subgraph Node -libvirtd -libvirt-qemu -guest -end - -subgraph guest -guest-agent -end - -api <-->|RPC\nURI| libvirtd <--> libvirt-qemu - -libvirt-qemu <-->|monitor| guest -libvirt-qemu -->|qemu-kvm| guest -libvirt-qemu <-->|agent\nmonitor| guest-agent - -``` - +[![](https://mermaid.ink/img/pako:eNptklFPwjAUhf9Kc583snWwwWJMjPpAooZgfNH6UNYLNK7dLC1Rgf9utzGSRZ96e_Pdc05veoCiEgg5hGHItJW2xJyUcrWXxhJuiq20WFhnkOmW2Bheb8nDkmmmi1KituQqDK8Jr2XT2rlVR_j7W-1WpSzIzWL-zrRBVVmvgloMwCdvz_TZUVyq8BOV83YOd_bv0LndHiHf-BQXxhu3iY7LxS1j-mU5P_bvEV3UocPQsRtVlZa2MsfeZ0A0QFOEH3v1P9FqdKmYHmr1YZmGABQaxaXwyz8wTQgDu0WFDHJfClxzV1oGTJ886mrBLd6LRgpyaxwGwJ2tnr91AfmalzvsoTvJ_ZLUpVtz_VpVqp_yV8gP8AV5lo2SJKI0i7I0pr4I4BtymkSjLMloPKNpHI3pbHoK4KcViEbpNKGTSRKPpzSdpZMkAGwjPXZ_qP1Kp18EOc7o?type=png)](https://mermaid.live/edit#pako:eNptklFPwjAUhf9Kc583snWwwWJMjPpAooZgfNH6UNYLNK7dLC1Rgf9utzGSRZ96e_Pdc05veoCiEgg5hGHItJW2xJyUcrWXxhJuiq20WFhnkOmW2Bheb8nDkmmmi1KituQqDK8Jr2XT2rlVR_j7W-1WpSzIzWL-zrRBVVmvgloMwCdvz_TZUVyq8BOV83YOd_bv0LndHiHf-BQXxhu3iY7LxS1j-mU5P_bvEV3UocPQsRtVlZa2MsfeZ0A0QFOEH3v1P9FqdKmYHmr1YZmGABQaxaXwyz8wTQgDu0WFDHJfClxzV1oGTJ886mrBLd6LRgpyaxwGwJ2tnr91AfmalzvsoTvJ_ZLUpVtz_VpVqp_yV8gP8AV5lo2SJKI0i7I0pr4I4BtymkSjLMloPKNpHI3pbHoK4KcViEbpNKGTSRKPpzSdpZMkAGwjPXZ_qP1Kp18EOc7o) --- ## Containerization @@ -166,7 +131,7 @@ without different kernels. It is enabled by the isolation features that the Linux kernel provided over time. -- chroot: changes the root directory confing applications to see a different filesystem hierarchy (1979) +- chroot: changes the root directory, confing applications in a different filesystem hierarchy (1979) - capabilities: restrict user privileges (1999) - SELinux: defines access control policies for kernel resources (2000) - namespaces: partition kernel resources, including networks and host names (2002) diff --git a/docker-101/02-docker.md b/docker-101/02-docker.md index 0953ab6..2e9ee3b 100644 --- a/docker-101/02-docker.md +++ b/docker-101/02-docker.md @@ -2,19 +2,19 @@ At first, we will inspect this machine: the operating system, the IP address and the rest. -```python +```bash # Distro -!cat /etc/issue +cat /etc/issue ``` -```python +```bash # Linux version -!uname -a +uname -a ``` -```python +```bash # IP address -! ip -4 -o address show eth0 +ip -4 -o address show eth0 ``` --- @@ -23,14 +23,14 @@ At first, we will inspect this machine: the operating system, the IP address and Check that the docker tools are installed on your test environment. -```python +```bash # Docker CLI version. -!docker --version +docker --version ``` -```python +```bash # Docker server version -!dockerd --version +dockerd --version ``` --- @@ -44,16 +44,16 @@ Let's pull (download) and run an image [![](https://mermaid.ink/img/pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s?type=png)](https://mermaid.live/edit#pako:eNptU8tu2zAQ_BWCQG6SUT_kODr00hRoD70kQA8Vc6DEtcVaXArkMq1r5d9LPRzbScADZ7XD0exyeeSVVcBznqapQNLUQM7ubbUHxzQSOFmRtugFDoSdk20tUKAP5YDZA-y0J3coHsBYgteYbWWZb2WqBq0ngXpeCP7dyB34mOtTVSjBi15t4jpQtaTTyVAGpHCKfstnecLtgWqLgkdVQHVl55v1JHAsYKsbKM5w-usEr8092yYY8MXPcZ-oSpIspYdIqCyS1AjOF8WXV3xRyFMkNbaSTaxi6sj7Ys-G-3VhLU0_d2XQjerYtUifYR3J3dvEpaWRVFljNH0g0CddwI6dT7w93Rkbm92xqQ_v0p6ko8STbRMHQ3CtJrBv_EBtg6_jpeq--Mvau_NojLSm-Zg2XqHAmxvWk5hExaL9uLOBPYuN1rh_pENs3DK5ZVHT7iGP05OMMP2jFdV5xhNuwBmpVRzwo0DGBKcaDAieR6hgK0NDggt8idTQxvuGr0qTdTwnFyDhMpB9PGB1ikfOvZZx2gyPphsfv7YSf1lrTqQY8vzI__J8nm1mq_liucw2m8UyW9wuEn7g-eJuPVtnd-tNtlmuVllcLwn_Nyh8mmUJh8HDj_FhDu_z5T_yHk5s) -```python +```bash # Search images from catalog -!docker search ubuntu | head +docker search ubuntu | head ``` Download an image from the remote registry. -```python +```bash # Download the ubuntu image -!docker pull ubuntu:22.04 +docker pull ubuntu:22.04 ``` Open a [terminal](/terminals/docker) @@ -145,11 +145,25 @@ docker stats # shows metrics, memory, cpu, filsystem ``` 1. Inspect the `ansible-101_bastion_1` container. + + 1. Use the `--format` option to get the IP address on a [terminal](/terminals/docker). **Hint 1: you can google for the solution.** + + + 1. Try to run the above `docker inspect --format ...` command in the jupyter notebook. Does it work? If not, why? + + ```python # Use this cell to run the correct docker command. ``` @@ -172,6 +186,8 @@ For example, you might: [![](https://mermaid.ink/img/pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA?type=png)](https://mermaid.live/edit#pako:eNpVkstO6zAQhl_FmnVS2U7iNFmwQLBAiBVIR6I-QtPYoRaxXSW2RE_Vd8ckp7Ts5vLN7dccofNKQwvvI-530kk3xe1sk867gMbpcfNnNAG3g76EyIAHPf6VLnyGzcvOTEuAeDccztQkU3qnSW8GPZGww0Bw1MR6ZXqjVSrWTn1PvJppLL7rt7nX5sHauIyN2-hCbDlf0XJBSI9tj_ngu4_UZ4uTznl-Xdw0VVV0NSGMPt6eEfYLqRWvFWWE8OLpB6G_kJ6KAouCEEFn5P_CFxny_OZ65-8kZGD1aNGopOpROkIkJBmsltAmU-ke4xAkSHdKaNwrDPpemeBHaMMYdQYYg38-uO7sL8ydwaSRhXT3MKXoHt2r9_YMJRfaI3xCy8pyVdKqYrTkxbqhTQYHaHlTrUTViIILwfma1acM_s31dCVYxWnFxLrmJRWUZaDnhZ6W15g_5PQF27i6QA) +--- + This mechanism allows an efficient storage usage, since multiple containers can reuse the same filesystem layers. @@ -193,12 +209,13 @@ docker history # list changes of an image. ---- Images are stored in a Docker registry such as [Docker Hub](https://hub.docker.com/) -or Github's [Container Registry](). You can also host your own registry. +or Github's [Container Registry](https://ghcr.io/). +You can also host your own registry. `docker commit` can create an image from a container: this is the process used when building a `Dockerfile`. -NB. This is similar to the snapshot feature of Virtual Machines. +NB. This is similar to the virtual machines' snapshot feature. [![](https://mermaid.ink/img/pako:eNqtlV1vmzAUhv-K5WuIwDak4WIXXXcxbd3FVmnS4qpysEmsgImwUcu6_vc5diCQfkxre3fMeY3f8_jj3MO85gJmcN2w3QZcnVNFVV4yrS9EAVYlU1ugTVNvRaZqJYJClqWLRqr1ptbmoAo50xvWNKzLQDJWU6XblV9EVuubdtUq0y4_V1Vr2KoUwH_IEJpFxCrYWoCCZQULyzrfXlPFZSNyI2sFvn6nasW0CFHodDcl60SzXCySBOdzAOLoy_n1QRJPJHOO5jyKAUD4cpBEE0kRpZhhDEAaOYlQ_JF3JW6X38StjXvzL_rdM41Dc2eWVxupgVsH1KrsQF4rw6TSlCqzEaCquSyk4MBiE_p6sm4cekA3eb3r_gNbHDaiWIK-ktNyGrGWduO6U77HLfKxLXmYPJrO7SKiiZcffSG2LvSo9EGMQi71dvmzkd56PkzySLxvzmzW7svJfwBV6FUMnemRh9dhRE9gPKFARhTi5ymQN1Ig70CBvJICefIwPSKBRiTw8yTwG0ngdyCBJyT-eanxy7dpqEBbs_5q9AHqAzJMc28CCMMP08u9P2x7MC6DphlyzJBpBh8zeJo5GNmn_vjY-qwqaSyhvBHMCP2nf9bAYBeEM6tv9Sg5VHCa6x-KYaWn04eOAdyTFLgbFTiggTtXvtkcRaMiggmGYFJgMAHhexFVMICVaComuW1t91QBQKE9DpWgMLMhFwVrS0MhVQ9W2u7sKROfuDR1AzPTtCKArDX1j07l_dhrLiSzW11BeyZKbb_umPpV11UvskOY3cM7mKGEzNJFksYoTlCULlIcwA5mcURmhJAIz9P5GUJnCX4I4G_3h2g2X0QojhYpQvtWhlAAhbN06Tu0a9QPfwEgtsUC?type=png)](https://mermaid.live/edit#pako:eNqtlV1vmzAUhv-K5WuIwDak4WIXXXcxbd3FVmnS4qpysEmsgImwUcu6_vc5diCQfkxre3fMeY3f8_jj3MO85gJmcN2w3QZcnVNFVV4yrS9EAVYlU1ugTVNvRaZqJYJClqWLRqr1ptbmoAo50xvWNKzLQDJWU6XblV9EVuubdtUq0y4_V1Vr2KoUwH_IEJpFxCrYWoCCZQULyzrfXlPFZSNyI2sFvn6nasW0CFHodDcl60SzXCySBOdzAOLoy_n1QRJPJHOO5jyKAUD4cpBEE0kRpZhhDEAaOYlQ_JF3JW6X38StjXvzL_rdM41Dc2eWVxupgVsH1KrsQF4rw6TSlCqzEaCquSyk4MBiE_p6sm4cekA3eb3r_gNbHDaiWIK-ktNyGrGWduO6U77HLfKxLXmYPJrO7SKiiZcffSG2LvSo9EGMQi71dvmzkd56PkzySLxvzmzW7svJfwBV6FUMnemRh9dhRE9gPKFARhTi5ymQN1Ig70CBvJICefIwPSKBRiTw8yTwG0ngdyCBJyT-eanxy7dpqEBbs_5q9AHqAzJMc28CCMMP08u9P2x7MC6DphlyzJBpBh8zeJo5GNmn_vjY-qwqaSyhvBHMCP2nf9bAYBeEM6tv9Sg5VHCa6x-KYaWn04eOAdyTFLgbFTiggTtXvtkcRaMiggmGYFJgMAHhexFVMICVaComuW1t91QBQKE9DpWgMLMhFwVrS0MhVQ9W2u7sKROfuDR1AzPTtCKArDX1j07l_dhrLiSzW11BeyZKbb_umPpV11UvskOY3cM7mKGEzNJFksYoTlCULlIcwA5mcURmhJAIz9P5GUJnCX4I4G_3h2g2X0QojhYpQvtWhlAAhbN06Tu0a9QPfwEgtsUC) @@ -209,17 +226,17 @@ NB. This is similar to the snapshot feature of Virtual Machines. The Dockerfile is a text file that contains all the commands a user could call on the command line to assemble an image. -```python -! cat Dockerfile +```bash +cat Dockerfile ``` Docker will execute all the commands in the Dockerfile and create a new image. -```python -!docker build -t apache-example . +```bash +docker build -t apache-example . ``` -Open the [terminal](/terminals/docker-1) and: +Open the [terminal](/terminals/docker_1) and: - inspect the image - run the image with @@ -230,10 +247,16 @@ docker run --rm --detach apache-example #### Exercise -Open the [terminal](/terminals/docker-1) and: +Open the [terminal](/terminals/docker_1) and: -- check if the container is running `docker ps` -- use `curl` to check if the webserver works +- check if the container is running `docker ps`. + Can you identify the container by its image name? + What is the container's name? +- use `curl` to check if the webserver works. + **Hint: you can retrieve the container IP using the previous command.** + - stop the container with `docker stop` - check the container status with `docker ps -a` - remove the container with `docker rm` @@ -380,8 +403,8 @@ services: ## What next? -```python -!docker run --rm mribeiro/cowsay "Any questions?" +```bash +docker run --rm mribeiro/cowsay "Any questions?" ``` --- diff --git a/docker-101/Dockerfile b/docker-101/Dockerfile index 8f70b36..bfef2bf 100644 --- a/docker-101/Dockerfile +++ b/docker-101/Dockerfile @@ -4,7 +4,7 @@ # # $ docker build -t test-apache2 . # -FROM debian:stable-slim +FROM docker.io/debian:bullseye # Set the maintainer. See https://docs.docker.com/engine/reference/builder/#maintainer-deprecated LABEL org.opencontainers.image.authors="piuma@piumalab.org" From 49295ca7e54e8c80df1a54184e1b436d73780d83 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Fri, 10 Nov 2023 14:29:34 +0100 Subject: [PATCH 35/52] Python for high school (#74) * Preliminary work. --- ansible-101/site-digitalocean.yml | 7 +- python-high-school/00_intro.md | 291 +++++++ python-high-school/01_strings.md | 356 ++++++++ python-high-school/10_collections.md | 238 ++++++ python-high-school/20_plots.md | 34 + python-high-school/Dockerfile | 12 + python-high-school/Makefile | 13 + python-high-school/docker-compose.yml | 19 + python-high-school/notebooks/00_intro.ipynb | 602 ++++++++++++++ python-high-school/notebooks/01_strings.ipynb | 761 ++++++++++++++++++ .../notebooks/10_collections.ipynb | 494 ++++++++++++ python-high-school/notebooks/20_plots.ipynb | 90 +++ python-high-school/notebooks/examples.py | 41 + python-high-school/tox.ini | 23 + 14 files changed, 2979 insertions(+), 2 deletions(-) create mode 100644 python-high-school/00_intro.md create mode 100644 python-high-school/01_strings.md create mode 100644 python-high-school/10_collections.md create mode 100644 python-high-school/20_plots.md create mode 100644 python-high-school/Dockerfile create mode 100644 python-high-school/Makefile create mode 100644 python-high-school/docker-compose.yml create mode 100644 python-high-school/notebooks/00_intro.ipynb create mode 100644 python-high-school/notebooks/01_strings.ipynb create mode 100644 python-high-school/notebooks/10_collections.ipynb create mode 100644 python-high-school/notebooks/20_plots.ipynb create mode 100644 python-high-school/notebooks/examples.py create mode 100644 python-high-school/tox.ini diff --git a/ansible-101/site-digitalocean.yml b/ansible-101/site-digitalocean.yml index 7dddca8..3fbf5bb 100644 --- a/ansible-101/site-digitalocean.yml +++ b/ansible-101/site-digitalocean.yml @@ -11,8 +11,7 @@ # # You can retrieve the list of provisioned hosts with # -# $ ansible --user=root -i /tmp/inventory.do -mshell \ -# -a 'docker exec -ti ansible-101_course_1 jupyter-notebook list | sed -e "s/0.0.0.0/{{ansible_host}}/" ' do +# $ ansible --user=root -i /tmp/inventory.do -mshell -a 'docker exec -ti ansible-101_course_1 jupyter-notebook list | sed -e "s/0.0.0.0/{{ansible_host}}/" ' do # - hosts: localhost gather_facts: false @@ -25,6 +24,10 @@ droplet_names: - deleteme-1 - deleteme-2 + - deleteme-3 + - deleteme-4 + - deleteme-5 + - deleteme-6 tasks: - name: Retrieve ssh key id. diff --git a/python-high-school/00_intro.md b/python-high-school/00_intro.md new file mode 100644 index 0000000..536aa8f --- /dev/null +++ b/python-high-school/00_intro.md @@ -0,0 +1,291 @@ +# Python for System Administrator + + Author: + +--- + +## Introducing Python + +Python is an interpreted, object oriented language with +a lot of built in features. +It can be used as a calculator and for mathematical operations, +such as statistics, plotting and linear algebra. + +This is a fast-track course for high school students with math knowledge. + +Students are expected to type and execute cells, and share their results. + +--- + +# Jupyter + +Is the course environment in your browser. +It requires a modern browser and an internet connection supporting +websockets. If your network setup (e.g. your proxy) +does not support websockets, you will not be able to +execute the code. + +--- + +While you might find the exercises' solutions in the environment, +it is important for you to spend some time trying to do your homework! +This will help you to remember the concepts and to learn how to use the tools. + +--- + +## What can I do with Jupyter? + +You can: + +- execute the next cell with `SHIFT+ENTER` (try it now!) + +If your environment supports it, you can use features requiring +operating system access: + +- [open a (named) terminal on the local machine](/terminals/example) +- [edit an existing file](/edit/notebooks/untitled.txt) + +--- + +- add more cells with `ALT+ENTER` + +---- + +Try to add a cell below this one and write some text in it. + +```python +# Add a new python cell with ALT+ENTER. +``` + +--- + +## Python terminal + +With Jupyter, you have a Python terminal at your disposal. +You can run Python code: + +```python +# You can evaluate maths and strings +s = 1 +print("a string and the number " + str(s)) +``` + +Jupyter remembers the variables you define in a cell, so you can use them in the next cells. + +```python +# Evaluate this cell with SHIFT+ENTER +s = s + 1 +print("now s is increased " + str(s)) +``` + +Since Jupyter remembers the variables, you can run the cells in any order you want. +This means that sometimes, you need to "reset" the environment, to start from scratch. + +This can be done with the "Kernel > Restart" or "Kernel > Restart & Clear output" menu. + +---- + +## Agenda + +- Printing +- Basic Arithmetic +- Variable assignment +- Formatting +- Importing modules +- Getting help + +--- + +## Basic functions + +There are basic functions for printing and +managing variables. + +```python +# you can print with the print() function +print("Hello world!") +``` + +```python +# concatenate strings with a + sign +# and using hex notation +print("Hello" + " " + "World!") +``` + +```python +print("Ciao") +``` + +--- + +## Basic Arithmetic + +A python variable is a label that can be associated to a value. + +```python +# This is a comment, while +a = 1 # is an integer +b = 16.0 # a float +c = 1.2e2 # another float in exponential notation +``` + +---- + +```python +# Exercise: use the print() function to print the value of a, b and c. + +``` + +---- + +```python +# I can sum, multiply, and modulus (aka, the remainder of the division). +print(a + b, 5 % 2) +``` + +```python +# I can divide, and elevate to a power. +print(b / a, 2 ** 3) +``` + +```python +# Brackets are always round. +print(((a + b) * c)/ a + (b *c)) +``` + +---- + +```python +# Exercise: which is the expected value of 2 * c? +print(2 * c) +``` + +Exercise: use the cell above to compute the following values: + +- the remainder of 12 / 5 +- $3 \dot 8; 2^{10}; 2^{20}; 2^{30}$ +- $ \frac{[1 + (1/3 + 1/4)] + 1/5}{6} $ + +Computers, for performance reasons, use memory in chunks called blocks or pages: +for example you can't use a single bit of memory similarly to how you can't +use a single line of your notebook. + +For this reasom it is convenient to use powers of $2^{10}$ to represent the size of files and memory. +They are called "kibi (Ki)", "mebi (Mi)", "gibi (Gi)", .. to avoid confusion with the powers of $10^{3}$, that are called +"kilo (k)", "mega (Mi)", "giga (Gi)", and so on. + +The unit of measure of information is the Byte $B$. +Its multiples can be expressed in powers of $10^3$: + +$ +1 kilobyte = 1 kB = 10^3 B = 1000 B +$ + +or in powers of $2^{10}$: + +$ +1 kibibyte = 1 KiB = 2^{10} B = 1024 B +$ + +Nowadays it is very important to know the difference between the two units: +when you buy an hard disk of 500GB, you are getting only 465GiB! + +Exercise: + +- you bought a 1 TB disk, how many bytes can you store on it? + How many TiB can you store on it? +- check the advertised size of your devices (phone, tablet, computer) + and compute the difference between the one in $GiB$. + +```python +# Use this cell to compute the answer. +byte_size_in_tera = ... +byte_size_in_tebi = ... +``` + +--- + +### Representing numbers + +A number is represented using digits (in Italian, "cifre"): + +- the decimal notation uses 10 digits, from 0 to 9; +- the binary notation uses 2 digits, 0 and 1; +- the octal notation uses 8 digits, from 0 to 7; +- the hexadecimal notation uses 16 digits, where 10 is represented by A, 11 by B, and so on. + +A number +represented in base $b$ +by the digits $c_0, c_1, c_2, \dots, c_n$ +can be computed as: + +$$ +\sum_{i=0}^{n} c_i b^i = c_0 b^0 + c_1 b^1 + c_2 b^2 + \dots + c_n b^n \\ +$$ + +Examples: + +$$ +12_{10} = 2 \cdot 10^0 + 1 \cdot 10^1 = 12 \\ +101_{2} = 1 \cdot 2^0 + 0 \cdot 2^1 + 1 \cdot 2^2 = 5_{10} \\ +200_{3} = 0 \cdot 3^0 + 0 \cdot 3^1 + 2 \cdot 3^2 = 18_{10} \\ +$$ + +Exercise: + +- how can I compute the value of the fractional part? Hint: just use the same formula with negative exponents. + +$$ +0.5_{10} = 5 \cdot 10^{-1} \\ +0.5_{2} = \dots +$$ + +---- + +Python supports the binary, the octal and the hexadecimal notation too! + +```python +d = 0b11 # integer in binary notation +e = 0o11 # integer in octal notation +f = 0x10 # integer in hexadecimal (hex) notation +g = 0x1F # integer in hex notation +``` + +Exercise: + +```python +# Use this cell to print the values of d, e, f and g. +``` + +Questions: + +- What is a bit? +- What is a byte? +- Why in the computer world the hex notation is very common? + +--- + +## Variable assignment + +```python +# I can assign more than one variable on the same line +a, b, c = 1, 2, 3 +d, string_a, string_b = a + b, "foo", "bar" +``` + +```python + +# ...swap them... +(a, b) = (b, a) +``` + +```python +# Exercise: print the values of the above variables +``` + +```python +# but if right-side values are not defined, I get an error (aka exception) +z, f = c, z + d +``` + +--- diff --git a/python-high-school/01_strings.md b/python-high-school/01_strings.md new file mode 100644 index 0000000..a59c1af --- /dev/null +++ b/python-high-school/01_strings.md @@ -0,0 +1,356 @@ +# Strings + +## Agenda + +- Strings +- Character encoding +- Notable escape sequences +- Formatting numbers +- Bonus track: Formatting +- Bonus track: reserved words + +## Strings + +In python you can define a string using single or double quotes: + +```python +# Use the most convenient quotes depending on the string. +a_string = "Ciao, I'm Roberto" +another_string = 'I "love" python' +``` + +A string is a finite, ordered sequence of typographic characters +(e.g., from an alphabet like the one we learn at school). + +Exercise: finite strings using an alphabet $\mathcal{A}$ where $|\mathcal{A}| = k$. + +- How many strings of length $n=8$ can you build? +- How many strings of length $m \le n, n=8$, included the empty string, can you build? +- 🦾 Can you generalize the solution for any $n$ and $k$? + +Hint: use the following cell to compute the answer. + +```python +k = 2 +n = 8 +solution = 1 + ... # compute the solution here +print(solution) +``` + +We can represent the set of all finite strings with $\mathcal{S}$. + +Python defines some operations on strings: + +```python +print("a" + "b") # concatenation +print("a" * 3) # repetition +``` + +You can template strings using the f-string notation: + +```python +a = 1 +print(f"the value of a is {a}") +``` + +Exercise: + +```python +# Use this cell to print the value of a_string and another_string +``` + +--- + +### Character encoding + +While at school we learn the alphabet with 26 letters, +we actually use a much larger alphabet in our daily life: +we use numbers, spaces (e.g. ``, a new line, ), punctuation, emojis, and so on. + +To communicate these charactes at the speed of light, we need to +transmit them using electric signals. +The Morse code was the first way of encoding characters +made to be transmitted using electric signals. + +Nowadays computers represents typographic characters with numbers, +that are then encoded in sequences of $0$ and $1$ and transmitted using electric signals. + +The most common way of mapping characters to numbers is the Extended ASCII table. +Since the basic computer unit is the byte, the Extended ASCII table is limited to 256 characters. + +$ +byte \in \mathbb{Z}_{255} : = \{ z : z \in \mathbb{Z}; 0 \le z \le 255 \} \\ +\mathcal{A} = \{ a, b, c, \dots, A, B, C, \dots, ", !, ?, \dots \} +$ + +$ +chr : \mathbb{Z}_{255} \rightarrow \mathcal{A} \\ +ord : \mathcal{A} \rightarrow \mathbb{Z}_{255} +$ + +```python +# The function chr() returns the character corresponding to an integer. +chr(42) +``` + +```python +# The function ord() returns the integer value of a character. +ord('*') +``` + +Nowadays, the most common character encoding is UTF, that is a superset of ASCII. +It uses more than one byte to represent a character, +so it can represent up to $17 * 2^{16}$ characters +from different languages and symbols like emojis. + +```python +smile = '😀' +print(smile, "->", ord(smile)) +``` + +```python +# prefixing a string with 'r' disables the +# interpretation of the string content +print('Hello' * 2 + r'World\x21') +``` + +---- + +### Notable escape sequences + +You can print special characters such as +`new line` or `tabular spaces` using the escape sequence notation. + +```python +# The \n and \t are +# just the usual notation for newline and tab +print("Hello\n\tWorld!") +``` + +```python +# triple-quoting allows multi-line strings +answer = ord('*') +print(f"""The answer is + +{answer} +""") + +``` + +--- + +## Formatting numbers + +Formatting means representing a number with a string. +Note: it is impossible to represent all the real numbers with finite strings ;) + +$ +formatting: \mathbb{Q} \rightarrow \mathcal{S} +$ + +```python +# bin() and hex() returns a string representation +# of an integer number. These are *different* formatting functions. +a, b1 = hex(10), bin(1) +``` + +```python +# Exercise: which is the type of a? And the type of b1? +type(a) +``` + +---- + +```python +# The format() function is very flexible +# 10 = 8digits + 2chars for the '0b' header +binary_with_leading_zeroes = format(1, '#010b') +``` + +---- + +Processing a string to create a number is called parsing (:it: analisi grammaticale). + +```python +# and reversible with +b1 == int(binary_with_leading_zeroes, base=2) +``` + +---- + +```python +# Exercise: use this cell to inspect the values of the above variables. +``` + +```python +# Exercise: use this cell to compute the value of the hexadecimal number `abc`. +# Hint: read the int function manual. +help(int) +``` + +--- + +## Bonus track: Formatting + +---- + +```python +# The new str.format function just replaces +# %s and %d with {}. +s_a = "is a string " + +print(s_a) +``` + +---- + +```python +# A string +s_a += f"that can be extended" +``` + +---- + +```python +# Exercise: print the value of s_a +``` + +---- + +```python +# Further formatting is done using ":", eg. +# {:.6} -> limit the string to 6 characters +# {:3.2} -> limit the string to 3 characters, 2 after the decimal point + +s_a = f"{s_a} even with {'positional':.6} formatting.\n" +``` + +---- + +```python +# Alignment identifiers are simpler: < left , ^ center, > right +n = 100 +s_a = f"Align {n:>10}% python!" +print(s_a) +print("just prints a string") +``` + +---- + +```python +# Exercise: modify s_a to align the string to the left and to the center. +``` + +--- + +### Formatting with names + +---- + +```python +# You can name variables to get +# a better formatting experience ;) +fmt_a = "{name:<.3} {nick:^.8} {sn:>30}" +print(fmt_a.format(name="-"*10, nick="*"*15, sn="-"*40)) +print(fmt_a.format(name="Roberto", nick="ioggstream", sn="Polli")) +``` + +---- + +## Importing functionalities + +---- + +```python +# Importing new features +# ..is easy. Features are collected +# in packages or modules. Just +import math # to use the +math.sqrt # function + +math.sqrt(2) +``` + +```python +# We can even import single functions +# or constants from a module +from math import pi as π +π / 2 +``` + +---- + +Modules contain documentation in the form of docstrings, +that jupyter presents in scrollable boxes. + +```python + +# Read the module documentation... +help(math) +``` + +```python +# ...or the function documentation +help(math.sqrt) + +``` + +--- + +#### Bonus track: reserved words + +Python has a set of reserved words that cannot be used as variable names, including: + +- `if, else, for, while, and, or, not, in, is, break, continue, pass, def, class, return, try, except, finally, lambda`. + +Sadly, some core, built-in function names in python 2 can be used as variable names, including: + +- `file, print, len, type, list, exit`. + +This means that a programmer can accidentally overwrite the built-in function with a variable of the same name, causing unexpected results. + +Now we will see an example of this, and how to fix it using the built-in module. + +```python +# We should respect reserved words and built-in functions, like print, ord... +print(("ord:\x20", ord)) + +``` + +---- + +```python +# We can discover the original module of an object with +print(ord.__module__) +``` + +---- + +Note: + +- python 2 uses the `__builtin__` module, while +- python 3 uses the `builtins` module. + +In both cases, you should never use the `__builtins__` module (note the final **s**), because it's implementation dependent. +For further information on this topic, see [the python execution model documentation](https://docs.python.org/3/reference/executionmodel.html#builtins-and-restricted-execution) + +---- + +```python +# If we override a function and call it... +ord = 4 +ord('*') # ...ooops! +``` + +```python +# We can fix it up importing the version specific built-in module +# and reassigning the variable to the original function + +try: # Try the python 2 syntax... + import __builtin__ as builtins +except ImportError: # And if it fails, use the python 3 syntax. + import builtins + +ord = builtins.ord +ord('*') # ...ooops! +``` diff --git a/python-high-school/10_collections.md b/python-high-school/10_collections.md new file mode 100644 index 0000000..27ff7c3 --- /dev/null +++ b/python-high-school/10_collections.md @@ -0,0 +1,238 @@ +# Python for System Administrators + +Introductory Lesson 2 + +- Roberto Polli - + +```python +# before starting this lesson +# import the python3 print capabilities +# using the following statement +# NB since now you *must* always use +# parenthesis with print! +from __future__ import print_function, unicode_literals, division +import sys + +# Import further python3 features. +if sys.version_info.major < 3: + from future_builtins import * + import __builtin__ as builtins +``` + +## Introducing Lists + +```python +# it's easy to create a list +list_a = ['this', 'is', 'a', 'list'] + +``` + +```python + +# you can append items to a list +# with the append method +list_a.append("mutable") +``` + +```python +# Print its content +print(list_a) +``` + +```python +# See its length +len(list_a) +``` + +--- + +#### Lists and Generators + +In python you can create lists of subsequent numbers. +In python 2, the `range` function returns a list, +while in python 3 it returns an iterable object. + +This is to avoid memory issues when dealing with large lists. + +```python +a = 11 +#range in python 2 returns a list +# of consecutive ints +from_0_to_10 = range(a) +l = len(from_0_to_10) +l == a +print(l) +``` + +```python +# in python 3 things are slightly different +# so the above code won't work. +import sys +if sys.version_info.major < 3: + range = xrange # Override the range function with the xrange function. +from_0_to_10 = range(a) +``` + +```python +# Exercise: can you print the content of from_0_to_10 +print(from_0_to_10) +``` + +```python + +# In python 3, you need to create a list from the range object. +# The above code +# should be replaced with the following +from_0_to_10 = list(range(a)) +print(from_0_to_10) +``` + +--- + +## Getting list items + +```python +# you can get list items by index +from_0_to_10[0] +``` + +```python +# Exercise: what happens if I get the 11th element? +from_0_to_10[11] +``` + +```python +# python is calling under the hood +from_0_to_10.__getitem__(0) +``` + + +```python +# python lists are doubly linked ;) +from_0_to_10[-1] + +``` + +```python + +# Exercise: please check the manual! +help(list) +``` + +--- + +## Slicing a list + +```python +straight = [1, 2, 3, 'star'] +print(straight) +``` + +```python +# I can take the middle of the list... +straight[1:3] +``` + +```python +k = 2 # ... or using a separator +straight[0:k], straight[k:4] +``` + +```python +straight[:k] # I can omit the first... +``` + +```python +straight[k:] # ...and last index +``` + +--- + +## Strings and Lists + +```python +# Strings behaves like lists +s_a = "Counting: 123" + +``` + +```python + +# Have length.. +l_a = len(s_a) +print(l_a) +``` + +```python +# ..indexes +print(s_a[0], " ", s_a[-1]) +``` + +```python +# and a last element +s_a[l_a] # ...what's happening there? +``` + +```python +# ...we can even slice them +f = "prova.txt" +f[:-4], f[-4], f[-3:] +``` + +```python +# Note: use the os.path module for path manipulation. +# The above code will break with 4-letter extensions! +from os.path import splitext +splitext("prova.foo.yaml") +``` + +--- + +## Iterations: for + +```python +a_list = ['is', 'iterable', 'with'] +for x in a_list: + print(x) +``` + +```python +for x in a_list: + # You need `from __future__ import print_function` + # for python2 to support the `end` argument + print((x), end=' ') + y = x + str(2) + break # stop now +``` + +```python +# what's the expected output of the +# following instruction? +print(("x,y: ", (x, y))) +# Differently from C, `for` does not create +# a scope +``` + +--- + +## Iterations: while + +```python +a_list = ['is', 'iterable', 'with'] +while a_list: + # pop() modifies a list removing + # and returning its last element + x = a_list.pop() + print(("pop out %s" % x)) + break # what happens if I remove this break? + +print(a_list) +``` + +```python +# What's the expected behavior of the +# following instructions? +for x in a_list: + print((x + a_list.pop())) +# for + pop() is not always a good idea ;) +``` diff --git a/python-high-school/20_plots.md b/python-high-school/20_plots.md new file mode 100644 index 0000000..829efa3 --- /dev/null +++ b/python-high-school/20_plots.md @@ -0,0 +1,34 @@ +# Plotting + +Python can plot data and functions with the `matplotlib` module. + +```python +import matplotlib.pyplot as plt +import math +``` + +Let's define a simple function + +```python +f = lambda x: x**3 - 50 * x +``` + +Now define a domain range and evaluate the function + +$$ +\mathcal{D} = [-10; 10 ] \cap \mathbb{Z} \\ +\mathcal{C} = f(\mathcal{D}) := \{f(x) \mid x \in \mathcal{D} \} +$$ + +```python +D = list(range(-10,10)) +C = [f(x) for x in D] +``` + +Now we can plot the function providing the two sets + +```python +# add axis +plt.axhline(0, color='black') +plt.plot(D, C) +``` diff --git a/python-high-school/Dockerfile b/python-high-school/Dockerfile new file mode 100644 index 0000000..03f9ab9 --- /dev/null +++ b/python-high-school/Dockerfile @@ -0,0 +1,12 @@ +# +# Docker image for ipython notebook and various +# python courses +# +FROM ipython/scipyserver +MAINTAINER roberto.polli@par-tec.it + +COPY requirements.txt /requirements.txt + +# install requirements for both py2 and py3 +RUN pip2 install -r /requirements.txt +RUN pip install -r /requirements.txt diff --git a/python-high-school/Makefile b/python-high-school/Makefile new file mode 100644 index 0000000..fbbd0b1 --- /dev/null +++ b/python-high-school/Makefile @@ -0,0 +1,13 @@ +FILES=$(wildcard *.md) +BOOKS = $(patsubst %.md,notebooks/%.ipynb,$(FILES)) + + +all: $(BOOKS) + @echo $(BOOKS) + +notebooks/%.ipynb: %.md + + notedown --to notebook $^ > $@ + +run: all + jupyter notebook notebooks diff --git a/python-high-school/docker-compose.yml b/python-high-school/docker-compose.yml new file mode 100644 index 0000000..cad8615 --- /dev/null +++ b/python-high-school/docker-compose.yml @@ -0,0 +1,19 @@ +sysadminpy: + build: . + hostname: sysadminpy + environment: + - USE_HTTP=1 + - PASSWORD=secret + - SHELL=/bin/bash + ports: + - 8888:8888 + volumes: + - ./rendered_notebooks:/notebooks + +test: + image: ioggstream/python-course:dev + volumes: + - .:/notebooks + ports: + - 18888:8888 + entrypoint: tail -f /etc/hosts diff --git a/python-high-school/notebooks/00_intro.ipynb b/python-high-school/notebooks/00_intro.ipynb new file mode 100644 index 0000000..dfa9cda --- /dev/null +++ b/python-high-school/notebooks/00_intro.ipynb @@ -0,0 +1,602 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "97c9f042", + "metadata": {}, + "source": [ + "# Python for System Administrator\n", + "\n", + " Author: " + ] + }, + { + "cell_type": "markdown", + "id": "186dbb6a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Introducing Python\n", + "\n", + "Python is an interpreted, object oriented language with\n", + "a lot of built in features.\n", + "It can be used as a calculator and for mathematical operations,\n", + "such as statistics, plotting and linear algebra.\n", + "\n", + "This is a fast-track course for high school students with math knowledge.\n", + "\n", + "Students are expected to type and execute cells, and share their results." + ] + }, + { + "cell_type": "markdown", + "id": "1ee510e7", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "# Jupyter\n", + "\n", + "Is the course environment in your browser.\n", + "It requires a modern browser and an internet connection supporting\n", + "websockets. If your network setup (e.g. your proxy)\n", + "does not support websockets, you will not be able to\n", + "execute the code." + ] + }, + { + "cell_type": "markdown", + "id": "5355c303", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "While you might find the exercises' solutions in the environment,\n", + "it is important for you to spend some time trying to do your homework!\n", + "This will help you to remember the concepts and to learn how to use the tools." + ] + }, + { + "cell_type": "markdown", + "id": "866f20ae", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## What can I do with Jupyter?\n", + "\n", + "You can:\n", + "\n", + "- execute the next cell with `SHIFT+ENTER` (try it now!)\n", + "\n", + "If your environment supports it, you can use features requiring\n", + "operating system access:\n", + "\n", + "- [open a (named) terminal on the local machine](/terminals/example)\n", + "- [edit an existing file](/edit/notebooks/untitled.txt)" + ] + }, + { + "cell_type": "markdown", + "id": "3f956448", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "- add more cells with `ALT+ENTER`" + ] + }, + { + "cell_type": "markdown", + "id": "69b72654", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Try to add a cell below this one and write some text in it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89e59e85", + "metadata": {}, + "outputs": [], + "source": [ + "# Add a new python cell with ALT+ENTER." + ] + }, + { + "cell_type": "markdown", + "id": "0aa76d5c", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Python terminal\n", + "\n", + "With Jupyter, you have a Python terminal at your disposal.\n", + "You can run Python code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e9eb2eb", + "metadata": {}, + "outputs": [], + "source": [ + "# You can evaluate maths and strings\n", + "s = 1\n", + "print(\"a string and the number \" + str(s))" + ] + }, + { + "cell_type": "markdown", + "id": "63bfc6ba", + "metadata": {}, + "source": [ + "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a325c9a5", + "metadata": {}, + "outputs": [], + "source": [ + "# Evaluate this cell with SHIFT+ENTER\n", + "s = s + 1\n", + "print(\"now s is increased \" + str(s))" + ] + }, + { + "cell_type": "markdown", + "id": "b296a6f2", + "metadata": {}, + "source": [ + "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", + "This means that sometimes, you need to \"reset\" the environment, to start from scratch.\n", + "\n", + "This can be done with the \"Kernel > Restart\" or \"Kernel > Restart & Clear output\" menu." + ] + }, + { + "cell_type": "markdown", + "id": "bc1dfa5a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## Agenda\n", + "\n", + "- Printing\n", + "- Basic Arithmetic\n", + "- Variable assignment\n", + "- Formatting\n", + "- Importing modules\n", + "- Getting help" + ] + }, + { + "cell_type": "markdown", + "id": "57a517ef", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Basic functions\n", + "\n", + "There are basic functions for printing and\n", + "managing variables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aebfa026", + "metadata": {}, + "outputs": [], + "source": [ + "# you can print with the print() function\n", + "print(\"Hello world!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "581a2d24", + "metadata": {}, + "outputs": [], + "source": [ + "# concatenate strings with a + sign\n", + "# and using hex notation\n", + "print(\"Hello\" + \" \" + \"World!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9c71c76a", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Ciao\")" + ] + }, + { + "cell_type": "markdown", + "id": "0368520f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Basic Arithmetic\n", + "\n", + "A python variable is a label that can be associated to a value." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3774188e", + "metadata": {}, + "outputs": [], + "source": [ + "# This is a comment, while\n", + "a = 1 # is an integer\n", + "b = 16.0 # a float\n", + "c = 1.2e2 # another float in exponential notation" + ] + }, + { + "cell_type": "markdown", + "id": "b876aa79", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e03d8be", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: use the print() function to print the value of a, b and c.\n" + ] + }, + { + "cell_type": "markdown", + "id": "02c4fa49", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "605a2c7d", + "metadata": {}, + "outputs": [], + "source": [ + "# I can sum, multiply, and modulus (aka, the remainder of the division).\n", + "print(a + b, 5 % 2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10891486", + "metadata": {}, + "outputs": [], + "source": [ + "# I can divide, and elevate to a power.\n", + "print(b / a, 2 ** 3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1938916f", + "metadata": {}, + "outputs": [], + "source": [ + "# Brackets are always round.\n", + "print(((a + b) * c)/ a + (b *c))" + ] + }, + { + "cell_type": "markdown", + "id": "0c9123ee", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa84a642", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: which is the expected value of 2 * c?\n", + "print(2 * c)" + ] + }, + { + "cell_type": "markdown", + "id": "64ee10b7", + "metadata": {}, + "source": [ + "Exercise: use the cell above to compute the following values:\n", + "\n", + "- the remainder of 12 / 5\n", + "- $3 \\dot 8; 2^{10}; 2^{20}; 2^{30}$\n", + "- $ \\frac{[1 + (1/3 + 1/4)] + 1/5}{6} $\n", + "\n", + "Computers, for performance reasons, use memory in chunks called blocks or pages:\n", + "for example you can't use a single bit of memory similarly to how you can't\n", + "use a single line of your notebook.\n", + "\n", + "For this reasom it is convenient to use powers of $2^{10}$ to represent the size of files and memory.\n", + "They are called \"kibi (Ki)\", \"mebi (Mi)\", \"gibi (Gi)\", .. to avoid confusion with the powers of $10^{3}$, that are called\n", + "\"kilo (k)\", \"mega (Mi)\", \"giga (Gi)\", and so on.\n", + "\n", + "The unit of measure of information is the Byte $B$.\n", + "Its multiples can be expressed in powers of $10^3$:\n", + "\n", + "$\n", + "1 kilobyte = 1 kB = 10^3 B = 1000 B\n", + "$\n", + "\n", + "or in powers of $2^{10}$:\n", + "\n", + "$\n", + "1 kibibyte = 1 KiB = 2^{10} B = 1024 B\n", + "$\n", + "\n", + "Nowadays it is very important to know the difference between the two units:\n", + "when you buy an hard disk of 500GB, you are getting only 465GiB!\n", + "\n", + "Exercise:\n", + "\n", + "- you bought a 1 TB disk, how many bytes can you store on it?\n", + " How many TiB can you store on it?\n", + "- check the advertised size of your devices (phone, tablet, computer)\n", + " and compute the difference between the one in $GiB$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a82972f", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell to compute the answer.\n", + "byte_size_in_tera = ...\n", + "byte_size_in_tebi = ..." + ] + }, + { + "cell_type": "markdown", + "id": "3de3feef", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "### Representing numbers\n", + "\n", + "A number is represented using digits (in Italian, \"cifre\"):\n", + "\n", + "- the decimal notation uses 10 digits, from 0 to 9;\n", + "- the binary notation uses 2 digits, 0 and 1;\n", + "- the octal notation uses 8 digits, from 0 to 7;\n", + "- the hexadecimal notation uses 16 digits, where 10 is represented by A, 11 by B, and so on.\n", + "\n", + "A number\n", + "represented in base $b$\n", + "by the digits $c_0, c_1, c_2, \\dots, c_n$\n", + "can be computed as:\n", + "\n", + "$$\n", + "\\sum_{i=0}^{n} c_i b^i = c_0 b^0 + c_1 b^1 + c_2 b^2 + \\dots + c_n b^n \\\\\n", + "$$\n", + "\n", + "Examples:\n", + "\n", + "$$\n", + "12_{10} = 2 \\cdot 10^0 + 1 \\cdot 10^1 = 12 \\\\\n", + "101_{2} = 1 \\cdot 2^0 + 0 \\cdot 2^1 + 1 \\cdot 2^2 = 5_{10} \\\\\n", + "200_{3} = 0 \\cdot 3^0 + 0 \\cdot 3^1 + 2 \\cdot 3^2 = 18_{10} \\\\\n", + "$$\n", + "\n", + "Exercise:\n", + "\n", + "- how can I compute the value of the fractional part? Hint: just use the same formula with negative exponents.\n", + "\n", + "$$\n", + "0.5_{10} = 5 \\cdot 10^{-1} \\\\\n", + "0.5_{2} = \\dots\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c3e16220", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Python supports the binary, the octal and the hexadecimal notation too!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b7c5fec2", + "metadata": {}, + "outputs": [], + "source": [ + "d = 0b11 # integer in binary notation\n", + "e = 0o11 # integer in octal notation\n", + "f = 0x10 # integer in hexadecimal (hex) notation\n", + "g = 0x1F # integer in hex notation" + ] + }, + { + "cell_type": "markdown", + "id": "334a31de", + "metadata": {}, + "source": [ + "Exercise:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2013520", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell to print the values of d, e, f and g." + ] + }, + { + "cell_type": "markdown", + "id": "0b0f5466", + "metadata": {}, + "source": [ + "Questions:\n", + "\n", + "- What is a bit?\n", + "- What is a byte?\n", + "- Why in the computer world the hex notation is very common?" + ] + }, + { + "cell_type": "markdown", + "id": "9f9c6ab1", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Variable assignment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f8d352f", + "metadata": {}, + "outputs": [], + "source": [ + "# I can assign more than one variable on the same line\n", + "a, b, c = 1, 2, 3\n", + "d, string_a, string_b = a + b, \"foo\", \"bar\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "239c0cbc", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# ...swap them...\n", + "(a, b) = (b, a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29b50670", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: print the values of the above variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "923d23f5", + "metadata": {}, + "outputs": [], + "source": [ + "# but if right-side values are not defined, I get an error (aka exception)\n", + "z, f = c, z + d" + ] + }, + { + "cell_type": "markdown", + "id": "3c96ff94", + "metadata": {}, + "source": [ + "---" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python-high-school/notebooks/01_strings.ipynb b/python-high-school/notebooks/01_strings.ipynb new file mode 100644 index 0000000..62bf27a --- /dev/null +++ b/python-high-school/notebooks/01_strings.ipynb @@ -0,0 +1,761 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6a60b456", + "metadata": {}, + "source": [ + "# Strings\n", + "\n", + "## Agenda\n", + "\n", + "- Strings\n", + "- Character encoding\n", + "- Notable escape sequences\n", + "- Formatting numbers\n", + "- Bonus track: Formatting\n", + "- Bonus track: reserved words\n", + "\n", + "## Strings\n", + "\n", + "In python you can define a string using single or double quotes:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5e3ef0a", + "metadata": {}, + "outputs": [], + "source": [ + "# Use the most convenient quotes depending on the string.\n", + "a_string = \"Ciao, I'm Roberto\"\n", + "another_string = 'I \"love\" python'" + ] + }, + { + "cell_type": "markdown", + "id": "38858fc0", + "metadata": {}, + "source": [ + "A string is a finite, ordered sequence of typographic characters\n", + "(e.g., from an alphabet like the one we learn at school).\n", + "\n", + "Exercise: finite strings using an alphabet $\\mathcal{A}$ where $|\\mathcal{A}| = k$.\n", + "\n", + "- How many strings of length $n=8$ can you build?\n", + "- How many strings of length $m \\le n, n=8$, included the empty string, can you build?\n", + "- 🦾 Can you generalize the solution for any $n$ and $k$?\n", + "\n", + "Hint: use the following cell to compute the answer." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "268e673b", + "metadata": {}, + "outputs": [], + "source": [ + "k = 2\n", + "n = 8\n", + "solution = 1 + ... # compute the solution here\n", + "print(solution)" + ] + }, + { + "cell_type": "markdown", + "id": "d36ac94d", + "metadata": {}, + "source": [ + "We can represent the set of all finite strings with $\\mathcal{S}$.\n", + "\n", + "Python defines some operations on strings:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b9985ad", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"a\" + \"b\") # concatenation\n", + "print(\"a\" * 3) # repetition" + ] + }, + { + "cell_type": "markdown", + "id": "cd1b9462", + "metadata": {}, + "source": [ + "You can template strings using the f-string notation:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc710626", + "metadata": {}, + "outputs": [], + "source": [ + "a = 1\n", + "print(f\"the value of a is {a}\")" + ] + }, + { + "cell_type": "markdown", + "id": "93029e12", + "metadata": {}, + "source": [ + "Exercise:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5d0757c", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell to print the value of a_string and another_string" + ] + }, + { + "cell_type": "markdown", + "id": "cb6137ab", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "### Character encoding\n", + "\n", + "While at school we learn the alphabet with 26 letters,\n", + "we actually use a much larger alphabet in our daily life:\n", + "we use numbers, spaces (e.g. ``, a new line, ), punctuation, emojis, and so on.\n", + "\n", + "To communicate these charactes at the speed of light, we need to\n", + "transmit them using electric signals.\n", + "The Morse code was the first way of encoding characters\n", + "made to be transmitted using electric signals.\n", + "\n", + "Nowadays computers represents typographic characters with numbers,\n", + "that are then encoded in sequences of $0$ and $1$ and transmitted using electric signals.\n", + "\n", + "The most common way of mapping characters to numbers is the Extended ASCII table.\n", + "Since the basic computer unit is the byte, the Extended ASCII table is limited to 256 characters.\n", + "\n", + "$\n", + "byte \\in \\mathbb{Z}_{255} : = \\{ z : z \\in \\mathbb{Z}; 0 \\le z \\le 255 \\} \\\\\n", + "\\mathcal{A} = \\{ a, b, c, \\dots, A, B, C, \\dots, \", !, ?, \\dots \\}\n", + "$\n", + "\n", + "$\n", + "chr : \\mathbb{Z}_{255} \\rightarrow \\mathcal{A} \\\\\n", + "ord : \\mathcal{A} \\rightarrow \\mathbb{Z}_{255}\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c19b8c7f", + "metadata": {}, + "outputs": [], + "source": [ + "# The function chr() returns the character corresponding to an integer.\n", + "chr(42)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9101ebb0", + "metadata": {}, + "outputs": [], + "source": [ + "# The function ord() returns the integer value of a character.\n", + "ord('*')" + ] + }, + { + "cell_type": "markdown", + "id": "2ff31e36", + "metadata": {}, + "source": [ + "Nowadays, the most common character encoding is UTF, that is a superset of ASCII.\n", + "It uses more than one byte to represent a character,\n", + "so it can represent up to $17 * 2^{16}$ characters\n", + "from different languages and symbols like emojis." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51c157cd", + "metadata": {}, + "outputs": [], + "source": [ + "smile = '😀'\n", + "print(smile, \"->\", ord(smile))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b13a516b", + "metadata": {}, + "outputs": [], + "source": [ + "# prefixing a string with 'r' disables the\n", + "# interpretation of the string content\n", + "print('Hello' * 2 + r'World\\x21')" + ] + }, + { + "cell_type": "markdown", + "id": "dcd69545", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "### Notable escape sequences\n", + "\n", + "You can print special characters such as\n", + "`new line` or `tabular spaces` using the escape sequence notation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e232cd8", + "metadata": {}, + "outputs": [], + "source": [ + "# The \\n and \\t are\n", + "# just the usual notation for newline and tab\n", + "print(\"Hello\\n\\tWorld!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4683e326", + "metadata": {}, + "outputs": [], + "source": [ + "# triple-quoting allows multi-line strings\n", + "answer = ord('*')\n", + "print(f\"\"\"The answer is\n", + "\n", + "{answer}\n", + "\"\"\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "0b572cfb", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Formatting numbers\n", + "\n", + "Formatting means representing a number with a string.\n", + "Note: it is impossible to represent all the real numbers with finite strings ;)\n", + "\n", + "$\n", + "formatting: \\mathbb{Q} \\rightarrow \\mathcal{S}\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32a2fe13", + "metadata": {}, + "outputs": [], + "source": [ + "# bin() and hex() returns a string representation\n", + "# of an integer number. These are *different* formatting functions.\n", + "a, b1 = hex(10), bin(1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee887c24", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: which is the type of a? And the type of b1?\n", + "type(a)" + ] + }, + { + "cell_type": "markdown", + "id": "4557cf35", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27a58fea", + "metadata": {}, + "outputs": [], + "source": [ + "# The format() function is very flexible\n", + "# 10 = 8digits + 2chars for the '0b' header\n", + "binary_with_leading_zeroes = format(1, '#010b')" + ] + }, + { + "cell_type": "markdown", + "id": "dc97eaed", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Processing a string to create a number is called parsing (:it: analisi grammaticale)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c04d308d", + "metadata": {}, + "outputs": [], + "source": [ + "# and reversible with\n", + "b1 == int(binary_with_leading_zeroes, base=2)" + ] + }, + { + "cell_type": "markdown", + "id": "8e8ffb0d", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9cf55762", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: use this cell to inspect the values of the above variables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dec3d1dc", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: use this cell to compute the value of the hexadecimal number `abc`.\n", + "# Hint: read the int function manual.\n", + "help(int)" + ] + }, + { + "cell_type": "markdown", + "id": "cfd8a608", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Bonus track: Formatting" + ] + }, + { + "cell_type": "markdown", + "id": "1b201fc5", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "67ae05d0", + "metadata": {}, + "outputs": [], + "source": [ + "# The new str.format function just replaces\n", + "# %s and %d with {}.\n", + "s_a = \"is a string \"\n", + "\n", + "print(s_a)" + ] + }, + { + "cell_type": "markdown", + "id": "148ccd98", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1418f6c9", + "metadata": {}, + "outputs": [], + "source": [ + "# A string\n", + "s_a += f\"that can be extended\"" + ] + }, + { + "cell_type": "markdown", + "id": "2a8f6acc", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fff63147", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: print the value of s_a" + ] + }, + { + "cell_type": "markdown", + "id": "5960a0ce", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11f3845a", + "metadata": {}, + "outputs": [], + "source": [ + "# Further formatting is done using \":\", eg.\n", + "# {:.6} -> limit the string to 6 characters\n", + "# {:3.2} -> limit the string to 3 characters, 2 after the decimal point\n", + "\n", + "s_a = f\"{s_a} even with {'positional':.6} formatting.\\n\"" + ] + }, + { + "cell_type": "markdown", + "id": "aa66f4da", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb12c1ee", + "metadata": {}, + "outputs": [], + "source": [ + "# Alignment identifiers are simpler: < left , ^ center, > right\n", + "n = 100\n", + "s_a = f\"Align {n:>10}% python!\"\n", + "print(s_a)\n", + "print(\"just prints a string\")" + ] + }, + { + "cell_type": "markdown", + "id": "7fb84908", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58f7ea76", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: modify s_a to align the string to the left and to the center." + ] + }, + { + "cell_type": "markdown", + "id": "c804a7ad", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "### Formatting with names" + ] + }, + { + "cell_type": "markdown", + "id": "18fbcf11", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a50b1b49", + "metadata": {}, + "outputs": [], + "source": [ + "# You can name variables to get\n", + "# a better formatting experience ;)\n", + "fmt_a = \"{name:<.3} {nick:^.8} {sn:>30}\"\n", + "print(fmt_a.format(name=\"-\"*10, nick=\"*\"*15, sn=\"-\"*40))\n", + "print(fmt_a.format(name=\"Roberto\", nick=\"ioggstream\", sn=\"Polli\"))" + ] + }, + { + "cell_type": "markdown", + "id": "6e38dc97", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## Importing functionalities" + ] + }, + { + "cell_type": "markdown", + "id": "eb8a3ea5", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f54e1fb", + "metadata": {}, + "outputs": [], + "source": [ + "# Importing new features\n", + "# ..is easy. Features are collected\n", + "# in packages or modules. Just\n", + "import math # to use the\n", + "math.sqrt # function\n", + "\n", + "math.sqrt(2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84b83670", + "metadata": {}, + "outputs": [], + "source": [ + "# We can even import single functions\n", + "# or constants from a module\n", + "from math import pi as π\n", + "π / 2" + ] + }, + { + "cell_type": "markdown", + "id": "da5b179f", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Modules contain documentation in the form of docstrings,\n", + "that jupyter presents in scrollable boxes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "305a4c1a", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Read the module documentation...\n", + "help(math)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc819ba3", + "metadata": {}, + "outputs": [], + "source": [ + "# ...or the function documentation\n", + "help(math.sqrt)\n" + ] + }, + { + "cell_type": "markdown", + "id": "faafacc6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "#### Bonus track: reserved words\n", + "\n", + "Python has a set of reserved words that cannot be used as variable names, including:\n", + "\n", + "- `if, else, for, while, and, or, not, in, is, break, continue, pass, def, class, return, try, except, finally, lambda`.\n", + "\n", + "Sadly, some core, built-in function names in python 2 can be used as variable names, including:\n", + "\n", + "- `file, print, len, type, list, exit`.\n", + "\n", + "This means that a programmer can accidentally overwrite the built-in function with a variable of the same name, causing unexpected results.\n", + "\n", + "Now we will see an example of this, and how to fix it using the built-in module." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "76eb1ac6", + "metadata": {}, + "outputs": [], + "source": [ + "# We should respect reserved words and built-in functions, like print, ord...\n", + "print((\"ord:\\x20\", ord))\n" + ] + }, + { + "cell_type": "markdown", + "id": "28ed2b90", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e3dadf4", + "metadata": {}, + "outputs": [], + "source": [ + "# We can discover the original module of an object with\n", + "print(ord.__module__)" + ] + }, + { + "cell_type": "markdown", + "id": "90d749c0", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Note:\n", + "\n", + "- python 2 uses the `__builtin__` module, while\n", + "- python 3 uses the `builtins` module.\n", + "\n", + "In both cases, you should never use the `__builtins__` module (note the final **s**), because it's implementation dependent.\n", + "For further information on this topic, see [the python execution model documentation](https://docs.python.org/3/reference/executionmodel.html#builtins-and-restricted-execution)" + ] + }, + { + "cell_type": "markdown", + "id": "5edbc2aa", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "338887a9", + "metadata": {}, + "outputs": [], + "source": [ + "# If we override a function and call it...\n", + "ord = 4\n", + "ord('*') # ...ooops!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "366b882f", + "metadata": {}, + "outputs": [], + "source": [ + "# We can fix it up importing the version specific built-in module\n", + "# and reassigning the variable to the original function\n", + "\n", + "try: # Try the python 2 syntax...\n", + " import __builtin__ as builtins\n", + "except ImportError: # And if it fails, use the python 3 syntax.\n", + " import builtins\n", + "\n", + "ord = builtins.ord\n", + "ord('*') # ...ooops!" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python-high-school/notebooks/10_collections.ipynb b/python-high-school/notebooks/10_collections.ipynb new file mode 100644 index 0000000..87d24ab --- /dev/null +++ b/python-high-school/notebooks/10_collections.ipynb @@ -0,0 +1,494 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "df7aa0ce", + "metadata": {}, + "source": [ + "# Python for System Administrators\n", + "\n", + "Introductory Lesson 2\n", + "\n", + "- Roberto Polli - " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5dde425", + "metadata": {}, + "outputs": [], + "source": [ + "# before starting this lesson\n", + "# import the python3 print capabilities\n", + "# using the following statement\n", + "# NB since now you *must* always use\n", + "# parenthesis with print!\n", + "from __future__ import print_function, unicode_literals, division\n", + "import sys\n", + "\n", + "# Import further python3 features.\n", + "if sys.version_info.major < 3:\n", + " from future_builtins import *\n", + " import __builtin__ as builtins" + ] + }, + { + "cell_type": "markdown", + "id": "e9f7db63", + "metadata": {}, + "source": [ + "## Introducing Lists" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ebbad3f4", + "metadata": {}, + "outputs": [], + "source": [ + "# it's easy to create a list\n", + "list_a = ['this', 'is', 'a', 'list']\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56473c7d", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# you can append items to a list\n", + "# with the append method\n", + "list_a.append(\"mutable\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48aaaaca", + "metadata": {}, + "outputs": [], + "source": [ + "# Print its content\n", + "print(list_a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ada13e8b", + "metadata": {}, + "outputs": [], + "source": [ + "# See its length\n", + "len(list_a)" + ] + }, + { + "cell_type": "markdown", + "id": "17dfcecc", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "#### Lists and Generators\n", + "\n", + "In python you can create lists of subsequent numbers.\n", + "In python 2, the `range` function returns a list,\n", + "while in python 3 it returns an iterable object.\n", + "\n", + "This is to avoid memory issues when dealing with large lists." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a350300a", + "metadata": {}, + "outputs": [], + "source": [ + "a = 11\n", + "#range in python 2 returns a list\n", + "# of consecutive ints\n", + "from_0_to_10 = range(a)\n", + "l = len(from_0_to_10)\n", + "l == a\n", + "print(l)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4213a658", + "metadata": {}, + "outputs": [], + "source": [ + "# in python 3 things are slightly different\n", + "# so the above code won't work.\n", + "import sys\n", + "if sys.version_info.major < 3:\n", + " range = xrange # Override the range function with the xrange function.\n", + "from_0_to_10 = range(a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "67ad2433", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: can you print the content of from_0_to_10\n", + "print(from_0_to_10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfcf5e6b", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# In python 3, you need to create a list from the range object.\n", + "# The above code\n", + "# should be replaced with the following\n", + "from_0_to_10 = list(range(a))\n", + "print(from_0_to_10)" + ] + }, + { + "cell_type": "markdown", + "id": "ce1ba3fa", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Getting list items" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abf7e4fb", + "metadata": {}, + "outputs": [], + "source": [ + "# you can get list items by index\n", + "from_0_to_10[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a9b9a7a8", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: what happens if I get the 11th element?\n", + "from_0_to_10[11]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d1720cb", + "metadata": {}, + "outputs": [], + "source": [ + "# python is calling under the hood\n", + "from_0_to_10.__getitem__(0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac61ac66", + "metadata": {}, + "outputs": [], + "source": [ + "# python lists are doubly linked ;)\n", + "from_0_to_10[-1]\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3db55d40", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Exercise: please check the manual!\n", + "help(list)" + ] + }, + { + "cell_type": "markdown", + "id": "2f685ed6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Slicing a list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f3cc929f", + "metadata": {}, + "outputs": [], + "source": [ + "straight = [1, 2, 3, 'star']\n", + "print(straight)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "416cd0f2", + "metadata": {}, + "outputs": [], + "source": [ + "# I can take the middle of the list...\n", + "straight[1:3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ba5fb57", + "metadata": {}, + "outputs": [], + "source": [ + "k = 2 # ... or using a separator\n", + "straight[0:k], straight[k:4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ecce795d", + "metadata": {}, + "outputs": [], + "source": [ + "straight[:k] # I can omit the first..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffa769dd", + "metadata": {}, + "outputs": [], + "source": [ + "straight[k:] # ...and last index" + ] + }, + { + "cell_type": "markdown", + "id": "efa1b8c7", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Strings and Lists" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92b355fe", + "metadata": {}, + "outputs": [], + "source": [ + "# Strings behaves like lists\n", + "s_a = \"Counting: 123\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87c36c6c", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Have length..\n", + "l_a = len(s_a)\n", + "print(l_a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bb4a24b", + "metadata": {}, + "outputs": [], + "source": [ + "# ..indexes\n", + "print(s_a[0], \" \", s_a[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f30304b", + "metadata": {}, + "outputs": [], + "source": [ + "# and a last element\n", + "s_a[l_a] # ...what's happening there?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d6c26ab", + "metadata": {}, + "outputs": [], + "source": [ + "# ...we can even slice them\n", + "f = \"prova.txt\"\n", + "f[:-4], f[-4], f[-3:]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75eca891", + "metadata": {}, + "outputs": [], + "source": [ + "# Note: use the os.path module for path manipulation.\n", + "# The above code will break with 4-letter extensions!\n", + "from os.path import splitext\n", + "splitext(\"prova.foo.yaml\")" + ] + }, + { + "cell_type": "markdown", + "id": "33529552", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Iterations: for" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a6ba89c", + "metadata": {}, + "outputs": [], + "source": [ + "a_list = ['is', 'iterable', 'with']\n", + "for x in a_list:\n", + " print(x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4de14947", + "metadata": {}, + "outputs": [], + "source": [ + "for x in a_list:\n", + " # You need `from __future__ import print_function`\n", + " # for python2 to support the `end` argument\n", + " print((x), end=' ')\n", + " y = x + str(2)\n", + " break # stop now" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a82d3884", + "metadata": {}, + "outputs": [], + "source": [ + "# what's the expected output of the\n", + "# following instruction?\n", + "print((\"x,y: \", (x, y)))\n", + "# Differently from C, `for` does not create\n", + "# a scope" + ] + }, + { + "cell_type": "markdown", + "id": "024799a1", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Iterations: while" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "77deba6c", + "metadata": {}, + "outputs": [], + "source": [ + "a_list = ['is', 'iterable', 'with']\n", + "while a_list:\n", + " # pop() modifies a list removing\n", + " # and returning its last element\n", + " x = a_list.pop()\n", + " print((\"pop out %s\" % x))\n", + " break # what happens if I remove this break?\n", + "\n", + "print(a_list)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e623c0d5", + "metadata": {}, + "outputs": [], + "source": [ + "# What's the expected behavior of the\n", + "# following instructions?\n", + "for x in a_list:\n", + " print((x + a_list.pop()))\n", + "# for + pop() is not always a good idea ;)" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python-high-school/notebooks/20_plots.ipynb b/python-high-school/notebooks/20_plots.ipynb new file mode 100644 index 0000000..adc9108 --- /dev/null +++ b/python-high-school/notebooks/20_plots.ipynb @@ -0,0 +1,90 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d763e965", + "metadata": {}, + "source": [ + "# Plotting\n", + "\n", + "Python can plot data and functions with the `matplotlib` module." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb80cfdd", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import math" + ] + }, + { + "cell_type": "markdown", + "id": "3f5c6919", + "metadata": {}, + "source": [ + "Let's define a simple function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "369ce24c", + "metadata": {}, + "outputs": [], + "source": [ + "f = lambda x: x**3 - 50 * x" + ] + }, + { + "cell_type": "markdown", + "id": "75bc43e4", + "metadata": {}, + "source": [ + "Now define a domain range and evaluate the function\n", + "\n", + "$$\n", + "\\mathcal{D} = [-10; 10 ] \\cap \\mathbb{Z} \\\\\n", + "\\mathcal{C} = f(\\mathcal{D}) := \\{f(x) \\mid x \\in \\mathcal{D} \\}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef6e798f", + "metadata": {}, + "outputs": [], + "source": [ + "D = list(range(-10,10))\n", + "C = [f(x) for x in D]" + ] + }, + { + "cell_type": "markdown", + "id": "a7554728", + "metadata": {}, + "source": [ + "Now we can plot the function providing the two sets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f02d256", + "metadata": {}, + "outputs": [], + "source": [ + "# add axis\n", + "plt.axhline(0, color='black')\n", + "plt.plot(D, C)" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python-high-school/notebooks/examples.py b/python-high-school/notebooks/examples.py new file mode 100644 index 0000000..406a910 --- /dev/null +++ b/python-high-school/notebooks/examples.py @@ -0,0 +1,41 @@ +def float_to_decimal_base(q, precision=24, base=2): + """ + Convert a finite, rational number in binary format. + + The algorithm is explicit and for didactic purposes only. It is not efficient. + """ + f = float(q) + b = "" + + i = int(f) + d = f - i + + # Represent an integer in base n. + # We start from the least significant digit + # and work our way up to the most significant digit. + # 13(base 10) = 1 * 2^0 + 0 * 2^1 + 1*2^2 + 1*2^3 = 1101(base 2) + while True: + r = i % base + b = str(r) + b + i = i - r + if i == 0: + break + i = int(i / base) + + b += "." + + # Represent a fraction in base n. + # We start from the most significant digit + # and work our way down to the least significant digit. + # 0.625 = 1 * 2^-1 + 0 * 2^-2 + 1 * 2^-3 = 0.101(base 2) + for _ in range(precision): + d = d * base + # Common block between this and the integer case. + i = int( + d + ) # Integer part is analogous to the modulo operation of the integer case. + b = b + str(i) + d = d - i + if d == 0: + break + return b diff --git a/python-high-school/tox.ini b/python-high-school/tox.ini new file mode 100644 index 0000000..01b4418 --- /dev/null +++ b/python-high-school/tox.ini @@ -0,0 +1,23 @@ +# +# This file will either build or run current notebooks +# calling a Makefile. +# +# To build, run: +# +# $ tox +# +# To run the course, run: +# +# $ tox -- run +# +[tox] +envlist = py3 +skipsdist = True + +[testenv] +deps = + git+https://github.com/ioggstream/notedown +allowlist_externals = + make +commands = + make {posargs} From e05c61b80885f1929475028ae00a3e1f7b590672 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Fri, 17 Nov 2023 14:39:02 +0100 Subject: [PATCH 36/52] More stuff (#75) * Better separation. * Iterations. * Updates. --- python-high-school/00_intro.md | 58 +- python-high-school/01_strings.md | 69 +- python-high-school/10_collections.md | 221 +++--- python-high-school/11_iterations.md | 186 +++++ python-high-school/20_plots.md | 51 +- python-high-school/Makefile | 3 + python-high-school/notebooks/00_intro.ipynb | 326 ++++++--- python-high-school/notebooks/01_strings.ipynb | 283 +++++--- .../notebooks/10_collections copy 2.ipynb | 651 ++++++++++++++++++ .../notebooks/10_collections copy.ipynb | 651 ++++++++++++++++++ .../notebooks/10_collections.ipynb | 399 +++++++---- .../notebooks/11_iterations.ipynb | 378 ++++++++++ python-high-school/notebooks/20_plots.ipynb | 108 ++- 13 files changed, 2950 insertions(+), 434 deletions(-) create mode 100644 python-high-school/11_iterations.md create mode 100644 python-high-school/notebooks/10_collections copy 2.ipynb create mode 100644 python-high-school/notebooks/10_collections copy.ipynb create mode 100644 python-high-school/notebooks/11_iterations.ipynb diff --git a/python-high-school/00_intro.md b/python-high-school/00_intro.md index 536aa8f..5b312c9 100644 --- a/python-high-school/00_intro.md +++ b/python-high-school/00_intro.md @@ -1,4 +1,4 @@ -# Python for System Administrator +# Python for High School Author: @@ -160,12 +160,20 @@ print(((a + b) * c)/ a + (b *c)) print(2 * c) ``` -Exercise: use the cell above to compute the following values: +Exercise: use the cell below to compute the following values: - the remainder of 12 / 5 - $3 \dot 8; 2^{10}; 2^{20}; 2^{30}$ - $ \frac{[1 + (1/3 + 1/4)] + 1/5}{6} $ +```python +# Use this cell for the exercise. +``` + +--- + +**An historical note** + Computers, for performance reasons, use memory in chunks called blocks or pages: for example you can't use a single bit of memory similarly to how you can't use a single line of your notebook. @@ -177,32 +185,40 @@ They are called "kibi (Ki)", "mebi (Mi)", "gibi (Gi)", .. to avoid confusion wit The unit of measure of information is the Byte $B$. Its multiples can be expressed in powers of $10^3$: -$ +$$ 1 kilobyte = 1 kB = 10^3 B = 1000 B -$ +$$ or in powers of $2^{10}$: -$ +$$ 1 kibibyte = 1 KiB = 2^{10} B = 1024 B -$ +$$ Nowadays it is very important to know the difference between the two units: when you buy an hard disk of 500GB, you are getting only 465GiB! +---- + Exercise: -- you bought a 1 TB disk, how many bytes can you store on it? - How many TiB can you store on it? +- you bought a 1TB hard disk: how many bytes can you store on it? + + ```python + # Use this cell for the exercise. + size_B = ... + ``` + +- How many GiB can you store on it? Hint: reuse the `size_B` variable. + + ```python + # Use this cell for the exercise. + size_GiB = ... + ``` + - check the advertised size of your devices (phone, tablet, computer) and compute the difference between the one in $GiB$. -```python -# Use this cell to compute the answer. -byte_size_in_tera = ... -byte_size_in_tebi = ... -``` - --- ### Representing numbers @@ -214,31 +230,33 @@ A number is represented using digits (in Italian, "cifre"): - the octal notation uses 8 digits, from 0 to 7; - the hexadecimal notation uses 16 digits, where 10 is represented by A, 11 by B, and so on. +---- + A number represented in base $b$ by the digits $c_0, c_1, c_2, \dots, c_n$ can be computed as: -$$ +$ \sum_{i=0}^{n} c_i b^i = c_0 b^0 + c_1 b^1 + c_2 b^2 + \dots + c_n b^n \\ -$$ +$ Examples: -$$ +$ 12_{10} = 2 \cdot 10^0 + 1 \cdot 10^1 = 12 \\ 101_{2} = 1 \cdot 2^0 + 0 \cdot 2^1 + 1 \cdot 2^2 = 5_{10} \\ 200_{3} = 0 \cdot 3^0 + 0 \cdot 3^1 + 2 \cdot 3^2 = 18_{10} \\ -$$ +$ Exercise: - how can I compute the value of the fractional part? Hint: just use the same formula with negative exponents. -$$ +$ 0.5_{10} = 5 \cdot 10^{-1} \\ 0.5_{2} = \dots -$$ +$ ---- diff --git a/python-high-school/01_strings.md b/python-high-school/01_strings.md index a59c1af..f6d8a5f 100644 --- a/python-high-school/01_strings.md +++ b/python-high-school/01_strings.md @@ -9,6 +9,8 @@ - Bonus track: Formatting - Bonus track: reserved words +--- + ## Strings In python you can define a string using single or double quotes: @@ -20,15 +22,29 @@ another_string = 'I "love" python' ``` A string is a finite, ordered sequence of typographic characters -(e.g., from an alphabet like the one we learn at school). +(e.g., from an alphabet, like the one thaught at school). -Exercise: finite strings using an alphabet $\mathcal{A}$ where $|\mathcal{A}| = k$. +Exercises: finite strings using an alphabet $\Sigma : |\Sigma| = k$. -- How many strings of length $n=8$ can you build? -- How many strings of length $m \le n, n=8$, included the empty string, can you build? -- 🦾 Can you generalize the solution for any $n$ and $k$? +- How many strings of length $n=8$ can you build when $|\Sigma| = 2$? -Hint: use the following cell to compute the answer. +```python +k = 2 +n = 8 +solution = +print(solution) +``` + +- How many strings of length $m : m \le n=8$, included the empty string, can you build? + +```python +solution = +print(solution) +``` + +- 🦾 Can you generalize the solution for any $n$ and $k$? Can you write a mathematical formula for the solution? + +Use the following cell to compute the answer. ```python k = 2 @@ -37,7 +53,14 @@ solution = 1 + ... # compute the solution here print(solution) ``` -We can represent the set of all finite strings with $\mathcal{S}$. + + + +The set of all finite strings can be represented with the symbol $\Sigma^{*}$. + +---- + +### Operations on strings Python defines some operations on strings: @@ -46,7 +69,7 @@ print("a" + "b") # concatenation print("a" * 3) # repetition ``` -You can template strings using the f-string notation: +You can template strings using the so-called "f-string" notation: ```python a = 1 @@ -63,29 +86,35 @@ Exercise: ### Character encoding -While at school we learn the alphabet with 26 letters, -we actually use a much larger alphabet in our daily life: -we use numbers, spaces (e.g. ``, a new line, ), punctuation, emojis, and so on. +At school we learnt a 26-letter, A-Z alphabet. +Today, we commonly use a much larger alphabet, featuring: +lowercase and uppercase letters, numbers, spaces (e.g. " ", a new line, ), punctuation, emojis, and so on. + +---- To communicate these charactes at the speed of light, we need to transmit them using electric signals. The Morse code was the first way of encoding characters -made to be transmitted using electric signals. +made to be transmitted using electric signals over a telegraph. Nowadays computers represents typographic characters with numbers, that are then encoded in sequences of $0$ and $1$ and transmitted using electric signals. -The most common way of mapping characters to numbers is the Extended ASCII table. -Since the basic computer unit is the byte, the Extended ASCII table is limited to 256 characters. +---- + +The most common way of mapping characters to integers is the Extended ASCII table. +Since the basic unit used by computers is the byte, the Extended ASCII table is limited to 256 characters. $ byte \in \mathbb{Z}_{255} : = \{ z : z \in \mathbb{Z}; 0 \le z \le 255 \} \\ -\mathcal{A} = \{ a, b, c, \dots, A, B, C, \dots, ", !, ?, \dots \} +\Sigma = \{ a, b, c, \dots, A, B, C, \dots, ", !, ?, \dots \} $ +The python functions `chr` and `ord` are used to convert between characters and integers. + $ -chr : \mathbb{Z}_{255} \rightarrow \mathcal{A} \\ -ord : \mathcal{A} \rightarrow \mathbb{Z}_{255} +chr : \mathbb{Z}_{255} \rightarrow \Sigma \\ +ord : \Sigma \rightarrow \mathbb{Z}_{255} $ ```python @@ -98,6 +127,8 @@ chr(42) ord('*') ``` +---- + Nowadays, the most common character encoding is UTF, that is a superset of ASCII. It uses more than one byte to represent a character, so it can represent up to $17 * 2^{16}$ characters @@ -141,11 +172,11 @@ print(f"""The answer is ## Formatting numbers -Formatting means representing a number with a string. +Formatting means representing a number with a finite string. Note: it is impossible to represent all the real numbers with finite strings ;) $ -formatting: \mathbb{Q} \rightarrow \mathcal{S} +formatting: \mathbb{Q} \rightarrow \Sigma^{*} $ ```python diff --git a/python-high-school/10_collections.md b/python-high-school/10_collections.md index 27ff7c3..2c9e6ad 100644 --- a/python-high-school/10_collections.md +++ b/python-high-school/10_collections.md @@ -1,26 +1,87 @@ -# Python for System Administrators +# Python for High School -Introductory Lesson 2 +Lesson 2 - Roberto Polli - +## Agenda + +- Sets +- Introducing Lists +- Getting list items +- Slicing a list +- Strings and Lists +- Iterations: `for` +- Iterations: `while` + +## Sets + +In maths, a set is a collection of distinct objects. + +```python +# In python you can create sets. +EMPTY = {} # ø is the empty set +A = {1, 2, 3} +B = {3, 4, 5, "a"} # sets can contain different types +C = { A } # a set can contain other sets +``` + +Here is an image from Wikipedia: +[![Set Theory Operations](https://upload.wikimedia.org/wikipedia/commons/0/04/Set_Theory_Operations.svg)](https://en.wikipedia.org/wiki/Set_(mathematics)#/media/File:Set_Theory_Operations.svg) + +You can perform set operations on them, including: + +$ +U = A \cup B \\ +I = A \cap B \\ +D = A \setminus B \\ +S = A \Delta B := (A \cup B) \setminus (A \cap B) \\ +$ + +```python +# Union +U = A | B +# Intersection +I = A & B +# Difference +D = A - B +# Symmetric difference +S = A ^ B +``` + +You can perform basic checks: + +```python +A in U +B not in U +B in D +5 in A +{1} in A +EMPTY in A +I in S +2 in C +``` + +Exercise: which of the above instructions are true? + +```python +# Use this cell for the exercise + +``` + +Exercise: print the content of the sets. + ```python -# before starting this lesson -# import the python3 print capabilities -# using the following statement -# NB since now you *must* always use -# parenthesis with print! -from __future__ import print_function, unicode_literals, division -import sys +# Use this cell for the exercise -# Import further python3 features. -if sys.version_info.major < 3: - from future_builtins import * - import __builtin__ as builtins ``` ## Introducing Lists +A list is an ordered sequence of items. +Differently from a set, a list is ordered +and can contain duplicates. + ```python # it's easy to create a list list_a = ['this', 'is', 'a', 'list'] @@ -48,45 +109,47 @@ len(list_a) #### Lists and Generators -In python you can create lists of subsequent numbers. -In python 2, the `range` function returns a list, -while in python 3 it returns an iterable object. - -This is to avoid memory issues when dealing with large lists. +In python you can generate a sequence of numbers. +To avoid consuming too much memory, this is not doen using lists +or sets, but using special objects that generate those sequences. ```python a = 11 -#range in python 2 returns a list -# of consecutive ints from_0_to_10 = range(a) -l = len(from_0_to_10) -l == a -print(l) ``` +Exercise: + +- print the length of `from_0_to_10` + ```python -# in python 3 things are slightly different -# so the above code won't work. -import sys -if sys.version_info.major < 3: - range = xrange # Override the range function with the xrange function. -from_0_to_10 = range(a) +# Use this cell for the exercise + ``` +- print the `type` of `from_0_to_10` + ```python -# Exercise: can you print the content of from_0_to_10 -print(from_0_to_10) +# Use this cell for the exercise + ``` +We can extract all the elements from a generator using the `list` function. + ```python +from_0_to_10 = list(from_0_to_10) +l = len(from_0_to_10) +l == a +print(l) +``` + -# In python 3, you need to create a list from the range object. -# The above code -# should be replaced with the following -from_0_to_10 = list(range(a)) +```python +# Exercise: can you print the content of from_0_to_10 print(from_0_to_10) ``` + --- ## Getting list items @@ -106,6 +169,7 @@ from_0_to_10[11] from_0_to_10.__getitem__(0) ``` +Python lists are doubly linked, so you can get the last element using a negative index. ```python # python lists are doubly linked ;) @@ -128,6 +192,25 @@ straight = [1, 2, 3, 'star'] print(straight) ``` +Python supports slicing, that is, getting a subsequence of a list +similarly to what you can do with mathematical intervals. +Python uses a half-open interval +( e.g. $[i, j)$ or $[i, j[$ ), +that is, the first index is included +and the last one is excluded. Given a list `l : |l| = 4` + +$ +l = [ l_{0}, \dots, l_{3} ] \\ +l[0:2] := [ l_{0}, l_{1} ] \\ +l[i:j] := [ l_{i}, \dots, l_{j-1} ] \\ +$ + +This means that the length of a sliced list is: + +$ +|l[i:j]| = j - i \\ +$ + ```python # I can take the middle of the list... straight[1:3] @@ -175,64 +258,48 @@ s_a[l_a] # ...what's happening there? ```python # ...we can even slice them -f = "prova.txt" -f[:-4], f[-4], f[-3:] -``` - -```python -# Note: use the os.path module for path manipulation. -# The above code will break with 4-letter extensions! -from os.path import splitext -splitext("prova.foo.yaml") +f = "gatto.miao" +f[:-5], f[-5], f[-4:] ``` --- -## Iterations: for +## Juggling with iterables -```python -a_list = ['is', 'iterable', 'with'] -for x in a_list: - print(x) -``` +We can sort and reverse lists. ```python -for x in a_list: - # You need `from __future__ import print_function` - # for python2 to support the `end` argument - print((x), end=' ') - y = x + str(2) - break # stop now +l = [1, 2, 3, 4, 5] +r = reversed(l) +print(r) ``` +reversed is a generator, so we need to convert it to a list to print it. ```python -# what's the expected output of the -# following instruction? -print(("x,y: ", (x, y))) -# Differently from C, `for` does not create -# a scope +# Exercise: print the reversed list + ``` ---- + -## Iterations: while +If we have different lists, we can concatenate them. ```python -a_list = ['is', 'iterable', 'with'] -while a_list: - # pop() modifies a list removing - # and returning its last element - x = a_list.pop() - print(("pop out %s" % x)) - break # what happens if I remove this break? - -print(a_list) +A = [1, 2, 3] +B = [4, 5, 6] +A + B ``` +or associate pairwise elements using the `zip` function. + +$ +A = [a_0, a_1, a_2] +B = [b_0, b_1, b_2] +diag(A,B) = [ (a_i, b_i) \mid i < min(|A|, |B|) ] +$ + ```python -# What's the expected behavior of the -# following instructions? -for x in a_list: - print((x + a_list.pop())) -# for + pop() is not always a good idea ;) +D = zip(A, B) +print(D) ``` + diff --git a/python-high-school/11_iterations.md b/python-high-school/11_iterations.md new file mode 100644 index 0000000..a6edc1c --- /dev/null +++ b/python-high-school/11_iterations.md @@ -0,0 +1,186 @@ +# Python for High School + +Lesson 3: Iterations + +## Agenda + +- Conditions: `if` +- Iterations: `for` +- Iterations: `while` + + +## Conditions: `if` + +Python can evaluate conditions using `if` statements. + +```python +n = 2 +parity = "even" if n % 2 == 0 else "odd" +``` + +More complex conditions can be evaluated using multiple lines +and the `elif` and `else` keywords. + +```python +# Sign of a function. +n = 1 +if n > 0: + sign = 1 +elif n < 0: + sign = -1 +else: + sign = 0 +``` + +```python +# Exercise. Modify the cell above and check that the sign of 0 is 0. +print(sign) +``` + +## Iterations: `for` + +Iterating means to repeat a process multiple times +with different values. + +We are familiar with iterations in maths. +When we sum a list of numbers, we always repeat the same process: + +0. start with a sum of 0 +1. take the next number from the list +2. add it to the sum +3. if there are more numbers, go to 1 +4. otherwise, stop + +Python allows you to iterate over a sequence of items using the `for` instruction. + +```python +a_list = ['is', 'iterable', 'with'] +for x in a_list: + print(x) +``` + +We can stop the iteration using the `break` instruction. + +```python +for x in a_list: + print(x, end=' ') + y = x + str(2) + break # stop now +``` + + +```python +# what's the expected output of the +# following instruction? +print(("x, y: ", (x, y))) +# Differently from other languages like C, `for` does not create +# a scope +``` + +Combining `if` and `break` we can stop the iteration when a condition is met. + +```python +for i in range(10): + if i == 5: + break + print(i, end=' ') +``` + +We can use conditions on other variables + +```python +s = 0 +for i in range(10): + if s > 10: + break + s += i +print(s, end=' ') +``` + +Exercise: write a loop that prints all the divisors of $n=100$. + +```python +n = 100 +for q in range(2, n): + # Write your code here. + +``` + +--- + +## Iterations: while + +We can even iterate over specific conditions. + +```python +i = 10: +while i > 0: + print(i, end=' ') + i -= 1 +``` + +Exercise: complete the code below to write a loop with the same output of the previous cell. + +```python +i = ... +while ...: + print(i, end=' ') + i += 1 +``` + +Exercise: write a loop that prints all the divisors of $n=100$. + +```python +n = 100 +q = 2 +while ...: + if ...: + print(q, end="; ") + ... +``` + +Exercise: write a loop that prints all the prime factors of $n=100$, i.e. $2; 2; 5; 5;$. + +```python +n = 100 +q = 2 +while ...: + if ...: + print(q, end="; ") + ... + +``` + +--- + +`while` can use an iterable to check if there are more elements. + + +```python +a_list = ['is', 'iterable', 'with'] +while a_list: + # pop() modifies a list removing + # and returning its last element + x = a_list.pop() + print(f"pop out {x}") + break # what happens if I remove this break? + +print(a_list) +``` + +```python +# What's the expected behavior of the +# following instructions? +for x in a_list: + print((x + a_list.pop())) +# for + pop() is not always a good idea ;) +``` + diff --git a/python-high-school/20_plots.md b/python-high-school/20_plots.md index 829efa3..d3430c2 100644 --- a/python-high-school/20_plots.md +++ b/python-high-school/20_plots.md @@ -7,7 +7,17 @@ import matplotlib.pyplot as plt import math ``` -Let's define a simple function +A computer can't plot a function, it can only plot points. So we need to provide a set of points that are close enough to the function. +This means that when you zoom in, the plot looks like a series of joint segments. + +## Plotting points + +We can use the `lambda` keyword to define simple functions. +This is equivalent to + +$ +f(x) = x^3 - 50x +$ ```python f = lambda x: x**3 - 50 * x @@ -15,16 +25,41 @@ f = lambda x: x**3 - 50 * x Now define a domain range and evaluate the function -$$ +$ \mathcal{D} = [-10; 10 ] \cap \mathbb{Z} \\ \mathcal{C} = f(\mathcal{D}) := \{f(x) \mid x \in \mathcal{D} \} -$$ +$ ```python D = list(range(-10,10)) C = [f(x) for x in D] ``` +Exercises: + +- print the domain and codomain + +```python +# Use this cell for the exercise + +``` + +- use the `zip` function to print a table pairs + using the string formatting tools, e.g.: + +~~~ + x | f(x) +-10 | -500 + -9 | -279 +... | ... +~~~ + + +```python +# Use this cell for the exercise + +``` + Now we can plot the function providing the two sets ```python @@ -32,3 +67,13 @@ Now we can plot the function providing the two sets plt.axhline(0, color='black') plt.plot(D, C) ``` + +## Geometric plotting + +The sympy module has functionalities for geometric objects. + +```python +import matplotlib +from sympy import symbols, Point, Line, Circle, Triangle, Polygon, pi + +``` \ No newline at end of file diff --git a/python-high-school/Makefile b/python-high-school/Makefile index fbbd0b1..d798266 100644 --- a/python-high-school/Makefile +++ b/python-high-school/Makefile @@ -5,6 +5,9 @@ BOOKS = $(patsubst %.md,notebooks/%.ipynb,$(FILES)) all: $(BOOKS) @echo $(BOOKS) +clean: + rm -rf notebooks/*.ipynb + notebooks/%.ipynb: %.md notedown --to notebook $^ > $@ diff --git a/python-high-school/notebooks/00_intro.ipynb b/python-high-school/notebooks/00_intro.ipynb index dfa9cda..3e365b6 100644 --- a/python-high-school/notebooks/00_intro.ipynb +++ b/python-high-school/notebooks/00_intro.ipynb @@ -2,17 +2,17 @@ "cells": [ { "cell_type": "markdown", - "id": "97c9f042", + "id": "541e0ebb", "metadata": {}, "source": [ - "# Python for System Administrator\n", + "# Python for High School\n", "\n", " Author: " ] }, { "cell_type": "markdown", - "id": "186dbb6a", + "id": "38c2409b", "metadata": { "slideshow": { "slide_type": "slide" @@ -35,7 +35,7 @@ }, { "cell_type": "markdown", - "id": "1ee510e7", + "id": "a941c975", "metadata": { "slideshow": { "slide_type": "slide" @@ -55,7 +55,7 @@ }, { "cell_type": "markdown", - "id": "5355c303", + "id": "2e544053", "metadata": { "slideshow": { "slide_type": "slide" @@ -71,7 +71,7 @@ }, { "cell_type": "markdown", - "id": "866f20ae", + "id": "a921a209", "metadata": { "slideshow": { "slide_type": "slide" @@ -95,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "3f956448", + "id": "dfb7b5f2", "metadata": { "slideshow": { "slide_type": "slide" @@ -109,7 +109,7 @@ }, { "cell_type": "markdown", - "id": "69b72654", + "id": "0eb6d312", "metadata": { "slideshow": { "slide_type": "subslide" @@ -123,17 +123,29 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "89e59e85", + "execution_count": 2, + "id": "eb803254", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Add a new python cell with ALT+ENTER." + "# Add a new python cell with ALT+ENTER.\n", + "1+1" ] }, { "cell_type": "markdown", - "id": "0aa76d5c", + "id": "c8e8c17a", "metadata": { "slideshow": { "slide_type": "slide" @@ -150,10 +162,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "1e9eb2eb", + "execution_count": 3, + "id": "3a9704b2", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a string and the number 1\n" + ] + } + ], "source": [ "# You can evaluate maths and strings\n", "s = 1\n", @@ -162,7 +182,7 @@ }, { "cell_type": "markdown", - "id": "63bfc6ba", + "id": "bcdc49d9", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -170,10 +190,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "a325c9a5", + "execution_count": 4, + "id": "42513575", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "now s is increased 2\n" + ] + } + ], "source": [ "# Evaluate this cell with SHIFT+ENTER\n", "s = s + 1\n", @@ -182,7 +210,7 @@ }, { "cell_type": "markdown", - "id": "b296a6f2", + "id": "685ef0a8", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -193,7 +221,7 @@ }, { "cell_type": "markdown", - "id": "bc1dfa5a", + "id": "48211e42", "metadata": { "slideshow": { "slide_type": "subslide" @@ -214,7 +242,7 @@ }, { "cell_type": "markdown", - "id": "57a517ef", + "id": "a8d40f8c", "metadata": { "slideshow": { "slide_type": "slide" @@ -231,10 +259,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "aebfa026", + "execution_count": 5, + "id": "53ff77a2", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello world!\n" + ] + } + ], "source": [ "# you can print with the print() function\n", "print(\"Hello world!\")" @@ -242,10 +278,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "581a2d24", + "execution_count": 6, + "id": "50bc92a7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World!\n" + ] + } + ], "source": [ "# concatenate strings with a + sign\n", "# and using hex notation\n", @@ -254,17 +298,25 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "9c71c76a", + "execution_count": 7, + "id": "c3c40dad", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ciao\n" + ] + } + ], "source": [ "print(\"Ciao\")" ] }, { "cell_type": "markdown", - "id": "0368520f", + "id": "a323df65", "metadata": { "slideshow": { "slide_type": "slide" @@ -280,8 +332,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "3774188e", + "execution_count": 8, + "id": "e575a8c8", "metadata": {}, "outputs": [], "source": [ @@ -293,7 +345,7 @@ }, { "cell_type": "markdown", - "id": "b876aa79", + "id": "f43d6e73", "metadata": {}, "source": [ "----" @@ -301,8 +353,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8e03d8be", + "execution_count": 9, + "id": "0ac091aa", "metadata": {}, "outputs": [], "source": [ @@ -311,7 +363,7 @@ }, { "cell_type": "markdown", - "id": "02c4fa49", + "id": "ff2d4ed6", "metadata": {}, "source": [ "----" @@ -319,10 +371,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "605a2c7d", + "execution_count": 10, + "id": "c9ce3bb8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "17.0 1\n" + ] + } + ], "source": [ "# I can sum, multiply, and modulus (aka, the remainder of the division).\n", "print(a + b, 5 % 2)" @@ -330,10 +390,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "10891486", + "execution_count": 11, + "id": "2206a7b1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "16.0 8\n" + ] + } + ], "source": [ "# I can divide, and elevate to a power.\n", "print(b / a, 2 ** 3)" @@ -341,10 +409,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "1938916f", + "execution_count": 12, + "id": "c6bd8c5d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3960.0\n" + ] + } + ], "source": [ "# Brackets are always round.\n", "print(((a + b) * c)/ a + (b *c))" @@ -352,7 +428,7 @@ }, { "cell_type": "markdown", - "id": "0c9123ee", + "id": "71b07a6d", "metadata": {}, "source": [ "----" @@ -361,7 +437,7 @@ { "cell_type": "code", "execution_count": null, - "id": "aa84a642", + "id": "fb244c7c", "metadata": {}, "outputs": [], "source": [ @@ -371,14 +447,38 @@ }, { "cell_type": "markdown", - "id": "64ee10b7", + "id": "3b05c9f2", "metadata": {}, "source": [ - "Exercise: use the cell above to compute the following values:\n", + "Exercise: use the cell below to compute the following values:\n", "\n", "- the remainder of 12 / 5\n", "- $3 \\dot 8; 2^{10}; 2^{20}; 2^{30}$\n", - "- $ \\frac{[1 + (1/3 + 1/4)] + 1/5}{6} $\n", + "- $ \\frac{[1 + (1/3 + 1/4)] + 1/5}{6} $" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2311402f", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise." + ] + }, + { + "cell_type": "markdown", + "id": "a228c64e", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "**An historical note**\n", "\n", "Computers, for performance reasons, use memory in chunks called blocks or pages:\n", "for example you can't use a single bit of memory similarly to how you can't\n", @@ -391,42 +491,54 @@ "The unit of measure of information is the Byte $B$.\n", "Its multiples can be expressed in powers of $10^3$:\n", "\n", - "$\n", + "$$\n", "1 kilobyte = 1 kB = 10^3 B = 1000 B\n", - "$\n", + "$$\n", "\n", "or in powers of $2^{10}$:\n", "\n", - "$\n", + "$$\n", "1 kibibyte = 1 KiB = 2^{10} B = 1024 B\n", - "$\n", + "$$\n", "\n", "Nowadays it is very important to know the difference between the two units:\n", - "when you buy an hard disk of 500GB, you are getting only 465GiB!\n", + "when you buy an hard disk of 500GB, you are getting only 465GiB!" + ] + }, + { + "cell_type": "markdown", + "id": "e682080d", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", "\n", "Exercise:\n", "\n", - "- you bought a 1 TB disk, how many bytes can you store on it?\n", - " How many TiB can you store on it?\n", + "- you bought a 1TB hard disk: how many bytes can you store on it?\n", + "\n", + " ```python\n", + " # Use this cell for the exercise.\n", + " size_B = ...\n", + " ```\n", + "\n", + "- How many GiB can you store on it? Hint: reuse the `size_B` variable.\n", + "\n", + " ```python\n", + " # Use this cell for the exercise.\n", + " size_GiB = ...\n", + " ```\n", + "\n", "- check the advertised size of your devices (phone, tablet, computer)\n", " and compute the difference between the one in $GiB$." ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "0a82972f", - "metadata": {}, - "outputs": [], - "source": [ - "# Use this cell to compute the answer.\n", - "byte_size_in_tera = ...\n", - "byte_size_in_tebi = ..." - ] - }, { "cell_type": "markdown", - "id": "3de3feef", + "id": "72f88a13", "metadata": { "slideshow": { "slide_type": "slide" @@ -442,38 +554,50 @@ "- the decimal notation uses 10 digits, from 0 to 9;\n", "- the binary notation uses 2 digits, 0 and 1;\n", "- the octal notation uses 8 digits, from 0 to 7;\n", - "- the hexadecimal notation uses 16 digits, where 10 is represented by A, 11 by B, and so on.\n", + "- the hexadecimal notation uses 16 digits, where 10 is represented by A, 11 by B, and so on." + ] + }, + { + "cell_type": "markdown", + "id": "12888ed1", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", "\n", "A number\n", "represented in base $b$\n", "by the digits $c_0, c_1, c_2, \\dots, c_n$\n", "can be computed as:\n", "\n", - "$$\n", + "$\n", "\\sum_{i=0}^{n} c_i b^i = c_0 b^0 + c_1 b^1 + c_2 b^2 + \\dots + c_n b^n \\\\\n", - "$$\n", + "$\n", "\n", "Examples:\n", "\n", - "$$\n", + "$\n", "12_{10} = 2 \\cdot 10^0 + 1 \\cdot 10^1 = 12 \\\\\n", "101_{2} = 1 \\cdot 2^0 + 0 \\cdot 2^1 + 1 \\cdot 2^2 = 5_{10} \\\\\n", "200_{3} = 0 \\cdot 3^0 + 0 \\cdot 3^1 + 2 \\cdot 3^2 = 18_{10} \\\\\n", - "$$\n", + "$\n", "\n", "Exercise:\n", "\n", "- how can I compute the value of the fractional part? Hint: just use the same formula with negative exponents.\n", "\n", - "$$\n", + "$\n", "0.5_{10} = 5 \\cdot 10^{-1} \\\\\n", "0.5_{2} = \\dots\n", - "$$" + "$" ] }, { "cell_type": "markdown", - "id": "c3e16220", + "id": "72311490", "metadata": { "slideshow": { "slide_type": "subslide" @@ -488,7 +612,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b7c5fec2", + "id": "3d4374f3", "metadata": {}, "outputs": [], "source": [ @@ -500,7 +624,7 @@ }, { "cell_type": "markdown", - "id": "334a31de", + "id": "bbaa1d21", "metadata": {}, "source": [ "Exercise:" @@ -509,7 +633,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d2013520", + "id": "65a51377", "metadata": {}, "outputs": [], "source": [ @@ -518,7 +642,7 @@ }, { "cell_type": "markdown", - "id": "0b0f5466", + "id": "dfec7885", "metadata": {}, "source": [ "Questions:\n", @@ -530,7 +654,7 @@ }, { "cell_type": "markdown", - "id": "9f9c6ab1", + "id": "7ddbac36", "metadata": { "slideshow": { "slide_type": "slide" @@ -545,7 +669,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0f8d352f", + "id": "afb9abcc", "metadata": {}, "outputs": [], "source": [ @@ -557,7 +681,7 @@ { "cell_type": "code", "execution_count": null, - "id": "239c0cbc", + "id": "7b3d2e93", "metadata": {}, "outputs": [], "source": [ @@ -569,7 +693,7 @@ { "cell_type": "code", "execution_count": null, - "id": "29b50670", + "id": "b028d74c", "metadata": {}, "outputs": [], "source": [ @@ -579,7 +703,7 @@ { "cell_type": "code", "execution_count": null, - "id": "923d23f5", + "id": "0ae02a39", "metadata": {}, "outputs": [], "source": [ @@ -589,14 +713,32 @@ }, { "cell_type": "markdown", - "id": "3c96ff94", + "id": "511ab2f0", "metadata": {}, "source": [ "---" ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, "nbformat": 4, "nbformat_minor": 5 } diff --git a/python-high-school/notebooks/01_strings.ipynb b/python-high-school/notebooks/01_strings.ipynb index 62bf27a..3f496e1 100644 --- a/python-high-school/notebooks/01_strings.ipynb +++ b/python-high-school/notebooks/01_strings.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "6a60b456", + "id": "7d0ea8ef", "metadata": {}, "source": [ "# Strings\n", @@ -14,7 +14,19 @@ "- Notable escape sequences\n", "- Formatting numbers\n", "- Bonus track: Formatting\n", - "- Bonus track: reserved words\n", + "- Bonus track: reserved words" + ] + }, + { + "cell_type": "markdown", + "id": "93f34edf", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", "\n", "## Strings\n", "\n", @@ -24,7 +36,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c5e3ef0a", + "id": "f7fafa85", "metadata": {}, "outputs": [], "source": [ @@ -35,25 +47,63 @@ }, { "cell_type": "markdown", - "id": "38858fc0", + "id": "722b6093", "metadata": {}, "source": [ "A string is a finite, ordered sequence of typographic characters\n", - "(e.g., from an alphabet like the one we learn at school).\n", + "(e.g., from an alphabet, like the one thaught at school).\n", "\n", - "Exercise: finite strings using an alphabet $\\mathcal{A}$ where $|\\mathcal{A}| = k$.\n", + "Exercises: finite strings using an alphabet $\\Sigma : |\\Sigma| = k$.\n", "\n", - "- How many strings of length $n=8$ can you build?\n", - "- How many strings of length $m \\le n, n=8$, included the empty string, can you build?\n", - "- 🦾 Can you generalize the solution for any $n$ and $k$?\n", + "- How many strings of length $n=8$ can you build when $|\\Sigma| = 2$?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b98812b3", + "metadata": {}, + "outputs": [], + "source": [ + "k = 2\n", + "n = 8\n", + "solution =\n", + "print(solution)" + ] + }, + { + "cell_type": "markdown", + "id": "91ae8e39", + "metadata": {}, + "source": [ + "- How many strings of length $m : m \\le n=8$, included the empty string, can you build?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4bf14742", + "metadata": {}, + "outputs": [], + "source": [ + "solution =\n", + "print(solution)" + ] + }, + { + "cell_type": "markdown", + "id": "3cf1f3fe", + "metadata": {}, + "source": [ + "- 🦾 Can you generalize the solution for any $n$ and $k$? Can you write a mathematical formula for the solution?\n", "\n", - "Hint: use the following cell to compute the answer." + "Use the following cell to compute the answer." ] }, { "cell_type": "code", "execution_count": null, - "id": "268e673b", + "id": "e3dd62b0", "metadata": {}, "outputs": [], "source": [ @@ -65,10 +115,27 @@ }, { "cell_type": "markdown", - "id": "d36ac94d", + "id": "b0896514", "metadata": {}, "source": [ - "We can represent the set of all finite strings with $\\mathcal{S}$.\n", + "\n", + "\n", + "\n", + "The set of all finite strings can be represented with the symbol $\\Sigma^{*}$." + ] + }, + { + "cell_type": "markdown", + "id": "a1b33fbe", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "### Operations on strings\n", "\n", "Python defines some operations on strings:" ] @@ -76,7 +143,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2b9985ad", + "id": "262d3cd0", "metadata": {}, "outputs": [], "source": [ @@ -86,16 +153,16 @@ }, { "cell_type": "markdown", - "id": "cd1b9462", + "id": "4e22e329", "metadata": {}, "source": [ - "You can template strings using the f-string notation:" + "You can template strings using the so-called \"f-string\" notation:" ] }, { "cell_type": "code", "execution_count": null, - "id": "fc710626", + "id": "3a09f95f", "metadata": {}, "outputs": [], "source": [ @@ -105,7 +172,7 @@ }, { "cell_type": "markdown", - "id": "93029e12", + "id": "9cf705fa", "metadata": {}, "source": [ "Exercise:" @@ -114,7 +181,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e5d0757c", + "id": "3a8757c3", "metadata": {}, "outputs": [], "source": [ @@ -123,7 +190,7 @@ }, { "cell_type": "markdown", - "id": "cb6137ab", + "id": "a8cdbbb7", "metadata": { "slideshow": { "slide_type": "slide" @@ -134,36 +201,62 @@ "\n", "### Character encoding\n", "\n", - "While at school we learn the alphabet with 26 letters,\n", - "we actually use a much larger alphabet in our daily life:\n", - "we use numbers, spaces (e.g. ``, a new line, ), punctuation, emojis, and so on.\n", + "At school we learnt a 26-letter, A-Z alphabet.\n", + "Today, we commonly use a much larger alphabet, featuring:\n", + "lowercase and uppercase letters, numbers, spaces (e.g. \" \", a new line, ), punctuation, emojis, and so on." + ] + }, + { + "cell_type": "markdown", + "id": "8a8f2142", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", "\n", "To communicate these charactes at the speed of light, we need to\n", "transmit them using electric signals.\n", "The Morse code was the first way of encoding characters\n", - "made to be transmitted using electric signals.\n", + "made to be transmitted using electric signals over a telegraph.\n", "\n", "Nowadays computers represents typographic characters with numbers,\n", - "that are then encoded in sequences of $0$ and $1$ and transmitted using electric signals.\n", + "that are then encoded in sequences of $0$ and $1$ and transmitted using electric signals." + ] + }, + { + "cell_type": "markdown", + "id": "cb1f509d", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", "\n", - "The most common way of mapping characters to numbers is the Extended ASCII table.\n", - "Since the basic computer unit is the byte, the Extended ASCII table is limited to 256 characters.\n", + "The most common way of mapping characters to integers is the Extended ASCII table.\n", + "Since the basic unit used by computers is the byte, the Extended ASCII table is limited to 256 characters.\n", "\n", "$\n", "byte \\in \\mathbb{Z}_{255} : = \\{ z : z \\in \\mathbb{Z}; 0 \\le z \\le 255 \\} \\\\\n", - "\\mathcal{A} = \\{ a, b, c, \\dots, A, B, C, \\dots, \", !, ?, \\dots \\}\n", + "\\Sigma = \\{ a, b, c, \\dots, A, B, C, \\dots, \", !, ?, \\dots \\}\n", "$\n", "\n", + "The python functions `chr` and `ord` are used to convert between characters and integers.\n", + "\n", "$\n", - "chr : \\mathbb{Z}_{255} \\rightarrow \\mathcal{A} \\\\\n", - "ord : \\mathcal{A} \\rightarrow \\mathbb{Z}_{255}\n", + "chr : \\mathbb{Z}_{255} \\rightarrow \\Sigma \\\\\n", + "ord : \\Sigma \\rightarrow \\mathbb{Z}_{255}\n", "$" ] }, { "cell_type": "code", "execution_count": null, - "id": "c19b8c7f", + "id": "62df929d", "metadata": {}, "outputs": [], "source": [ @@ -174,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9101ebb0", + "id": "72a34435", "metadata": {}, "outputs": [], "source": [ @@ -184,9 +277,15 @@ }, { "cell_type": "markdown", - "id": "2ff31e36", - "metadata": {}, + "id": "542d8b7d", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, "source": [ + "----\n", + "\n", "Nowadays, the most common character encoding is UTF, that is a superset of ASCII.\n", "It uses more than one byte to represent a character,\n", "so it can represent up to $17 * 2^{16}$ characters\n", @@ -196,7 +295,7 @@ { "cell_type": "code", "execution_count": null, - "id": "51c157cd", + "id": "b288eb46", "metadata": {}, "outputs": [], "source": [ @@ -207,7 +306,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b13a516b", + "id": "6e014ff6", "metadata": {}, "outputs": [], "source": [ @@ -218,7 +317,7 @@ }, { "cell_type": "markdown", - "id": "dcd69545", + "id": "01bd656b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -236,7 +335,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7e232cd8", + "id": "513ae6b5", "metadata": {}, "outputs": [], "source": [ @@ -248,7 +347,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4683e326", + "id": "183e4e8d", "metadata": {}, "outputs": [], "source": [ @@ -262,7 +361,7 @@ }, { "cell_type": "markdown", - "id": "0b572cfb", + "id": "0134fdfe", "metadata": { "slideshow": { "slide_type": "slide" @@ -273,18 +372,18 @@ "\n", "## Formatting numbers\n", "\n", - "Formatting means representing a number with a string.\n", + "Formatting means representing a number with a finite string.\n", "Note: it is impossible to represent all the real numbers with finite strings ;)\n", "\n", "$\n", - "formatting: \\mathbb{Q} \\rightarrow \\mathcal{S}\n", + "formatting: \\mathbb{Q} \\rightarrow \\Sigma^{*}\n", "$" ] }, { "cell_type": "code", "execution_count": null, - "id": "32a2fe13", + "id": "369f6c2f", "metadata": {}, "outputs": [], "source": [ @@ -296,7 +395,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ee887c24", + "id": "6b2d8c68", "metadata": {}, "outputs": [], "source": [ @@ -306,7 +405,7 @@ }, { "cell_type": "markdown", - "id": "4557cf35", + "id": "e51f6bea", "metadata": {}, "source": [ "----" @@ -315,7 +414,7 @@ { "cell_type": "code", "execution_count": null, - "id": "27a58fea", + "id": "af2c2bb1", "metadata": {}, "outputs": [], "source": [ @@ -326,7 +425,7 @@ }, { "cell_type": "markdown", - "id": "dc97eaed", + "id": "ae36d226", "metadata": { "slideshow": { "slide_type": "subslide" @@ -341,7 +440,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c04d308d", + "id": "f973f18a", "metadata": {}, "outputs": [], "source": [ @@ -351,7 +450,7 @@ }, { "cell_type": "markdown", - "id": "8e8ffb0d", + "id": "effeb17c", "metadata": {}, "source": [ "----" @@ -360,7 +459,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9cf55762", + "id": "be34f328", "metadata": {}, "outputs": [], "source": [ @@ -370,7 +469,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dec3d1dc", + "id": "6996c522", "metadata": {}, "outputs": [], "source": [ @@ -381,7 +480,7 @@ }, { "cell_type": "markdown", - "id": "cfd8a608", + "id": "866bd52e", "metadata": { "slideshow": { "slide_type": "slide" @@ -395,7 +494,7 @@ }, { "cell_type": "markdown", - "id": "1b201fc5", + "id": "8e595545", "metadata": {}, "source": [ "----" @@ -404,7 +503,7 @@ { "cell_type": "code", "execution_count": null, - "id": "67ae05d0", + "id": "83fa2f41", "metadata": {}, "outputs": [], "source": [ @@ -417,7 +516,7 @@ }, { "cell_type": "markdown", - "id": "148ccd98", + "id": "faba5113", "metadata": {}, "source": [ "----" @@ -426,7 +525,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1418f6c9", + "id": "9675a0c7", "metadata": {}, "outputs": [], "source": [ @@ -436,7 +535,7 @@ }, { "cell_type": "markdown", - "id": "2a8f6acc", + "id": "6faf4bd9", "metadata": {}, "source": [ "----" @@ -445,7 +544,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fff63147", + "id": "042bcf7b", "metadata": {}, "outputs": [], "source": [ @@ -454,7 +553,7 @@ }, { "cell_type": "markdown", - "id": "5960a0ce", + "id": "79279dde", "metadata": {}, "source": [ "----" @@ -463,7 +562,7 @@ { "cell_type": "code", "execution_count": null, - "id": "11f3845a", + "id": "3a170529", "metadata": {}, "outputs": [], "source": [ @@ -476,7 +575,7 @@ }, { "cell_type": "markdown", - "id": "aa66f4da", + "id": "a4aae98d", "metadata": {}, "source": [ "----" @@ -485,7 +584,7 @@ { "cell_type": "code", "execution_count": null, - "id": "eb12c1ee", + "id": "2d846582", "metadata": {}, "outputs": [], "source": [ @@ -498,7 +597,7 @@ }, { "cell_type": "markdown", - "id": "7fb84908", + "id": "af3c0dc4", "metadata": {}, "source": [ "----" @@ -507,7 +606,7 @@ { "cell_type": "code", "execution_count": null, - "id": "58f7ea76", + "id": "84c243d7", "metadata": {}, "outputs": [], "source": [ @@ -516,7 +615,7 @@ }, { "cell_type": "markdown", - "id": "c804a7ad", + "id": "a7ffe622", "metadata": { "slideshow": { "slide_type": "slide" @@ -530,7 +629,7 @@ }, { "cell_type": "markdown", - "id": "18fbcf11", + "id": "d3ede311", "metadata": {}, "source": [ "----" @@ -539,7 +638,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a50b1b49", + "id": "befbd1f9", "metadata": {}, "outputs": [], "source": [ @@ -552,7 +651,7 @@ }, { "cell_type": "markdown", - "id": "6e38dc97", + "id": "8e7e9a94", "metadata": { "slideshow": { "slide_type": "subslide" @@ -566,7 +665,7 @@ }, { "cell_type": "markdown", - "id": "eb8a3ea5", + "id": "51c1f2fa", "metadata": {}, "source": [ "----" @@ -575,7 +674,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5f54e1fb", + "id": "c0e0f119", "metadata": {}, "outputs": [], "source": [ @@ -591,7 +690,7 @@ { "cell_type": "code", "execution_count": null, - "id": "84b83670", + "id": "9dfb4530", "metadata": {}, "outputs": [], "source": [ @@ -603,7 +702,7 @@ }, { "cell_type": "markdown", - "id": "da5b179f", + "id": "200460a8", "metadata": { "slideshow": { "slide_type": "subslide" @@ -619,7 +718,7 @@ { "cell_type": "code", "execution_count": null, - "id": "305a4c1a", + "id": "2c0d7bde", "metadata": {}, "outputs": [], "source": [ @@ -631,7 +730,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fc819ba3", + "id": "104a5860", "metadata": {}, "outputs": [], "source": [ @@ -641,7 +740,7 @@ }, { "cell_type": "markdown", - "id": "faafacc6", + "id": "6f1335c9", "metadata": { "slideshow": { "slide_type": "slide" @@ -668,7 +767,7 @@ { "cell_type": "code", "execution_count": null, - "id": "76eb1ac6", + "id": "e204bc64", "metadata": {}, "outputs": [], "source": [ @@ -678,7 +777,7 @@ }, { "cell_type": "markdown", - "id": "28ed2b90", + "id": "ff5495d5", "metadata": {}, "source": [ "----" @@ -687,7 +786,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2e3dadf4", + "id": "ae991fc4", "metadata": {}, "outputs": [], "source": [ @@ -697,7 +796,7 @@ }, { "cell_type": "markdown", - "id": "90d749c0", + "id": "7175e6a5", "metadata": { "slideshow": { "slide_type": "subslide" @@ -717,7 +816,7 @@ }, { "cell_type": "markdown", - "id": "5edbc2aa", + "id": "0728f620", "metadata": {}, "source": [ "----" @@ -726,7 +825,7 @@ { "cell_type": "code", "execution_count": null, - "id": "338887a9", + "id": "6a142398", "metadata": {}, "outputs": [], "source": [ @@ -738,7 +837,7 @@ { "cell_type": "code", "execution_count": null, - "id": "366b882f", + "id": "434bbb33", "metadata": {}, "outputs": [], "source": [ @@ -755,7 +854,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, "nbformat": 4, "nbformat_minor": 5 } diff --git a/python-high-school/notebooks/10_collections copy 2.ipynb b/python-high-school/notebooks/10_collections copy 2.ipynb new file mode 100644 index 0000000..cb3c022 --- /dev/null +++ b/python-high-school/notebooks/10_collections copy 2.ipynb @@ -0,0 +1,651 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8374a718", + "metadata": {}, + "source": [ + "# Python for High School\n", + "\n", + "Lesson 2\n", + "\n", + "- Roberto Polli - \n", + "\n", + "## Agenda\n", + "\n", + "- Sets\n", + "- Introducing Lists\n", + "- Getting list items\n", + "- Slicing a list\n", + "- Strings and Lists\n", + "- Iterations: `for`\n", + "- Iterations: `while`\n", + "\n", + "## Sets\n", + "\n", + "In maths, a set is a collection of distinct objects." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f68d253a", + "metadata": {}, + "outputs": [], + "source": [ + "# In python you can create sets.\n", + "EMPTY = {} # ø is the empty set\n", + "A = {1, 2, 3}\n", + "B = {3, 4, 5, \"a\"} # sets can contain different types\n", + "C = { A } # a set can contain other sets" + ] + }, + { + "cell_type": "markdown", + "id": "a162575e", + "metadata": {}, + "source": [ + "Here is an image from Wikipedia:\n", + "[![Set Theory Operations](https://upload.wikimedia.org/wikipedia/commons/0/04/Set_Theory_Operations.svg)](https://en.wikipedia.org/wiki/Set_(mathematics)#/media/File:Set_Theory_Operations.svg)\n", + "\n", + "You can perform set operations on them, including:\n", + "\n", + "$\n", + "U = A \\cup B \\\\\n", + "I = A \\cap B \\\\\n", + "D = A \\setminus B \\\\\n", + "S = A \\Delta B := (A \\cup B) \\setminus (A \\cap B) \\\\\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a20d897d", + "metadata": {}, + "outputs": [], + "source": [ + "# Union\n", + "U = A | B\n", + "# Intersection\n", + "I = A & B\n", + "# Difference\n", + "D = A - B\n", + "# Symmetric difference\n", + "S = A ^ B" + ] + }, + { + "cell_type": "markdown", + "id": "26e3c0ab", + "metadata": {}, + "source": [ + "You can perform basic checks:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d990d619", + "metadata": {}, + "outputs": [], + "source": [ + "A in U\n", + "B not in U\n", + "B in D\n", + "5 in A\n", + "{1} in A\n", + "EMPTY in A\n", + "I in S\n", + "2 in C" + ] + }, + { + "cell_type": "markdown", + "id": "d1784989", + "metadata": {}, + "source": [ + "Exercise: which of the above instructions are true?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8a88cd6", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "6278525d", + "metadata": {}, + "source": [ + "Exercise: print the content of the sets." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2bf8011", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "2de19ea4", + "metadata": {}, + "source": [ + "## Introducing Lists\n", + "\n", + "A list is an ordered sequence of items.\n", + "Differently from a set, a list is ordered\n", + "and can contain duplicates." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b72956a", + "metadata": {}, + "outputs": [], + "source": [ + "# it's easy to create a list\n", + "list_a = ['this', 'is', 'a', 'list']\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d9425c4", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# you can append items to a list\n", + "# with the append method\n", + "list_a.append(\"mutable\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba1fca5a", + "metadata": {}, + "outputs": [], + "source": [ + "# Print its content\n", + "print(list_a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45025141", + "metadata": {}, + "outputs": [], + "source": [ + "# See its length\n", + "len(list_a)" + ] + }, + { + "cell_type": "markdown", + "id": "2f6d0eeb", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "#### Lists and Generators\n", + "\n", + "In python you can generate a sequence of numbers.\n", + "To avoid consuming too much memory, this is not doen using lists\n", + "or sets, but using special objects that generate those sequences." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "376896b7", + "metadata": {}, + "outputs": [], + "source": [ + "a = 11\n", + "from_0_to_10 = range(a)" + ] + }, + { + "cell_type": "markdown", + "id": "cced1abd", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- print the length of `from_0_to_10`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6bbf9143", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "ec8accfc", + "metadata": {}, + "source": [ + "- print the `type` of `from_0_to_10`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3141c2d2", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "0200b849", + "metadata": {}, + "source": [ + "We can extract all the elements from a generator using the `list` function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2168aa3", + "metadata": {}, + "outputs": [], + "source": [ + "from_0_to_10 = list(from_0_to_10)\n", + "l = len(from_0_to_10)\n", + "l == a\n", + "print(l)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ed0b706", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: can you print the content of from_0_to_10\n", + "print(from_0_to_10)" + ] + }, + { + "cell_type": "markdown", + "id": "fb440dc9", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Getting list items" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53f02f35", + "metadata": {}, + "outputs": [], + "source": [ + "# you can get list items by index\n", + "from_0_to_10[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19c6d1a9", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: what happens if I get the 11th element?\n", + "from_0_to_10[11]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c93a3b7f", + "metadata": {}, + "outputs": [], + "source": [ + "# python is calling under the hood\n", + "from_0_to_10.__getitem__(0)" + ] + }, + { + "cell_type": "markdown", + "id": "b0a33de2", + "metadata": {}, + "source": [ + "Python lists are doubly linked, so you can get the last element using a negative index." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4dd4c497", + "metadata": {}, + "outputs": [], + "source": [ + "# python lists are doubly linked ;)\n", + "from_0_to_10[-1]\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9dc6b207", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Exercise: please check the manual!\n", + "help(list)" + ] + }, + { + "cell_type": "markdown", + "id": "def4856d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Slicing a list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3635a587", + "metadata": {}, + "outputs": [], + "source": [ + "straight = [1, 2, 3, 'star']\n", + "print(straight)" + ] + }, + { + "cell_type": "markdown", + "id": "69582586", + "metadata": {}, + "source": [ + "Python supports slicing, that is, getting a subsequence of a list\n", + "similarly to what you can do with mathematical intervals.\n", + "Python uses a half-open interval, that is, the first index is included\n", + "and the last one is excluded.\n", + "\n", + "$\n", + "straight = straight_{0}, straight_{1}, straight_{2}, straight_{3} \\\\\n", + "$\n", + "$\n", + "straight[0:2] := \\[ straight_{0}, straight_{1} \\] \\\\\n", + "straight[i:j] := \\[ straight_{i}, \\dots, straight_{j-1} \\]\n", + "$\n", + "\n", + "This means that the length of a sliced list is:\n", + "\n", + "$\n", + "|straight[i:j]| = j - i \\\\\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66eafa63", + "metadata": {}, + "outputs": [], + "source": [ + "# I can take the middle of the list...\n", + "straight[1:3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "524c5b41", + "metadata": {}, + "outputs": [], + "source": [ + "k = 2 # ... or using a separator\n", + "straight[0:k], straight[k:4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ff2455c", + "metadata": {}, + "outputs": [], + "source": [ + "straight[:k] # I can omit the first..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63d0ccac", + "metadata": {}, + "outputs": [], + "source": [ + "straight[k:] # ...and last index" + ] + }, + { + "cell_type": "markdown", + "id": "036d45f7", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Strings and Lists" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e138708b", + "metadata": {}, + "outputs": [], + "source": [ + "# Strings behaves like lists\n", + "s_a = \"Counting: 123\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ac25c74", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Have length..\n", + "l_a = len(s_a)\n", + "print(l_a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a7f78cc", + "metadata": {}, + "outputs": [], + "source": [ + "# ..indexes\n", + "print(s_a[0], \" \", s_a[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b99855a4", + "metadata": {}, + "outputs": [], + "source": [ + "# and a last element\n", + "s_a[l_a] # ...what's happening there?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15c10826", + "metadata": {}, + "outputs": [], + "source": [ + "# ...we can even slice them\n", + "f = \"gatto.miao\"\n", + "f[:-5], f[-5], f[-4:]" + ] + }, + { + "cell_type": "markdown", + "id": "2233eccd", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Iterations: `for`\n", + "\n", + "Python allows you to iterate over a sequence of items using the `for` instruction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8f308bc", + "metadata": {}, + "outputs": [], + "source": [ + "a_list = ['is', 'iterable', 'with']\n", + "for x in a_list:\n", + " print(x)" + ] + }, + { + "cell_type": "markdown", + "id": "30e38b2c", + "metadata": {}, + "source": [ + "We can stop the iteration using the `break` instruction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "93b88e87", + "metadata": {}, + "outputs": [], + "source": [ + "for x in a_list:\n", + " print(x, end=' ')\n", + " y = x + str(2)\n", + " break # stop now" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4165722f", + "metadata": {}, + "outputs": [], + "source": [ + "# what's the expected output of the\n", + "# following instruction?\n", + "print((\"x, y: \", (x, y)))\n", + "# Differently from other languages like C, `for` does not create\n", + "# a scope" + ] + }, + { + "cell_type": "markdown", + "id": "34bf8abc", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Iterations: while" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f36fec02", + "metadata": {}, + "outputs": [], + "source": [ + "a_list = ['is', 'iterable', 'with']\n", + "while a_list:\n", + " # pop() modifies a list removing\n", + " # and returning its last element\n", + " x = a_list.pop()\n", + " print(f\"pop out {x}\")\n", + " break # what happens if I remove this break?\n", + "\n", + "print(a_list)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d27cf768", + "metadata": {}, + "outputs": [], + "source": [ + "# What's the expected behavior of the\n", + "# following instructions?\n", + "for x in a_list:\n", + " print((x + a_list.pop()))\n", + "# for + pop() is not always a good idea ;)" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python-high-school/notebooks/10_collections copy.ipynb b/python-high-school/notebooks/10_collections copy.ipynb new file mode 100644 index 0000000..cb3c022 --- /dev/null +++ b/python-high-school/notebooks/10_collections copy.ipynb @@ -0,0 +1,651 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8374a718", + "metadata": {}, + "source": [ + "# Python for High School\n", + "\n", + "Lesson 2\n", + "\n", + "- Roberto Polli - \n", + "\n", + "## Agenda\n", + "\n", + "- Sets\n", + "- Introducing Lists\n", + "- Getting list items\n", + "- Slicing a list\n", + "- Strings and Lists\n", + "- Iterations: `for`\n", + "- Iterations: `while`\n", + "\n", + "## Sets\n", + "\n", + "In maths, a set is a collection of distinct objects." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f68d253a", + "metadata": {}, + "outputs": [], + "source": [ + "# In python you can create sets.\n", + "EMPTY = {} # ø is the empty set\n", + "A = {1, 2, 3}\n", + "B = {3, 4, 5, \"a\"} # sets can contain different types\n", + "C = { A } # a set can contain other sets" + ] + }, + { + "cell_type": "markdown", + "id": "a162575e", + "metadata": {}, + "source": [ + "Here is an image from Wikipedia:\n", + "[![Set Theory Operations](https://upload.wikimedia.org/wikipedia/commons/0/04/Set_Theory_Operations.svg)](https://en.wikipedia.org/wiki/Set_(mathematics)#/media/File:Set_Theory_Operations.svg)\n", + "\n", + "You can perform set operations on them, including:\n", + "\n", + "$\n", + "U = A \\cup B \\\\\n", + "I = A \\cap B \\\\\n", + "D = A \\setminus B \\\\\n", + "S = A \\Delta B := (A \\cup B) \\setminus (A \\cap B) \\\\\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a20d897d", + "metadata": {}, + "outputs": [], + "source": [ + "# Union\n", + "U = A | B\n", + "# Intersection\n", + "I = A & B\n", + "# Difference\n", + "D = A - B\n", + "# Symmetric difference\n", + "S = A ^ B" + ] + }, + { + "cell_type": "markdown", + "id": "26e3c0ab", + "metadata": {}, + "source": [ + "You can perform basic checks:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d990d619", + "metadata": {}, + "outputs": [], + "source": [ + "A in U\n", + "B not in U\n", + "B in D\n", + "5 in A\n", + "{1} in A\n", + "EMPTY in A\n", + "I in S\n", + "2 in C" + ] + }, + { + "cell_type": "markdown", + "id": "d1784989", + "metadata": {}, + "source": [ + "Exercise: which of the above instructions are true?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8a88cd6", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "6278525d", + "metadata": {}, + "source": [ + "Exercise: print the content of the sets." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2bf8011", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "2de19ea4", + "metadata": {}, + "source": [ + "## Introducing Lists\n", + "\n", + "A list is an ordered sequence of items.\n", + "Differently from a set, a list is ordered\n", + "and can contain duplicates." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b72956a", + "metadata": {}, + "outputs": [], + "source": [ + "# it's easy to create a list\n", + "list_a = ['this', 'is', 'a', 'list']\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d9425c4", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# you can append items to a list\n", + "# with the append method\n", + "list_a.append(\"mutable\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba1fca5a", + "metadata": {}, + "outputs": [], + "source": [ + "# Print its content\n", + "print(list_a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45025141", + "metadata": {}, + "outputs": [], + "source": [ + "# See its length\n", + "len(list_a)" + ] + }, + { + "cell_type": "markdown", + "id": "2f6d0eeb", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "#### Lists and Generators\n", + "\n", + "In python you can generate a sequence of numbers.\n", + "To avoid consuming too much memory, this is not doen using lists\n", + "or sets, but using special objects that generate those sequences." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "376896b7", + "metadata": {}, + "outputs": [], + "source": [ + "a = 11\n", + "from_0_to_10 = range(a)" + ] + }, + { + "cell_type": "markdown", + "id": "cced1abd", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- print the length of `from_0_to_10`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6bbf9143", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "ec8accfc", + "metadata": {}, + "source": [ + "- print the `type` of `from_0_to_10`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3141c2d2", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "0200b849", + "metadata": {}, + "source": [ + "We can extract all the elements from a generator using the `list` function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2168aa3", + "metadata": {}, + "outputs": [], + "source": [ + "from_0_to_10 = list(from_0_to_10)\n", + "l = len(from_0_to_10)\n", + "l == a\n", + "print(l)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ed0b706", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: can you print the content of from_0_to_10\n", + "print(from_0_to_10)" + ] + }, + { + "cell_type": "markdown", + "id": "fb440dc9", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Getting list items" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53f02f35", + "metadata": {}, + "outputs": [], + "source": [ + "# you can get list items by index\n", + "from_0_to_10[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19c6d1a9", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: what happens if I get the 11th element?\n", + "from_0_to_10[11]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c93a3b7f", + "metadata": {}, + "outputs": [], + "source": [ + "# python is calling under the hood\n", + "from_0_to_10.__getitem__(0)" + ] + }, + { + "cell_type": "markdown", + "id": "b0a33de2", + "metadata": {}, + "source": [ + "Python lists are doubly linked, so you can get the last element using a negative index." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4dd4c497", + "metadata": {}, + "outputs": [], + "source": [ + "# python lists are doubly linked ;)\n", + "from_0_to_10[-1]\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9dc6b207", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Exercise: please check the manual!\n", + "help(list)" + ] + }, + { + "cell_type": "markdown", + "id": "def4856d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Slicing a list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3635a587", + "metadata": {}, + "outputs": [], + "source": [ + "straight = [1, 2, 3, 'star']\n", + "print(straight)" + ] + }, + { + "cell_type": "markdown", + "id": "69582586", + "metadata": {}, + "source": [ + "Python supports slicing, that is, getting a subsequence of a list\n", + "similarly to what you can do with mathematical intervals.\n", + "Python uses a half-open interval, that is, the first index is included\n", + "and the last one is excluded.\n", + "\n", + "$\n", + "straight = straight_{0}, straight_{1}, straight_{2}, straight_{3} \\\\\n", + "$\n", + "$\n", + "straight[0:2] := \\[ straight_{0}, straight_{1} \\] \\\\\n", + "straight[i:j] := \\[ straight_{i}, \\dots, straight_{j-1} \\]\n", + "$\n", + "\n", + "This means that the length of a sliced list is:\n", + "\n", + "$\n", + "|straight[i:j]| = j - i \\\\\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66eafa63", + "metadata": {}, + "outputs": [], + "source": [ + "# I can take the middle of the list...\n", + "straight[1:3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "524c5b41", + "metadata": {}, + "outputs": [], + "source": [ + "k = 2 # ... or using a separator\n", + "straight[0:k], straight[k:4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ff2455c", + "metadata": {}, + "outputs": [], + "source": [ + "straight[:k] # I can omit the first..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63d0ccac", + "metadata": {}, + "outputs": [], + "source": [ + "straight[k:] # ...and last index" + ] + }, + { + "cell_type": "markdown", + "id": "036d45f7", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Strings and Lists" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e138708b", + "metadata": {}, + "outputs": [], + "source": [ + "# Strings behaves like lists\n", + "s_a = \"Counting: 123\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ac25c74", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Have length..\n", + "l_a = len(s_a)\n", + "print(l_a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a7f78cc", + "metadata": {}, + "outputs": [], + "source": [ + "# ..indexes\n", + "print(s_a[0], \" \", s_a[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b99855a4", + "metadata": {}, + "outputs": [], + "source": [ + "# and a last element\n", + "s_a[l_a] # ...what's happening there?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15c10826", + "metadata": {}, + "outputs": [], + "source": [ + "# ...we can even slice them\n", + "f = \"gatto.miao\"\n", + "f[:-5], f[-5], f[-4:]" + ] + }, + { + "cell_type": "markdown", + "id": "2233eccd", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Iterations: `for`\n", + "\n", + "Python allows you to iterate over a sequence of items using the `for` instruction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8f308bc", + "metadata": {}, + "outputs": [], + "source": [ + "a_list = ['is', 'iterable', 'with']\n", + "for x in a_list:\n", + " print(x)" + ] + }, + { + "cell_type": "markdown", + "id": "30e38b2c", + "metadata": {}, + "source": [ + "We can stop the iteration using the `break` instruction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "93b88e87", + "metadata": {}, + "outputs": [], + "source": [ + "for x in a_list:\n", + " print(x, end=' ')\n", + " y = x + str(2)\n", + " break # stop now" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4165722f", + "metadata": {}, + "outputs": [], + "source": [ + "# what's the expected output of the\n", + "# following instruction?\n", + "print((\"x, y: \", (x, y)))\n", + "# Differently from other languages like C, `for` does not create\n", + "# a scope" + ] + }, + { + "cell_type": "markdown", + "id": "34bf8abc", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Iterations: while" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f36fec02", + "metadata": {}, + "outputs": [], + "source": [ + "a_list = ['is', 'iterable', 'with']\n", + "while a_list:\n", + " # pop() modifies a list removing\n", + " # and returning its last element\n", + " x = a_list.pop()\n", + " print(f\"pop out {x}\")\n", + " break # what happens if I remove this break?\n", + "\n", + "print(a_list)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d27cf768", + "metadata": {}, + "outputs": [], + "source": [ + "# What's the expected behavior of the\n", + "# following instructions?\n", + "for x in a_list:\n", + " print((x + a_list.pop()))\n", + "# for + pop() is not always a good idea ;)" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python-high-school/notebooks/10_collections.ipynb b/python-high-school/notebooks/10_collections.ipynb index 87d24ab..6ec6029 100644 --- a/python-high-school/notebooks/10_collections.ipynb +++ b/python-high-school/notebooks/10_collections.ipynb @@ -2,49 +2,156 @@ "cells": [ { "cell_type": "markdown", - "id": "df7aa0ce", + "id": "03b17d3f", "metadata": {}, "source": [ - "# Python for System Administrators\n", + "# Python for High School\n", "\n", - "Introductory Lesson 2\n", + "Lesson 2\n", "\n", - "- Roberto Polli - " + "- Roberto Polli - \n", + "\n", + "## Agenda\n", + "\n", + "- Sets\n", + "- Introducing Lists\n", + "- Getting list items\n", + "- Slicing a list\n", + "- Strings and Lists\n", + "- Iterations: `for`\n", + "- Iterations: `while`\n", + "\n", + "## Sets\n", + "\n", + "In maths, a set is a collection of distinct objects." ] }, { "cell_type": "code", "execution_count": null, - "id": "e5dde425", + "id": "8f59f168", "metadata": {}, "outputs": [], "source": [ - "# before starting this lesson\n", - "# import the python3 print capabilities\n", - "# using the following statement\n", - "# NB since now you *must* always use\n", - "# parenthesis with print!\n", - "from __future__ import print_function, unicode_literals, division\n", - "import sys\n", + "# In python you can create sets.\n", + "EMPTY = {} # ø is the empty set\n", + "A = {1, 2, 3}\n", + "B = {3, 4, 5, \"a\"} # sets can contain different types\n", + "C = { A } # a set can contain other sets" + ] + }, + { + "cell_type": "markdown", + "id": "3fc7425a", + "metadata": {}, + "source": [ + "Here is an image from Wikipedia:\n", + "[![Set Theory Operations](https://upload.wikimedia.org/wikipedia/commons/0/04/Set_Theory_Operations.svg)](https://en.wikipedia.org/wiki/Set_(mathematics)#/media/File:Set_Theory_Operations.svg)\n", + "\n", + "You can perform set operations on them, including:\n", "\n", - "# Import further python3 features.\n", - "if sys.version_info.major < 3:\n", - " from future_builtins import *\n", - " import __builtin__ as builtins" + "$\n", + "U = A \\cup B \\\\\n", + "I = A \\cap B \\\\\n", + "D = A \\setminus B \\\\\n", + "S = A \\Delta B := (A \\cup B) \\setminus (A \\cap B) \\\\\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28bbd418", + "metadata": {}, + "outputs": [], + "source": [ + "# Union\n", + "U = A | B\n", + "# Intersection\n", + "I = A & B\n", + "# Difference\n", + "D = A - B\n", + "# Symmetric difference\n", + "S = A ^ B" + ] + }, + { + "cell_type": "markdown", + "id": "b7d82d35", + "metadata": {}, + "source": [ + "You can perform basic checks:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ebd2379", + "metadata": {}, + "outputs": [], + "source": [ + "A in U\n", + "B not in U\n", + "B in D\n", + "5 in A\n", + "{1} in A\n", + "EMPTY in A\n", + "I in S\n", + "2 in C" + ] + }, + { + "cell_type": "markdown", + "id": "7ce02525", + "metadata": {}, + "source": [ + "Exercise: which of the above instructions are true?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61e0f8a6", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "34ad6ffc", + "metadata": {}, + "source": [ + "Exercise: print the content of the sets." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a2bc421", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" ] }, { "cell_type": "markdown", - "id": "e9f7db63", + "id": "e750c10d", "metadata": {}, "source": [ - "## Introducing Lists" + "## Introducing Lists\n", + "\n", + "A list is an ordered sequence of items.\n", + "Differently from a set, a list is ordered\n", + "and can contain duplicates." ] }, { "cell_type": "code", "execution_count": null, - "id": "ebbad3f4", + "id": "9c9c3fd5", "metadata": {}, "outputs": [], "source": [ @@ -55,7 +162,7 @@ { "cell_type": "code", "execution_count": null, - "id": "56473c7d", + "id": "56023a73", "metadata": {}, "outputs": [], "source": [ @@ -68,7 +175,7 @@ { "cell_type": "code", "execution_count": null, - "id": "48aaaaca", + "id": "43942414", "metadata": {}, "outputs": [], "source": [ @@ -79,7 +186,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ada13e8b", + "id": "371b5688", "metadata": {}, "outputs": [], "source": [ @@ -89,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "17dfcecc", + "id": "1af29667", "metadata": { "slideshow": { "slide_type": "slide" @@ -100,73 +207,95 @@ "\n", "#### Lists and Generators\n", "\n", - "In python you can create lists of subsequent numbers.\n", - "In python 2, the `range` function returns a list,\n", - "while in python 3 it returns an iterable object.\n", - "\n", - "This is to avoid memory issues when dealing with large lists." + "In python you can generate a sequence of numbers.\n", + "To avoid consuming too much memory, this is not doen using lists\n", + "or sets, but using special objects that generate those sequences." ] }, { "cell_type": "code", "execution_count": null, - "id": "a350300a", + "id": "25018671", "metadata": {}, "outputs": [], "source": [ "a = 11\n", - "#range in python 2 returns a list\n", - "# of consecutive ints\n", - "from_0_to_10 = range(a)\n", - "l = len(from_0_to_10)\n", - "l == a\n", - "print(l)" + "from_0_to_10 = range(a)" + ] + }, + { + "cell_type": "markdown", + "id": "d43e85e0", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- print the length of `from_0_to_10`" ] }, { "cell_type": "code", "execution_count": null, - "id": "4213a658", + "id": "a0e207b2", "metadata": {}, "outputs": [], "source": [ - "# in python 3 things are slightly different\n", - "# so the above code won't work.\n", - "import sys\n", - "if sys.version_info.major < 3:\n", - " range = xrange # Override the range function with the xrange function.\n", - "from_0_to_10 = range(a)" + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "9b261afb", + "metadata": {}, + "source": [ + "- print the `type` of `from_0_to_10`" ] }, { "cell_type": "code", "execution_count": null, - "id": "67ad2433", + "id": "fc925b52", "metadata": {}, "outputs": [], "source": [ - "# Exercise: can you print the content of from_0_to_10\n", - "print(from_0_to_10)" + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "fc8e2f9c", + "metadata": {}, + "source": [ + "We can extract all the elements from a generator using the `list` function." ] }, { "cell_type": "code", "execution_count": null, - "id": "cfcf5e6b", + "id": "2a8773fa", "metadata": {}, "outputs": [], "source": [ - "\n", - "# In python 3, you need to create a list from the range object.\n", - "# The above code\n", - "# should be replaced with the following\n", - "from_0_to_10 = list(range(a))\n", + "from_0_to_10 = list(from_0_to_10)\n", + "l = len(from_0_to_10)\n", + "l == a\n", + "print(l)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63a02d32", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: can you print the content of from_0_to_10\n", "print(from_0_to_10)" ] }, { "cell_type": "markdown", - "id": "ce1ba3fa", + "id": "b7f869a7", "metadata": { "slideshow": { "slide_type": "slide" @@ -181,7 +310,7 @@ { "cell_type": "code", "execution_count": null, - "id": "abf7e4fb", + "id": "47ff35c9", "metadata": {}, "outputs": [], "source": [ @@ -192,7 +321,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a9b9a7a8", + "id": "62d5c3ce", "metadata": {}, "outputs": [], "source": [ @@ -203,7 +332,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8d1720cb", + "id": "c5d79016", "metadata": {}, "outputs": [], "source": [ @@ -211,10 +340,18 @@ "from_0_to_10.__getitem__(0)" ] }, + { + "cell_type": "markdown", + "id": "f30fe2a6", + "metadata": {}, + "source": [ + "Python lists are doubly linked, so you can get the last element using a negative index." + ] + }, { "cell_type": "code", "execution_count": null, - "id": "ac61ac66", + "id": "6a61e83a", "metadata": {}, "outputs": [], "source": [ @@ -225,7 +362,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3db55d40", + "id": "c685a24f", "metadata": {}, "outputs": [], "source": [ @@ -236,7 +373,7 @@ }, { "cell_type": "markdown", - "id": "2f685ed6", + "id": "4fe7024b", "metadata": { "slideshow": { "slide_type": "slide" @@ -251,7 +388,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f3cc929f", + "id": "57eed0a0", "metadata": {}, "outputs": [], "source": [ @@ -259,10 +396,35 @@ "print(straight)" ] }, + { + "cell_type": "markdown", + "id": "b614e1b3", + "metadata": {}, + "source": [ + "Python supports slicing, that is, getting a subsequence of a list\n", + "similarly to what you can do with mathematical intervals.\n", + "Python uses a half-open interval\n", + "( e.g. $[i, j)$ or $[i, j[$ ),\n", + "that is, the first index is included\n", + "and the last one is excluded. Given a list `l : |l| = 4`\n", + "\n", + "$\n", + "l = [ l_{0}, \\dots, l_{3} ] \\\\\n", + "l[0:2] := [ l_{0}, l_{1} ] \\\\\n", + "l[i:j] := [ l_{i}, \\dots, l_{j-1} ] \\\\\n", + "$\n", + "\n", + "This means that the length of a sliced list is:\n", + "\n", + "$\n", + "|l[i:j]| = j - i \\\\\n", + "$" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "416cd0f2", + "id": "e91d582d", "metadata": {}, "outputs": [], "source": [ @@ -273,7 +435,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5ba5fb57", + "id": "b412ae89", "metadata": {}, "outputs": [], "source": [ @@ -284,7 +446,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ecce795d", + "id": "bdfdcf0c", "metadata": {}, "outputs": [], "source": [ @@ -294,7 +456,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ffa769dd", + "id": "47493cde", "metadata": {}, "outputs": [], "source": [ @@ -303,7 +465,7 @@ }, { "cell_type": "markdown", - "id": "efa1b8c7", + "id": "c559062c", "metadata": { "slideshow": { "slide_type": "slide" @@ -318,7 +480,7 @@ { "cell_type": "code", "execution_count": null, - "id": "92b355fe", + "id": "c438eabb", "metadata": {}, "outputs": [], "source": [ @@ -329,7 +491,7 @@ { "cell_type": "code", "execution_count": null, - "id": "87c36c6c", + "id": "8ba69df3", "metadata": {}, "outputs": [], "source": [ @@ -342,7 +504,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0bb4a24b", + "id": "8d3a88d7", "metadata": {}, "outputs": [], "source": [ @@ -353,7 +515,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4f30304b", + "id": "d6a907d0", "metadata": {}, "outputs": [], "source": [ @@ -364,31 +526,18 @@ { "cell_type": "code", "execution_count": null, - "id": "1d6c26ab", + "id": "e2ae7861", "metadata": {}, "outputs": [], "source": [ "# ...we can even slice them\n", - "f = \"prova.txt\"\n", - "f[:-4], f[-4], f[-3:]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "75eca891", - "metadata": {}, - "outputs": [], - "source": [ - "# Note: use the os.path module for path manipulation.\n", - "# The above code will break with 4-letter extensions!\n", - "from os.path import splitext\n", - "splitext(\"prova.foo.yaml\")" + "f = \"gatto.miao\"\n", + "f[:-5], f[-5], f[-4:]" ] }, { "cell_type": "markdown", - "id": "33529552", + "id": "514fefac", "metadata": { "slideshow": { "slide_type": "slide" @@ -397,94 +546,86 @@ "source": [ "---\n", "\n", - "## Iterations: for" + "## Juggling with iterables\n", + "\n", + "We can sort and reverse lists." ] }, { "cell_type": "code", "execution_count": null, - "id": "8a6ba89c", + "id": "59911d1c", "metadata": {}, "outputs": [], "source": [ - "a_list = ['is', 'iterable', 'with']\n", - "for x in a_list:\n", - " print(x)" + "l = [1, 2, 3, 4, 5]\n", + "r = reversed(l)\n", + "print(r)" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "4de14947", + "cell_type": "markdown", + "id": "caba6ee1", "metadata": {}, - "outputs": [], "source": [ - "for x in a_list:\n", - " # You need `from __future__ import print_function`\n", - " # for python2 to support the `end` argument\n", - " print((x), end=' ')\n", - " y = x + str(2)\n", - " break # stop now" + "reversed is a generator, so we need to convert it to a list to print it." ] }, { "cell_type": "code", "execution_count": null, - "id": "a82d3884", + "id": "99184447", "metadata": {}, "outputs": [], "source": [ - "# what's the expected output of the\n", - "# following instruction?\n", - "print((\"x,y: \", (x, y)))\n", - "# Differently from C, `for` does not create\n", - "# a scope" + "# Exercise: print the reversed list\n" ] }, { "cell_type": "markdown", - "id": "024799a1", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "0cddde56", + "metadata": {}, "source": [ - "---\n", + "\n", "\n", - "## Iterations: while" + "If we have different lists, we can concatenate them." ] }, { "cell_type": "code", "execution_count": null, - "id": "77deba6c", + "id": "c569f711", "metadata": {}, "outputs": [], "source": [ - "a_list = ['is', 'iterable', 'with']\n", - "while a_list:\n", - " # pop() modifies a list removing\n", - " # and returning its last element\n", - " x = a_list.pop()\n", - " print((\"pop out %s\" % x))\n", - " break # what happens if I remove this break?\n", + "A = [1, 2, 3]\n", + "B = [4, 5, 6]\n", + "A + B" + ] + }, + { + "cell_type": "markdown", + "id": "78d4f2be", + "metadata": {}, + "source": [ + "or associate pairwise elements using the `zip` function.\n", "\n", - "print(a_list)" + "$\n", + "A = [a_0, a_1, a_2]\n", + "B = [b_0, b_1, b_2]\n", + "diag(A,B) = [ (a_i, b_i) \\mid i < min(|A|, |B|) ]\n", + "$" ] }, { "cell_type": "code", "execution_count": null, - "id": "e623c0d5", + "id": "3aa49e03", "metadata": {}, "outputs": [], "source": [ - "# What's the expected behavior of the\n", - "# following instructions?\n", - "for x in a_list:\n", - " print((x + a_list.pop()))\n", - "# for + pop() is not always a good idea ;)" + "D = zip(A, B)\n", + "print(D)" ] } ], diff --git a/python-high-school/notebooks/11_iterations.ipynb b/python-high-school/notebooks/11_iterations.ipynb new file mode 100644 index 0000000..54e563b --- /dev/null +++ b/python-high-school/notebooks/11_iterations.ipynb @@ -0,0 +1,378 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "262e1124", + "metadata": {}, + "source": [ + "# Python for High School\n", + "\n", + "Lesson 3: Iterations\n", + "\n", + "## Agenda\n", + "\n", + "- Conditions: `if`\n", + "- Iterations: `for`\n", + "- Iterations: `while`\n", + "\n", + "\n", + "## Conditions: `if`\n", + "\n", + "Python can evaluate conditions using `if` statements." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02335fd5", + "metadata": {}, + "outputs": [], + "source": [ + "n = 2\n", + "parity = \"even\" if n % 2 == 0 else \"odd\"" + ] + }, + { + "cell_type": "markdown", + "id": "2ae7d15e", + "metadata": {}, + "source": [ + "More complex conditions can be evaluated using multiple lines\n", + "and the `elif` and `else` keywords." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c981d8f", + "metadata": {}, + "outputs": [], + "source": [ + "# Sign of a function.\n", + "n = 1\n", + "if n > 0:\n", + " sign = 1\n", + "elif n < 0:\n", + " sign = -1\n", + "else:\n", + " sign = 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62d2cd2a", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise. Modify the cell above and check that the sign of 0 is 0.\n", + "print(sign)" + ] + }, + { + "cell_type": "markdown", + "id": "5963a350", + "metadata": {}, + "source": [ + "## Iterations: `for`\n", + "\n", + "Iterating means to repeat a process multiple times\n", + "with different values.\n", + "\n", + "We are familiar with iterations in maths.\n", + "When we sum a list of numbers, we always repeat the same process:\n", + "\n", + "0. start with a sum of 0\n", + "1. take the next number from the list\n", + "2. add it to the sum\n", + "3. if there are more numbers, go to 1\n", + "4. otherwise, stop\n", + "\n", + "Python allows you to iterate over a sequence of items using the `for` instruction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b421687", + "metadata": {}, + "outputs": [], + "source": [ + "a_list = ['is', 'iterable', 'with']\n", + "for x in a_list:\n", + " print(x)" + ] + }, + { + "cell_type": "markdown", + "id": "313b5f50", + "metadata": {}, + "source": [ + "We can stop the iteration using the `break` instruction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9d4027e", + "metadata": {}, + "outputs": [], + "source": [ + "for x in a_list:\n", + " print(x, end=' ')\n", + " y = x + str(2)\n", + " break # stop now" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "707f1f1c", + "metadata": {}, + "outputs": [], + "source": [ + "# what's the expected output of the\n", + "# following instruction?\n", + "print((\"x, y: \", (x, y)))\n", + "# Differently from other languages like C, `for` does not create\n", + "# a scope" + ] + }, + { + "cell_type": "markdown", + "id": "53773344", + "metadata": {}, + "source": [ + "Combining `if` and `break` we can stop the iteration when a condition is met." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97ebf69a", + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(10):\n", + " if i == 5:\n", + " break\n", + " print(i, end=' ')" + ] + }, + { + "cell_type": "markdown", + "id": "f18ffc63", + "metadata": {}, + "source": [ + "We can use conditions on other variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89d7b045", + "metadata": {}, + "outputs": [], + "source": [ + "s = 0\n", + "for i in range(10):\n", + " if s > 10:\n", + " break\n", + " s += i\n", + "print(s, end=' ')" + ] + }, + { + "cell_type": "markdown", + "id": "f4e3ba05", + "metadata": {}, + "source": [ + "Exercise: write a loop that prints all the divisors of $n=100$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a85bfab0", + "metadata": {}, + "outputs": [], + "source": [ + "n = 100\n", + "for q in range(2, n):\n", + " # Write your code here.\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "a77e9fe6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Iterations: while\n", + "\n", + "We can even iterate over specific conditions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "86f47a5b", + "metadata": {}, + "outputs": [], + "source": [ + "i = 10:\n", + "while i > 0:\n", + " print(i, end=' ')\n", + " i -= 1" + ] + }, + { + "cell_type": "markdown", + "id": "1d640522", + "metadata": {}, + "source": [ + "Exercise: complete the code below to write a loop with the same output of the previous cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1511d643", + "metadata": {}, + "outputs": [], + "source": [ + "i = ...\n", + "while ...:\n", + " print(i, end=' ')\n", + " i += 1" + ] + }, + { + "cell_type": "markdown", + "id": "fb935afa", + "metadata": {}, + "source": [ + "Exercise: write a loop that prints all the divisors of $n=100$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a9bc935", + "metadata": {}, + "outputs": [], + "source": [ + "n = 100\n", + "q = 2\n", + "while ...:\n", + " if ...:\n", + " print(q, end=\"; \")\n", + " ... " + ] + }, + { + "cell_type": "markdown", + "id": "946f16dc", + "metadata": {}, + "source": [ + "Exercise: write a loop that prints all the prime factors of $n=100$, i.e. $2; 2; 5; 5;$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba013ff1", + "metadata": {}, + "outputs": [], + "source": [ + "n = 100\n", + "q = 2\n", + "while ...:\n", + " if ...:\n", + " print(q, end=\"; \")\n", + " ...\n" + ] + }, + { + "cell_type": "markdown", + "id": "a1504089", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "3a764e43", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "`while` can use an iterable to check if there are more elements." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f19683af", + "metadata": {}, + "outputs": [], + "source": [ + "a_list = ['is', 'iterable', 'with']\n", + "while a_list:\n", + " # pop() modifies a list removing\n", + " # and returning its last element\n", + " x = a_list.pop()\n", + " print(f\"pop out {x}\")\n", + " break # what happens if I remove this break?\n", + "\n", + "print(a_list)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6d0f733", + "metadata": {}, + "outputs": [], + "source": [ + "# What's the expected behavior of the\n", + "# following instructions?\n", + "for x in a_list:\n", + " print((x + a_list.pop()))\n", + "# for + pop() is not always a good idea ;)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python-high-school/notebooks/20_plots.ipynb b/python-high-school/notebooks/20_plots.ipynb index adc9108..1184638 100644 --- a/python-high-school/notebooks/20_plots.ipynb +++ b/python-high-school/notebooks/20_plots.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "d763e965", + "id": "ce7976d1", "metadata": {}, "source": [ "# Plotting\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cb80cfdd", + "id": "2a0995b1", "metadata": {}, "outputs": [], "source": [ @@ -23,16 +23,26 @@ }, { "cell_type": "markdown", - "id": "3f5c6919", + "id": "567d315e", "metadata": {}, "source": [ - "Let's define a simple function" + "A computer can't plot a function, it can only plot points. So we need to provide a set of points that are close enough to the function.\n", + "This means that when you zoom in, the plot looks like a series of joint segments.\n", + "\n", + "## Plotting points\n", + "\n", + "We can use the `lambda` keyword to define simple functions.\n", + "This is equivalent to\n", + "\n", + "$\n", + "f(x) = x^3 - 50x\n", + "$" ] }, { "cell_type": "code", "execution_count": null, - "id": "369ce24c", + "id": "832107e1", "metadata": {}, "outputs": [], "source": [ @@ -41,21 +51,21 @@ }, { "cell_type": "markdown", - "id": "75bc43e4", + "id": "1d6d2968", "metadata": {}, "source": [ "Now define a domain range and evaluate the function\n", "\n", - "$$\n", + "$\n", "\\mathcal{D} = [-10; 10 ] \\cap \\mathbb{Z} \\\\\n", "\\mathcal{C} = f(\\mathcal{D}) := \\{f(x) \\mid x \\in \\mathcal{D} \\}\n", - "$$" + "$" ] }, { "cell_type": "code", "execution_count": null, - "id": "ef6e798f", + "id": "330259e9", "metadata": {}, "outputs": [], "source": [ @@ -65,7 +75,67 @@ }, { "cell_type": "markdown", - "id": "a7554728", + "id": "9101d6fd", + "metadata": {}, + "source": [ + "Exercises:\n", + "\n", + "- print the domain and codomain" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ed69886b", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "d3c2ef46", + "metadata": {}, + "source": [ + "- use the `zip` function to print a table pairs\n", + " using the string formatting tools, e.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7dbf926e", + "metadata": {}, + "outputs": [], + "source": [ + " x | f(x)\n", + "-10 | -500\n", + " -9 | -279\n", + "... | ..." + ] + }, + { + "cell_type": "markdown", + "id": "6118058b", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64c56750", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "a1463f81", "metadata": {}, "source": [ "Now we can plot the function providing the two sets" @@ -74,7 +144,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3f02d256", + "id": "4a6dc109", "metadata": {}, "outputs": [], "source": [ @@ -82,6 +152,22 @@ "plt.axhline(0, color='black')\n", "plt.plot(D, C)" ] + }, + { + "cell_type": "markdown", + "id": "783002dd", + "metadata": {}, + "source": [ + "## Geometric plotting\n", + "\n", + "The sympy module has functionalities for geometric objects.\n", + "\n", + "```python\n", + "import matplotlib\n", + "from sympy import symbols, Point, Line, Circle, Triangle, Polygon, pi\n", + "\n", + "``" + ] } ], "metadata": {}, From 9350dc28ad771a50db547dd79bac16068e58819b Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Thu, 30 Nov 2023 20:34:09 +0100 Subject: [PATCH 37/52] Binary operators (#76) * Plotting. * Some combinatorics. * More stuff * Reference notebooks with fromURL * bits of logic. --------- Co-authored-by: Roberto Polli --- .pre-commit-config.yaml | 16 +- .../exercise-05/inventory-docker-solution.py | 1 + .../notebooks/exercise-05/inventory-docker.py | 2 +- connexion-101/api/__init__.py | 4 +- connexion-101/api/__main__.py | 4 +- connexion-101/notebooks/oas3/security.py | 10 +- .../notebooks/oas3/throttling_quota.py | 10 +- .../notebooks/course/__init__.py | 18 +- .../notebooks/course/linux_diskstats.py | 10 +- .../notebooks/course/multiplatform_vmstat.py | 4 +- python-for-sysadmin/notebooks/course/pgrep.py | 2 +- .../notebooks/course/ping_rtt.py | 4 +- .../scripts/01_system_data_gathering.py | 42 +- python-for-sysadmin/scripts/02_encoding.py | 56 +- .../scripts/02_file_management.py | 20 +- .../scripts/03_parsing_test.py | 5 +- .../scripts/04_simple_processing.py | 14 +- python-high-school/00_intro.md | 24 +- python-high-school/01_numbers.md | 240 +++++++ python-high-school/10_collections.md | 156 ++++- python-high-school/11_iterations.md | 78 ++- python-high-school/20_plots.md | 72 +- python-high-school/notebooks/00_intro.ipynb | 253 +++---- python-high-school/notebooks/01_numbers.ipynb | 503 ++++++++++++++ python-high-school/notebooks/01_strings.ipynb | 156 ++--- .../notebooks/10_collections copy 2.ipynb | 651 ------------------ .../notebooks/10_collections copy.ipynb | 651 ------------------ .../notebooks/10_collections.ipynb | 400 +++++++++-- .../notebooks/11_iterations.ipynb | 190 ++--- python-high-school/notebooks/20_plots.ipynb | 160 ++++- 30 files changed, 1854 insertions(+), 1902 deletions(-) create mode 100644 python-high-school/01_numbers.md create mode 100644 python-high-school/notebooks/01_numbers.ipynb delete mode 100644 python-high-school/notebooks/10_collections copy 2.ipynb delete mode 100644 python-high-school/notebooks/10_collections copy.ipynb diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a177b1d..50bb064 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,7 +8,7 @@ # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v3.2.0 + rev: v4.5.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -16,7 +16,7 @@ repos: args: [--allow-multiple-documents] - id: check-added-large-files - repo: https://github.com/myint/autoflake - rev: b330072a26bb13aea8843f8083cee5332d71f78f + rev: v2.2.1 hooks: - id: autoflake args: @@ -24,11 +24,11 @@ repos: - --remove-unused-variables - --remove-all-unused-imports - repo: https://github.com/psf/black - rev: 19.3b0 + rev: 23.11.0 hooks: - id: black - repo: https://github.com/pycqa/isort - rev: 5.8.0 + rev: 5.12.0 hooks: - id: isort name: isort (python) @@ -41,12 +41,12 @@ repos: - id: isort name: isort (pyi) types: [pyi] -- repo: https://gitlab.com/pycqa/flake8 - rev: 3.9.0 +- repo: https://github.com/pycqa/flake8 + rev: 6.1.0 hooks: - id: flake8 - repo: https://github.com/PyCQA/bandit - rev: 1.7.0 + rev: 1.7.5 hooks: - id: bandit name: bandit @@ -57,6 +57,6 @@ repos: language_version: python3 types: [python] - repo: https://github.com/Lucas-C/pre-commit-hooks-safety - rev: v1.2.1 + rev: v1.3.2 hooks: - id: python-safety-dependencies-check diff --git a/ansible-101/notebooks/exercise-05/inventory-docker-solution.py b/ansible-101/notebooks/exercise-05/inventory-docker-solution.py index b7c7cdb..e91d6a9 100755 --- a/ansible-101/notebooks/exercise-05/inventory-docker-solution.py +++ b/ansible-101/notebooks/exercise-05/inventory-docker-solution.py @@ -58,6 +58,7 @@ def create_inventory(): ret = json.dumps(inventory, indent=True) return ret + # # Execute the script. # diff --git a/ansible-101/notebooks/exercise-05/inventory-docker.py b/ansible-101/notebooks/exercise-05/inventory-docker.py index 1455e44..b53f5b7 100755 --- a/ansible-101/notebooks/exercise-05/inventory-docker.py +++ b/ansible-101/notebooks/exercise-05/inventory-docker.py @@ -36,6 +36,6 @@ def get_inventory_data(container): ip_address = host["ip_address"] if group_name not in inventory: - inventory[group_name]= {"hosts": []} + inventory[group_name] = {"hosts": []} inventory[group_name]["hosts"].append(ip_address) diff --git a/connexion-101/api/__init__.py b/connexion-101/api/__init__.py index 0e91ba3..4ebab84 100644 --- a/connexion-101/api/__init__.py +++ b/connexion-101/api/__init__.py @@ -13,14 +13,14 @@ def forward_token(): def get_hello(): """Connexion processes the yaml, and - executes `get_hello` + executes `get_hello` """ return {"hello": "world"} def get_hello_auth(): """Connexion processes the yaml, and - executes `get_hello` + executes `get_hello` """ return {"hello": "world"} diff --git a/connexion-101/api/__main__.py b/connexion-101/api/__main__.py index 41e7b94..a2abe48 100644 --- a/connexion-101/api/__main__.py +++ b/connexion-101/api/__main__.py @@ -17,14 +17,14 @@ def forward_token(): def get_hello(): """Connexion processes the yaml, and - executes `get_hello` + executes `get_hello` """ return {"hello": "world"} def get_hello_auth(): """Connexion processes the yaml, and - executes `get_hello` + executes `get_hello` """ return {"hello": "world"} diff --git a/connexion-101/notebooks/oas3/security.py b/connexion-101/notebooks/oas3/security.py index e41bfd2..3356dfe 100644 --- a/connexion-101/notebooks/oas3/security.py +++ b/connexion-101/notebooks/oas3/security.py @@ -5,11 +5,11 @@ def my_auth(username, password, required_scopes=None): """An dummy authentication function. - :params: username, the username - :params: password, the password - :params: scopes, the scope - :returns: `{"sub": username, "scope": ""}` on success, - None on failure + :params: username, the username + :params: password, the password + :params: scopes, the scope + :returns: `{"sub": username, "scope": ""}` on success, + None on failure """ if username == password: return {"sub": username, "scope": ""} diff --git a/connexion-101/notebooks/oas3/throttling_quota.py b/connexion-101/notebooks/oas3/throttling_quota.py index 42850f6..984a2c8 100644 --- a/connexion-101/notebooks/oas3/throttling_quota.py +++ b/connexion-101/notebooks/oas3/throttling_quota.py @@ -8,11 +8,11 @@ class ThrottlingQuota: - """ A simple class to implement quota. + """A simple class to implement quota. - BEWARE: It's a tutorial function, don't use in production! - this is not thread-safe nor process-aware and - stores everything in a dict(). + BEWARE: It's a tutorial function, don't use in production! + this is not thread-safe nor process-aware and + stores everything in a dict(). """ def __init__(self, ttl, limit): @@ -65,7 +65,7 @@ def throttle_user(user): def throttle(wrapped): """A decorator to apply throttling policies. - BEWARE: It's a tutorial function, don't use in production. + BEWARE: It's a tutorial function, don't use in production. """ @wraps(wrapped) diff --git a/python-for-sysadmin/notebooks/course/__init__.py b/python-for-sysadmin/notebooks/course/__init__.py index 3b7a50d..8c8d6f7 100644 --- a/python-for-sysadmin/notebooks/course/__init__.py +++ b/python-for-sysadmin/notebooks/course/__init__.py @@ -41,7 +41,7 @@ def show_solution(bcode): def create_wuerstelstrasse(dirname="/tmp"): """Creates 3 files using cp1252 encoding - @param dirname - The base directory, default '/tmp' + @param dirname - The base directory, default '/tmp' """ from os.path import isdir @@ -54,7 +54,7 @@ def create_wuerstelstrasse(dirname="/tmp"): def create_espana(dirname="/tmp"): """Creates 3 files using cp1252 encoding - @param dirname - The base directory, default '/tmp' + @param dirname - The base directory, default '/tmp' """ from os.path import isdir @@ -65,8 +65,8 @@ def create_espana(dirname="/tmp"): def touch_encoded_filenames(dirname, prefix, ext="txt", encoding="utf-8"): - """ Create filenames with a given encoding - Python2 default encoding is ascii. + """Create filenames with a given encoding + Python2 default encoding is ascii. """ from os.path import join as pjoin @@ -95,8 +95,8 @@ def touch_encoded_filenames(dirname, prefix, ext="txt", encoding="utf-8"): def sh(cmd): """A quick and dirty check_output wrapper. - Use shlex to honor quoted spaces - like "my document.docx" + Use shlex to honor quoted spaces + like "my document.docx" """ from shlex import split from subprocess import check_output @@ -107,8 +107,8 @@ def sh(cmd): def grep(expr, fpath): """grep reloaded with regular expressions and path normalization - GOAL: re.search matches anywhere (eg. '.*XXX.*') - re.match matches from the beginning of the line. + GOAL: re.search matches anywhere (eg. '.*XXX.*') + re.match matches from the beginning of the line. """ import os @@ -132,7 +132,7 @@ def igrep(expr, iterable): # def in_chunks(dataset, size=10): """Split dataset in bins of a given size - @return a generator + @return a generator """ for i in range(0, len(dataset), size): yield dataset[i : i + size] diff --git a/python-for-sysadmin/notebooks/course/linux_diskstats.py b/python-for-sysadmin/notebooks/course/linux_diskstats.py index d441f8a..77b0460 100644 --- a/python-for-sysadmin/notebooks/course/linux_diskstats.py +++ b/python-for-sysadmin/notebooks/course/linux_diskstats.py @@ -7,11 +7,11 @@ def linux_diskstats(disk): """Get I/O information from /proc/diskstats - @param disk def sda - goal: usage of time.sleep - goal: usage of dict.setdefault - goal: use string concatenation to increase readability - goal: use *magic with print+sep, splitting and slicing + @param disk def sda + goal: usage of time.sleep + goal: usage of dict.setdefault + goal: use string concatenation to increase readability + goal: use *magic with print+sep, splitting and slicing """ from time import sleep diff --git a/python-for-sysadmin/notebooks/course/multiplatform_vmstat.py b/python-for-sysadmin/notebooks/course/multiplatform_vmstat.py index 9473122..66a33bc 100644 --- a/python-for-sysadmin/notebooks/course/multiplatform_vmstat.py +++ b/python-for-sysadmin/notebooks/course/multiplatform_vmstat.py @@ -1,7 +1,5 @@ def multiplatform_vmstat(count): - """Get data in a multiplatform way - - """ + """Get data in a multiplatform way""" import time import psutil diff --git a/python-for-sysadmin/notebooks/course/pgrep.py b/python-for-sysadmin/notebooks/course/pgrep.py index 2ef91cd..9305ba6 100644 --- a/python-for-sysadmin/notebooks/course/pgrep.py +++ b/python-for-sysadmin/notebooks/course/pgrep.py @@ -10,7 +10,7 @@ def igrep(expr, iterable): def system_info_from_command_output_solution(): """Exercise: write a multiplatform - pgrep-like function + pgrep-like function """ def pgrep(expr): diff --git a/python-for-sysadmin/notebooks/course/ping_rtt.py b/python-for-sysadmin/notebooks/course/ping_rtt.py index 19af5db..8df7792 100644 --- a/python-for-sysadmin/notebooks/course/ping_rtt.py +++ b/python-for-sysadmin/notebooks/course/ping_rtt.py @@ -3,8 +3,8 @@ def ping_rtt(): """ - goal: slicing data - goal: using zip to transpose data + goal: slicing data + goal: using zip to transpose data """ import sys diff --git a/python-for-sysadmin/scripts/01_system_data_gathering.py b/python-for-sysadmin/scripts/01_system_data_gathering.py index 9b90137..18e2d30 100644 --- a/python-for-sysadmin/scripts/01_system_data_gathering.py +++ b/python-for-sysadmin/scripts/01_system_data_gathering.py @@ -14,19 +14,19 @@ def grep(needle, fpath): """A simple grep implementation - goal: open() is iterable and don't - needs splitlines() - goal: comprehension can filter lists + goal: open() is iterable and don't + needs splitlines() + goal: comprehension can filter lists """ return [x for x in open(fpath) if needle in x] def linux_threads(pid): - """"Glob emulates shell expansion of * and ? + """ "Glob emulates shell expansion of * and ? - goal: use globbing and format - goal: linux proc structure - goal: startswith accepts tuple arguments + goal: use globbing and format + goal: linux proc structure + goal: startswith accepts tuple arguments """ import glob @@ -43,14 +43,14 @@ def multiplatform_stats(count): def sh(cmd, shell=False, timeout=0): - """"Execute a command returning a line-splitted list + """ "Execute a command returning a line-splitted list - @param cmd - a command string - @param shell - run command in a shell - @param timeout - (for python 3.3+) in seconds + @param cmd - a command string + @param shell - run command in a shell + @param timeout - (for python 3.3+) in seconds - goal: use sys to check python features - goal: use subprocess.check_output + goal: use sys to check python features + goal: use subprocess.check_output """ from subprocess import check_output from sys import version_info as python_version @@ -66,9 +66,9 @@ def sh(cmd, shell=False, timeout=0): def system_info_from_command_output(): """Exercise: write a multiplatform - pgrep-like function + pgrep-like function - Solution is at the EOF + Solution is at the EOF """ def pgrep(expr): @@ -77,7 +77,7 @@ def pgrep(expr): def zip_iterables(): """The zip method joins list elements pairwise - like a zip fastener + like a zip fastener """ from sys import version_info as python_version @@ -92,11 +92,11 @@ def zip_iterables(): def linux_diskstats(disk): """Get I/O information from /proc/diskstats - @param disk def sda - goal: usage of time.sleep - goal: usage of zip - goal: use string concatenation to increase readability - goal: use *magic with print+sep, splitting and slicing + @param disk def sda + goal: usage of time.sleep + goal: usage of zip + goal: use string concatenation to increase readability + goal: use *magic with print+sep, splitting and slicing """ from time import sleep diff --git a/python-for-sysadmin/scripts/02_encoding.py b/python-for-sysadmin/scripts/02_encoding.py index 920c6a3..8b89bdb 100644 --- a/python-for-sysadmin/scripts/02_encoding.py +++ b/python-for-sysadmin/scripts/02_encoding.py @@ -9,22 +9,22 @@ def encoding_basic(): """S3 - When the child was a child, - strings were a list of bytes. - In 21th century, that's False (and python2 was mainly - developed in 20th century;). + When the child was a child, + strings were a list of bytes. + In 21th century, that's False (and python2 was mainly + developed in 20th century;). - bytes is a list of bytes - A string is a couple: (bytes, encoding). + bytes is a list of bytes + A string is a couple: (bytes, encoding). - An encoding is a one-to-one map between a byte-sequence - and a typographical character. + An encoding is a one-to-one map between a byte-sequence + and a typographical character. """ def touch_encoded_filenames(dirname, prefix, ext="txt", encoding="utf-8"): - """ Create filenames with a given encoding - Python2 default encoding is ascii. + """Create filenames with a given encoding + Python2 default encoding is ascii. """ from os.path import join as pjoin @@ -42,17 +42,17 @@ def touch_encoded_filenames(dirname, prefix, ext="txt", encoding="utf-8"): def windows_filenames(): - """ As filenames are actually binary data - we should be careful when our scripts read - eg from a vfat filesystem. + """As filenames are actually binary data + we should be careful when our scripts read + eg from a vfat filesystem. - In this example we're creating 3 windows-encoded - filenames like wuerstelstrasse.X.txt + In this example we're creating 3 windows-encoded + filenames like wuerstelstrasse.X.txt - os.path functions fail mangling them as encoded strings - so we ask it to mangle as bytes. - moreover we use "{!r}".format to avoid further encoding - issues in the printing part + os.path functions fail mangling them as encoded strings + so we ask it to mangle as bytes. + moreover we use "{!r}".format to avoid further encoding + issues in the printing part """ from os import listdir as ls from os.path import join as pjoin @@ -78,17 +78,17 @@ def windows_filenames(): def windows_filenames_short(): - """ As filenames are actually binary data - we should be careful when our scripts read - eg from a vfat filesystem. + """As filenames are actually binary data + we should be careful when our scripts read + eg from a vfat filesystem. - In this example we're creating 3 windows-encoded - filenames like wuerstelstrasse.X.txt + In this example we're creating 3 windows-encoded + filenames like wuerstelstrasse.X.txt - os.path.* and glob.* fail mangling them as encoded strings - so we ask it to mangle as bytes. - moreover we use "{!r}".format to avoid further encoding - issues in the printing part + os.path.* and glob.* fail mangling them as encoded strings + so we ask it to mangle as bytes. + moreover we use "{!r}".format to avoid further encoding + issues in the printing part """ from glob import glob diff --git a/python-for-sysadmin/scripts/02_file_management.py b/python-for-sysadmin/scripts/02_file_management.py index 4d91c24..5a745d0 100644 --- a/python-for-sysadmin/scripts/02_file_management.py +++ b/python-for-sysadmin/scripts/02_file_management.py @@ -12,8 +12,8 @@ def simple_path_management(): """S1 Show multiplatform path management - goal: sys.platform shows the current operating system - goal: os.path.normpath fixes the "/" orientation + goal: sys.platform shows the current operating system + goal: os.path.normpath fixes the "/" orientation """ # .1- The os.path module seems verbose @@ -36,16 +36,16 @@ def simple_path_management(): def create_and_move_tree(): """S2 - modules: os.path, shutil, errno - goal: manage directory trees - goal: manage basic errors + modules: os.path, shutil, errno + goal: manage directory trees + goal: manage basic errors - os.path can be used to test file existence - while os and shutil supports basic file operations - like recursive copy and tree creation. + os.path can be used to test file existence + while os and shutil supports basic file operations + like recursive copy and tree creation. - We can use exception handlers to check - what happened. + We can use exception handlers to check + what happened. """ from os import makedirs from os.path import isdir diff --git a/python-for-sysadmin/scripts/03_parsing_test.py b/python-for-sysadmin/scripts/03_parsing_test.py index ac4d1d1..c9d6888 100644 --- a/python-for-sysadmin/scripts/03_parsing_test.py +++ b/python-for-sysadmin/scripts/03_parsing_test.py @@ -32,9 +32,10 @@ def test_delivered(): def parse_line(line): - """ Complete the parse line function. + """Complete the parse line function. - Without watching the solution: ICAgIGltcG9ydCByZQogICAgXywgXywgaG91ciwgaG9zdCwgXywgXywgZGVzdCA9IGxpbmUuc3BsaXQoKVs6N10KICAgIHRyeToKICAgICAgICBkZXN0ID0gcmUuc3BsaXQocidbPD5dJywgZGVzdClbMV0KICAgIGV4Y2VwdDoKICAgICAgICBkZXN0ID0gTm9uZQogICAgcmV0dXJuIChob3VyLCBob3N0LCBkZXN0KQoK""" + Without watching the solution: ICAgIGltcG9ydCByZQogICAgXywgXywgaG91ciwgaG9zdCwgXywgXywgZGVzdCA9IGxpbmUuc3BsaXQoKVs6N10KICAgIHRyeToKICAgICAgICBkZXN0ID0gcmUuc3BsaXQocidbPD5dJywgZGVzdClbMV0KICAgIGV4Y2VwdDoKICAgICAgICBkZXN0ID0gTm9uZQogICAgcmV0dXJuIChob3VyLCBob3N0LCBkZXN0KQoK + """ # Hint: "you can".split() # Hint: ""[1:-1] or use re.split raise NotImplementedError("Write me!") diff --git a/python-for-sysadmin/scripts/04_simple_processing.py b/python-for-sysadmin/scripts/04_simple_processing.py index e464bcb..499d7bc 100644 --- a/python-for-sysadmin/scripts/04_simple_processing.py +++ b/python-for-sysadmin/scripts/04_simple_processing.py @@ -5,8 +5,8 @@ def sh(cmd): """A quick and dirty check_output wrapper. - Don't use in production as it won't honor - quoted spaces like "my document.docx" + Don't use in production as it won't honor + quoted spaces like "my document.docx" """ from subprocess import check_output @@ -15,8 +15,8 @@ def sh(cmd): def ping_rtt(): """ - goal: slicing data - goal: using zip to transpose data + goal: slicing data + goal: using zip to transpose data """ import sys @@ -37,9 +37,9 @@ def ping_rtt(): def ping_stats(): """ - goal: remember to convert to numeric / float - goal: use scipy - goal: check stdev + goal: remember to convert to numeric / float + goal: use scipy + goal: check stdev """ from scipy import mean, std diff --git a/python-high-school/00_intro.md b/python-high-school/00_intro.md index 5b312c9..96a2be8 100644 --- a/python-high-school/00_intro.md +++ b/python-high-school/00_intro.md @@ -15,6 +15,8 @@ This is a fast-track course for high school students with math knowledge. Students are expected to type and execute cells, and share their results. +You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/00_intro.ipynb). + --- # Jupyter @@ -228,7 +230,7 @@ A number is represented using digits (in Italian, "cifre"): - the decimal notation uses 10 digits, from 0 to 9; - the binary notation uses 2 digits, 0 and 1; - the octal notation uses 8 digits, from 0 to 7; -- the hexadecimal notation uses 16 digits, where 10 is represented by A, 11 by B, and so on. +- the hexadecimal notation uses 16 digits, where `10` is represented by `A`, `11` by `B`, and so on. ---- @@ -247,6 +249,9 @@ $ 12_{10} = 2 \cdot 10^0 + 1 \cdot 10^1 = 12 \\ 101_{2} = 1 \cdot 2^0 + 0 \cdot 2^1 + 1 \cdot 2^2 = 5_{10} \\ 200_{3} = 0 \cdot 3^0 + 0 \cdot 3^1 + 2 \cdot 3^2 = 18_{10} \\ +9_{16} = 9 \cdot 16^0 = 9_{10} \\ +A_{16} = 10 \cdot 16^0 = 10_{10} \\ +FF_{16} = 15 \cdot 16^0 + 15 \cdot 16^1 = 255_{10} \\ $ Exercise: @@ -254,7 +259,13 @@ Exercise: - how can I compute the value of the fractional part? Hint: just use the same formula with negative exponents. $ -0.5_{10} = 5 \cdot 10^{-1} \\ +0.5_{10} = 5 \cdot 10^{-1} +$ + +- can I compute the value of the following numbers? + +$ +0.1_{2} = \dots \\ 0.5_{2} = \dots $ @@ -262,11 +273,12 @@ $ Python supports the binary, the octal and the hexadecimal notation too! + ```python -d = 0b11 # integer in binary notation -e = 0o11 # integer in octal notation -f = 0x10 # integer in hexadecimal (hex) notation -g = 0x1F # integer in hex notation +d = 0b11 # `0b` is the prefix for binary notation +e = 0o11 # `0o` is the prefix for octal notation +f = 0x10 # `0x` is the prefix for hexadecimal (hex) notation +g = 0x1F # `Remember: hex numbers uses 16 digits, from 0 to F ``` Exercise: diff --git a/python-high-school/01_numbers.md b/python-high-school/01_numbers.md new file mode 100644 index 0000000..eb5dee9 --- /dev/null +++ b/python-high-school/01_numbers.md @@ -0,0 +1,240 @@ +# More on numbers + +## More on binary numbers + +We can use f-strings to print the binary representation of a number. + +```python +a = 3 +print(f"{a:#b} is the binary representation of {a}") +``` + +Exercise: print the following numbers in binary: + 3, 61, 35. + + + + + + +```python +# Write your code here. +``` + +To align the number representations, we can specify the length of the representation (e.g., 10 characters). + +```python +a = 3 +print(f"{a:#10b} is the binary representation of {a}") +a = 61 +print(f"{a:#10b} is the binary representation of {a}") +``` + +I can also specify to fill the empty spaces with `0`s. + +```python +a=3 +print(f"{a:#010b} is the binary representation of {a}") +a=61 +print(f"{a:#010b} is the binary representation of {a}") +``` + +In this way I can easily compare the binary representations of two numbers. + +| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ | +|--------|-------|-------|-------|-------|-------|-------|-------|-------| +| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | +| 61 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | + +---- + +### Bitwise operators: `<<` and `>>` + +Bitwise operators are the most simple operators, +since they operate on single digits. +They are used to manipulate the binary representation of numbers. + +- Exercise on the `<<` (left-shift) operator: given the following number + +```python +a = 1 +``` + +try to guess the result of the following operations. Hint: execute the cell below multiple times. + +```python +a = a << 1 +print(f"{a:#010b}") +``` + +Is there a similar operator with numbers in base 10? + +- Exercise on the `>>` (right-shift) operator: given the following number + +```python +a = 79 +``` + +try to guess the result of the following operations. Hint: execute the cell below multiple times. + +```python +a = a >> 1 +print(f"{a:#010b}") +``` + +Is there a similar operator with numbers in base 10? + +Discuss the results with your classmates. + +### Bitwise operators: AND `&` + +The `&` operator is the bitwise AND operator. +It returns 1 if both bits are 1, 0 otherwise. + +```python +a = 19 +b = 61 +c = a & b +print(f"{a:#010b}") +print(f"{b:#010b}") +print(f"{c:#010b}") +``` + +| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ | +|--------|-------|-------|-------|-------|-------|-------|-------|-------| +| 19 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | +| 61 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | +| 19 & 61 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | + +The AND operator has a physical meaning: it is used to check if, in a circuit, two switches are both ON. + +- 🔋--1--1--💡ON +- 🔋--0--1--💡OFF +- 🔋--1--0--💡OFF +- 🔋--0--0--💡OFF + +```mermaid +subgraph AND +direction LR + b-1[fa:fa-battery-three-quarters] + led-1[far:fa-lightbulb OFF] + s1-1((fa:fa-toggle-off)) + s2-1((fa:fa-toggle-on)) + b-1 --->|e-| s1-1 + s1-1 --- s2-1 --- led-1 + --- b-1 +end +``` + +- Exercise: compute the bitwise AND of 192 and 71 by hand and check the result in the cell below. + + + +```python +# Write your code here. + +``` + +### Bitwise operators: OR `|` + +The `|` operator is the bitwise OR operator. +It returns 1 if at least one bit is 1, 0 otherwise. + +```python +a = 6 +b = 5 +c = a | b +print(f"{a:#010b}") +print(f"{b:#010b}") +print(f"{c:#010b}") +``` + +| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ | +|--------|-------|-------|-------|-------|-------|-------|-------|-------| +| 6 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | +| 5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | +| 6 \| 5 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | + +- Exercise: compute the bitwise OR of 192 and 71 by hand and check the result in the cell below. + + + +The OR operator has a physical meaning: it is used to check if, in a circuit, at least one switch is ON. + +```mermaid +flowchart LR + +subgraph OR +direction LR + b[fa:fa-battery-three-quarters] + b --->|e-| s1 & s2 ---led -.-> b + led[fas:fa-lightbulb ON] + s1((fa:fa-toggle-on)) + s2((fa:fa-toggle-off)) +end +``` + +--- + + +## Max and min + +```python +# Let's define two positive integers. +b = 234 +c = 64 +# Reorder the numbers so that b is smaller than c. +b, c = min(b, c), max(b, c) +print("b =", b, "c =", c) +``` + +Now execute the cell below many times, and see what happens. + +```python +# Iterate until b is zero. +d = c - b +b, c = min(d, b), max(d, b) +print("b =", b, "c =", c) +``` + + +--- + + +## Importing functionalities + +---- + +```python +# Importing new features +# ..is easy. Features are collected +# in packages or modules. Just +import math # to use the +math.sqrt # function + +math.sqrt(2) +``` + +```python +# We can even import single functions +# or constants from a module +from math import pi as π +π / 2 +``` + +---- + +Modules contain documentation in the form of docstrings, +that jupyter presents in scrollable boxes. + +```python + +# Read the module documentation... +help(math) +``` + +```python +# ...or the function documentation +help(math.sqrt) + +``` diff --git a/python-high-school/10_collections.md b/python-high-school/10_collections.md index 2c9e6ad..c8d61c6 100644 --- a/python-high-school/10_collections.md +++ b/python-high-school/10_collections.md @@ -56,16 +56,26 @@ A in U B not in U B in D 5 in A +``` + +Exercise: which of the above expressions are true? + +```python +# Make an hypothesis first, then check it using this cell. + +``` + +```python {1} in A EMPTY in A I in S 2 in C ``` -Exercise: which of the above instructions are true? +Exercise: which of the above expressions are true? ```python -# Use this cell for the exercise +# Make an hypothesis first, then check it using this cell. ``` @@ -76,9 +86,51 @@ Exercise: print the content of the sets. ``` +## Tuples (Vectors) + +A python `tuple` (:it: n-pla) represents an ordered list of objects, +and can contain duplicates. + +They seem like vectors, + +$ +\underline{v} = (v_0, v_1, \dots, v_n) \in \mathbb{R}^n +$ + +but they are not! + +Here are two tuples in $\mathbb{R}^2$: + +```python +v = (0, 0) +w = (3, 4) +``` + +Exercise: print the content of the tuples. + +```python +print(v[0]) +``` + +Beware: operations on tuples are not the same as operations on vectors! + +```python +# Exercise: try to sum and multiply v and w. Which is the result? What would you expect? + +``` + +Exercise: try to modify the first element of v. What happens? + +```python +# Use this cell for the exercise + +``` + +Tuples are immutable! + ## Introducing Lists -A list is an ordered sequence of items. +A list is an **ordered** sequence of objects. Differently from a set, a list is ordered and can contain duplicates. @@ -89,8 +141,7 @@ list_a = ['this', 'is', 'a', 'list'] ``` ```python - -# you can append items to a list +# you can append objects to a list # with the append method list_a.append("mutable") ``` @@ -109,8 +160,8 @@ len(list_a) #### Lists and Generators -In python you can generate a sequence of numbers. -To avoid consuming too much memory, this is not doen using lists +The `range` function generates a sequence of numbers. +To avoid consuming too much memory, this is not done using lists or sets, but using special objects that generate those sequences. ```python @@ -145,10 +196,9 @@ print(l) ```python -# Exercise: can you print the content of from_0_to_10 -print(from_0_to_10) -``` +# Exercise: print the content of from_0_to_10 +``` --- @@ -190,6 +240,7 @@ help(list) ```python straight = [1, 2, 3, 'star'] print(straight) +type(straight) # This is a list! ``` Python supports slicing, that is, getting a subsequence of a list @@ -240,7 +291,6 @@ s_a = "Counting: 123" ``` ```python - # Have length.. l_a = len(s_a) print(l_a) @@ -264,7 +314,7 @@ f[:-5], f[-5], f[-4:] --- -## Juggling with iterables +## Juggling with collections We can sort and reverse lists. @@ -273,7 +323,8 @@ l = [1, 2, 3, 4, 5] r = reversed(l) print(r) ``` -reversed is a generator, so we need to convert it to a list to print it. + +reversed is a generator, so we need to "materialize" it into a list to print it. ```python # Exercise: print the reversed list @@ -290,12 +341,34 @@ B = [4, 5, 6] A + B ``` +create the cartesian product of two lists. + +$ +A \times B := \{ (a; b) \mid a \in A, b \in B \} +$ + +|AxB| | | | +|---|---|---|---| +| | 1, 4 | 1, 5 | 1, 6 | +| | 2, 4 | 2, 5 | 2, 6 | +| | 3, 4 | 3, 5 | 3, 6 | + +```python +AxB = [(a, b) for a in A for b in B] +``` + or associate pairwise elements using the `zip` function. +|$A \Delta B$| | | | +|---|---|---|---| +| | 1, 4 | | | +| | | 2, 5 | +| | | | 3, 6 | + $ -A = [a_0, a_1, a_2] -B = [b_0, b_1, b_2] -diag(A,B) = [ (a_i, b_i) \mid i < min(|A|, |B|) ] +A = [a_0, a_1, a_2] \\ +B = [b_0, b_1, b_2] \\ +A\DeltaB = [ (a_i; b_i) \mid i < min(|A|, |B|) ] $ ```python @@ -303,3 +376,54 @@ D = zip(A, B) print(D) ``` +Exercise: can you materialize the zip object into a list? + + +```python +# Use this cell for the exercise + +``` + + +## The itertools module + +The itertools module provides advanced tools for working with collections. + +```python +import itertools +from itertools import product, permutations, combinations +``` + +You can create combinations, permutations, and cartesian products. + +```python +A = [1, 2, 3] +B = [0, 1] +n = len(A) +k = 2 +``` + +```python +AxB = product(A, B) +P_A = permutations(A) +C_A_2 = combinations(A, k) +``` + +Exercise: print the content of the above objects. + +```python +# Use this cell for the exercise + +``` + +Combinations are useful to generate all the possible subsets of a set +of a given size. + +Can you fix the expression below and compute its value? + + + + +```python +r = len(P_A) / len(C_A_2) +``` diff --git a/python-high-school/11_iterations.md b/python-high-school/11_iterations.md index a6edc1c..3c06767 100644 --- a/python-high-school/11_iterations.md +++ b/python-high-school/11_iterations.md @@ -8,7 +8,6 @@ Lesson 3: Iterations - Iterations: `for` - Iterations: `while` - ## Conditions: `if` Python can evaluate conditions using `if` statements. @@ -103,7 +102,7 @@ Exercise: write a loop that prints all the divisors of $n=100$. n = 100 for q in range(2, n): # Write your code here. - + ``` --- @@ -130,17 +129,6 @@ while ...: Exercise: write a loop that prints all the divisors of $n=100$. -```python -n = 100 -q = 2 -while ...: - if ...: - print(q, end="; ") - ... -``` - -Exercise: write a loop that prints all the prime factors of $n=100$, i.e. $2; 2; 5; 5;$. - ```python n = 100 q = 2 @@ -148,21 +136,12 @@ while ...: if ...: print(q, end="; ") ... - ``` - + --- -`while` can use an iterable to check if there are more elements. +`while` can use an iterable to check if there are more elements. ```python a_list = ['is', 'iterable', 'with'] @@ -184,3 +163,54 @@ for x in a_list: # for + pop() is not always a good idea ;) ``` +--- + +## Prime numbers + +A prime number is a number that can be divided only by 1 and itself. + +$ +p \in \mathbb{N} \text{ is prime } \iff \forall q \in \mathbb{N} \text{ if } q \mid p \text{ then } q = 1 \text{ or } q = p +$ + +Exercise: write a loop that prints all the prime factors of $n=100$, i.e. $2; 2; 5; 5;$. + +```python +n = 100 +q = 2 +while ...: + if ...: + print(q, end="; ") + ... + +``` + + +Question: do I need to check all the numbers up to $n$? + +primes = [2, ] +def factr(n, primes): + q = 2 + for p in primes: + while n % p == 0: + print("found", p) + yield p + n //= p + while n>1 and q <= math.sqrt(n)+1: + if n%q == 0: + primes.append(q) + yield q + n //= q + else: + q += 1 + if n>1: + primes.append(n) + yield n diff --git a/python-high-school/20_plots.md b/python-high-school/20_plots.md index d3430c2..74d5910 100644 --- a/python-high-school/20_plots.md +++ b/python-high-school/20_plots.md @@ -47,14 +47,14 @@ Exercises: - use the `zip` function to print a table pairs using the string formatting tools, e.g.: -~~~ - x | f(x) --10 | -500 - -9 | -279 -... | ... -~~~ +| x | f(x)| +|----|-----| +|-10 | -500| +| -9 | -279| +|... | ...| + ```python # Use this cell for the exercise @@ -70,10 +70,66 @@ plt.plot(D, C) ## Geometric plotting -The sympy module has functionalities for geometric objects. +The sympy module has functionalities for geometric objects, +and supports some abstractions like variables and functions. ```python import matplotlib from sympy import symbols, Point, Line, Circle, Triangle, Polygon, pi -``` \ No newline at end of file +``` + +### Plotting a function + +```python +# Now the python variable x is a symbolic variable managed by sympy. We can't use it numerically. +x = symbols('x') + +# Even functions are symbolic objects when using sympy. +f = x**2 - 2*x + 1 + +# The `ax` variable represent the cartesian plane. +plot(f, show=True) +``` + +I can add another function to the same plot + +```python +g = 3 - x +# The `ax` variable represent the cartesian plane. +ax = plot(f, g, show=True) +``` + +I can add further functions using `extend` + +```python +h = (x**2 - 1) +ax = plot(f, g, show=False) +ax.extend(plot(h, show=False)) +ax.show() +``` + +sympy supports implicit equations too, +for example the equation of a circle. +These should be plotted using the `plot_implicit` function. + +$ +\mathcal(C): x^2 + y^2 = 1 +$ + +```python +from sympy import Eq,plot_implicit +x, y = symbols('x y') + +# The circle equation +circle = Eq(x**2 + y**2 , 1) + +# Prepare a plotted circle +ax = plot_implicit(h, show=False) + +# Add the parabola to the plot +ax.extend(plot(f, (x, -2, 2), show=False)) + +# And finally, show the plot. +ax.show() +``` diff --git a/python-high-school/notebooks/00_intro.ipynb b/python-high-school/notebooks/00_intro.ipynb index 3e365b6..b764cc8 100644 --- a/python-high-school/notebooks/00_intro.ipynb +++ b/python-high-school/notebooks/00_intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "541e0ebb", + "id": "ba1a96c6", "metadata": {}, "source": [ "# Python for High School\n", @@ -12,7 +12,7 @@ }, { "cell_type": "markdown", - "id": "38c2409b", + "id": "7ce64e9f", "metadata": { "slideshow": { "slide_type": "slide" @@ -30,12 +30,14 @@ "\n", "This is a fast-track course for high school students with math knowledge.\n", "\n", - "Students are expected to type and execute cells, and share their results." + "Students are expected to type and execute cells, and share their results.\n", + "\n", + "You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/00_intro.ipynb)." ] }, { "cell_type": "markdown", - "id": "a941c975", + "id": "d60eaf47", "metadata": { "slideshow": { "slide_type": "slide" @@ -55,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "2e544053", + "id": "52ca24ad", "metadata": { "slideshow": { "slide_type": "slide" @@ -71,7 +73,7 @@ }, { "cell_type": "markdown", - "id": "a921a209", + "id": "81832421", "metadata": { "slideshow": { "slide_type": "slide" @@ -95,7 +97,7 @@ }, { "cell_type": "markdown", - "id": "dfb7b5f2", + "id": "280d4c87", "metadata": { "slideshow": { "slide_type": "slide" @@ -109,7 +111,7 @@ }, { "cell_type": "markdown", - "id": "0eb6d312", + "id": "70cbe19d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -123,29 +125,17 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "eb803254", + "execution_count": null, + "id": "ad6eedc1", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "# Add a new python cell with ALT+ENTER.\n", - "1+1" + "# Add a new python cell with ALT+ENTER." ] }, { "cell_type": "markdown", - "id": "c8e8c17a", + "id": "359246e6", "metadata": { "slideshow": { "slide_type": "slide" @@ -162,18 +152,10 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "3a9704b2", + "execution_count": null, + "id": "db4fa6c6", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "a string and the number 1\n" - ] - } - ], + "outputs": [], "source": [ "# You can evaluate maths and strings\n", "s = 1\n", @@ -182,7 +164,7 @@ }, { "cell_type": "markdown", - "id": "bcdc49d9", + "id": "baa23558", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -190,18 +172,10 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "42513575", + "execution_count": null, + "id": "65b897cb", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "now s is increased 2\n" - ] - } - ], + "outputs": [], "source": [ "# Evaluate this cell with SHIFT+ENTER\n", "s = s + 1\n", @@ -210,7 +184,7 @@ }, { "cell_type": "markdown", - "id": "685ef0a8", + "id": "526e918e", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -221,7 +195,7 @@ }, { "cell_type": "markdown", - "id": "48211e42", + "id": "dd93ff6d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -242,7 +216,7 @@ }, { "cell_type": "markdown", - "id": "a8d40f8c", + "id": "86124263", "metadata": { "slideshow": { "slide_type": "slide" @@ -259,18 +233,10 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "53ff77a2", + "execution_count": null, + "id": "d53d2a79", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello world!\n" - ] - } - ], + "outputs": [], "source": [ "# you can print with the print() function\n", "print(\"Hello world!\")" @@ -278,18 +244,10 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "50bc92a7", + "execution_count": null, + "id": "0e8cf359", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello World!\n" - ] - } - ], + "outputs": [], "source": [ "# concatenate strings with a + sign\n", "# and using hex notation\n", @@ -298,25 +256,17 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "c3c40dad", + "execution_count": null, + "id": "00b2c1de", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ciao\n" - ] - } - ], + "outputs": [], "source": [ "print(\"Ciao\")" ] }, { "cell_type": "markdown", - "id": "a323df65", + "id": "0902ce43", "metadata": { "slideshow": { "slide_type": "slide" @@ -332,8 +282,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "id": "e575a8c8", + "execution_count": null, + "id": "b08a4441", "metadata": {}, "outputs": [], "source": [ @@ -345,7 +295,7 @@ }, { "cell_type": "markdown", - "id": "f43d6e73", + "id": "55034f4d", "metadata": {}, "source": [ "----" @@ -353,8 +303,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "id": "0ac091aa", + "execution_count": null, + "id": "e0f31649", "metadata": {}, "outputs": [], "source": [ @@ -363,7 +313,7 @@ }, { "cell_type": "markdown", - "id": "ff2d4ed6", + "id": "834a7a9d", "metadata": {}, "source": [ "----" @@ -371,18 +321,10 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "c9ce3bb8", + "execution_count": null, + "id": "80616f6f", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "17.0 1\n" - ] - } - ], + "outputs": [], "source": [ "# I can sum, multiply, and modulus (aka, the remainder of the division).\n", "print(a + b, 5 % 2)" @@ -390,18 +332,10 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "2206a7b1", + "execution_count": null, + "id": "9b593112", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "16.0 8\n" - ] - } - ], + "outputs": [], "source": [ "# I can divide, and elevate to a power.\n", "print(b / a, 2 ** 3)" @@ -409,18 +343,10 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "c6bd8c5d", + "execution_count": null, + "id": "37f3dbdc", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3960.0\n" - ] - } - ], + "outputs": [], "source": [ "# Brackets are always round.\n", "print(((a + b) * c)/ a + (b *c))" @@ -428,7 +354,7 @@ }, { "cell_type": "markdown", - "id": "71b07a6d", + "id": "57123623", "metadata": {}, "source": [ "----" @@ -437,7 +363,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fb244c7c", + "id": "d52709ea", "metadata": {}, "outputs": [], "source": [ @@ -447,7 +373,7 @@ }, { "cell_type": "markdown", - "id": "3b05c9f2", + "id": "1f4510bf", "metadata": {}, "source": [ "Exercise: use the cell below to compute the following values:\n", @@ -460,7 +386,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2311402f", + "id": "8f8d08d7", "metadata": {}, "outputs": [], "source": [ @@ -469,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "a228c64e", + "id": "ec6391e0", "metadata": { "slideshow": { "slide_type": "slide" @@ -507,7 +433,7 @@ }, { "cell_type": "markdown", - "id": "e682080d", + "id": "8947e73b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -538,7 +464,7 @@ }, { "cell_type": "markdown", - "id": "72f88a13", + "id": "bbf777f6", "metadata": { "slideshow": { "slide_type": "slide" @@ -554,12 +480,12 @@ "- the decimal notation uses 10 digits, from 0 to 9;\n", "- the binary notation uses 2 digits, 0 and 1;\n", "- the octal notation uses 8 digits, from 0 to 7;\n", - "- the hexadecimal notation uses 16 digits, where 10 is represented by A, 11 by B, and so on." + "- the hexadecimal notation uses 16 digits, where `10` is represented by `A`, `11` by `B`, and so on." ] }, { "cell_type": "markdown", - "id": "12888ed1", + "id": "3a21a479", "metadata": { "slideshow": { "slide_type": "subslide" @@ -583,6 +509,9 @@ "12_{10} = 2 \\cdot 10^0 + 1 \\cdot 10^1 = 12 \\\\\n", "101_{2} = 1 \\cdot 2^0 + 0 \\cdot 2^1 + 1 \\cdot 2^2 = 5_{10} \\\\\n", "200_{3} = 0 \\cdot 3^0 + 0 \\cdot 3^1 + 2 \\cdot 3^2 = 18_{10} \\\\\n", + "9_{16} = 9 \\cdot 16^0 = 9_{10} \\\\\n", + "A_{16} = 10 \\cdot 16^0 = 10_{10} \\\\\n", + "FF_{16} = 15 \\cdot 16^0 + 15 \\cdot 16^1 = 255_{10} \\\\\n", "$\n", "\n", "Exercise:\n", @@ -590,14 +519,20 @@ "- how can I compute the value of the fractional part? Hint: just use the same formula with negative exponents.\n", "\n", "$\n", - "0.5_{10} = 5 \\cdot 10^{-1} \\\\\n", + "0.5_{10} = 5 \\cdot 10^{-1}\n", + "$\n", + "\n", + "- can I compute the value of the following numbers?\n", + "\n", + "$\n", + "0.1_{2} = \\dots \\\\\n", "0.5_{2} = \\dots\n", "$" ] }, { "cell_type": "markdown", - "id": "72311490", + "id": "a62ab274", "metadata": { "slideshow": { "slide_type": "subslide" @@ -612,19 +547,19 @@ { "cell_type": "code", "execution_count": null, - "id": "3d4374f3", + "id": "fc68753d", "metadata": {}, "outputs": [], "source": [ - "d = 0b11 # integer in binary notation\n", - "e = 0o11 # integer in octal notation\n", - "f = 0x10 # integer in hexadecimal (hex) notation\n", - "g = 0x1F # integer in hex notation" + "d = 0b11 # `0b` is the prefix for binary notation\n", + "e = 0o11 # `0o` is the prefix for octal notation\n", + "f = 0x10 # `0x` is the prefix for hexadecimal (hex) notation\n", + "g = 0x1F # `Remember: hex numbers uses 16 digits, from 0 to F" ] }, { "cell_type": "markdown", - "id": "bbaa1d21", + "id": "be887220", "metadata": {}, "source": [ "Exercise:" @@ -633,7 +568,7 @@ { "cell_type": "code", "execution_count": null, - "id": "65a51377", + "id": "7fd5c7b6", "metadata": {}, "outputs": [], "source": [ @@ -642,7 +577,7 @@ }, { "cell_type": "markdown", - "id": "dfec7885", + "id": "2bc847f2", "metadata": {}, "source": [ "Questions:\n", @@ -654,7 +589,7 @@ }, { "cell_type": "markdown", - "id": "7ddbac36", + "id": "10bbdb49", "metadata": { "slideshow": { "slide_type": "slide" @@ -669,7 +604,7 @@ { "cell_type": "code", "execution_count": null, - "id": "afb9abcc", + "id": "afa23dea", "metadata": {}, "outputs": [], "source": [ @@ -681,7 +616,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7b3d2e93", + "id": "7355d86d", "metadata": {}, "outputs": [], "source": [ @@ -693,7 +628,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b028d74c", + "id": "bace5062", "metadata": {}, "outputs": [], "source": [ @@ -703,7 +638,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0ae02a39", + "id": "f2af35b9", "metadata": {}, "outputs": [], "source": [ @@ -713,32 +648,14 @@ }, { "cell_type": "markdown", - "id": "511ab2f0", + "id": "d038f251", "metadata": {}, "source": [ "---" ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.6" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/python-high-school/notebooks/01_numbers.ipynb b/python-high-school/notebooks/01_numbers.ipynb new file mode 100644 index 0000000..d3ea06d --- /dev/null +++ b/python-high-school/notebooks/01_numbers.ipynb @@ -0,0 +1,503 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "58432615", + "metadata": {}, + "source": [ + "# More on numbers\n", + "\n", + "## More on binary numbers\n", + "\n", + "We can use f-strings to print the binary representation of a number." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8cf8514", + "metadata": {}, + "outputs": [], + "source": [ + "a = 3\n", + "print(f\"{a:#b} is the binary representation of {a}\")" + ] + }, + { + "cell_type": "markdown", + "id": "9041471e", + "metadata": {}, + "source": [ + "Exercise: print the following numbers in binary:\n", + " 3, 61, 35.\n", + "\n", + "\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "da04a89a", + "metadata": {}, + "outputs": [], + "source": [ + "# Write your code here." + ] + }, + { + "cell_type": "markdown", + "id": "725945d9", + "metadata": {}, + "source": [ + "To align the number representations, we can specify the length of the representation (e.g., 10 characters)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b3156af", + "metadata": {}, + "outputs": [], + "source": [ + "a = 3\n", + "print(f\"{a:#10b} is the binary representation of {a}\")\n", + "a = 61\n", + "print(f\"{a:#10b} is the binary representation of {a}\")" + ] + }, + { + "cell_type": "markdown", + "id": "0ae55674", + "metadata": {}, + "source": [ + "I can also specify to fill the empty spaces with `0`s." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "896c0c39", + "metadata": {}, + "outputs": [], + "source": [ + "a=3\n", + "print(f\"{a:#010b} is the binary representation of {a}\")\n", + "a=61\n", + "print(f\"{a:#010b} is the binary representation of {a}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e22faf7c", + "metadata": {}, + "source": [ + "In this way I can easily compare the binary representations of two numbers.\n", + "\n", + "| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ |\n", + "|--------|-------|-------|-------|-------|-------|-------|-------|-------|\n", + "| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |\n", + "| 61 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |" + ] + }, + { + "cell_type": "markdown", + "id": "7bb0eeb2", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "### Bitwise operators: `<<` and `>>`\n", + "\n", + "Bitwise operators are the most simple operators,\n", + "since they operate on single digits.\n", + "They are used to manipulate the binary representation of numbers.\n", + "\n", + "- Exercise on the `<<` (left-shift) operator: given the following number" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1210ca80", + "metadata": {}, + "outputs": [], + "source": [ + "a = 1" + ] + }, + { + "cell_type": "markdown", + "id": "b580f58e", + "metadata": {}, + "source": [ + "try to guess the result of the following operations. Hint: execute the cell below multiple times." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0528132", + "metadata": {}, + "outputs": [], + "source": [ + "a = a << 1\n", + "print(f\"{a:#010b}\")" + ] + }, + { + "cell_type": "markdown", + "id": "8b366ffd", + "metadata": {}, + "source": [ + "Is there a similar operator with numbers in base 10?\n", + "\n", + "- Exercise on the `>>` (right-shift) operator: given the following number" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ded93b35", + "metadata": {}, + "outputs": [], + "source": [ + "a = 79" + ] + }, + { + "cell_type": "markdown", + "id": "79b44e72", + "metadata": {}, + "source": [ + "try to guess the result of the following operations. Hint: execute the cell below multiple times." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36d329e3", + "metadata": {}, + "outputs": [], + "source": [ + "a = a >> 1\n", + "print(f\"{a:#010b}\")" + ] + }, + { + "cell_type": "markdown", + "id": "712880a3", + "metadata": {}, + "source": [ + "Is there a similar operator with numbers in base 10?\n", + "\n", + "Discuss the results with your classmates.\n", + "\n", + "### Bitwise operators: AND `&`\n", + "\n", + "The `&` operator is the bitwise AND operator.\n", + "It returns 1 if both bits are 1, 0 otherwise." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "472ef9a9", + "metadata": {}, + "outputs": [], + "source": [ + "a = 19\n", + "b = 61\n", + "c = a & b\n", + "print(f\"{a:#010b}\")\n", + "print(f\"{b:#010b}\")\n", + "print(f\"{c:#010b}\")" + ] + }, + { + "cell_type": "markdown", + "id": "4f0dbfd5", + "metadata": {}, + "source": [ + "| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ |\n", + "|--------|-------|-------|-------|-------|-------|-------|-------|-------|\n", + "| 19 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |\n", + "| 61 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |\n", + "| 19 & 61 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |\n", + "\n", + "The AND operator has a physical meaning: it is used to check if, in a circuit, two switches are both ON.\n", + "\n", + "- 🔋--1--1--💡ON\n", + "- 🔋--0--1--💡OFF\n", + "- 🔋--1--0--💡OFF\n", + "- 🔋--0--0--💡OFF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44ae4293", + "metadata": { + "attributes": { + "classes": [ + "mermaid" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "subgraph AND\n", + "direction LR\n", + " b-1[fa:fa-battery-three-quarters]\n", + " led-1[far:fa-lightbulb OFF]\n", + " s1-1((fa:fa-toggle-off))\n", + " s2-1((fa:fa-toggle-on))\n", + " b-1 --->|e-| s1-1\n", + " s1-1 --- s2-1 --- led-1\n", + " --- b-1\n", + "end" + ] + }, + { + "cell_type": "markdown", + "id": "a776149a", + "metadata": {}, + "source": [ + "- Exercise: compute the bitwise AND of 192 and 71 by hand and check the result in the cell below.\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a59aab4", + "metadata": {}, + "outputs": [], + "source": [ + "# Write your code here.\n" + ] + }, + { + "cell_type": "markdown", + "id": "4577b3aa", + "metadata": {}, + "source": [ + "### Bitwise operators: OR `|`\n", + "\n", + "The `|` operator is the bitwise OR operator.\n", + "It returns 1 if at least one bit is 1, 0 otherwise." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca1fc219", + "metadata": {}, + "outputs": [], + "source": [ + "a = 6\n", + "b = 5\n", + "c = a | b\n", + "print(f\"{a:#010b}\")\n", + "print(f\"{b:#010b}\")\n", + "print(f\"{c:#010b}\")" + ] + }, + { + "cell_type": "markdown", + "id": "ed3c56b5", + "metadata": {}, + "source": [ + "| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ |\n", + "|--------|-------|-------|-------|-------|-------|-------|-------|-------|\n", + "| 6 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |\n", + "| 5 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |\n", + "| 6 \\| 5 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |\n", + "\n", + "- Exercise: compute the bitwise OR of 192 and 71 by hand and check the result in the cell below.\n", + "\n", + "\n", + "\n", + "The OR operator has a physical meaning: it is used to check if, in a circuit, at least one switch is ON." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57066d1e", + "metadata": { + "attributes": { + "classes": [ + "mermaid" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "flowchart LR\n", + "\n", + "subgraph OR\n", + "direction LR\n", + " b[fa:fa-battery-three-quarters]\n", + " b --->|e-| s1 & s2 ---led -.-> b\n", + " led[fas:fa-lightbulb ON]\n", + " s1((fa:fa-toggle-on))\n", + " s2((fa:fa-toggle-off))\n", + "end" + ] + }, + { + "cell_type": "markdown", + "id": "be869d05", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "\n", + "## Max and min" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abae96fc", + "metadata": {}, + "outputs": [], + "source": [ + "# Let's define two positive integers.\n", + "b = 234\n", + "c = 64\n", + "# Reorder the numbers so that b is smaller than c.\n", + "b, c = min(b, c), max(b, c)\n", + "print(\"b =\", b, \"c =\", c)" + ] + }, + { + "cell_type": "markdown", + "id": "d0baa634", + "metadata": {}, + "source": [ + "Now execute the cell below many times, and see what happens." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d5d8afa", + "metadata": {}, + "outputs": [], + "source": [ + "# Iterate until b is zero.\n", + "d = c - b\n", + "b, c = min(d, b), max(d, b)\n", + "print(\"b =\", b, \"c =\", c)" + ] + }, + { + "cell_type": "markdown", + "id": "3e30ade4", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "\n", + "## Importing functionalities" + ] + }, + { + "cell_type": "markdown", + "id": "a8009804", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd4e9272", + "metadata": {}, + "outputs": [], + "source": [ + "# Importing new features\n", + "# ..is easy. Features are collected\n", + "# in packages or modules. Just\n", + "import math # to use the\n", + "math.sqrt # function\n", + "\n", + "math.sqrt(2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ed373ff", + "metadata": {}, + "outputs": [], + "source": [ + "# We can even import single functions\n", + "# or constants from a module\n", + "from math import pi as π\n", + "π / 2" + ] + }, + { + "cell_type": "markdown", + "id": "99156e16", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Modules contain documentation in the form of docstrings,\n", + "that jupyter presents in scrollable boxes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "607b0ad8", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Read the module documentation...\n", + "help(math)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f10cd9bb", + "metadata": {}, + "outputs": [], + "source": [ + "# ...or the function documentation\n", + "help(math.sqrt)\n" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python-high-school/notebooks/01_strings.ipynb b/python-high-school/notebooks/01_strings.ipynb index 3f496e1..d74094e 100644 --- a/python-high-school/notebooks/01_strings.ipynb +++ b/python-high-school/notebooks/01_strings.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "7d0ea8ef", + "id": "2c8858f0", "metadata": {}, "source": [ "# Strings\n", @@ -19,7 +19,7 @@ }, { "cell_type": "markdown", - "id": "93f34edf", + "id": "9172f5b4", "metadata": { "slideshow": { "slide_type": "slide" @@ -36,7 +36,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f7fafa85", + "id": "b07c4860", "metadata": {}, "outputs": [], "source": [ @@ -47,7 +47,7 @@ }, { "cell_type": "markdown", - "id": "722b6093", + "id": "51d4208f", "metadata": {}, "source": [ "A string is a finite, ordered sequence of typographic characters\n", @@ -61,7 +61,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b98812b3", + "id": "20f1dc1b", "metadata": {}, "outputs": [], "source": [ @@ -73,7 +73,7 @@ }, { "cell_type": "markdown", - "id": "91ae8e39", + "id": "78faeb97", "metadata": {}, "source": [ "- How many strings of length $m : m \\le n=8$, included the empty string, can you build?" @@ -82,7 +82,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4bf14742", + "id": "4bb33016", "metadata": {}, "outputs": [], "source": [ @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "3cf1f3fe", + "id": "a2f8cce0", "metadata": {}, "source": [ "- 🦾 Can you generalize the solution for any $n$ and $k$? Can you write a mathematical formula for the solution?\n", @@ -103,7 +103,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e3dd62b0", + "id": "07b84980", "metadata": {}, "outputs": [], "source": [ @@ -115,7 +115,7 @@ }, { "cell_type": "markdown", - "id": "b0896514", + "id": "a262c52e", "metadata": {}, "source": [ "\n", @@ -126,7 +126,7 @@ }, { "cell_type": "markdown", - "id": "a1b33fbe", + "id": "4f1b4043", "metadata": { "slideshow": { "slide_type": "subslide" @@ -143,7 +143,7 @@ { "cell_type": "code", "execution_count": null, - "id": "262d3cd0", + "id": "ce496f7a", "metadata": {}, "outputs": [], "source": [ @@ -153,7 +153,7 @@ }, { "cell_type": "markdown", - "id": "4e22e329", + "id": "e3549587", "metadata": {}, "source": [ "You can template strings using the so-called \"f-string\" notation:" @@ -162,7 +162,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3a09f95f", + "id": "ae5409fe", "metadata": {}, "outputs": [], "source": [ @@ -172,7 +172,7 @@ }, { "cell_type": "markdown", - "id": "9cf705fa", + "id": "503dc116", "metadata": {}, "source": [ "Exercise:" @@ -181,7 +181,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3a8757c3", + "id": "567315b7", "metadata": {}, "outputs": [], "source": [ @@ -190,7 +190,7 @@ }, { "cell_type": "markdown", - "id": "a8cdbbb7", + "id": "82ff4965", "metadata": { "slideshow": { "slide_type": "slide" @@ -208,7 +208,7 @@ }, { "cell_type": "markdown", - "id": "8a8f2142", + "id": "e7a210af", "metadata": { "slideshow": { "slide_type": "subslide" @@ -228,7 +228,7 @@ }, { "cell_type": "markdown", - "id": "cb1f509d", + "id": "bbfacc44", "metadata": { "slideshow": { "slide_type": "subslide" @@ -256,7 +256,7 @@ { "cell_type": "code", "execution_count": null, - "id": "62df929d", + "id": "9243a8c7", "metadata": {}, "outputs": [], "source": [ @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "72a34435", + "id": "74e41aaa", "metadata": {}, "outputs": [], "source": [ @@ -277,7 +277,7 @@ }, { "cell_type": "markdown", - "id": "542d8b7d", + "id": "4ba83c4f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -295,7 +295,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b288eb46", + "id": "1d5c6650", "metadata": {}, "outputs": [], "source": [ @@ -306,7 +306,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6e014ff6", + "id": "e15a9640", "metadata": {}, "outputs": [], "source": [ @@ -317,7 +317,7 @@ }, { "cell_type": "markdown", - "id": "01bd656b", + "id": "a5e24d67", "metadata": { "slideshow": { "slide_type": "subslide" @@ -335,7 +335,7 @@ { "cell_type": "code", "execution_count": null, - "id": "513ae6b5", + "id": "ab3f6322", "metadata": {}, "outputs": [], "source": [ @@ -347,7 +347,7 @@ { "cell_type": "code", "execution_count": null, - "id": "183e4e8d", + "id": "0614ac97", "metadata": {}, "outputs": [], "source": [ @@ -361,7 +361,7 @@ }, { "cell_type": "markdown", - "id": "0134fdfe", + "id": "7824de1c", "metadata": { "slideshow": { "slide_type": "slide" @@ -383,7 +383,7 @@ { "cell_type": "code", "execution_count": null, - "id": "369f6c2f", + "id": "1e3c8058", "metadata": {}, "outputs": [], "source": [ @@ -395,7 +395,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6b2d8c68", + "id": "914c689a", "metadata": {}, "outputs": [], "source": [ @@ -405,7 +405,7 @@ }, { "cell_type": "markdown", - "id": "e51f6bea", + "id": "1cb52bdf", "metadata": {}, "source": [ "----" @@ -414,7 +414,7 @@ { "cell_type": "code", "execution_count": null, - "id": "af2c2bb1", + "id": "0cf31f3c", "metadata": {}, "outputs": [], "source": [ @@ -425,7 +425,7 @@ }, { "cell_type": "markdown", - "id": "ae36d226", + "id": "ddcfdb6e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -440,7 +440,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f973f18a", + "id": "5c238785", "metadata": {}, "outputs": [], "source": [ @@ -450,7 +450,7 @@ }, { "cell_type": "markdown", - "id": "effeb17c", + "id": "08b159c0", "metadata": {}, "source": [ "----" @@ -459,7 +459,7 @@ { "cell_type": "code", "execution_count": null, - "id": "be34f328", + "id": "cbfe4621", "metadata": {}, "outputs": [], "source": [ @@ -469,7 +469,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6996c522", + "id": "a80b4759", "metadata": {}, "outputs": [], "source": [ @@ -480,7 +480,7 @@ }, { "cell_type": "markdown", - "id": "866bd52e", + "id": "2509582f", "metadata": { "slideshow": { "slide_type": "slide" @@ -494,7 +494,7 @@ }, { "cell_type": "markdown", - "id": "8e595545", + "id": "89f99c18", "metadata": {}, "source": [ "----" @@ -503,7 +503,7 @@ { "cell_type": "code", "execution_count": null, - "id": "83fa2f41", + "id": "9f0d26fd", "metadata": {}, "outputs": [], "source": [ @@ -516,7 +516,7 @@ }, { "cell_type": "markdown", - "id": "faba5113", + "id": "7149973e", "metadata": {}, "source": [ "----" @@ -525,7 +525,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9675a0c7", + "id": "2a9f6677", "metadata": {}, "outputs": [], "source": [ @@ -535,7 +535,7 @@ }, { "cell_type": "markdown", - "id": "6faf4bd9", + "id": "db8d47ff", "metadata": {}, "source": [ "----" @@ -544,7 +544,7 @@ { "cell_type": "code", "execution_count": null, - "id": "042bcf7b", + "id": "5afb0047", "metadata": {}, "outputs": [], "source": [ @@ -553,7 +553,7 @@ }, { "cell_type": "markdown", - "id": "79279dde", + "id": "57d758d3", "metadata": {}, "source": [ "----" @@ -562,7 +562,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3a170529", + "id": "14b76188", "metadata": {}, "outputs": [], "source": [ @@ -575,7 +575,7 @@ }, { "cell_type": "markdown", - "id": "a4aae98d", + "id": "7ed0dc47", "metadata": {}, "source": [ "----" @@ -584,7 +584,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2d846582", + "id": "f4085f81", "metadata": {}, "outputs": [], "source": [ @@ -597,7 +597,7 @@ }, { "cell_type": "markdown", - "id": "af3c0dc4", + "id": "a5c92154", "metadata": {}, "source": [ "----" @@ -606,7 +606,7 @@ { "cell_type": "code", "execution_count": null, - "id": "84c243d7", + "id": "b5a90f9c", "metadata": {}, "outputs": [], "source": [ @@ -615,7 +615,7 @@ }, { "cell_type": "markdown", - "id": "a7ffe622", + "id": "29190241", "metadata": { "slideshow": { "slide_type": "slide" @@ -629,7 +629,7 @@ }, { "cell_type": "markdown", - "id": "d3ede311", + "id": "6a4e0b0f", "metadata": {}, "source": [ "----" @@ -638,7 +638,7 @@ { "cell_type": "code", "execution_count": null, - "id": "befbd1f9", + "id": "d63471d9", "metadata": {}, "outputs": [], "source": [ @@ -651,7 +651,7 @@ }, { "cell_type": "markdown", - "id": "8e7e9a94", + "id": "250e2ea7", "metadata": { "slideshow": { "slide_type": "subslide" @@ -665,7 +665,7 @@ }, { "cell_type": "markdown", - "id": "51c1f2fa", + "id": "180fed37", "metadata": {}, "source": [ "----" @@ -674,7 +674,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c0e0f119", + "id": "e7488f26", "metadata": {}, "outputs": [], "source": [ @@ -690,7 +690,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9dfb4530", + "id": "c765e47f", "metadata": {}, "outputs": [], "source": [ @@ -702,7 +702,7 @@ }, { "cell_type": "markdown", - "id": "200460a8", + "id": "edd7e208", "metadata": { "slideshow": { "slide_type": "subslide" @@ -718,7 +718,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2c0d7bde", + "id": "c06a219b", "metadata": {}, "outputs": [], "source": [ @@ -730,7 +730,7 @@ { "cell_type": "code", "execution_count": null, - "id": "104a5860", + "id": "d5caf999", "metadata": {}, "outputs": [], "source": [ @@ -740,7 +740,7 @@ }, { "cell_type": "markdown", - "id": "6f1335c9", + "id": "ca5ac2f1", "metadata": { "slideshow": { "slide_type": "slide" @@ -767,7 +767,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e204bc64", + "id": "bba060f7", "metadata": {}, "outputs": [], "source": [ @@ -777,7 +777,7 @@ }, { "cell_type": "markdown", - "id": "ff5495d5", + "id": "5e1f36da", "metadata": {}, "source": [ "----" @@ -786,7 +786,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ae991fc4", + "id": "d793ae22", "metadata": {}, "outputs": [], "source": [ @@ -796,7 +796,7 @@ }, { "cell_type": "markdown", - "id": "7175e6a5", + "id": "0181db07", "metadata": { "slideshow": { "slide_type": "subslide" @@ -816,7 +816,7 @@ }, { "cell_type": "markdown", - "id": "0728f620", + "id": "7d46b6e7", "metadata": {}, "source": [ "----" @@ -825,7 +825,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6a142398", + "id": "7a5238f3", "metadata": {}, "outputs": [], "source": [ @@ -837,7 +837,7 @@ { "cell_type": "code", "execution_count": null, - "id": "434bbb33", + "id": "e32914af", "metadata": {}, "outputs": [], "source": [ @@ -854,25 +854,7 @@ ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.6" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/python-high-school/notebooks/10_collections copy 2.ipynb b/python-high-school/notebooks/10_collections copy 2.ipynb deleted file mode 100644 index cb3c022..0000000 --- a/python-high-school/notebooks/10_collections copy 2.ipynb +++ /dev/null @@ -1,651 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "8374a718", - "metadata": {}, - "source": [ - "# Python for High School\n", - "\n", - "Lesson 2\n", - "\n", - "- Roberto Polli - \n", - "\n", - "## Agenda\n", - "\n", - "- Sets\n", - "- Introducing Lists\n", - "- Getting list items\n", - "- Slicing a list\n", - "- Strings and Lists\n", - "- Iterations: `for`\n", - "- Iterations: `while`\n", - "\n", - "## Sets\n", - "\n", - "In maths, a set is a collection of distinct objects." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f68d253a", - "metadata": {}, - "outputs": [], - "source": [ - "# In python you can create sets.\n", - "EMPTY = {} # ø is the empty set\n", - "A = {1, 2, 3}\n", - "B = {3, 4, 5, \"a\"} # sets can contain different types\n", - "C = { A } # a set can contain other sets" - ] - }, - { - "cell_type": "markdown", - "id": "a162575e", - "metadata": {}, - "source": [ - "Here is an image from Wikipedia:\n", - "[![Set Theory Operations](https://upload.wikimedia.org/wikipedia/commons/0/04/Set_Theory_Operations.svg)](https://en.wikipedia.org/wiki/Set_(mathematics)#/media/File:Set_Theory_Operations.svg)\n", - "\n", - "You can perform set operations on them, including:\n", - "\n", - "$\n", - "U = A \\cup B \\\\\n", - "I = A \\cap B \\\\\n", - "D = A \\setminus B \\\\\n", - "S = A \\Delta B := (A \\cup B) \\setminus (A \\cap B) \\\\\n", - "$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a20d897d", - "metadata": {}, - "outputs": [], - "source": [ - "# Union\n", - "U = A | B\n", - "# Intersection\n", - "I = A & B\n", - "# Difference\n", - "D = A - B\n", - "# Symmetric difference\n", - "S = A ^ B" - ] - }, - { - "cell_type": "markdown", - "id": "26e3c0ab", - "metadata": {}, - "source": [ - "You can perform basic checks:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d990d619", - "metadata": {}, - "outputs": [], - "source": [ - "A in U\n", - "B not in U\n", - "B in D\n", - "5 in A\n", - "{1} in A\n", - "EMPTY in A\n", - "I in S\n", - "2 in C" - ] - }, - { - "cell_type": "markdown", - "id": "d1784989", - "metadata": {}, - "source": [ - "Exercise: which of the above instructions are true?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c8a88cd6", - "metadata": {}, - "outputs": [], - "source": [ - "# Use this cell for the exercise\n" - ] - }, - { - "cell_type": "markdown", - "id": "6278525d", - "metadata": {}, - "source": [ - "Exercise: print the content of the sets." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d2bf8011", - "metadata": {}, - "outputs": [], - "source": [ - "# Use this cell for the exercise\n" - ] - }, - { - "cell_type": "markdown", - "id": "2de19ea4", - "metadata": {}, - "source": [ - "## Introducing Lists\n", - "\n", - "A list is an ordered sequence of items.\n", - "Differently from a set, a list is ordered\n", - "and can contain duplicates." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6b72956a", - "metadata": {}, - "outputs": [], - "source": [ - "# it's easy to create a list\n", - "list_a = ['this', 'is', 'a', 'list']\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3d9425c4", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# you can append items to a list\n", - "# with the append method\n", - "list_a.append(\"mutable\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ba1fca5a", - "metadata": {}, - "outputs": [], - "source": [ - "# Print its content\n", - "print(list_a)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "45025141", - "metadata": {}, - "outputs": [], - "source": [ - "# See its length\n", - "len(list_a)" - ] - }, - { - "cell_type": "markdown", - "id": "2f6d0eeb", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "#### Lists and Generators\n", - "\n", - "In python you can generate a sequence of numbers.\n", - "To avoid consuming too much memory, this is not doen using lists\n", - "or sets, but using special objects that generate those sequences." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "376896b7", - "metadata": {}, - "outputs": [], - "source": [ - "a = 11\n", - "from_0_to_10 = range(a)" - ] - }, - { - "cell_type": "markdown", - "id": "cced1abd", - "metadata": {}, - "source": [ - "Exercise:\n", - "\n", - "- print the length of `from_0_to_10`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6bbf9143", - "metadata": {}, - "outputs": [], - "source": [ - "# Use this cell for the exercise\n" - ] - }, - { - "cell_type": "markdown", - "id": "ec8accfc", - "metadata": {}, - "source": [ - "- print the `type` of `from_0_to_10`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3141c2d2", - "metadata": {}, - "outputs": [], - "source": [ - "# Use this cell for the exercise\n" - ] - }, - { - "cell_type": "markdown", - "id": "0200b849", - "metadata": {}, - "source": [ - "We can extract all the elements from a generator using the `list` function." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b2168aa3", - "metadata": {}, - "outputs": [], - "source": [ - "from_0_to_10 = list(from_0_to_10)\n", - "l = len(from_0_to_10)\n", - "l == a\n", - "print(l)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9ed0b706", - "metadata": {}, - "outputs": [], - "source": [ - "# Exercise: can you print the content of from_0_to_10\n", - "print(from_0_to_10)" - ] - }, - { - "cell_type": "markdown", - "id": "fb440dc9", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Getting list items" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "53f02f35", - "metadata": {}, - "outputs": [], - "source": [ - "# you can get list items by index\n", - "from_0_to_10[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "19c6d1a9", - "metadata": {}, - "outputs": [], - "source": [ - "# Exercise: what happens if I get the 11th element?\n", - "from_0_to_10[11]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c93a3b7f", - "metadata": {}, - "outputs": [], - "source": [ - "# python is calling under the hood\n", - "from_0_to_10.__getitem__(0)" - ] - }, - { - "cell_type": "markdown", - "id": "b0a33de2", - "metadata": {}, - "source": [ - "Python lists are doubly linked, so you can get the last element using a negative index." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4dd4c497", - "metadata": {}, - "outputs": [], - "source": [ - "# python lists are doubly linked ;)\n", - "from_0_to_10[-1]\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9dc6b207", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# Exercise: please check the manual!\n", - "help(list)" - ] - }, - { - "cell_type": "markdown", - "id": "def4856d", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Slicing a list" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3635a587", - "metadata": {}, - "outputs": [], - "source": [ - "straight = [1, 2, 3, 'star']\n", - "print(straight)" - ] - }, - { - "cell_type": "markdown", - "id": "69582586", - "metadata": {}, - "source": [ - "Python supports slicing, that is, getting a subsequence of a list\n", - "similarly to what you can do with mathematical intervals.\n", - "Python uses a half-open interval, that is, the first index is included\n", - "and the last one is excluded.\n", - "\n", - "$\n", - "straight = straight_{0}, straight_{1}, straight_{2}, straight_{3} \\\\\n", - "$\n", - "$\n", - "straight[0:2] := \\[ straight_{0}, straight_{1} \\] \\\\\n", - "straight[i:j] := \\[ straight_{i}, \\dots, straight_{j-1} \\]\n", - "$\n", - "\n", - "This means that the length of a sliced list is:\n", - "\n", - "$\n", - "|straight[i:j]| = j - i \\\\\n", - "$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "66eafa63", - "metadata": {}, - "outputs": [], - "source": [ - "# I can take the middle of the list...\n", - "straight[1:3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "524c5b41", - "metadata": {}, - "outputs": [], - "source": [ - "k = 2 # ... or using a separator\n", - "straight[0:k], straight[k:4]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3ff2455c", - "metadata": {}, - "outputs": [], - "source": [ - "straight[:k] # I can omit the first..." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "63d0ccac", - "metadata": {}, - "outputs": [], - "source": [ - "straight[k:] # ...and last index" - ] - }, - { - "cell_type": "markdown", - "id": "036d45f7", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Strings and Lists" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e138708b", - "metadata": {}, - "outputs": [], - "source": [ - "# Strings behaves like lists\n", - "s_a = \"Counting: 123\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7ac25c74", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# Have length..\n", - "l_a = len(s_a)\n", - "print(l_a)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8a7f78cc", - "metadata": {}, - "outputs": [], - "source": [ - "# ..indexes\n", - "print(s_a[0], \" \", s_a[-1])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b99855a4", - "metadata": {}, - "outputs": [], - "source": [ - "# and a last element\n", - "s_a[l_a] # ...what's happening there?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "15c10826", - "metadata": {}, - "outputs": [], - "source": [ - "# ...we can even slice them\n", - "f = \"gatto.miao\"\n", - "f[:-5], f[-5], f[-4:]" - ] - }, - { - "cell_type": "markdown", - "id": "2233eccd", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Iterations: `for`\n", - "\n", - "Python allows you to iterate over a sequence of items using the `for` instruction." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b8f308bc", - "metadata": {}, - "outputs": [], - "source": [ - "a_list = ['is', 'iterable', 'with']\n", - "for x in a_list:\n", - " print(x)" - ] - }, - { - "cell_type": "markdown", - "id": "30e38b2c", - "metadata": {}, - "source": [ - "We can stop the iteration using the `break` instruction." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "93b88e87", - "metadata": {}, - "outputs": [], - "source": [ - "for x in a_list:\n", - " print(x, end=' ')\n", - " y = x + str(2)\n", - " break # stop now" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4165722f", - "metadata": {}, - "outputs": [], - "source": [ - "# what's the expected output of the\n", - "# following instruction?\n", - "print((\"x, y: \", (x, y)))\n", - "# Differently from other languages like C, `for` does not create\n", - "# a scope" - ] - }, - { - "cell_type": "markdown", - "id": "34bf8abc", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Iterations: while" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f36fec02", - "metadata": {}, - "outputs": [], - "source": [ - "a_list = ['is', 'iterable', 'with']\n", - "while a_list:\n", - " # pop() modifies a list removing\n", - " # and returning its last element\n", - " x = a_list.pop()\n", - " print(f\"pop out {x}\")\n", - " break # what happens if I remove this break?\n", - "\n", - "print(a_list)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d27cf768", - "metadata": {}, - "outputs": [], - "source": [ - "# What's the expected behavior of the\n", - "# following instructions?\n", - "for x in a_list:\n", - " print((x + a_list.pop()))\n", - "# for + pop() is not always a good idea ;)" - ] - } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/python-high-school/notebooks/10_collections copy.ipynb b/python-high-school/notebooks/10_collections copy.ipynb deleted file mode 100644 index cb3c022..0000000 --- a/python-high-school/notebooks/10_collections copy.ipynb +++ /dev/null @@ -1,651 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "8374a718", - "metadata": {}, - "source": [ - "# Python for High School\n", - "\n", - "Lesson 2\n", - "\n", - "- Roberto Polli - \n", - "\n", - "## Agenda\n", - "\n", - "- Sets\n", - "- Introducing Lists\n", - "- Getting list items\n", - "- Slicing a list\n", - "- Strings and Lists\n", - "- Iterations: `for`\n", - "- Iterations: `while`\n", - "\n", - "## Sets\n", - "\n", - "In maths, a set is a collection of distinct objects." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f68d253a", - "metadata": {}, - "outputs": [], - "source": [ - "# In python you can create sets.\n", - "EMPTY = {} # ø is the empty set\n", - "A = {1, 2, 3}\n", - "B = {3, 4, 5, \"a\"} # sets can contain different types\n", - "C = { A } # a set can contain other sets" - ] - }, - { - "cell_type": "markdown", - "id": "a162575e", - "metadata": {}, - "source": [ - "Here is an image from Wikipedia:\n", - "[![Set Theory Operations](https://upload.wikimedia.org/wikipedia/commons/0/04/Set_Theory_Operations.svg)](https://en.wikipedia.org/wiki/Set_(mathematics)#/media/File:Set_Theory_Operations.svg)\n", - "\n", - "You can perform set operations on them, including:\n", - "\n", - "$\n", - "U = A \\cup B \\\\\n", - "I = A \\cap B \\\\\n", - "D = A \\setminus B \\\\\n", - "S = A \\Delta B := (A \\cup B) \\setminus (A \\cap B) \\\\\n", - "$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a20d897d", - "metadata": {}, - "outputs": [], - "source": [ - "# Union\n", - "U = A | B\n", - "# Intersection\n", - "I = A & B\n", - "# Difference\n", - "D = A - B\n", - "# Symmetric difference\n", - "S = A ^ B" - ] - }, - { - "cell_type": "markdown", - "id": "26e3c0ab", - "metadata": {}, - "source": [ - "You can perform basic checks:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d990d619", - "metadata": {}, - "outputs": [], - "source": [ - "A in U\n", - "B not in U\n", - "B in D\n", - "5 in A\n", - "{1} in A\n", - "EMPTY in A\n", - "I in S\n", - "2 in C" - ] - }, - { - "cell_type": "markdown", - "id": "d1784989", - "metadata": {}, - "source": [ - "Exercise: which of the above instructions are true?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c8a88cd6", - "metadata": {}, - "outputs": [], - "source": [ - "# Use this cell for the exercise\n" - ] - }, - { - "cell_type": "markdown", - "id": "6278525d", - "metadata": {}, - "source": [ - "Exercise: print the content of the sets." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d2bf8011", - "metadata": {}, - "outputs": [], - "source": [ - "# Use this cell for the exercise\n" - ] - }, - { - "cell_type": "markdown", - "id": "2de19ea4", - "metadata": {}, - "source": [ - "## Introducing Lists\n", - "\n", - "A list is an ordered sequence of items.\n", - "Differently from a set, a list is ordered\n", - "and can contain duplicates." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6b72956a", - "metadata": {}, - "outputs": [], - "source": [ - "# it's easy to create a list\n", - "list_a = ['this', 'is', 'a', 'list']\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3d9425c4", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# you can append items to a list\n", - "# with the append method\n", - "list_a.append(\"mutable\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ba1fca5a", - "metadata": {}, - "outputs": [], - "source": [ - "# Print its content\n", - "print(list_a)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "45025141", - "metadata": {}, - "outputs": [], - "source": [ - "# See its length\n", - "len(list_a)" - ] - }, - { - "cell_type": "markdown", - "id": "2f6d0eeb", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "#### Lists and Generators\n", - "\n", - "In python you can generate a sequence of numbers.\n", - "To avoid consuming too much memory, this is not doen using lists\n", - "or sets, but using special objects that generate those sequences." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "376896b7", - "metadata": {}, - "outputs": [], - "source": [ - "a = 11\n", - "from_0_to_10 = range(a)" - ] - }, - { - "cell_type": "markdown", - "id": "cced1abd", - "metadata": {}, - "source": [ - "Exercise:\n", - "\n", - "- print the length of `from_0_to_10`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6bbf9143", - "metadata": {}, - "outputs": [], - "source": [ - "# Use this cell for the exercise\n" - ] - }, - { - "cell_type": "markdown", - "id": "ec8accfc", - "metadata": {}, - "source": [ - "- print the `type` of `from_0_to_10`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3141c2d2", - "metadata": {}, - "outputs": [], - "source": [ - "# Use this cell for the exercise\n" - ] - }, - { - "cell_type": "markdown", - "id": "0200b849", - "metadata": {}, - "source": [ - "We can extract all the elements from a generator using the `list` function." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b2168aa3", - "metadata": {}, - "outputs": [], - "source": [ - "from_0_to_10 = list(from_0_to_10)\n", - "l = len(from_0_to_10)\n", - "l == a\n", - "print(l)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9ed0b706", - "metadata": {}, - "outputs": [], - "source": [ - "# Exercise: can you print the content of from_0_to_10\n", - "print(from_0_to_10)" - ] - }, - { - "cell_type": "markdown", - "id": "fb440dc9", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Getting list items" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "53f02f35", - "metadata": {}, - "outputs": [], - "source": [ - "# you can get list items by index\n", - "from_0_to_10[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "19c6d1a9", - "metadata": {}, - "outputs": [], - "source": [ - "# Exercise: what happens if I get the 11th element?\n", - "from_0_to_10[11]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c93a3b7f", - "metadata": {}, - "outputs": [], - "source": [ - "# python is calling under the hood\n", - "from_0_to_10.__getitem__(0)" - ] - }, - { - "cell_type": "markdown", - "id": "b0a33de2", - "metadata": {}, - "source": [ - "Python lists are doubly linked, so you can get the last element using a negative index." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4dd4c497", - "metadata": {}, - "outputs": [], - "source": [ - "# python lists are doubly linked ;)\n", - "from_0_to_10[-1]\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9dc6b207", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# Exercise: please check the manual!\n", - "help(list)" - ] - }, - { - "cell_type": "markdown", - "id": "def4856d", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Slicing a list" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3635a587", - "metadata": {}, - "outputs": [], - "source": [ - "straight = [1, 2, 3, 'star']\n", - "print(straight)" - ] - }, - { - "cell_type": "markdown", - "id": "69582586", - "metadata": {}, - "source": [ - "Python supports slicing, that is, getting a subsequence of a list\n", - "similarly to what you can do with mathematical intervals.\n", - "Python uses a half-open interval, that is, the first index is included\n", - "and the last one is excluded.\n", - "\n", - "$\n", - "straight = straight_{0}, straight_{1}, straight_{2}, straight_{3} \\\\\n", - "$\n", - "$\n", - "straight[0:2] := \\[ straight_{0}, straight_{1} \\] \\\\\n", - "straight[i:j] := \\[ straight_{i}, \\dots, straight_{j-1} \\]\n", - "$\n", - "\n", - "This means that the length of a sliced list is:\n", - "\n", - "$\n", - "|straight[i:j]| = j - i \\\\\n", - "$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "66eafa63", - "metadata": {}, - "outputs": [], - "source": [ - "# I can take the middle of the list...\n", - "straight[1:3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "524c5b41", - "metadata": {}, - "outputs": [], - "source": [ - "k = 2 # ... or using a separator\n", - "straight[0:k], straight[k:4]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3ff2455c", - "metadata": {}, - "outputs": [], - "source": [ - "straight[:k] # I can omit the first..." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "63d0ccac", - "metadata": {}, - "outputs": [], - "source": [ - "straight[k:] # ...and last index" - ] - }, - { - "cell_type": "markdown", - "id": "036d45f7", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Strings and Lists" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e138708b", - "metadata": {}, - "outputs": [], - "source": [ - "# Strings behaves like lists\n", - "s_a = \"Counting: 123\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7ac25c74", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# Have length..\n", - "l_a = len(s_a)\n", - "print(l_a)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8a7f78cc", - "metadata": {}, - "outputs": [], - "source": [ - "# ..indexes\n", - "print(s_a[0], \" \", s_a[-1])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b99855a4", - "metadata": {}, - "outputs": [], - "source": [ - "# and a last element\n", - "s_a[l_a] # ...what's happening there?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "15c10826", - "metadata": {}, - "outputs": [], - "source": [ - "# ...we can even slice them\n", - "f = \"gatto.miao\"\n", - "f[:-5], f[-5], f[-4:]" - ] - }, - { - "cell_type": "markdown", - "id": "2233eccd", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Iterations: `for`\n", - "\n", - "Python allows you to iterate over a sequence of items using the `for` instruction." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b8f308bc", - "metadata": {}, - "outputs": [], - "source": [ - "a_list = ['is', 'iterable', 'with']\n", - "for x in a_list:\n", - " print(x)" - ] - }, - { - "cell_type": "markdown", - "id": "30e38b2c", - "metadata": {}, - "source": [ - "We can stop the iteration using the `break` instruction." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "93b88e87", - "metadata": {}, - "outputs": [], - "source": [ - "for x in a_list:\n", - " print(x, end=' ')\n", - " y = x + str(2)\n", - " break # stop now" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4165722f", - "metadata": {}, - "outputs": [], - "source": [ - "# what's the expected output of the\n", - "# following instruction?\n", - "print((\"x, y: \", (x, y)))\n", - "# Differently from other languages like C, `for` does not create\n", - "# a scope" - ] - }, - { - "cell_type": "markdown", - "id": "34bf8abc", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Iterations: while" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f36fec02", - "metadata": {}, - "outputs": [], - "source": [ - "a_list = ['is', 'iterable', 'with']\n", - "while a_list:\n", - " # pop() modifies a list removing\n", - " # and returning its last element\n", - " x = a_list.pop()\n", - " print(f\"pop out {x}\")\n", - " break # what happens if I remove this break?\n", - "\n", - "print(a_list)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d27cf768", - "metadata": {}, - "outputs": [], - "source": [ - "# What's the expected behavior of the\n", - "# following instructions?\n", - "for x in a_list:\n", - " print((x + a_list.pop()))\n", - "# for + pop() is not always a good idea ;)" - ] - } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/python-high-school/notebooks/10_collections.ipynb b/python-high-school/notebooks/10_collections.ipynb index 6ec6029..bf3743d 100644 --- a/python-high-school/notebooks/10_collections.ipynb +++ b/python-high-school/notebooks/10_collections.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "03b17d3f", + "id": "061bd604", "metadata": {}, "source": [ "# Python for High School\n", @@ -29,7 +29,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8f59f168", + "id": "07fcd7d5", "metadata": {}, "outputs": [], "source": [ @@ -42,7 +42,7 @@ }, { "cell_type": "markdown", - "id": "3fc7425a", + "id": "6612e07c", "metadata": {}, "source": [ "Here is an image from Wikipedia:\n", @@ -61,7 +61,7 @@ { "cell_type": "code", "execution_count": null, - "id": "28bbd418", + "id": "52403912", "metadata": {}, "outputs": [], "source": [ @@ -77,7 +77,7 @@ }, { "cell_type": "markdown", - "id": "b7d82d35", + "id": "ed54ea01", "metadata": {}, "source": [ "You can perform basic checks:" @@ -86,14 +86,41 @@ { "cell_type": "code", "execution_count": null, - "id": "5ebd2379", + "id": "9de78d28", "metadata": {}, "outputs": [], "source": [ "A in U\n", "B not in U\n", "B in D\n", - "5 in A\n", + "5 in A" + ] + }, + { + "cell_type": "markdown", + "id": "b82ce986", + "metadata": {}, + "source": [ + "Exercise: which of the above expressions are true?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b2909f7", + "metadata": {}, + "outputs": [], + "source": [ + "# Make an hypothesis first, then check it using this cell.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e4ed34d", + "metadata": {}, + "outputs": [], + "source": [ "{1} in A\n", "EMPTY in A\n", "I in S\n", @@ -102,25 +129,25 @@ }, { "cell_type": "markdown", - "id": "7ce02525", + "id": "dd15ce53", "metadata": {}, "source": [ - "Exercise: which of the above instructions are true?" + "Exercise: which of the above expressions are true?" ] }, { "cell_type": "code", "execution_count": null, - "id": "61e0f8a6", + "id": "66523aed", "metadata": {}, "outputs": [], "source": [ - "# Use this cell for the exercise\n" + "# Make an hypothesis first, then check it using this cell.\n" ] }, { "cell_type": "markdown", - "id": "34ad6ffc", + "id": "e132f308", "metadata": {}, "source": [ "Exercise: print the content of the sets." @@ -129,7 +156,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7a2bc421", + "id": "ef6da2aa", "metadata": {}, "outputs": [], "source": [ @@ -138,12 +165,100 @@ }, { "cell_type": "markdown", - "id": "e750c10d", + "id": "ea7a076f", "metadata": {}, "source": [ + "## Tuples (Vectors)\n", + "\n", + "A python `tuple` (:it: n-pla) represents an ordered list of objects,\n", + "and can contain duplicates.\n", + "\n", + "They seem like vectors,\n", + "\n", + "$\n", + "\\underline{v} = (v_0, v_1, \\dots, v_n) \\in \\mathbb{R}^n\n", + "$\n", + "\n", + "but they are not!\n", + "\n", + "Here are two tuples in $\\mathbb{R}^2$:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efc68978", + "metadata": {}, + "outputs": [], + "source": [ + "v = (0, 0)\n", + "w = (3, 4)" + ] + }, + { + "cell_type": "markdown", + "id": "2239d467", + "metadata": {}, + "source": [ + "Exercise: print the content of the tuples." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63cae630", + "metadata": {}, + "outputs": [], + "source": [ + "print(v[0])" + ] + }, + { + "cell_type": "markdown", + "id": "0af41fab", + "metadata": {}, + "source": [ + "Beware: operations on tuples are not the same as operations on vectors!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cba9b02d", + "metadata": {}, + "outputs": [], + "source": [ + "# Exercise: try to sum and multiply v and w. Which is the result? What would you expect?\n" + ] + }, + { + "cell_type": "markdown", + "id": "9b319ab4", + "metadata": {}, + "source": [ + "Exercise: try to modify the first element of v. What happens?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb1a59fc", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "94d5f9fc", + "metadata": {}, + "source": [ + "Tuples are immutable!\n", + "\n", "## Introducing Lists\n", "\n", - "A list is an ordered sequence of items.\n", + "A list is an **ordered** sequence of objects.\n", "Differently from a set, a list is ordered\n", "and can contain duplicates." ] @@ -151,7 +266,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9c9c3fd5", + "id": "4fc8979c", "metadata": {}, "outputs": [], "source": [ @@ -162,12 +277,11 @@ { "cell_type": "code", "execution_count": null, - "id": "56023a73", + "id": "a0192fd2", "metadata": {}, "outputs": [], "source": [ - "\n", - "# you can append items to a list\n", + "# you can append objects to a list\n", "# with the append method\n", "list_a.append(\"mutable\")" ] @@ -175,7 +289,7 @@ { "cell_type": "code", "execution_count": null, - "id": "43942414", + "id": "f6878cfa", "metadata": {}, "outputs": [], "source": [ @@ -186,7 +300,7 @@ { "cell_type": "code", "execution_count": null, - "id": "371b5688", + "id": "8caa394e", "metadata": {}, "outputs": [], "source": [ @@ -196,7 +310,7 @@ }, { "cell_type": "markdown", - "id": "1af29667", + "id": "52a822af", "metadata": { "slideshow": { "slide_type": "slide" @@ -207,15 +321,15 @@ "\n", "#### Lists and Generators\n", "\n", - "In python you can generate a sequence of numbers.\n", - "To avoid consuming too much memory, this is not doen using lists\n", + "The `range` function generates a sequence of numbers.\n", + "To avoid consuming too much memory, this is not done using lists\n", "or sets, but using special objects that generate those sequences." ] }, { "cell_type": "code", "execution_count": null, - "id": "25018671", + "id": "ea25c1b5", "metadata": {}, "outputs": [], "source": [ @@ -225,7 +339,7 @@ }, { "cell_type": "markdown", - "id": "d43e85e0", + "id": "e7f06457", "metadata": {}, "source": [ "Exercise:\n", @@ -236,7 +350,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a0e207b2", + "id": "04345ec2", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +359,7 @@ }, { "cell_type": "markdown", - "id": "9b261afb", + "id": "43b85fc7", "metadata": {}, "source": [ "- print the `type` of `from_0_to_10`" @@ -254,7 +368,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fc925b52", + "id": "2304eac8", "metadata": {}, "outputs": [], "source": [ @@ -263,7 +377,7 @@ }, { "cell_type": "markdown", - "id": "fc8e2f9c", + "id": "61d48150", "metadata": {}, "source": [ "We can extract all the elements from a generator using the `list` function." @@ -272,7 +386,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2a8773fa", + "id": "f4ce0751", "metadata": {}, "outputs": [], "source": [ @@ -285,17 +399,16 @@ { "cell_type": "code", "execution_count": null, - "id": "63a02d32", + "id": "593d1674", "metadata": {}, "outputs": [], "source": [ - "# Exercise: can you print the content of from_0_to_10\n", - "print(from_0_to_10)" + "# Exercise: print the content of from_0_to_10\n" ] }, { "cell_type": "markdown", - "id": "b7f869a7", + "id": "634d4c5d", "metadata": { "slideshow": { "slide_type": "slide" @@ -310,7 +423,7 @@ { "cell_type": "code", "execution_count": null, - "id": "47ff35c9", + "id": "a02b0b64", "metadata": {}, "outputs": [], "source": [ @@ -321,7 +434,7 @@ { "cell_type": "code", "execution_count": null, - "id": "62d5c3ce", + "id": "18f189dd", "metadata": {}, "outputs": [], "source": [ @@ -332,7 +445,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c5d79016", + "id": "cbd3080e", "metadata": {}, "outputs": [], "source": [ @@ -342,7 +455,7 @@ }, { "cell_type": "markdown", - "id": "f30fe2a6", + "id": "df9c46f1", "metadata": {}, "source": [ "Python lists are doubly linked, so you can get the last element using a negative index." @@ -351,7 +464,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6a61e83a", + "id": "489263d2", "metadata": {}, "outputs": [], "source": [ @@ -362,7 +475,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c685a24f", + "id": "4737eaaf", "metadata": {}, "outputs": [], "source": [ @@ -373,7 +486,7 @@ }, { "cell_type": "markdown", - "id": "4fe7024b", + "id": "da88aa2b", "metadata": { "slideshow": { "slide_type": "slide" @@ -388,17 +501,18 @@ { "cell_type": "code", "execution_count": null, - "id": "57eed0a0", + "id": "fad49284", "metadata": {}, "outputs": [], "source": [ "straight = [1, 2, 3, 'star']\n", - "print(straight)" + "print(straight)\n", + "type(straight) # This is a list!" ] }, { "cell_type": "markdown", - "id": "b614e1b3", + "id": "51040023", "metadata": {}, "source": [ "Python supports slicing, that is, getting a subsequence of a list\n", @@ -424,7 +538,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e91d582d", + "id": "16b20433", "metadata": {}, "outputs": [], "source": [ @@ -435,7 +549,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b412ae89", + "id": "16cc2672", "metadata": {}, "outputs": [], "source": [ @@ -446,7 +560,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bdfdcf0c", + "id": "54d96349", "metadata": {}, "outputs": [], "source": [ @@ -456,7 +570,7 @@ { "cell_type": "code", "execution_count": null, - "id": "47493cde", + "id": "c5671c40", "metadata": {}, "outputs": [], "source": [ @@ -465,7 +579,7 @@ }, { "cell_type": "markdown", - "id": "c559062c", + "id": "6efed54e", "metadata": { "slideshow": { "slide_type": "slide" @@ -480,7 +594,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c438eabb", + "id": "0ec540ed", "metadata": {}, "outputs": [], "source": [ @@ -491,11 +605,10 @@ { "cell_type": "code", "execution_count": null, - "id": "8ba69df3", + "id": "d26e7abb", "metadata": {}, "outputs": [], "source": [ - "\n", "# Have length..\n", "l_a = len(s_a)\n", "print(l_a)" @@ -504,7 +617,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8d3a88d7", + "id": "8bcb10c8", "metadata": {}, "outputs": [], "source": [ @@ -515,7 +628,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d6a907d0", + "id": "b09981e9", "metadata": {}, "outputs": [], "source": [ @@ -526,7 +639,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e2ae7861", + "id": "9e1f2618", "metadata": {}, "outputs": [], "source": [ @@ -537,7 +650,7 @@ }, { "cell_type": "markdown", - "id": "514fefac", + "id": "c50eee29", "metadata": { "slideshow": { "slide_type": "slide" @@ -546,7 +659,7 @@ "source": [ "---\n", "\n", - "## Juggling with iterables\n", + "## Juggling with collections\n", "\n", "We can sort and reverse lists." ] @@ -554,7 +667,7 @@ { "cell_type": "code", "execution_count": null, - "id": "59911d1c", + "id": "20ece1fc", "metadata": {}, "outputs": [], "source": [ @@ -565,16 +678,16 @@ }, { "cell_type": "markdown", - "id": "caba6ee1", + "id": "c25eb41d", "metadata": {}, "source": [ - "reversed is a generator, so we need to convert it to a list to print it." + "reversed is a generator, so we need to \"materialize\" it into a list to print it." ] }, { "cell_type": "code", "execution_count": null, - "id": "99184447", + "id": "9d4aee75", "metadata": {}, "outputs": [], "source": [ @@ -583,7 +696,7 @@ }, { "cell_type": "markdown", - "id": "0cddde56", + "id": "17c9273b", "metadata": {}, "source": [ "\n", @@ -594,7 +707,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c569f711", + "id": "48b310e0", "metadata": {}, "outputs": [], "source": [ @@ -605,28 +718,177 @@ }, { "cell_type": "markdown", - "id": "78d4f2be", + "id": "5dfa5803", + "metadata": {}, + "source": [ + "create the cartesian product of two lists.\n", + "\n", + "$\n", + "A \\times B := \\{ (a; b) \\mid a \\in A, b \\in B \\}\n", + "$\n", + "\n", + "|AxB| | | |\n", + "|---|---|---|---|\n", + "| | 1, 4 | 1, 5 | 1, 6 |\n", + "| | 2, 4 | 2, 5 | 2, 6 |\n", + "| | 3, 4 | 3, 5 | 3, 6 |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28677a15", + "metadata": {}, + "outputs": [], + "source": [ + "AxB = [(a, b) for a in A for b in B]" + ] + }, + { + "cell_type": "markdown", + "id": "01292386", "metadata": {}, "source": [ "or associate pairwise elements using the `zip` function.\n", "\n", + "|$A \\Delta B$| | | |\n", + "|---|---|---|---|\n", + "| | 1, 4 | | |\n", + "| | | 2, 5 |\n", + "| | | | 3, 6 |\n", + "\n", "$\n", - "A = [a_0, a_1, a_2]\n", - "B = [b_0, b_1, b_2]\n", - "diag(A,B) = [ (a_i, b_i) \\mid i < min(|A|, |B|) ]\n", + "A = [a_0, a_1, a_2] \\\\\n", + "B = [b_0, b_1, b_2] \\\\\n", + "A\\DeltaB = [ (a_i; b_i) \\mid i < min(|A|, |B|) ]\n", "$" ] }, { "cell_type": "code", "execution_count": null, - "id": "3aa49e03", + "id": "7667cec7", "metadata": {}, "outputs": [], "source": [ "D = zip(A, B)\n", "print(D)" ] + }, + { + "cell_type": "markdown", + "id": "74aba35a", + "metadata": {}, + "source": [ + "Exercise: can you materialize the zip object into a list?\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb38d74f", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "0247baba", + "metadata": {}, + "source": [ + "## The itertools module\n", + "\n", + "The itertools module provides advanced tools for working with collections." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c337084c", + "metadata": {}, + "outputs": [], + "source": [ + "import itertools\n", + "from itertools import product, permutations, combinations" + ] + }, + { + "cell_type": "markdown", + "id": "40d8356a", + "metadata": {}, + "source": [ + "You can create combinations, permutations, and cartesian products." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e03109f5", + "metadata": {}, + "outputs": [], + "source": [ + "A = [1, 2, 3]\n", + "B = [0, 1]\n", + "n = len(A)\n", + "k = 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ebdb9491", + "metadata": {}, + "outputs": [], + "source": [ + "AxB = product(A, B)\n", + "P_A = permutations(A)\n", + "C_A_2 = combinations(A, k)" + ] + }, + { + "cell_type": "markdown", + "id": "f8e0ab22", + "metadata": {}, + "source": [ + "Exercise: print the content of the above objects." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8130cceb", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n" + ] + }, + { + "cell_type": "markdown", + "id": "158b4ea7", + "metadata": {}, + "source": [ + "Combinations are useful to generate all the possible subsets of a set\n", + "of a given size.\n", + "\n", + "Can you fix the expression below and compute its value?\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ceef45ce", + "metadata": {}, + "outputs": [], + "source": [ + "r = len(P_A) / len(C_A_2)" + ] } ], "metadata": {}, diff --git a/python-high-school/notebooks/11_iterations.ipynb b/python-high-school/notebooks/11_iterations.ipynb index 54e563b..a1eb784 100644 --- a/python-high-school/notebooks/11_iterations.ipynb +++ b/python-high-school/notebooks/11_iterations.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "262e1124", + "id": "b0fc1a90", "metadata": {}, "source": [ "# Python for High School\n", @@ -15,7 +15,6 @@ "- Iterations: `for`\n", "- Iterations: `while`\n", "\n", - "\n", "## Conditions: `if`\n", "\n", "Python can evaluate conditions using `if` statements." @@ -24,7 +23,7 @@ { "cell_type": "code", "execution_count": null, - "id": "02335fd5", + "id": "1a2616b0", "metadata": {}, "outputs": [], "source": [ @@ -34,7 +33,7 @@ }, { "cell_type": "markdown", - "id": "2ae7d15e", + "id": "fef63d7f", "metadata": {}, "source": [ "More complex conditions can be evaluated using multiple lines\n", @@ -44,7 +43,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6c981d8f", + "id": "7a35caea", "metadata": {}, "outputs": [], "source": [ @@ -61,7 +60,7 @@ { "cell_type": "code", "execution_count": null, - "id": "62d2cd2a", + "id": "9f61f360", "metadata": {}, "outputs": [], "source": [ @@ -71,7 +70,7 @@ }, { "cell_type": "markdown", - "id": "5963a350", + "id": "4e6c8706", "metadata": {}, "source": [ "## Iterations: `for`\n", @@ -94,7 +93,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6b421687", + "id": "c5f39ce8", "metadata": {}, "outputs": [], "source": [ @@ -105,7 +104,7 @@ }, { "cell_type": "markdown", - "id": "313b5f50", + "id": "e575bd5c", "metadata": {}, "source": [ "We can stop the iteration using the `break` instruction." @@ -114,7 +113,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c9d4027e", + "id": "e567d4d3", "metadata": {}, "outputs": [], "source": [ @@ -127,7 +126,7 @@ { "cell_type": "code", "execution_count": null, - "id": "707f1f1c", + "id": "2301ecd9", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "53773344", + "id": "5910eca9", "metadata": {}, "source": [ "Combining `if` and `break` we can stop the iteration when a condition is met." @@ -149,7 +148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "97ebf69a", + "id": "1f3b78fe", "metadata": {}, "outputs": [], "source": [ @@ -161,7 +160,7 @@ }, { "cell_type": "markdown", - "id": "f18ffc63", + "id": "c8a4884a", "metadata": {}, "source": [ "We can use conditions on other variables" @@ -170,7 +169,7 @@ { "cell_type": "code", "execution_count": null, - "id": "89d7b045", + "id": "9b10348b", "metadata": {}, "outputs": [], "source": [ @@ -184,7 +183,7 @@ }, { "cell_type": "markdown", - "id": "f4e3ba05", + "id": "63a0fdf3", "metadata": {}, "source": [ "Exercise: write a loop that prints all the divisors of $n=100$." @@ -193,19 +192,18 @@ { "cell_type": "code", "execution_count": null, - "id": "a85bfab0", + "id": "939e75ba", "metadata": {}, "outputs": [], "source": [ "n = 100\n", "for q in range(2, n):\n", - " # Write your code here.\n", - " " + " # Write your code here.\n" ] }, { "cell_type": "markdown", - "id": "a77e9fe6", + "id": "78fc2426", "metadata": { "slideshow": { "slide_type": "slide" @@ -222,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "86f47a5b", + "id": "83403da3", "metadata": {}, "outputs": [], "source": [ @@ -234,7 +232,7 @@ }, { "cell_type": "markdown", - "id": "1d640522", + "id": "056cc5c1", "metadata": {}, "source": [ "Exercise: complete the code below to write a loop with the same output of the previous cell." @@ -243,7 +241,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1511d643", + "id": "012d54a2", "metadata": {}, "outputs": [], "source": [ @@ -255,7 +253,7 @@ }, { "cell_type": "markdown", - "id": "fb935afa", + "id": "92935e07", "metadata": {}, "source": [ "Exercise: write a loop that prints all the divisors of $n=100$." @@ -264,7 +262,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3a9bc935", + "id": "12c039f5", "metadata": {}, "outputs": [], "source": [ @@ -273,51 +271,12 @@ "while ...:\n", " if ...:\n", " print(q, end=\"; \")\n", - " ... " + " ..." ] }, { "cell_type": "markdown", - "id": "946f16dc", - "metadata": {}, - "source": [ - "Exercise: write a loop that prints all the prime factors of $n=100$, i.e. $2; 2; 5; 5;$." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ba013ff1", - "metadata": {}, - "outputs": [], - "source": [ - "n = 100\n", - "q = 2\n", - "while ...:\n", - " if ...:\n", - " print(q, end=\"; \")\n", - " ...\n" - ] - }, - { - "cell_type": "markdown", - "id": "a1504089", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "id": "3a764e43", + "id": "a706a83f", "metadata": { "slideshow": { "slide_type": "slide" @@ -326,13 +285,14 @@ "source": [ "---\n", "\n", + "\n", "`while` can use an iterable to check if there are more elements." ] }, { "cell_type": "code", "execution_count": null, - "id": "f19683af", + "id": "2f42dd66", "metadata": {}, "outputs": [], "source": [ @@ -350,7 +310,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b6d0f733", + "id": "09ed2541", "metadata": {}, "outputs": [], "source": [ @@ -360,19 +320,91 @@ " print((x + a_list.pop()))\n", "# for + pop() is not always a good idea ;)" ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" }, - "language_info": { - "name": "python", - "version": "3.11.6" + { + "cell_type": "markdown", + "id": "f98e00fd", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Prime numbers\n", + "\n", + "A prime number is a number that can be divided only by 1 and itself.\n", + "\n", + "$\n", + "p \\in \\mathbb{N} \\text{ is prime } \\iff \\forall q \\in \\mathbb{N} \\text{ if } q \\mid p \\text{ then } q = 1 \\text{ or } q = p\n", + "$\n", + "\n", + "Exercise: write a loop that prints all the prime factors of $n=100$, i.e. $2; 2; 5; 5;$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5935d21", + "metadata": {}, + "outputs": [], + "source": [ + "n = 100\n", + "q = 2\n", + "while ...:\n", + " if ...:\n", + " print(q, end=\"; \")\n", + " ...\n" + ] + }, + { + "cell_type": "markdown", + "id": "5802e619", + "metadata": {}, + "source": [ + "1:\n", + " if n%q == 0:\n", + " print(q, end=\"; \")\n", + " n //= q\n", + " else:\n", + " q += 1 -->\n", + "\n", + "Question: do I need to check all the numbers up to $n$?\n", + "\n", + "primes = [2, ]\n", + "def factr(n, primes):\n", + " q = 2\n", + " for p in primes:\n", + " while n % p == 0:\n", + " print(\"found\", p)\n", + " yield p\n", + " n //= p\n", + " while n>1 and q <= math.sqrt(n)+1:\n", + " if n%q == 0:\n", + " primes.append(q)\n", + " yield q\n", + " n //= q\n", + " else:\n", + " q += 1\n", + " if n>1:\n", + " primes.append(n)\n", + " yield n" + ] } - }, + ], + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/python-high-school/notebooks/20_plots.ipynb b/python-high-school/notebooks/20_plots.ipynb index 1184638..6585053 100644 --- a/python-high-school/notebooks/20_plots.ipynb +++ b/python-high-school/notebooks/20_plots.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "ce7976d1", + "id": "af3749de", "metadata": {}, "source": [ "# Plotting\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2a0995b1", + "id": "96949d04", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "567d315e", + "id": "befad8c2", "metadata": {}, "source": [ "A computer can't plot a function, it can only plot points. So we need to provide a set of points that are close enough to the function.\n", @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": null, - "id": "832107e1", + "id": "9d1a6d59", "metadata": {}, "outputs": [], "source": [ @@ -51,7 +51,7 @@ }, { "cell_type": "markdown", - "id": "1d6d2968", + "id": "e298d611", "metadata": {}, "source": [ "Now define a domain range and evaluate the function\n", @@ -65,7 +65,7 @@ { "cell_type": "code", "execution_count": null, - "id": "330259e9", + "id": "b9a701df", "metadata": {}, "outputs": [], "source": [ @@ -75,7 +75,7 @@ }, { "cell_type": "markdown", - "id": "9101d6fd", + "id": "8dc60568", "metadata": {}, "source": [ "Exercises:\n", @@ -86,7 +86,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ed69886b", + "id": "db18516c", "metadata": {}, "outputs": [], "source": [ @@ -95,78 +95,174 @@ }, { "cell_type": "markdown", - "id": "d3c2ef46", + "id": "3f40f383", "metadata": {}, "source": [ "- use the `zip` function to print a table pairs\n", - " using the string formatting tools, e.g.:" + " using the string formatting tools, e.g.:\n", + "\n", + "| x | f(x)|\n", + "|----|-----|\n", + "|-10 | -500|\n", + "| -9 | -279|\n", + "|... | ...|\n", + "\n", + "" ] }, { "cell_type": "code", "execution_count": null, - "id": "7dbf926e", + "id": "0d0bb068", "metadata": {}, "outputs": [], "source": [ - " x | f(x)\n", - "-10 | -500\n", - " -9 | -279\n", - "... | ..." + "# Use this cell for the exercise\n" ] }, { "cell_type": "markdown", - "id": "6118058b", + "id": "263960df", "metadata": {}, "source": [ - "" + "Now we can plot the function providing the two sets" ] }, { "cell_type": "code", "execution_count": null, - "id": "64c56750", + "id": "db441e95", "metadata": {}, "outputs": [], "source": [ - "# Use this cell for the exercise\n" + "# add axis\n", + "plt.axhline(0, color='black')\n", + "plt.plot(D, C)" ] }, { "cell_type": "markdown", - "id": "a1463f81", + "id": "638f8158", "metadata": {}, "source": [ - "Now we can plot the function providing the two sets" + "## Geometric plotting\n", + "\n", + "The sympy module has functionalities for geometric objects,\n", + "and supports some abstractions like variables and functions." ] }, { "cell_type": "code", "execution_count": null, - "id": "4a6dc109", + "id": "f62c8067", "metadata": {}, "outputs": [], "source": [ - "# add axis\n", - "plt.axhline(0, color='black')\n", - "plt.plot(D, C)" + "import matplotlib\n", + "from sympy import symbols, Point, Line, Circle, Triangle, Polygon, pi\n" ] }, { "cell_type": "markdown", - "id": "783002dd", + "id": "c68d6786", "metadata": {}, "source": [ - "## Geometric plotting\n", + "### Plotting a function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec9e2c93", + "metadata": {}, + "outputs": [], + "source": [ + "# Now the python variable x is a symbolic variable managed by sympy. We can't use it numerically.\n", + "x = symbols('x')\n", "\n", - "The sympy module has functionalities for geometric objects.\n", + "# Even functions are symbolic objects when using sympy.\n", + "f = x**2 - 2*x + 1\n", "\n", - "```python\n", - "import matplotlib\n", - "from sympy import symbols, Point, Line, Circle, Triangle, Polygon, pi\n", + "# The `ax` variable represent the cartesian plane.\n", + "plot(f, show=True)" + ] + }, + { + "cell_type": "markdown", + "id": "21cbcafa", + "metadata": {}, + "source": [ + "I can add another function to the same plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "308f82db", + "metadata": {}, + "outputs": [], + "source": [ + "g = 3 - x\n", + "# The `ax` variable represent the cartesian plane.\n", + "ax = plot(f, g, show=True)" + ] + }, + { + "cell_type": "markdown", + "id": "bce4557c", + "metadata": {}, + "source": [ + "I can add further functions using `extend`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b15cc2b9", + "metadata": {}, + "outputs": [], + "source": [ + "h = (x**2 - 1)\n", + "ax = plot(f, g, show=False)\n", + "ax.extend(plot(h, show=False))\n", + "ax.show()" + ] + }, + { + "cell_type": "markdown", + "id": "a4ce283c", + "metadata": {}, + "source": [ + "sympy supports implicit equations too,\n", + "for example the equation of a circle.\n", + "These should be plotted using the `plot_implicit` function.\n", + "\n", + "$\n", + "\\mathcal(C): x^2 + y^2 = 1\n", + "$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7f1502bc", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import Eq,plot_implicit\n", + "x, y = symbols('x y')\n", + "\n", + "# The circle equation\n", + "circle = Eq(x**2 + y**2 , 1)\n", + "\n", + "# Prepare a plotted circle\n", + "ax = plot_implicit(h, show=False)\n", + "\n", + "# Add the parabola to the plot\n", + "ax.extend(plot(f, (x, -2, 2), show=False))\n", "\n", - "``" + "# And finally, show the plot.\n", + "ax.show()" ] } ], From 0b5ea51e8afe1fe46ae844549988e15fd1a09cc5 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Thu, 30 Nov 2023 21:50:00 +0100 Subject: [PATCH 38/52] GCD & binary representation. (#77) Co-authored-by: Roberto Polli --- python-high-school/01_numbers.md | 66 +++--- python-high-school/notebooks/01_numbers.ipynb | 200 +++++++++--------- 2 files changed, 139 insertions(+), 127 deletions(-) diff --git a/python-high-school/01_numbers.md b/python-high-school/01_numbers.md index eb5dee9..f7f9aea 100644 --- a/python-high-school/01_numbers.md +++ b/python-high-school/01_numbers.md @@ -3,13 +3,18 @@ ## More on binary numbers We can use f-strings to print the binary representation of a number. +The pattern is `{variable:format specification}`. +In the code below: + +- the variable is `a` +- the format specification is `#b` (binary with the `0b` prefix). ```python a = 3 print(f"{a:#b} is the binary representation of {a}") ``` -Exercise: print the following numbers in binary: +Exercise: print the binary representation of the following numbers: 3, 61, 35. @@ -21,7 +26,14 @@ Exercise: print the following numbers in binary: # Write your code here. ``` -To align the number representations, we can specify the length of the representation (e.g., 10 characters). +Exercise: what happens if you remove the `#` in the format specification? + +```python +# Use this cell for the exercise. + +``` + +To align the number representations, we can specify their length (e.g., 10 characters). ```python a = 3 @@ -113,18 +125,8 @@ The AND operator has a physical meaning: it is used to check if, in a circuit, t - 🔋--1--0--💡OFF - 🔋--0--0--💡OFF -```mermaid -subgraph AND -direction LR - b-1[fa:fa-battery-three-quarters] - led-1[far:fa-lightbulb OFF] - s1-1((fa:fa-toggle-off)) - s2-1((fa:fa-toggle-on)) - b-1 --->|e-| s1-1 - s1-1 --- s2-1 --- led-1 - --- b-1 -end -``` +[![](https://mermaid.ink/img/pako:eNplkU9rwzAMxb-K8amFepAecxgM2p66Dbbb6h78R0kMjp0pMqOUfvc5TsIO00nS-_F4SHduogVe88bHH9MpJHb-kGFMukU1dOzl7XA5ejCEzjDj0CRHVxmsw7xzMRSa5dKiujSqbpTQigjwJqhDAPGdsifgeJ0xD7aAOJHetR3p5DV7P50WYKxEtdnMThTb1oOITbPdLur-vxpWMUdgQojn4vHntuz2a1cizLJ4yrOeJghWBr7jPWCvnM0HuU-I5NRBD5LXubXQqORJchkeGU2DVQRH6ygirwkT7LhKFD9vwazzzBycytfseU7tx7wdVPiKsV8hKBav8x_KOx6_iymCQQ?type=png)](https://mermaid.live/edit#pako:eNplkU9rwzAMxb-K8amFepAecxgM2p66Dbbb6h78R0kMjp0pMqOUfvc5TsIO00nS-_F4SHduogVe88bHH9MpJHb-kGFMukU1dOzl7XA5ejCEzjDj0CRHVxmsw7xzMRSa5dKiujSqbpTQigjwJqhDAPGdsifgeJ0xD7aAOJHetR3p5DV7P50WYKxEtdnMThTb1oOITbPdLur-vxpWMUdgQojn4vHntuz2a1cizLJ4yrOeJghWBr7jPWCvnM0HuU-I5NRBD5LXubXQqORJchkeGU2DVQRH6ygirwkT7LhKFD9vwazzzBycytfseU7tx7wdVPiKsV8hKBav8x_KOx6_iymCQQ) + - Exercise: compute the bitwise AND of 192 and 71 by hand and check the result in the cell below. @@ -161,23 +163,33 @@ print(f"{c:#010b}") The OR operator has a physical meaning: it is used to check if, in a circuit, at least one switch is ON. -```mermaid -flowchart LR +[![](https://mermaid.ink/img/pako:eNpdkL1uAyEQhF8FbRHZkolkl1ekSro4luLOIQUcyx0SBxdYFFmW3z17P25CtcN8zIq5QZssQgMupN-215nE-6eKKpZquqzHXpxYWp-xJZ_ibAo-5svpxmlpNBHmq6Q-I8qfygGYy_cKCSnliyh78STKYREBrZDPPJiFYc1RZcoKvuvJ1GDE6WNNKPvNZllEqesCyhS329U6_LecmzyMVkXYwYB50N7y127TAwXU44AKGh4tOl0DKVDxzmgdrSZ8s55ShoZyxR3oSul8je1DL8yr19zKALw2FL4ddbykNDwgnCOOS6Nzsfc_f7R0Qw?type=png)](https://mermaid.live/edit#pako:eNpdkL1uAyEQhF8FbRHZkolkl1ekSro4luLOIQUcyx0SBxdYFFmW3z17P25CtcN8zIq5QZssQgMupN-215nE-6eKKpZquqzHXpxYWp-xJZ_ibAo-5svpxmlpNBHmq6Q-I8qfygGYy_cKCSnliyh78STKYREBrZDPPJiFYc1RZcoKvuvJ1GDE6WNNKPvNZllEqesCyhS329U6_LecmzyMVkXYwYB50N7y127TAwXU44AKGh4tOl0DKVDxzmgdrSZ8s55ShoZyxR3oSul8je1DL8yr19zKALw2FL4ddbykNDwgnCOOS6Nzsfc_f7R0Qw) + +--- + + +## Mathematical built-int functions -subgraph OR -direction LR - b[fa:fa-battery-three-quarters] - b --->|e-| s1 & s2 ---led -.-> b - led[fas:fa-lightbulb ON] - s1((fa:fa-toggle-on)) - s2((fa:fa-toggle-off)) -end +Python has some built-in functions for numbers: + +```python +M = max(1, 2) +m = min(1, 2, -3) +absolute_value = abs(-3) +approximate_positive = round(1.4) +approximate_negative = round(-1.4) ``` ---- +Execise: + +- see the [python manual](https://docs.python.org/3/library/functions.html) +for a list of built-in functions; +- share with your classmates the ones you know. -## Max and min +Mathematical built-in functions can be used to implement simple algorithms, +such as the Euclidean algorithm for the greatest common divisor (GCD) +(:it: massimo comun divisore - MCD) ```python # Let's define two positive integers. @@ -197,10 +209,8 @@ b, c = min(d, b), max(d, b) print("b =", b, "c =", c) ``` - --- - ## Importing functionalities ---- diff --git a/python-high-school/notebooks/01_numbers.ipynb b/python-high-school/notebooks/01_numbers.ipynb index d3ea06d..e556393 100644 --- a/python-high-school/notebooks/01_numbers.ipynb +++ b/python-high-school/notebooks/01_numbers.ipynb @@ -2,20 +2,25 @@ "cells": [ { "cell_type": "markdown", - "id": "58432615", + "id": "85f3e455", "metadata": {}, "source": [ "# More on numbers\n", "\n", "## More on binary numbers\n", "\n", - "We can use f-strings to print the binary representation of a number." + "We can use f-strings to print the binary representation of a number.\n", + "The pattern is `{variable:format specification}`.\n", + "In the code below:\n", + "\n", + "- the variable is `a`\n", + "- the format specification is `#b` (binary with the `0b` prefix)." ] }, { "cell_type": "code", "execution_count": null, - "id": "d8cf8514", + "id": "19eaaaaf", "metadata": {}, "outputs": [], "source": [ @@ -25,10 +30,10 @@ }, { "cell_type": "markdown", - "id": "9041471e", + "id": "f8d81793", "metadata": {}, "source": [ - "Exercise: print the following numbers in binary:\n", + "Exercise: print the binary representation of the following numbers:\n", " 3, 61, 35.\n", "\n", "\n", @@ -40,7 +45,7 @@ { "cell_type": "code", "execution_count": null, - "id": "da04a89a", + "id": "acdf47f9", "metadata": {}, "outputs": [], "source": [ @@ -49,16 +54,34 @@ }, { "cell_type": "markdown", - "id": "725945d9", + "id": "f5f9aecd", + "metadata": {}, + "source": [ + "Exercise: what happens if you remove the `#` in the format specification?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89486d17", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise.\n" + ] + }, + { + "cell_type": "markdown", + "id": "7b08d679", "metadata": {}, "source": [ - "To align the number representations, we can specify the length of the representation (e.g., 10 characters)." + "To align the number representations, we can specify their length (e.g., 10 characters)." ] }, { "cell_type": "code", "execution_count": null, - "id": "2b3156af", + "id": "19cb4824", "metadata": {}, "outputs": [], "source": [ @@ -70,7 +93,7 @@ }, { "cell_type": "markdown", - "id": "0ae55674", + "id": "40d11a5e", "metadata": {}, "source": [ "I can also specify to fill the empty spaces with `0`s." @@ -79,7 +102,7 @@ { "cell_type": "code", "execution_count": null, - "id": "896c0c39", + "id": "dc748611", "metadata": {}, "outputs": [], "source": [ @@ -91,7 +114,7 @@ }, { "cell_type": "markdown", - "id": "e22faf7c", + "id": "f128f172", "metadata": {}, "source": [ "In this way I can easily compare the binary representations of two numbers.\n", @@ -104,7 +127,7 @@ }, { "cell_type": "markdown", - "id": "7bb0eeb2", + "id": "d8162023", "metadata": { "slideshow": { "slide_type": "subslide" @@ -125,7 +148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1210ca80", + "id": "d3d2b9c1", "metadata": {}, "outputs": [], "source": [ @@ -134,7 +157,7 @@ }, { "cell_type": "markdown", - "id": "b580f58e", + "id": "120ddb89", "metadata": {}, "source": [ "try to guess the result of the following operations. Hint: execute the cell below multiple times." @@ -143,7 +166,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f0528132", + "id": "d21a9b4a", "metadata": {}, "outputs": [], "source": [ @@ -153,7 +176,7 @@ }, { "cell_type": "markdown", - "id": "8b366ffd", + "id": "1348dd8b", "metadata": {}, "source": [ "Is there a similar operator with numbers in base 10?\n", @@ -164,7 +187,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ded93b35", + "id": "0aceffb8", "metadata": {}, "outputs": [], "source": [ @@ -173,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "79b44e72", + "id": "64b0e17d", "metadata": {}, "source": [ "try to guess the result of the following operations. Hint: execute the cell below multiple times." @@ -182,7 +205,7 @@ { "cell_type": "code", "execution_count": null, - "id": "36d329e3", + "id": "d0dab129", "metadata": {}, "outputs": [], "source": [ @@ -192,7 +215,7 @@ }, { "cell_type": "markdown", - "id": "712880a3", + "id": "ea1bb2a8", "metadata": {}, "source": [ "Is there a similar operator with numbers in base 10?\n", @@ -208,7 +231,7 @@ { "cell_type": "code", "execution_count": null, - "id": "472ef9a9", + "id": "018f7fd2", "metadata": {}, "outputs": [], "source": [ @@ -222,7 +245,7 @@ }, { "cell_type": "markdown", - "id": "4f0dbfd5", + "id": "3f53fdbf", "metadata": {}, "source": [ "| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ |\n", @@ -236,40 +259,11 @@ "- 🔋--1--1--💡ON\n", "- 🔋--0--1--💡OFF\n", "- 🔋--1--0--💡OFF\n", - "- 🔋--0--0--💡OFF" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "44ae4293", - "metadata": { - "attributes": { - "classes": [ - "mermaid" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "subgraph AND\n", - "direction LR\n", - " b-1[fa:fa-battery-three-quarters]\n", - " led-1[far:fa-lightbulb OFF]\n", - " s1-1((fa:fa-toggle-off))\n", - " s2-1((fa:fa-toggle-on))\n", - " b-1 --->|e-| s1-1\n", - " s1-1 --- s2-1 --- led-1\n", - " --- b-1\n", - "end" - ] - }, - { - "cell_type": "markdown", - "id": "a776149a", - "metadata": {}, - "source": [ + "- 🔋--0--0--💡OFF\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNplkU9rwzAMxb-K8amFepAecxgM2p66Dbbb6h78R0kMjp0pMqOUfvc5TsIO00nS-_F4SHduogVe88bHH9MpJHb-kGFMukU1dOzl7XA5ejCEzjDj0CRHVxmsw7xzMRSa5dKiujSqbpTQigjwJqhDAPGdsifgeJ0xD7aAOJHetR3p5DV7P50WYKxEtdnMThTb1oOITbPdLur-vxpWMUdgQojn4vHntuz2a1cizLJ4yrOeJghWBr7jPWCvnM0HuU-I5NRBD5LXubXQqORJchkeGU2DVQRH6ygirwkT7LhKFD9vwazzzBycytfseU7tx7wdVPiKsV8hKBav8x_KOx6_iymCQQ?type=png)](https://mermaid.live/edit#pako:eNplkU9rwzAMxb-K8amFepAecxgM2p66Dbbb6h78R0kMjp0pMqOUfvc5TsIO00nS-_F4SHduogVe88bHH9MpJHb-kGFMukU1dOzl7XA5ejCEzjDj0CRHVxmsw7xzMRSa5dKiujSqbpTQigjwJqhDAPGdsifgeJ0xD7aAOJHetR3p5DV7P50WYKxEtdnMThTb1oOITbPdLur-vxpWMUdgQojn4vHntuz2a1cizLJ4yrOeJghWBr7jPWCvnM0HuU-I5NRBD5LXubXQqORJchkeGU2DVQRH6ygirwkT7LhKFD9vwazzzBycytfseU7tx7wdVPiKsV8hKBav8x_KOx6_iymCQQ)\n", + "\n", + "\n", "- Exercise: compute the bitwise AND of 192 and 71 by hand and check the result in the cell below.\n", "\n", "" @@ -278,7 +272,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4a59aab4", + "id": "d0229522", "metadata": {}, "outputs": [], "source": [ @@ -287,7 +281,7 @@ }, { "cell_type": "markdown", - "id": "4577b3aa", + "id": "62d088e6", "metadata": {}, "source": [ "### Bitwise operators: OR `|`\n", @@ -299,7 +293,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ca1fc219", + "id": "43fe22a2", "metadata": {}, "outputs": [], "source": [ @@ -313,7 +307,7 @@ }, { "cell_type": "markdown", - "id": "ed3c56b5", + "id": "9f5e26d3", "metadata": {}, "source": [ "| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ |\n", @@ -326,54 +320,63 @@ "\n", "\n", "\n", - "The OR operator has a physical meaning: it is used to check if, in a circuit, at least one switch is ON." + "The OR operator has a physical meaning: it is used to check if, in a circuit, at least one switch is ON.\n", + "\n", + "[![](https://mermaid.ink/img/pako:eNpdkL1uAyEQhF8FbRHZkolkl1ekSro4luLOIQUcyx0SBxdYFFmW3z17P25CtcN8zIq5QZssQgMupN-215nE-6eKKpZquqzHXpxYWp-xJZ_ibAo-5svpxmlpNBHmq6Q-I8qfygGYy_cKCSnliyh78STKYREBrZDPPJiFYc1RZcoKvuvJ1GDE6WNNKPvNZllEqesCyhS329U6_LecmzyMVkXYwYB50N7y127TAwXU44AKGh4tOl0DKVDxzmgdrSZ8s55ShoZyxR3oSul8je1DL8yr19zKALw2FL4ddbykNDwgnCOOS6Nzsfc_f7R0Qw?type=png)](https://mermaid.live/edit#pako:eNpdkL1uAyEQhF8FbRHZkolkl1ekSro4luLOIQUcyx0SBxdYFFmW3z17P25CtcN8zIq5QZssQgMupN-215nE-6eKKpZquqzHXpxYWp-xJZ_ibAo-5svpxmlpNBHmq6Q-I8qfygGYy_cKCSnliyh78STKYREBrZDPPJiFYc1RZcoKvuvJ1GDE6WNNKPvNZllEqesCyhS329U6_LecmzyMVkXYwYB50N7y127TAwXU44AKGh4tOl0DKVDxzmgdrSZ8s55ShoZyxR3oSul8je1DL8yr19zKALw2FL4ddbykNDwgnCOOS6Nzsfc_f7R0Qw)" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "57066d1e", + "cell_type": "markdown", + "id": "a58dec35", "metadata": { - "attributes": { - "classes": [ - "mermaid" - ], - "id": "" + "slideshow": { + "slide_type": "slide" } }, - "outputs": [], "source": [ - "flowchart LR\n", + "---\n", + "\n", "\n", - "subgraph OR\n", - "direction LR\n", - " b[fa:fa-battery-three-quarters]\n", - " b --->|e-| s1 & s2 ---led -.-> b\n", - " led[fas:fa-lightbulb ON]\n", - " s1((fa:fa-toggle-on))\n", - " s2((fa:fa-toggle-off))\n", - "end" + "## Mathematical built-int functions\n", + "\n", + "Python has some built-in functions for numbers:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4181ff73", + "metadata": {}, + "outputs": [], + "source": [ + "M = max(1, 2)\n", + "m = min(1, 2, -3)\n", + "absolute_value = abs(-3)\n", + "approximate_positive = round(1.4)\n", + "approximate_negative = round(-1.4)" ] }, { "cell_type": "markdown", - "id": "be869d05", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "45ef6c81", + "metadata": {}, "source": [ - "---\n", + "Execise:\n", + "\n", + "- see the [python manual](https://docs.python.org/3/library/functions.html)\n", + "for a list of built-in functions;\n", + "- share with your classmates the ones you know.\n", "\n", "\n", - "## Max and min" + "Mathematical built-in functions can be used to implement simple algorithms,\n", + "such as the Euclidean algorithm for the greatest common divisor (GCD)\n", + "(:it: massimo comun divisore - MCD)" ] }, { "cell_type": "code", "execution_count": null, - "id": "abae96fc", + "id": "07c2b2cd", "metadata": {}, "outputs": [], "source": [ @@ -387,7 +390,7 @@ }, { "cell_type": "markdown", - "id": "d0baa634", + "id": "1074976f", "metadata": {}, "source": [ "Now execute the cell below many times, and see what happens." @@ -396,7 +399,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6d5d8afa", + "id": "20b5440c", "metadata": {}, "outputs": [], "source": [ @@ -408,7 +411,7 @@ }, { "cell_type": "markdown", - "id": "3e30ade4", + "id": "66cb0bde", "metadata": { "slideshow": { "slide_type": "slide" @@ -417,13 +420,12 @@ "source": [ "---\n", "\n", - "\n", "## Importing functionalities" ] }, { "cell_type": "markdown", - "id": "a8009804", + "id": "9693fa7f", "metadata": {}, "source": [ "----" @@ -432,7 +434,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fd4e9272", + "id": "8924cf8d", "metadata": {}, "outputs": [], "source": [ @@ -448,7 +450,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9ed373ff", + "id": "369a25e3", "metadata": {}, "outputs": [], "source": [ @@ -460,7 +462,7 @@ }, { "cell_type": "markdown", - "id": "99156e16", + "id": "acb72d10", "metadata": { "slideshow": { "slide_type": "subslide" @@ -476,7 +478,7 @@ { "cell_type": "code", "execution_count": null, - "id": "607b0ad8", + "id": "e95e5202", "metadata": {}, "outputs": [], "source": [ @@ -488,7 +490,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f10cd9bb", + "id": "3db6c43c", "metadata": {}, "outputs": [], "source": [ From 6376cd6f5399a019282b1d25c6c7d9392b948084 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Wed, 6 Nov 2024 18:36:46 +0100 Subject: [PATCH 39/52] GCD & binary representation. (#79) Co-authored-by: Roberto Polli From c7d4bae4c71b1db0a7e5eda613d94bd884ae09ac Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Sat, 9 Nov 2024 09:41:10 +0100 Subject: [PATCH 40/52] Editorial fixes. (#82) * Editorial fixes. --- python-high-school/00_intro.md | 31 +- python-high-school/01_strings.md | 2 +- python-high-school/Makefile | 11 +- python-high-school/notebooks/00_intro.ipynb | 295 +++++------------- python-high-school/notebooks/01_numbers.ipynb | 122 +++----- python-high-school/notebooks/01_strings.ipynb | 284 ++++++----------- .../notebooks/10_collections.ipynb | 182 +++++------ .../notebooks/11_iterations.ipynb | 84 ++--- python-high-school/notebooks/20_plots.ipynb | 44 +-- python-high-school/notebooks/index.md | 9 + 10 files changed, 379 insertions(+), 685 deletions(-) create mode 100644 python-high-school/notebooks/index.md diff --git a/python-high-school/00_intro.md b/python-high-school/00_intro.md index 96a2be8..1222fa6 100644 --- a/python-high-school/00_intro.md +++ b/python-high-school/00_intro.md @@ -165,7 +165,7 @@ print(2 * c) Exercise: use the cell below to compute the following values: - the remainder of 12 / 5 -- $3 \dot 8; 2^{10}; 2^{20}; 2^{30}$ +- $3 \cdot 8; 2^{10}; 2^{20}; 2^{30}$ - $ \frac{[1 + (1/3 + 1/4)] + 1/5}{6} $ ```python @@ -177,14 +177,15 @@ Exercise: use the cell below to compute the following values: **An historical note** Computers, for performance reasons, use memory in chunks called blocks or pages: -for example you can't use a single bit of memory similarly to how you can't -use a single line of your notebook. +for example, you can't use a single *bit* of memory similarly to how you can't +use a single line of your notebook 📓. -For this reasom it is convenient to use powers of $2^{10}$ to represent the size of files and memory. -They are called "kibi (Ki)", "mebi (Mi)", "gibi (Gi)", .. to avoid confusion with the powers of $10^{3}$, that are called +For this reason, it is convenient to use powers of $2^{10}$ to represent the size of files and memory. +They are called "kibi (Ki)", "mebi (Mi)", "gibi (Gi)", etc., to avoid confusion with the powers of $10^{3}$, +which are called "kilo (k)", "mega (Mi)", "giga (Gi)", and so on. -The unit of measure of information is the Byte $B$. +The unit of measure of information is the *Byte* $B$. Its multiples can be expressed in powers of $10^3$: $$ @@ -246,12 +247,14 @@ $ Examples: $ -12_{10} = 2 \cdot 10^0 + 1 \cdot 10^1 = 12 \\ -101_{2} = 1 \cdot 2^0 + 0 \cdot 2^1 + 1 \cdot 2^2 = 5_{10} \\ -200_{3} = 0 \cdot 3^0 + 0 \cdot 3^1 + 2 \cdot 3^2 = 18_{10} \\ -9_{16} = 9 \cdot 16^0 = 9_{10} \\ -A_{16} = 10 \cdot 16^0 = 10_{10} \\ -FF_{16} = 15 \cdot 16^0 + 15 \cdot 16^1 = 255_{10} \\ +\begin{align} +& 12_{10} = 2 \cdot 10^0 + 1 \cdot 10^1 = 12 \\ +& 101_{2} = 1 \cdot 2^0 + 0 \cdot 2^1 + 1 \cdot 2^2 = 5_{10} \\ +& 200_{3} = 0 \cdot 3^0 + 0 \cdot 3^1 + 2 \cdot 3^2 = 18_{10} \\ +& 9_{16} = 9 \cdot 16^0 = 9_{10} \\ +& A_{16} = 10 \cdot 16^0 = 10_{10} \\ +& FF_{16} = 15 \cdot 16^0 + 15 \cdot 16^1 = 255_{10} \\ +\end{align} $ Exercise: @@ -289,8 +292,8 @@ Exercise: Questions: -- What is a bit? -- What is a byte? +- What is a *bit*? +- What is a *byte*? - Why in the computer world the hex notation is very common? --- diff --git a/python-high-school/01_strings.md b/python-high-school/01_strings.md index f6d8a5f..ea9f406 100644 --- a/python-high-school/01_strings.md +++ b/python-high-school/01_strings.md @@ -22,7 +22,7 @@ another_string = 'I "love" python' ``` A string is a finite, ordered sequence of typographic characters -(e.g., from an alphabet, like the one thaught at school). +(e.g., from an alphabet, like the one taught at school). Exercises: finite strings using an alphabet $\Sigma : |\Sigma| = k$. diff --git a/python-high-school/Makefile b/python-high-school/Makefile index d798266..2bb04d8 100644 --- a/python-high-school/Makefile +++ b/python-high-school/Makefile @@ -1,15 +1,18 @@ -FILES=$(wildcard *.md) +FILES = $(wildcard *.md) BOOKS = $(patsubst %.md,notebooks/%.ipynb,$(FILES)) -all: $(BOOKS) +all: $(BOOKS) notebooks/index.md @echo $(BOOKS) +notebooks/index.md: $(BOOKS) + echo "# Index\n\n" > $@ + for file in $(BOOKS); do echo >> $@ \ + "- [$$file](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/$$file)" ; done clean: - rm -rf notebooks/*.ipynb + rm -rf notebooks/*.ipynb notebooks/index.md notebooks/%.ipynb: %.md - notedown --to notebook $^ > $@ run: all diff --git a/python-high-school/notebooks/00_intro.ipynb b/python-high-school/notebooks/00_intro.ipynb index b764cc8..592787b 100644 --- a/python-high-school/notebooks/00_intro.ipynb +++ b/python-high-school/notebooks/00_intro.ipynb @@ -2,23 +2,13 @@ "cells": [ { "cell_type": "markdown", - "id": "ba1a96c6", + "id": "5b7741e7", "metadata": {}, "source": [ "# Python for High School\n", "\n", - " Author: " - ] - }, - { - "cell_type": "markdown", - "id": "7ce64e9f", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + " Author: \n", + "\n", "---\n", "\n", "## Introducing Python\n", @@ -32,18 +22,8 @@ "\n", "Students are expected to type and execute cells, and share their results.\n", "\n", - "You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/00_intro.ipynb)." - ] - }, - { - "cell_type": "markdown", - "id": "d60eaf47", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + "You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/00_intro.ipynb).\n", + "\n", "---\n", "\n", "# Jupyter\n", @@ -52,34 +32,14 @@ "It requires a modern browser and an internet connection supporting\n", "websockets. If your network setup (e.g. your proxy)\n", "does not support websockets, you will not be able to\n", - "execute the code." - ] - }, - { - "cell_type": "markdown", - "id": "52ca24ad", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + "execute the code.\n", + "\n", "---\n", "\n", "While you might find the exercises' solutions in the environment,\n", "it is important for you to spend some time trying to do your homework!\n", - "This will help you to remember the concepts and to learn how to use the tools." - ] - }, - { - "cell_type": "markdown", - "id": "81832421", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + "This will help you to remember the concepts and to learn how to use the tools.\n", + "\n", "---\n", "\n", "## What can I do with Jupyter?\n", @@ -92,32 +52,12 @@ "operating system access:\n", "\n", "- [open a (named) terminal on the local machine](/terminals/example)\n", - "- [edit an existing file](/edit/notebooks/untitled.txt)" - ] - }, - { - "cell_type": "markdown", - "id": "280d4c87", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + "- [edit an existing file](/edit/notebooks/untitled.txt)\n", + "\n", "---\n", "\n", - "- add more cells with `ALT+ENTER`" - ] - }, - { - "cell_type": "markdown", - "id": "70cbe19d", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ + "- add more cells with `ALT+ENTER`\n", + "\n", "----\n", "\n", "Try to add a cell below this one and write some text in it." @@ -126,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ad6eedc1", + "id": "92061b6e", "metadata": {}, "outputs": [], "source": [ @@ -135,12 +75,8 @@ }, { "cell_type": "markdown", - "id": "359246e6", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "c0cbd56f", + "metadata": {}, "source": [ "---\n", "\n", @@ -153,7 +89,7 @@ { "cell_type": "code", "execution_count": null, - "id": "db4fa6c6", + "id": "b47f3f58", "metadata": {}, "outputs": [], "source": [ @@ -164,7 +100,7 @@ }, { "cell_type": "markdown", - "id": "baa23558", + "id": "6db70303", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -173,7 +109,7 @@ { "cell_type": "code", "execution_count": null, - "id": "65b897cb", + "id": "187fbbd7", "metadata": {}, "outputs": [], "source": [ @@ -184,24 +120,14 @@ }, { "cell_type": "markdown", - "id": "526e918e", + "id": "58c63516", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", "This means that sometimes, you need to \"reset\" the environment, to start from scratch.\n", "\n", - "This can be done with the \"Kernel > Restart\" or \"Kernel > Restart & Clear output\" menu." - ] - }, - { - "cell_type": "markdown", - "id": "dd93ff6d", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ + "This can be done with the \"Kernel > Restart\" or \"Kernel > Restart & Clear output\" menu.\n", + "\n", "----\n", "\n", "## Agenda\n", @@ -211,18 +137,8 @@ "- Variable assignment\n", "- Formatting\n", "- Importing modules\n", - "- Getting help" - ] - }, - { - "cell_type": "markdown", - "id": "86124263", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + "- Getting help\n", + "\n", "---\n", "\n", "## Basic functions\n", @@ -234,7 +150,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d53d2a79", + "id": "05c0c39a", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +161,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0e8cf359", + "id": "8b9f7b7e", "metadata": {}, "outputs": [], "source": [ @@ -257,7 +173,7 @@ { "cell_type": "code", "execution_count": null, - "id": "00b2c1de", + "id": "899eaa68", "metadata": {}, "outputs": [], "source": [ @@ -266,12 +182,8 @@ }, { "cell_type": "markdown", - "id": "0902ce43", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "9e28c880", + "metadata": {}, "source": [ "---\n", "\n", @@ -283,7 +195,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b08a4441", + "id": "385e68a9", "metadata": {}, "outputs": [], "source": [ @@ -295,7 +207,7 @@ }, { "cell_type": "markdown", - "id": "55034f4d", + "id": "5385d737", "metadata": {}, "source": [ "----" @@ -304,7 +216,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e0f31649", + "id": "5a3db11f", "metadata": {}, "outputs": [], "source": [ @@ -313,7 +225,7 @@ }, { "cell_type": "markdown", - "id": "834a7a9d", + "id": "7bef173f", "metadata": {}, "source": [ "----" @@ -322,7 +234,7 @@ { "cell_type": "code", "execution_count": null, - "id": "80616f6f", + "id": "c2b70311", "metadata": {}, "outputs": [], "source": [ @@ -333,7 +245,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9b593112", + "id": "a66ea20e", "metadata": {}, "outputs": [], "source": [ @@ -344,7 +256,7 @@ { "cell_type": "code", "execution_count": null, - "id": "37f3dbdc", + "id": "d1e46033", "metadata": {}, "outputs": [], "source": [ @@ -354,7 +266,7 @@ }, { "cell_type": "markdown", - "id": "57123623", + "id": "31be427c", "metadata": {}, "source": [ "----" @@ -363,7 +275,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d52709ea", + "id": "9213f847", "metadata": {}, "outputs": [], "source": [ @@ -373,20 +285,20 @@ }, { "cell_type": "markdown", - "id": "1f4510bf", + "id": "f1eca02c", "metadata": {}, "source": [ "Exercise: use the cell below to compute the following values:\n", "\n", "- the remainder of 12 / 5\n", - "- $3 \\dot 8; 2^{10}; 2^{20}; 2^{30}$\n", + "- $3 \\cdot 8; 2^{10}; 2^{20}; 2^{30}$\n", "- $ \\frac{[1 + (1/3 + 1/4)] + 1/5}{6} $" ] }, { "cell_type": "code", "execution_count": null, - "id": "8f8d08d7", + "id": "81b0f702", "metadata": {}, "outputs": [], "source": [ @@ -395,26 +307,23 @@ }, { "cell_type": "markdown", - "id": "ec6391e0", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "17192738", + "metadata": {}, "source": [ "---\n", "\n", "**An historical note**\n", "\n", "Computers, for performance reasons, use memory in chunks called blocks or pages:\n", - "for example you can't use a single bit of memory similarly to how you can't\n", - "use a single line of your notebook.\n", + "for example, you can't use a single *bit* of memory similarly to how you can't\n", + "use a single line of your notebook 📓.\n", "\n", - "For this reasom it is convenient to use powers of $2^{10}$ to represent the size of files and memory.\n", - "They are called \"kibi (Ki)\", \"mebi (Mi)\", \"gibi (Gi)\", .. to avoid confusion with the powers of $10^{3}$, that are called\n", + "For this reason, it is convenient to use powers of $2^{10}$ to represent the size of files and memory.\n", + "They are called \"kibi (Ki)\", \"mebi (Mi)\", \"gibi (Gi)\", etc., to avoid confusion with the powers of $10^{3}$,\n", + "which are called\n", "\"kilo (k)\", \"mega (Mi)\", \"giga (Gi)\", and so on.\n", "\n", - "The unit of measure of information is the Byte $B$.\n", + "The unit of measure of information is the *Byte* $B$.\n", "Its multiples can be expressed in powers of $10^3$:\n", "\n", "$$\n", @@ -428,18 +337,8 @@ "$$\n", "\n", "Nowadays it is very important to know the difference between the two units:\n", - "when you buy an hard disk of 500GB, you are getting only 465GiB!" - ] - }, - { - "cell_type": "markdown", - "id": "8947e73b", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ + "when you buy an hard disk of 500GB, you are getting only 465GiB!\n", + "\n", "----\n", "\n", "Exercise:\n", @@ -459,18 +358,8 @@ " ```\n", "\n", "- check the advertised size of your devices (phone, tablet, computer)\n", - " and compute the difference between the one in $GiB$." - ] - }, - { - "cell_type": "markdown", - "id": "bbf777f6", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + " and compute the difference between the one in $GiB$.\n", + "\n", "---\n", "\n", "### Representing numbers\n", @@ -480,18 +369,8 @@ "- the decimal notation uses 10 digits, from 0 to 9;\n", "- the binary notation uses 2 digits, 0 and 1;\n", "- the octal notation uses 8 digits, from 0 to 7;\n", - "- the hexadecimal notation uses 16 digits, where `10` is represented by `A`, `11` by `B`, and so on." - ] - }, - { - "cell_type": "markdown", - "id": "3a21a479", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ + "- the hexadecimal notation uses 16 digits, where `10` is represented by `A`, `11` by `B`, and so on.\n", + "\n", "----\n", "\n", "A number\n", @@ -506,12 +385,14 @@ "Examples:\n", "\n", "$\n", - "12_{10} = 2 \\cdot 10^0 + 1 \\cdot 10^1 = 12 \\\\\n", - "101_{2} = 1 \\cdot 2^0 + 0 \\cdot 2^1 + 1 \\cdot 2^2 = 5_{10} \\\\\n", - "200_{3} = 0 \\cdot 3^0 + 0 \\cdot 3^1 + 2 \\cdot 3^2 = 18_{10} \\\\\n", - "9_{16} = 9 \\cdot 16^0 = 9_{10} \\\\\n", - "A_{16} = 10 \\cdot 16^0 = 10_{10} \\\\\n", - "FF_{16} = 15 \\cdot 16^0 + 15 \\cdot 16^1 = 255_{10} \\\\\n", + "\\begin{align}\n", + "& 12_{10} = 2 \\cdot 10^0 + 1 \\cdot 10^1 = 12 \\\\\n", + "& 101_{2} = 1 \\cdot 2^0 + 0 \\cdot 2^1 + 1 \\cdot 2^2 = 5_{10} \\\\\n", + "& 200_{3} = 0 \\cdot 3^0 + 0 \\cdot 3^1 + 2 \\cdot 3^2 = 18_{10} \\\\\n", + "& 9_{16} = 9 \\cdot 16^0 = 9_{10} \\\\\n", + "& A_{16} = 10 \\cdot 16^0 = 10_{10} \\\\\n", + "& FF_{16} = 15 \\cdot 16^0 + 15 \\cdot 16^1 = 255_{10} \\\\\n", + "\\end{align}\n", "$\n", "\n", "Exercise:\n", @@ -527,18 +408,8 @@ "$\n", "0.1_{2} = \\dots \\\\\n", "0.5_{2} = \\dots\n", - "$" - ] - }, - { - "cell_type": "markdown", - "id": "a62ab274", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ + "$\n", + "\n", "----\n", "\n", "Python supports the binary, the octal and the hexadecimal notation too!" @@ -547,7 +418,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fc68753d", + "id": "ab441c0d", "metadata": {}, "outputs": [], "source": [ @@ -559,7 +430,7 @@ }, { "cell_type": "markdown", - "id": "be887220", + "id": "b64b8d4f", "metadata": {}, "source": [ "Exercise:" @@ -568,7 +439,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7fd5c7b6", + "id": "3fc85e9a", "metadata": {}, "outputs": [], "source": [ @@ -577,25 +448,15 @@ }, { "cell_type": "markdown", - "id": "2bc847f2", + "id": "64c2ca93", "metadata": {}, "source": [ "Questions:\n", "\n", - "- What is a bit?\n", - "- What is a byte?\n", - "- Why in the computer world the hex notation is very common?" - ] - }, - { - "cell_type": "markdown", - "id": "10bbdb49", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + "- What is a *bit*?\n", + "- What is a *byte*?\n", + "- Why in the computer world the hex notation is very common?\n", + "\n", "---\n", "\n", "## Variable assignment" @@ -604,7 +465,7 @@ { "cell_type": "code", "execution_count": null, - "id": "afa23dea", + "id": "bbb683f6", "metadata": {}, "outputs": [], "source": [ @@ -616,7 +477,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7355d86d", + "id": "d01ba523", "metadata": {}, "outputs": [], "source": [ @@ -628,7 +489,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bace5062", + "id": "139a7229", "metadata": {}, "outputs": [], "source": [ @@ -638,7 +499,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f2af35b9", + "id": "2ddc0ad1", "metadata": {}, "outputs": [], "source": [ @@ -648,7 +509,7 @@ }, { "cell_type": "markdown", - "id": "d038f251", + "id": "626aff5b", "metadata": {}, "source": [ "---" diff --git a/python-high-school/notebooks/01_numbers.ipynb b/python-high-school/notebooks/01_numbers.ipynb index e556393..9eb9f3f 100644 --- a/python-high-school/notebooks/01_numbers.ipynb +++ b/python-high-school/notebooks/01_numbers.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "85f3e455", + "id": "37005e52", "metadata": {}, "source": [ "# More on numbers\n", @@ -20,7 +20,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19eaaaaf", + "id": "bc655893", "metadata": {}, "outputs": [], "source": [ @@ -30,7 +30,7 @@ }, { "cell_type": "markdown", - "id": "f8d81793", + "id": "d520449c", "metadata": {}, "source": [ "Exercise: print the binary representation of the following numbers:\n", @@ -45,7 +45,7 @@ { "cell_type": "code", "execution_count": null, - "id": "acdf47f9", + "id": "f1ad4d9b", "metadata": {}, "outputs": [], "source": [ @@ -54,7 +54,7 @@ }, { "cell_type": "markdown", - "id": "f5f9aecd", + "id": "7bcfcf52", "metadata": {}, "source": [ "Exercise: what happens if you remove the `#` in the format specification?" @@ -63,7 +63,7 @@ { "cell_type": "code", "execution_count": null, - "id": "89486d17", + "id": "4db0d386", "metadata": {}, "outputs": [], "source": [ @@ -72,7 +72,7 @@ }, { "cell_type": "markdown", - "id": "7b08d679", + "id": "cc348e73", "metadata": {}, "source": [ "To align the number representations, we can specify their length (e.g., 10 characters)." @@ -81,7 +81,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19cb4824", + "id": "b1c52e28", "metadata": {}, "outputs": [], "source": [ @@ -93,7 +93,7 @@ }, { "cell_type": "markdown", - "id": "40d11a5e", + "id": "628692d2", "metadata": {}, "source": [ "I can also specify to fill the empty spaces with `0`s." @@ -102,7 +102,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dc748611", + "id": "1885db72", "metadata": {}, "outputs": [], "source": [ @@ -114,7 +114,7 @@ }, { "cell_type": "markdown", - "id": "f128f172", + "id": "11f8dec5", "metadata": {}, "source": [ "In this way I can easily compare the binary representations of two numbers.\n", @@ -122,18 +122,8 @@ "| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ |\n", "|--------|-------|-------|-------|-------|-------|-------|-------|-------|\n", "| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |\n", - "| 61 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |" - ] - }, - { - "cell_type": "markdown", - "id": "d8162023", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ + "| 61 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |\n", + "\n", "----\n", "\n", "### Bitwise operators: `<<` and `>>`\n", @@ -148,7 +138,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d3d2b9c1", + "id": "3e98b784", "metadata": {}, "outputs": [], "source": [ @@ -157,7 +147,7 @@ }, { "cell_type": "markdown", - "id": "120ddb89", + "id": "64f74d68", "metadata": {}, "source": [ "try to guess the result of the following operations. Hint: execute the cell below multiple times." @@ -166,7 +156,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d21a9b4a", + "id": "94b65911", "metadata": {}, "outputs": [], "source": [ @@ -176,7 +166,7 @@ }, { "cell_type": "markdown", - "id": "1348dd8b", + "id": "9b619e69", "metadata": {}, "source": [ "Is there a similar operator with numbers in base 10?\n", @@ -187,7 +177,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0aceffb8", + "id": "4d19500b", "metadata": {}, "outputs": [], "source": [ @@ -196,7 +186,7 @@ }, { "cell_type": "markdown", - "id": "64b0e17d", + "id": "3be5aace", "metadata": {}, "source": [ "try to guess the result of the following operations. Hint: execute the cell below multiple times." @@ -205,7 +195,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d0dab129", + "id": "f0429973", "metadata": {}, "outputs": [], "source": [ @@ -215,7 +205,7 @@ }, { "cell_type": "markdown", - "id": "ea1bb2a8", + "id": "0c027b94", "metadata": {}, "source": [ "Is there a similar operator with numbers in base 10?\n", @@ -231,7 +221,7 @@ { "cell_type": "code", "execution_count": null, - "id": "018f7fd2", + "id": "d382e2a5", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +235,7 @@ }, { "cell_type": "markdown", - "id": "3f53fdbf", + "id": "a580621d", "metadata": {}, "source": [ "| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ |\n", @@ -272,7 +262,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d0229522", + "id": "d81b3e8a", "metadata": {}, "outputs": [], "source": [ @@ -281,7 +271,7 @@ }, { "cell_type": "markdown", - "id": "62d088e6", + "id": "9a4874e4", "metadata": {}, "source": [ "### Bitwise operators: OR `|`\n", @@ -293,7 +283,7 @@ { "cell_type": "code", "execution_count": null, - "id": "43fe22a2", + "id": "b6a651f0", "metadata": {}, "outputs": [], "source": [ @@ -307,7 +297,7 @@ }, { "cell_type": "markdown", - "id": "9f5e26d3", + "id": "9db90472", "metadata": {}, "source": [ "| number | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ |\n", @@ -322,18 +312,8 @@ "\n", "The OR operator has a physical meaning: it is used to check if, in a circuit, at least one switch is ON.\n", "\n", - "[![](https://mermaid.ink/img/pako:eNpdkL1uAyEQhF8FbRHZkolkl1ekSro4luLOIQUcyx0SBxdYFFmW3z17P25CtcN8zIq5QZssQgMupN-215nE-6eKKpZquqzHXpxYWp-xJZ_ibAo-5svpxmlpNBHmq6Q-I8qfygGYy_cKCSnliyh78STKYREBrZDPPJiFYc1RZcoKvuvJ1GDE6WNNKPvNZllEqesCyhS329U6_LecmzyMVkXYwYB50N7y127TAwXU44AKGh4tOl0DKVDxzmgdrSZ8s55ShoZyxR3oSul8je1DL8yr19zKALw2FL4ddbykNDwgnCOOS6Nzsfc_f7R0Qw?type=png)](https://mermaid.live/edit#pako:eNpdkL1uAyEQhF8FbRHZkolkl1ekSro4luLOIQUcyx0SBxdYFFmW3z17P25CtcN8zIq5QZssQgMupN-215nE-6eKKpZquqzHXpxYWp-xJZ_ibAo-5svpxmlpNBHmq6Q-I8qfygGYy_cKCSnliyh78STKYREBrZDPPJiFYc1RZcoKvuvJ1GDE6WNNKPvNZllEqesCyhS329U6_LecmzyMVkXYwYB50N7y127TAwXU44AKGh4tOl0DKVDxzmgdrSZ8s55ShoZyxR3oSul8je1DL8yr19zKALw2FL4ddbykNDwgnCOOS6Nzsfc_f7R0Qw)" - ] - }, - { - "cell_type": "markdown", - "id": "a58dec35", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + "[![](https://mermaid.ink/img/pako:eNpdkL1uAyEQhF8FbRHZkolkl1ekSro4luLOIQUcyx0SBxdYFFmW3z17P25CtcN8zIq5QZssQgMupN-215nE-6eKKpZquqzHXpxYWp-xJZ_ibAo-5svpxmlpNBHmq6Q-I8qfygGYy_cKCSnliyh78STKYREBrZDPPJiFYc1RZcoKvuvJ1GDE6WNNKPvNZllEqesCyhS329U6_LecmzyMVkXYwYB50N7y127TAwXU44AKGh4tOl0DKVDxzmgdrSZ8s55ShoZyxR3oSul8je1DL8yr19zKALw2FL4ddbykNDwgnCOOS6Nzsfc_f7R0Qw?type=png)](https://mermaid.live/edit#pako:eNpdkL1uAyEQhF8FbRHZkolkl1ekSro4luLOIQUcyx0SBxdYFFmW3z17P25CtcN8zIq5QZssQgMupN-215nE-6eKKpZquqzHXpxYWp-xJZ_ibAo-5svpxmlpNBHmq6Q-I8qfygGYy_cKCSnliyh78STKYREBrZDPPJiFYc1RZcoKvuvJ1GDE6WNNKPvNZllEqesCyhS329U6_LecmzyMVkXYwYB50N7y127TAwXU44AKGh4tOl0DKVDxzmgdrSZ8s55ShoZyxR3oSul8je1DL8yr19zKALw2FL4ddbykNDwgnCOOS6Nzsfc_f7R0Qw)\n", + "\n", "---\n", "\n", "\n", @@ -345,7 +325,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4181ff73", + "id": "efe1a381", "metadata": {}, "outputs": [], "source": [ @@ -358,7 +338,7 @@ }, { "cell_type": "markdown", - "id": "45ef6c81", + "id": "114ff0b6", "metadata": {}, "source": [ "Execise:\n", @@ -376,7 +356,7 @@ { "cell_type": "code", "execution_count": null, - "id": "07c2b2cd", + "id": "2a7810a8", "metadata": {}, "outputs": [], "source": [ @@ -390,7 +370,7 @@ }, { "cell_type": "markdown", - "id": "1074976f", + "id": "e420c74c", "metadata": {}, "source": [ "Now execute the cell below many times, and see what happens." @@ -399,7 +379,7 @@ { "cell_type": "code", "execution_count": null, - "id": "20b5440c", + "id": "e6e2191e", "metadata": {}, "outputs": [], "source": [ @@ -411,30 +391,20 @@ }, { "cell_type": "markdown", - "id": "66cb0bde", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "7048a9ab", + "metadata": {}, "source": [ "---\n", "\n", - "## Importing functionalities" - ] - }, - { - "cell_type": "markdown", - "id": "9693fa7f", - "metadata": {}, - "source": [ + "## Importing functionalities\n", + "\n", "----" ] }, { "cell_type": "code", "execution_count": null, - "id": "8924cf8d", + "id": "aca71c3c", "metadata": {}, "outputs": [], "source": [ @@ -450,7 +420,7 @@ { "cell_type": "code", "execution_count": null, - "id": "369a25e3", + "id": "226d0310", "metadata": {}, "outputs": [], "source": [ @@ -462,12 +432,8 @@ }, { "cell_type": "markdown", - "id": "acb72d10", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "id": "68e3f6ee", + "metadata": {}, "source": [ "----\n", "\n", @@ -478,7 +444,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e95e5202", + "id": "a3d59ec6", "metadata": {}, "outputs": [], "source": [ @@ -490,7 +456,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3db6c43c", + "id": "0c553e75", "metadata": {}, "outputs": [], "source": [ diff --git a/python-high-school/notebooks/01_strings.ipynb b/python-high-school/notebooks/01_strings.ipynb index d74094e..02724e2 100644 --- a/python-high-school/notebooks/01_strings.ipynb +++ b/python-high-school/notebooks/01_strings.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2c8858f0", + "id": "27d7f8d3", "metadata": {}, "source": [ "# Strings\n", @@ -14,18 +14,8 @@ "- Notable escape sequences\n", "- Formatting numbers\n", "- Bonus track: Formatting\n", - "- Bonus track: reserved words" - ] - }, - { - "cell_type": "markdown", - "id": "9172f5b4", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ + "- Bonus track: reserved words\n", + "\n", "---\n", "\n", "## Strings\n", @@ -36,7 +26,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b07c4860", + "id": "6e0648b4", "metadata": {}, "outputs": [], "source": [ @@ -47,11 +37,11 @@ }, { "cell_type": "markdown", - "id": "51d4208f", + "id": "6e018b2c", "metadata": {}, "source": [ "A string is a finite, ordered sequence of typographic characters\n", - "(e.g., from an alphabet, like the one thaught at school).\n", + "(e.g., from an alphabet, like the one taught at school).\n", "\n", "Exercises: finite strings using an alphabet $\\Sigma : |\\Sigma| = k$.\n", "\n", @@ -61,7 +51,7 @@ { "cell_type": "code", "execution_count": null, - "id": "20f1dc1b", + "id": "f4eb6153", "metadata": {}, "outputs": [], "source": [ @@ -73,7 +63,7 @@ }, { "cell_type": "markdown", - "id": "78faeb97", + "id": "55f419f4", "metadata": {}, "source": [ "- How many strings of length $m : m \\le n=8$, included the empty string, can you build?" @@ -82,7 +72,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4bb33016", + "id": "981d22fc", "metadata": {}, "outputs": [], "source": [ @@ -92,7 +82,7 @@ }, { "cell_type": "markdown", - "id": "a2f8cce0", + "id": "68ce3e95", "metadata": {}, "source": [ "- 🦾 Can you generalize the solution for any $n$ and $k$? Can you write a mathematical formula for the solution?\n", @@ -103,7 +93,7 @@ { "cell_type": "code", "execution_count": null, - "id": "07b84980", + "id": "481d4afc", "metadata": {}, "outputs": [], "source": [ @@ -115,24 +105,14 @@ }, { "cell_type": "markdown", - "id": "a262c52e", + "id": "a2475a54", "metadata": {}, "source": [ "\n", "\n", "\n", - "The set of all finite strings can be represented with the symbol $\\Sigma^{*}$." - ] - }, - { - "cell_type": "markdown", - "id": "4f1b4043", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ + "The set of all finite strings can be represented with the symbol $\\Sigma^{*}$.\n", + "\n", "----\n", "\n", "### Operations on strings\n", @@ -143,7 +123,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ce496f7a", + "id": "1c29ebdc", "metadata": {}, "outputs": [], "source": [ @@ -153,7 +133,7 @@ }, { "cell_type": "markdown", - "id": "e3549587", + "id": "ad88ef16", "metadata": {}, "source": [ "You can template strings using the so-called \"f-string\" notation:" @@ -162,7 +142,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ae5409fe", + "id": "b6cbe9da", "metadata": {}, "outputs": [], "source": [ @@ -172,7 +152,7 @@ }, { "cell_type": "markdown", - "id": "503dc116", + "id": "4fb25c36", "metadata": {}, "source": [ "Exercise:" @@ -181,7 +161,7 @@ { "cell_type": "code", "execution_count": null, - "id": "567315b7", + "id": "066f7ded", "metadata": {}, "outputs": [], "source": [ @@ -190,12 +170,8 @@ }, { "cell_type": "markdown", - "id": "82ff4965", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "f801c073", + "metadata": {}, "source": [ "---\n", "\n", @@ -203,18 +179,8 @@ "\n", "At school we learnt a 26-letter, A-Z alphabet.\n", "Today, we commonly use a much larger alphabet, featuring:\n", - "lowercase and uppercase letters, numbers, spaces (e.g. \" \", a new line, ), punctuation, emojis, and so on." - ] - }, - { - "cell_type": "markdown", - "id": "e7a210af", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ + "lowercase and uppercase letters, numbers, spaces (e.g. \" \", a new line, ), punctuation, emojis, and so on.\n", + "\n", "----\n", "\n", "To communicate these charactes at the speed of light, we need to\n", @@ -223,18 +189,8 @@ "made to be transmitted using electric signals over a telegraph.\n", "\n", "Nowadays computers represents typographic characters with numbers,\n", - "that are then encoded in sequences of $0$ and $1$ and transmitted using electric signals." - ] - }, - { - "cell_type": "markdown", - "id": "bbfacc44", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ + "that are then encoded in sequences of $0$ and $1$ and transmitted using electric signals.\n", + "\n", "----\n", "\n", "The most common way of mapping characters to integers is the Extended ASCII table.\n", @@ -256,7 +212,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9243a8c7", + "id": "4ba3c65b", "metadata": {}, "outputs": [], "source": [ @@ -267,7 +223,7 @@ { "cell_type": "code", "execution_count": null, - "id": "74e41aaa", + "id": "de1a1caf", "metadata": {}, "outputs": [], "source": [ @@ -277,12 +233,8 @@ }, { "cell_type": "markdown", - "id": "4ba83c4f", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "id": "626497cd", + "metadata": {}, "source": [ "----\n", "\n", @@ -295,7 +247,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1d5c6650", + "id": "21a0436e", "metadata": {}, "outputs": [], "source": [ @@ -306,7 +258,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e15a9640", + "id": "eb5b4b42", "metadata": {}, "outputs": [], "source": [ @@ -317,12 +269,8 @@ }, { "cell_type": "markdown", - "id": "a5e24d67", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "id": "83b3496b", + "metadata": {}, "source": [ "----\n", "\n", @@ -335,7 +283,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ab3f6322", + "id": "4509d360", "metadata": {}, "outputs": [], "source": [ @@ -347,7 +295,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0614ac97", + "id": "215a76a6", "metadata": {}, "outputs": [], "source": [ @@ -361,12 +309,8 @@ }, { "cell_type": "markdown", - "id": "7824de1c", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "1de541ea", + "metadata": {}, "source": [ "---\n", "\n", @@ -383,7 +327,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1e3c8058", + "id": "ca1d5b53", "metadata": {}, "outputs": [], "source": [ @@ -395,7 +339,7 @@ { "cell_type": "code", "execution_count": null, - "id": "914c689a", + "id": "91be3d4d", "metadata": {}, "outputs": [], "source": [ @@ -405,7 +349,7 @@ }, { "cell_type": "markdown", - "id": "1cb52bdf", + "id": "f5787299", "metadata": {}, "source": [ "----" @@ -414,7 +358,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0cf31f3c", + "id": "0421b4ca", "metadata": {}, "outputs": [], "source": [ @@ -425,12 +369,8 @@ }, { "cell_type": "markdown", - "id": "ddcfdb6e", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "id": "57802d43", + "metadata": {}, "source": [ "----\n", "\n", @@ -440,7 +380,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5c238785", + "id": "b9433812", "metadata": {}, "outputs": [], "source": [ @@ -450,7 +390,7 @@ }, { "cell_type": "markdown", - "id": "08b159c0", + "id": "b7422360", "metadata": {}, "source": [ "----" @@ -459,7 +399,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cbfe4621", + "id": "90ef0a81", "metadata": {}, "outputs": [], "source": [ @@ -469,7 +409,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a80b4759", + "id": "10671aea", "metadata": {}, "outputs": [], "source": [ @@ -480,30 +420,20 @@ }, { "cell_type": "markdown", - "id": "2509582f", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "c1d75448", + "metadata": {}, "source": [ "---\n", "\n", - "## Bonus track: Formatting" - ] - }, - { - "cell_type": "markdown", - "id": "89f99c18", - "metadata": {}, - "source": [ + "## Bonus track: Formatting\n", + "\n", "----" ] }, { "cell_type": "code", "execution_count": null, - "id": "9f0d26fd", + "id": "12ae08ee", "metadata": {}, "outputs": [], "source": [ @@ -516,7 +446,7 @@ }, { "cell_type": "markdown", - "id": "7149973e", + "id": "1b1489ae", "metadata": {}, "source": [ "----" @@ -525,7 +455,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2a9f6677", + "id": "6281040d", "metadata": {}, "outputs": [], "source": [ @@ -535,7 +465,7 @@ }, { "cell_type": "markdown", - "id": "db8d47ff", + "id": "d905c51f", "metadata": {}, "source": [ "----" @@ -544,7 +474,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5afb0047", + "id": "4ff16f5d", "metadata": {}, "outputs": [], "source": [ @@ -553,7 +483,7 @@ }, { "cell_type": "markdown", - "id": "57d758d3", + "id": "5d43956a", "metadata": {}, "source": [ "----" @@ -562,7 +492,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14b76188", + "id": "9a0b7de1", "metadata": {}, "outputs": [], "source": [ @@ -575,7 +505,7 @@ }, { "cell_type": "markdown", - "id": "7ed0dc47", + "id": "bfb3aae9", "metadata": {}, "source": [ "----" @@ -584,7 +514,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f4085f81", + "id": "363d1973", "metadata": {}, "outputs": [], "source": [ @@ -597,7 +527,7 @@ }, { "cell_type": "markdown", - "id": "a5c92154", + "id": "a99aa20c", "metadata": {}, "source": [ "----" @@ -606,7 +536,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b5a90f9c", + "id": "7fcec335", "metadata": {}, "outputs": [], "source": [ @@ -615,30 +545,20 @@ }, { "cell_type": "markdown", - "id": "29190241", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "def260a9", + "metadata": {}, "source": [ "---\n", "\n", - "### Formatting with names" - ] - }, - { - "cell_type": "markdown", - "id": "6a4e0b0f", - "metadata": {}, - "source": [ + "### Formatting with names\n", + "\n", "----" ] }, { "cell_type": "code", "execution_count": null, - "id": "d63471d9", + "id": "eeb2194f", "metadata": {}, "outputs": [], "source": [ @@ -651,30 +571,20 @@ }, { "cell_type": "markdown", - "id": "250e2ea7", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "id": "75c39d46", + "metadata": {}, "source": [ "----\n", "\n", - "## Importing functionalities" - ] - }, - { - "cell_type": "markdown", - "id": "180fed37", - "metadata": {}, - "source": [ + "## Importing functionalities\n", + "\n", "----" ] }, { "cell_type": "code", "execution_count": null, - "id": "e7488f26", + "id": "6cf61c20", "metadata": {}, "outputs": [], "source": [ @@ -690,7 +600,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c765e47f", + "id": "5b00b651", "metadata": {}, "outputs": [], "source": [ @@ -702,12 +612,8 @@ }, { "cell_type": "markdown", - "id": "edd7e208", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "id": "acab0774", + "metadata": {}, "source": [ "----\n", "\n", @@ -718,7 +624,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c06a219b", + "id": "68b71460", "metadata": {}, "outputs": [], "source": [ @@ -730,7 +636,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d5caf999", + "id": "2413069c", "metadata": {}, "outputs": [], "source": [ @@ -740,12 +646,8 @@ }, { "cell_type": "markdown", - "id": "ca5ac2f1", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "a8e76389", + "metadata": {}, "source": [ "---\n", "\n", @@ -767,7 +669,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bba060f7", + "id": "8c3ddb85", "metadata": {}, "outputs": [], "source": [ @@ -777,7 +679,7 @@ }, { "cell_type": "markdown", - "id": "5e1f36da", + "id": "bc751afc", "metadata": {}, "source": [ "----" @@ -786,7 +688,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d793ae22", + "id": "6ee7eade", "metadata": {}, "outputs": [], "source": [ @@ -796,12 +698,8 @@ }, { "cell_type": "markdown", - "id": "0181db07", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "id": "5216d5ef", + "metadata": {}, "source": [ "----\n", "\n", @@ -811,21 +709,15 @@ "- python 3 uses the `builtins` module.\n", "\n", "In both cases, you should never use the `__builtins__` module (note the final **s**), because it's implementation dependent.\n", - "For further information on this topic, see [the python execution model documentation](https://docs.python.org/3/reference/executionmodel.html#builtins-and-restricted-execution)" - ] - }, - { - "cell_type": "markdown", - "id": "7d46b6e7", - "metadata": {}, - "source": [ + "For further information on this topic, see [the python execution model documentation](https://docs.python.org/3/reference/executionmodel.html#builtins-and-restricted-execution)\n", + "\n", "----" ] }, { "cell_type": "code", "execution_count": null, - "id": "7a5238f3", + "id": "138e01e7", "metadata": {}, "outputs": [], "source": [ @@ -837,7 +729,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e32914af", + "id": "23440a4a", "metadata": {}, "outputs": [], "source": [ diff --git a/python-high-school/notebooks/10_collections.ipynb b/python-high-school/notebooks/10_collections.ipynb index bf3743d..8cebbf9 100644 --- a/python-high-school/notebooks/10_collections.ipynb +++ b/python-high-school/notebooks/10_collections.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "061bd604", + "id": "2c0917b4", "metadata": {}, "source": [ "# Python for High School\n", @@ -29,7 +29,7 @@ { "cell_type": "code", "execution_count": null, - "id": "07fcd7d5", + "id": "e7b954d1", "metadata": {}, "outputs": [], "source": [ @@ -42,7 +42,7 @@ }, { "cell_type": "markdown", - "id": "6612e07c", + "id": "fa2e0b46", "metadata": {}, "source": [ "Here is an image from Wikipedia:\n", @@ -61,7 +61,7 @@ { "cell_type": "code", "execution_count": null, - "id": "52403912", + "id": "8a27c051", "metadata": {}, "outputs": [], "source": [ @@ -77,7 +77,7 @@ }, { "cell_type": "markdown", - "id": "ed54ea01", + "id": "feafa4cb", "metadata": {}, "source": [ "You can perform basic checks:" @@ -86,7 +86,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9de78d28", + "id": "1a433d38", "metadata": {}, "outputs": [], "source": [ @@ -98,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "b82ce986", + "id": "c3fe015a", "metadata": {}, "source": [ "Exercise: which of the above expressions are true?" @@ -107,7 +107,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8b2909f7", + "id": "a0bd9802", "metadata": {}, "outputs": [], "source": [ @@ -117,7 +117,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1e4ed34d", + "id": "e611d17d", "metadata": {}, "outputs": [], "source": [ @@ -129,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "dd15ce53", + "id": "d89580da", "metadata": {}, "source": [ "Exercise: which of the above expressions are true?" @@ -138,7 +138,7 @@ { "cell_type": "code", "execution_count": null, - "id": "66523aed", + "id": "d066d2cb", "metadata": {}, "outputs": [], "source": [ @@ -147,7 +147,7 @@ }, { "cell_type": "markdown", - "id": "e132f308", + "id": "47fa4ab4", "metadata": {}, "source": [ "Exercise: print the content of the sets." @@ -156,7 +156,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ef6da2aa", + "id": "a1421cad", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "ea7a076f", + "id": "a12317f9", "metadata": {}, "source": [ "## Tuples (Vectors)\n", @@ -187,7 +187,7 @@ { "cell_type": "code", "execution_count": null, - "id": "efc68978", + "id": "73a754fa", "metadata": {}, "outputs": [], "source": [ @@ -197,7 +197,7 @@ }, { "cell_type": "markdown", - "id": "2239d467", + "id": "319f1d15", "metadata": {}, "source": [ "Exercise: print the content of the tuples." @@ -206,7 +206,7 @@ { "cell_type": "code", "execution_count": null, - "id": "63cae630", + "id": "8901c977", "metadata": {}, "outputs": [], "source": [ @@ -215,7 +215,7 @@ }, { "cell_type": "markdown", - "id": "0af41fab", + "id": "7540f9fd", "metadata": {}, "source": [ "Beware: operations on tuples are not the same as operations on vectors!" @@ -224,7 +224,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cba9b02d", + "id": "9948b7af", "metadata": {}, "outputs": [], "source": [ @@ -233,7 +233,7 @@ }, { "cell_type": "markdown", - "id": "9b319ab4", + "id": "9f7d6860", "metadata": {}, "source": [ "Exercise: try to modify the first element of v. What happens?" @@ -242,7 +242,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fb1a59fc", + "id": "18493f10", "metadata": {}, "outputs": [], "source": [ @@ -251,7 +251,7 @@ }, { "cell_type": "markdown", - "id": "94d5f9fc", + "id": "a6e4f24b", "metadata": {}, "source": [ "Tuples are immutable!\n", @@ -266,7 +266,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4fc8979c", + "id": "7f3d1899", "metadata": {}, "outputs": [], "source": [ @@ -277,7 +277,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a0192fd2", + "id": "949d3e6f", "metadata": {}, "outputs": [], "source": [ @@ -289,7 +289,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f6878cfa", + "id": "d1ca964e", "metadata": {}, "outputs": [], "source": [ @@ -300,7 +300,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8caa394e", + "id": "5ba1dff3", "metadata": {}, "outputs": [], "source": [ @@ -310,12 +310,8 @@ }, { "cell_type": "markdown", - "id": "52a822af", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "c3160ded", + "metadata": {}, "source": [ "---\n", "\n", @@ -329,7 +325,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ea25c1b5", + "id": "6deec01a", "metadata": {}, "outputs": [], "source": [ @@ -339,7 +335,7 @@ }, { "cell_type": "markdown", - "id": "e7f06457", + "id": "ec91c100", "metadata": {}, "source": [ "Exercise:\n", @@ -350,7 +346,7 @@ { "cell_type": "code", "execution_count": null, - "id": "04345ec2", + "id": "e845b127", "metadata": {}, "outputs": [], "source": [ @@ -359,7 +355,7 @@ }, { "cell_type": "markdown", - "id": "43b85fc7", + "id": "f9b3dd78", "metadata": {}, "source": [ "- print the `type` of `from_0_to_10`" @@ -368,7 +364,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2304eac8", + "id": "629d87d0", "metadata": {}, "outputs": [], "source": [ @@ -377,7 +373,7 @@ }, { "cell_type": "markdown", - "id": "61d48150", + "id": "0eab0de5", "metadata": {}, "source": [ "We can extract all the elements from a generator using the `list` function." @@ -386,7 +382,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f4ce0751", + "id": "82461aee", "metadata": {}, "outputs": [], "source": [ @@ -399,7 +395,7 @@ { "cell_type": "code", "execution_count": null, - "id": "593d1674", + "id": "032b1be9", "metadata": {}, "outputs": [], "source": [ @@ -408,12 +404,8 @@ }, { "cell_type": "markdown", - "id": "634d4c5d", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "3e670115", + "metadata": {}, "source": [ "---\n", "\n", @@ -423,7 +415,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a02b0b64", + "id": "7ea57001", "metadata": {}, "outputs": [], "source": [ @@ -434,7 +426,7 @@ { "cell_type": "code", "execution_count": null, - "id": "18f189dd", + "id": "7242fa21", "metadata": {}, "outputs": [], "source": [ @@ -445,7 +437,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cbd3080e", + "id": "3b28f7a3", "metadata": {}, "outputs": [], "source": [ @@ -455,7 +447,7 @@ }, { "cell_type": "markdown", - "id": "df9c46f1", + "id": "00ad0000", "metadata": {}, "source": [ "Python lists are doubly linked, so you can get the last element using a negative index." @@ -464,7 +456,7 @@ { "cell_type": "code", "execution_count": null, - "id": "489263d2", + "id": "6cf32b48", "metadata": {}, "outputs": [], "source": [ @@ -475,7 +467,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4737eaaf", + "id": "5f81cfaf", "metadata": {}, "outputs": [], "source": [ @@ -486,12 +478,8 @@ }, { "cell_type": "markdown", - "id": "da88aa2b", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "2a0f99ac", + "metadata": {}, "source": [ "---\n", "\n", @@ -501,7 +489,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fad49284", + "id": "fc12d900", "metadata": {}, "outputs": [], "source": [ @@ -512,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "51040023", + "id": "7c1067e5", "metadata": {}, "source": [ "Python supports slicing, that is, getting a subsequence of a list\n", @@ -538,7 +526,7 @@ { "cell_type": "code", "execution_count": null, - "id": "16b20433", + "id": "d38de1eb", "metadata": {}, "outputs": [], "source": [ @@ -549,7 +537,7 @@ { "cell_type": "code", "execution_count": null, - "id": "16cc2672", + "id": "1b41b808", "metadata": {}, "outputs": [], "source": [ @@ -560,7 +548,7 @@ { "cell_type": "code", "execution_count": null, - "id": "54d96349", + "id": "83803b50", "metadata": {}, "outputs": [], "source": [ @@ -570,7 +558,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c5671c40", + "id": "fb106cf3", "metadata": {}, "outputs": [], "source": [ @@ -579,12 +567,8 @@ }, { "cell_type": "markdown", - "id": "6efed54e", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "01983b57", + "metadata": {}, "source": [ "---\n", "\n", @@ -594,7 +578,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0ec540ed", + "id": "e0c300e5", "metadata": {}, "outputs": [], "source": [ @@ -605,7 +589,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d26e7abb", + "id": "9300c150", "metadata": {}, "outputs": [], "source": [ @@ -617,7 +601,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8bcb10c8", + "id": "6cebe799", "metadata": {}, "outputs": [], "source": [ @@ -628,7 +612,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b09981e9", + "id": "8cf2209c", "metadata": {}, "outputs": [], "source": [ @@ -639,7 +623,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9e1f2618", + "id": "2bceb679", "metadata": {}, "outputs": [], "source": [ @@ -650,12 +634,8 @@ }, { "cell_type": "markdown", - "id": "c50eee29", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "ea9f29cb", + "metadata": {}, "source": [ "---\n", "\n", @@ -667,7 +647,7 @@ { "cell_type": "code", "execution_count": null, - "id": "20ece1fc", + "id": "63ee7765", "metadata": {}, "outputs": [], "source": [ @@ -678,7 +658,7 @@ }, { "cell_type": "markdown", - "id": "c25eb41d", + "id": "2d4f85fc", "metadata": {}, "source": [ "reversed is a generator, so we need to \"materialize\" it into a list to print it." @@ -687,7 +667,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9d4aee75", + "id": "b79f1bd8", "metadata": {}, "outputs": [], "source": [ @@ -696,7 +676,7 @@ }, { "cell_type": "markdown", - "id": "17c9273b", + "id": "a7fa244d", "metadata": {}, "source": [ "\n", @@ -707,7 +687,7 @@ { "cell_type": "code", "execution_count": null, - "id": "48b310e0", + "id": "a4313a7b", "metadata": {}, "outputs": [], "source": [ @@ -718,7 +698,7 @@ }, { "cell_type": "markdown", - "id": "5dfa5803", + "id": "2667128e", "metadata": {}, "source": [ "create the cartesian product of two lists.\n", @@ -737,7 +717,7 @@ { "cell_type": "code", "execution_count": null, - "id": "28677a15", + "id": "6e8891a2", "metadata": {}, "outputs": [], "source": [ @@ -746,7 +726,7 @@ }, { "cell_type": "markdown", - "id": "01292386", + "id": "3254a841", "metadata": {}, "source": [ "or associate pairwise elements using the `zip` function.\n", @@ -767,7 +747,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7667cec7", + "id": "54c2a0d3", "metadata": {}, "outputs": [], "source": [ @@ -777,7 +757,7 @@ }, { "cell_type": "markdown", - "id": "74aba35a", + "id": "5458a4e4", "metadata": {}, "source": [ "Exercise: can you materialize the zip object into a list?\n", @@ -787,7 +767,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cb38d74f", + "id": "c8bdc9e6", "metadata": {}, "outputs": [], "source": [ @@ -796,7 +776,7 @@ }, { "cell_type": "markdown", - "id": "0247baba", + "id": "264f8a1f", "metadata": {}, "source": [ "## The itertools module\n", @@ -807,7 +787,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c337084c", + "id": "7250a6e7", "metadata": {}, "outputs": [], "source": [ @@ -817,7 +797,7 @@ }, { "cell_type": "markdown", - "id": "40d8356a", + "id": "03520762", "metadata": {}, "source": [ "You can create combinations, permutations, and cartesian products." @@ -826,7 +806,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e03109f5", + "id": "70a5444d", "metadata": {}, "outputs": [], "source": [ @@ -839,7 +819,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ebdb9491", + "id": "5dbff86f", "metadata": {}, "outputs": [], "source": [ @@ -850,7 +830,7 @@ }, { "cell_type": "markdown", - "id": "f8e0ab22", + "id": "e61f6de3", "metadata": {}, "source": [ "Exercise: print the content of the above objects." @@ -859,7 +839,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8130cceb", + "id": "1790329f", "metadata": {}, "outputs": [], "source": [ @@ -868,7 +848,7 @@ }, { "cell_type": "markdown", - "id": "158b4ea7", + "id": "875bf5de", "metadata": {}, "source": [ "Combinations are useful to generate all the possible subsets of a set\n", @@ -883,7 +863,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ceef45ce", + "id": "056bead1", "metadata": {}, "outputs": [], "source": [ diff --git a/python-high-school/notebooks/11_iterations.ipynb b/python-high-school/notebooks/11_iterations.ipynb index a1eb784..e656242 100644 --- a/python-high-school/notebooks/11_iterations.ipynb +++ b/python-high-school/notebooks/11_iterations.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "b0fc1a90", + "id": "27af4bb8", "metadata": {}, "source": [ "# Python for High School\n", @@ -23,7 +23,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1a2616b0", + "id": "41418480", "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "markdown", - "id": "fef63d7f", + "id": "946e73f6", "metadata": {}, "source": [ "More complex conditions can be evaluated using multiple lines\n", @@ -43,7 +43,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7a35caea", + "id": "0c7e59f8", "metadata": {}, "outputs": [], "source": [ @@ -60,7 +60,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9f61f360", + "id": "f461837b", "metadata": {}, "outputs": [], "source": [ @@ -70,7 +70,7 @@ }, { "cell_type": "markdown", - "id": "4e6c8706", + "id": "2e47da9f", "metadata": {}, "source": [ "## Iterations: `for`\n", @@ -93,7 +93,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c5f39ce8", + "id": "ddc84d96", "metadata": {}, "outputs": [], "source": [ @@ -104,7 +104,7 @@ }, { "cell_type": "markdown", - "id": "e575bd5c", + "id": "f086d201", "metadata": {}, "source": [ "We can stop the iteration using the `break` instruction." @@ -113,7 +113,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e567d4d3", + "id": "c5ec62d1", "metadata": {}, "outputs": [], "source": [ @@ -126,7 +126,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2301ecd9", + "id": "833519a7", "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "5910eca9", + "id": "5ccaead6", "metadata": {}, "source": [ "Combining `if` and `break` we can stop the iteration when a condition is met." @@ -148,7 +148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1f3b78fe", + "id": "5bf8a400", "metadata": {}, "outputs": [], "source": [ @@ -160,7 +160,7 @@ }, { "cell_type": "markdown", - "id": "c8a4884a", + "id": "43619a5c", "metadata": {}, "source": [ "We can use conditions on other variables" @@ -169,7 +169,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9b10348b", + "id": "ef24692e", "metadata": {}, "outputs": [], "source": [ @@ -183,7 +183,7 @@ }, { "cell_type": "markdown", - "id": "63a0fdf3", + "id": "19ddfdd4", "metadata": {}, "source": [ "Exercise: write a loop that prints all the divisors of $n=100$." @@ -192,7 +192,7 @@ { "cell_type": "code", "execution_count": null, - "id": "939e75ba", + "id": "3dfada91", "metadata": {}, "outputs": [], "source": [ @@ -203,12 +203,8 @@ }, { "cell_type": "markdown", - "id": "78fc2426", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "957dddf9", + "metadata": {}, "source": [ "---\n", "\n", @@ -220,7 +216,7 @@ { "cell_type": "code", "execution_count": null, - "id": "83403da3", + "id": "aa6794e4", "metadata": {}, "outputs": [], "source": [ @@ -232,7 +228,7 @@ }, { "cell_type": "markdown", - "id": "056cc5c1", + "id": "ad853fcf", "metadata": {}, "source": [ "Exercise: complete the code below to write a loop with the same output of the previous cell." @@ -241,7 +237,7 @@ { "cell_type": "code", "execution_count": null, - "id": "012d54a2", + "id": "22cc2367", "metadata": {}, "outputs": [], "source": [ @@ -253,7 +249,7 @@ }, { "cell_type": "markdown", - "id": "92935e07", + "id": "6848fef5", "metadata": {}, "source": [ "Exercise: write a loop that prints all the divisors of $n=100$." @@ -262,7 +258,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12c039f5", + "id": "7a554d3a", "metadata": {}, "outputs": [], "source": [ @@ -276,12 +272,8 @@ }, { "cell_type": "markdown", - "id": "a706a83f", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "399103b4", + "metadata": {}, "source": [ "---\n", "\n", @@ -292,7 +284,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2f42dd66", + "id": "299c42c9", "metadata": {}, "outputs": [], "source": [ @@ -310,7 +302,7 @@ { "cell_type": "code", "execution_count": null, - "id": "09ed2541", + "id": "1b938553", "metadata": {}, "outputs": [], "source": [ @@ -323,12 +315,8 @@ }, { "cell_type": "markdown", - "id": "f98e00fd", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "ee9fdcd6", + "metadata": {}, "source": [ "---\n", "\n", @@ -346,7 +334,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e5935d21", + "id": "37c67e1e", "metadata": {}, "outputs": [], "source": [ @@ -360,18 +348,10 @@ }, { "cell_type": "markdown", - "id": "5802e619", - "metadata": {}, - "source": [ - "1:\n", diff --git a/python-high-school/notebooks/20_plots.ipynb b/python-high-school/notebooks/20_plots.ipynb index 6585053..f0df0e5 100644 --- a/python-high-school/notebooks/20_plots.ipynb +++ b/python-high-school/notebooks/20_plots.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "af3749de", + "id": "077f9234", "metadata": {}, "source": [ "# Plotting\n", @@ -13,7 +13,7 @@ { "cell_type": "code", "execution_count": null, - "id": "96949d04", + "id": "f9c821a2", "metadata": {}, "outputs": [], "source": [ @@ -23,7 +23,7 @@ }, { "cell_type": "markdown", - "id": "befad8c2", + "id": "b9360e9e", "metadata": {}, "source": [ "A computer can't plot a function, it can only plot points. So we need to provide a set of points that are close enough to the function.\n", @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9d1a6d59", + "id": "c6e0e3ec", "metadata": {}, "outputs": [], "source": [ @@ -51,7 +51,7 @@ }, { "cell_type": "markdown", - "id": "e298d611", + "id": "739abde1", "metadata": {}, "source": [ "Now define a domain range and evaluate the function\n", @@ -65,7 +65,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b9a701df", + "id": "966d5194", "metadata": {}, "outputs": [], "source": [ @@ -75,7 +75,7 @@ }, { "cell_type": "markdown", - "id": "8dc60568", + "id": "68b546df", "metadata": {}, "source": [ "Exercises:\n", @@ -86,7 +86,7 @@ { "cell_type": "code", "execution_count": null, - "id": "db18516c", + "id": "cdfe9f97", "metadata": {}, "outputs": [], "source": [ @@ -95,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "3f40f383", + "id": "6656008e", "metadata": {}, "source": [ "- use the `zip` function to print a table pairs\n", @@ -113,7 +113,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0d0bb068", + "id": "dc70ef26", "metadata": {}, "outputs": [], "source": [ @@ -122,7 +122,7 @@ }, { "cell_type": "markdown", - "id": "263960df", + "id": "97297cc9", "metadata": {}, "source": [ "Now we can plot the function providing the two sets" @@ -131,7 +131,7 @@ { "cell_type": "code", "execution_count": null, - "id": "db441e95", + "id": "17b47300", "metadata": {}, "outputs": [], "source": [ @@ -142,7 +142,7 @@ }, { "cell_type": "markdown", - "id": "638f8158", + "id": "8e591455", "metadata": {}, "source": [ "## Geometric plotting\n", @@ -154,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f62c8067", + "id": "ff588ab0", "metadata": {}, "outputs": [], "source": [ @@ -164,7 +164,7 @@ }, { "cell_type": "markdown", - "id": "c68d6786", + "id": "28a7b5b4", "metadata": {}, "source": [ "### Plotting a function" @@ -173,7 +173,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ec9e2c93", + "id": "531045ef", "metadata": {}, "outputs": [], "source": [ @@ -189,7 +189,7 @@ }, { "cell_type": "markdown", - "id": "21cbcafa", + "id": "2bd3bcae", "metadata": {}, "source": [ "I can add another function to the same plot" @@ -198,7 +198,7 @@ { "cell_type": "code", "execution_count": null, - "id": "308f82db", + "id": "f288ed59", "metadata": {}, "outputs": [], "source": [ @@ -209,7 +209,7 @@ }, { "cell_type": "markdown", - "id": "bce4557c", + "id": "98a541b9", "metadata": {}, "source": [ "I can add further functions using `extend`" @@ -218,7 +218,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b15cc2b9", + "id": "1a2088a7", "metadata": {}, "outputs": [], "source": [ @@ -230,7 +230,7 @@ }, { "cell_type": "markdown", - "id": "a4ce283c", + "id": "682b5477", "metadata": {}, "source": [ "sympy supports implicit equations too,\n", @@ -245,7 +245,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7f1502bc", + "id": "c204b9a3", "metadata": {}, "outputs": [], "source": [ diff --git a/python-high-school/notebooks/index.md b/python-high-school/notebooks/index.md new file mode 100644 index 0000000..90c108c --- /dev/null +++ b/python-high-school/notebooks/index.md @@ -0,0 +1,9 @@ +# Index + + +- [notebooks/00_intro.ipynb](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/00_intro.ipynb) +- [notebooks/01_numbers.ipynb](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/01_numbers.ipynb) +- [notebooks/01_strings.ipynb](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/01_strings.ipynb) +- [notebooks/10_collections.ipynb](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/10_collections.ipynb) +- [notebooks/11_iterations.ipynb](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/11_iterations.ipynb) +- [notebooks/20_plots.ipynb](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/python-high-school/notebooks/20_plots.ipynb) From e229e3cd411cf8d40c9969a00c3f496388eed3e3 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Sat, 29 Mar 2025 12:16:56 +0100 Subject: [PATCH 41/52] Fix: #73. Typos (#84) --- python-high-school/00_intro.md | 30 +- python-high-school/10_collections.md | 7 +- python-high-school/notebooks/00_intro.ipynb | 323 ++++++++++++++---- python-high-school/notebooks/01_numbers.ipynb | 69 +++- .../notebooks/10_collections.ipynb | 171 +++++----- 5 files changed, 438 insertions(+), 162 deletions(-) diff --git a/python-high-school/00_intro.md b/python-high-school/00_intro.md index 1222fa6..4dcfaf2 100644 --- a/python-high-school/00_intro.md +++ b/python-high-school/00_intro.md @@ -198,6 +198,16 @@ $$ 1 kibibyte = 1 KiB = 2^{10} B = 1024 B $$ +Exercise: + +- how many KiB are in 1KB? + +```python +# Use this cell for the exercise. +one_KB = 1e3 +one_KB_in_KiB = ... +``` + Nowadays it is very important to know the difference between the two units: when you buy an hard disk of 500GB, you are getting only 465GiB! @@ -207,21 +217,25 @@ Exercise: - you bought a 1TB hard disk: how many bytes can you store on it? - ```python - # Use this cell for the exercise. - size_B = ... - ``` +```python +# Use this cell for the exercise. +size_B = ... +``` - How many GiB can you store on it? Hint: reuse the `size_B` variable. - ```python - # Use this cell for the exercise. - size_GiB = ... - ``` +```python +# Use this cell for the exercise. +size_GiB = ... +``` - check the advertised size of your devices (phone, tablet, computer) and compute the difference between the one in $GiB$. +```python +# Use this cell for the exercise +``` + --- ### Representing numbers diff --git a/python-high-school/10_collections.md b/python-high-school/10_collections.md index c8d61c6..8462afa 100644 --- a/python-high-school/10_collections.md +++ b/python-high-school/10_collections.md @@ -20,12 +20,17 @@ In maths, a set is a collection of distinct objects. ```python # In python you can create sets. -EMPTY = {} # ø is the empty set A = {1, 2, 3} B = {3, 4, 5, "a"} # sets can contain different types C = { A } # a set can contain other sets ``` +The empty set can be created using `set()`. + +```python +EMPTY = set() # ø is the empty set +``` + Here is an image from Wikipedia: [![Set Theory Operations](https://upload.wikimedia.org/wikipedia/commons/0/04/Set_Theory_Operations.svg)](https://en.wikipedia.org/wiki/Set_(mathematics)#/media/File:Set_Theory_Operations.svg) diff --git a/python-high-school/notebooks/00_intro.ipynb b/python-high-school/notebooks/00_intro.ipynb index 592787b..5d3d432 100644 --- a/python-high-school/notebooks/00_intro.ipynb +++ b/python-high-school/notebooks/00_intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "5b7741e7", + "id": "9be61e7d", "metadata": {}, "source": [ "# Python for High School\n", @@ -65,17 +65,25 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "92061b6e", + "execution_count": 1, + "id": "d5302fe8", "metadata": {}, "outputs": [], "source": [ "# Add a new python cell with ALT+ENTER." ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "40d01b61-3856-4981-9671-ac616ad95e91", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", - "id": "c0cbd56f", + "id": "baa59643", "metadata": {}, "source": [ "---\n", @@ -88,19 +96,41 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "b47f3f58", - "metadata": {}, - "outputs": [], + "execution_count": 2, + "id": "1da947e7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
a string and the number 1\n",
+       "
\n" + ], + "text/plain": [ + "a string and the number \u001b[1;36m1\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# You can evaluate maths and strings\n", "s = 1\n", "print(\"a string and the number \" + str(s))" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "b03178cc-2ee9-41c8-9157-19bb103e6562", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", - "id": "6db70303", + "id": "ec0c8485", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -108,10 +138,24 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "187fbbd7", - "metadata": {}, - "outputs": [], + "execution_count": 3, + "id": "6e2787be", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
now s is increased 2\n",
+       "
\n" + ], + "text/plain": [ + "now s is increased \u001b[1;36m2\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Evaluate this cell with SHIFT+ENTER\n", "s = s + 1\n", @@ -120,7 +164,7 @@ }, { "cell_type": "markdown", - "id": "58c63516", + "id": "91c1e21f", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -149,10 +193,24 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "05c0c39a", - "metadata": {}, - "outputs": [], + "execution_count": 4, + "id": "5ba046a2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Hello world!\n",
+       "
\n" + ], + "text/plain": [ + "Hello world!\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# you can print with the print() function\n", "print(\"Hello world!\")" @@ -160,10 +218,24 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8b9f7b7e", - "metadata": {}, - "outputs": [], + "execution_count": 5, + "id": "8933c226", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Hello World!\n",
+       "
\n" + ], + "text/plain": [ + "Hello World!\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# concatenate strings with a + sign\n", "# and using hex notation\n", @@ -172,17 +244,31 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "899eaa68", - "metadata": {}, - "outputs": [], + "execution_count": 6, + "id": "82ba83fa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Ciao\n",
+       "
\n" + ], + "text/plain": [ + "Ciao\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "print(\"Ciao\")" ] }, { "cell_type": "markdown", - "id": "9e28c880", + "id": "6e8113ff", "metadata": {}, "source": [ "---\n", @@ -194,8 +280,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "385e68a9", + "execution_count": 7, + "id": "4599c3b0", "metadata": {}, "outputs": [], "source": [ @@ -207,7 +293,7 @@ }, { "cell_type": "markdown", - "id": "5385d737", + "id": "ae52e7fc", "metadata": {}, "source": [ "----" @@ -215,17 +301,32 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "5a3db11f", - "metadata": {}, - "outputs": [], - "source": [ - "# Exercise: use the print() function to print the value of a, b and c.\n" + "execution_count": 8, + "id": "3f304468", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
1 16.0 120.0\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[1;36m1\u001b[0m \u001b[1;36m16.0\u001b[0m \u001b[1;36m120.0\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Exercise: use the print() function to print the value of a, b and c.\n", + "print(a,b,c)" ] }, { "cell_type": "markdown", - "id": "7bef173f", + "id": "dbba9e33", "metadata": {}, "source": [ "----" @@ -234,7 +335,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c2b70311", + "id": "6d64c603", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +346,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a66ea20e", + "id": "a9c09c67", "metadata": {}, "outputs": [], "source": [ @@ -256,7 +357,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d1e46033", + "id": "a86f24ba", "metadata": {}, "outputs": [], "source": [ @@ -266,7 +367,7 @@ }, { "cell_type": "markdown", - "id": "31be427c", + "id": "a4ac5880", "metadata": {}, "source": [ "----" @@ -275,7 +376,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9213f847", + "id": "3fec6b0b", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +386,7 @@ }, { "cell_type": "markdown", - "id": "f1eca02c", + "id": "bfdcbd9d", "metadata": {}, "source": [ "Exercise: use the cell below to compute the following values:\n", @@ -298,7 +399,7 @@ { "cell_type": "code", "execution_count": null, - "id": "81b0f702", + "id": "17af3368", "metadata": {}, "outputs": [], "source": [ @@ -307,7 +408,7 @@ }, { "cell_type": "markdown", - "id": "17192738", + "id": "7662ecd8", "metadata": {}, "source": [ "---\n", @@ -336,6 +437,28 @@ "1 kibibyte = 1 KiB = 2^{10} B = 1024 B\n", "$$\n", "\n", + "Exercise:\n", + "\n", + "- how many KiB are in 1KB?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "483b0763", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise.\n", + "one_KB = 1e3\n", + "one_KB_in_KiB = ... " + ] + }, + { + "cell_type": "markdown", + "id": "c3facb1a", + "metadata": {}, + "source": [ "Nowadays it is very important to know the difference between the two units:\n", "when you buy an hard disk of 500GB, you are getting only 465GiB!\n", "\n", @@ -343,23 +466,63 @@ "\n", "Exercise:\n", "\n", - "- you bought a 1TB hard disk: how many bytes can you store on it?\n", - "\n", - " ```python\n", - " # Use this cell for the exercise.\n", - " size_B = ...\n", - " ```\n", - "\n", - "- How many GiB can you store on it? Hint: reuse the `size_B` variable.\n", - "\n", - " ```python\n", - " # Use this cell for the exercise.\n", - " size_GiB = ...\n", - " ```\n", - "\n", + "- you bought a 1TB hard disk: how many bytes can you store on it?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfbcc0c2", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise.\n", + "size_B = ..." + ] + }, + { + "cell_type": "markdown", + "id": "7f01f070", + "metadata": {}, + "source": [ + "- How many GiB can you store on it? Hint: reuse the `size_B` variable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5115d2c9", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise.\n", + "size_GiB = ..." + ] + }, + { + "cell_type": "markdown", + "id": "359d464e", + "metadata": {}, + "source": [ "- check the advertised size of your devices (phone, tablet, computer)\n", - " and compute the difference between the one in $GiB$.\n", - "\n", + " and compute the difference between the one in $GiB$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19e62eb1", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise" + ] + }, + { + "cell_type": "markdown", + "id": "3aedd6f4", + "metadata": {}, + "source": [ "---\n", "\n", "### Representing numbers\n", @@ -418,7 +581,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ab441c0d", + "id": "009e301d", "metadata": {}, "outputs": [], "source": [ @@ -430,7 +593,7 @@ }, { "cell_type": "markdown", - "id": "b64b8d4f", + "id": "e1658c32", "metadata": {}, "source": [ "Exercise:" @@ -439,7 +602,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3fc85e9a", + "id": "0dcef673", "metadata": {}, "outputs": [], "source": [ @@ -448,7 +611,7 @@ }, { "cell_type": "markdown", - "id": "64c2ca93", + "id": "08ec1696", "metadata": {}, "source": [ "Questions:\n", @@ -465,7 +628,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bbb683f6", + "id": "fde857b9", "metadata": {}, "outputs": [], "source": [ @@ -477,7 +640,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d01ba523", + "id": "fc87f674", "metadata": {}, "outputs": [], "source": [ @@ -489,7 +652,7 @@ { "cell_type": "code", "execution_count": null, - "id": "139a7229", + "id": "b1e50073", "metadata": {}, "outputs": [], "source": [ @@ -499,7 +662,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2ddc0ad1", + "id": "49f24eed", "metadata": {}, "outputs": [], "source": [ @@ -509,14 +672,32 @@ }, { "cell_type": "markdown", - "id": "626aff5b", + "id": "ac248172", "metadata": {}, "source": [ "---" ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, "nbformat": 4, "nbformat_minor": 5 } diff --git a/python-high-school/notebooks/01_numbers.ipynb b/python-high-school/notebooks/01_numbers.ipynb index 9eb9f3f..286f329 100644 --- a/python-high-school/notebooks/01_numbers.ipynb +++ b/python-high-school/notebooks/01_numbers.ipynb @@ -19,10 +19,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "bc655893", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
0b11 is the binary representation of 3\n",
+       "
\n" + ], + "text/plain": [ + "0b11 is the binary representation of \u001b[1;36m3\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "a = 3\n", "print(f\"{a:#b} is the binary representation of {a}\")" @@ -101,10 +115,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "1885db72", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
0b00000011 is the binary representation of 3\n",
+       "
\n" + ], + "text/plain": [ + "0b00000011 is the binary representation of \u001b[1;36m3\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
0b00111101 is the binary representation of 61\n",
+       "
\n" + ], + "text/plain": [ + "0b00111101 is the binary representation of \u001b[1;36m61\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "a=3\n", "print(f\"{a:#010b} is the binary representation of {a}\")\n", @@ -465,7 +506,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, "nbformat": 4, "nbformat_minor": 5 } diff --git a/python-high-school/notebooks/10_collections.ipynb b/python-high-school/notebooks/10_collections.ipynb index 8cebbf9..61157c1 100644 --- a/python-high-school/notebooks/10_collections.ipynb +++ b/python-high-school/notebooks/10_collections.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2c0917b4", + "id": "15faf232", "metadata": {}, "source": [ "# Python for High School\n", @@ -29,12 +29,11 @@ { "cell_type": "code", "execution_count": null, - "id": "e7b954d1", + "id": "e3a0ff50", "metadata": {}, "outputs": [], "source": [ "# In python you can create sets.\n", - "EMPTY = {} # ø is the empty set\n", "A = {1, 2, 3}\n", "B = {3, 4, 5, \"a\"} # sets can contain different types\n", "C = { A } # a set can contain other sets" @@ -42,7 +41,25 @@ }, { "cell_type": "markdown", - "id": "fa2e0b46", + "id": "40b82a5b", + "metadata": {}, + "source": [ + "The empty set can be created using `set()`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45f3a536", + "metadata": {}, + "outputs": [], + "source": [ + "EMPTY = set() # ø is the empty set" + ] + }, + { + "cell_type": "markdown", + "id": "59bd1b5b", "metadata": {}, "source": [ "Here is an image from Wikipedia:\n", @@ -61,7 +78,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8a27c051", + "id": "1506ea78", "metadata": {}, "outputs": [], "source": [ @@ -77,7 +94,7 @@ }, { "cell_type": "markdown", - "id": "feafa4cb", + "id": "37e711fe", "metadata": {}, "source": [ "You can perform basic checks:" @@ -86,7 +103,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1a433d38", + "id": "19e8b81d", "metadata": {}, "outputs": [], "source": [ @@ -98,7 +115,7 @@ }, { "cell_type": "markdown", - "id": "c3fe015a", + "id": "691d1785", "metadata": {}, "source": [ "Exercise: which of the above expressions are true?" @@ -107,7 +124,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a0bd9802", + "id": "8ca6eb95", "metadata": {}, "outputs": [], "source": [ @@ -117,7 +134,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e611d17d", + "id": "d040863c", "metadata": {}, "outputs": [], "source": [ @@ -129,7 +146,7 @@ }, { "cell_type": "markdown", - "id": "d89580da", + "id": "fecadcbb", "metadata": {}, "source": [ "Exercise: which of the above expressions are true?" @@ -138,7 +155,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d066d2cb", + "id": "f97fb272", "metadata": {}, "outputs": [], "source": [ @@ -147,7 +164,7 @@ }, { "cell_type": "markdown", - "id": "47fa4ab4", + "id": "6649705d", "metadata": {}, "source": [ "Exercise: print the content of the sets." @@ -156,7 +173,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a1421cad", + "id": "f233b2d0", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +182,7 @@ }, { "cell_type": "markdown", - "id": "a12317f9", + "id": "4fb0b5d5", "metadata": {}, "source": [ "## Tuples (Vectors)\n", @@ -187,7 +204,7 @@ { "cell_type": "code", "execution_count": null, - "id": "73a754fa", + "id": "44a1edb2", "metadata": {}, "outputs": [], "source": [ @@ -197,7 +214,7 @@ }, { "cell_type": "markdown", - "id": "319f1d15", + "id": "0c86056a", "metadata": {}, "source": [ "Exercise: print the content of the tuples." @@ -206,7 +223,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8901c977", + "id": "a458c38b", "metadata": {}, "outputs": [], "source": [ @@ -215,7 +232,7 @@ }, { "cell_type": "markdown", - "id": "7540f9fd", + "id": "38ff70e7", "metadata": {}, "source": [ "Beware: operations on tuples are not the same as operations on vectors!" @@ -224,7 +241,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9948b7af", + "id": "233651a2", "metadata": {}, "outputs": [], "source": [ @@ -233,7 +250,7 @@ }, { "cell_type": "markdown", - "id": "9f7d6860", + "id": "63248768", "metadata": {}, "source": [ "Exercise: try to modify the first element of v. What happens?" @@ -242,7 +259,7 @@ { "cell_type": "code", "execution_count": null, - "id": "18493f10", + "id": "5b656bcd", "metadata": {}, "outputs": [], "source": [ @@ -251,7 +268,7 @@ }, { "cell_type": "markdown", - "id": "a6e4f24b", + "id": "d9a45858", "metadata": {}, "source": [ "Tuples are immutable!\n", @@ -266,7 +283,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7f3d1899", + "id": "4dbe03f2", "metadata": {}, "outputs": [], "source": [ @@ -277,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "949d3e6f", + "id": "27473fd4", "metadata": {}, "outputs": [], "source": [ @@ -289,7 +306,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d1ca964e", + "id": "1c9d98f1", "metadata": {}, "outputs": [], "source": [ @@ -300,7 +317,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5ba1dff3", + "id": "1d985e1b", "metadata": {}, "outputs": [], "source": [ @@ -310,7 +327,7 @@ }, { "cell_type": "markdown", - "id": "c3160ded", + "id": "c93223c5", "metadata": {}, "source": [ "---\n", @@ -325,7 +342,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6deec01a", + "id": "2aabb25d", "metadata": {}, "outputs": [], "source": [ @@ -335,7 +352,7 @@ }, { "cell_type": "markdown", - "id": "ec91c100", + "id": "2b750def", "metadata": {}, "source": [ "Exercise:\n", @@ -346,7 +363,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e845b127", + "id": "618271ab", "metadata": {}, "outputs": [], "source": [ @@ -355,7 +372,7 @@ }, { "cell_type": "markdown", - "id": "f9b3dd78", + "id": "b84c4816", "metadata": {}, "source": [ "- print the `type` of `from_0_to_10`" @@ -364,7 +381,7 @@ { "cell_type": "code", "execution_count": null, - "id": "629d87d0", + "id": "d4a56ea2", "metadata": {}, "outputs": [], "source": [ @@ -373,7 +390,7 @@ }, { "cell_type": "markdown", - "id": "0eab0de5", + "id": "3c6c3f44", "metadata": {}, "source": [ "We can extract all the elements from a generator using the `list` function." @@ -382,7 +399,7 @@ { "cell_type": "code", "execution_count": null, - "id": "82461aee", + "id": "3eb169ce", "metadata": {}, "outputs": [], "source": [ @@ -395,7 +412,7 @@ { "cell_type": "code", "execution_count": null, - "id": "032b1be9", + "id": "ef815131", "metadata": {}, "outputs": [], "source": [ @@ -404,7 +421,7 @@ }, { "cell_type": "markdown", - "id": "3e670115", + "id": "3ce4e102", "metadata": {}, "source": [ "---\n", @@ -415,7 +432,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7ea57001", + "id": "3c058695", "metadata": {}, "outputs": [], "source": [ @@ -426,7 +443,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7242fa21", + "id": "71126879", "metadata": {}, "outputs": [], "source": [ @@ -437,7 +454,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3b28f7a3", + "id": "86aa0ddb", "metadata": {}, "outputs": [], "source": [ @@ -447,7 +464,7 @@ }, { "cell_type": "markdown", - "id": "00ad0000", + "id": "f172c472", "metadata": {}, "source": [ "Python lists are doubly linked, so you can get the last element using a negative index." @@ -456,7 +473,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6cf32b48", + "id": "d8f4c3dc", "metadata": {}, "outputs": [], "source": [ @@ -467,7 +484,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5f81cfaf", + "id": "23290e8a", "metadata": {}, "outputs": [], "source": [ @@ -478,7 +495,7 @@ }, { "cell_type": "markdown", - "id": "2a0f99ac", + "id": "96658df7", "metadata": {}, "source": [ "---\n", @@ -489,7 +506,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fc12d900", + "id": "5692e868", "metadata": {}, "outputs": [], "source": [ @@ -500,7 +517,7 @@ }, { "cell_type": "markdown", - "id": "7c1067e5", + "id": "b4779833", "metadata": {}, "source": [ "Python supports slicing, that is, getting a subsequence of a list\n", @@ -526,7 +543,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d38de1eb", + "id": "7258acc6", "metadata": {}, "outputs": [], "source": [ @@ -537,7 +554,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1b41b808", + "id": "07e0c0a4", "metadata": {}, "outputs": [], "source": [ @@ -548,7 +565,7 @@ { "cell_type": "code", "execution_count": null, - "id": "83803b50", + "id": "b074d109", "metadata": {}, "outputs": [], "source": [ @@ -558,7 +575,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fb106cf3", + "id": "db36f0d7", "metadata": {}, "outputs": [], "source": [ @@ -567,7 +584,7 @@ }, { "cell_type": "markdown", - "id": "01983b57", + "id": "f75c4ed8", "metadata": {}, "source": [ "---\n", @@ -578,7 +595,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e0c300e5", + "id": "cb7cc47a", "metadata": {}, "outputs": [], "source": [ @@ -589,7 +606,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9300c150", + "id": "81244998", "metadata": {}, "outputs": [], "source": [ @@ -601,7 +618,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6cebe799", + "id": "68258eb2", "metadata": {}, "outputs": [], "source": [ @@ -612,7 +629,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8cf2209c", + "id": "84a5c102", "metadata": {}, "outputs": [], "source": [ @@ -623,7 +640,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2bceb679", + "id": "957f04b2", "metadata": {}, "outputs": [], "source": [ @@ -634,7 +651,7 @@ }, { "cell_type": "markdown", - "id": "ea9f29cb", + "id": "412af754", "metadata": {}, "source": [ "---\n", @@ -647,7 +664,7 @@ { "cell_type": "code", "execution_count": null, - "id": "63ee7765", + "id": "d86bc751", "metadata": {}, "outputs": [], "source": [ @@ -658,7 +675,7 @@ }, { "cell_type": "markdown", - "id": "2d4f85fc", + "id": "b8daa561", "metadata": {}, "source": [ "reversed is a generator, so we need to \"materialize\" it into a list to print it." @@ -667,7 +684,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b79f1bd8", + "id": "3499a6e6", "metadata": {}, "outputs": [], "source": [ @@ -676,7 +693,7 @@ }, { "cell_type": "markdown", - "id": "a7fa244d", + "id": "9b60d8cd", "metadata": {}, "source": [ "\n", @@ -687,7 +704,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a4313a7b", + "id": "014c5f6c", "metadata": {}, "outputs": [], "source": [ @@ -698,7 +715,7 @@ }, { "cell_type": "markdown", - "id": "2667128e", + "id": "7f9f712b", "metadata": {}, "source": [ "create the cartesian product of two lists.\n", @@ -717,7 +734,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6e8891a2", + "id": "3004771a", "metadata": {}, "outputs": [], "source": [ @@ -726,7 +743,7 @@ }, { "cell_type": "markdown", - "id": "3254a841", + "id": "47a4a7c5", "metadata": {}, "source": [ "or associate pairwise elements using the `zip` function.\n", @@ -747,7 +764,7 @@ { "cell_type": "code", "execution_count": null, - "id": "54c2a0d3", + "id": "48037286", "metadata": {}, "outputs": [], "source": [ @@ -757,7 +774,7 @@ }, { "cell_type": "markdown", - "id": "5458a4e4", + "id": "ec430981", "metadata": {}, "source": [ "Exercise: can you materialize the zip object into a list?\n", @@ -767,7 +784,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c8bdc9e6", + "id": "41d72612", "metadata": {}, "outputs": [], "source": [ @@ -776,7 +793,7 @@ }, { "cell_type": "markdown", - "id": "264f8a1f", + "id": "04df0f8a", "metadata": {}, "source": [ "## The itertools module\n", @@ -787,7 +804,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7250a6e7", + "id": "2eb8a05d", "metadata": {}, "outputs": [], "source": [ @@ -797,7 +814,7 @@ }, { "cell_type": "markdown", - "id": "03520762", + "id": "8089ffaf", "metadata": {}, "source": [ "You can create combinations, permutations, and cartesian products." @@ -806,7 +823,7 @@ { "cell_type": "code", "execution_count": null, - "id": "70a5444d", + "id": "fb1cbb40", "metadata": {}, "outputs": [], "source": [ @@ -819,7 +836,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5dbff86f", + "id": "e6e3e32e", "metadata": {}, "outputs": [], "source": [ @@ -830,7 +847,7 @@ }, { "cell_type": "markdown", - "id": "e61f6de3", + "id": "cbcf7203", "metadata": {}, "source": [ "Exercise: print the content of the above objects." @@ -839,7 +856,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1790329f", + "id": "c73ba487", "metadata": {}, "outputs": [], "source": [ @@ -848,7 +865,7 @@ }, { "cell_type": "markdown", - "id": "875bf5de", + "id": "23a5841f", "metadata": {}, "source": [ "Combinations are useful to generate all the possible subsets of a set\n", @@ -863,7 +880,7 @@ { "cell_type": "code", "execution_count": null, - "id": "056bead1", + "id": "1c4bd685", "metadata": {}, "outputs": [], "source": [ From 87e8ba78cee53fe94734b2b4ba5e52faff888f6b Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Wed, 2 Apr 2025 22:27:51 +0200 Subject: [PATCH 42/52] Fix: #83. Tutorial teaser (#85) --- sparql-101/00-teaser.md | 201 ++++++++++++++++++++ sparql-101/01-intro-jsonld.md | 339 +++++++++++++++++++++++++++++----- sparql-101/notebooks/tools.py | 116 ++++++++++++ 3 files changed, 608 insertions(+), 48 deletions(-) create mode 100644 sparql-101/00-teaser.md create mode 100644 sparql-101/notebooks/tools.py diff --git a/sparql-101/00-teaser.md b/sparql-101/00-teaser.md new file mode 100644 index 0000000..3c83135 --- /dev/null +++ b/sparql-101/00-teaser.md @@ -0,0 +1,201 @@ +# Knowledge Management 101 + +Welcome to the Knowledge Management 101 course! +Author: + +--- + +## Introducing Python + +Python is an interpreted, object oriented language with +a lot of built in features. +It can be used as a calculator and for mathematical operations, +such as statistics, plotting and linear algebra. + +This is a fast-track course for high school students with math knowledge. + +Students are expected to type and execute cells, and share their results. + +You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb). + +--- + +# Jupyter + +Is the course environment in your browser. +It requires a modern browser and an internet connection supporting +websockets. If your network setup (e.g. your proxy) +does not support websockets, you will not be able to +execute the code. + +--- + +While you might find the exercises' solutions in the environment, +it is important for you to spend some time trying to do your homework! +This will help you to remember the concepts and to learn how to use the tools. + +--- + +## What can I do with Jupyter? + +You can: + +- execute the next cell with `SHIFT+ENTER` (try it now!) + +If your environment supports it, you can use features requiring +operating system access: + +- [open a (named) terminal on the local machine](/terminals/example) +- [edit an existing file](/edit/notebooks/untitled.txt) + +--- + +- add more cells with `ALT+ENTER` + +---- + +Try to add a cell below this one and write some text in it. + +```python +# Add a new python cell with ALT+ENTER. +``` + +--- + +## Python terminal + +With Jupyter, you have a Python terminal at your disposal. +You can run Python code: + +```python +# You can evaluate maths and strings +s = 1 +print("a string and the number " + str(s)) +``` + +Jupyter remembers the variables you define in a cell, so you can use them in the next cells. + +```python +# Evaluate this cell with SHIFT+ENTER +s = s + 1 +print("now s is increased " + str(s)) +``` + +Since Jupyter remembers the variables, you can run the cells in any order you want. +This means that sometimes, you need to "reset" the environment, to start from scratch. + +This can be done with the "Kernel > Restart" or "Kernel > Restart & Clear output" menu. + +---- + +## Agenda + +- 1h. What is semantics and how to describe information in a + meaningful (and machine-readable) way using RDF. + +- 1h. Storing data or describing knowledge? + Practical use of getting security insights from data. + +- Bonus track: Graphs and semantic search: mixing graphs and vector databases + +## Teaser + +In this course, we will learn how to describe information in a +machine-readable way using RDF. + +```python +%pip install rdflib bokeh +``` + +For example network of persons: + +```python +from rdflib import Graph +from rdflib.namespace import FOAF, OWL + +sentences = """ +PREFIX owl: +PREFIX foaf: +PREFIX : + +:Homer foaf:knows :Marge, :Lisa, :Bart, :Maggie; + foaf:interest ; + foaf:firstName "Homer". + +:Lisa foaf:firstName "Lisa"; + foaf:interest . + +""" + +g = Graph() +g.parse(data=sentences, format="text/turtle") +``` + +... eventually rendered as a graph ... + +```python +from tools import plot_graph +plot_graph(g, label_property=FOAF.firstName) +``` + +Convert it in [JSON-LD](https://json-ld.org/) format: + +```python +json_text = g.serialize(format="application/ld+json") +print(json_text) +``` + +There's plenty of knowledge in the web! + +```python +from rdflib import Graph +from rdflib.namespace import RDFS +import networkx as nx + +g = Graph() +g.parse("https://dbpedia.org/data/Tortellini.n3", format="n3") +plot_graph(g, label_property=RDFS.label, layout=nx.shell_layout, limit=60, filter=".*/dbpedia.org") +``` + +And we can connect them together + +```python +# Extend our graph +g.parse("https://dbpedia.org/data/Tagliatelle.n3", format="n3") + +plot_graph(g, label_property=RDFS.label, layout=nx.shell_layout, limit=30, filter=".*/dbpedia.org") +``` + +We can also query the graph for Italian food + +```python +g.query(""" +PREFIX dbo: +PREFIX dbr: + +SELECT DISTINCT ?s +WHERE { + ?s a dbo:Food ; + ?p dbr:Italy . +} +""" +).bindings +``` + +Or ask what do some items have in common + +```python +g.query(""" +PREFIX dbo: + +SELECT DISTINCT ?t +WHERE { + ?s a dbo:Food . + ?q a dbo:Food . + ?s ?p ?t . + ?q ?p ?t . + FILTER (?s != ?q) +} +""" +).bindings +``` diff --git a/sparql-101/01-intro-jsonld.md b/sparql-101/01-intro-jsonld.md index a663142..a33a449 100644 --- a/sparql-101/01-intro-jsonld.md +++ b/sparql-101/01-intro-jsonld.md @@ -1,14 +1,15 @@ -# Modeling Semantic APIs +# Knowledge Management 101 ## Agenda +- Knowledge management - Semantics what? - Triples & co - Attaching semantics - Graph databases - JsonLD -*Beware*: commands contain small typos. You must fix them to properly complete the course! +*Beware*: commands may contain small typos. You have to fix them to properly complete the course! ---- @@ -20,59 +21,304 @@ Prerequisites: --- +## Intro: What is knowledge? + +Knowledge is a set of information that is useful for a given purpose. + +We express knowledge through language and symbols +in various forms: text, images, and sounds. + +To use knowledge we need to: + +- sense; +- interpret; +- understand. + +When reading a book, for example, we not only need to read and understand the words, +but also to interpret the meaning of the sentences and paragraphs +based on the context and our previous knowledge. + +---- + +## Intro: The Encyclopedia + +The Encyclopedia was one of the first attempts to organize knowledge, +and to make it available to the public. + +Today, we have various encyclopedias on the web, +such as Wikipedia and dbpedia. + +Exercise: open the "Python" page on dbpedia: + +- https://dbpedia.org/page/Python_(programming_language) + +And on Wikidata: + +- https://www.wikidata.org/wiki/Q28865 + +---- + +## Intro: The Encyclopedia + +Knowledge is organized in a graph structure, +where each node is a concept and the edges are the relationships between them. + +```mermaid +graph LR + +subgraph dbpedia[DBpedia] + dbr:Python[Python] -->|designer| dbr:gvr[Guido van Rossum] + dbr:Python[Python] -->|operating System| dbr:win[Windows] & dbr:linux[Linux] & ... + dbr:gvr -->|born| dbr:nl[Netherlands] +end + +subgraph wikidata[WikiData] + wd:Q30942[Guido van Rossum] ---|developer| wd:Q28865[Python] + wd:Q16402[Monty Python] ---|named after| wd:Q28865 +end + +wd:Q28865 -.-|same as| dbr:Python +wd:Q30942 -.-|same as| dbr:gvr +``` + +This is the basis of the Semantic Web, +where knowledge is represented in a machine-readable format, +but it is also the basis of the Web itself +(e.g., see [Web Linking RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288)). + +---- + +## Intro: The Encyclopedia + +The above graph can be expressed by sentences such as: + +- Python is named after Monty Python. +- Guido van Rossum is the designer of Python. +- Python runs on Linux. + +their general form is + +```mermaid +graph LR +subject((subject)) --- predicate(predicate) --> object +``` + +## Intro: The Encyclopedia + +Encyclopedia voices on Wikipedia and dbpedia are expressed in +[Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/). + +It is a formal language to represent knowledge in a machine-readable format +using triples of the form `subject predicate object`. + +Let's translate the above definition from English to RDF: + +> Tortellini are a typical Italian food, +>
made with pasta filled with meat such as prosciutto. + +becomes something like + +```turtle +:Tortellini a :Food . +:Tortellini :country dbr:Italy . +:Tortellini :relatedTo dbr:Prosciutto . +``` + +## Exercise: Get a voice from dbpedia + +Now, let's get the actual voice from dbpedia +using the python RDF library. + +```python +# Get a voice from dbpedia using rdflib +from rdflib import Graph + +# What's Tortellini? +g = Graph() +g.parse("https://dbpedia.org/data/Tortellini.ttl", format="turtle") +``` + +We get a graph with the information about Tortellini. + +```mermaid +graph LR + subgraph dbpedia[DBpedia] + dbr:Tortellini[Tortellini] -->|is a| dbo:Food[Food] + dbr:Tortellini -->|related to| dbr:Prosciutto[Prosciutto] + dbr:Tortellini -->|country| dbp:Italy[Italy] + ... + end +``` + +An encyclopedia voice contains a list of sentences :) + +```python +# List all the details about Tortellini. +sentences = list(g) + +print('\n'.join([str(s) for s in sentences])) +``` + +Exercise: + +- how many sentences are there? +- how many elements does each sentence have? + + +---- + +```python +from rdflib.namespace import RDF, RDFS, FOAF + +# Now we get specific properties from the graph. +_type = list(g.objects(predicate=RDF.type)) +print(_type) +``` + + +```python +import rdflib +from rdflib.extras.external_graph_libs import rdflib_to_networkx_multidigraph +import networkx as nx +import matplotlib.pyplot as plt + +G = rdflib_to_networkx_multidigraph(g) + +# Plot Networkx instance of RDF Graph +pos = nx.spring_layout(G, scale=2) +edge_labels = nx.get_edge_attributes(G, 'r') +nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels) +nx.draw(G, with_labels=True) + +#if not in interactive mode for +plt.show() + +``` + ## Intro: Semantics what? Semantics: the study of meaning. -Semantics ensures that a message is understood. +Semantics ensures that a message is understood; +messages include data and HTTP exchanges. -``` -name: Mario Romildo +Here are some ambiguous messages: + +```yaml +name: FABIANO Romildo +income: 4_000_000 ``` Is this a given name or a full name? +What is the currency of the income? +Is it a monthly or yearly income? + +---- + +Integrating data from different sources is difficult because of the lack of semantic interoperability. + + +```mermaid +graph LR +Am>"{name: FABIANO Romildo\nincome: 4_000_000}"] +Cm>"{givenName: FABIANO\nfamilyName: Romildo\ntax: 12_000EUR}"] +B((Data sink)) + +A((Data source 1)) ---Am --> B +C((Data source 3)) ---Cm --> B +``` ---- -La mancanza di standardizzazione nel formato e significato dei dati ostacola l’interoperabilità tra le basi di dati di enti diversi e quindi la creazione di servizi digitali. +Identifiers may differ between systems, +and even registry data are not always interoperable. -Un primo esempio è la mancanza di interoperabilità sintattica: una entità ben definita (eg. il codice fiscale) viene rappresentata con campi o formati diversi: +```mermaid +graph LR +Am>"{givenName: Angela\nfamilyName: Merkel\ndate_of_birth: 1954-07-17}"] +Cm>"{givenName: Angela\nfamilyName: Kasner\ndate_of_birth: 1954-07-17}"] +B((Data sink)) +A((Data source 1)) ---Am --> B +C((Data source 3)) ---Cm --> B ``` -{"codice_fiscale": "MRORSS77T05E472W"} + +---- + +The lack of standardization in the format and meaning of data +hinders interoperability between the databases of different organizations, +and even inside different branches of the same organization, +and therefore the creation of digital services. + +A first example is the lack of syntactic interoperability: +a well-defined entity (eg. the tax code) is represented with different fields or formats: + +``` +{"tax_code": "MRORSS77T05E472W"} {"cf": "mrorss77T05E472W"} {"taxCode": "MRORSS77T05E472W"} ``` ---- -Un altro esempio è l'interoperabilità semantica: il concetto di famiglia ha diverse accezioni (eg. fiscale, anagrafica): +Another example is semantic interoperability: the concept of family has different meanings (eg. in the fiscal domain, in the registry domain, ..): +```yaml +relatives: + - name: Mario Rossi + relationship: father + - name: Carla Rossi + relationship: sister + cohabiting: false ``` -{"familiari": [ - {"nome": "Mario Rossi", "relazione": "padre"}, - {"nome": "Carla Rossi", "relazione": "sorella" , "convivente": false} } -{"familiari": [ - {"nome": "Mario Rossi", "relazione": "padre"} -} +```yaml +relatives: + - name: Mario Rossi + relationship: padre ``` --- -## Semantic standardization +## Vocabularies to the rescue + +Controlled Vocabularies use URIs to disambiguate the meaning of terms and provide semantics. + +Every term is identified by an absolute URI. +The prefix identifies the vocabulary name, +and the suffix identifies the term. + +```python + +dog_uri = "https://dbpedia.org/data/Dog" + +``` + + +To semantically standardize data, services and their content, conceptual tools such as ontologies and controlled vocabularies (codelist, taxonomies, ..) are used. + +Ontology: an ontology is a set of logical axioms that conceptualize a domain of interest by defining concepts and the semantics of relationships between them. -Per standardizzare semanticamente i servizi e i loro contenuti, si utilizzano strumenti concettuali quali ontologie e vocabolari controllati (codelist, tassonomie, ..).  +When ontologies contain further restrictions (e.g., -Ontologia: una ontologia è un insieme di assiomi logici che concettualizzano un dominio di interesse definendo dei concetti e la semantica delle relazioni tra essi. Quando le ontologie contengono ulteriori restrizioni (eg. vincoli allo schema) non sono propriamente vocabolari. +Controlled vocabulary: a vocabulary where the terms are validated by a designated authority. +It can be of different types - EG.A list (codelist), a hierarchical structure (taxonomy), a glossary and a tesauro (which adds further constraints to a taxonomy). -Vocabolario controllato: un vocabolario dove i termini sono validati da un'autorità designata. Può essere di diversi tipi - eg. una lista (codelist), una struttura gerarchica (tassonomia), un glossario ed un tesauro (che aggiunge ad una tassonomia ulteriori vincoli). Esempi di vocabolari controllati europei si trovano qui https://op.europa.eu/en/web/eu-vocabularies/controlled-vocabularies +Examples of European controlled vocabularies are found here https://op.europa.eu/en/web/eu-vocabularies/controlled-vocabularies ## Syntax standardization -Schema di dati: Uno schema è una rappresentazione/descrizione formale e machine-readable del contenuto effettivo o potenziale dei dati contenuti in un oggetto separato. In altre parole, è l'insieme di istruzioni semantiche e sequenziali che possono essere usate per controllare l'input memorizzato in un dato file, o per collegare un file che rispetta tali istruzioni a un sistema o un'applicazione di scambio di informazioni. Esistono diversi formati per descrivere degli schemi, tra cui xml-schema e json-schema. Definizione formale della sintassi di una entità. Vedi https://json-schema.org/understanding-json-schema/about.html +Data model: a data model, or data schema is a formal representation/description and machine-penadable of the actual or potential content of the data contained in a separate object. -Un Vocabolario controllato supporta anche la standardizzazione sintattica. +In other words, it is the set of semantic and sequential instructions that can be used +to check the stored input in a given file, +or to connect a file that respects these instructions to a system or an application of exchange of information. + +There are several formats to describe the patterns, +including XML Schema and JSON Schema. Formal definition of the syntax of an entity. +See https://json-schema.org/understanding-json-schema/about.html + +A Controlled vocabulary may support syntactic standardization. ---- @@ -84,25 +330,24 @@ Mentre poi la metadatazione delle pagine tramite json-ld ha come platea principa Inoltre la creazione di servizi sempre più integrati porta ad un aumento del numero di richieste, e della conseguente necessità di supportare in maniera sostenibile i carichi sui sistemi IT. - --- ## Defining semantic contents -I contenuti semantici vengono definiti -tramite proposizioni -`soggetto predicato complemento` -e loro insiemi (detti grafi) +Semantic contents are defined through +sentences of the form +`subject predicate object` +and their sets (called graphs). -Ecco un grafo con 3 proposizioni: +Here is an example of a graph with three sentences: ``` -"il cane" "ha il colore" "nero" -"nero" "è" "un colore" -"il cane" "è" "un animale" +"the dog" "has the color" "black" +"the dog" "is an" "animal" +"black" "is a" "color" ``` -e una sua descrizione formale +and an associated formal description in text/turle ``` prefix animals: @@ -115,28 +360,27 @@ animals:dog a animals:Animal ---- -RDF: Resource Description Framework permette di rappresentare informazioni sul web basandosi su due strutture dati: +RDF: Resource Description Framework -- **grafi** (insiemi di triple soggetto-predicato-oggetto); -- **elementi** (IRI, blank e literals); +allows to represent information on the web based on two data structures: -e su dei **vocabolari** di elementi identificati tramite degli IRIs e dei namespace. +- **elements** (IRIs, blank nodes and literals); +- **triples** (subject-predicate-object); +- **graphs** (sets of triples). -Un rdf-dataset è un insieme di **grafi**. - ----- +and on **vocabularies** of elements identified by IRIs and namespaces. +An RDF dataset is a set of **graphs**. ---- -#### Ontologie +#### Ontologies -Per standardizzare la semantica dei contenuti -digitali si usano delle Ontologie. +To standardize the semantics of digital content, +we use ontologies. -In Italia esiste l'Ontologia delle persone -che possiamo usare per descrivere univocamente -qualcuno. +In Italy, there's the official ontology of person +(Common Person Vocabulary) that we can use to uniquely describe someone. ``` @prefix cpv: . @@ -148,8 +392,7 @@ qualcuno. ---- -Anche l'ontologia è definita tramite triple -a partire da vocabolari di base. +An ontology is defined by a set of IRIs and their relationships. ``` @prefix xsd:   . @@ -175,7 +418,7 @@ JSON-LD inoltre *estende* RDF per permettere la serializzazione di dataset RDF g ---- Dato un oggetto JSON -``` +```yaml id: robipolli@gmail.com given_name: Roberto family_name: Polli @@ -183,7 +426,7 @@ family_name: Polli JSON-LD permette di trasformarlo in un grafo RDF associandogli un contesto. -``` +```yaml "@context": cpv: "https://w3id.org/italia/onto/CPV" given_name: "cpv:givenName" diff --git a/sparql-101/notebooks/tools.py b/sparql-101/notebooks/tools.py new file mode 100644 index 0000000..4aa25ea --- /dev/null +++ b/sparql-101/notebooks/tools.py @@ -0,0 +1,116 @@ +import re + +import networkx as nx +from bokeh.io import output_notebook, show +from bokeh.models import Circle, ColumnDataSource, HoverTool, LabelSet, MultiLine +from bokeh.plotting import figure, from_networkx +from rdflib import Graph +from rdflib.extras.external_graph_libs import rdflib_to_networkx_multidigraph + +# Make sure your notebook displays bokeh plots inline +output_notebook() +from bokeh.models import ( + BoxSelectTool, + Circle, + EdgesAndLinkedNodes, + HoverTool, + MultiLine, + NodesAndLinkedEdges, + TapTool, +) +from bokeh.palettes import Spectral4 + + +def plot_graph( + g, + label_property=None, + layout=nx.circular_layout, + limit: int = 0, + pattern=None, + line_color="gray", + fig=None, +) -> figure: + # Convert the RDF Graph to a NetworkX MultiDiGraph + f = Graph() + count = 0 + pattern = re.compile(pattern) if pattern else None + for x in g: + if pattern and not pattern.match(str(x[2])): + continue + f.add(x) + count += 1 + if limit and count > limit: + break + if not count: + raise ValueError("No triples found matching the pattern.") + + G = rdflib_to_networkx_multidigraph(f) + fig = fig or figure(title="RDF Graph Visualization with Bokeh") + fig.add_tools(HoverTool(tooltips=None), TapTool(), BoxSelectTool()) + radius = 0.01 + # Convert the networkx graph to a Bokeh graph renderer using the computed layout + graph_renderer = from_networkx(G, layout, scale=1, center=(0, 0)) + graph_renderer.node_renderer.glyph = Circle(radius=radius, fill_color="fill_color") + graph_renderer.node_renderer.selection_glyph = Circle( + radius=3 * radius, fill_color=Spectral4[2] + ) + graph_renderer.node_renderer.hover_glyph = Circle( + radius=3 * radius, fill_color=Spectral4[1] + ) + + graph_renderer.edge_renderer.glyph = MultiLine( + line_color=line_color, line_alpha=0.8, line_width=1 + ) + graph_renderer.edge_renderer.selection_glyph = MultiLine( + line_color="red", line_width=5 + ) + graph_renderer.edge_renderer.hover_glyph = MultiLine(line_color="red", line_width=5) + graph_renderer.selection_policy = NodesAndLinkedEdges() + graph_renderer.inspection_policy = EdgesAndLinkedNodes() + + fig.renderers.append(graph_renderer) + + def _node_label(node): + return node_label(g, node, label_property) + + # Add labels + x, y = zip(*graph_renderer.layout_provider.graph_layout.values()) + node_labels = [_node_label(node) for node in G.nodes()] + graph_renderer.node_renderer.data_source.data["node_label"] = node_labels + source = ColumnDataSource( + {"x": x, "y": y, "node_label": [node_labels[i] for i in range(len(x))]} + ) + + labels = LabelSet( + x="x", + y="y", + text="node_label", + source=source, + # text_font_size="8pt", + text_align="center", + ) + fig.renderers.append(labels) + + # Display the plot in the notebook + show(fig) + return fig + + +def node_label(g, node, label_property=None): + try: + if ret := g.value(subject=node, predicate=label_property): + return str(ret) + except Exception: + pass + return re.split(r"[/:#]", str(node))[-1] + + +from rdflib import URIRef +from rdflib.namespace import RDFS + + +def test_node_label(): + g = Graph() + g.parse("https://dbpedia.org/data/Tortelloni.n3", format="n3") + node = URIRef("http://dbpedia.org/resource/Broth") + assert node_label(g, node, RDFS.label) == "Broth" From e4acde3770b0f6535cfee09c9b60cf0c5ad3c4cb Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Sun, 27 Apr 2025 21:43:32 +0200 Subject: [PATCH 43/52] Teaser (#87) --- sparql-101/00-jupyter-intro.md | 89 + sparql-101/00-teaser.md | 302 +- sparql-101/notebooks/00-jupyter-intro.ipynb | 209 + sparql-101/notebooks/00-teaser.ipynb | 555 + sparql-101/notebooks/01-intro-jsonld.ipynb | 1064 + sparql-101/notebooks/02-sparql.ipynb | 487 + sparql-101/notebooks/03-syntax-semantic.ipynb | 357 + sparql-101/notebooks/Tagliatelle.n3 | 248 + sparql-101/notebooks/Tortellini.n3 | 270 + sparql-101/notebooks/d3fend.ttl | 39478 ++++++++++++++++ .../notebooks/guestbook-all-in-one.yaml | 149 + sparql-101/notebooks/guestbook.ttl | 249 + sparql-101/notebooks/tools.py | 50 +- sparql-101/tox.ini | 2 +- 14 files changed, 43403 insertions(+), 106 deletions(-) create mode 100644 sparql-101/00-jupyter-intro.md create mode 100644 sparql-101/notebooks/00-jupyter-intro.ipynb create mode 100644 sparql-101/notebooks/00-teaser.ipynb create mode 100644 sparql-101/notebooks/01-intro-jsonld.ipynb create mode 100644 sparql-101/notebooks/02-sparql.ipynb create mode 100644 sparql-101/notebooks/03-syntax-semantic.ipynb create mode 100644 sparql-101/notebooks/Tagliatelle.n3 create mode 100644 sparql-101/notebooks/Tortellini.n3 create mode 100644 sparql-101/notebooks/d3fend.ttl create mode 100644 sparql-101/notebooks/guestbook-all-in-one.yaml create mode 100644 sparql-101/notebooks/guestbook.ttl diff --git a/sparql-101/00-jupyter-intro.md b/sparql-101/00-jupyter-intro.md new file mode 100644 index 0000000..ab61865 --- /dev/null +++ b/sparql-101/00-jupyter-intro.md @@ -0,0 +1,89 @@ +# Knowledge Management 101 + +Welcome to the Knowledge Management 101 course! +Author: + +--- + +## Introducing Python + +Python is an interpreted, object oriented language with +a lot of built in features. +It can be used as a calculator and for mathematical operations, +such as statistics, plotting and linear algebra. + +This is a fast-track course for high school students with math knowledge. + +Students are expected to type and execute cells, and share their results. + +You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/ioggstream-86/sparql-101/notebooks/00-teaser.ipynb). + +--- + +# Jupyter + +Is the course environment in your browser. +It requires a modern browser and an internet connection supporting +websockets. If your network setup (e.g. your proxy) +does not support websockets, you will not be able to +execute the code. + +--- + +While you might find the exercises' solutions in the environment, +it is important for you to spend some time trying to do your homework! +This will help you to remember the concepts and to learn how to use the tools. + +--- + +## What can I do with Jupyter? + +You can: + +- execute the next cell with `SHIFT+ENTER` (try it now!) + +If your environment supports it, you can use features requiring +operating system access: + +- [open a (named) terminal on the local machine](/terminals/example) +- [edit an existing file](/edit/notebooks/untitled.txt) + +--- + +- add more cells with `ALT+ENTER` + +---- + +Try to add a cell below this one and write some text in it. + +```python +# Add a new python cell with ALT+ENTER. +``` + +--- + +## Python terminal + +With Jupyter, you have a Python terminal at your disposal. +You can run Python code: + +```python +# You can evaluate maths and strings +s = 1 +print("a string and the number " + str(s)) +``` + +Jupyter remembers the variables you define in a cell, so you can use them in the next cells. + +```python +# Evaluate this cell with SHIFT+ENTER +s = s + 1 +print("now s is increased " + str(s)) +``` + +Since Jupyter remembers the variables, you can run the cells in any order you want. +This means that sometimes, you need to "reset" the environment, to start from scratch. + +This can be done with the "Kernel > Restart" or "Kernel > Restart & Clear output" menu. + +---- diff --git a/sparql-101/00-teaser.md b/sparql-101/00-teaser.md index 3c83135..fb80e23 100644 --- a/sparql-101/00-teaser.md +++ b/sparql-101/00-teaser.md @@ -5,89 +5,6 @@ Author: --- -## Introducing Python - -Python is an interpreted, object oriented language with -a lot of built in features. -It can be used as a calculator and for mathematical operations, -such as statistics, plotting and linear algebra. - -This is a fast-track course for high school students with math knowledge. - -Students are expected to type and execute cells, and share their results. - -You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb). - ---- - -# Jupyter - -Is the course environment in your browser. -It requires a modern browser and an internet connection supporting -websockets. If your network setup (e.g. your proxy) -does not support websockets, you will not be able to -execute the code. - ---- - -While you might find the exercises' solutions in the environment, -it is important for you to spend some time trying to do your homework! -This will help you to remember the concepts and to learn how to use the tools. - ---- - -## What can I do with Jupyter? - -You can: - -- execute the next cell with `SHIFT+ENTER` (try it now!) - -If your environment supports it, you can use features requiring -operating system access: - -- [open a (named) terminal on the local machine](/terminals/example) -- [edit an existing file](/edit/notebooks/untitled.txt) - ---- - -- add more cells with `ALT+ENTER` - ----- - -Try to add a cell below this one and write some text in it. - -```python -# Add a new python cell with ALT+ENTER. -``` - ---- - -## Python terminal - -With Jupyter, you have a Python terminal at your disposal. -You can run Python code: - -```python -# You can evaluate maths and strings -s = 1 -print("a string and the number " + str(s)) -``` - -Jupyter remembers the variables you define in a cell, so you can use them in the next cells. - -```python -# Evaluate this cell with SHIFT+ENTER -s = s + 1 -print("now s is increased " + str(s)) -``` - -Since Jupyter remembers the variables, you can run the cells in any order you want. -This means that sometimes, you need to "reset" the environment, to start from scratch. - -This can be done with the "Kernel > Restart" or "Kernel > Restart & Clear output" menu. - ----- - ## Agenda - 1h. What is semantics and how to describe information in a @@ -104,7 +21,17 @@ In this course, we will learn how to describe information in a machine-readable way using RDF. ```python -%pip install rdflib bokeh +%pip install rdflib +``` + +(and some graph libraries) + +```python +%pip install bokeh +``` + +```python +%pip install networkx ``` For example network of persons: @@ -151,22 +78,29 @@ There's plenty of knowledge in the web! from rdflib import Graph from rdflib.namespace import RDFS import networkx as nx +from requests import get g = Graph() -g.parse("https://dbpedia.org/data/Tortellini.n3", format="n3") -plot_graph(g, label_property=RDFS.label, layout=nx.shell_layout, limit=60, filter=".*/dbpedia.org") +g.parse(data=get("https://dbpedia.org/data/Tortellini.n3").text, format="n3") +plot_graph(g, label_property=RDFS.label, limit=30, pattern=".*/dbpedia.org") ``` And we can connect them together ```python # Extend our graph -g.parse("https://dbpedia.org/data/Tagliatelle.n3", format="n3") +g.parse(data=get("https://dbpedia.org/data/Tagliatelle.n3").text, format="n3") -plot_graph(g, label_property=RDFS.label, layout=nx.shell_layout, limit=30, filter=".*/dbpedia.org") +plot_graph(g, label_property=RDFS.label, limit=50, pattern=".*/dbpedia.org") ``` -We can also query the graph for Italian food +Graphs contain a lot of senteces + +```python +len(g) +``` + +but we can query them (e.g., for Italian food) ```python g.query(""" @@ -175,27 +109,199 @@ PREFIX dbr: SELECT DISTINCT ?s WHERE { - ?s a dbo:Food ; - ?p dbr:Italy . + ?s + a dbo:Food ; + ?p dbr:Italy . } """ ).bindings ``` -Or ask what do some items have in common +and see if two resources have something in common... ```python g.query(""" -PREFIX dbo: +PREFIX dbr: SELECT DISTINCT ?t WHERE { - ?s a dbo:Food . - ?q a dbo:Food . - ?s ?p ?t . - ?q ?p ?t . - FILTER (?s != ?q) + dbr:Tagliatelle ?p1 ?t . + dbr:Tortellini ?p2 ?t . } """ ).bindings ``` + +We can query remote graphs (e.g., DBPedia): + +```python +dbpedia = Graph(store="SPARQLStore") +dbpedia.open("https://dbpedia.org/sparql") + +dbpedia.query(""" +PREFIX dbo: +PREFIX rdfs: + +SELECT DISTINCT ?subject ?label +WHERE { + ?subject + a dbo:Food ; + rdfs:label ?label + FILTER (lang(?label) = 'en') + . +} +LIMIT 10 +""").bindings +``` + +Provided by different organizations + +```python +eu = Graph(store="SPARQLStore") +eu.open("https://publications.europa.eu/webapi/rdf/sparql") + +eu.query(""" +PREFIX euvoc: +PREFIX skos: +PREFIX dc: +PREFIX rdf: + +SELECT ?URI, ?concept, ?identifier +WHERE { + ?URI + skos:inScheme euvoc:country ; + dc:identifier ?identifier ; + skos:prefLabel ?concept + . + + FILTER(lang(?concept) = 'en') +} +LIMIT 5 + +""").bindings +``` + +And their relations + +```python +eu.query(""" +PREFIX euvoc: +PREFIX skos: +PREFIX dct: + +# Construct a graph of countries and their identifiers related by dct:replaces +# countries must be in the euvoc:country scheme. + +CONSTRUCT { ?a dct:replaces ?b} +WHERE { + ?a skos:inScheme euvoc:country. + ?b skos:inScheme euvoc:country. + ?a dct:replaces ?b . +} + +LIMIT 5 + +""").bindings +``` + +More relations + +```python +from tools import plot_graph +import networkx as nx +ret = eu.query(""" +PREFIX skos: + + +CONSTRUCT { + +?s skos:narrower ?q + +} +WHERE { + +?s skos:inScheme ; +skos:narrower ?q ; + "0" +. +} +LIMIT 400 +""") + + +plot_graph(ret.graph, layout=nx.planar_layout) +``` + +--- + +## Transform kube infra in graph + +```python +% pip install d3fendtools +``` + +--- + +List Basic attacks on your kube infrastructure + +```python +from rdflib import Graph +from tools import plot_graph + +kube = Graph() +kube.parse('guestbook.ttl', format="text/turtle") + +# Simplify the graph ;) +for s, p, q in kube: + if 'urn:k8s:default' in str(s): + continue + if str(s).startswith(("urn:k8s:", "rdfs:", "rdf:")): + kube.remove((s, p, q)) + if str(q).startswith(("urn:k8s:", "rdfs:", "rds:")): + kube.remove((s, p, q)) + +plot_graph(kube) +``` + +Get security insights from the NSA knowledge graph. + +```python +kube=Graph() +kube.parse('guestbook.ttl', format="text/turtle") +kube.parse('d3fend.ttl', format="text/turtle") +kube.query(""" +SELECT DISTINCT * +WHERE { + ?artifact rdfs:subClassOf d3f:DigitalArtifact +} +""") +``` + +and apply this stuff to our infrastructure. + +```python + +attack_surface = list(kube.query(""" +SELECT DISTINCT + ?attack_label ?affects ?artifact ?uri +WHERE { + ?kind rdfs:subClassOf* d3f:DigitalArtifact . + ?kind rdfs:subClassOf* k8s:Kind . + ?kind rdfs:subClassOf ?artifact . + + ?attack + d3f:attack-id ?attack_id; + rdfs:label ?attack_label . + + ?attack ?affects ?artifact . + ?uri a ?kind . + +} +""")) + +print('\n'.join(sorted([ + (f"Attack: {a['attack_label']}," + f" {a['affects'].fragment} {a['artifact'].fragment} for {a['uri']}") + for a in attack_surface +]))) +``` diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb new file mode 100644 index 0000000..fd742e3 --- /dev/null +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -0,0 +1,209 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d652f97e", + "metadata": {}, + "source": [ + "# Knowledge Management 101\n", + "\n", + "Welcome to the Knowledge Management 101 course!\n", + "Author: " + ] + }, + { + "cell_type": "markdown", + "id": "ba5029b6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Introducing Python\n", + "\n", + "Python is an interpreted, object oriented language with\n", + "a lot of built in features.\n", + "It can be used as a calculator and for mathematical operations,\n", + "such as statistics, plotting and linear algebra.\n", + "\n", + "This is a fast-track course for high school students with math knowledge.\n", + "\n", + "Students are expected to type and execute cells, and share their results.\n", + "\n", + "You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/ioggstream-86/sparql-101/notebooks/00-teaser.ipynb)." + ] + }, + { + "cell_type": "markdown", + "id": "e5f8e51f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "# Jupyter\n", + "\n", + "Is the course environment in your browser.\n", + "It requires a modern browser and an internet connection supporting\n", + "websockets. If your network setup (e.g. your proxy)\n", + "does not support websockets, you will not be able to\n", + "execute the code." + ] + }, + { + "cell_type": "markdown", + "id": "872aec87", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "While you might find the exercises' solutions in the environment,\n", + "it is important for you to spend some time trying to do your homework!\n", + "This will help you to remember the concepts and to learn how to use the tools." + ] + }, + { + "cell_type": "markdown", + "id": "388c8340", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## What can I do with Jupyter?\n", + "\n", + "You can:\n", + "\n", + "- execute the next cell with `SHIFT+ENTER` (try it now!)\n", + "\n", + "If your environment supports it, you can use features requiring\n", + "operating system access:\n", + "\n", + "- [open a (named) terminal on the local machine](/terminals/example)\n", + "- [edit an existing file](/edit/notebooks/untitled.txt)" + ] + }, + { + "cell_type": "markdown", + "id": "1450b00d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "- add more cells with `ALT+ENTER`" + ] + }, + { + "cell_type": "markdown", + "id": "3a45615d", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Try to add a cell below this one and write some text in it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5288686d", + "metadata": {}, + "outputs": [], + "source": [ + "# Add a new python cell with ALT+ENTER." + ] + }, + { + "cell_type": "markdown", + "id": "62d76a1f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Python terminal\n", + "\n", + "With Jupyter, you have a Python terminal at your disposal.\n", + "You can run Python code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36a5a816", + "metadata": {}, + "outputs": [], + "source": [ + "# You can evaluate maths and strings\n", + "s = 1\n", + "print(\"a string and the number \" + str(s))" + ] + }, + { + "cell_type": "markdown", + "id": "b8520a07", + "metadata": {}, + "source": [ + "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e62c503f", + "metadata": {}, + "outputs": [], + "source": [ + "# Evaluate this cell with SHIFT+ENTER\n", + "s = s + 1\n", + "print(\"now s is increased \" + str(s))" + ] + }, + { + "cell_type": "markdown", + "id": "4c82dab5", + "metadata": {}, + "source": [ + "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", + "This means that sometimes, you need to \"reset\" the environment, to start from scratch.\n", + "\n", + "This can be done with the \"Kernel > Restart\" or \"Kernel > Restart & Clear output\" menu." + ] + }, + { + "cell_type": "markdown", + "id": "d0dc09fd", + "metadata": {}, + "source": [ + "----" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/00-teaser.ipynb b/sparql-101/notebooks/00-teaser.ipynb new file mode 100644 index 0000000..1bb511b --- /dev/null +++ b/sparql-101/notebooks/00-teaser.ipynb @@ -0,0 +1,555 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "570caaee", + "metadata": {}, + "source": [ + "# Knowledge Management 101\n", + "\n", + "Welcome to the Knowledge Management 101 course!\n", + "Author: " + ] + }, + { + "cell_type": "markdown", + "id": "ee35a21e", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Agenda\n", + "\n", + "- 1h. What is semantics and how to describe information in a\n", + " meaningful (and machine-readable) way using RDF.\n", + "\n", + "- 1h. Storing data or describing knowledge?\n", + " Practical use of getting security insights from data.\n", + "\n", + "- Bonus track: Graphs and semantic search: mixing graphs and vector databases\n", + "\n", + "## Teaser\n", + "\n", + "In this course, we will learn how to describe information in a\n", + "machine-readable way using RDF." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e6d3349", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install rdflib" + ] + }, + { + "cell_type": "markdown", + "id": "4707ed11", + "metadata": {}, + "source": [ + "(and some graph libraries)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "feaf5507", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install bokeh" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7aebe3f6", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install networkx" + ] + }, + { + "cell_type": "markdown", + "id": "c09768c6", + "metadata": {}, + "source": [ + "For example network of persons:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d852e72", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "from rdflib.namespace import FOAF, OWL\n", + "\n", + "sentences = \"\"\"\n", + "PREFIX owl: \n", + "PREFIX foaf: \n", + "PREFIX : \n", + "\n", + ":Homer foaf:knows :Marge, :Lisa, :Bart, :Maggie;\n", + " foaf:interest ;\n", + " foaf:firstName \"Homer\".\n", + "\n", + ":Lisa foaf:firstName \"Lisa\";\n", + " foaf:interest .\n", + "\n", + "\"\"\"\n", + "\n", + "g = Graph()\n", + "g.parse(data=sentences, format=\"text/turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "4b6fb468", + "metadata": {}, + "source": [ + "... eventually rendered as a graph ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e33ccc90", + "metadata": {}, + "outputs": [], + "source": [ + "from tools import plot_graph\n", + "plot_graph(g, label_property=FOAF.firstName)" + ] + }, + { + "cell_type": "markdown", + "id": "6f04b146", + "metadata": {}, + "source": [ + "Convert it in [JSON-LD](https://json-ld.org/) format:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0396f0fd", + "metadata": {}, + "outputs": [], + "source": [ + "json_text = g.serialize(format=\"application/ld+json\")\n", + "print(json_text)" + ] + }, + { + "cell_type": "markdown", + "id": "1446ce9c", + "metadata": {}, + "source": [ + "There's plenty of knowledge in the web!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6804291", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "from rdflib.namespace import RDFS\n", + "import networkx as nx\n", + "from requests import get\n", + "\n", + "g = Graph()\n", + "g.parse(data=get(\"https://dbpedia.org/data/Tortellini.n3/").text, format=\"n3\")\n", + "plot_graph(g, label_property=RDFS.label, limit=30, pattern=\".*/dbpedia.org\")" + ] + }, + { + "cell_type": "markdown", + "id": "6342db4b", + "metadata": {}, + "source": [ + "And we can connect them together" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "392f2214", + "metadata": {}, + "outputs": [], + "source": [ + "# Extend our graph\n", + "g.parse(data=get(\"https://dbpedia.org/data/Tagliatelle.n3/").text, format=\"n3\")\n", + "\n", + "plot_graph(g, label_property=RDFS.label, limit=50, pattern=\".*/dbpedia.org\")" + ] + }, + { + "cell_type": "markdown", + "id": "48af2a84", + "metadata": {}, + "source": [ + "Graphs contain a lot of senteces" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "08c54d26", + "metadata": {}, + "outputs": [], + "source": [ + "len(g)" + ] + }, + { + "cell_type": "markdown", + "id": "acc2e120", + "metadata": {}, + "source": [ + "but we can query them (e.g., for Italian food)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31a78d24", + "metadata": {}, + "outputs": [], + "source": [ + "g.query(\"\"\"\n", + "PREFIX dbo: \n", + "PREFIX dbr: \n", + "\n", + "SELECT DISTINCT ?s\n", + "WHERE {\n", + " ?s\n", + " a dbo:Food ;\n", + " ?p dbr:Italy .\n", + "}\n", + "\"\"\"\n", + ").bindings" + ] + }, + { + "cell_type": "markdown", + "id": "ebd12bcd", + "metadata": {}, + "source": [ + "and see if two resources have something in common..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e415c3bf", + "metadata": {}, + "outputs": [], + "source": [ + "g.query(\"\"\"\n", + "PREFIX dbr: \n", + "\n", + "SELECT DISTINCT ?t\n", + "WHERE {\n", + " dbr:Tagliatelle ?p1 ?t .\n", + " dbr:Tortellini ?p2 ?t .\n", + "}\n", + "\"\"\"\n", + ").bindings" + ] + }, + { + "cell_type": "markdown", + "id": "67206231", + "metadata": {}, + "source": [ + "We can query remote graphs (e.g., DBPedia):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "839547c6", + "metadata": {}, + "outputs": [], + "source": [ + "dbpedia = Graph(store=\"SPARQLStore\")\n", + "dbpedia.open(\"https://dbpedia.org/sparql/")\n", + "\n", + "dbpedia.query(\"\"\"\n", + "PREFIX dbo: \n", + "PREFIX rdfs: \n", + "\n", + "SELECT DISTINCT ?subject ?label\n", + "WHERE {\n", + " ?subject\n", + " a dbo:Food ;\n", + " rdfs:label ?label\n", + " FILTER (lang(?label) = 'en')\n", + " .\n", + "}\n", + "LIMIT 10\n", + "\"\"\").bindings" + ] + }, + { + "cell_type": "markdown", + "id": "367447cb", + "metadata": {}, + "source": [ + "Provided by different organizations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2e0e571", + "metadata": {}, + "outputs": [], + "source": [ + "eu = Graph(store=\"SPARQLStore\")\n", + "eu.open(\"https://publications.europa.eu/webapi/rdf/sparql/")\n", + "\n", + "eu.query(\"\"\"\n", + "PREFIX euvoc: \n", + "PREFIX skos: \n", + "PREFIX dc: \n", + "PREFIX rdf: \n", + "\n", + "SELECT ?URI, ?concept, ?identifier\n", + "WHERE {\n", + " ?URI\n", + " skos:inScheme euvoc:country ;\n", + " dc:identifier ?identifier ;\n", + " skos:prefLabel ?concept\n", + " .\n", + "\n", + " FILTER(lang(?concept) = 'en')\n", + "}\n", + "LIMIT 5\n", + "\n", + "\"\"\").bindings" + ] + }, + { + "cell_type": "markdown", + "id": "88f36a9c", + "metadata": {}, + "source": [ + "And their relations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9acba5d8", + "metadata": {}, + "outputs": [], + "source": [ + "eu.query(\"\"\"\n", + "PREFIX euvoc: \n", + "PREFIX skos: \n", + "PREFIX dct: \n", + "\n", + "# Construct a graph of countries and their identifiers related by dct:replaces\n", + "# countries must be in the euvoc:country scheme.\n", + "\n", + "CONSTRUCT { ?a dct:replaces ?b}\n", + "WHERE {\n", + " ?a skos:inScheme euvoc:country.\n", + " ?b skos:inScheme euvoc:country.\n", + " ?a dct:replaces ?b .\n", + "}\n", + "\n", + "LIMIT 5\n", + "\n", + "\"\"\").bindings" + ] + }, + { + "cell_type": "markdown", + "id": "405b4534", + "metadata": {}, + "source": [ + "More relations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b0cb6ad", + "metadata": {}, + "outputs": [], + "source": [ + "from tools import plot_graph\n", + "import networkx as nx\n", + "ret = eu.query(\"\"\"\n", + "PREFIX skos: \n", + "\n", + "\n", + "CONSTRUCT {\n", + "\n", + "?s skos:narrower ?q\n", + "\n", + "}\n", + "WHERE {\n", + "\n", + "?s skos:inScheme ;\n", + "skos:narrower ?q ;\n", + " \"0\"\n", + ".\n", + "}\n", + "LIMIT 400\n", + "\"\"\")\n", + "\n", + "\n", + "plot_graph(ret.graph, layout=nx.planar_layout)" + ] + }, + { + "cell_type": "markdown", + "id": "4aabbc36", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Transform kube infra in graph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ce0a3a5", + "metadata": {}, + "outputs": [], + "source": [ + "% pip install d3fendtools" + ] + }, + { + "cell_type": "markdown", + "id": "0d2e058a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "List Basic attacks on your kube infrastructure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25d436c0", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "from tools import plot_graph\n", + "\n", + "kube = Graph()\n", + "kube.parse('guestbook.ttl', format=\"text/turtle\")\n", + "\n", + "# Simplify the graph ;)\n", + "for s, p, q in kube:\n", + " if 'urn:k8s:default' in str(s):\n", + " continue\n", + " if str(s).startswith((\"urn:k8s:\", \"rdfs:\", \"rdf:\")):\n", + " kube.remove((s, p, q))\n", + " if str(q).startswith((\"urn:k8s:\", \"rdfs:\", \"rds:\")):\n", + " kube.remove((s, p, q))\n", + "\n", + "plot_graph(kube)" + ] + }, + { + "cell_type": "markdown", + "id": "3e09f002", + "metadata": {}, + "source": [ + "Get security insights from the NSA knowledge graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9facd7e", + "metadata": {}, + "outputs": [], + "source": [ + "kube=Graph()\n", + "kube.parse('guestbook.ttl', format=\"text/turtle\")\n", + "kube.parse('d3fend.ttl', format=\"text/turtle\")\n", + "kube.query(\"\"\"\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " ?artifact rdfs:subClassOf d3f:DigitalArtifact\n", + "}\n", + "\"\"\")" + ] + }, + { + "cell_type": "markdown", + "id": "42e2099d", + "metadata": {}, + "source": [ + "and apply this stuff to our infrastructure." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dcfcd6e4", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "attack_surface = list(kube.query(\"\"\"\n", + "SELECT DISTINCT\n", + " ?attack_label ?affects ?artifact ?uri\n", + "WHERE {\n", + " ?kind rdfs:subClassOf* d3f:DigitalArtifact .\n", + " ?kind rdfs:subClassOf* k8s:Kind .\n", + " ?kind rdfs:subClassOf ?artifact .\n", + "\n", + " ?attack\n", + " d3f:attack-id ?attack_id;\n", + " rdfs:label ?attack_label .\n", + "\n", + " ?attack ?affects ?artifact .\n", + " ?uri a ?kind .\n", + "\n", + "}\n", + "\"\"\"))\n", + "\n", + "print('\\n'.join(sorted([\n", + " (f\"Attack: {a['attack_label']},\"\n", + " f\" {a['affects'].fragment} {a['artifact'].fragment} for {a['uri']}\")\n", + " for a in attack_surface\n", + "])))" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/01-intro-jsonld.ipynb b/sparql-101/notebooks/01-intro-jsonld.ipynb new file mode 100644 index 0000000..f1bf031 --- /dev/null +++ b/sparql-101/notebooks/01-intro-jsonld.ipynb @@ -0,0 +1,1064 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "17089c5d", + "metadata": {}, + "source": [ + "# Knowledge Management 101\n", + "\n", + "## Agenda\n", + "\n", + "- Knowledge management\n", + "- Semantics what?\n", + "- Triples & co\n", + "- Attaching semantics\n", + "- Graph databases\n", + "- JsonLD\n", + "\n", + "*Beware*: commands may contain small typos. You have to fix them to properly complete the course!" + ] + }, + { + "cell_type": "markdown", + "id": "312de91a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Prerequisites:\n", + "\n", + "- json, yaml, xmlschema\n", + "- HTTP, OpenAPI 3\n", + "- SQL and database hints" + ] + }, + { + "cell_type": "markdown", + "id": "744b399d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Intro: What is knowledge?\n", + "\n", + "Knowledge is a set of information that is useful for a given purpose.\n", + "\n", + "We express knowledge through language and symbols\n", + "in various forms: text, images, and sounds.\n", + "\n", + "To use knowledge we need to:\n", + "\n", + "- sense;\n", + "- interpret;\n", + "- understand.\n", + "\n", + "When reading a book, for example, we not only need to read and understand the words,\n", + "but also to interpret the meaning of the sentences and paragraphs\n", + "based on the context and our previous knowledge." + ] + }, + { + "cell_type": "markdown", + "id": "d624b915", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## Intro: The Encyclopedia\n", + "\n", + "The Encyclopedia was one of the first attempts to organize knowledge,\n", + "and to make it available to the public.\n", + "\n", + "Today, we have various encyclopedias on the web,\n", + "such as Wikipedia and dbpedia.\n", + "\n", + "Exercise: open the \"Python\" page on dbpedia:\n", + "\n", + "- https://dbpedia.org/page/Python_(programming_language)\n", + "\n", + "And on Wikidata:\n", + "\n", + "- https://www.wikidata.org/wiki/Q28865" + ] + }, + { + "cell_type": "markdown", + "id": "6b88c40a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## Intro: The Encyclopedia\n", + "\n", + "Knowledge is organized in a graph structure,\n", + "where each node is a concept and the edges are the relationships between them." + ] + }, + { + "cell_type": "markdown", + "id": "5cbf10f3", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "\n", + "subgraph dbpedia[DBpedia]\n", + " dbr:Python[Python] -->|designer| dbr:gvr[Guido van Rossum]\n", + " dbr:Python[Python] -->|operating System| dbr:win[Windows] & dbr:linux[Linux] & ...\n", + " dbr:gvr -->|born| dbr:nl[Netherlands]\n", + "end\n", + "\n", + "subgraph wikidata[WikiData]\n", + " wd:Q30942[Guido van Rossum] ---|developer| wd:Q28865[Python]\n", + " wd:Q16402[Monty Python] ---|named after| wd:Q28865\n", + "end\n", + "\n", + "wd:Q28865 -.-|same as| dbr:Python\n", + "wd:Q30942 -.-|same as| dbr:gvr\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "37d5d4b3", + "metadata": {}, + "source": [ + "This is the basis of the Semantic Web,\n", + "where knowledge is represented in a machine-readable format,\n", + "but it is also the basis of the Web itself\n", + "(e.g., see [Web Linking RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288))." + ] + }, + { + "cell_type": "markdown", + "id": "68900194", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## Intro: The Encyclopedia\n", + "\n", + "The above graph can be expressed by sentences such as:\n", + "\n", + "- Python is named after Monty Python.\n", + "- Guido van Rossum is the designer of Python.\n", + "- Python runs on Linux.\n", + "\n", + "their general form is" + ] + }, + { + "cell_type": "markdown", + "id": "c005e593", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "subject((subject)) --- predicate(predicate) --> object\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "0142ecce", + "metadata": {}, + "source": [ + "## Intro: The Encyclopedia\n", + "\n", + "Encyclopedia voices on Wikipedia and dbpedia are expressed in\n", + "[Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/).\n", + "\n", + "It is a formal language to represent knowledge in a machine-readable format\n", + "using triples of the form `subject predicate object`.\n", + "\n", + "Let's translate the above definition from English to RDF:\n", + "\n", + "> Tortellini are a typical Italian food,\n", + ">
made with pasta filled with meat such as prosciutto.\n", + "\n", + "becomes something like" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bcdce224", + "metadata": { + "attributes": { + "classes": [ + "turtle" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + ":Tortellini a :Food .\n", + ":Tortellini :country dbr:Italy .\n", + ":Tortellini :relatedTo dbr:Prosciutto ." + ] + }, + { + "cell_type": "markdown", + "id": "58c46601", + "metadata": {}, + "source": [ + "## Exercise: Get a voice from dbpedia\n", + "\n", + "Now, let's get the actual voice from dbpedia\n", + "using the python RDF library." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b6190470", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + ")>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get a voice from dbpedia using rdflib\n", + "from rdflib import Graph\n", + "from requests import get\n", + "# What's Tortellini?\n", + "g = Graph()\n", + "g.parse(data=get(\"https://dbpedia.org/data/Tortellini.ttl/").text, format=\"turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "d74700b6", + "metadata": {}, + "source": [ + "We get a graph with the information about Tortellini." + ] + }, + { + "cell_type": "markdown", + "id": "f966d9e4", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + " subgraph dbpedia[DBpedia]\n", + " dbr:Tortellini[Tortellini] -->|is a| dbo:Food[Food]\n", + " dbr:Tortellini -->|related to| dbr:Prosciutto[Prosciutto]\n", + " dbr:Tortellini -->|country| dbp:Italy[Italy]\n", + " ...\n", + " end\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "9e09ef8d", + "metadata": {}, + "source": [ + "An encyclopedia voice contains a list of sentences :)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "520b4791", + "metadata": {}, + "outputs": [], + "source": [ + "# List all the details about Tortellini.\n", + "sentences = list(g)\n", + "\n", + "print('\\n'.join([str(s) for s in sentences]))" + ] + }, + { + "cell_type": "markdown", + "id": "86a71aa0", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- how many sentences are there?\n", + "- how many elements does each sentence have?" + ] + }, + { + "cell_type": "markdown", + "id": "7a077d4f", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d18b18d", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib.namespace import RDF, RDFS, FOAF\n", + "\n", + "# Now we get specific properties from the graph.\n", + "_type = list(g.objects(predicate=RDF.type))\n", + "print(_type)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c442255d", + "metadata": {}, + "outputs": [], + "source": [ + "import rdflib\n", + "from rdflib.extras.external_graph_libs import rdflib_to_networkx_multidigraph\n", + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "\n", + "G = rdflib_to_networkx_multidigraph(g)\n", + "\n", + "# Plot Networkx instance of RDF Graph\n", + "pos = nx.spring_layout(G, scale=2)\n", + "edge_labels = nx.get_edge_attributes(G, 'r')\n", + "nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)\n", + "nx.draw(G, with_labels=True)\n", + "\n", + "#if not in interactive mode for\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "5a8ad042", + "metadata": {}, + "source": [ + "## Intro: Semantics what?\n", + "\n", + "Semantics: the study of meaning.\n", + "\n", + "Semantics ensures that a message is understood;\n", + "messages include data and HTTP exchanges.\n", + "\n", + "Here are some ambiguous messages:" + ] + }, + { + "cell_type": "markdown", + "id": "3cd2a007", + "metadata": {}, + "source": [ + "```yaml\n", + "name: FABIANO Romildo\n", + "income: 4_000_000\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "7c6ef343", + "metadata": {}, + "source": [ + "Is this a given name or a full name?\n", + "What is the currency of the income?\n", + "Is it a monthly or yearly income?" + ] + }, + { + "cell_type": "markdown", + "id": "0945f6fc", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Integrating data from different sources is difficult because of the lack of semantic interoperability." + ] + }, + { + "cell_type": "markdown", + "id": "ff6f372e", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "Am>\"{name: FABIANO Romildo\\nincome: 4_000_000}\"]\n", + "Cm>\"{givenName: FABIANO\\nfamilyName: Romildo\\ntax: 12_000EUR}\"]\n", + "B((Data sink))\n", + "\n", + "A((Data source 1)) ---Am --> B\n", + "C((Data source 3)) ---Cm --> B\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "cec2a096", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Identifiers may differ between systems,\n", + "and even registry data are not always interoperable." + ] + }, + { + "cell_type": "markdown", + "id": "3779e015", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "Am>\"{givenName: Angela\\nfamilyName: Merkel\\ndate_of_birth: 1954-07-17}\"]\n", + "Cm>\"{givenName: Angela\\nfamilyName: Kasner\\ndate_of_birth: 1954-07-17}\"]\n", + "B((Data sink))\n", + "\n", + "A((Data source 1)) ---Am --> B\n", + "C((Data source 3)) ---Cm --> B\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "f7ed1b61", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "The lack of standardization in the format and meaning of data\n", + "hinders interoperability between the databases of different organizations,\n", + "and even inside different branches of the same organization,\n", + "and therefore the creation of digital services.\n", + "\n", + "A first example is the lack of syntactic interoperability:\n", + "a well-defined entity (eg. the tax code) is represented with different fields or formats:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f73e3bc9", + "metadata": {}, + "outputs": [], + "source": [ + "{\"tax_code\": \"MRORSS77T05E472W\"}\n", + "{\"cf\": \"mrorss77T05E472W\"}\n", + "{\"taxCode\": \"MRORSS77T05E472W\"}" + ] + }, + { + "cell_type": "markdown", + "id": "7862a925", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Another example is semantic interoperability: the concept of family has different meanings (eg. in the fiscal domain, in the registry domain, ..):" + ] + }, + { + "cell_type": "markdown", + "id": "4991b95b", + "metadata": {}, + "source": [ + "```yaml\n", + "relatives:\n", + " - name: Mario Rossi\n", + " relationship: father\n", + " - name: Carla Rossi\n", + " relationship: sister\n", + " cohabiting: false\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "f0c0d00d", + "metadata": {}, + "source": [ + "```yaml\n", + "relatives:\n", + " - name: Mario Rossi\n", + " relationship: padre\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "683d891e", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Vocabularies to the rescue\n", + "\n", + "Controlled Vocabularies use URIs to disambiguate the meaning of terms and provide semantics.\n", + "\n", + "Every term is identified by an absolute URI.\n", + "The prefix identifies the vocabulary name,\n", + "and the suffix identifies the term." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "131749fc", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "dog_uri = \"https://dbpedia.org/data/Dog/"\n" + ] + }, + { + "cell_type": "markdown", + "id": "3e9f7fbd", + "metadata": {}, + "source": [ + "To semantically standardize data, services and their content, conceptual tools such as ontologies and controlled vocabularies (codelist, taxonomies, ..) are used.\n", + "\n", + "Ontology: an ontology is a set of logical axioms that conceptualize a domain of interest by defining concepts and the semantics of relationships between them.\n", + "\n", + "When ontologies contain further restrictions (e.g.,\n", + "\n", + "Controlled vocabulary: a vocabulary where the terms are validated by a designated authority.\n", + "It can be of different types - EG.A list (codelist), a hierarchical structure (taxonomy), a glossary and a tesauro (which adds further constraints to a taxonomy).\n", + "\n", + "Examples of European controlled vocabularies are found here https://op.europa.eu/en/web/eu-vocabularies/controlled-vocabularies\n", + "\n", + "## Syntax standardization\n", + "\n", + "Data model: a data model, or data schema is a formal representation/description and machine-penadable of the actual or potential content of the data contained in a separate object.\n", + "\n", + "In other words, it is the set of semantic and sequential instructions that can be used\n", + "to check the stored input in a given file,\n", + "or to connect a file that respects these instructions to a system or an application of exchange of information.\n", + "\n", + "There are several formats to describe the patterns,\n", + "including XML Schema and JSON Schema. Formal definition of the syntax of an entity.\n", + "See https://json-schema.org/understanding-json-schema/about.html\n", + "\n", + "A Controlled vocabulary may support syntactic standardization." + ] + }, + { + "cell_type": "markdown", + "id": "b3d81e71", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Per standardizzare sintatticamente i servizi serve pubblicare degli schemi dati a cui tutte le organizzazioni devono conformarsi. Storicamente la standardizzazione degli schemi dati si basa sul concetto di namespace eventualmente distribuiti - vedi il formato di specifica XSD.\n", + "\n", + "Se in ecosistemi ben definiti questo approccio funziona, al crescere della dimensione si pongono una serie di problematiche legate sia alla compattezza dei dati trasportati che del contesto di sicurezza legato ad esempio alla eventuale necessità di dereferenziare gli URI (eg. https://owasp.org/www-pdf-archive/XML_Based_Attacks_-_OWASP.pdf ) .\n", + "\n", + "Mentre poi la metadatazione delle pagine tramite json-ld ha come platea principale i sistemi di processamento batch dei motori di ricerca, i dati convogliati tramite API vengono sempre più frequentemente processati da applicazioni mobile che hanno dei vincoli sia in termini di banda che di consumo di risorse (eg. batteria dei cellulari, riscaldamento) più stringenti.\n", + "\n", + "Inoltre la creazione di servizi sempre più integrati porta ad un aumento del numero di richieste, e della conseguente necessità di supportare in maniera sostenibile i carichi sui sistemi IT." + ] + }, + { + "cell_type": "markdown", + "id": "e4596f2a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Defining semantic contents\n", + "\n", + "Semantic contents are defined through\n", + "sentences of the form\n", + "`subject predicate object`\n", + "and their sets (called graphs).\n", + "\n", + "Here is an example of a graph with three sentences:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9acd5f4f", + "metadata": {}, + "outputs": [], + "source": [ + "\"the dog\" \"has the color\" \"black\"\n", + "\"the dog\" \"is an\" \"animal\"\n", + "\"black\" \"is a\" \"color\"" + ] + }, + { + "cell_type": "markdown", + "id": "cbc3d113", + "metadata": {}, + "source": [ + "and an associated formal description in text/turle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65ed09ce", + "metadata": {}, + "outputs": [], + "source": [ + "prefix animals: \n", + "prefix colors: \n", + "\n", + "animals:dog colors:hasColor colors:black\n", + "colors:black a colors:Color\n", + "animals:dog a animals:Animal" + ] + }, + { + "cell_type": "markdown", + "id": "00c6b948", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "RDF: Resource Description Framework\n", + "\n", + "allows to represent information on the web based on two data structures:\n", + "\n", + "- **elements** (IRIs, blank nodes and literals);\n", + "- **triples** (subject-predicate-object);\n", + "- **graphs** (sets of triples).\n", + "\n", + "and on **vocabularies** of elements identified by IRIs and namespaces.\n", + "\n", + "An RDF dataset is a set of **graphs**." + ] + }, + { + "cell_type": "markdown", + "id": "35726329", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "#### Ontologies\n", + "\n", + "To standardize the semantics of digital content,\n", + "we use ontologies.\n", + "\n", + "In Italy, there's the official ontology of person\n", + "(Common Person Vocabulary) that we can use to uniquely describe someone." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d125a96", + "metadata": {}, + "outputs": [], + "source": [ + "@prefix cpv: .\n", + "\n", + " cpv:givenName \"Roberto\" .\n", + " cpv:familyName \"Polli\" .\n" + ] + }, + { + "cell_type": "markdown", + "id": "b29a3e45", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "An ontology is defined by a set of IRIs and their relationships." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03709d15", + "metadata": {}, + "outputs": [], + "source": [ + "@prefix xsd:   .\n", + "@prefix dct:   .\n", + "\n", + "https://w3id.org/italia/onto/CPV%20dct:modified%C2%A0%20/"2020-04-27\"^^xsd:date ;\n", + "https://w3id.org/italia/onto/CPV%20dct:title%20%C2%A0%20%C2%A0%20/"Person Ontology\"@en,\n", + " \"Ontologia delle persone\"@it ;\n" + ] + }, + { + "cell_type": "markdown", + "id": "38922698", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "### Json-LD\n", + "\n", + "JSON-LD è un formato che permette di serializzare in JSON delle informazioni basate sul\n", + "[RDF data model](https://www.w3.org/TR/json-ld11/#data-model).\n", + "\n", + "Un documento JSON-LD è quindi sia un documento RDF che JSON, e rappresenta un'istanza di un RDF data model.\n", + "\n", + "JSON-LD inoltre *estende* RDF per permettere la serializzazione di dataset RDF generalizzati." + ] + }, + { + "cell_type": "markdown", + "id": "8c4fe713", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "Dato un oggetto JSON" + ] + }, + { + "cell_type": "markdown", + "id": "6ab64196", + "metadata": {}, + "source": [ + "```yaml\n", + "id: robipolli@gmail.com\n", + "given_name: Roberto\n", + "family_name: Polli\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "f134c6bb", + "metadata": {}, + "source": [ + "JSON-LD permette di trasformarlo in un grafo RDF associandogli un contesto." + ] + }, + { + "cell_type": "markdown", + "id": "b065135a", + "metadata": {}, + "source": [ + "```yaml\n", + "\"@context\":\n", + " cpv: \"https://w3id.org/italia/onto/CPV/"\n", + " given_name: \"cpv:givenName\"\n", + " family_name: \"cpv:familyName\"\n", + " id: \"@id\"\n", + "id: robipolli@gmail.com\n", + "given_name: Roberto\n", + "family_name: Polli\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "64db2077", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "Oltre all'ontologia italiana, un altro vocabolario\n", + "molto usato sul web è www.schema.org. Le parole chiave\n", + "che definisce sono disponibili in formato json-ld\n", + "https://schema.org/docs/jsonldcontext.jsonld" + ] + }, + { + "cell_type": "markdown", + "id": "98e7246d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "È anche possibile ridefinire o localizzare i campi,\n", + "eventualmente usando diversi namespace." + ] + }, + { + "cell_type": "markdown", + "id": "cbb809f4", + "metadata": {}, + "source": [ + "```yaml\n", + "\"@context\":\n", + " \"sdo\": \"http://schema.org//"\n", + " \"nome\":\"sdo:name\"\n", + " \"nome_proprio\": \"sdo:givenName\"\n", + "\"@type\": \"Person\"\n", + " \"nome\": \"Jane Doe\"\n", + " \"nome_proprio\": \"Jane\"\n", + " \"sdo:jobTitle\": \"Professor\"\n", + " \"sdo:telephone\": \"(425) 123-4567\"\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "dbe29fa5", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "### Localizzazione\n", + "\n", + "JSON-LD supporta nativamente informazioni\n", + "localizzate:" + ] + }, + { + "cell_type": "markdown", + "id": "a3b29a55", + "metadata": {}, + "source": [ + "```yaml\n", + "-- come lista\n", + "occupation:\n", + "-  @value: \"Student\"\n", + "   @language: en\n", + "-  @value: \"Etudiant\"\n", + "   @language: fr\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "a2235bdc", + "metadata": {}, + "source": [ + "oppure" + ] + }, + { + "cell_type": "markdown", + "id": "f6f2c863", + "metadata": {}, + "source": [ + "```yaml\n", + "-- come oggetto\n", + "@context:\n", + "  occupation:\n", + "    @container: @language\n", + "occupation:\n", + "  en: Student\n", + "  fr: Etudiant\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "318ed8e2", + "metadata": {}, + "source": [ + "oppure" + ] + }, + { + "cell_type": "markdown", + "id": "186dbe2d", + "metadata": {}, + "source": [ + "```yaml\n", + "--- tramite elementi multipli, utile anche per la serializzazione di API semplici\n", + "@context:\n", + " occupation: {@language: en}\n", + " occupation_fr: {@language: fr}\n", + "occupation: Student\n", + "occupation_fr: Etudiant\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "dc23814a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "#### Context mangling\n", + "\n", + "@context mangling: modificando il contesto di un oggetto\n", + "se ne altera il significato." + ] + }, + { + "cell_type": "markdown", + "id": "98557a84", + "metadata": {}, + "source": [ + "```yaml\n", + "payment_from: alice@foo.example\n", + "payment_to: bob@foo.example\n", + "\"@context\": https://payment/context.jsonld\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "de51c413", + "metadata": {}, + "source": [ + "Alterando la risposta del server https://payment/context.jsonld\n", + "possiamo invertire il verso del pagamento!" + ] + }, + { + "cell_type": "markdown", + "id": "58de02ca", + "metadata": {}, + "source": [ + "```yaml\n", + "@context:\n", + " payment_from: http://banking#debtor\n", + " payment_to: http://banking#creditor\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "ad9dee43", + "metadata": {}, + "source": [ + "->" + ] + }, + { + "cell_type": "markdown", + "id": "8d9e060e", + "metadata": {}, + "source": [ + "```yaml\n", + "@context:\n", + " payment_to: http://banking#debtor\n", + " payment_from: http://banking#creditor\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "a8eaff40", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Esistono diverse ipotesi tecnologiche basate\n", + "sull'elaborazione semantica dei dati a runtime.\n", + "Tutte queste implementazioni devono indirizzare\n", + "questo tipo di rischi." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "py3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/02-sparql.ipynb b/sparql-101/notebooks/02-sparql.ipynb new file mode 100644 index 0000000..92da4e8 --- /dev/null +++ b/sparql-101/notebooks/02-sparql.ipynb @@ -0,0 +1,487 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "24c7471b", + "metadata": {}, + "source": [ + "# Graph databases & SparQL\n", + "\n", + "## Agenda\n", + "\n", + " - Storing and retrieving triples\n", + " - Virtuoso\n", + " - GraphDB\n", + "\n", + "*Beware*: commands contain small typos. You must fix them to properly complete the course!\n", + "\n", + "----\n", + "\n", + "Prerequisites:\n", + "\n", + "- json, yaml, xmlschema\n", + "- HTTP, OpenAPI 3\n", + "- SQL and database hints\n", + "\n", + "\n", + "---\n", + "\n", + "## Graphs (again)\n", + "\n", + "A graph is a set (unordered) of triples.\n", + "\n", + "Each triple consists of a `subject`, `predicate`, `object`.\n", + "\n", + "Graph databases such as [Virtuoso (opensource)](),\n", + "[GraphDB (proprietary)](),\n", + "[Amazon Nepture (proprietary SaaS)]()\n", + "support the [SparQL]() language.\n", + "Other databases - [Neo4j (opensource)]() use\n", + "custom language.\n", + "\n", + "----\n", + "\n", + "Let's populate some entries in SparQL\n", + "and see how it works.\n", + "\n", + "Open [sample.ttl](sample.ttl) and list\n", + "all entries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6e09119", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "SELECT * WHERE {\n", + " ?subject ?predicate ?object\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "4b490b74", + "metadata": {}, + "source": [ + "(describe sparql query)\n", + "\n", + "----\n", + "\n", + "SparQL can then be used to correlate\n", + "entries using semantically defined\n", + "vocabularies such as FOAF." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57c63148", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix foaf: .\n", + "\n", + "SELECT * WHERE {\n", + " ?s foaf:name ?o\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "5a5fd278", + "metadata": {}, + "source": [ + "| s | o |\n", + "| --- | --- |\n", + "| | \"Roberto\"|\n", + "| | \"Jon\"|\n", + "\n", + "In this case `foaf:name` has a very specific meaning.\n", + "You don't need to create indexes in your database\n", + "to search for specific predicates.\n", + "\n", + "----\n", + "\n", + "Graph databases have an inference engine that can be used\n", + "to process complex queries." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e4c4c6f", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix foaf: .\n", + "\n", + "SELECT * WHERE {\n", + " ?s foaf:knows ?o" + ] + }, + { + "cell_type": "markdown", + "id": "6357679a", + "metadata": {}, + "source": [ + "| s | o |\n", + "| --- | --- |\n", + "| r@example | j@example |\n", + "\n", + "----\n", + "\n", + "And using multiple lines we can infer things\n", + "such as friend-of-a-friend emails." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5749bceb", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix foaf: .\n", + "\n", + "SELECT DISTINCT ?mail1, ?mail3 WHERE {\n", + " ?user1 foaf:knows ?user2\n", + " . ?user2 foaf:knows ?user3\n", + "\n", + " . ?user1 foaf:mbox ?mail1\n", + " . ?user3 foaf:mbox ?mail3" + ] + }, + { + "cell_type": "markdown", + "id": "f2060f34", + "metadata": {}, + "source": [ + "Note that the query describes each relation\n", + "ignoring the way data is stored.\n", + "\n", + "---\n", + "\n", + "# Querying DBPedia\n", + "\n", + "[DBPedia](https://dbpedia.org/sparql) is a graph database with a lot of data inside.\n", + "\n", + "We can use it to learn sparql.\n", + "\n", + "- list concepts" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc625953", + "metadata": {}, + "outputs": [], + "source": [ + "select distinct ?Concept where {[] a ?Concept} LIMIT 20" + ] + }, + { + "cell_type": "markdown", + "id": "0a8082a7", + "metadata": {}, + "source": [ + "----\n", + "\n", + "Now we want to list all `Person`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f33b1f6f", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix foaf: .\n", + "\n", + "SELECT DISTINCT * WHERE {\n", + " ?s a foaf:Person\n", + "} LIMIT 10" + ] + }, + { + "cell_type": "markdown", + "id": "4d0c8273", + "metadata": {}, + "source": [ + "----\n", + "\n", + "All `Person`s born in Pisa" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6b4491c", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "\n", + "@prefix foaf: .\n", + "@prefix dbp: .\n", + "@prefix dbr: .\n", + "\n", + "select distinct * where {\n", + " ?s a foaf:Person .\n", + " ?s dbp:birthPlace dbr:Pisa\n", + "} LIMIT 10\n" + ] + }, + { + "cell_type": "markdown", + "id": "a5beda2c", + "metadata": {}, + "source": [ + "... with their deathplaces" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6583693", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix foaf: .\n", + "@prefix dbp: .\n", + "@prefix dbr: .\n", + "@prefix dbo: .\n", + "\n", + "\n", + "select distinct * where {\n", + "?s a foaf:Person .\n", + "?s dbp:birthPlace dbr:Pisa .\n", + "?s dbp:deathPlace ?death_place\n", + "} LIMIT 10" + ] + }, + { + "cell_type": "markdown", + "id": "99714093", + "metadata": {}, + "source": [ + "----\n", + "\n", + "If deathplace is in UK" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d7dd1748", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "\n", + "@prefix foaf: .\n", + "@prefix dbp: .\n", + "@prefix dbr: .\n", + "@prefix dbo: .\n", + "\n", + "select distinct * where {\n", + " ?s a foaf:Person .\n", + " ?s dbp:birthPlace dbr:Rome .\n", + " ?s dbp:deathPlace ?deathPlace .\n", + " ?deathPlace dbo:country dbr:United_Kingdom\n", + "} LIMIT 50\n" + ] + }, + { + "cell_type": "markdown", + "id": "e6f2d465", + "metadata": {}, + "source": [ + "----\n", + "\n", + "We can extend the search to every person\n", + "born in Italy and dead in UK:\n", + "\n", + "- replacing `dbr:Rome` with `?birth_place`\n", + "- restricting `?birth_place` to `dbr:Italy`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a494f0ec", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix foaf: .\n", + "@prefix dbp: .\n", + "@prefix dbr: .\n", + "@prefix dbo: .\n", + "\n", + "SELECT DISTINCT * WHERE {\n", + "\n", + "?s a foaf:Person .\n", + "?s dbp:birthPlace ?birth_place .\n", + "?s dbp:deathPlace ?deathPlace .\n", + "\n", + "?deathPlace dbo:country dbr:United_Kingdom .\n", + "?birth_place dbo:country dbr:Italy\n", + "\n", + "} LIMIT 50" + ] + }, + { + "cell_type": "markdown", + "id": "09498edb", + "metadata": {}, + "source": [ + "----\n", + "\n", + "There's no limit to the inference, for example\n", + "we could require that the birthplace of that\n", + "person should match the one of a Pope." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8958b3c5", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix foaf: .\n", + "@prefix dbp: .\n", + "@prefix dbr: .\n", + "@prefix dbo: .\n", + "@prefix rdf: .\n", + "\n", + "select distinct * where {\n", + " ?s a foaf:Person .\n", + " ?s dbp:birthPlace ?birth_place .\n", + " ?birth_place dbo:country dbr:Italy .\n", + " ?s dbp:deathPlace ?death_place .\n", + " ?death_place dbo:country dbr:France .\n", + "\n", + " ?pope rdf:type dbo:Pope .\n", + " ?pope dbp:birthPlace ?birth_place . # relation with the birth_place\n", + "} LIMIT 50" + ] + }, + { + "cell_type": "markdown", + "id": "ea0eb0aa", + "metadata": {}, + "source": [ + "----\n", + "\n", + "Shortening sparql queries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d4c6b08b", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix foaf: .\n", + "@prefix dbp: .\n", + "@prefix dbr: .\n", + "@prefix dbo: .\n", + "@prefix rdf: .\n", + "\n", + "select distinct * where {\n", + " ?s a foaf:Person ;\n", + " dbp:birthPlace ?birth_place ;\n", + " dbp:deathPlace ?death_place .\n", + " ?birth_place dbo:country dbr:Italy .\n", + " ?death_place dbo:country dbr:France .\n", + "\n", + " ?pope rdf:type dbo:Pope ;\n", + " dbp:birthPlace ?birth_place . # relation with the birth_place\n", + "} LIMIT 50" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/03-syntax-semantic.ipynb b/sparql-101/notebooks/03-syntax-semantic.ipynb new file mode 100644 index 0000000..250e26a --- /dev/null +++ b/sparql-101/notebooks/03-syntax-semantic.ipynb @@ -0,0 +1,357 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "46c2b764", + "metadata": {}, + "source": [ + "# Modeling Semantic APIs\n", + "\n", + "## Agenda\n", + "\n", + "- API e Semantica\n", + "- json-schema e json-ld\n", + "\n", + "---\n", + "\n", + "## API e Semantica\n", + "\n", + "Quando scambiamo informazioni tramite API\n", + "la semantica non è sempre chiara:\n", + "\n", + "- è implicita;\n", + "- è in qualche pdf/xls;\n", + "- non è machine readable.\n", + "\n", + "Descrivendo un'API con un IDL (wsdl o OAS3)\n", + "possiamo descrivere la semantica includendola\n", + "nell'IDL.\n", + "\n", + "---\n", + "\n", + "### Semantica e Sintassi\n", + "\n", + "La descrizione semantica di un'API\n", + "non abilita necessariamente delle comunicazioni\n", + "efficienti e sicure.\n", + "\n", + "Per validare un oggetto json-ld, serve risolverne\n", + "ricorsivamente tutte le referenze:\n", + "è complesso farlo in maniera sincrona.\n", + "\n", + "La possibilità di validare sintatticamente\n", + "i dati inoltre semplifica molto il quadro di interoperabilità.\n", + "\n", + "Definendo inoltre la semantica va\n", + "definita in fase di specifica\n", + "evita di dover risolvere a runtime\n", + "referenze ricorsive\n", + "ed evita problemi di \"@context mangling\".\n", + "\n", + "----\n", + "\n", + "#### Collegare context e dati\n", + "\n", + "Le specifiche json-ld definiscono un meccanismo per\n", + "per descrivere il contesto di un content json tramite `Link` header." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dcf02c64", + "metadata": { + "attributes": { + "classes": [ + "http" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "HTTP/1.1 200 OK\n", + "Content-Type: application/json\n", + "Link: ;\n", + " rel=\"http://www.w3.org/ns/json-ld#context\"; type=\"application/ld+json\"\n", + "\n", + "{ \"given_name\": \"Roberto\", \"family_name\": \"Polli\" }" + ] + }, + { + "cell_type": "markdown", + "id": "0fbe123c", + "metadata": {}, + "source": [ + "Ma non un meccanismo per associare queste informazioni ad uno schema.\n", + "\n", + "----\n", + "\n", + "#### Collegare context e schema\n", + "\n", + "RDF non permette sempre di associare uno schema univoco agli\n", + "elementi di un grafo.\n", + "\n", + "Anche associando una `Location` al luogo di nascita\n", + "di una persona tramite `rdfs:range` con" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9d6ee28e", + "metadata": { + "attributes": { + "classes": [ + "turtle" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "prefix cpv: .\n", + "prefix l0: .\n", + "\n", + "cpv:hasBirthPlace rdfs:range l0:Location" + ] + }, + { + "cell_type": "markdown", + "id": "0c0af50b", + "metadata": {}, + "source": [ + "non è detto che sia semplice associare una sintassi\n", + "a `Location` che, in questo caso potrebbe essere ad esempio:\n", + "\n", + "- un indirizzo\n", + "- una coppia di coordinate\n", + "- l'URI di un luogo\n", + "\n", + "----\n", + "\n", + "Uno scambio efficiente di informazioni in tempo reale\n", + "richiede una sintassi ben definita\n", + "validabile a runtime in modo efficiente.\n", + "\n", + "La sintassi può essere validata con specifiche quali\n", + "[json-schema]() e [xmlschema]().\n", + "\n", + "json-schema può essere usato anche per validare\n", + "la sintassi di un file json-ld.\n", + "\n", + "----\n", + "\n", + "Per dichiarare il @context associandolo ad uno schema\n", + "possiamo integrarlo nella definizione attraverso\n", + "un valore `const`.\n", + "Se una property è esterna al vocabolario,\n", + "basta\n", + "[disassociarla dal vocabolario](https://w3c.github.io/json-ld-syntax/#example-25-using-the-null-keyword-to-ignore-data)\n", + "assegnandole il valore `null`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ee7e934", + "metadata": { + "attributes": { + "classes": [ + "yaml" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "# Associate a json-ld context to a schema\n", + "Customer:\n", + "  type: object\n", + "  required: [email]\n", + "  properties:\n", + " \"@context\":\n", + " const:\n", + " \"@vocab\": \"http://schema.org/"\n", + " pet: null\n", + " email: {type: string}\n", + "    pet: {type: string}" + ] + }, + { + "cell_type": "markdown", + "id": "2f4c603e", + "metadata": {}, + "source": [ + "----\n", + "\n", + "E' anche possibile indicare un link,\n", + "evitando però di usarlo per poi alterare\n", + "la semantica dei dati." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ede8e5b", + "metadata": { + "attributes": { + "classes": [ + "yaml" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "# Associate a json-ld context to a schema\n", + "Customer:\n", + "  type: object\n", + "  required: [email]\n", + "  properties:\n", + " \"@context\":\n", + " const: \"https://api.example/customer-context.jsonld/"\n", + " email: {type: string}\n", + "    pet: {type: string}" + ] + }, + { + "cell_type": "markdown", + "id": "4d003e61", + "metadata": {}, + "source": [ + "----\n", + "\n", + "Descrivendo un'API in formato OAS3 possiamo\n", + "descrivere i diversi formati usando i meccanismi\n", + "di content-negotiation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a523318", + "metadata": { + "attributes": { + "classes": [ + "yaml" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "openapi: 3.0.1\n", + "...\n", + "paths:\n", + " /users:\n", + " get:\n", + " ...\n", + " responses:\n", + " \"200\":\n", + " content:\n", + " application/json:\n", + " schema:\n", + " $ref: \"#/components/schemas/Person\"\n", + " application/ld+json:\n", + " schema:\n", + " allOf:\n", + " - type: object\n", + " properties:\n", + " \"@context\":\n", + " const:\n", + " \"@vocab\": \"https://w3id.org/italia/onto/CPV//"\n", + " given_name: givenName\n", + " family_name: familyName\n", + " - $ref: \"#/components/schemas/Person\"\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "486581b9", + "metadata": {}, + "source": [ + "---\n", + "\n", + "### Vocabolario per la semantica\n", + "\n", + "Un altro meccanismo per collegare @context\n", + "e schema, è quello di utilizzare un vocabolario\n", + "e delle parole chiavi all'interno dello schema.\n", + "\n", + "Questo meccanismo è più semplice, ma richiede\n", + "di generare il @context a partire da un vocabolario esterno." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd6e98e7", + "metadata": { + "attributes": { + "classes": [ + "yaml" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "Person:\n", + " type: object\n", + " properties:\n", + " givenName:\n", + " type: string\n", + " x-refersTo: https://w3id.org/italia/onto/CPV/givenName\n", + " familyName:\n", + " x-refersTo: https://w3id.org/italia/onto/CPV/familyName\n", + " type: string\n" + ] + }, + { + "cell_type": "markdown", + "id": "96015ba8", + "metadata": {}, + "source": [ + "### Ontologia per json-schema\n", + "\n", + "Il progetto [Web of Things](https://w3.org/ns/td.jsonld) definisce invece\n", + "un vocabolario per \"Thing description\" in formato json-ld dove ad ogni property viene associato\n", + "sia un valore semantico che uno sintattico tramite il vocabolario\n", + "[json-schema](https://w3.org/ns/json-schema/).\n", + "\n", + "## Trasformare dati semantici\n", + "\n", + "E' possibile trasformare dei dati semanticamente definiti in diversi formati\n", + "usando una serie di specifiche.\n", + "\n", + "- https://www.w3.org/2013/csvw/wiki/CSV-LD\n", + "- https://www.w3.org/TR/json-ld-framing/ force a specific tree layout to a JSON-LD document." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd9fd935", + "metadata": { + "attributes": { + "classes": [ + "mermaid" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "flowchart\n", + "\n", + " RDF--Framing--> JSON --context--> RDF\n", + " CSV --csv-ld--> RDF\n" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/Tagliatelle.n3 b/sparql-101/notebooks/Tagliatelle.n3 new file mode 100644 index 0000000..d0fc612 --- /dev/null +++ b/sparql-101/notebooks/Tagliatelle.n3 @@ -0,0 +1,248 @@ +@prefix dbo: . +@prefix dbr: . +dbr:Beat_Bobby_Flay dbo:wikiPageWikiLink dbr:Tagliatelle . + dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Lombard_cuisine dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Italian_cuisine dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Prosciutto dbo:wikiPageWikiLink dbr:Tagliatelle . + dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Maltagliati dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Cuisine_of_Mantua dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Chinese_noodles dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Anna_Del_Conte dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Cannalonga dbo:wikiPageWikiLink dbr:Tagliatelle . +@prefix foaf: . +@prefix wikipedia-en: . +wikipedia-en:Tagliatelle foaf:primaryTopic dbr:Tagliatelle . +dbr:Emilia-Romagna dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Durum dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Noodle dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Molise dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Gratin dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Italian_food_products dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:List_of_English_words_of_Italian_origin dbo:wikiPageWikiLink dbr:Tagliatelle . + dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Pizzoccheri dbo:wikiPageWikiLink dbr:Tagliatelle . +@prefix gold: . +dbr:Pizzoccheri gold:hypernym dbr:Tagliatelle . +dbr:Tumact_me_tulez dbo:wikiPageWikiLink dbr:Tagliatelle . +@prefix dbp: . +dbr:Tumact_me_tulez dbp:mainIngredient dbr:Tagliatelle ; + dbo:ingredient dbr:Tagliatelle . +dbr:Maurizio_Mosca dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:List_of_pasta_dishes dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Griko_people dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Argentine_cuisine dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Pasta_primavera dbo:wikiPageWikiLink dbr:Tagliatelle . + dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Fridge_Wars dbo:wikiPageWikiLink dbr:Tagliatelle . + dbo:wikiPageWikiLink dbr:Tagliatelle . + dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Slovak_cuisine dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Pasta_e_ceci dbo:wikiPageWikiLink dbr:Tagliatelle . + dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Bolognese_sauce dbo:wikiPageWikiLink dbr:Tagliatelle . +@prefix rdf: . +@prefix owl: . +dbr:Tagliatelle rdf:type owl:Thing . +@prefix wikidata: . +dbr:Tagliatelle rdf:type wikidata:Q2095 , + dbo:Food . +@prefix rdfs: . +dbr:Tagliatelle rdfs:label "Tagliatelle"@in , + "\uD0C8\uB9AC\uC544\uD154\uB808"@ko , + "\u30BF\u30EA\u30A2\u30C6\u30C3\u30EC"@ja , + "Tagliatelle"@nl , + "Tallar\u00EDn"@es , + "Tagliatelle"@cs , + "Tagliatelle"@it , + "Tagliatelle"@sv , + "\u0422\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u0435"@uk , + "Tagliatelle"@pl , + "Tagliatelle"@pt , + "\u0422\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u043B\u0435"@ru , + "Tagliatelle"@en , + "Tagliatelle"@de , + "\u03A4\u03B1\u03BB\u03B9\u03B1\u03C4\u03AD\u03BB\u03B5\u03C2"@el , + "Tallarina"@ca , + "\u062A\u0627\u0644\u064A\u0627\u062A\u064A\u0644\u064A"@ar , + "Tagliatelle"@fr ; + rdfs:comment "\u0422\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u0435 (\u0456\u0442\u0430\u043B. tagliatelle), \u0442\u0430\u043A\u043E\u0436 \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u0432\u043E \u0442\u0430\u0433\u043B\u0456\u0430\u0442\u0435\u043B\u0435 \u2014 \u0440\u0456\u0437\u043D\u043E\u0432\u0438\u0434 \u043B\u043E\u043A\u0448\u0438\u043D\u0438, \u043A\u043B\u0430\u0441\u0438\u0447\u043D\u0430 \u0456\u0442\u0430\u043B\u0456\u0439\u0441\u044C\u043A\u0430 \u043F\u0430\u0441\u0442\u0430 \u0437 \u0440\u0435\u0433\u0456\u043E\u043D\u0443 \u0415\u043C\u0456\u043B\u0456\u044F-\u0420\u043E\u043C\u0430\u043D\u044C\u044F. \u0422\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u0435 - \u0446\u0435 \u0434\u043E\u0432\u0433\u0456 \u043F\u043B\u0430\u0441\u043A\u0456 \u0441\u0442\u0440\u0456\u0447\u043A\u0438 \u0437\u0430\u0432\u0448\u0438\u0440\u0448\u043A\u0438 \u0443 0,65\u20141 \u0441\u043C, \u0437\u0430 \u0444\u043E\u0440\u043C\u043E\u044E \u0441\u0445\u043E\u0436\u0456 \u043D\u0430 \u0444\u0435\u0442\u0443\u0447\u0447\u0456\u043D\u0435. \u0417\u0430\u0437\u0432\u0438\u0447\u0430\u0439 \u0442\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u0435 \u043F\u043E\u0434\u0430\u044E\u0442\u044C \u0437 \u0440\u0456\u0437\u043D\u0438\u043C\u0438 \u0432\u0438\u0434\u0430\u043C\u0438 \u0441\u043E\u0443\u0441\u0456\u0432, \u043D\u0430\u0439\u0447\u0430\u0441\u0442\u0456\u0448\u0438\u0439 \u0432\u0430\u0440\u0456\u0430\u043D\u0442 \u0441\u0435\u0440\u0432\u0456\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u2014 \u0437 \u043C'\u044F\u0441\u043D\u0438\u043C \u0441\u043E\u0443\u0441\u043E\u043C \u0431\u043E\u043B\u043E\u043D\u044C\u0454\u0437\u0435 (\u0456\u0442\u0430\u043B. tagliatelle alla bolognese). \u041E\u0434\u0438\u043D \u0437 \u0440\u0456\u0437\u043D\u043E\u0432\u0438\u0434\u0456\u0432 \u0442\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u0435 \u2014 \u043F\u0456\u0446\u043E\u043A\u0435\u0440\u0456."@uk , + "Les tallarines o tallarins, i vetes, de tagliatelle (itali\u00E0), \u00E9s un tipus de pasta italiana amb forma de veta. Les tallarines s\u00F3n origin\u00E0ries de l'Emilia-Romagna. El nom tagliatelle (singular \"tagliatella\") prov\u00E9 de l'itali\u00E0 \"tagliare\" (tallar). Les tagliatelle s\u00F3n similars a les fettuccine per\u00F2 m\u00E9s fines (la forma \u00E9s pr\u00E0cticament id\u00E8ntica). Aquestes dues varietats de pasta s\u00F3n d'una amplada m\u00E9s gran que les linguine. Per\u00F2, en alguns indrets del Pa\u00EDs Valenci\u00E0, es diu tallarina a all\u00F2 que els castellans coneixen com a \"telara\u00F1a\"."@ca , + "Tagliatelle, tamb\u00E9m conhecido como Tagliatella e Taiadela, s\u00E3o o tipo mais comum das massas cortadas em tiras. Por vezes, s\u00E3o consideradas sin\u00F3nimos dos fettuccine, embora outras fontes considerem que as tagliatelle devem ter, no m\u00E1ximo, 0,75 cm de largura e os tagliatelline ou fettuccine n\u00E3o podem ultrapassar os 0,5 cm. Os tagliatelle s\u00E3o tradicionalmente acompanhados de molho \u00E0 bolonhesa."@pt , + "Tagliatelle [ta\u028E\u02D0a\u02C8t\u025Bl\u02D0e] (von italienisch tagliare, \u201Eschneiden\u201C) sind eine Variante von Bandnudeln. Sie gelten als klassische Pasta aus der Region Emilia-Romagna in Italien. Die einzelne Nudel ist wie ein langes flaches Band geformt, den Fettuccine \u00E4hnlich, aber mit typischerweise ungef\u00E4hr 5\u201310 mm etwas breiter. Um Tagliatelle von Hand herstellen zu k\u00F6nnen, muss man den Teig so ausrollen, dass dabei keine L\u00F6cher, Risse oder Unterschiede in der St\u00E4rke entstehen."@de , + "\u30BF\u30EA\u30A2\u30C6\u30C3\u30EC\uFF08Tagliatelle, \u30BF\u30C3\u30EA\u30E3\u30C6\u30C3\u30EC\u3001\u30BF\u30C3\u30AE\u30E3\u30C6\u30C3\u30EC\uFF09\u306F\u30A4\u30BF\u30EA\u30A2\u5317\u90E8\u3067\u7528\u3044\u3089\u308C\u308B\u30D1\u30B9\u30BF\u306E\u4E00\u7A2E\u3067\u3042\u308B \u3002\u7D30\u9577\u3044\u30EA\u30DC\u30F3\u72B6\u3067\u539A\u30551\u30DF\u30EA\u30E1\u30FC\u30C8\u30EB\u3001\u5E45\u306F8\u30DF\u30EA\u30E1\u30FC\u30C8\u30EB\u307B\u3069\u3002\u30A4\u30BF\u30EA\u30A2\u8A9E tagliare\uFF08\u5207\u308B\uFF09\u306E\u6D3E\u751F\u8A9E\u3002 \u30DC\u30ED\u30FC\u30CB\u30E3\u3067\u306F\u30DF\u30FC\u30C8\u30BD\u30FC\u30B9\u3067\u3042\u3048\u308B\u306E\u304C\u5B9A\u756A\u3002 \u30A4\u30BF\u30EA\u30A2\u306E\u4E2D\u5357\u90E8\u306B\u304A\u3044\u3066\u306F\u3053\u306E\u30BF\u30A4\u30D7\u306E\u9EBA\u3092\u30D5\u30A7\u30C3\u30C8\u30A5\u30C1\u30FC\u30CD\u3068\u547C\u3076\u3002\u4E21\u8005\u306F\u57FA\u672C\u7684\u306B\u9055\u3044\u306F\u306A\u3044\u304C\u3001\u30D5\u30A7\u30C3\u30C8\u30A5\u30C1\u30FC\u30CD\u3068\u6BD4\u3057\u3066\u30BF\u30EA\u30A2\u30C6\u30C3\u30EC\u306F\u82E5\u5E72\u8584\u304F\u3001\u5E45\u3082\u72ED\u3044\u3002\u30BF\u30EA\u30A2\u30C6\u30C3\u30EC\u3088\u308A\u5C11\u3057\u7D30\u3044\u9EBA\u3092\u30BF\u30EA\u30AA\u30EA\u30FC\u30CB\u3068\u8A00\u3046\u3002"@ja , + "\u0422\u0430\u043B\u044C\u044F\u0442\u0435\u0301\u043B\u043B\u0435 (\u0438\u0442\u0430\u043B. tagliatelle, \u043E\u0442 \u0433\u043B\u0430\u0433\u043E\u043B\u0430 tagliare (\u0442\u0430\u043B\u044C\u044F\u0440\u0435) \u2014 \u0440\u0435\u0437\u0430\u0442\u044C, \u0442\u0430\u043A\u0436\u0435 \u043E\u0448\u0438\u0431\u043E\u0447\u043D\u043E \u0442\u0430\u0433\u043B\u0438\u0430\u0442\u0435\u043B\u043B\u0435) \u2014 \u043A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0438\u0442\u0430\u043B\u044C\u044F\u043D\u0441\u043A\u0438\u0435 \u043C\u0430\u043A\u0430\u0440\u043E\u043D\u043D\u044B\u0435 \u0438\u0437\u0434\u0435\u043B\u0438\u044F \u0438\u0437 \u0440\u0435\u0433\u0438\u043E\u043D\u0430 \u042D\u043C\u0438\u043B\u0438\u044F-\u0420\u043E\u043C\u0430\u043D\u044C\u044F. \u0422\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u043B\u0435 \u2014 \u044D\u0442\u043E \u0442\u0438\u043F\u0438\u0447\u043D\u0430\u044F \u043F\u0430\u0441\u0442\u0430 \u0411\u043E\u043B\u043E\u043D\u044C\u0438, \u0438\u043C\u0435\u043D\u043D\u043E \u0435\u0451 \u043F\u043E\u0434\u0430\u044E\u0442 \u0441 \u0441\u043E\u0443\u0441\u043E\u043C \u0431\u043E\u043B\u043E\u043D\u044C\u0435\u0437\u0435 (\u0438\u0442\u0430\u043B. tagliatelle alla bolognese). \u041E\u0434\u043D\u0430 \u0438\u0437 \u0440\u0430\u0437\u043D\u043E\u0432\u0438\u0434\u043D\u043E\u0441\u0442\u0435\u0439 \u0442\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u043B\u0435 \u2014 \u043F\u0438\u0446\u0446\u043E\u043A\u0435\u0440\u0438."@ru , + "Tagliatelle a tagliolini (z italsk\u00E9ho tagliare \u2013 \u201E\u0159ezat\u201C) jsou t\u011Bstoviny, kter\u00E9 se tradi\u010Dn\u011B vyr\u00E1b\u011Bj\u00ED v italsk\u00FDch oblastech Emilia-Romagna a Marche. Tagliatelle jsou dlouh\u00E9 ploch\u00E9 nudle, kter\u00E9 se tvarem podobaj\u00ED t\u011Bstovin\u00E1m fettuccine a m\u00EDvaj\u00ED na \u0161\u00ED\u0159ku 0,65 a\u017E 1 cm. Tagliatelle se pod\u00E1vaj\u00ED s r\u016Fzn\u00FDmi om\u00E1\u010Dkami, tradi\u010Dn\u011B p\u0159edev\u0161\u00EDm s om\u00E1\u010Dkou bolo\u0148skou. Tagliolini jsou jednou z variant tagliatelle \u2013 jsou stejn\u011B dlouh\u00E9, ale jsou ten\u010D\u00ED a maj\u00ED kruhov\u00FD profil. Dal\u0161\u00EDm druhem jsou bavette \u2013 ty jsou ten\u010D\u00ED ne\u017E tagliatelle. A je\u0161t\u011B o n\u011Bco ten\u010D\u00ED jsou pak bavettine."@cs , + "Le tagliatelle sono una pasta all'uovo tipica dell'Emilia e della Romagnae diffuse nella cucina tradizionale del Centro e Nord Italia. Il loro nome deriva dal verbo \"tagliare\", dato che tradizionalmente si ottengono stendendo la pasta in sfoglia sottile e tagliandola, dopo averla arrotolata."@it , + "Tagliatelle (tagliolini, reg. taglierini \u2013 z w\u0142. tagliare \u2013 ci\u0105\u0107) \u2013 klasyczny w\u0142oski makaron z rejonu Emilia-Romagna w kszta\u0142cie d\u0142ugich, p\u0142askich wst\u0105\u017Cek o grubo\u015Bci ok. 2 mm i szeroko\u015Bci 0,65-1 cm. Kszta\u0142tem przypomina fettuccine, lecz jest od niego szerszy. Tagliatelle podaje si\u0119 zwykle z sosami, zazwyczaj z bolognese."@pl , + "\uD0C8\uB9AC\uC544\uD154\uB808(\uC774\uD0C8\uB9AC\uC544\uC5B4: Tagliatelle, ta\u028E\u02D0a't\u025Bl\u02D0e)\uB294 \uC774\uD0C8\uB9AC\uC544\uC758 \uD30C\uC2A4\uD0C0 \uC77C\uC885\uC73C\uB85C\uC11C \uD2B9\uBCC4\uD788 \uC5D0\uBC00\uB9AC\uC544\uB85C\uB9C8\uB0D0\uC8FC\uC5D0\uC11C \uB098\uD0C0\uB098\uB294 \uD615\uD0DC\uC774\uB2E4. \uBA74\uBC1C \uD558\uB098\uD558\uB098\uB97C \uBCF4\uC790\uBA74 \uC0C1\uB2F9\uD788 \uAE38\uACE0 \uB113\uC801\uD55C \uD615\uD0DC\uC758 \uBA74\uBC1C\uC774\uB2E4. \uD3ED\uC740 0.65cm ~ 1cm \uC815\uB3C4\uC778\uB370 \uBBF8\uD2B8 \uC18C\uC2A4\uB97C \uB9CE\uC774 \uACC1\uB4E4\uC5EC \uBA39\uB294\uB2E4. \uC2E0\uC120\uD55C \uD30C\uC2A4\uD0C0 \uBA74\uC73C\uB85C \uB9CC\uB4DC\uB294 \uD0C8\uB9AC\uC544\uD154\uB808\uB294 \uB2E4\uB978 \uBA74\uACFC \uB2E4\uB974\uAC8C \uD22C\uBC15\uD558\uAC70\uB098 \uD761\uC218\uC131\uC774 \uAC15\uD558\uAE30 \uB54C\uBB38\uC5D0 \uC18C\uC2A4\uB97C \uBC84\uBB34\uB824 \uBA39\uAE30\uC5D0\uB294 \uC544\uC8FC \uC88B\uB2E4. \uB300\uAC1C\uB294 \uC1E0\uACE0\uAE30\uB098 \uB3FC\uC9C0\uACE0\uAE30\uB97C \uC4F0\uBA70 \uD2B9\uBCC4\uD55C \uACBD\uC6B0\uC5D0\uB294 \uD1A0\uB07C\uACE0\uAE30\uB85C \uB9CC\uB4E0 \uC18C\uC2A4\uB97C \uCCA8\uAC00\uD574\uC11C \uBA39\uB294\uB2E4. \uCC44\uC2DD\uC8FC\uC758\uC790\uC5D0\uAC8C\uB294 \uB545\uCF69 \uB4F1 \uACAC\uACFC\uB098 \uD1A0\uB9C8\uD1A0\uC640 \uBC14\uC9C8\uB85C \uB9CC\uB4DC\uB294 \uC18C\uC2A4\uB97C \uC0AC\uC6A9\uD574\uC11C \uBA39\uB294\uB2E4."@ko , + "Tagliatelle (Italian pronunciation: [ta\u028E\u028Ea\u02C8t\u025Blle]; from the Italian tagliare, meaning \"to cut\") are a traditional type of pasta from the Emilia-Romagna and Marche regions of Italy. Individual pieces of tagliatelle are long, flat ribbons that are similar in shape to fettuccine and are traditionally about 6 mm (1\u20444 in) wide. Tagliatelle can be served with a variety of sauces, though the classic is a meat sauce or Bolognese sauce. Tagliatelle are traditionally made with egg pasta. The traditional ratio is one egg to one hundred grams of flour."@en , + "Tagliatelle (Italiaans: /ta\u028E\u028Ea\u02C8t\u025Blle/, spreek uit: tal.jia.tel.le) ) is een Italiaanse pasta uit de regio Emilia-Romagna. Naar vorm zijn het lintnoedels of bandnoedels, naar samenstelling meestal eiernoedels. In droge vorm zijn de linten zeven mm breed, in gekookte vorm worden zij acht mm breed. De pasta wordt meestal met saus geserveerd, waarvan de bolognesesaus de bekendste is. Om tagliatelle makkelijk te kunnen opdienen gebruikt men een spaghettitang."@nl , + "Tagliatelle (ta\u028E\u02D0a\u02C8t\u025Bl\u02D0e) och tagliolini (fr\u00E5n det italienska tagliare, som betyder \"att sk\u00E4ra\") \u00E4r klassisk italiensk pasta fr\u00E5n regionen Emilia-Romagna. Pastan \u00E4r l\u00E5nga, platta bj\u00E4lkar liknande fettuccine, och \u00E4r vanligtvis mellan en halv och en centimeter breda. Tagliatelle kan serveras med flera olika sorters s\u00E5ser, \u00E4ven om den mest vanliga \u00E4r k\u00F6ttf\u00E4rss\u00E5s, s\u00E5 kallad spaghetti bolognese. Tagliolini \u00E4r en variant av tagliatellen som \u00E4r l\u00E5ng och cylinderformad, inte platt."@sv , + "El tallar\u00EDn (del italiano taglierini) es un tipo de masa (pasta) alargada, de ancho peque\u00F1o y forma achatada que integran el conjunto de las paste asciutte (pastas secas) de origen italiano. Los que se conocen en toda Europa y en buena parte del mundo occidental provienen directamente de Italia y no deben ser confundidos con preparaciones parecidas, pero distintas, como las procedentes de China, donde se preparan fideos semejantes a los tallarines y a los spaghetti italianos, pero que tienen una historia y una t\u00E9cnica de procesamiento completamente diferente a los presentes en Italia.\u200B"@es , + "Tagliatelle merupakan sebuah pasta klasik dari region Emilia-Romagna di Italia. Tagliatelle memiliki panjang berupa 0.65 cm hingga 1 cm (0.25 hingga 0.375 inci). Mereka dapat disajikan dalam berbagai saus, yang klasik adalah daging kecap atau saus Bolognese. Tagliatelle juga dihidangkan dalam berbagai selera seperti daging sapi, sayuran, ikan, dan sebagainya sesuai selera. \n* l \n* \n* s"@in , + "\u039F\u03B9 \u03C4\u03B1\u03BB\u03B9\u03B1\u03C4\u03AD\u03BB\u03B5\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03B1\u03C1\u03B1\u03B4\u03BF\u03C3\u03B9\u03B1\u03BA\u03CC \u03B5\u03AF\u03B4\u03BF\u03C2 \u03B6\u03C5\u03BC\u03B1\u03C1\u03B9\u03BA\u03BF\u03CD \u03B1\u03C0\u03CC \u03C4\u03B9\u03C2 \u03C0\u03B5\u03C1\u03B9\u03BF\u03C7\u03AD\u03C2 \u0395\u03BC\u03AF\u03BB\u03B9\u03B1-\u03A1\u03BF\u03BC\u03AC\u03BD\u03B9\u03B1 \u03BA\u03B1\u03B9 \u039C\u03AC\u03C1\u03BA\u03B5 \u03C4\u03B7\u03C2 \u0399\u03C4\u03B1\u03BB\u03AF\u03B1\u03C2."@el , + "Les tagliatelles ou taliatelles sont une vari\u00E9t\u00E9 de p\u00E2tes longues en forme de lani\u00E8res de la cuisine italienne (centre et nord de l'Italie) variantes des fettuccine, tagliolini, pappardelle, ou des taillerins de la cuisine savoyarde."@fr , + "\u062A\u0627\u0644\u064A\u0627\u062A\u064A\u0644\u064A (Tagliatelle) \u0647\u064A \u0643\u0644\u0645\u0629 \u0623\u0634\u062A\u0642\u062A \u0645\u0646 \u0627\u0644\u0643\u0644\u0645\u0629 \u0627\u0644\u0623\u064A\u0637\u0627\u0644\u064A\u0629 (tagliare) \u0628\u0645\u0639\u0646\u0649 \u00AB\u0627\u0644\u0642\u064E\u0637\u0652\u0639\u00BB \u0648 \u0627\u0644\u062A\u0627\u0644\u064A\u0627\u062A\u064A\u0644\u064A \u0647\u064A \u0627\u0644\u0628\u0627\u0633\u062A\u0627 \u0627\u0644\u0643\u0644\u0627\u0633\u064A\u0643\u064A\u0629 \u0644\u0625\u0642\u0644\u064A\u0645 \u0625\u0645\u064A\u0644\u064A\u0627 \u0631\u0648\u0645\u0627\u0646\u064A\u0627 \u0641\u064A \u0625\u064A\u0637\u0627\u0644\u064A\u0627. \u0628\u0634\u0643\u0644 \u0645\u0646\u0641\u0631\u062F \u0648\u0645\u062A\u0645\u064A\u0632 \u0638\u0644 \u0647\u0630\u0627 \u0627\u0644\u0646\u0648\u0639 \u0645\u0646 \u0627\u0644\u0628\u0627\u0633\u062A\u0627 \u0644\u0645\u062F\u0629 \u0637\u0648\u064A\u0644\u0629 \u0643\u0623\u0634\u0631\u0637\u0629 \u0645\u0633\u062A\u0648\u064A\u0629 \u0645\u0645\u0627\u062B\u0644\u0629 \u0641\u064A \u0627\u0644\u0634\u0643\u0644\u0650 \u0625\u0644\u0649 \u0645\u0639\u0643\u0631\u0648\u0646\u0629 \u0641\u064A\u062A\u0648\u062A\u0634\u0646\u064A\u060C \u0644\u0643\u0646 \u0627\u0644\u062D\u062C\u0645 \u0627\u0644\u0646\u0645\u0648\u0630\u062C\u064A \u0644\u0647\u0630\u0647 \u0627\u0644\u0628\u0627\u0633\u062A\u0627 \u062D\u0648\u0627\u0644\u064A 0.65 \u0633\u0646\u062A\u064A\u0645\u062A\u0631 \u0625\u0644\u0649 1 \u0633\u0646\u062A\u064A\u0645\u062A\u0631\u0650 (0.25 \u0625\u0644\u0649 0.375 \u0628\u0648\u0635\u0629) \u0639\u0631\u064A\u0636\u0629. \u064A\u0645\u0643\u0646 \u0623\u0646 \u062A\u064F\u0642\u062F\u0645 \u0647\u0630 \u0627\u0644\u0628\u0627\u0633\u062A\u0627 \u0645\u0639 \u062A\u0634\u0643\u064A\u0644\u0629 \u0645\u0646 \u0627\u0644\u0635\u0644\u0635\u0627\u062A \u0627\u0644\u0643\u0644\u0627\u0633\u064A\u0643\u064A\u0629 \u0645\u062B\u0644 \u0623\u0648 ."@ar ; + foaf:name "Tagliatelle"@en ; + foaf:depiction , + , + , + , + . +@prefix dc: . +dbr:Tagliatelle dc:type "Primo" . +@prefix dcterms: . +@prefix dbc: . +dbr:Tagliatelle dcterms:subject dbc:Cuisine_of_Emilia-Romagna , + dbc:Wide_pasta ; + dbo:abstract "\u062A\u0627\u0644\u064A\u0627\u062A\u064A\u0644\u064A (Tagliatelle) \u0647\u064A \u0643\u0644\u0645\u0629 \u0623\u0634\u062A\u0642\u062A \u0645\u0646 \u0627\u0644\u0643\u0644\u0645\u0629 \u0627\u0644\u0623\u064A\u0637\u0627\u0644\u064A\u0629 (tagliare) \u0628\u0645\u0639\u0646\u0649 \u00AB\u0627\u0644\u0642\u064E\u0637\u0652\u0639\u00BB \u0648 \u0627\u0644\u062A\u0627\u0644\u064A\u0627\u062A\u064A\u0644\u064A \u0647\u064A \u0627\u0644\u0628\u0627\u0633\u062A\u0627 \u0627\u0644\u0643\u0644\u0627\u0633\u064A\u0643\u064A\u0629 \u0644\u0625\u0642\u0644\u064A\u0645 \u0625\u0645\u064A\u0644\u064A\u0627 \u0631\u0648\u0645\u0627\u0646\u064A\u0627 \u0641\u064A \u0625\u064A\u0637\u0627\u0644\u064A\u0627. \u0628\u0634\u0643\u0644 \u0645\u0646\u0641\u0631\u062F \u0648\u0645\u062A\u0645\u064A\u0632 \u0638\u0644 \u0647\u0630\u0627 \u0627\u0644\u0646\u0648\u0639 \u0645\u0646 \u0627\u0644\u0628\u0627\u0633\u062A\u0627 \u0644\u0645\u062F\u0629 \u0637\u0648\u064A\u0644\u0629 \u0643\u0623\u0634\u0631\u0637\u0629 \u0645\u0633\u062A\u0648\u064A\u0629 \u0645\u0645\u0627\u062B\u0644\u0629 \u0641\u064A \u0627\u0644\u0634\u0643\u0644\u0650 \u0625\u0644\u0649 \u0645\u0639\u0643\u0631\u0648\u0646\u0629 \u0641\u064A\u062A\u0648\u062A\u0634\u0646\u064A\u060C \u0644\u0643\u0646 \u0627\u0644\u062D\u062C\u0645 \u0627\u0644\u0646\u0645\u0648\u0630\u062C\u064A \u0644\u0647\u0630\u0647 \u0627\u0644\u0628\u0627\u0633\u062A\u0627 \u062D\u0648\u0627\u0644\u064A 0.65 \u0633\u0646\u062A\u064A\u0645\u062A\u0631 \u0625\u0644\u0649 1 \u0633\u0646\u062A\u064A\u0645\u062A\u0631\u0650 (0.25 \u0625\u0644\u0649 0.375 \u0628\u0648\u0635\u0629) \u0639\u0631\u064A\u0636\u0629. \u064A\u0645\u0643\u0646 \u0623\u0646 \u062A\u064F\u0642\u062F\u0645 \u0647\u0630 \u0627\u0644\u0628\u0627\u0633\u062A\u0627 \u0645\u0639 \u062A\u0634\u0643\u064A\u0644\u0629 \u0645\u0646 \u0627\u0644\u0635\u0644\u0635\u0627\u062A \u0627\u0644\u0643\u0644\u0627\u0633\u064A\u0643\u064A\u0629 \u0645\u062B\u0644 \u0623\u0648 ."@ar , + "Tagliatelle merupakan sebuah pasta klasik dari region Emilia-Romagna di Italia. Tagliatelle memiliki panjang berupa 0.65 cm hingga 1 cm (0.25 hingga 0.375 inci). Mereka dapat disajikan dalam berbagai saus, yang klasik adalah daging kecap atau saus Bolognese. Tagliatelle juga dihidangkan dalam berbagai selera seperti daging sapi, sayuran, ikan, dan sebagainya sesuai selera. \n* l \n* \n* s"@in , + "\uD0C8\uB9AC\uC544\uD154\uB808(\uC774\uD0C8\uB9AC\uC544\uC5B4: Tagliatelle, ta\u028E\u02D0a't\u025Bl\u02D0e)\uB294 \uC774\uD0C8\uB9AC\uC544\uC758 \uD30C\uC2A4\uD0C0 \uC77C\uC885\uC73C\uB85C\uC11C \uD2B9\uBCC4\uD788 \uC5D0\uBC00\uB9AC\uC544\uB85C\uB9C8\uB0D0\uC8FC\uC5D0\uC11C \uB098\uD0C0\uB098\uB294 \uD615\uD0DC\uC774\uB2E4. \uBA74\uBC1C \uD558\uB098\uD558\uB098\uB97C \uBCF4\uC790\uBA74 \uC0C1\uB2F9\uD788 \uAE38\uACE0 \uB113\uC801\uD55C \uD615\uD0DC\uC758 \uBA74\uBC1C\uC774\uB2E4. \uD3ED\uC740 0.65cm ~ 1cm \uC815\uB3C4\uC778\uB370 \uBBF8\uD2B8 \uC18C\uC2A4\uB97C \uB9CE\uC774 \uACC1\uB4E4\uC5EC \uBA39\uB294\uB2E4. \uC2E0\uC120\uD55C \uD30C\uC2A4\uD0C0 \uBA74\uC73C\uB85C \uB9CC\uB4DC\uB294 \uD0C8\uB9AC\uC544\uD154\uB808\uB294 \uB2E4\uB978 \uBA74\uACFC \uB2E4\uB974\uAC8C \uD22C\uBC15\uD558\uAC70\uB098 \uD761\uC218\uC131\uC774 \uAC15\uD558\uAE30 \uB54C\uBB38\uC5D0 \uC18C\uC2A4\uB97C \uBC84\uBB34\uB824 \uBA39\uAE30\uC5D0\uB294 \uC544\uC8FC \uC88B\uB2E4. \uB300\uAC1C\uB294 \uC1E0\uACE0\uAE30\uB098 \uB3FC\uC9C0\uACE0\uAE30\uB97C \uC4F0\uBA70 \uD2B9\uBCC4\uD55C \uACBD\uC6B0\uC5D0\uB294 \uD1A0\uB07C\uACE0\uAE30\uB85C \uB9CC\uB4E0 \uC18C\uC2A4\uB97C \uCCA8\uAC00\uD574\uC11C \uBA39\uB294\uB2E4. \uCC44\uC2DD\uC8FC\uC758\uC790\uC5D0\uAC8C\uB294 \uB545\uCF69 \uB4F1 \uACAC\uACFC\uB098 \uD1A0\uB9C8\uD1A0\uC640 \uBC14\uC9C8\uB85C \uB9CC\uB4DC\uB294 \uC18C\uC2A4\uB97C \uC0AC\uC6A9\uD574\uC11C \uBA39\uB294\uB2E4."@ko , + "Les tagliatelles ou taliatelles sont une vari\u00E9t\u00E9 de p\u00E2tes longues en forme de lani\u00E8res de la cuisine italienne (centre et nord de l'Italie) variantes des fettuccine, tagliolini, pappardelle, ou des taillerins de la cuisine savoyarde."@fr , + "Tagliatelle [ta\u028E\u02D0a\u02C8t\u025Bl\u02D0e] (von italienisch tagliare, \u201Eschneiden\u201C) sind eine Variante von Bandnudeln. Sie gelten als klassische Pasta aus der Region Emilia-Romagna in Italien. Die einzelne Nudel ist wie ein langes flaches Band geformt, den Fettuccine \u00E4hnlich, aber mit typischerweise ungef\u00E4hr 5\u201310 mm etwas breiter. Um Tagliatelle von Hand herstellen zu k\u00F6nnen, muss man den Teig so ausrollen, dass dabei keine L\u00F6cher, Risse oder Unterschiede in der St\u00E4rke entstehen."@de , + "\u30BF\u30EA\u30A2\u30C6\u30C3\u30EC\uFF08Tagliatelle, \u30BF\u30C3\u30EA\u30E3\u30C6\u30C3\u30EC\u3001\u30BF\u30C3\u30AE\u30E3\u30C6\u30C3\u30EC\uFF09\u306F\u30A4\u30BF\u30EA\u30A2\u5317\u90E8\u3067\u7528\u3044\u3089\u308C\u308B\u30D1\u30B9\u30BF\u306E\u4E00\u7A2E\u3067\u3042\u308B \u3002\u7D30\u9577\u3044\u30EA\u30DC\u30F3\u72B6\u3067\u539A\u30551\u30DF\u30EA\u30E1\u30FC\u30C8\u30EB\u3001\u5E45\u306F8\u30DF\u30EA\u30E1\u30FC\u30C8\u30EB\u307B\u3069\u3002\u30A4\u30BF\u30EA\u30A2\u8A9E tagliare\uFF08\u5207\u308B\uFF09\u306E\u6D3E\u751F\u8A9E\u3002 \u30DC\u30ED\u30FC\u30CB\u30E3\u3067\u306F\u30DF\u30FC\u30C8\u30BD\u30FC\u30B9\u3067\u3042\u3048\u308B\u306E\u304C\u5B9A\u756A\u3002 \u30A4\u30BF\u30EA\u30A2\u306E\u4E2D\u5357\u90E8\u306B\u304A\u3044\u3066\u306F\u3053\u306E\u30BF\u30A4\u30D7\u306E\u9EBA\u3092\u30D5\u30A7\u30C3\u30C8\u30A5\u30C1\u30FC\u30CD\u3068\u547C\u3076\u3002\u4E21\u8005\u306F\u57FA\u672C\u7684\u306B\u9055\u3044\u306F\u306A\u3044\u304C\u3001\u30D5\u30A7\u30C3\u30C8\u30A5\u30C1\u30FC\u30CD\u3068\u6BD4\u3057\u3066\u30BF\u30EA\u30A2\u30C6\u30C3\u30EC\u306F\u82E5\u5E72\u8584\u304F\u3001\u5E45\u3082\u72ED\u3044\u3002\u30BF\u30EA\u30A2\u30C6\u30C3\u30EC\u3088\u308A\u5C11\u3057\u7D30\u3044\u9EBA\u3092\u30BF\u30EA\u30AA\u30EA\u30FC\u30CB\u3068\u8A00\u3046\u3002"@ja , + "Tagliatelle (Italiaans: /ta\u028E\u028Ea\u02C8t\u025Blle/, spreek uit: tal.jia.tel.le) ) is een Italiaanse pasta uit de regio Emilia-Romagna. Naar vorm zijn het lintnoedels of bandnoedels, naar samenstelling meestal eiernoedels. In droge vorm zijn de linten zeven mm breed, in gekookte vorm worden zij acht mm breed. De pasta wordt meestal met saus geserveerd, waarvan de bolognesesaus de bekendste is. Om tagliatelle makkelijk te kunnen opdienen gebruikt men een spaghettitang."@nl , + "Tagliatelle (Italian pronunciation: [ta\u028E\u028Ea\u02C8t\u025Blle]; from the Italian tagliare, meaning \"to cut\") are a traditional type of pasta from the Emilia-Romagna and Marche regions of Italy. Individual pieces of tagliatelle are long, flat ribbons that are similar in shape to fettuccine and are traditionally about 6 mm (1\u20444 in) wide. Tagliatelle can be served with a variety of sauces, though the classic is a meat sauce or Bolognese sauce. Tagliatelle are traditionally made with egg pasta. The traditional ratio is one egg to one hundred grams of flour."@en , + "\u0422\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u0435 (\u0456\u0442\u0430\u043B. tagliatelle), \u0442\u0430\u043A\u043E\u0436 \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u0432\u043E \u0442\u0430\u0433\u043B\u0456\u0430\u0442\u0435\u043B\u0435 \u2014 \u0440\u0456\u0437\u043D\u043E\u0432\u0438\u0434 \u043B\u043E\u043A\u0448\u0438\u043D\u0438, \u043A\u043B\u0430\u0441\u0438\u0447\u043D\u0430 \u0456\u0442\u0430\u043B\u0456\u0439\u0441\u044C\u043A\u0430 \u043F\u0430\u0441\u0442\u0430 \u0437 \u0440\u0435\u0433\u0456\u043E\u043D\u0443 \u0415\u043C\u0456\u043B\u0456\u044F-\u0420\u043E\u043C\u0430\u043D\u044C\u044F. \u0422\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u0435 - \u0446\u0435 \u0434\u043E\u0432\u0433\u0456 \u043F\u043B\u0430\u0441\u043A\u0456 \u0441\u0442\u0440\u0456\u0447\u043A\u0438 \u0437\u0430\u0432\u0448\u0438\u0440\u0448\u043A\u0438 \u0443 0,65\u20141 \u0441\u043C, \u0437\u0430 \u0444\u043E\u0440\u043C\u043E\u044E \u0441\u0445\u043E\u0436\u0456 \u043D\u0430 \u0444\u0435\u0442\u0443\u0447\u0447\u0456\u043D\u0435. \u0417\u0430\u0437\u0432\u0438\u0447\u0430\u0439 \u0442\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u0435 \u043F\u043E\u0434\u0430\u044E\u0442\u044C \u0437 \u0440\u0456\u0437\u043D\u0438\u043C\u0438 \u0432\u0438\u0434\u0430\u043C\u0438 \u0441\u043E\u0443\u0441\u0456\u0432, \u043D\u0430\u0439\u0447\u0430\u0441\u0442\u0456\u0448\u0438\u0439 \u0432\u0430\u0440\u0456\u0430\u043D\u0442 \u0441\u0435\u0440\u0432\u0456\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u2014 \u0437 \u043C'\u044F\u0441\u043D\u0438\u043C \u0441\u043E\u0443\u0441\u043E\u043C \u0431\u043E\u043B\u043E\u043D\u044C\u0454\u0437\u0435 (\u0456\u0442\u0430\u043B. tagliatelle alla bolognese). \u041E\u0434\u0438\u043D \u0437 \u0440\u0456\u0437\u043D\u043E\u0432\u0438\u0434\u0456\u0432 \u0442\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u0435 \u2014 \u043F\u0456\u0446\u043E\u043A\u0435\u0440\u0456."@uk , + "Tagliatelle a tagliolini (z italsk\u00E9ho tagliare \u2013 \u201E\u0159ezat\u201C) jsou t\u011Bstoviny, kter\u00E9 se tradi\u010Dn\u011B vyr\u00E1b\u011Bj\u00ED v italsk\u00FDch oblastech Emilia-Romagna a Marche. Tagliatelle jsou dlouh\u00E9 ploch\u00E9 nudle, kter\u00E9 se tvarem podobaj\u00ED t\u011Bstovin\u00E1m fettuccine a m\u00EDvaj\u00ED na \u0161\u00ED\u0159ku 0,65 a\u017E 1 cm. Tagliatelle se pod\u00E1vaj\u00ED s r\u016Fzn\u00FDmi om\u00E1\u010Dkami, tradi\u010Dn\u011B p\u0159edev\u0161\u00EDm s om\u00E1\u010Dkou bolo\u0148skou. Tagliolini jsou jednou z variant tagliatelle \u2013 jsou stejn\u011B dlouh\u00E9, ale jsou ten\u010D\u00ED a maj\u00ED kruhov\u00FD profil. Dal\u0161\u00EDm druhem jsou bavette \u2013 ty jsou ten\u010D\u00ED ne\u017E tagliatelle. A je\u0161t\u011B o n\u011Bco ten\u010D\u00ED jsou pak bavettine."@cs , + "Le tagliatelle sono una pasta all'uovo tipica dell'Emilia e della Romagnae diffuse nella cucina tradizionale del Centro e Nord Italia. Il loro nome deriva dal verbo \"tagliare\", dato che tradizionalmente si ottengono stendendo la pasta in sfoglia sottile e tagliandola, dopo averla arrotolata."@it , + "El tallar\u00EDn (del italiano taglierini) es un tipo de masa (pasta) alargada, de ancho peque\u00F1o y forma achatada que integran el conjunto de las paste asciutte (pastas secas) de origen italiano. Los que se conocen en toda Europa y en buena parte del mundo occidental provienen directamente de Italia y no deben ser confundidos con preparaciones parecidas, pero distintas, como las procedentes de China, donde se preparan fideos semejantes a los tallarines y a los spaghetti italianos, pero que tienen una historia y una t\u00E9cnica de procesamiento completamente diferente a los presentes en Italia.\u200B"@es , + "Tagliatelle (tagliolini, reg. taglierini \u2013 z w\u0142. tagliare \u2013 ci\u0105\u0107) \u2013 klasyczny w\u0142oski makaron z rejonu Emilia-Romagna w kszta\u0142cie d\u0142ugich, p\u0142askich wst\u0105\u017Cek o grubo\u015Bci ok. 2 mm i szeroko\u015Bci 0,65-1 cm. Kszta\u0142tem przypomina fettuccine, lecz jest od niego szerszy. Tagliatelle podaje si\u0119 zwykle z sosami, zazwyczaj z bolognese."@pl , + "Tagliatelle, tamb\u00E9m conhecido como Tagliatella e Taiadela, s\u00E3o o tipo mais comum das massas cortadas em tiras. Por vezes, s\u00E3o consideradas sin\u00F3nimos dos fettuccine, embora outras fontes considerem que as tagliatelle devem ter, no m\u00E1ximo, 0,75 cm de largura e os tagliatelline ou fettuccine n\u00E3o podem ultrapassar os 0,5 cm. Estas pastas, tradicionalmente feitas \u00E0 m\u00E3o, t\u00EAm como ingredientes a semolina ou farinha de trigo de gr\u00E3o duro e ovos, come\u00E7ando por uma massa estendida bem fina, chamada \u201Csfoglia\u201D. No entanto, existem ainda as pastas verdes, cuja massa pode ser preparada com espinafre (o mais comum), com urtiga, ou acelga. Os tagliatelle s\u00E3o tradicionalmente acompanhados de molho \u00E0 bolonhesa."@pt , + "\u039F\u03B9 \u03C4\u03B1\u03BB\u03B9\u03B1\u03C4\u03AD\u03BB\u03B5\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03B1\u03C1\u03B1\u03B4\u03BF\u03C3\u03B9\u03B1\u03BA\u03CC \u03B5\u03AF\u03B4\u03BF\u03C2 \u03B6\u03C5\u03BC\u03B1\u03C1\u03B9\u03BA\u03BF\u03CD \u03B1\u03C0\u03CC \u03C4\u03B9\u03C2 \u03C0\u03B5\u03C1\u03B9\u03BF\u03C7\u03AD\u03C2 \u0395\u03BC\u03AF\u03BB\u03B9\u03B1-\u03A1\u03BF\u03BC\u03AC\u03BD\u03B9\u03B1 \u03BA\u03B1\u03B9 \u039C\u03AC\u03C1\u03BA\u03B5 \u03C4\u03B7\u03C2 \u0399\u03C4\u03B1\u03BB\u03AF\u03B1\u03C2."@el , + "\u0422\u0430\u043B\u044C\u044F\u0442\u0435\u0301\u043B\u043B\u0435 (\u0438\u0442\u0430\u043B. tagliatelle, \u043E\u0442 \u0433\u043B\u0430\u0433\u043E\u043B\u0430 tagliare (\u0442\u0430\u043B\u044C\u044F\u0440\u0435) \u2014 \u0440\u0435\u0437\u0430\u0442\u044C, \u0442\u0430\u043A\u0436\u0435 \u043E\u0448\u0438\u0431\u043E\u0447\u043D\u043E \u0442\u0430\u0433\u043B\u0438\u0430\u0442\u0435\u043B\u043B\u0435) \u2014 \u043A\u043B\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0438\u0442\u0430\u043B\u044C\u044F\u043D\u0441\u043A\u0438\u0435 \u043C\u0430\u043A\u0430\u0440\u043E\u043D\u043D\u044B\u0435 \u0438\u0437\u0434\u0435\u043B\u0438\u044F \u0438\u0437 \u0440\u0435\u0433\u0438\u043E\u043D\u0430 \u042D\u043C\u0438\u043B\u0438\u044F-\u0420\u043E\u043C\u0430\u043D\u044C\u044F. \u0422\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u043B\u0435 \u2014 \u044D\u0442\u043E \u0442\u0438\u043F\u0438\u0447\u043D\u0430\u044F \u043F\u0430\u0441\u0442\u0430 \u0411\u043E\u043B\u043E\u043D\u044C\u0438, \u0438\u043C\u0435\u043D\u043D\u043E \u0435\u0451 \u043F\u043E\u0434\u0430\u044E\u0442 \u0441 \u0441\u043E\u0443\u0441\u043E\u043C \u0431\u043E\u043B\u043E\u043D\u044C\u0435\u0437\u0435 (\u0438\u0442\u0430\u043B. tagliatelle alla bolognese). \u041E\u0434\u043D\u0430 \u0438\u0437 \u0440\u0430\u0437\u043D\u043E\u0432\u0438\u0434\u043D\u043E\u0441\u0442\u0435\u0439 \u0442\u0430\u043B\u044C\u044F\u0442\u0435\u043B\u043B\u0435 \u2014 \u043F\u0438\u0446\u0446\u043E\u043A\u0435\u0440\u0438."@ru , + "Tagliatelle (ta\u028E\u02D0a\u02C8t\u025Bl\u02D0e) och tagliolini (fr\u00E5n det italienska tagliare, som betyder \"att sk\u00E4ra\") \u00E4r klassisk italiensk pasta fr\u00E5n regionen Emilia-Romagna. Pastan \u00E4r l\u00E5nga, platta bj\u00E4lkar liknande fettuccine, och \u00E4r vanligtvis mellan en halv och en centimeter breda. Tagliatelle kan serveras med flera olika sorters s\u00E5ser, \u00E4ven om den mest vanliga \u00E4r k\u00F6ttf\u00E4rss\u00E5s, s\u00E5 kallad spaghetti bolognese. Tagliolini \u00E4r en variant av tagliatellen som \u00E4r l\u00E5ng och cylinderformad, inte platt."@sv , + "Les tallarines o tallarins, i vetes, de tagliatelle (itali\u00E0), \u00E9s un tipus de pasta italiana amb forma de veta. Les tallarines s\u00F3n origin\u00E0ries de l'Emilia-Romagna. El nom tagliatelle (singular \"tagliatella\") prov\u00E9 de l'itali\u00E0 \"tagliare\" (tallar). Les tagliatelle s\u00F3n similars a les fettuccine per\u00F2 m\u00E9s fines (la forma \u00E9s pr\u00E0cticament id\u00E8ntica). Aquestes dues varietats de pasta s\u00F3n d'una amplada m\u00E9s gran que les linguine. Per\u00F2, en alguns indrets del Pa\u00EDs Valenci\u00E0, es diu tallarina a all\u00F2 que els castellans coneixen com a \"telara\u00F1a\". Aquesta pasta \u00E9s ideal per menjar amb salses espesses, com la bolonyesa i la salsa napolitana. Les tallarines tamb\u00E9 es mengen sovint a la carbonara i amb salses a base de bolets (con funghi) o alberg\u00EDnia (con le melanzane)."@ca ; + dbo:wikiPageWikiLink dbr:Italy , + dbr:House_of_Este , + dbr:Marche , + , + , + dbr:Flour , + dbr:Pasta , + dbc:Wide_pasta , + dbc:Cuisine_of_Emilia-Romagna , + dbr:Tagliolini , + dbr:Sauce , + dbr:Pappardelle , + dbr:Bolognese_sauce , + dbr:Emilia-Romagna , + dbr:Bologna , + dbr:Annibale_II_Bentivoglio , + dbr:Passatelli , + dbr:Fettuccine , + dbr:Pizzoccheri , + dbr:Chamber_of_Commerce . +@prefix dbt: . +dbr:Tagliatelle dbp:wikiPageUsesTemplate dbt:Citation_needed , + dbt:Cvt , + dbt:Convert , + dbt:Short_description , + dbt:Pasta , + dbt:Infobox_prepared_food , + dbt:Reflist , + dbt:IPA-it ; + dbo:thumbnail ; + dbo:wikiPageRevisionID 1090414673 ; + dbp:country dbr:Italy . +@prefix xsd: . +dbr:Tagliatelle dbo:wikiPageLength "4058"^^xsd:nonNegativeInteger ; + dbo:wikiPageID 456363 ; + dbp:name "Tagliatelle"@en ; + dbp:caption "The distinctive shape of tagliatelle pasta"@en . +@prefix dbpedia-fr: . +dbr:Tagliatelle owl:sameAs dbpedia-fr:Tagliatelle , + dbr:Tagliatelle . +@prefix dbpedia-ca: . +dbr:Tagliatelle owl:sameAs dbpedia-ca:Tallarina . +@prefix dbpedia-is: . +dbr:Tagliatelle owl:sameAs dbpedia-is:Tagliatelle , + , + . +@prefix dbpedia-no: . +dbr:Tagliatelle owl:sameAs dbpedia-no:Tagliatelle , + . +@prefix dbpedia-pl: . +dbr:Tagliatelle owl:sameAs dbpedia-pl:Tagliatelle . +@prefix dbpedia-id: . +dbr:Tagliatelle owl:sameAs dbpedia-id:Tagliatelle , + , + , + . +@prefix ns21: . +dbr:Tagliatelle owl:sameAs ns21:Tagghiateddi . +@prefix dbpedia-hu: . +dbr:Tagliatelle owl:sameAs dbpedia-hu:Tagliatelle , + . +@prefix ns23: . +dbr:Tagliatelle owl:sameAs ns23:vEKz . +@prefix dbpedia-pt: . +dbr:Tagliatelle owl:sameAs dbpedia-pt:Tagliatelle . +@prefix dbpedia-da: . +dbr:Tagliatelle owl:sameAs dbpedia-da:Tagliatelle , + , + . +@prefix dbpedia-fi: . +dbr:Tagliatelle owl:sameAs dbpedia-fi:Tagliatelle . +@prefix dbpedia-af: . +dbr:Tagliatelle owl:sameAs dbpedia-af:Tagliatelle . +@prefix dbpedia-nl: . +dbr:Tagliatelle owl:sameAs dbpedia-nl:Tagliatelle , + , + . +@prefix ns29: . +dbr:Tagliatelle owl:sameAs ns29:Tagliatelle , + wikidata:Q20044 . +@prefix dbpedia-it: . +dbr:Tagliatelle owl:sameAs dbpedia-it:Tagliatelle . +@prefix dbpedia-de: . +dbr:Tagliatelle owl:sameAs dbpedia-de:Tagliatelle . +@prefix dbpedia-sv: . +dbr:Tagliatelle owl:sameAs dbpedia-sv:Tagliatelle . +@prefix dbpedia-cs: . +dbr:Tagliatelle owl:sameAs dbpedia-cs:Tagliatelle , + , + ; + gold:hypernym dbr:Type . +@prefix prov: . +dbr:Tagliatelle prov:wasDerivedFrom ; + dbo:type dbr:Pasta ; + dbp:type dbr:Pasta ; + foaf:isPrimaryTopicOf wikipedia-en:Tagliatelle ; + dbo:ingredientName "flourand egg" ; + dbp:mainIngredient "flour and egg"@en ; + dbo:ingredient dbr:Flour ; + dbp:course "Primo"@en ; + dbo:notes "Long and thin. Can be served with a creamy sauce and cheese." ; + dbo:hasVariant dbr:Pizzoccheri , + dbr:Fettuccine , + dbr:Tagliolini ; + dbp:variations dbr:Pizzoccheri , + dbr:Fettuccine , + dbr:Tagliolini ; + dbo:country dbr:Italy ; + dbp:imageSize 250 ; + dbo:region dbr:Emilia-Romagna , + dbr:Marche ; + dbp:other "Long and thin. Can be served with a creamy sauce and cheese."@en ; + dbp:region "Emilia-Romagna and Marche"@en . +dbr:List_of_pasta dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:List_of_Italian_dishes dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Fettuccine dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Sfoglina dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Ciclista_Lima_Association dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Bologna dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:List_of_Burmese_dishes dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Burmese_salads dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Cuisine_of_Basilicata dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Tagliolini dbo:wikiPageWikiLink dbr:Tagliatelle . + dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Tourism_in_San_Marino dbo:wikiPageWikiLink dbr:Tagliatelle . + dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Rimini dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Monghidoro dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Chicken_paprikash dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:HJIM_van_Gasteren dbo:wikiPageWikiLink dbr:Tagliatelle . +dbr:Marcella_Hazan dbo:wikiPageWikiLink dbr:Tagliatelle . diff --git a/sparql-101/notebooks/Tortellini.n3 b/sparql-101/notebooks/Tortellini.n3 new file mode 100644 index 0000000..b123d9b --- /dev/null +++ b/sparql-101/notebooks/Tortellini.n3 @@ -0,0 +1,270 @@ +@prefix dbo: . +@prefix dbr: . +dbr:Wonton dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Beat_Bobby_Flay dbo:wikiPageWikiLink dbr:Tortellini . +dbr:List_of_Good_Eats_episodes dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Venetian_cuisine dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Italian_cuisine dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Simone_Zanoni dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Agnolini dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Tortello_amaro_di_Castel_Goffredo dbo:wikiPageWikiLink dbr:Tortellini ; + dbo:hasVariant dbr:Tortellini . +@prefix dbp: . +dbr:Tortello_amaro_di_Castel_Goffredo dbp:variations dbr:Tortellini . +@prefix foaf: . +@prefix wikipedia-en: . +wikipedia-en:Tortellini foaf:primaryTopic dbr:Tortellini . +dbr:MasterChef_Thailand_All-Stars dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Modena dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Sara_Errani dbo:wikiPageWikiLink dbr:Tortellini . +dbr:List_of_Cutthroat_Kitchen_episodes dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Tortelloni dbo:wikiPageWikiLink dbr:Tortellini ; + dbo:hasVariant dbr:Tortellini ; + dbp:variations dbr:Tortellini . +dbr:Pitepalt dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Emilia-Romagna dbo:wikiPageWikiLink dbr:Tortellini . +dbr:List_of_stuffed_dishes dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Italian_food_products dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Filled_pasta dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Nutmeg dbo:wikiPageWikiLink dbr:Tortellini . +dbr:List_of_English_words_of_Italian_origin dbo:wikiPageWikiLink dbr:Tortellini . +dbr:List_of_Italian_inventions_and_discoveries dbo:wikiPageWikiLink dbr:Tortellini . + dbo:wikiPageWikiLink dbr:Tortellini . + dbo:wikiPageWikiLink dbr:Tortellini . +dbr:List_of_pasta_dishes dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Dumpling dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Pierogi dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Facchini_Group dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Castelfranco_Emilia dbo:wikiPageWikiLink dbr:Tortellini . +@prefix rdf: . +dbr:Tortellini rdf:type dbo:Food . +@prefix owl: . +dbr:Tortellini rdf:type owl:Thing . +@prefix wikidata: . +dbr:Tortellini rdf:type wikidata:Q2095 . +@prefix rdfs: . +dbr:Tortellini rdfs:label "Tortellini"@in , + "\u0422\u043E\u0440\u0442\u0435\u043B\u0456\u043D\u0456"@uk , + "Tortellini"@de , + "Tortellini"@it , + "Tortel\u00B7lini"@ca , + "Tortellini"@es , + "Tortellini"@nl , + "\u0422\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438"@ru , + "\u30C8\u30EB\u30C6\u30EA\u30FC\u30CB"@ja , + "Tortellini"@sv , + "\u610F\u5927\u5229\u9984\u9968"@zh , + "\uD1A0\uB974\uD154\uB9AC\uB2C8"@ko , + "\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A"@ar , + "Tortellini"@pl , + "Tortellini"@cs , + "Tortellini"@en , + "Tortellini"@pt , + "Tortellini"@fr ; + rdfs:comment "Tortellini ou tort\u00E9i s\u00E3o pastelinhos de massa de farinha de trigo e gemas de ovos que, depois de estendida bem fina, \u00E9 cortada em quadrados que s\u00E3o recheados com uma mistura de carnes e dobrados sobre si pr\u00F3prios e com um dedo para formarem umas rodelas com a forma do umbigo, ou \u201Ccappelletti\u201D, como tamb\u00E9m \u00E9 chamado, tamb\u00E9m \u00E9 conhecido como agnolotti ou agnolini em alguns lugares do Brasil. Fazem parte das massas aliment\u00EDcias t\u00EDpicas da It\u00E1lia, especificamente dentro dos \u201CProdotti agroalimentari tradizionali dell\u2019 Emilia Romagna\u201D e, mais especificamente, das prov\u00EDncias de Bologna e Modena. Segundo a \"Irmandade do Tortelloni\", estes pastelinhos devem ser exclusivamente comidos num caldo, de galinha ou de carne de vaca."@pt , + "Tortellini, fr\u00E5n italienskans \"torta\" (t\u00E5rta eller vridning), \u00E4r en sorts ringformad pasta som kan ha olika typer av fyllning, exempelvis skinka, svamp eller (parmesan-)ost. Pastan kommer ursprungligen fr\u00E5n den italienska regionen Emilia-Romagna och d\u00E4r serveras den i buljong, med gr\u00E4dde, eller med en ragu eller liknande s\u00E5s (s\u00E4rskilt i Bologna och Modena). De flesta restauranger i Bologna s\u00E5v\u00E4l som \"La Confraternita del Tortellino\" \u00E4r ense om att den \u00E4kta tortellinin endast serveras med hemlagad buljong. Tortellini med gr\u00E4dde \u00E4r accepterat i Bologna, men detta kritiseras av somliga. Tortellini med ragu, \u00E4ven om det finns, anses av m\u00E5nga i Bologna vara icke autentiskt."@sv , + "I tortellini sono una pasta all'uovo ripiena, tipica di Bologna e di Modena."@it , + "\uD1A0\uB974\uD154\uB9AC\uB2C8(\uC774\uD0C8\uB9AC\uC544\uC5B4: Tortellini)\uB294 \uC18C\uB97C \uB123\uC740 \uD30C\uC2A4\uD0C0\uC758 \uC77C\uC885\uC73C\uB85C\uC11C \uBA74\uC774 \uBC18\uC9C0 \uBAA8\uC591\uCC98\uB7FC \uB465\uAE00\uB465\uAE00\uD55C \uAC83\uC774 \uD2B9\uC9D5\uC774\uB2E4. \uB3FC\uC9C0\uACE0\uAE30\uB098 \uBAA8\uCC28\uB810\uB77C\uCE58\uC988, \uD30C\uB974\uBA54\uC0B0 \uCE58\uC988\uB97C \uB9CE\uC774 \uC0AC\uC6A9\uD55C\uB2E4. \uD2B9\uBCC4\uD788 \uC774\uD0C8\uB9AC\uC544\uC758 \uC5D0\uBC00\uB9AC\uC544\uB85C\uB9C8\uB0D0\uC8FC\uC5D0\uC11C \uB9CE\uC774 \uBA39\uB294\uB2E4. \uB9DB\uC740 \uC544\uC8FC \uAC78\uCB49\uD558\uC9C0 \uC54A\uACE0 \uBB3D\uC740 \uC218\uD504\uC774\uBA70 \uD06C\uB9BC\uC744 \uCCA8\uAC00\uD558\uAE30\uB3C4 \uD55C\uB2E4. \uD3EC\uC7A5\uC744 \uD558\uAC70\uB098 \uB0C9\uC7A5 \uBCF4\uAD00, \uB0C9\uB3D9 \uBCF4\uAD00\uB41C \uD1A0\uB974\uD154\uB9AC\uB2C8\uB294 \uC804 \uC138\uACC4\uC801\uC73C\uB85C\uB3C4 \uB9CE\uC774 \uBC1C\uACAC\uB418\uB294\uB370 \uC2DD\uD488 \uC5C5\uCCB4\uC5D0\uC11C \uC0DD\uC0B0\uD558\uC5EC \uC218\uCD9C\uD55C\uB2E4. \uB300\uAC1C\uB294 \uC774\uD0C8\uB9AC\uC544 \uD68C\uC0AC\uC5D0\uC11C \uC0DD\uC0B0\uD558\uBA70 \uD1A0\uB974\uD154\uB9AC\uB2C8\uB294 \uC2E0\uC120\uD55C \uC0C1\uD0DC\uB85C \uCD5C\uB300 7\uC8FC \uC815\uB3C4 \uBCF4\uAD00\uB420 \uC218 \uC788\uB2E4. \uBE44\uC2B7\uD55C \uC74C\uC2DD\uC73C\uB85C\uB294 \uC6B0\uD06C\uB77C\uC774\uB098\uC5D0\uC11C \uD06C\uB9AC\uC2A4\uB9C8\uC2A4 \uB54C \uBA39\uB294 \uC74C\uC2DD\uC778 \"vushka\" (\uC6B0\uD06C\uB77C\uC774\uB098\uC5B4: \u0432\u0443\u0448\u043A\u0430)\uAC00 \uC788\uB2E4. \uD1A0\uB974\uD154\uB85C\uB2C8\uB77C\uB294 \uBE44\uC2B7\uD55C \uD615\uD0DC\uC758 \uD30C\uC2A4\uD0C0\uB294 \uD1A0\uB974\uD154\uB9AC\uB2C8\uBCF4\uB2E4 \uC870\uAE08 \uB354 \uD06C\uB2E4. \uB450 \uC885\uB958 \uBAA8\uB450 \uC5EC\uB7EC \uC74C\uC2DD\uC5D0 \uB2E4\uCC44\uB85C\uC6B4 \uC4F0\uC784\uC0C8\uB97C \uC9C0\uB2C8\uACE0 \uC788\uC9C0\uB9CC \uBBF8\uD2B8 \uC18C\uC2A4\uAC00 \uD754\uD558\uB2E4. \uD1A0\uB974\uD154\uB9AC\uB2C8\uAC00 \uBBF8\uD2B8 \uC18C\uC2A4\uB97C \uB354 \uB9CE\uC774 \uC0AC\uC6A9\uD55C\uB2E4. \uD1A0\uB974\uD154\uB85C\uB2C8\uB294 \uC2DD\uD0C1\uC5D0 \uC790\uC8FC \uC624\uB974\uC9C0\uB294 \uC54A\uB294 \uC74C\uC2DD\uC774\uB2E4."@ko , + "Tortellini \u2013 tradycyjne w\u0142oskie piero\u017Cki z nadzieniem mi\u0119snym, grzybowym b\u0105d\u017A serowym, podawane z sosem pomidorowym (mo\u017Cna r\u00F3wnie\u017C korzysta\u0107 z innych sos\u00F3w, lecz nie jest to w\u00F3wczas w ca\u0142o\u015Bci w\u0142oska potrawa). Na koniec ca\u0142o\u015B\u0107 posypuje si\u0119 tartym serem (najcz\u0119\u015Bciej parmezanem). Podobnym rodzajem s\u0105 cappelletti, kt\u00F3re r\u00F3\u017Cni\u0105 si\u0119 sposobem wywini\u0119cia ko\u0144c\u00F3wek ciasta."@pl , + "Tortellini es una variedad de pasta con forma de anillo, compuesta por una capa de masa enrollada y unida por sus extremos, rellena de carne, queso y huevos. Hay distintas formas de servirlos, ya sea en caldo o con crema de leche. Este plato surgi\u00F3 en la regi\u00F3n italiana de Emilia-Roma\u00F1a, con origen disputado entre las provincias de Bolonia y M\u00F3dena.\u200B"@es , + "Tortellini (Plural von Tortellino, italienisch f\u00FCr \u201Ekleiner Kuchen\u201C) sind ringf\u00F6rmige Teigwaren, die \u2013 \u00E4hnlich wie Ravioli \u2013 gef\u00FCllt sind. Die traditionelle F\u00FCllung besteht aus einer Mischung von Schweinefleisch, Parmaschinken, Mortadella, Parmesank\u00E4se, Eiern und Muskatnuss. Tortellini werden f\u00FCr gew\u00F6hnlich in einer H\u00FChnerfleischbr\u00FChe (Tortellini in brodo) oder seltener mit Sahneso\u00DFe serviert."@de , + "\u0422\u043E\u0440\u0442\u0435\u043B\u0456\u043D\u0456 (\u0456\u0442\u0430\u043B. Tortellini) \u2014 \u0456\u0442\u0430\u043B\u0456\u0439\u0441\u044C\u043A\u0456 \u043F\u0435\u043B\u044C\u043C\u0435\u043D\u0456 \u0456\u0437 \u043F\u0440\u0456\u0441\u043D\u043E\u0433\u043E \u0442\u0456\u0441\u0442\u0430 \u0437 \u043C'\u044F\u0441\u043E\u043C, \u0441\u0438\u0440\u043E\u043C \u0430\u0431\u043E \u043E\u0432\u043E\u0447\u0430\u043C\u0438. \u0406\u0441\u0442\u043E\u0440\u0438\u0447\u043D\u0430 \u0431\u0430\u0442\u044C\u043A\u0456\u0432\u0449\u0438\u043D\u0430 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0456\u043D\u0456 \u2014 \u0411\u043E\u043B\u043E\u043D\u044C\u044F, \u043F\u0440\u043E\u0442\u0435 \u0437\u0430\u0440\u0430\u0437 \u0446\u0435\u0439 \u0440\u0456\u0437\u043D\u043E\u0432\u0438\u0434 \u043C\u0430\u043A\u0430\u0440\u043E\u043D\u043D\u0438\u0445 \u0432\u0438\u0440\u043E\u0431\u0456\u0432 \u0433\u043E\u0442\u0443\u044E\u0442\u044C \u043F\u043E \u0432\u0441\u0456\u0439 \u0406\u0442\u0430\u043B\u0456\u0457. \u0417\u0430 \u0444\u043E\u0440\u043C\u043E\u044E \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0456\u043D\u0456 \u043D\u0430\u0433\u0430\u0434\u0443\u0454 \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0456 \u043F\u0435\u043B\u044C\u043C\u0435\u043D\u0456, \u043A\u0443\u0442\u043E\u0447\u043A\u0438 \u044F\u043A\u0438\u0445 \u0437'\u0454\u0434\u043D\u0443\u044E\u0442\u044C, \u0449\u043E\u0431 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u043A\u0456\u043B\u044C\u0446\u0435 \u0430\u0431\u043E \u0431\u0443\u0442\u043E\u043D\u0447\u0438\u043A. \u0404 \u043A\u0456\u043B\u044C\u043A\u0430 \u0440\u0456\u0437\u043D\u043E\u0432\u0438\u0434\u0456\u0432 \u0442\u043E\u0440\u0442\u0435\u043B\u0456\u043D\u0456 \u2014 \u043D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0456 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0456 \u0442\u0430 \u0442\u043E\u0440\u0442\u0435\u043B\u043E\u043D\u0456 \u0456 \u0437\u043E\u0432\u0441\u0456\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0456 \u0442\u043E\u0440\u0442\u0435\u043B\u0435\u0442\u0456. \u0422\u043E\u0440\u0442\u0435\u043B\u0456\u043D\u0456 \u043F\u0440\u0438\u0439\u043D\u044F\u0442\u043E \u043F\u043E\u0434\u0430\u0432\u0430\u0442\u0438 \u0456\u0437 \u0441\u043E\u0443\u0441\u043E\u043C. \u0426\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0442\u0440\u0430\u0434\u0438\u0446\u0456\u0439\u043D\u0438\u0439 \u0431\u043E\u043B\u043E\u043D\u044C\u0454\u0437\u0435, \u0430\u0431\u043E \u0436 \u0432\u0435\u0440\u0448\u043A\u043E\u0432\u0438\u0439 \u0456 \u0433\u0440\u0438\u0431\u043D\u0438\u0439 \u0441\u043E\u0443\u0441\u0438. \u0427\u0430\u0441\u0442\u043E \u0456\u0442\u0430\u043B\u0456\u0439\u0446\u0456 \u0437\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0442\u044C \u0442\u043E\u0440\u0442\u0435\u043B\u0456\u043D\u0456 \u0431\u0443\u043B\u044C\u0439\u043E\u043D\u0438 \u0456 \u0441\u0443\u043F\u0438."@uk , + "Tortellini (mno\u017En\u00E9 \u010D\u00EDslo slova tortellino, italsky \u201Emal\u00FD kol\u00E1\u010Dek\u201C) jsou pln\u011Bn\u00E9 t\u011Bstoviny prstencovit\u00E9ho tvaru. Jsou obvykle pln\u011Bny vep\u0159ov\u00FDm masem s mortadellou a parmez\u00E1nem. Poch\u00E1zej\u00ED z italsk\u00E9 provincie Bologna. Tortellini se obvykle serv\u00EDruj\u00ED v pol\u00E9vce (tortellini in brodo), nebo netradi\u010Dn\u011B se smetanovou om\u00E1\u010Dkou."@cs , + "\u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A (Tortellini) \u0647\u064A \u0645\u0639\u0643\u0631\u0648\u0646\u0629 \u0639\u0644\u0649 \u0634\u0643\u0644 \u062D\u0644\u0642\u0627\u062A\u060C \u0648\u0623\u062D\u064A\u0627\u0646\u0627 \u064A\u062A\u0645 \u0648\u0635\u0641\u0647\u0627 \u0623\u064A\u0636\u0627 \u0643\u0634\u0643\u0644 \u0627\u0644\u0633\u0631\u0629\u060C \u0648\u0628\u0630\u0644\u0643 \u0633\u064F\u0645\u064A\u062A \u0628\u0623\u0633\u0645\u0627\u0621 \u0628\u062F\u064A\u0644\u0629 \u0645\u062B\u0644 \u0633\u0631\u0629 \u0627\u0644\u0628\u0637\u0646.\u0648\u0639\u0627\u062F\u0629\u064B \u0645\u0627 \u062A\u0643\u0648\u0646 \u0645\u062D\u0634\u0648\u0629 \u0628\u0645\u0632\u064A\u062C \u0645\u0646 \u0627\u0644\u0644\u062D\u0648\u0645 \u0623\u0648 \u0627\u0644\u062C\u0628\u0646. \u064A\u0623\u062A\u064A \u0641\u064A \u0627\u0644\u0623\u0635\u0644 \u0645\u0646 \u0645\u0646\u0637\u0642\u0629 \u0625\u064A\u0645\u064A\u0644\u064A\u0627 \u0627\u0644\u0625\u064A\u0637\u0627\u0644\u064A\u0629 (\u0648\u0644\u0627\u0633\u064A\u0645\u0627 \u0645\u0646 \u0628\u0648\u0644\u0648\u0646\u064A\u0627 \u0648\u0645\u0648\u062F\u064A\u0646\u0627) \u0648\u0639\u0627\u062F\u0629\u064B \u0645\u0627 \u064A\u062A\u0645 \u062A\u0642\u062F\u064A\u0645\u0647\u0627 \u0645\u0639 \u0627\u0644\u0645\u0631\u0642 \u060C \u0625\u0645\u0627 \u0645\u0646 \u0627\u0644\u0644\u062D\u0645 \u0623\u0648 \u0627\u0644\u062F\u062C\u0627\u062C \u0623\u0648 \u0643\u0644\u064A\u0647\u0645\u0627.\u062A\u0638\u0647\u0631 \u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A \u0623\u0648 \u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u0648\u0646\u064A \u0648\u0647\u064A (\u0645\u0634\u0627\u0628\u0647\u0629 \u0644\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A \u0644\u0643\u0646\u0647\u0627 \u0623\u0643\u0628\u0631 \u062D\u062C\u0645\u0627\u064B\u060C \u0645\u0639 \u0627\u0644\u062C\u0628\u0646 \u0648/\u0623\u0648 \u0645\u062D\u0634\u0648\u0629 \u0628\u0627\u0644\u062E\u0636\u0631\u0648\u0627\u062A) \u0641\u064A \u0645\u0648\u0627\u0642\u0639 \u0639\u062F\u064A\u062F\u0629 \u0645\u0646 \u062C\u0645\u064A\u0639 \u0623\u0646\u062D\u0627\u0621 \u0627\u0644\u0639\u0627\u0644\u0645 \u0625\u0645\u0627 \u0645\u0639\u0628\u0623\u0629 \u0623\u0648 \u0645\u0628\u0631\u062F\u0629 \u0623\u0648 \u0645\u062C\u0645\u062F\u0629. \u0648\u062E\u0627\u0635\u0627\u064B \u0639\u0646\u062F\u0645\u0627 \u062A\u0643\u0648\u0646 \u0647\u0646\u0627\u0643 \u0645\u062C\u062A\u0645\u0639\u0627\u062A \u0625\u064A\u0637\u0627\u0644\u064A\u0629 \u0643\u0628\u064A\u0631\u0629. \u064A\u062A\u0645 \u062A\u0635\u0646\u064A\u0639 \u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A \u0648\u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u0648\u0646\u064A \u0641\u064A \u0623\u0633\u0648\u0627\u0642 \u062A\u0632\u0648\u064A\u062F \u0627\u0644\u062E\u0637\u0648\u0637 \u0627\u0644\u0635\u0646\u0627\u0639\u064A\u0629 \u0627\u0644\u0623\u0648\u0631\u0628\u064A\u0629 \u0641\u064A \u0623\u0648\u0631\u0648\u0628\u0627 \u0648\u0627\u0628\u0639\u062F \u0645\u0646 \u0630\u0644\u0643. \u0648\u0639\u0627\u062F\u0629\u064B \u0645\u0627 \u062A\u0623\u062E\u0630 \u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A \u0627\u0644\u0645\u0639\u0628\u0623\u0629 \u0648\u0627\u0644\u0637\u0627\u0632\u062C\u0629 7 \u0623\u0633\u0627\u0628\u064A\u0639 \u0645\u0646 \u0641\u062A\u0631\u0629 \u0635\u0644\u0627\u062D\u064A\u062A\u0647\u0627."@ar , + "\u0422\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u0301\u043D\u0438 (\u0438\u0442\u0430\u043B. Tortellini) \u2014 \u0438\u0442\u0430\u043B\u044C\u044F\u043D\u0441\u043A\u0438\u0435 \u043F\u0435\u043B\u044C\u043C\u0435\u043D\u0438 \u0438\u0437 \u043F\u0440\u0435\u0441\u043D\u043E\u0433\u043E \u0442\u0435\u0441\u0442\u0430 \u0441 \u043C\u044F\u0441\u043E\u043C, \u0441\u044B\u0440\u043E\u043C \u0438\u043B\u0438 \u043E\u0432\u043E\u0449\u0430\u043C\u0438. \u0418\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0440\u043E\u0434\u0438\u043D\u0430 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u2014 \u0440\u0435\u0433\u0438\u043E\u043D \u042D\u043C\u0438\u043B\u0438\u044F, \u043E\u0434\u043D\u0430\u043A\u043E \u0441\u0435\u0439\u0447\u0430\u0441 \u044D\u0442\u0443 \u0440\u0430\u0437\u043D\u043E\u0432\u0438\u0434\u043D\u043E\u0441\u0442\u044C \u043C\u0430\u043A\u0430\u0440\u043E\u043D\u043D\u044B\u0445 \u0438\u0437\u0434\u0435\u043B\u0438\u0439 \u0433\u043E\u0442\u043E\u0432\u044F\u0442 \u043F\u043E \u0432\u0441\u0435\u0439 \u0418\u0442\u0430\u043B\u0438\u0438. \u041F\u043E \u0441\u0432\u043E\u0435\u0439 \u0444\u043E\u0440\u043C\u0435 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u044E\u0442 \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0438\u0435 \u043F\u0435\u043B\u044C\u043C\u0435\u043D\u0438, \u0443\u0433\u043E\u043B\u043A\u0438 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043E\u0435\u0434\u0438\u043D\u044F\u044E\u0442, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C \u043A\u043E\u043B\u044C\u0446\u043E \u0438\u043B\u0438 \u0431\u0443\u0442\u043E\u043D\u0447\u0438\u043A. \u0418\u043C\u0435\u0435\u0442\u0441\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u0430\u0437\u043D\u043E\u0432\u0438\u0434\u043D\u043E\u0441\u0442\u0435\u0439 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u2014 \u0431\u043E\u043B\u0435\u0435 \u043A\u0440\u0443\u043F\u043D\u044B\u0435 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438 \u0438 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u043E\u043D\u0438 \u0438 \u0441\u043E\u0432\u0441\u0435\u043C \u043C\u0435\u043B\u043A\u0438\u0435 \u0442\u043E\u0440\u0442\u0435\u043B\u0435\u0442\u0442\u0438."@ru , + "Tortellini (Italiaans: kleine tortelli, gevulde deegringetjes) is een Italiaanse pastasoort. De naam wordt ook gebruikt voor de gerechten die op basis van de pasta worden gemaakt. De noedels zijn gemaakt in de vorm van ringetjes. In deze ringetjes kan kaas, spinazie of gehakt zitten. Ze kunnen ook leeg zijn. Gekookt en overgoten met een kruidige tomatensaus is het een complete maaltijd."@nl , + "Les tortellini sont des p\u00E2tes alimentaires annulaires semblables aux raviolis, originaires du territoire entre Bologne et Mod\u00E8ne."@fr , + "Tortellini adalah pasta berbentuk cincin, kadang-kadang juga digambarkan sebagai \"berbentuk seperti pusar\", maka nama alternatif pasta ini adalah \"pusar\" (ombelico). Pasta ini biasanya diisi oleh campuran daging (daging babi pinggang, prosciutto) atau keju. Asalnya dari wilayah Emilia Italia (terutama Bologna dan Modena), pasta ini biasanya disajikan dalam sup dengan isi daging sapi, ayam, atau keduanya."@in , + "\u30C8\u30EB\u30C6\u30C3\u30EA\u30FC\u30CB\uFF08Tortellini\u3001\u5358\u6570\u5F62\u306FTortellino\uFF09\u306F\u3001\u8584\u304F\u4F38\u3070\u3057\u305F\u6B63\u65B9\u5F62\u306E\u751F\u5730\u306B\u30E9\u30D3\u30AA\u30EA\u306E\u3088\u3046\u306B\u8A70\u7269\u3092\u3057\u3066\u3001\u305D\u308C\u3092\u4E09\u89D2\u5F62\u306B\u6298\u308A\u3001\u4E21\u7AEF\u3092\u5408\u308F\u305B\u3066\u6307\u8F2A\u72B6\u306B\u3057\u305F\u30D1\u30B9\u30BF\u3067\u3042\u308B\u3002"@ja , + "\u610F\u5927\u5229\u9984\u9968\uFF08\u610F\u5927\u5229\u8BED\uFF1Atortellini\uFF09\u662F\u4E00\u7A2E\u50B3\u7D71\u7684\u610F\u5927\u5229\u9EB5\u98DF\uFF0C\u4EE5\u9EB5\u76AE\u505A\u6210\u888B\u72C0\uFF0C\u7136\u5F8C\u5C07\u8089\u985E\u6216\u852C\u83DC\u5305\u8D77\uFF0C\u518D\u653E\u5165\u71B1\u6C34\u4E2D\u716E\u719F\u3002"@zh , + "Tortel\u00B7lini \u00E9s una pasta italiana amb forma d'anell de dimensions petites i farcida."@ca , + "Tortellini are pasta originally from the Italian region of Emilia (in particular Bologna and Modena). Traditionally they are stuffed with a mix of meat (pork loin, raw prosciutto, mortadella), Parmigiano Reggiano cheese, egg and nutmeg and served in capon broth (in brodo di cappone). In the area of origin they are usually sold fresh or home-made. Industrially packaged, dried, refrigerated, or frozen tortellini appear in many locations around the world, especially where there are large Italian communities."@en ; + owl:differentFrom dbr:Tortelloni ; + foaf:name "Tortellini"@en ; + foaf:depiction , + , + , + . +@prefix dcterms: . +@prefix dbc: . +dbr:Tortellini dcterms:subject dbc:Cuisine_of_Emilia-Romagna , + dbc:Types_of_pasta , + dbc:Dumplings ; + dbo:abstract "I tortellini sono una pasta all'uovo ripiena, tipica di Bologna e di Modena."@it , + "Tortellini (Plural von Tortellino, italienisch f\u00FCr \u201Ekleiner Kuchen\u201C) sind ringf\u00F6rmige Teigwaren, die \u2013 \u00E4hnlich wie Ravioli \u2013 gef\u00FCllt sind. Die traditionelle F\u00FCllung besteht aus einer Mischung von Schweinefleisch, Parmaschinken, Mortadella, Parmesank\u00E4se, Eiern und Muskatnuss. Tortellini werden f\u00FCr gew\u00F6hnlich in einer H\u00FChnerfleischbr\u00FChe (Tortellini in brodo) oder seltener mit Sahneso\u00DFe serviert. Urspr\u00FCnglich stammen sie wohl aus der italienischen Provinz Bologna. Hier sind sie als traditionelle Bologneser Spezialit\u00E4t seit 1974 bei der Handwerkskammer in Bologna eingetragen. Auch die Zubereitungsart Tortellini in Brodo (Tortellini in Fleischbr\u00FChe) \u2013 die dort als typisches Sonntagsgericht gilt \u2013 wurde dabei festgelegt."@de , + "Tortellini ou tort\u00E9i s\u00E3o pastelinhos de massa de farinha de trigo e gemas de ovos que, depois de estendida bem fina, \u00E9 cortada em quadrados que s\u00E3o recheados com uma mistura de carnes e dobrados sobre si pr\u00F3prios e com um dedo para formarem umas rodelas com a forma do umbigo, ou \u201Ccappelletti\u201D, como tamb\u00E9m \u00E9 chamado, tamb\u00E9m \u00E9 conhecido como agnolotti ou agnolini em alguns lugares do Brasil. Fazem parte das massas aliment\u00EDcias t\u00EDpicas da It\u00E1lia, especificamente dentro dos \u201CProdotti agroalimentari tradizionali dell\u2019 Emilia Romagna\u201D e, mais especificamente, das prov\u00EDncias de Bologna e Modena. Segundo a \"Irmandade do Tortelloni\", estes pastelinhos devem ser exclusivamente comidos num caldo, de galinha ou de carne de vaca. Ainda segundo a \u201COrdem do Tortellino\u201D, o recheio deve ser composto de lombo de porco, presunto, mortadela de Bolonha, Parmigiano-Reggiano, ovos e noz moscada. No entanto, encontrou-se uma outra receita, especificamente sob a denomina\u00E7\u00E3o \u201CTortellini all\u2019Emiliana\u201D, segundo a qual se deve saltear num pouco de \u00F3leo uma por\u00E7\u00E3o de vitela com cenoura, cebola, aipo, vinho branco, \u201Cguanciale\u201D e salsicha picados; separadamente, cozem-se em \u00E1gua galinha, carne de vaca e l\u00EDngua e guarda-se o caldo de cozer a galinha para depois cozer os tortellini. As carnes j\u00E1 cozinhadas s\u00E3o mo\u00EDdas e temperadas com sal, noz moscada, parmigiano e pecorino."@pt , + "Tortellini (mno\u017En\u00E9 \u010D\u00EDslo slova tortellino, italsky \u201Emal\u00FD kol\u00E1\u010Dek\u201C) jsou pln\u011Bn\u00E9 t\u011Bstoviny prstencovit\u00E9ho tvaru. Jsou obvykle pln\u011Bny vep\u0159ov\u00FDm masem s mortadellou a parmez\u00E1nem. Poch\u00E1zej\u00ED z italsk\u00E9 provincie Bologna. Tortellini se obvykle serv\u00EDruj\u00ED v pol\u00E9vce (tortellini in brodo), nebo netradi\u010Dn\u011B se smetanovou om\u00E1\u010Dkou."@cs , + "\u30C8\u30EB\u30C6\u30C3\u30EA\u30FC\u30CB\uFF08Tortellini\u3001\u5358\u6570\u5F62\u306FTortellino\uFF09\u306F\u3001\u8584\u304F\u4F38\u3070\u3057\u305F\u6B63\u65B9\u5F62\u306E\u751F\u5730\u306B\u30E9\u30D3\u30AA\u30EA\u306E\u3088\u3046\u306B\u8A70\u7269\u3092\u3057\u3066\u3001\u305D\u308C\u3092\u4E09\u89D2\u5F62\u306B\u6298\u308A\u3001\u4E21\u7AEF\u3092\u5408\u308F\u305B\u3066\u6307\u8F2A\u72B6\u306B\u3057\u305F\u30D1\u30B9\u30BF\u3067\u3042\u308B\u3002"@ja , + "\u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A (Tortellini) \u0647\u064A \u0645\u0639\u0643\u0631\u0648\u0646\u0629 \u0639\u0644\u0649 \u0634\u0643\u0644 \u062D\u0644\u0642\u0627\u062A\u060C \u0648\u0623\u062D\u064A\u0627\u0646\u0627 \u064A\u062A\u0645 \u0648\u0635\u0641\u0647\u0627 \u0623\u064A\u0636\u0627 \u0643\u0634\u0643\u0644 \u0627\u0644\u0633\u0631\u0629\u060C \u0648\u0628\u0630\u0644\u0643 \u0633\u064F\u0645\u064A\u062A \u0628\u0623\u0633\u0645\u0627\u0621 \u0628\u062F\u064A\u0644\u0629 \u0645\u062B\u0644 \u0633\u0631\u0629 \u0627\u0644\u0628\u0637\u0646.\u0648\u0639\u0627\u062F\u0629\u064B \u0645\u0627 \u062A\u0643\u0648\u0646 \u0645\u062D\u0634\u0648\u0629 \u0628\u0645\u0632\u064A\u062C \u0645\u0646 \u0627\u0644\u0644\u062D\u0648\u0645 \u0623\u0648 \u0627\u0644\u062C\u0628\u0646. \u064A\u0623\u062A\u064A \u0641\u064A \u0627\u0644\u0623\u0635\u0644 \u0645\u0646 \u0645\u0646\u0637\u0642\u0629 \u0625\u064A\u0645\u064A\u0644\u064A\u0627 \u0627\u0644\u0625\u064A\u0637\u0627\u0644\u064A\u0629 (\u0648\u0644\u0627\u0633\u064A\u0645\u0627 \u0645\u0646 \u0628\u0648\u0644\u0648\u0646\u064A\u0627 \u0648\u0645\u0648\u062F\u064A\u0646\u0627) \u0648\u0639\u0627\u062F\u0629\u064B \u0645\u0627 \u064A\u062A\u0645 \u062A\u0642\u062F\u064A\u0645\u0647\u0627 \u0645\u0639 \u0627\u0644\u0645\u0631\u0642 \u060C \u0625\u0645\u0627 \u0645\u0646 \u0627\u0644\u0644\u062D\u0645 \u0623\u0648 \u0627\u0644\u062F\u062C\u0627\u062C \u0623\u0648 \u0643\u0644\u064A\u0647\u0645\u0627.\u062A\u0638\u0647\u0631 \u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A \u0623\u0648 \u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u0648\u0646\u064A \u0648\u0647\u064A (\u0645\u0634\u0627\u0628\u0647\u0629 \u0644\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A \u0644\u0643\u0646\u0647\u0627 \u0623\u0643\u0628\u0631 \u062D\u062C\u0645\u0627\u064B\u060C \u0645\u0639 \u0627\u0644\u062C\u0628\u0646 \u0648/\u0623\u0648 \u0645\u062D\u0634\u0648\u0629 \u0628\u0627\u0644\u062E\u0636\u0631\u0648\u0627\u062A) \u0641\u064A \u0645\u0648\u0627\u0642\u0639 \u0639\u062F\u064A\u062F\u0629 \u0645\u0646 \u062C\u0645\u064A\u0639 \u0623\u0646\u062D\u0627\u0621 \u0627\u0644\u0639\u0627\u0644\u0645 \u0625\u0645\u0627 \u0645\u0639\u0628\u0623\u0629 \u0623\u0648 \u0645\u0628\u0631\u062F\u0629 \u0623\u0648 \u0645\u062C\u0645\u062F\u0629. \u0648\u062E\u0627\u0635\u0627\u064B \u0639\u0646\u062F\u0645\u0627 \u062A\u0643\u0648\u0646 \u0647\u0646\u0627\u0643 \u0645\u062C\u062A\u0645\u0639\u0627\u062A \u0625\u064A\u0637\u0627\u0644\u064A\u0629 \u0643\u0628\u064A\u0631\u0629. \u064A\u062A\u0645 \u062A\u0635\u0646\u064A\u0639 \u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A \u0648\u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u0648\u0646\u064A \u0641\u064A \u0623\u0633\u0648\u0627\u0642 \u062A\u0632\u0648\u064A\u062F \u0627\u0644\u062E\u0637\u0648\u0637 \u0627\u0644\u0635\u0646\u0627\u0639\u064A\u0629 \u0627\u0644\u0623\u0648\u0631\u0628\u064A\u0629 \u0641\u064A \u0623\u0648\u0631\u0648\u0628\u0627 \u0648\u0627\u0628\u0639\u062F \u0645\u0646 \u0630\u0644\u0643. \u0648\u0639\u0627\u062F\u0629\u064B \u0645\u0627 \u062A\u0623\u062E\u0630 \u0627\u0644\u062A\u0648\u0631\u062A\u064A\u0644\u064A\u0646\u064A \u0627\u0644\u0645\u0639\u0628\u0623\u0629 \u0648\u0627\u0644\u0637\u0627\u0632\u062C\u0629 7 \u0623\u0633\u0627\u0628\u064A\u0639 \u0645\u0646 \u0641\u062A\u0631\u0629 \u0635\u0644\u0627\u062D\u064A\u062A\u0647\u0627."@ar , + "\u0422\u043E\u0440\u0442\u0435\u043B\u0456\u043D\u0456 (\u0456\u0442\u0430\u043B. Tortellini) \u2014 \u0456\u0442\u0430\u043B\u0456\u0439\u0441\u044C\u043A\u0456 \u043F\u0435\u043B\u044C\u043C\u0435\u043D\u0456 \u0456\u0437 \u043F\u0440\u0456\u0441\u043D\u043E\u0433\u043E \u0442\u0456\u0441\u0442\u0430 \u0437 \u043C'\u044F\u0441\u043E\u043C, \u0441\u0438\u0440\u043E\u043C \u0430\u0431\u043E \u043E\u0432\u043E\u0447\u0430\u043C\u0438. \u0406\u0441\u0442\u043E\u0440\u0438\u0447\u043D\u0430 \u0431\u0430\u0442\u044C\u043A\u0456\u0432\u0449\u0438\u043D\u0430 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0456\u043D\u0456 \u2014 \u0411\u043E\u043B\u043E\u043D\u044C\u044F, \u043F\u0440\u043E\u0442\u0435 \u0437\u0430\u0440\u0430\u0437 \u0446\u0435\u0439 \u0440\u0456\u0437\u043D\u043E\u0432\u0438\u0434 \u043C\u0430\u043A\u0430\u0440\u043E\u043D\u043D\u0438\u0445 \u0432\u0438\u0440\u043E\u0431\u0456\u0432 \u0433\u043E\u0442\u0443\u044E\u0442\u044C \u043F\u043E \u0432\u0441\u0456\u0439 \u0406\u0442\u0430\u043B\u0456\u0457. \u0417\u0430 \u0444\u043E\u0440\u043C\u043E\u044E \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0456\u043D\u0456 \u043D\u0430\u0433\u0430\u0434\u0443\u0454 \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0456 \u043F\u0435\u043B\u044C\u043C\u0435\u043D\u0456, \u043A\u0443\u0442\u043E\u0447\u043A\u0438 \u044F\u043A\u0438\u0445 \u0437'\u0454\u0434\u043D\u0443\u044E\u0442\u044C, \u0449\u043E\u0431 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u043A\u0456\u043B\u044C\u0446\u0435 \u0430\u0431\u043E \u0431\u0443\u0442\u043E\u043D\u0447\u0438\u043A. \u0417\u0433\u0456\u0434\u043D\u043E \u0437 \u043B\u0435\u0433\u0435\u043D\u0434\u043E\u044E, \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0456\u043D\u0456 \u043F\u0440\u0438\u0434\u0443\u043C\u0430\u0432 \u043C\u043E\u043B\u043E\u0434\u0438\u0439 \u043A\u0443\u0445\u0430\u0440: \u0432\u0456\u043D \u043F\u0440\u0438\u0433\u043E\u0442\u0443\u0432\u0430\u0432 \u043C\u0430\u043A\u0430\u0440\u043E\u043D\u0438 \u0437 \u043D\u0430\u0447\u0438\u043D\u043A\u043E\u044E, \u043E\u0431\u0435\u0440\u043D\u0443\u0432\u0448\u0438 \u0437\u0430\u0433\u043E\u0442\u043E\u0432\u043A\u0443 \u043D\u0430\u0432\u043A\u043E\u043B\u043E \u043C\u0456\u0437\u0438\u043D\u0446\u044F \u0456 \u0437\u043E\u0431\u0440\u0430\u0437\u0438\u0432\u0448\u0438 \u0442\u0430\u043A\u0438\u043C \u0447\u0438\u043D\u043E\u043C \u043F\u0443\u043F\u043E\u043A \u0441\u0432\u043E\u0454\u0457 \u043A\u043E\u0445\u0430\u043D\u043A\u0438. \u0417\u0430 \u0456\u043D\u0448\u043E\u044E, \u0431\u0456\u043B\u044C\u0448 \u043A\u0430\u0437\u043A\u043E\u0432\u043E\u044E \u0432\u0435\u0440\u0441\u0456\u0454\u044E \u2014 \u043F\u0443\u043F\u043E\u043A \u0441\u0430\u043C\u043E\u0457 \u0431\u043E\u0433\u0438\u043D\u0456 \u0412\u0435\u043D\u0435\u0440\u0438, \u0437\u0430 \u0440\u043E\u0437\u0434\u044F\u0433\u0430\u043D\u043D\u044F\u043C \u043A\u043E\u0442\u0440\u043E\u0457 \u044E\u043D\u043E\u043C\u0443 \u043A\u0443\u0445\u0430\u0440\u044E \u043D\u0435\u043D\u0430\u0440\u043E\u043A\u043E\u043C \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043F\u0456\u0434\u0433\u043B\u0435\u0434\u0456\u0442\u0438. \u0410\u043B\u0435 \u0443 \u0431\u043E\u043B\u043E\u043D\u0446\u0456\u0432 \u0456\u0441\u043D\u0443\u0454 \u0439 \u0456\u043D\u0448\u0435 \u043F\u043E\u0435\u0442\u0438\u0447\u043D\u0435 \u043F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F: \u0432\u043E\u043D\u0438 \u0441\u0442\u0432\u0435\u0440\u0434\u0436\u0443\u044E\u0442\u044C, \u0449\u043E \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0456\u043D\u0456 \u0437\u0430 \u0444\u043E\u0440\u043C\u043E\u044E \u043D\u0430\u0433\u0430\u0434\u0443\u0454 \u0431\u0443\u0442\u043E\u043D \u0442\u0440\u043E\u044F\u043D\u0434\u0438. \u0404 \u043A\u0456\u043B\u044C\u043A\u0430 \u0440\u0456\u0437\u043D\u043E\u0432\u0438\u0434\u0456\u0432 \u0442\u043E\u0440\u0442\u0435\u043B\u0456\u043D\u0456 \u2014 \u043D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0456 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0456 \u0442\u0430 \u0442\u043E\u0440\u0442\u0435\u043B\u043E\u043D\u0456 \u0456 \u0437\u043E\u0432\u0441\u0456\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0456 \u0442\u043E\u0440\u0442\u0435\u043B\u0435\u0442\u0456. \u041A\u043E\u043B\u0456\u0440 \u0442\u0456\u0441\u0442\u0430 \u0434\u043B\u044F \u0442\u043E\u0440\u0435\u0442\u0435\u043B\u043B\u0456\u043D\u0456 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0440\u0456\u0437\u043D\u043E\u043C\u0430\u043D\u0456\u0442\u043D\u0438\u043C, \u0456 \u0437\u0430\u043B\u0435\u0436\u0438\u0442\u044C \u0432\u0456\u0434 \u0434\u043E\u0431\u0430\u0432\u043E\u043A: \u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434, \u0448\u043F\u0438\u043D\u0430\u0442 \u043D\u0430\u0434\u0430\u0454 \u0442\u0456\u0441\u0442\u0443 \u0437\u0435\u043B\u0435\u043D\u043E\u0433\u043E \u043A\u043E\u043B\u044C\u043E\u0440\u0443, \u0430 \u043F\u043E\u043C\u0456\u0434\u043E\u0440 \u2014 \u0447\u0435\u0440\u0432\u043E\u043D\u043E\u0433\u043E. \u042F\u043A \u043C'\u044F\u0441\u043D\u0435 \u043D\u0430\u0447\u0438\u043D\u043D\u044F \u0456\u0442\u0430\u043B\u0456\u0439\u0446\u0456 \u0437\u0432\u0438\u0447\u0430\u0439\u043D\u043E \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u044E\u0442\u044C \u043A\u0443\u0440\u043A\u0443, \u044F\u043B\u043E\u0432\u0438\u0447\u0438\u043D\u0443 \u0430\u0431\u043E \u043C\u043E\u0440\u0442\u0430\u0434\u0435\u043B\u0443, \u0456\u0437 \u0441\u0438\u0440\u0443 \u2014 \u043F\u0430\u0440\u043C\u0435\u0437\u0430\u043D \u0430\u0431\u043E \u0440\u0456\u043A\u043E\u0442\u0443. \u0422\u043E\u0440\u0442\u0435\u043B\u0456\u043D\u0456 \u043F\u0440\u0438\u0439\u043D\u044F\u0442\u043E \u043F\u043E\u0434\u0430\u0432\u0430\u0442\u0438 \u0456\u0437 \u0441\u043E\u0443\u0441\u043E\u043C. \u0426\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0442\u0440\u0430\u0434\u0438\u0446\u0456\u0439\u043D\u0438\u0439 \u0431\u043E\u043B\u043E\u043D\u044C\u0454\u0437\u0435, \u0430\u0431\u043E \u0436 \u0432\u0435\u0440\u0448\u043A\u043E\u0432\u0438\u0439 \u0456 \u0433\u0440\u0438\u0431\u043D\u0438\u0439 \u0441\u043E\u0443\u0441\u0438. \u0427\u0430\u0441\u0442\u043E \u0456\u0442\u0430\u043B\u0456\u0439\u0446\u0456 \u0437\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0442\u044C \u0442\u043E\u0440\u0442\u0435\u043B\u0456\u043D\u0456 \u0431\u0443\u043B\u044C\u0439\u043E\u043D\u0438 \u0456 \u0441\u0443\u043F\u0438."@uk , + "\uD1A0\uB974\uD154\uB9AC\uB2C8(\uC774\uD0C8\uB9AC\uC544\uC5B4: Tortellini)\uB294 \uC18C\uB97C \uB123\uC740 \uD30C\uC2A4\uD0C0\uC758 \uC77C\uC885\uC73C\uB85C\uC11C \uBA74\uC774 \uBC18\uC9C0 \uBAA8\uC591\uCC98\uB7FC \uB465\uAE00\uB465\uAE00\uD55C \uAC83\uC774 \uD2B9\uC9D5\uC774\uB2E4. \uB3FC\uC9C0\uACE0\uAE30\uB098 \uBAA8\uCC28\uB810\uB77C\uCE58\uC988, \uD30C\uB974\uBA54\uC0B0 \uCE58\uC988\uB97C \uB9CE\uC774 \uC0AC\uC6A9\uD55C\uB2E4. \uD2B9\uBCC4\uD788 \uC774\uD0C8\uB9AC\uC544\uC758 \uC5D0\uBC00\uB9AC\uC544\uB85C\uB9C8\uB0D0\uC8FC\uC5D0\uC11C \uB9CE\uC774 \uBA39\uB294\uB2E4. \uB9DB\uC740 \uC544\uC8FC \uAC78\uCB49\uD558\uC9C0 \uC54A\uACE0 \uBB3D\uC740 \uC218\uD504\uC774\uBA70 \uD06C\uB9BC\uC744 \uCCA8\uAC00\uD558\uAE30\uB3C4 \uD55C\uB2E4. \uD3EC\uC7A5\uC744 \uD558\uAC70\uB098 \uB0C9\uC7A5 \uBCF4\uAD00, \uB0C9\uB3D9 \uBCF4\uAD00\uB41C \uD1A0\uB974\uD154\uB9AC\uB2C8\uB294 \uC804 \uC138\uACC4\uC801\uC73C\uB85C\uB3C4 \uB9CE\uC774 \uBC1C\uACAC\uB418\uB294\uB370 \uC2DD\uD488 \uC5C5\uCCB4\uC5D0\uC11C \uC0DD\uC0B0\uD558\uC5EC \uC218\uCD9C\uD55C\uB2E4. \uB300\uAC1C\uB294 \uC774\uD0C8\uB9AC\uC544 \uD68C\uC0AC\uC5D0\uC11C \uC0DD\uC0B0\uD558\uBA70 \uD1A0\uB974\uD154\uB9AC\uB2C8\uB294 \uC2E0\uC120\uD55C \uC0C1\uD0DC\uB85C \uCD5C\uB300 7\uC8FC \uC815\uB3C4 \uBCF4\uAD00\uB420 \uC218 \uC788\uB2E4. \uBE44\uC2B7\uD55C \uC74C\uC2DD\uC73C\uB85C\uB294 \uC6B0\uD06C\uB77C\uC774\uB098\uC5D0\uC11C \uD06C\uB9AC\uC2A4\uB9C8\uC2A4 \uB54C \uBA39\uB294 \uC74C\uC2DD\uC778 \"vushka\" (\uC6B0\uD06C\uB77C\uC774\uB098\uC5B4: \u0432\u0443\u0448\u043A\u0430)\uAC00 \uC788\uB2E4. \uD1A0\uB974\uD154\uB85C\uB2C8\uB77C\uB294 \uBE44\uC2B7\uD55C \uD615\uD0DC\uC758 \uD30C\uC2A4\uD0C0\uB294 \uD1A0\uB974\uD154\uB9AC\uB2C8\uBCF4\uB2E4 \uC870\uAE08 \uB354 \uD06C\uB2E4. \uB450 \uC885\uB958 \uBAA8\uB450 \uC5EC\uB7EC \uC74C\uC2DD\uC5D0 \uB2E4\uCC44\uB85C\uC6B4 \uC4F0\uC784\uC0C8\uB97C \uC9C0\uB2C8\uACE0 \uC788\uC9C0\uB9CC \uBBF8\uD2B8 \uC18C\uC2A4\uAC00 \uD754\uD558\uB2E4. \uD1A0\uB974\uD154\uB9AC\uB2C8\uAC00 \uBBF8\uD2B8 \uC18C\uC2A4\uB97C \uB354 \uB9CE\uC774 \uC0AC\uC6A9\uD55C\uB2E4. \uD1A0\uB974\uD154\uB85C\uB2C8\uB294 \uC2DD\uD0C1\uC5D0 \uC790\uC8FC \uC624\uB974\uC9C0\uB294 \uC54A\uB294 \uC74C\uC2DD\uC774\uB2E4."@ko , + "Tortellini (Italiaans: kleine tortelli, gevulde deegringetjes) is een Italiaanse pastasoort. De naam wordt ook gebruikt voor de gerechten die op basis van de pasta worden gemaakt. De noedels zijn gemaakt in de vorm van ringetjes. In deze ringetjes kan kaas, spinazie of gehakt zitten. Ze kunnen ook leeg zijn. In feite is tortellini een kleinere versie van tortelloni, een pastasoort die dezelfde vorm heeft. Naast de grootte verschilt traditioneel ook de vulling. Omdat er meer ruimte voor vulling is in de grotere tortelloni, wordt er gekozen voor een minder sterk smakende vulling zoals spinazie of ricotta, om het gerecht niet te overheersen. Gekookt en overgoten met een kruidige tomatensaus is het een complete maaltijd."@nl , + "Tortellini adalah pasta berbentuk cincin, kadang-kadang juga digambarkan sebagai \"berbentuk seperti pusar\", maka nama alternatif pasta ini adalah \"pusar\" (ombelico). Pasta ini biasanya diisi oleh campuran daging (daging babi pinggang, prosciutto) atau keju. Asalnya dari wilayah Emilia Italia (terutama Bologna dan Modena), pasta ini biasanya disajikan dalam sup dengan isi daging sapi, ayam, atau keduanya. Tortellini dan tortelloni (mirip tetapi lebih besar, dengan keju dan / atau sayuran) dapat ditemui di seluruh dunia dalam bentuk kemasan atau makanan beku, terutama jika ada komunitas besar Italia. Tortellini dan tortelloni dibuat di Eropa untuk memasok pasar di Eropa atau tempat lain. Tortellini \"segar\" yang dikemas biasanya memiliki jangka waktu selama 7 minggu."@in , + "Tortellini \u2013 tradycyjne w\u0142oskie piero\u017Cki z nadzieniem mi\u0119snym, grzybowym b\u0105d\u017A serowym, podawane z sosem pomidorowym (mo\u017Cna r\u00F3wnie\u017C korzysta\u0107 z innych sos\u00F3w, lecz nie jest to w\u00F3wczas w ca\u0142o\u015Bci w\u0142oska potrawa). Na koniec ca\u0142o\u015B\u0107 posypuje si\u0119 tartym serem (najcz\u0119\u015Bciej parmezanem). Podobnym rodzajem s\u0105 cappelletti, kt\u00F3re r\u00F3\u017Cni\u0105 si\u0119 sposobem wywini\u0119cia ko\u0144c\u00F3wek ciasta."@pl , + "Tortellini es una variedad de pasta con forma de anillo, compuesta por una capa de masa enrollada y unida por sus extremos, rellena de carne, queso y huevos. Hay distintas formas de servirlos, ya sea en caldo o con crema de leche. Este plato surgi\u00F3 en la regi\u00F3n italiana de Emilia-Roma\u00F1a, con origen disputado entre las provincias de Bolonia y M\u00F3dena.\u200B"@es , + "Les tortellini sont des p\u00E2tes alimentaires annulaires semblables aux raviolis, originaires du territoire entre Bologne et Mod\u00E8ne."@fr , + "Tortellini, fr\u00E5n italienskans \"torta\" (t\u00E5rta eller vridning), \u00E4r en sorts ringformad pasta som kan ha olika typer av fyllning, exempelvis skinka, svamp eller (parmesan-)ost. Pastan kommer ursprungligen fr\u00E5n den italienska regionen Emilia-Romagna och d\u00E4r serveras den i buljong, med gr\u00E4dde, eller med en ragu eller liknande s\u00E5s (s\u00E4rskilt i Bologna och Modena). De flesta restauranger i Bologna s\u00E5v\u00E4l som \"La Confraternita del Tortellino\" \u00E4r ense om att den \u00E4kta tortellinin endast serveras med hemlagad buljong. Tortellini med gr\u00E4dde \u00E4r accepterat i Bologna, men detta kritiseras av somliga. Tortellini med ragu, \u00E4ven om det finns, anses av m\u00E5nga i Bologna vara icke autentiskt. Tortelloni \u00E4r en st\u00F6rre variant av tortellini, och \u00E4r vanligtvis fylld med ricotta och bladgr\u00F6nsaker, som spenat. Det finns \u00E4ven varianter d\u00E4r gr\u00F6nsakerna ersatts med Karl Johanssvamp eller valn\u00F6tter. Tortelloni serveras vanligen med ragu eller sm\u00E4lt sm\u00F6r och kryddsalvia. F\u00F6rpackad kyld eller fryst tortellini och tortelloni finns p\u00E5 m\u00E5nga platser i v\u00E4rlden. \u00C4ven torkad tortellini f\u00F6rekommer."@sv , + "\u0422\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u0301\u043D\u0438 (\u0438\u0442\u0430\u043B. Tortellini) \u2014 \u0438\u0442\u0430\u043B\u044C\u044F\u043D\u0441\u043A\u0438\u0435 \u043F\u0435\u043B\u044C\u043C\u0435\u043D\u0438 \u0438\u0437 \u043F\u0440\u0435\u0441\u043D\u043E\u0433\u043E \u0442\u0435\u0441\u0442\u0430 \u0441 \u043C\u044F\u0441\u043E\u043C, \u0441\u044B\u0440\u043E\u043C \u0438\u043B\u0438 \u043E\u0432\u043E\u0449\u0430\u043C\u0438. \u0418\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0440\u043E\u0434\u0438\u043D\u0430 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u2014 \u0440\u0435\u0433\u0438\u043E\u043D \u042D\u043C\u0438\u043B\u0438\u044F, \u043E\u0434\u043D\u0430\u043A\u043E \u0441\u0435\u0439\u0447\u0430\u0441 \u044D\u0442\u0443 \u0440\u0430\u0437\u043D\u043E\u0432\u0438\u0434\u043D\u043E\u0441\u0442\u044C \u043C\u0430\u043A\u0430\u0440\u043E\u043D\u043D\u044B\u0445 \u0438\u0437\u0434\u0435\u043B\u0438\u0439 \u0433\u043E\u0442\u043E\u0432\u044F\u0442 \u043F\u043E \u0432\u0441\u0435\u0439 \u0418\u0442\u0430\u043B\u0438\u0438. \u041F\u043E \u0441\u0432\u043E\u0435\u0439 \u0444\u043E\u0440\u043C\u0435 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u044E\u0442 \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u0438\u0435 \u043F\u0435\u043B\u044C\u043C\u0435\u043D\u0438, \u0443\u0433\u043E\u043B\u043A\u0438 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043E\u0435\u0434\u0438\u043D\u044F\u044E\u0442, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C \u043A\u043E\u043B\u044C\u0446\u043E \u0438\u043B\u0438 \u0431\u0443\u0442\u043E\u043D\u0447\u0438\u043A. \u041A\u0430\u043A \u0433\u043B\u0430\u0441\u0438\u0442 \u043B\u0435\u0433\u0435\u043D\u0434\u0430, \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u043F\u0440\u0438\u0434\u0443\u043C\u0430\u043B \u043C\u043E\u043B\u043E\u0434\u043E\u0439 \u043F\u043E\u0432\u0430\u0440: \u043E\u043D \u043F\u0440\u0438\u0433\u043E\u0442\u043E\u0432\u0438\u043B \u043F\u0430\u0441\u0442\u0443 \u0441 \u043D\u0430\u0447\u0438\u043D\u043A\u043E\u0439, \u043E\u0431\u0435\u0440\u043D\u0443\u0432 \u0437\u0430\u0433\u043E\u0442\u043E\u0432\u043A\u0443 \u0432\u043E\u043A\u0440\u0443\u0433 \u043C\u0438\u0437\u0438\u043D\u0446\u0430 \u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0437\u0438\u0432 \u0442\u0430\u043A\u0438\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C \u043F\u0443\u043F\u043E\u043A \u0441\u0432\u043E\u0435\u0439 \u043B\u044E\u0431\u043E\u0432\u043D\u0438\u0446\u044B. \u0410 \u043F\u043E \u0434\u0440\u0443\u0433\u043E\u0439, \u0431\u043E\u043B\u0435\u0435 \u0441\u043A\u0430\u0437\u043E\u0447\u043D\u043E\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u2014 \u043F\u0443\u043F\u043E\u043A \u0441\u0430\u043C\u043E\u0439 \u0431\u043E\u0433\u0438\u043D\u0438 \u0412\u0435\u043D\u0435\u0440\u044B, \u0437\u0430 \u0440\u0430\u0437\u0434\u0435\u0432\u0430\u043D\u0438\u0435\u043C \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u044E\u043D\u043E\u043C\u0443 \u043F\u043E\u0432\u0430\u0440\u0443 \u043D\u0435\u043D\u0430\u0440\u043E\u043A\u043E\u043C \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0434\u0433\u043B\u044F\u0434\u0435\u0442\u044C. \u041D\u043E \u0443 \u0431\u043E\u043B\u043E\u043D\u0446\u0435\u0432 \u0432 \u0445\u043E\u0434\u0443 \u0438 \u0434\u0440\u0443\u0433\u043E\u0435 \u043F\u043E\u044D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u0435: \u043E\u043D\u0438 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0442, \u0447\u0442\u043E \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u043F\u043E \u0444\u043E\u0440\u043C\u0435 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u044E\u0442 \u0431\u0443\u0442\u043E\u043D \u0440\u043E\u0437\u044B. \u0418\u043C\u0435\u0435\u0442\u0441\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0440\u0430\u0437\u043D\u043E\u0432\u0438\u0434\u043D\u043E\u0441\u0442\u0435\u0439 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u2014 \u0431\u043E\u043B\u0435\u0435 \u043A\u0440\u0443\u043F\u043D\u044B\u0435 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438 \u0438 \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u043E\u043D\u0438 \u0438 \u0441\u043E\u0432\u0441\u0435\u043C \u043C\u0435\u043B\u043A\u0438\u0435 \u0442\u043E\u0440\u0442\u0435\u043B\u0435\u0442\u0442\u0438. \u0426\u0432\u0435\u0442 \u0442\u0435\u0441\u0442\u0430 \u0434\u043B\u044F \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u043C, \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0434\u043E\u0431\u0430\u0432\u043E\u043A: \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0448\u043F\u0438\u043D\u0430\u0442 \u043F\u0440\u0438\u0434\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u0443 \u0437\u0435\u043B\u0451\u043D\u0443\u044E \u043E\u043A\u0440\u0430\u0441\u043A\u0443, \u0430 \u0442\u043E\u043C\u0430\u0442 \u2014 \u043A\u0440\u0430\u0441\u043D\u0443\u044E. \u0412 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043C\u044F\u0441\u043D\u043E\u0439 \u043D\u0430\u0447\u0438\u043D\u043A\u0438 \u0438\u0442\u0430\u043B\u044C\u044F\u043D\u0446\u044B \u043E\u0431\u044B\u0447\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 \u043A\u0443\u0440\u0438\u0446\u0443, \u0432\u0435\u0442\u0447\u0438\u043D\u0443 \u0438\u043B\u0438 \u043C\u043E\u0440\u0442\u0430\u0434\u0435\u043B\u043B\u0443, \u0438\u0437 \u0441\u044B\u0440\u0430 \u2014 \u043F\u0430\u0440\u043C\u0435\u0437\u0430\u043D \u0438\u043B\u0438 \u0440\u0438\u043A\u043E\u0442\u0442\u0443. \u0422\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438 \u043F\u0440\u0438\u043D\u044F\u0442\u043E \u043F\u043E\u0434\u0430\u0432\u0430\u0442\u044C \u0441 \u0441\u043E\u0443\u0441\u043E\u043C \u0438\u043B\u0438 \u0432 \u0431\u0443\u043B\u044C\u043E\u043D\u0435 (tortellini in brodo). \u0412 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0443\u043B\u044C\u043E\u043D\u0430, \u0432 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043F\u0440\u0438\u043D\u044F\u0442\u043E \u043F\u043E\u0434\u0430\u0432\u0430\u0442\u044C \u0442\u043E\u0440\u0442\u0435\u043B\u043B\u0438\u043D\u0438, \u0438\u0442\u0430\u043B\u044C\u044F\u043D\u0446\u044B \u043F\u0440\u0438\u0437\u043D\u0430\u044E\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0431\u0443\u043B\u044C\u043E\u043D \u0438\u0437 \u043A\u0430\u043F\u043B\u0443\u043D\u0430. \u0421\u043E\u0443\u0441 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0442\u043E\u043C\u0430\u0442\u043D\u044B\u0439, \u0441\u043B\u0438\u0432\u043E\u0447\u043D\u044B\u0439 \u0438\u043B\u0438 \u0433\u0440\u0438\u0431\u043D\u043E\u0439."@ru , + "Tortellini are pasta originally from the Italian region of Emilia (in particular Bologna and Modena). Traditionally they are stuffed with a mix of meat (pork loin, raw prosciutto, mortadella), Parmigiano Reggiano cheese, egg and nutmeg and served in capon broth (in brodo di cappone). In the area of origin they are usually sold fresh or home-made. Industrially packaged, dried, refrigerated, or frozen tortellini appear in many locations around the world, especially where there are large Italian communities."@en , + "Tortel\u00B7lini \u00E9s una pasta italiana amb forma d'anell de dimensions petites i farcida."@ca , + "\u610F\u5927\u5229\u9984\u9968\uFF08\u610F\u5927\u5229\u8BED\uFF1Atortellini\uFF09\u662F\u4E00\u7A2E\u50B3\u7D71\u7684\u610F\u5927\u5229\u9EB5\u98DF\uFF0C\u4EE5\u9EB5\u76AE\u505A\u6210\u888B\u72C0\uFF0C\u7136\u5F8C\u5C07\u8089\u985E\u6216\u852C\u83DC\u5305\u8D77\uFF0C\u518D\u653E\u5165\u71B1\u6C34\u4E2D\u716E\u719F\u3002"@zh ; + dbo:wikiPageWikiLink dbc:Cuisine_of_Emilia-Romagna , + dbr:Nutmeg , + dbr:Tortelloni , + dbr:Parmigiano-Reggiano , + dbr:Modena , + , + dbc:Dumplings , + , + dbc:Types_of_pasta , + dbr:Spinach , + dbr:Emilia-Romagna , + dbr:Italy , + dbr:Prosciutto , + dbr:Capon , + dbr:Salvia_officinalis , + , + dbr:List_of_pasta , + dbr:Dumplings , + dbr:Mortadella , + dbr:Castelfranco_Emilia , + , + dbr:Broth , + , + , + dbr:Bartolomeo_Scappi , + dbr:Parsley , + dbr:Vincenzo_Tanara , + dbr:Agnolotti , + dbr:Agnolini , + dbr:Bologna , + dbr:Pasta . +@prefix dbt: . +dbr:Tortellini dbp:wikiPageUsesTemplate dbt:Infobox_food , + dbt:Pasta , + dbt:Portal , + dbt:Short_description , + dbt:Cuisine_of_Italy , + dbt:Dumplings , + dbt:Commons_category , + dbt:Distinguish , + dbt:Reflist ; + dbo:thumbnail ; + dbo:wikiPageRevisionID 1120339311 ; + dbp:country dbr:Italy ; + dbo:wikiPageExternalLink , + , + , + . +@prefix xsd: . +dbr:Tortellini dbo:wikiPageLength "6809"^^xsd:nonNegativeInteger ; + dbo:wikiPageID 579040 ; + dbp:name "Tortellini"@en ; + dbp:caption "The distinctive shape of tortellini"@en . +@prefix dbpedia-lmo: . +dbr:Tortellini owl:sameAs dbpedia-lmo:Tortellin , + , + , + , + . +@prefix dbpedia-cs: . +dbr:Tortellini owl:sameAs dbpedia-cs:Tortellini . +@prefix dbpedia-es: . +dbr:Tortellini owl:sameAs dbpedia-es:Tortellini . +@prefix dbpedia-pt: . +dbr:Tortellini owl:sameAs dbpedia-pt:Tortellini . +@prefix dbpedia-fi: . +dbr:Tortellini owl:sameAs dbpedia-fi:Tortelliini . +@prefix dbpedia-id: . +dbr:Tortellini owl:sameAs dbpedia-id:Tortellini . +@prefix dbpedia-sk: . +dbr:Tortellini owl:sameAs dbpedia-sk:Tortellini . +@prefix dbpedia-nl: . +dbr:Tortellini owl:sameAs dbpedia-nl:Tortellini . +@prefix dbpedia-it: . +dbr:Tortellini owl:sameAs dbpedia-it:Tortellini . +@prefix ns22: . +dbr:Tortellini owl:sameAs ns22:Tortellini . +@prefix dbpedia-fr: . +dbr:Tortellini owl:sameAs dbpedia-fr:Tortellini . +@prefix dbpedia-simple: . +dbr:Tortellini owl:sameAs dbpedia-simple:Tortellini . +@prefix dbpedia-af: . +dbr:Tortellini owl:sameAs dbpedia-af:Tortellini , + wikidata:Q20057 . +@prefix dbpedia-de: . +dbr:Tortellini owl:sameAs dbpedia-de:Tortellini , + , + , + , + , + , + . +@prefix dbpedia-sv: . +dbr:Tortellini owl:sameAs dbpedia-sv:Tortellini . +@prefix dbpedia-tr: . +dbr:Tortellini owl:sameAs dbpedia-tr:Tortellini , + . +@prefix dbpedia-da: . +dbr:Tortellini owl:sameAs dbpedia-da:Tortellini . +@prefix dbpedia-no: . +dbr:Tortellini owl:sameAs dbpedia-no:Tortellini . +@prefix dbpedia-ro: . +dbr:Tortellini owl:sameAs dbpedia-ro:Tortellini , + . +@prefix ns32: . +dbr:Tortellini owl:sameAs ns32:v8LW . +@prefix dbpedia-ms: . +dbr:Tortellini owl:sameAs dbpedia-ms:Tortellini , + dbr:Tortellini . +@prefix dbpedia-is: . +dbr:Tortellini owl:sameAs dbpedia-is:Tortellini . +@prefix dbpedia-pl: . +dbr:Tortellini owl:sameAs dbpedia-pl:Tortellini . +@prefix gold: . +dbr:Tortellini gold:hypernym dbr:Pasta . +@prefix prov: . +dbr:Tortellini prov:wasDerivedFrom ; + dbo:type dbr:Dumplings , + dbr:Pasta ; + dbp:type dbr:Dumplings , + dbr:Pasta ; + foaf:isPrimaryTopicOf wikipedia-en:Tortellini ; + dbo:alias "Belly button"@en ; + dbo:hasVariant dbr:Tortelloni ; + dbp:variations dbr:Tortelloni ; + dbo:country dbr:Italy ; + dbp:imageSize 250 ; + dbo:region dbr:Emilia-Romagna ; + dbp:alternateName "Belly button"@en ; + dbp:region dbr:Emilia-Romagna . +dbr:List_of_pasta dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Bertagni dbo:wikiPageWikiLink dbr:Tortellini . + dbo:wikiPageWikiLink dbr:Tortellini . +dbr:List_of_Italian_dishes dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Sfoglina dbo:wikiPageWikiLink dbr:Tortellini . + dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Pasta dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Bologna dbo:wikiPageWikiLink dbr:Tortellini . + dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Food_Factory dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Uruguayan_cuisine dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Pelmeni dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Jiaozi dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Giovanni_Rana dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Ravioli dbo:wikiPageWikiLink dbr:Tortellini . + dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Lean_Cuisine dbo:wikiPageWikiLink dbr:Tortellini . +@prefix ns38: . +ns38:_The_Professionals dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Ostoni dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Kreplach dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Monghidoro dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Valeggio_sul_Mincio dbo:wikiPageWikiLink dbr:Tortellini . + dbo:wikiPageWikiLink dbr:Tortellini . +dbr:Cheese_tortellini dbo:wikiPageWikiLink dbr:Tortellini ; + dbo:wikiPageRedirects dbr:Tortellini . +dbr:Tortellina dbo:wikiPageWikiLink dbr:Tortellini ; + dbo:wikiPageRedirects dbr:Tortellini . +dbr:Tortelini dbo:wikiPageWikiLink dbr:Tortellini ; + dbo:wikiPageRedirects dbr:Tortellini . diff --git a/sparql-101/notebooks/d3fend.ttl b/sparql-101/notebooks/d3fend.ttl new file mode 100644 index 0000000..f2d6f0b --- /dev/null +++ b/sparql-101/notebooks/d3fend.ttl @@ -0,0 +1,39478 @@ +@prefix d3f: . +@prefix dcterms: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix skos: . +@prefix xsd: . + +d3f:AMD64CodeSegment a d3f:ImageCodeSegment, + d3f:ProcessCodeSegment, + owl:NamedIndividual ; + rdfs:label "AMD64 Code Segment" . + +d3f:ARIMAModel a owl:Class, + owl:NamedIndividual ; + rdfs:label "ARIMA Model" ; + d3f:d3fend-id "D3A-AM" ; + d3f:definition "An autoregressive integrated moving average (ARIMA) model is a generalization of an autoregressive moving average (ARMA) model." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Autoregressive integrated moving average. [Link](https://en.wikipedia.org/wiki/Autoregressive_integrated_moving_average)""" ; + d3f:synonym "Autoregressive Integrated Moving Average Model" ; + rdfs:subClassOf d3f:TimeSeriesAnalysis . + +d3f:ARM32CodeSegment a d3f:ImageCodeSegment, + d3f:ProcessCodeSegment, + owl:NamedIndividual ; + rdfs:label "ARM32 Code Segment" . + +d3f:ARMA_Model a d3f:TimeSeriesAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "ARMA Model" ; + d3f:d3fend-id "D3-ARMA" ; + d3f:definition "Autoregressive-moving-average (ARMA) models provide a parsimonious description of a (weakly) stationary stochastic process in terms of two polynomials, one for the autoregression (AR) and the second for the moving average (MA)." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Autoregressive-moving-average model. [Link](https://en.wikipedia.org/wiki/Autoregressive%E2%80%93moving-average_model)""" ; + d3f:synonym "Autoregressive moving average model" ; + rdfs:subClassOf d3f:TimeSeriesAnalysis . + +d3f:ASCIIDomainName a d3f:DomainName, + owl:NamedIndividual ; + rdfs:label "ASCII Domain Name" . + +d3f:ATTACKMergedThing a owl:Class ; + rdfs:label "ATTACK Merged Thing" ; + rdfs:subClassOf d3f:ATTACKThing . + +d3f:AccessDeniedEvent a owl:Class ; + rdfs:label "Access Denied Event" ; + d3f:definition "An event indicating the refusal of access to a resource, where an access request has been evaluated and denied based on current authorization policies, preventing operations by the requesting agent." ; + rdfs:subClassOf d3f:AccessMediationEvent . + +d3f:AccessGrantedEvent a owl:Class ; + rdfs:label "Access Granted Event" ; + d3f:definition "An event signifying that access to a resource has been authorized and successfully enforced, allowing the requesting agent to perform specified operations based on the access control policies." ; + rdfs:subClassOf d3f:AccessMediationEvent . + +d3f:ActivityDependency a owl:Class ; + rdfs:label "Activity Dependency" ; + d3f:definition "An activity dependency is a dependency that indicates an activity has an activity or agent which relies on it in order to be functional." ; + rdfs:subClassOf d3f:Dependency . + +d3f:Actor-Critic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Actor-Critic" ; + d3f:d3fend-id "D3A-AC" ; + d3f:definition "Actor-Critic is a Temporal Difference(TD) version of Policy gradient. It has two networks: Actor and Critic. The actor decided which action should be taken and critic inform the actor how good was the action and how it should adjust. The learning of the actor is based on policy gradient approach. In comparison, critics evaluate the action produced by the actor by computing the value function." ; + d3f:kb-article """## References +The Actor-Critic Reinforcement Learning Algorithm. Medium. [Link](https://medium.com/intro-to-artificial-intelligence/the-actor-critic-reinforcement-learning-algorithm-c8095a655c14).""" ; + rdfs:subClassOf d3f:PolicyGradient, + d3f:TemporalDifferenceLearning . + +d3f:AdaptiveResonanceTheoryClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Adaptive Resonance Theory Clustering" ; + d3f:d3fend-id "D3A-ARTC" ; + d3f:definition "Adaptive Resonance Theory (ART) Clustering is a neural network algorithm used for clustering data and is open to new learning(i.e. adaptive) without discarding the previous or the old information(i.e. resonance)." ; + d3f:kb-article """## References +GeeksforGeeks. (n.d.). Adaptive Resonance Theory (ART). [Link](https://www.geeksforgeeks.org/adaptive-resonance-theory-art/)""" ; + rdfs:subClassOf d3f:ANN-basedClustering . + +d3f:AddUserToGroupEvent a owl:Class ; + rdfs:label "Add User to Group Event" ; + d3f:definition "An event where a user is added to a group, granting the user the permissions and privileges associated with the group." ; + rdfs:subClassOf d3f:GroupManagementEvent . + +d3f:AdobePDFFile1.3 a d3f:DocumentFile, + owl:NamedIndividual ; + rdfs:label "Adobe PDF File 1.3" ; + d3f:may-contain d3f:JavascriptFile . + +d3f:AgglomerativeClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Agglomerative Clustering" ; + d3f:d3fend-id "D3A-AC" ; + d3f:definition "Agglomerative Clustering is a type of hierarchical clustering method where data points are grouped together based on similarity. Initially, each data point is treated as an individual cluster, and then in successive iterations, the closest clusters are merged until only one large cluster remains or until a specified stopping criterion is met." ; + d3f:kb-article """## How it works + +Agglomerative clustering starts with each data point as its own cluster. The algorithm then iterates, identifying the two clusters that are closest to each other based on a defined distance metric (e.g., Euclidean, Manhattan). These two clusters are then merged into a single cluster. This process continues iteratively, merging the closest pairs of clusters in each step until all data points are merged into a single cluster or until other stopping criteria are achieved. A dendrogram, which is a tree-like diagram, can be used to represent the sequence of merges, providing a visual representation of the hierarchical structure of data. + +## Considerations + +- **Choice of Distance Metric**: The outcome can vary significantly depending on the chosen distance metric (e.g., Euclidean, Manhattan). + +- **Scalability**: Agglomerative clustering can be computationally intensive for large datasets. + +- **Sensitivity**: The method can be sensitive to outliers, which might affect the quality of the clusters formed. + +## Key Test Considerations + +- **Unsupervised Learning**: + + - **Number of Clusters**: Determine an optimal number of clusters using the dendrogram and techniques like the elbow method. + +- **Cluster Analysis**: + + - **Silhouette Score**: Evaluates how similar an object is to its own cluster compared to other clusters. A higher silhouette score indicates that the object is well matched to its own cluster and poorly matched to neighboring clusters. + + - **Dunn Index**: Measures the ratio between the smallest distance between observations not in the same cluster to the largest intra-cluster distance. + +- **Hierarchical Clustering**: + + - **Cophenetic Correlation Coefficient**: Measures the correlation between the distances of points in feature space and their distances on the dendrogram. Helps assess the fidelity of the dendrogram in preserving pairwise distances between samples. + +- **Agglomerative Clustering**: + + - **Linkage Criteria**: Test different linkage criteria (e.g., single, complete, average) to determine which produces the most cohesive clusters for the data at hand. + + ## Platforms, Tools, or Libraries + +- **scikit-learn**: + + - A versatile machine learning library in Python. + + - The `AgglomerativeClustering` class in scikit-learn provides this functionality. + +- **SciPy**: + + - A Python library used for scientific and technical computing. + + - The `scipy.cluster.hierarchy` module provides functions for hierarchical and + agglomerative clustering, including the `linkage` and `dendrogram` functions. + +- **R**: + + - The `hclust` function in the stats package provides agglomerative clustering. + + - The `agnes` function in the `cluster` package offers a more extensive implementation. + +- **MATLAB**: + + - Offers the `linkage` function for hierarchical agglomerative clustering and `dendrogram` for visualization. + +- **Weka**: + + - A collection of machine learning algorithms for data mining tasks. + + - The `HierarchicalClusterer` class provides an implementation of agglomerative clustering. + +## References + +1. Jain, A. K., & Dubes, R. C. (1988). *Algorithms for clustering data*. Prentice-Hall, Inc. + +2. Murtagh, F., & Legendre, P. (2014). Ward’s hierarchical agglomerative clustering method: which algorithms implement Ward’s criterion?. *Journal of Classification*, 31(3), 274-295. [Link](https://link.springer.com/article/10.1007/s00357-014-9161-z). + +3. Scikit-learn. (30 Jun 2023). Scikit-learn Documentation: Agglomerative Clustering. +[Link](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.AgglomerativeClustering.html).""" ; + rdfs:subClassOf d3f:HierarchicalClustering . + +d3f:AlethicLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Alethic Logic" ; + d3f:d3fend-id "D3A-AL" ; + d3f:definition "Alethic logic is a modal logic that addresses the modalities of necessity and possibility." ; + d3f:kb-article """## References +1. Alethic logic. (2023, June 4). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Modal_logic#Alethic_logic)""" ; + rdfs:subClassOf d3f:ModalLogic . + +d3f:Alias a owl:Class ; + rdfs:label "Alias" ; + d3f:definition "In macOS, an alias is a small file that represents another object in a local, remote, or removable[1] file system and provides a dynamic link to it; the target object may be moved or renamed, and the alias will still link to it (unless the original file is recreated; such an alias is ambiguous and how it is resolved depends on the version of macOS)." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:SlowSymbolicLink . + +d3f:AnonymousPipe a owl:Class ; + rdfs:label "Anonymous Pipe" ; + d3f:definition "In computer science, an anonymous pipe is a simplex FIFO communication channel that may be used for one-way interprocess communication (IPC). An implementation is often integrated into the operating system's file IO subsystem. Typically a parent program opens anonymous pipes, and creates a new process that inherits the other ends of the pipes, or creates several new processes and arranges them in a pipeline." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Pipe . + +d3f:AnswerSetProgramming a owl:Class, + owl:NamedIndividual ; + rdfs:label "Answer Set Programming" ; + d3f:d3fend-id "D3A-ASP" ; + d3f:definition "Answer set programming is a form of declarative programming based on the stable model (answer set) semantics of logic programming." ; + d3f:kb-article """## How it works +Answer set programming (ASP) is oriented towards difficult (primarily NP-hard) search problems. The computational process employed in the design of many answer set solvers is an enhancement of the DPLL algorithm and, in principle, it always terminates (unlike Prolog query evaluation, which may lead to an infinite loop). + +In a more general sense, ASP includes all applications of answer sets to knowledge representation and the use of Prolog-style query evaluation for solving problems arising in these applications. + +## References +1. Answer set programming. (2023, April 27). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Answer_set_programming)""" ; + d3f:synonym "ASP" ; + rdfs:subClassOf d3f:LogicProgramming . + +d3f:ApplicationInventorySensor a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Inventory Sensor" ; + d3f:definition "Collects information on applications on an endpoint." ; + d3f:monitors d3f:Application ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:Application ], + d3f:EndpointSensor . + +d3f:ApplicationLayerLink a owl:Class ; + rdfs:label "Application Layer Link" ; + rdfs:subClassOf d3f:LogicalLink . + +d3f:ApplicationProcessConfiguration a owl:Class ; + rdfs:label "Application Process Configuration" ; + d3f:definition "The current configuration of an application process, stored in memory. It may have been sourced from other types of application configurations, e.g. Application Configuration Files or Application Configuration Database Records." ; + rdfs:subClassOf d3f:ApplicationConfiguration . + +d3f:ApplicationShim a owl:Class ; + rdfs:label "Application Shim" ; + d3f:definition "An application shim adapts an application program to run on a version of a platform for which they were not originally created. Most commonly \"Application Shimming\" refers to use of The Windows Application Compatibility Toolkit (ACT) provides backward compatibility by simulating the behavior of older version of Windows." ; + rdfs:seeAlso d3f:Shim, + ; + rdfs:subClassOf d3f:Shim . + +d3f:AssignPrivilegesToGroupEvent a owl:Class ; + rdfs:label "Assign Privileges to Group Event" ; + d3f:definition "An event where specific privileges or rights are granted to a group, enabling its members to perform actions or access resources as defined by the privileges." ; + rdfs:subClassOf d3f:GroupManagementEvent . + +d3f:AssociationRuleLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Association Rule Learning" ; + d3f:d3fend-id "D3A-ARL" ; + d3f:definition "Association rule learning is a rule-based machine learning method for discovering interesting relations between variables in large databases." ; + d3f:kb-article """## References +Association rule learning. (n.d.). Wikipedia. [Link](https://en.wikipedia.org/wiki/Association_rule_learning)""" ; + rdfs:subClassOf d3f:UnsupervisedLearning . + +d3f:AsymmetricFeature-basedTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Asymmetric Feature-based Transfer Learning" ; + d3f:d3fend-id "D3A-AFTL" ; + d3f:definition "Homogeneous (where the metrics are the same for both source and target) asymmetric transformation mapping transforms the source feature space to align with that of the target or the target to that of the source. This, in effect, bridges the feature space gap and reduces the problem into a homogeneous transfer problem when further distribution differences need to be corrected." ; + d3f:kb-article """## References +Day, O., & Khoshgoftaar, T.M. (2017). A survey on heterogeneous transfer learning. Journal of Big Data, 4(1), 29. [Link](https://doi.org/10.1186/s40537-017-0089-0).""" ; + rdfs:subClassOf d3f:HomogenousTransferLearning . + +d3f:AuthenticateUser a owl:Class, + owl:NamedIndividual ; + rdfs:label "Authenticate User" ; + d3f:authenticates d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:UserAccount ], + d3f:SystemCall . + +d3f:AuthenticationServer a owl:Class ; + rdfs:label "Authentication Server" ; + d3f:definition "An authentication server provides a network service that applications use to authenticate the credentials, usually account names and passwords, of their users. When a client submits a valid set of credentials, it receives a cryptographic ticket that it can subsequently use to access various services. Major authentication algorithms include passwords, Kerberos, and public key encryption." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Server . + +d3f:AuthorizationLog a owl:Class, + owl:NamedIndividual ; + rdfs:label "Authorization Log" ; + d3f:definition "A log of authorization events." ; + d3f:records d3f:NetworkResourceAccess ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:records ; + owl:someValuesFrom d3f:NetworkResourceAccess ], + d3f:EventLog . + +d3f:Autoencoding a owl:Class, + owl:NamedIndividual ; + rdfs:label "Autoencoding" ; + d3f:d3fend-id "D3A-AUT" ; + d3f:definition "Autoencoders are specific type of deep learning architecture used for learning representation of data, typically for the purpose of dimensionality reduction. This is achieved by designing deep learning architecture that aims that copying input layer at its output layer." ; + d3f:kb-article """## References +SOCR. (n.d.). ABIDE Autoencoder. [Link](https://socr.umich.edu/HTML5/ABIDE_Autoencoder/#:~:text=In%20simple%20words%2C%20autoencoders%20are,layer%20at%20its%20output%20layer.)""" ; + rdfs:subClassOf d3f:DimensionReduction . + +d3f:AutoregressiveModel a owl:Class, + owl:NamedIndividual ; + rdfs:label "Autoregressive Model" ; + d3f:d3fend-id "D3A-AM" ; + d3f:definition "An autoregressive (AR) model is a representation of a type of random process; as such, it is used to describe certain time-varying processes in nature, economics, behavior, etc." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Autoregressive model. [Link](https://en.wikipedia.org/wiki/Autoregressive_model)""" ; + d3f:synonym "AR Model" ; + rdfs:subClassOf d3f:TimeSeriesAnalysis . + +d3f:BERT a owl:Class, + owl:NamedIndividual ; + rdfs:label "BERT" ; + d3f:d3fend-id "D3A-BER" ; + d3f:definition "Bidirectional Encoder Representations from Transformers (BERT) is based on a deep learning model in which every output element is connected to every input element, and the weightings between them are dynamically calculated based upon their connection." ; + d3f:kb-article """## References +BERT (language model). (n.d.). In TechTarget. [Link](https://www.techtarget.com/searchenterpriseai/definition/BERT-language-model) +BERT (language model). (n.d.). In Wikipedia. [Link](https://en.wikipedia.org/wiki/BERT_(language_model))""" ; + d3f:synonym "Bidirectional Encoder Representations from Transformers" ; + rdfs:subClassOf d3f:Transformer-basedLearning . + +d3f:BSDProcess a d3f:Process, + owl:NamedIndividual ; + rdfs:label "BSD Process" . + +d3f:BarcodeScannerInputDevice a owl:Class ; + rdfs:label "Barcode Scanner Input Device" ; + d3f:definition "A barcode reader (or barcode scanner) is an optical scanner that can read printed barcodes, decode the data contained in the barcode and send the data to a computer. Like a flatbed scanner, it consists of a light source, a lens and a light sensor translating for optical impulses into electrical signals. Additionally, nearly all barcode readers contain decoder circuitry that can analyze the barcode's image data provided by the sensor and sending the barcode's content to the scanner's output port." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ImageScannerInputDevice ; + skos:altLabel "Barcode Reader" . + +d3f:BashScriptFile a d3f:ExecutableScript, + owl:NamedIndividual ; + rdfs:label "Bash Script File" . + +d3f:BayesOptimalClassifier a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bayes Optimal Classifier" ; + d3f:d3fend-id "D3A-BOC" ; + d3f:definition "A probabilistic model that makes the most probable prediction for a new example." ; + d3f:kb-article """## References +Bayes Optimal Classifier. Machine Learning Mastery. [Link](https://machinelearningmastery.com/bayes-optimal-classifier/). +Ensemble learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Ensemble_learning).""" ; + rdfs:subClassOf d3f:EnsembleLearning . + +d3f:BayesianEstimation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bayesian Estimation" ; + d3f:d3fend-id "D3A-BE" ; + d3f:definition "A Bayes estimator or a Bayes action is an estimator or decision rule that minimizes the posterior expected value of a loss function (i.e., the posterior expected loss)." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Bayes estimator. [Link](https://en.wikipedia.org/wiki/Bayes_estimator)""" ; + rdfs:subClassOf d3f:BayesianMethod . + +d3f:BayesianHypothesisTesting a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bayesian Hypothesis Testing" ; + d3f:d3fend-id "D3A-BHT" ; + d3f:definition "Bayesian hypothesis testing can be framed as a special case of model comparison where a model refers to a likelihood function and a prior distribution." ; + d3f:kb-article """## How it works +Given two competing hypotheses and some relevant data, Bayesian hypothesis testing begins by specifying separate prior distributions to quantitatively describe each hypothesis. The combination of the likelihood function for the observed data with each of the prior distributions yields hypothesis-specific models. For each of the hypothesis-specific models, averaging (ie, integrating) the likelihood with respect to the prior distribution across the entire parameter space yields the probability of the data under the model and, therefore, the corresponding hypothesis. This quantity is more commonly referred to as the marginal likelihood and represents the average fit of the model to the data. The ratio of the marginal likelihoods for both hypothesis-specific models is known as the Bayes factor. + +## References +Baig, S. A., PhD. (2020). Bayesian Inference: An Introduction to Hypothesis Testing Using Bayes Factors. Nicotine & Tobacco Research, 22(7), 1244-1246. [Link](https://academic.oup.com/ntr/article/22/7/1244/5613971)""" ; + rdfs:subClassOf d3f:BayesianMethod . + +d3f:BayesianLinearRegressionLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bayesian Linear Regression Learning" ; + d3f:d3fend-id "D3A-BLRL" ; + d3f:definition "A supervised learning method that builds a Bayesian linear regression model using training data." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Bayesian linear regression. [Link](https://en.wikipedia.org/wiki/Bayesian_linear_regression)""" ; + rdfs:seeAlso d3f:BayesianLinearRegression ; + rdfs:subClassOf d3f:RegressionAnalysisLearning . + +d3f:BayesianModelAveraging a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bayesian Model Averaging" ; + d3f:d3fend-id "D3A-BMA" ; + d3f:definition "A parameter estimate (or a prediction of new observations) obtained by averaging the estimates (or predictions) of the different models under consideration, each weighted by its model probability." ; + d3f:kb-article """## References +Ensemble learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Ensemble_learning). + +Bayesian model average: A parameter estimation approach to model agnostic ensemble learning. (2019). Journal of Machine Learning for Modeling and Computing, 1(2), 61-70. [Link](https://journals.sagepub.com/doi/full/10.1177/2515245919898657#:~:text=Bayesian%20model%20average%3A%20A%20parameter,weighted%20by%20its%20model%20probability).""" ; + rdfs:subClassOf d3f:EnsembleLearning . + +d3f:BayesianModelCombination a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bayesian Model Combination" ; + d3f:d3fend-id "D3A-BMC" ; + d3f:definition "Bayesian model combination (BMC) is an algorithmic correction to Bayesian model averaging (BMA). Instead of sampling each model in the ensemble individually, it samples from the space of possible ensembles (with model weights drawn randomly from a Dirichlet distribution having uniform parameters)" ; + d3f:kb-article """## References +Ensemble learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Ensemble_learning). + +Shultz, K. M., & Peterson, L. E. (2011). Model-averaged confidence intervals for ensemble learning. In *International Joint Conference on Neural Networks* (pp. 2677-2684). [Link](https://axon.cs.byu.edu/papers/Kristine.ijcnn2011.pdf).""" ; + rdfs:subClassOf d3f:EnsembleLearning . + +d3f:BinaryClassification a owl:Class ; + rdfs:label "Binary Classification" ; + rdfs:subClassOf d3f:Classifying . + +d3f:BooleanExpressionMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Boolean Expression Matching" ; + d3f:d3fend-id "D3A-BEM" ; + d3f:definition "Boolean expression matching produces a Boolean truth value for a given boolean expression and assignment of values to variables in the expression." ; + d3f:kb-article """## How it works +A Boolean expression is an expression used in programming languages that produces a Boolean value when evaluated. A Boolean value is either true or false. A Boolean expression may be composed of a combination of the Boolean constants true or false, Boolean-typed variables, Boolean-valued operators, and Boolean-valued functions. + +Boolean expressions correspond to propositional formulas in logic and are a special case of Boolean circuits. + +## References +1. Boolean expression. (2022, April 25). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Boolean_expression) +2. Boolean algebra. (2022, May 19). In _Wikipedia_. +[Link](https://en.wikipedia.org/wiki/Boolean_expression)""" ; + rdfs:subClassOf d3f:LogicalRules . + +d3f:Boosting a owl:Class, + owl:NamedIndividual ; + rdfs:label "Boosting" ; + d3f:d3fend-id "D3A-BOO" ; + d3f:definition "Boosting is a sequential process where each subsequent model attempts to correct the errors of the previous model" ; + d3f:kb-article """## How it works +Boosting consists of using sequentially weak learners where each iteration’s training focuses on previously misclassified instances in order to improve on the previous iteration. This process is continued iteratively until the final prediction is made by aggregating the previous predictions. + +## Considerations +Boosting can be computationally expensive, prone to overfitting, and slower to train compared to other ensemble methods. + +There are three main types of Boosting algorithms + - Adaptive Boosting +Adaptive Boosting (sometimes called AdaBoost) works by adding equal importance to each piece of a dataset and running it through the base learning algorithms. Every algorithm that errors, the boosting algorithm assigns a higher importance to. This continues until an acceptable level of confidence is reached. + - Gradient Boosting +Gradient Boosting starts by training multiple models simultaneously to gather a strong estimate of strength to build new base learning algorithms. + - XGBoosting +XGBoosting is a scalable tree boosting model. Using decision trees, weight is assigned to each variable and put into a decision tree. Outputs that are classified by the algorithm as wrong or weak are put into a second decision tree and the results form a stronger model. + +## References +Sciencedirect. (n.d.). Semi-supervised learning: An overview. [Link](https://www.sciencedirect.com/science/article/pii/S1319157823000228)""" ; + rdfs:subClassOf d3f:EnsembleLearning . + +d3f:BucketOfModels a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bucket of Models" ; + d3f:d3fend-id "D3A-BOM" ; + d3f:definition "A \"bucket of models\" is an ensemble technique in which a model selection algorithm is used to choose the best model for each problem. When tested with only one problem, a bucket of models can produce no better results than the best model in the set, but when evaluated across many problems, it will typically produce much better results, on average, than any model in the set." ; + d3f:kb-article """## References +Ensemble learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Ensemble_learning).""" ; + rdfs:subClassOf d3f:EnsembleLearning . + +d3f:BusinessCommunicationPlatformClient a owl:Class ; + rdfs:label "Business Communication Platform Client" ; + d3f:definition "Client software to enable the process of sharing information between employees within and outside a company. Business communication encompasses topics such as marketing, brand management, customer relations, consumer behavior, advertising, public relations, corporate communication, community engagement, reputation management, interpersonal communication, employee engagement, and event management. It is closely related to the fields of professional communication and technical communication." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:CollaborativeSoftware . + +d3f:C4.5 a owl:Class, + owl:NamedIndividual ; + rdfs:label "C4.5" ; + d3f:d3fend-id "D3A-C4." ; + d3f:definition "C4.5 is an algorithm that is strongly based off ID3. It creates decision trees the same way as ID3. C4.5 improves on several aspects of ID3, including handling discreet variables, handling training data with missing values, and has the ability to automatically prune the decision trees it creates." ; + d3f:kb-article """## References +C4.5 algorithm. Wikipedia. [Link](https://en.wikipedia.org/wiki/C4.5_algorithm).""" ; + rdfs:subClassOf d3f:DecisionTree . + +d3f:C5.0 a owl:Class, + owl:NamedIndividual ; + rdfs:label "C5.0" ; + d3f:d3fend-id "D3A-C5." ; + d3f:definition "C5.0 is the next version of C4.5, which in turn is the upgrade from ID3. The only difference between C5.0 and C4.5 is some improvements made to C5.0." ; + d3f:kb-article """## References +C4.5 algorithm. Wikipedia. [Link](https://en.wikipedia.org/wiki/C4.5_algorithm).""" ; + rdfs:subClassOf d3f:DecisionTree . + +d3f:CACertificateFile a owl:Class ; + rdfs:label "CA Certificate File" ; + d3f:definition "A file containing a digital certificate issued by a certificate authority (CA). Certificate authorities store, issue, and sign digital certificates used as part of the public key infrastructure." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:CertificateFile . + +d3f:CAPEC-663 a d3f:CommonAttackPattern, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Exploitation of Transient Instruction Execution" ; + d3f:capec-id "CAPEC-553" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:CommonAttackPattern . + +d3f:CWE-1004 a owl:Class ; + rdfs:label "Sensitive Cookie Without 'HttpOnly' Flag" ; + d3f:cwe-id "CWE-1004" ; + rdfs:subClassOf d3f:CWE-732 . + +d3f:CWE-1007 a owl:Class ; + rdfs:label "Insufficient Visual Distinction of Homoglyphs Presented to User" ; + d3f:cwe-id "CWE-1007" ; + rdfs:subClassOf d3f:CWE-451 . + +d3f:CWE-102 a owl:Class ; + rdfs:label "Struts: Duplicate Validation Forms" ; + d3f:cwe-id "CWE-102" ; + rdfs:subClassOf d3f:CWE-1173, + d3f:CWE-694 . + +d3f:CWE-1021 a owl:Class ; + rdfs:label "Improper Restriction of Rendered UI Layers or Frames" ; + d3f:cwe-id "CWE-1021" ; + rdfs:subClassOf d3f:CWE-441, + d3f:CWE-451 . + +d3f:CWE-1022 a owl:Class ; + rdfs:label "Use of Web Link to Untrusted Target with window.opener Access" ; + d3f:cwe-id "CWE-1022" ; + rdfs:subClassOf d3f:CWE-266 . + +d3f:CWE-1024 a owl:Class ; + rdfs:label "Comparison of Incompatible Types" ; + d3f:cwe-id "CWE-1024" ; + rdfs:subClassOf d3f:CWE-697 . + +d3f:CWE-103 a owl:Class ; + rdfs:label "Struts: Incomplete validate() Method Definition" ; + d3f:cwe-id "CWE-103" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-1037 a owl:Class ; + rdfs:label "Processor Optimization Removal or Modification of Security-critical Code" ; + d3f:cwe-id "CWE-1037" ; + rdfs:subClassOf d3f:CWE-1038 . + +d3f:CWE-1039 a owl:Class ; + rdfs:label "Automated Recognition Mechanism with Inadequate Detection or Handling of Adversarial Input Perturbations" ; + d3f:cwe-id "CWE-1039" ; + rdfs:subClassOf d3f:CWE-693, + d3f:CWE-697 . + +d3f:CWE-104 a owl:Class ; + rdfs:label "Struts: Form Bean Does Not Extend Validation Class" ; + d3f:cwe-id "CWE-104" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-1041 a owl:Class ; + rdfs:label "Use of Redundant Code" ; + d3f:cwe-id "CWE-1041" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1042 a owl:Class ; + rdfs:label "Static Member Data Element outside of a Singleton Class Element" ; + d3f:cwe-id "CWE-1042" ; + rdfs:subClassOf d3f:CWE-1176 . + +d3f:CWE-1043 a owl:Class ; + rdfs:label "Data Element Aggregating an Excessively Large Number of Non-Primitive Elements" ; + d3f:cwe-id "CWE-1043" ; + rdfs:subClassOf d3f:CWE-1093 . + +d3f:CWE-1044 a owl:Class ; + rdfs:label "Architecture with Number of Horizontal Layers Outside of Expected Range" ; + d3f:cwe-id "CWE-1044" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1045 a owl:Class ; + rdfs:label "Parent Class with a Virtual Destructor and a Child Class without a Virtual Destructor" ; + d3f:cwe-id "CWE-1045" ; + rdfs:subClassOf d3f:CWE-1076 . + +d3f:CWE-1046 a owl:Class ; + rdfs:label "Creation of Immutable Text Using String Concatenation" ; + d3f:cwe-id "CWE-1046" ; + rdfs:subClassOf d3f:CWE-1176 . + +d3f:CWE-1047 a owl:Class ; + rdfs:label "Modules with Circular Dependencies" ; + d3f:cwe-id "CWE-1047" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1048 a owl:Class ; + rdfs:label "Invokable Control Element with Large Number of Outward Calls" ; + d3f:cwe-id "CWE-1048" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1049 a owl:Class ; + rdfs:label "Excessive Data Query Operations in a Large Data Table" ; + d3f:cwe-id "CWE-1049" ; + rdfs:subClassOf d3f:CWE-1176 . + +d3f:CWE-105 a owl:Class ; + rdfs:label "Struts: Form Field Without Validator" ; + d3f:cwe-id "CWE-105" ; + rdfs:subClassOf d3f:CWE-1173 . + +d3f:CWE-1050 a owl:Class ; + rdfs:label "Excessive Platform Resource Consumption within a Loop" ; + d3f:cwe-id "CWE-1050" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-1051 a owl:Class ; + rdfs:label "Initialization with Hard-Coded Network Resource Configuration Data" ; + d3f:cwe-id "CWE-1051" ; + rdfs:subClassOf d3f:CWE-665 . + +d3f:CWE-1052 a owl:Class ; + rdfs:label "Excessive Use of Hard-Coded Literals in Initialization" ; + d3f:cwe-id "CWE-1052" ; + rdfs:subClassOf d3f:CWE-665 . + +d3f:CWE-1053 a owl:Class ; + rdfs:label "Missing Documentation for Design" ; + d3f:cwe-id "CWE-1053" ; + rdfs:subClassOf d3f:CWE-1059 . + +d3f:CWE-1054 a owl:Class ; + rdfs:label "Invocation of a Control Element at an Unnecessarily Deep Horizontal Layer" ; + d3f:cwe-id "CWE-1054" ; + rdfs:subClassOf d3f:CWE-1061 . + +d3f:CWE-1055 a owl:Class ; + rdfs:label "Multiple Inheritance from Concrete Classes" ; + d3f:cwe-id "CWE-1055" ; + rdfs:subClassOf d3f:CWE-1093 . + +d3f:CWE-1056 a owl:Class ; + rdfs:label "Invokable Control Element with Variadic Parameters" ; + d3f:cwe-id "CWE-1056" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1057 a owl:Class ; + rdfs:label "Data Access Operations Outside of Expected Data Manager Component" ; + d3f:cwe-id "CWE-1057" ; + rdfs:subClassOf d3f:CWE-1061 . + +d3f:CWE-1058 a owl:Class ; + rdfs:label "Invokable Control Element in Multi-Thread Context with non-Final Static Storable or Member Element" ; + d3f:cwe-id "CWE-1058" ; + rdfs:subClassOf d3f:CWE-662 . + +d3f:CWE-106 a owl:Class ; + rdfs:label "Struts: Plug-in Framework not in Use" ; + d3f:cwe-id "CWE-106" ; + rdfs:subClassOf d3f:CWE-1173 . + +d3f:CWE-1060 a owl:Class ; + rdfs:label "Excessive Number of Inefficient Server-Side Data Accesses" ; + d3f:cwe-id "CWE-1060" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1062 a owl:Class ; + rdfs:label "Parent Class with References to Child Class" ; + d3f:cwe-id "CWE-1062" ; + rdfs:subClassOf d3f:CWE-1061 . + +d3f:CWE-1063 a owl:Class ; + rdfs:label "Creation of Class Instance within a Static Code Block" ; + d3f:cwe-id "CWE-1063" ; + rdfs:subClassOf d3f:CWE-1176 . + +d3f:CWE-1064 a owl:Class ; + rdfs:label "Invokable Control Element with Signature Containing an Excessive Number of Parameters" ; + d3f:cwe-id "CWE-1064" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1065 a owl:Class ; + rdfs:label "Runtime Resource Management Control Element in a Component Built to Run on Application Servers" ; + d3f:cwe-id "CWE-1065" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1066 a owl:Class ; + rdfs:label "Missing Serialization Control Element" ; + d3f:cwe-id "CWE-1066" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1067 a owl:Class ; + rdfs:label "Excessive Execution of Sequential Searches of Data Resource" ; + d3f:cwe-id "CWE-1067" ; + rdfs:subClassOf d3f:CWE-1176 . + +d3f:CWE-1068 a owl:Class ; + rdfs:label "Inconsistency Between Implementation and Documented Design" ; + d3f:cwe-id "CWE-1068" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1069 a owl:Class ; + rdfs:label "Empty Exception Block" ; + d3f:cwe-id "CWE-1069" ; + rdfs:subClassOf d3f:CWE-1071 . + +d3f:CWE-107 a owl:Class ; + rdfs:label "Struts: Unused Validation Form" ; + d3f:cwe-id "CWE-107" ; + rdfs:subClassOf d3f:CWE-1164 . + +d3f:CWE-1070 a owl:Class ; + rdfs:label "Serializable Data Element Containing non-Serializable Item Elements" ; + d3f:cwe-id "CWE-1070" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1072 a owl:Class ; + rdfs:label "Data Resource Access without Use of Connection Pooling" ; + d3f:cwe-id "CWE-1072" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-1073 a owl:Class ; + rdfs:label "Non-SQL Invokable Control Element with Excessive Number of Data Resource Accesses" ; + d3f:cwe-id "CWE-1073" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-1074 a owl:Class ; + rdfs:label "Class with Excessively Deep Inheritance" ; + d3f:cwe-id "CWE-1074" ; + rdfs:subClassOf d3f:CWE-1093 . + +d3f:CWE-1075 a owl:Class ; + rdfs:label "Unconditional Control Flow Transfer outside of Switch Block" ; + d3f:cwe-id "CWE-1075" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1077 a owl:Class ; + rdfs:label "Floating Point Comparison with Incorrect Operator" ; + d3f:cwe-id "CWE-1077" ; + rdfs:subClassOf d3f:CWE-697 . + +d3f:CWE-1079 a owl:Class ; + rdfs:label "Parent Class without Virtual Destructor Method" ; + d3f:cwe-id "CWE-1079" ; + rdfs:subClassOf d3f:CWE-1076 . + +d3f:CWE-108 a owl:Class ; + rdfs:label "Struts: Unvalidated Action Form" ; + d3f:cwe-id "CWE-108" ; + rdfs:subClassOf d3f:CWE-1173 . + +d3f:CWE-1080 a owl:Class ; + rdfs:label "Source Code File with Excessive Number of Lines of Code" ; + d3f:cwe-id "CWE-1080" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1082 a owl:Class ; + rdfs:label "Class Instance Self Destruction Control Element" ; + d3f:cwe-id "CWE-1082" ; + rdfs:subClassOf d3f:CWE-1076 . + +d3f:CWE-1083 a owl:Class ; + rdfs:label "Data Access from Outside Expected Data Manager Component" ; + d3f:cwe-id "CWE-1083" ; + rdfs:subClassOf d3f:CWE-1061 . + +d3f:CWE-1084 a owl:Class ; + rdfs:label "Invokable Control Element with Excessive File or Data Access Operations" ; + d3f:cwe-id "CWE-1084" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-1085 a owl:Class ; + rdfs:label "Invokable Control Element with Excessive Volume of Commented-out Code" ; + d3f:cwe-id "CWE-1085" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-1086 a owl:Class ; + rdfs:label "Class with Excessive Number of Child Classes" ; + d3f:cwe-id "CWE-1086" ; + rdfs:subClassOf d3f:CWE-1093 . + +d3f:CWE-1087 a owl:Class ; + rdfs:label "Class with Virtual Method without a Virtual Destructor" ; + d3f:cwe-id "CWE-1087" ; + rdfs:subClassOf d3f:CWE-1076 . + +d3f:CWE-1088 a owl:Class ; + rdfs:label "Synchronous Access of Remote Resource without Timeout" ; + d3f:cwe-id "CWE-1088" ; + rdfs:subClassOf d3f:CWE-821 . + +d3f:CWE-1089 a owl:Class ; + rdfs:label "Large Data Table with Excessive Number of Indices" ; + d3f:cwe-id "CWE-1089" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-109 a owl:Class ; + rdfs:label "Struts: Validator Turned Off" ; + d3f:cwe-id "CWE-109" ; + rdfs:subClassOf d3f:CWE-1173 . + +d3f:CWE-1090 a owl:Class ; + rdfs:label "Method Containing Access of a Member Element from Another Class" ; + d3f:cwe-id "CWE-1090" ; + rdfs:subClassOf d3f:CWE-1061 . + +d3f:CWE-1091 a owl:Class ; + rdfs:label "Use of Object without Invoking Destructor Method" ; + d3f:cwe-id "CWE-1091" ; + rdfs:subClassOf d3f:CWE-1076, + d3f:CWE-772 . + +d3f:CWE-1092 a owl:Class ; + rdfs:label "Use of Same Invokable Control Element in Multiple Architectural Layers" ; + d3f:cwe-id "CWE-1092" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1094 a owl:Class ; + rdfs:label "Excessive Index Range Scan for a Data Resource" ; + d3f:cwe-id "CWE-1094" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-1095 a owl:Class ; + rdfs:label "Loop Condition Value Update within the Loop" ; + d3f:cwe-id "CWE-1095" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1096 a owl:Class ; + rdfs:label "Singleton Class Instance Creation without Proper Locking or Synchronization" ; + d3f:cwe-id "CWE-1096" ; + rdfs:subClassOf d3f:CWE-820 . + +d3f:CWE-1097 a owl:Class ; + rdfs:label "Persistent Storable Data Element without Associated Comparison Control Element" ; + d3f:cwe-id "CWE-1097" ; + rdfs:subClassOf d3f:CWE-1076 . + +d3f:CWE-1098 a owl:Class ; + rdfs:label "Data Element containing Pointer Item without Proper Copy Control Element" ; + d3f:cwe-id "CWE-1098" ; + rdfs:subClassOf d3f:CWE-1076 . + +d3f:CWE-1099 a owl:Class ; + rdfs:label "Inconsistent Naming Conventions for Identifiers" ; + d3f:cwe-id "CWE-1099" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-11 a owl:Class ; + rdfs:label "ASP.NET Misconfiguration: Creating Debug Binary" ; + d3f:cwe-id "CWE-11" ; + rdfs:subClassOf d3f:CWE-489 . + +d3f:CWE-110 a owl:Class ; + rdfs:label "Struts: Validator Without Form Field" ; + d3f:cwe-id "CWE-110" ; + rdfs:subClassOf d3f:CWE-1164 . + +d3f:CWE-1100 a owl:Class ; + rdfs:label "Insufficient Isolation of System-Dependent Functions" ; + d3f:cwe-id "CWE-1100" ; + rdfs:subClassOf d3f:CWE-1061 . + +d3f:CWE-1101 a owl:Class ; + rdfs:label "Reliance on Runtime Component in Generated Code" ; + d3f:cwe-id "CWE-1101" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1102 a owl:Class ; + rdfs:label "Reliance on Machine-Dependent Data Representation" ; + d3f:cwe-id "CWE-1102" ; + rdfs:subClassOf d3f:CWE-758 . + +d3f:CWE-1103 a owl:Class ; + rdfs:label "Use of Platform-Dependent Third Party Components" ; + d3f:cwe-id "CWE-1103" ; + rdfs:subClassOf d3f:CWE-758 . + +d3f:CWE-1104 a owl:Class ; + rdfs:label "Use of Unmaintained Third Party Components" ; + d3f:cwe-id "CWE-1104" ; + rdfs:subClassOf d3f:CWE-1357 . + +d3f:CWE-1106 a owl:Class ; + rdfs:label "Insufficient Use of Symbolic Constants" ; + d3f:cwe-id "CWE-1106" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-1107 a owl:Class ; + rdfs:label "Insufficient Isolation of Symbolic Constant Definitions" ; + d3f:cwe-id "CWE-1107" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-1108 a owl:Class ; + rdfs:label "Excessive Reliance on Global Variables" ; + d3f:cwe-id "CWE-1108" ; + rdfs:subClassOf d3f:CWE-1076 . + +d3f:CWE-1109 a owl:Class ; + rdfs:label "Use of Same Variable for Multiple Purposes" ; + d3f:cwe-id "CWE-1109" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-111 a owl:Class ; + rdfs:label "Direct Use of Unsafe JNI" ; + d3f:cwe-id "CWE-111" ; + rdfs:subClassOf d3f:CWE-695 . + +d3f:CWE-1110 a owl:Class ; + rdfs:label "Incomplete Design Documentation" ; + d3f:cwe-id "CWE-1110" ; + rdfs:subClassOf d3f:CWE-1059 . + +d3f:CWE-1111 a owl:Class ; + rdfs:label "Incomplete I/O Documentation" ; + d3f:cwe-id "CWE-1111" ; + rdfs:subClassOf d3f:CWE-1059 . + +d3f:CWE-1112 a owl:Class ; + rdfs:label "Incomplete Documentation of Program Execution" ; + d3f:cwe-id "CWE-1112" ; + rdfs:subClassOf d3f:CWE-1059 . + +d3f:CWE-1113 a owl:Class ; + rdfs:label "Inappropriate Comment Style" ; + d3f:cwe-id "CWE-1113" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-1114 a owl:Class ; + rdfs:label "Inappropriate Whitespace Style" ; + d3f:cwe-id "CWE-1114" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-1115 a owl:Class ; + rdfs:label "Source Code Element without Standard Prologue" ; + d3f:cwe-id "CWE-1115" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-1116 a owl:Class ; + rdfs:label "Inaccurate Comments" ; + d3f:cwe-id "CWE-1116" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-1117 a owl:Class ; + rdfs:label "Callable with Insufficient Behavioral Summary" ; + d3f:cwe-id "CWE-1117" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-1118 a owl:Class ; + rdfs:label "Insufficient Documentation of Error Handling Techniques" ; + d3f:cwe-id "CWE-1118" ; + rdfs:subClassOf d3f:CWE-1059 . + +d3f:CWE-1119 a owl:Class ; + rdfs:label "Excessive Use of Unconditional Branching" ; + d3f:cwe-id "CWE-1119" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-112 a owl:Class ; + rdfs:label "Missing XML Validation" ; + d3f:cwe-id "CWE-112" ; + rdfs:subClassOf d3f:CWE-1286 . + +d3f:CWE-1121 a owl:Class ; + rdfs:label "Excessive McCabe Cyclomatic Complexity" ; + d3f:cwe-id "CWE-1121" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1122 a owl:Class ; + rdfs:label "Excessive Halstead Complexity" ; + d3f:cwe-id "CWE-1122" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1123 a owl:Class ; + rdfs:label "Excessive Use of Self-Modifying Code" ; + d3f:cwe-id "CWE-1123" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1124 a owl:Class ; + rdfs:label "Excessively Deep Nesting" ; + d3f:cwe-id "CWE-1124" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1125 a owl:Class ; + rdfs:label "Excessive Attack Surface" ; + d3f:cwe-id "CWE-1125" ; + rdfs:subClassOf d3f:CWE-1120 . + +d3f:CWE-1126 a owl:Class ; + rdfs:label "Declaration of Variable with Unnecessarily Wide Scope" ; + d3f:cwe-id "CWE-1126" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1127 a owl:Class ; + rdfs:label "Compilation with Insufficient Warnings or Errors" ; + d3f:cwe-id "CWE-1127" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-113 a owl:Class ; + rdfs:label "Improper Neutralization of CRLF Sequences in HTTP Headers ('HTTP Request/Response Splitting')" ; + d3f:cwe-id "CWE-113" ; + rdfs:subClassOf d3f:CWE-436, + d3f:CWE-93 . + +d3f:CWE-114 a owl:Class ; + rdfs:label "Process Control" ; + d3f:cwe-id "CWE-114" ; + rdfs:subClassOf d3f:CWE-73 . + +d3f:CWE-115 a owl:Class ; + rdfs:label "Misinterpretation of Input" ; + d3f:cwe-id "CWE-115" ; + rdfs:subClassOf d3f:CWE-436 . + +d3f:CWE-117 a owl:Class ; + rdfs:label "Improper Output Neutralization for Logs" ; + d3f:cwe-id "CWE-117" ; + rdfs:subClassOf d3f:CWE-116 . + +d3f:CWE-1174 a owl:Class ; + rdfs:label "ASP.NET Misconfiguration: Improper Model Validation" ; + d3f:cwe-id "CWE-1174" ; + rdfs:subClassOf d3f:CWE-1173 . + +d3f:CWE-1190 a owl:Class ; + rdfs:label "DMA Device Enabled Too Early in Boot Phase" ; + d3f:cwe-id "CWE-1190" ; + rdfs:subClassOf d3f:CWE-696 . + +d3f:CWE-1191 a owl:Class ; + rdfs:label "On-Chip Debug and Test Interface With Improper Access Control" ; + d3f:cwe-id "CWE-1191" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1192 a owl:Class ; + rdfs:label "System-on-Chip (SoC) Using Components without Unique, Immutable Identifiers" ; + d3f:cwe-id "CWE-1192" ; + rdfs:subClassOf d3f:CWE-657 . + +d3f:CWE-1193 a owl:Class ; + rdfs:label "Power-On of Untrusted Execution Core Before Enabling Fabric Access Control" ; + d3f:cwe-id "CWE-1193" ; + rdfs:subClassOf d3f:CWE-696 . + +d3f:CWE-12 a owl:Class ; + rdfs:label "ASP.NET Misconfiguration: Missing Custom Error Page" ; + d3f:cwe-id "CWE-12" ; + rdfs:subClassOf d3f:CWE-756 . + +d3f:CWE-1209 a owl:Class ; + rdfs:label "Failure to Disable Reserved Bits" ; + d3f:cwe-id "CWE-1209" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-121 a owl:Class ; + rdfs:label "Stack-based Buffer Overflow" ; + d3f:cwe-id "CWE-121" ; + rdfs:subClassOf d3f:CWE-787, + d3f:CWE-788 . + +d3f:CWE-122 a owl:Class ; + rdfs:label "Heap-based Buffer Overflow" ; + d3f:cwe-id "CWE-122" ; + rdfs:subClassOf d3f:CWE-787, + d3f:CWE-788 . + +d3f:CWE-1221 a owl:Class ; + rdfs:label "Incorrect Register Defaults or Module Parameters" ; + d3f:cwe-id "CWE-1221" ; + rdfs:subClassOf d3f:CWE-665 . + +d3f:CWE-1222 a owl:Class ; + rdfs:label "Insufficient Granularity of Address Regions Protected by Register Locks" ; + d3f:cwe-id "CWE-1222" ; + rdfs:subClassOf d3f:CWE-1220 . + +d3f:CWE-1223 a owl:Class ; + rdfs:label "Race Condition for Write-Once Attributes" ; + d3f:cwe-id "CWE-1223" ; + rdfs:subClassOf d3f:CWE-362 . + +d3f:CWE-1224 a owl:Class ; + rdfs:label "Improper Restriction of Write-Once Bit Fields" ; + d3f:cwe-id "CWE-1224" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-123 a owl:Class ; + rdfs:label "Write-what-where Condition" ; + d3f:cwe-id "CWE-123" ; + rdfs:subClassOf d3f:CWE-787 . + +d3f:CWE-1231 a owl:Class ; + rdfs:label "Improper Prevention of Lock Bit Modification" ; + d3f:cwe-id "CWE-1231" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1232 a owl:Class ; + rdfs:label "Improper Lock Behavior After Power State Transition" ; + d3f:cwe-id "CWE-1232" ; + rdfs:subClassOf d3f:CWE-667 . + +d3f:CWE-1233 a owl:Class ; + rdfs:label "Security-Sensitive Hardware Controls with Missing Lock Bit Protection" ; + d3f:cwe-id "CWE-1233" ; + rdfs:subClassOf d3f:CWE-284, + d3f:CWE-667 . + +d3f:CWE-1234 a owl:Class ; + rdfs:label "Hardware Internal or Debug Modes Allow Override of Locks" ; + d3f:cwe-id "CWE-1234" ; + rdfs:subClassOf d3f:CWE-667 . + +d3f:CWE-1235 a owl:Class ; + rdfs:label "Incorrect Use of Autoboxing and Unboxing for Performance Critical Operations" ; + d3f:cwe-id "CWE-1235" ; + rdfs:subClassOf d3f:CWE-400 . + +d3f:CWE-1236 a owl:Class ; + rdfs:label "Improper Neutralization of Formula Elements in a CSV File" ; + d3f:cwe-id "CWE-1236" ; + rdfs:subClassOf d3f:CWE-74 . + +d3f:CWE-1239 a owl:Class ; + rdfs:label "Improper Zeroization of Hardware Register" ; + d3f:cwe-id "CWE-1239" ; + rdfs:subClassOf d3f:CWE-226 . + +d3f:CWE-124 a owl:Class ; + rdfs:label "Buffer Underwrite ('Buffer Underflow')" ; + d3f:cwe-id "CWE-124" ; + rdfs:subClassOf d3f:CWE-786, + d3f:CWE-787 . + +d3f:CWE-1240 a owl:Class ; + rdfs:label "Use of a Cryptographic Primitive with a Risky Implementation" ; + d3f:cwe-id "CWE-1240" ; + rdfs:subClassOf d3f:CWE-327 . + +d3f:CWE-1241 a owl:Class ; + rdfs:label "Use of Predictable Algorithm in Random Number Generator" ; + d3f:cwe-id "CWE-1241" ; + rdfs:subClassOf d3f:CWE-330 . + +d3f:CWE-1242 a owl:Class ; + rdfs:label "Inclusion of Undocumented Features or Chicken Bits" ; + d3f:cwe-id "CWE-1242" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1243 a owl:Class ; + rdfs:label "Sensitive Non-Volatile Information Not Protected During Debug" ; + d3f:cwe-id "CWE-1243" ; + rdfs:subClassOf d3f:CWE-1263 . + +d3f:CWE-1244 a owl:Class ; + rdfs:label "Internal Asset Exposed to Unsafe Debug Access Level or State" ; + d3f:cwe-id "CWE-1244" ; + rdfs:subClassOf d3f:CWE-863 . + +d3f:CWE-1245 a owl:Class ; + rdfs:label "Improper Finite State Machines (FSMs) in Hardware Logic" ; + d3f:cwe-id "CWE-1245" ; + rdfs:subClassOf d3f:CWE-684 . + +d3f:CWE-1246 a owl:Class ; + rdfs:label "Improper Write Handling in Limited-write Non-Volatile Memories" ; + d3f:cwe-id "CWE-1246" ; + rdfs:subClassOf d3f:CWE-400 . + +d3f:CWE-1247 a owl:Class ; + rdfs:label "Improper Protection Against Voltage and Clock Glitches" ; + d3f:cwe-id "CWE-1247" ; + rdfs:subClassOf d3f:CWE-1384 . + +d3f:CWE-1248 a owl:Class ; + rdfs:label "Semiconductor Defects in Hardware Logic with Security-Sensitive Implications" ; + d3f:cwe-id "CWE-1248" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-1249 a owl:Class ; + rdfs:label "Application-Level Admin Tool with Inconsistent View of Underlying Operating System" ; + d3f:cwe-id "CWE-1249" ; + rdfs:subClassOf d3f:CWE-1250 . + +d3f:CWE-1251 a owl:Class ; + rdfs:label "Mirrored Regions with Different Values" ; + d3f:cwe-id "CWE-1251" ; + rdfs:subClassOf d3f:CWE-1250 . + +d3f:CWE-1252 a owl:Class ; + rdfs:label "CPU Hardware Not Configured to Support Exclusivity of Write and Execute Operations" ; + d3f:cwe-id "CWE-1252" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1253 a owl:Class ; + rdfs:label "Incorrect Selection of Fuse Values" ; + d3f:cwe-id "CWE-1253" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-1254 a owl:Class ; + rdfs:label "Incorrect Comparison Logic Granularity" ; + d3f:cwe-id "CWE-1254" ; + rdfs:subClassOf d3f:CWE-208, + d3f:CWE-697 . + +d3f:CWE-1255 a owl:Class ; + rdfs:label "Comparison Logic is Vulnerable to Power Side-Channel Attacks" ; + d3f:cwe-id "CWE-1255" ; + rdfs:subClassOf d3f:CWE-1300 . + +d3f:CWE-1256 a owl:Class ; + rdfs:label "Improper Restriction of Software Interfaces to Hardware Features" ; + d3f:cwe-id "CWE-1256" ; + rdfs:subClassOf d3f:CWE-285 . + +d3f:CWE-1257 a owl:Class ; + rdfs:label "Improper Access Control Applied to Mirrored or Aliased Memory Regions" ; + d3f:cwe-id "CWE-1257" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1258 a owl:Class ; + rdfs:label "Exposure of Sensitive System Information Due to Uncleared Debug Information" ; + d3f:cwe-id "CWE-1258" ; + rdfs:subClassOf d3f:CWE-200, + d3f:CWE-212 . + +d3f:CWE-1259 a owl:Class ; + rdfs:label "Improper Restriction of Security Token Assignment" ; + d3f:cwe-id "CWE-1259" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-126 a owl:Class ; + rdfs:label "Buffer Over-read" ; + d3f:cwe-id "CWE-126" ; + rdfs:subClassOf d3f:CWE-125, + d3f:CWE-788 . + +d3f:CWE-1260 a owl:Class ; + rdfs:label "Improper Handling of Overlap Between Protected Memory Ranges" ; + d3f:cwe-id "CWE-1260" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1261 a owl:Class ; + rdfs:label "Improper Handling of Single Event Upsets" ; + d3f:cwe-id "CWE-1261" ; + rdfs:subClassOf d3f:CWE-1384 . + +d3f:CWE-1262 a owl:Class ; + rdfs:label "Improper Access Control for Register Interface" ; + d3f:cwe-id "CWE-1262" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1264 a owl:Class ; + rdfs:label "Hardware Logic with Insecure De-Synchronization between Control and Data Channels" ; + d3f:cwe-id "CWE-1264" ; + rdfs:subClassOf d3f:CWE-821 . + +d3f:CWE-1265 a owl:Class ; + rdfs:label "Unintended Reentrant Invocation of Non-reentrant Code Via Nested Calls" ; + d3f:cwe-id "CWE-1265" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-1266 a owl:Class ; + rdfs:label "Improper Scrubbing of Sensitive Data from Decommissioned Device" ; + d3f:cwe-id "CWE-1266" ; + rdfs:subClassOf d3f:CWE-404 . + +d3f:CWE-1267 a owl:Class ; + rdfs:label "Policy Uses Obsolete Encoding" ; + d3f:cwe-id "CWE-1267" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1268 a owl:Class ; + rdfs:label "Policy Privileges are not Assigned Consistently Between Control and Data Agents" ; + d3f:cwe-id "CWE-1268" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1269 a owl:Class ; + rdfs:label "Product Released in Non-Release Configuration" ; + d3f:cwe-id "CWE-1269" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-127 a owl:Class ; + rdfs:label "Buffer Under-read" ; + d3f:cwe-id "CWE-127" ; + rdfs:subClassOf d3f:CWE-125, + d3f:CWE-786 . + +d3f:CWE-1270 a owl:Class ; + rdfs:label "Generation of Incorrect Security Tokens" ; + d3f:cwe-id "CWE-1270" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1271 a owl:Class ; + rdfs:label "Uninitialized Value on Reset for Registers Holding Security Settings" ; + d3f:cwe-id "CWE-1271" ; + rdfs:subClassOf d3f:CWE-909 . + +d3f:CWE-1272 a owl:Class ; + rdfs:label "Sensitive Information Uncleared Before Debug/Power State Transition" ; + d3f:cwe-id "CWE-1272" ; + rdfs:subClassOf d3f:CWE-226 . + +d3f:CWE-1273 a owl:Class ; + rdfs:label "Device Unlock Credential Sharing" ; + d3f:cwe-id "CWE-1273" ; + rdfs:subClassOf d3f:CWE-200 . + +d3f:CWE-1274 a owl:Class ; + rdfs:label "Improper Access Control for Volatile Memory Containing Boot Code" ; + d3f:cwe-id "CWE-1274" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1275 a owl:Class ; + rdfs:label "Sensitive Cookie with Improper SameSite Attribute" ; + d3f:cwe-id "CWE-1275" ; + rdfs:subClassOf d3f:CWE-923 . + +d3f:CWE-1276 a owl:Class ; + rdfs:label "Hardware Child Block Incorrectly Connected to Parent System" ; + d3f:cwe-id "CWE-1276" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1277 a owl:Class ; + rdfs:label "Firmware Not Updateable" ; + d3f:cwe-id "CWE-1277" ; + rdfs:subClassOf d3f:CWE-1329 . + +d3f:CWE-1278 a owl:Class ; + rdfs:label "Missing Protection Against Hardware Reverse Engineering Using Integrated Circuit (IC) Imaging Techniques" ; + d3f:cwe-id "CWE-1278" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-1279 a owl:Class ; + rdfs:label "Cryptographic Operations are run Before Supporting Units are Ready" ; + d3f:cwe-id "CWE-1279" ; + rdfs:subClassOf d3f:CWE-665 . + +d3f:CWE-128 a owl:Class ; + rdfs:label "Wrap-around Error" ; + d3f:cwe-id "CWE-128" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-1280 a owl:Class ; + rdfs:label "Access Control Check Implemented After Asset is Accessed" ; + d3f:cwe-id "CWE-1280" ; + rdfs:subClassOf d3f:CWE-284, + d3f:CWE-696 . + +d3f:CWE-1281 a owl:Class ; + rdfs:label "Sequence of Processor Instructions Leads to Unexpected Behavior" ; + d3f:cwe-id "CWE-1281" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-1282 a owl:Class ; + rdfs:label "Assumed-Immutable Data is Stored in Writable Memory" ; + d3f:cwe-id "CWE-1282" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-1283 a owl:Class ; + rdfs:label "Mutable Attestation or Measurement Reporting Data" ; + d3f:cwe-id "CWE-1283" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1287 a owl:Class ; + rdfs:label "Improper Validation of Specified Type of Input" ; + d3f:cwe-id "CWE-1287" ; + rdfs:subClassOf d3f:CWE-20 . + +d3f:CWE-1288 a owl:Class ; + rdfs:label "Improper Validation of Consistency within Input" ; + d3f:cwe-id "CWE-1288" ; + rdfs:subClassOf d3f:CWE-20 . + +d3f:CWE-1289 a owl:Class ; + rdfs:label "Improper Validation of Unsafe Equivalence in Input" ; + d3f:cwe-id "CWE-1289" ; + rdfs:subClassOf d3f:CWE-20 . + +d3f:CWE-129 a owl:Class ; + rdfs:label "Improper Validation of Array Index" ; + d3f:cwe-id "CWE-129" ; + rdfs:subClassOf d3f:CWE-1285 . + +d3f:CWE-1290 a owl:Class ; + rdfs:label "Incorrect Decoding of Security Identifiers" ; + d3f:cwe-id "CWE-1290" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1291 a owl:Class ; + rdfs:label "Public Key Re-Use for Signing both Debug and Production Code" ; + d3f:cwe-id "CWE-1291" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-1292 a owl:Class ; + rdfs:label "Incorrect Conversion of Security Identifiers" ; + d3f:cwe-id "CWE-1292" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1293 a owl:Class ; + rdfs:label "Missing Source Correlation of Multiple Independent Data" ; + d3f:cwe-id "CWE-1293" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-1295 a owl:Class ; + rdfs:label "Debug Messages Revealing Unnecessary Information" ; + d3f:cwe-id "CWE-1295" ; + rdfs:subClassOf d3f:CWE-200 . + +d3f:CWE-1296 a owl:Class ; + rdfs:label "Incorrect Chaining or Granularity of Debug Components" ; + d3f:cwe-id "CWE-1296" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1297 a owl:Class ; + rdfs:label "Unprotected Confidential Information on Device is Accessible by OSAT Vendors" ; + d3f:cwe-id "CWE-1297" ; + rdfs:subClassOf d3f:CWE-285 . + +d3f:CWE-1298 a owl:Class ; + rdfs:label "Hardware Logic Contains Race Conditions" ; + d3f:cwe-id "CWE-1298" ; + rdfs:subClassOf d3f:CWE-362 . + +d3f:CWE-1299 a owl:Class ; + rdfs:label "Missing Protection Mechanism for Alternate Hardware Interface" ; + d3f:cwe-id "CWE-1299" ; + rdfs:subClassOf d3f:CWE-288, + d3f:CWE-420 . + +d3f:CWE-13 a owl:Class ; + rdfs:label "ASP.NET Misconfiguration: Password in Configuration File" ; + d3f:cwe-id "CWE-13" ; + rdfs:subClassOf d3f:CWE-260 . + +d3f:CWE-130 a owl:Class ; + rdfs:label "Improper Handling of Length Parameter Inconsistency" ; + d3f:cwe-id "CWE-130" ; + rdfs:subClassOf d3f:CWE-240 . + +d3f:CWE-1302 a owl:Class ; + rdfs:label "Missing Security Identifier" ; + d3f:cwe-id "CWE-1302" ; + rdfs:subClassOf d3f:CWE-1294 . + +d3f:CWE-1303 a owl:Class ; + rdfs:label "Non-Transparent Sharing of Microarchitectural Resources" ; + d3f:cwe-id "CWE-1303" ; + rdfs:subClassOf d3f:CWE-1189, + d3f:CWE-203 . + +d3f:CWE-1304 a owl:Class ; + rdfs:label "Improperly Preserved Integrity of Hardware Configuration State During a Power Save/Restore Operation" ; + d3f:cwe-id "CWE-1304" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1310 a owl:Class ; + rdfs:label "Missing Ability to Patch ROM Code" ; + d3f:cwe-id "CWE-1310" ; + rdfs:subClassOf d3f:CWE-1329 . + +d3f:CWE-1311 a owl:Class ; + rdfs:label "Improper Translation of Security Attributes by Fabric Bridge" ; + d3f:cwe-id "CWE-1311" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1312 a owl:Class ; + rdfs:label "Missing Protection for Mirrored Regions in On-Chip Fabric Firewall" ; + d3f:cwe-id "CWE-1312" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1313 a owl:Class ; + rdfs:label "Hardware Allows Activation of Test or Debug Logic at Runtime" ; + d3f:cwe-id "CWE-1313" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1314 a owl:Class ; + rdfs:label "Missing Write Protection for Parametric Data Values" ; + d3f:cwe-id "CWE-1314" ; + rdfs:subClassOf d3f:CWE-862 . + +d3f:CWE-1315 a owl:Class ; + rdfs:label "Improper Setting of Bus Controlling Capability in Fabric End-point" ; + d3f:cwe-id "CWE-1315" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1316 a owl:Class ; + rdfs:label "Fabric-Address Map Allows Programming of Unwarranted Overlaps of Protected and Unprotected Ranges" ; + d3f:cwe-id "CWE-1316" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1317 a owl:Class ; + rdfs:label "Improper Access Control in Fabric Bridge" ; + d3f:cwe-id "CWE-1317" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1318 a owl:Class ; + rdfs:label "Missing Support for Security Features in On-chip Fabrics or Buses" ; + d3f:cwe-id "CWE-1318" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-1319 a owl:Class ; + rdfs:label "Improper Protection against Electromagnetic Fault Injection (EM-FI)" ; + d3f:cwe-id "CWE-1319" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-1320 a owl:Class ; + rdfs:label "Improper Protection for Outbound Error Messages and Alert Signals" ; + d3f:cwe-id "CWE-1320" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1321 a owl:Class ; + rdfs:label "Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution')" ; + d3f:cwe-id "CWE-1321" ; + rdfs:subClassOf d3f:CWE-915 . + +d3f:CWE-1322 a owl:Class ; + rdfs:label "Use of Blocking Code in Single-threaded, Non-blocking Context" ; + d3f:cwe-id "CWE-1322" ; + rdfs:subClassOf d3f:CWE-834 . + +d3f:CWE-1323 a owl:Class ; + rdfs:label "Improper Management of Sensitive Trace Data" ; + d3f:cwe-id "CWE-1323" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1325 a owl:Class ; + rdfs:label "Improperly Controlled Sequential Memory Allocation" ; + d3f:cwe-id "CWE-1325" ; + rdfs:subClassOf d3f:CWE-770 . + +d3f:CWE-1326 a owl:Class ; + rdfs:label "Missing Immutable Root of Trust in Hardware" ; + d3f:cwe-id "CWE-1326" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-1327 a owl:Class ; + rdfs:label "Binding to an Unrestricted IP Address" ; + d3f:cwe-id "CWE-1327" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-1328 a owl:Class ; + rdfs:label "Security Version Number Mutable to Older Versions" ; + d3f:cwe-id "CWE-1328" ; + rdfs:subClassOf d3f:CWE-285 . + +d3f:CWE-1330 a owl:Class ; + rdfs:label "Remanent Data Readable after Memory Erase" ; + d3f:cwe-id "CWE-1330" ; + rdfs:subClassOf d3f:CWE-1301 . + +d3f:CWE-1331 a owl:Class ; + rdfs:label "Improper Isolation of Shared Resources in Network On Chip (NoC)" ; + d3f:cwe-id "CWE-1331" ; + rdfs:subClassOf d3f:CWE-653, + d3f:CWE-668 . + +d3f:CWE-1332 a owl:Class ; + rdfs:label "Improper Handling of Faults that Lead to Instruction Skips" ; + d3f:cwe-id "CWE-1332" ; + rdfs:subClassOf d3f:CWE-1384 . + +d3f:CWE-1333 a owl:Class ; + rdfs:label "Inefficient Regular Expression Complexity" ; + d3f:cwe-id "CWE-1333" ; + rdfs:subClassOf d3f:CWE-407 . + +d3f:CWE-1334 a owl:Class ; + rdfs:label "Unauthorized Error Injection Can Degrade Hardware Redundancy" ; + d3f:cwe-id "CWE-1334" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1335 a owl:Class ; + rdfs:label "Incorrect Bitwise Shift of Integer" ; + d3f:cwe-id "CWE-1335" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-1336 a owl:Class ; + rdfs:label "Improper Neutralization of Special Elements Used in a Template Engine" ; + d3f:cwe-id "CWE-1336" ; + rdfs:subClassOf d3f:CWE-94 . + +d3f:CWE-1338 a owl:Class ; + rdfs:label "Improper Protections Against Hardware Overheating" ; + d3f:cwe-id "CWE-1338" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-1339 a owl:Class ; + rdfs:label "Insufficient Precision or Accuracy of a Real Number" ; + d3f:cwe-id "CWE-1339" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-134 a owl:Class ; + rdfs:label "Use of Externally-Controlled Format String" ; + d3f:cwe-id "CWE-134" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-1342 a owl:Class ; + rdfs:label "Information Exposure through Microarchitectural State after Transient Execution" ; + d3f:cwe-id "CWE-1342" ; + rdfs:subClassOf d3f:CWE-226 . + +d3f:CWE-135 a owl:Class ; + rdfs:label "Incorrect Calculation of Multi-Byte String Length" ; + d3f:cwe-id "CWE-135" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-1351 a owl:Class ; + rdfs:label "Improper Handling of Hardware Behavior in Exceptionally Cold Environments" ; + d3f:cwe-id "CWE-1351" ; + rdfs:subClassOf d3f:CWE-1384 . + +d3f:CWE-1385 a owl:Class ; + rdfs:label "Missing Origin Validation in WebSockets" ; + d3f:cwe-id "CWE-1385" ; + rdfs:subClassOf d3f:CWE-346 . + +d3f:CWE-1386 a owl:Class ; + rdfs:label "Insecure Operation on Windows Junction / Mount Point" ; + d3f:cwe-id "CWE-1386" ; + rdfs:subClassOf d3f:CWE-59 . + +d3f:CWE-1389 a owl:Class ; + rdfs:label "Incorrect Parsing of Numbers with Different Radices" ; + d3f:cwe-id "CWE-1389" ; + rdfs:subClassOf d3f:CWE-704 . + +d3f:CWE-1393 a owl:Class ; + rdfs:label "Use of Default Password" ; + d3f:cwe-id "CWE-1393" ; + rdfs:subClassOf d3f:CWE-1392 . + +d3f:CWE-1394 a owl:Class ; + rdfs:label "Use of Default Cryptographic Key" ; + d3f:cwe-id "CWE-1394" ; + rdfs:subClassOf d3f:CWE-1392 . + +d3f:CWE-1395 a owl:Class ; + rdfs:label "Dependency on Vulnerable Third-Party Component" ; + d3f:cwe-id "CWE-1395" ; + rdfs:subClassOf d3f:CWE-657 . + +d3f:CWE-14 a owl:Class ; + rdfs:label "Compiler Removal of Code to Clear Buffers" ; + d3f:cwe-id "CWE-14" ; + rdfs:subClassOf d3f:CWE-733 . + +d3f:CWE-141 a owl:Class ; + rdfs:label "Improper Neutralization of Parameter/Argument Delimiters" ; + d3f:cwe-id "CWE-141" ; + rdfs:subClassOf d3f:CWE-140 . + +d3f:CWE-142 a owl:Class ; + rdfs:label "Improper Neutralization of Value Delimiters" ; + d3f:cwe-id "CWE-142" ; + rdfs:subClassOf d3f:CWE-140 . + +d3f:CWE-143 a owl:Class ; + rdfs:label "Improper Neutralization of Record Delimiters" ; + d3f:cwe-id "CWE-143" ; + rdfs:subClassOf d3f:CWE-140 . + +d3f:CWE-144 a owl:Class ; + rdfs:label "Improper Neutralization of Line Delimiters" ; + d3f:cwe-id "CWE-144" ; + rdfs:subClassOf d3f:CWE-140 . + +d3f:CWE-145 a owl:Class ; + rdfs:label "Improper Neutralization of Section Delimiters" ; + d3f:cwe-id "CWE-145" ; + rdfs:subClassOf d3f:CWE-140 . + +d3f:CWE-146 a owl:Class ; + rdfs:label "Improper Neutralization of Expression/Command Delimiters" ; + d3f:cwe-id "CWE-146" ; + rdfs:subClassOf d3f:CWE-140 . + +d3f:CWE-148 a owl:Class ; + rdfs:label "Improper Neutralization of Input Leaders" ; + d3f:cwe-id "CWE-148" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-149 a owl:Class ; + rdfs:label "Improper Neutralization of Quoting Syntax" ; + d3f:cwe-id "CWE-149" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-15 a owl:Class ; + rdfs:label "External Control of System or Configuration Setting" ; + d3f:cwe-id "CWE-15" ; + rdfs:subClassOf d3f:CWE-610, + d3f:CWE-642 . + +d3f:CWE-150 a owl:Class ; + rdfs:label "Improper Neutralization of Escape, Meta, or Control Sequences" ; + d3f:cwe-id "CWE-150" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-151 a owl:Class ; + rdfs:label "Improper Neutralization of Comment Delimiters" ; + d3f:cwe-id "CWE-151" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-152 a owl:Class ; + rdfs:label "Improper Neutralization of Macro Symbols" ; + d3f:cwe-id "CWE-152" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-153 a owl:Class ; + rdfs:label "Improper Neutralization of Substitution Characters" ; + d3f:cwe-id "CWE-153" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-154 a owl:Class ; + rdfs:label "Improper Neutralization of Variable Name Delimiters" ; + d3f:cwe-id "CWE-154" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-156 a owl:Class ; + rdfs:label "Improper Neutralization of Whitespace" ; + d3f:cwe-id "CWE-156" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-157 a owl:Class ; + rdfs:label "Failure to Sanitize Paired Delimiters" ; + d3f:cwe-id "CWE-157" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-158 a owl:Class ; + rdfs:label "Improper Neutralization of Null Byte or NUL Character" ; + d3f:cwe-id "CWE-158" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-166 a owl:Class ; + rdfs:label "Improper Handling of Missing Special Element" ; + d3f:cwe-id "CWE-166" ; + rdfs:subClassOf d3f:CWE-159, + d3f:CWE-703 . + +d3f:CWE-167 a owl:Class ; + rdfs:label "Improper Handling of Additional Special Element" ; + d3f:cwe-id "CWE-167" ; + rdfs:subClassOf d3f:CWE-159, + d3f:CWE-703 . + +d3f:CWE-168 a owl:Class ; + rdfs:label "Improper Handling of Inconsistent Special Elements" ; + d3f:cwe-id "CWE-168" ; + rdfs:subClassOf d3f:CWE-159, + d3f:CWE-703 . + +d3f:CWE-170 a owl:Class ; + rdfs:label "Improper Null Termination" ; + d3f:cwe-id "CWE-170" ; + rdfs:subClassOf d3f:CWE-707 . + +d3f:CWE-173 a owl:Class ; + rdfs:label "Improper Handling of Alternate Encoding" ; + d3f:cwe-id "CWE-173" ; + rdfs:subClassOf d3f:CWE-172 . + +d3f:CWE-174 a owl:Class ; + rdfs:label "Double Decoding of the Same Data" ; + d3f:cwe-id "CWE-174" ; + rdfs:subClassOf d3f:CWE-172, + d3f:CWE-675 . + +d3f:CWE-175 a owl:Class ; + rdfs:label "Improper Handling of Mixed Encoding" ; + d3f:cwe-id "CWE-175" ; + rdfs:subClassOf d3f:CWE-172 . + +d3f:CWE-176 a owl:Class ; + rdfs:label "Improper Handling of Unicode Encoding" ; + d3f:cwe-id "CWE-176" ; + rdfs:subClassOf d3f:CWE-172 . + +d3f:CWE-177 a owl:Class ; + rdfs:label "Improper Handling of URL Encoding (Hex Encoding)" ; + d3f:cwe-id "CWE-177" ; + rdfs:subClassOf d3f:CWE-172 . + +d3f:CWE-178 a owl:Class ; + rdfs:label "Improper Handling of Case Sensitivity" ; + d3f:cwe-id "CWE-178" ; + rdfs:subClassOf d3f:CWE-706 . + +d3f:CWE-180 a owl:Class ; + rdfs:label "Incorrect Behavior Order: Validate Before Canonicalize" ; + d3f:cwe-id "CWE-180" ; + rdfs:subClassOf d3f:CWE-179 . + +d3f:CWE-181 a owl:Class ; + rdfs:label "Incorrect Behavior Order: Validate Before Filter" ; + d3f:cwe-id "CWE-181" ; + rdfs:subClassOf d3f:CWE-179 . + +d3f:CWE-182 a owl:Class ; + rdfs:label "Collapse of Data into Unsafe Value" ; + d3f:cwe-id "CWE-182" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-184 a owl:Class ; + rdfs:label "Incomplete List of Disallowed Inputs" ; + d3f:cwe-id "CWE-184" ; + rdfs:subClassOf d3f:CWE-1023, + d3f:CWE-693 . + +d3f:CWE-186 a owl:Class ; + rdfs:label "Overly Restrictive Regular Expression" ; + d3f:cwe-id "CWE-186" ; + rdfs:subClassOf d3f:CWE-185 . + +d3f:CWE-187 a owl:Class ; + rdfs:label "Partial String Comparison" ; + d3f:cwe-id "CWE-187" ; + rdfs:subClassOf d3f:CWE-1023 . + +d3f:CWE-190 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Integer Overflow or Wraparound" ; + d3f:cwe-id "CWE-190" ; + d3f:weakness-of d3f:MathematicalFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:MathematicalFunction ], + d3f:CWE-682 . + +d3f:CWE-191 a owl:Class ; + rdfs:label "Integer Underflow (Wrap or Wraparound)" ; + d3f:cwe-id "CWE-191" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-192 a owl:Class ; + rdfs:label "Integer Coercion Error" ; + d3f:cwe-id "CWE-192" ; + rdfs:subClassOf d3f:CWE-681 . + +d3f:CWE-193 a owl:Class ; + rdfs:label "Off-by-one Error" ; + d3f:cwe-id "CWE-193" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-194 a owl:Class ; + rdfs:label "Unexpected Sign Extension" ; + d3f:cwe-id "CWE-194" ; + rdfs:subClassOf d3f:CWE-681 . + +d3f:CWE-195 a owl:Class ; + rdfs:label "Signed to Unsigned Conversion Error" ; + d3f:cwe-id "CWE-195" ; + rdfs:subClassOf d3f:CWE-681 . + +d3f:CWE-196 a owl:Class ; + rdfs:label "Unsigned to Signed Conversion Error" ; + d3f:cwe-id "CWE-196" ; + rdfs:subClassOf d3f:CWE-681 . + +d3f:CWE-197 a owl:Class ; + rdfs:label "Numeric Truncation Error" ; + d3f:cwe-id "CWE-197" ; + rdfs:subClassOf d3f:CWE-681 . + +d3f:CWE-198 a owl:Class ; + rdfs:label "Use of Incorrect Byte Ordering" ; + d3f:cwe-id "CWE-198" ; + rdfs:subClassOf d3f:CWE-188 . + +d3f:CWE-202 a owl:Class ; + rdfs:label "Exposure of Sensitive Information Through Data Queries" ; + d3f:cwe-id "CWE-202" ; + rdfs:subClassOf d3f:CWE-1230 . + +d3f:CWE-204 a owl:Class ; + rdfs:label "Observable Response Discrepancy" ; + d3f:cwe-id "CWE-204" ; + rdfs:subClassOf d3f:CWE-203 . + +d3f:CWE-206 a owl:Class ; + rdfs:label "Observable Internal Behavioral Discrepancy" ; + d3f:cwe-id "CWE-206" ; + rdfs:subClassOf d3f:CWE-205 . + +d3f:CWE-207 a owl:Class ; + rdfs:label "Observable Behavioral Discrepancy With Equivalent Products" ; + d3f:cwe-id "CWE-207" ; + rdfs:subClassOf d3f:CWE-205 . + +d3f:CWE-210 a owl:Class ; + rdfs:label "Self-generated Error Message Containing Sensitive Information" ; + d3f:cwe-id "CWE-210" ; + rdfs:subClassOf d3f:CWE-209 . + +d3f:CWE-213 a owl:Class ; + rdfs:label "Exposure of Sensitive Information Due to Incompatible Policies" ; + d3f:cwe-id "CWE-213" ; + rdfs:subClassOf d3f:CWE-200 . + +d3f:CWE-214 a owl:Class ; + rdfs:label "Invocation of Process Using Visible Sensitive Information" ; + d3f:cwe-id "CWE-214" ; + rdfs:subClassOf d3f:CWE-497 . + +d3f:CWE-215 a owl:Class ; + rdfs:label "Insertion of Sensitive Information Into Debugging Code" ; + d3f:cwe-id "CWE-215" ; + rdfs:subClassOf d3f:CWE-200 . + +d3f:CWE-220 a owl:Class ; + rdfs:label "Storage of File With Sensitive Data Under FTP Root" ; + d3f:cwe-id "CWE-220" ; + rdfs:subClassOf d3f:CWE-552 . + +d3f:CWE-222 a owl:Class ; + rdfs:label "Truncation of Security-relevant Information" ; + d3f:cwe-id "CWE-222" ; + rdfs:subClassOf d3f:CWE-221 . + +d3f:CWE-224 a owl:Class ; + rdfs:label "Obscured Security-relevant Information by Alternate Name" ; + d3f:cwe-id "CWE-224" ; + rdfs:subClassOf d3f:CWE-221 . + +d3f:CWE-230 a owl:Class ; + rdfs:label "Improper Handling of Missing Values" ; + d3f:cwe-id "CWE-230" ; + rdfs:subClassOf d3f:CWE-229 . + +d3f:CWE-231 a owl:Class ; + rdfs:label "Improper Handling of Extra Values" ; + d3f:cwe-id "CWE-231" ; + rdfs:subClassOf d3f:CWE-229 . + +d3f:CWE-232 a owl:Class ; + rdfs:label "Improper Handling of Undefined Values" ; + d3f:cwe-id "CWE-232" ; + rdfs:subClassOf d3f:CWE-229 . + +d3f:CWE-234 a owl:Class ; + rdfs:label "Failure to Handle Missing Parameter" ; + d3f:cwe-id "CWE-234" ; + rdfs:subClassOf d3f:CWE-233 . + +d3f:CWE-235 a owl:Class ; + rdfs:label "Improper Handling of Extra Parameters" ; + d3f:cwe-id "CWE-235" ; + rdfs:subClassOf d3f:CWE-233 . + +d3f:CWE-236 a owl:Class ; + rdfs:label "Improper Handling of Undefined Parameters" ; + d3f:cwe-id "CWE-236" ; + rdfs:subClassOf d3f:CWE-233 . + +d3f:CWE-238 a owl:Class ; + rdfs:label "Improper Handling of Incomplete Structural Elements" ; + d3f:cwe-id "CWE-238" ; + rdfs:subClassOf d3f:CWE-237 . + +d3f:CWE-239 a owl:Class ; + rdfs:label "Failure to Handle Incomplete Element" ; + d3f:cwe-id "CWE-239" ; + rdfs:subClassOf d3f:CWE-237 . + +d3f:CWE-24 a owl:Class ; + rdfs:label "Path Traversal: '../filedir'" ; + d3f:cwe-id "CWE-24" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-241 a owl:Class ; + rdfs:label "Improper Handling of Unexpected Data Type" ; + d3f:cwe-id "CWE-241" ; + rdfs:subClassOf d3f:CWE-228 . + +d3f:CWE-242 a owl:Class ; + rdfs:label "Use of Inherently Dangerous Function" ; + d3f:cwe-id "CWE-242" ; + rdfs:subClassOf d3f:CWE-1177 . + +d3f:CWE-243 a owl:Class ; + rdfs:label "Creation of chroot Jail Without Changing Working Directory" ; + d3f:cwe-id "CWE-243" ; + rdfs:subClassOf d3f:CWE-573, + d3f:CWE-669 . + +d3f:CWE-244 a owl:Class ; + rdfs:label "Improper Clearing of Heap Memory Before Release ('Heap Inspection')" ; + d3f:cwe-id "CWE-244" ; + rdfs:subClassOf d3f:CWE-226 . + +d3f:CWE-245 a owl:Class ; + rdfs:label "J2EE Bad Practices: Direct Management of Connections" ; + d3f:cwe-id "CWE-245" ; + rdfs:subClassOf d3f:CWE-695 . + +d3f:CWE-246 a owl:Class ; + rdfs:label "J2EE Bad Practices: Direct Use of Sockets" ; + d3f:cwe-id "CWE-246" ; + rdfs:subClassOf d3f:CWE-695 . + +d3f:CWE-25 a owl:Class ; + rdfs:label "Path Traversal: '/../filedir'" ; + d3f:cwe-id "CWE-25" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-250 a owl:Class ; + rdfs:label "Execution with Unnecessary Privileges" ; + d3f:cwe-id "CWE-250" ; + rdfs:subClassOf d3f:CWE-269, + d3f:CWE-657 . + +d3f:CWE-252 a owl:Class ; + rdfs:label "Unchecked Return Value" ; + d3f:cwe-id "CWE-252" ; + rdfs:subClassOf d3f:CWE-754 . + +d3f:CWE-253 a owl:Class ; + rdfs:label "Incorrect Check of Function Return Value" ; + d3f:cwe-id "CWE-253" ; + rdfs:subClassOf d3f:CWE-573, + d3f:CWE-754 . + +d3f:CWE-256 a owl:Class ; + rdfs:label "Plaintext Storage of a Password" ; + d3f:cwe-id "CWE-256" ; + rdfs:subClassOf d3f:CWE-522 . + +d3f:CWE-257 a owl:Class ; + rdfs:label "Storing Passwords in a Recoverable Format" ; + d3f:cwe-id "CWE-257" ; + rdfs:subClassOf d3f:CWE-522 . + +d3f:CWE-258 a owl:Class ; + rdfs:label "Empty Password in Configuration File" ; + d3f:cwe-id "CWE-258" ; + rdfs:subClassOf d3f:CWE-260, + d3f:CWE-521 . + +d3f:CWE-259 a owl:Class ; + rdfs:label "Use of Hard-coded Password" ; + d3f:cwe-id "CWE-259" ; + rdfs:subClassOf d3f:CWE-798 . + +d3f:CWE-26 a owl:Class ; + rdfs:label "Path Traversal: '/dir/../filename'" ; + d3f:cwe-id "CWE-26" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-261 a owl:Class ; + rdfs:label "Weak Encoding for Password" ; + d3f:cwe-id "CWE-261" ; + rdfs:subClassOf d3f:CWE-522 . + +d3f:CWE-262 a owl:Class ; + rdfs:label "Not Using Password Aging" ; + d3f:cwe-id "CWE-262" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-263 a owl:Class ; + rdfs:label "Password Aging with Long Expiration" ; + d3f:cwe-id "CWE-263" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-268 a owl:Class ; + rdfs:label "Privilege Chaining" ; + d3f:cwe-id "CWE-268" ; + rdfs:subClassOf d3f:CWE-269 . + +d3f:CWE-27 a owl:Class ; + rdfs:label "Path Traversal: 'dir/../../filename'" ; + d3f:cwe-id "CWE-27" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-270 a owl:Class ; + rdfs:label "Privilege Context Switching Error" ; + d3f:cwe-id "CWE-270" ; + rdfs:subClassOf d3f:CWE-269 . + +d3f:CWE-272 a owl:Class ; + rdfs:label "Least Privilege Violation" ; + d3f:cwe-id "CWE-272" ; + rdfs:subClassOf d3f:CWE-271 . + +d3f:CWE-273 a owl:Class ; + rdfs:label "Improper Check for Dropped Privileges" ; + d3f:cwe-id "CWE-273" ; + rdfs:subClassOf d3f:CWE-271, + d3f:CWE-754 . + +d3f:CWE-274 a owl:Class ; + rdfs:label "Improper Handling of Insufficient Privileges" ; + d3f:cwe-id "CWE-274" ; + rdfs:subClassOf d3f:CWE-269, + d3f:CWE-755 . + +d3f:CWE-276 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Incorrect Default Permissions" ; + d3f:cwe-id "CWE-276" ; + d3f:weakness-of d3f:ApplicationInstaller ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:ApplicationInstaller ], + d3f:CWE-732 . + +d3f:CWE-277 a owl:Class ; + rdfs:label "Insecure Inherited Permissions" ; + d3f:cwe-id "CWE-277" ; + rdfs:subClassOf d3f:CWE-732 . + +d3f:CWE-278 a owl:Class ; + rdfs:label "Insecure Preserved Inherited Permissions" ; + d3f:cwe-id "CWE-278" ; + rdfs:subClassOf d3f:CWE-732 . + +d3f:CWE-279 a owl:Class ; + rdfs:label "Incorrect Execution-Assigned Permissions" ; + d3f:cwe-id "CWE-279" ; + rdfs:subClassOf d3f:CWE-732 . + +d3f:CWE-28 a owl:Class ; + rdfs:label "Path Traversal: '..\\filedir'" ; + d3f:cwe-id "CWE-28" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-280 a owl:Class ; + rdfs:label "Improper Handling of Insufficient Permissions or Privileges" ; + d3f:cwe-id "CWE-280" ; + rdfs:subClassOf d3f:CWE-755 . + +d3f:CWE-281 a owl:Class ; + rdfs:label "Improper Preservation of Permissions" ; + d3f:cwe-id "CWE-281" ; + rdfs:subClassOf d3f:CWE-732 . + +d3f:CWE-283 a owl:Class ; + rdfs:label "Unverified Ownership" ; + d3f:cwe-id "CWE-283" ; + rdfs:subClassOf d3f:CWE-282 . + +d3f:CWE-289 a owl:Class ; + rdfs:label "Authentication Bypass by Alternate Name" ; + d3f:cwe-id "CWE-289" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-29 a owl:Class ; + rdfs:label "Path Traversal: '\\..\\filename'" ; + d3f:cwe-id "CWE-29" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-291 a owl:Class ; + rdfs:label "Reliance on IP Address for Authentication" ; + d3f:cwe-id "CWE-291" ; + rdfs:subClassOf d3f:CWE-290, + d3f:CWE-471, + d3f:CWE-923 . + +d3f:CWE-293 a owl:Class ; + rdfs:label "Using Referer Field for Authentication" ; + d3f:cwe-id "CWE-293" ; + rdfs:subClassOf d3f:CWE-290 . + +d3f:CWE-294 a owl:Class ; + rdfs:label "Authentication Bypass by Capture-replay" ; + d3f:cwe-id "CWE-294" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-296 a owl:Class ; + rdfs:label "Improper Following of a Certificate's Chain of Trust" ; + d3f:cwe-id "CWE-296" ; + rdfs:subClassOf d3f:CWE-295, + d3f:CWE-573 . + +d3f:CWE-297 a owl:Class ; + rdfs:label "Improper Validation of Certificate with Host Mismatch" ; + d3f:cwe-id "CWE-297" ; + rdfs:subClassOf d3f:CWE-295, + d3f:CWE-923 . + +d3f:CWE-298 a owl:Class ; + rdfs:label "Improper Validation of Certificate Expiration" ; + d3f:cwe-id "CWE-298" ; + rdfs:subClassOf d3f:CWE-295, + d3f:CWE-672 . + +d3f:CWE-30 a owl:Class ; + rdfs:label "Path Traversal: '\\dir\\..\\filename'" ; + d3f:cwe-id "CWE-30" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-300 a owl:Class ; + rdfs:label "Channel Accessible by Non-Endpoint" ; + d3f:cwe-id "CWE-300" ; + rdfs:subClassOf d3f:CWE-923 . + +d3f:CWE-301 a owl:Class ; + rdfs:label "Reflection Attack in an Authentication Protocol" ; + d3f:cwe-id "CWE-301" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-302 a owl:Class ; + rdfs:label "Authentication Bypass by Assumed-Immutable Data" ; + d3f:cwe-id "CWE-302" ; + rdfs:subClassOf d3f:CWE-1390, + d3f:CWE-807 . + +d3f:CWE-304 a owl:Class ; + rdfs:label "Missing Critical Step in Authentication" ; + d3f:cwe-id "CWE-304" ; + rdfs:subClassOf d3f:CWE-303, + d3f:CWE-573 . + +d3f:CWE-305 a owl:Class ; + rdfs:label "Authentication Bypass by Primary Weakness" ; + d3f:cwe-id "CWE-305" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-307 a owl:Class ; + rdfs:label "Improper Restriction of Excessive Authentication Attempts" ; + d3f:cwe-id "CWE-307" ; + rdfs:subClassOf d3f:CWE-1390, + d3f:CWE-799 . + +d3f:CWE-308 a owl:Class ; + rdfs:label "Use of Single-factor Authentication" ; + d3f:cwe-id "CWE-308" ; + rdfs:subClassOf d3f:CWE-1390, + d3f:CWE-654 . + +d3f:CWE-309 a owl:Class ; + rdfs:label "Use of Password System for Primary Authentication" ; + d3f:cwe-id "CWE-309" ; + rdfs:subClassOf d3f:CWE-1390, + d3f:CWE-654 . + +d3f:CWE-31 a owl:Class ; + rdfs:label "Path Traversal: 'dir\\..\\..\\filename'" ; + d3f:cwe-id "CWE-31" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-313 a owl:Class ; + rdfs:label "Cleartext Storage in a File or on Disk" ; + d3f:cwe-id "CWE-313" ; + rdfs:subClassOf d3f:CWE-312 . + +d3f:CWE-314 a owl:Class ; + rdfs:label "Cleartext Storage in the Registry" ; + d3f:cwe-id "CWE-314" ; + rdfs:subClassOf d3f:CWE-312 . + +d3f:CWE-315 a owl:Class ; + rdfs:label "Cleartext Storage of Sensitive Information in a Cookie" ; + d3f:cwe-id "CWE-315" ; + rdfs:subClassOf d3f:CWE-312 . + +d3f:CWE-316 a owl:Class ; + rdfs:label "Cleartext Storage of Sensitive Information in Memory" ; + d3f:cwe-id "CWE-316" ; + rdfs:subClassOf d3f:CWE-312 . + +d3f:CWE-317 a owl:Class ; + rdfs:label "Cleartext Storage of Sensitive Information in GUI" ; + d3f:cwe-id "CWE-317" ; + rdfs:subClassOf d3f:CWE-312 . + +d3f:CWE-318 a owl:Class ; + rdfs:label "Cleartext Storage of Sensitive Information in Executable" ; + d3f:cwe-id "CWE-318" ; + rdfs:subClassOf d3f:CWE-312 . + +d3f:CWE-32 a owl:Class ; + rdfs:label "Path Traversal: '...' (Triple Dot)" ; + d3f:cwe-id "CWE-32" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-321 a owl:Class ; + rdfs:label "Use of Hard-coded Cryptographic Key" ; + d3f:cwe-id "CWE-321" ; + rdfs:subClassOf d3f:CWE-798 . + +d3f:CWE-322 a owl:Class ; + rdfs:label "Key Exchange without Entity Authentication" ; + d3f:cwe-id "CWE-322" ; + rdfs:subClassOf d3f:CWE-306 . + +d3f:CWE-323 a owl:Class ; + rdfs:label "Reusing a Nonce, Key Pair in Encryption" ; + d3f:cwe-id "CWE-323" ; + rdfs:subClassOf d3f:CWE-344 . + +d3f:CWE-324 a owl:Class ; + rdfs:label "Use of a Key Past its Expiration Date" ; + d3f:cwe-id "CWE-324" ; + rdfs:subClassOf d3f:CWE-672 . + +d3f:CWE-325 a owl:Class ; + rdfs:label "Missing Cryptographic Step" ; + d3f:cwe-id "CWE-325" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-328 a owl:Class ; + rdfs:label "Use of Weak Hash" ; + d3f:cwe-id "CWE-328" ; + rdfs:subClassOf d3f:CWE-326, + d3f:CWE-327 . + +d3f:CWE-329 a owl:Class ; + rdfs:label "Generation of Predictable IV with CBC Mode" ; + d3f:cwe-id "CWE-329" ; + rdfs:subClassOf d3f:CWE-1204, + d3f:CWE-573 . + +d3f:CWE-33 a owl:Class ; + rdfs:label "Path Traversal: '....' (Multiple Dot)" ; + d3f:cwe-id "CWE-33" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-332 a owl:Class ; + rdfs:label "Insufficient Entropy in PRNG" ; + d3f:cwe-id "CWE-332" ; + rdfs:subClassOf d3f:CWE-331 . + +d3f:CWE-333 a owl:Class ; + rdfs:label "Improper Handling of Insufficient Entropy in TRNG" ; + d3f:cwe-id "CWE-333" ; + rdfs:subClassOf d3f:CWE-331, + d3f:CWE-703 . + +d3f:CWE-336 a owl:Class ; + rdfs:label "Same Seed in Pseudo-Random Number Generator (PRNG)" ; + d3f:cwe-id "CWE-336" ; + rdfs:subClassOf d3f:CWE-335 . + +d3f:CWE-337 a owl:Class ; + rdfs:label "Predictable Seed in Pseudo-Random Number Generator (PRNG)" ; + d3f:cwe-id "CWE-337" ; + rdfs:subClassOf d3f:CWE-335 . + +d3f:CWE-338 a owl:Class ; + rdfs:label "Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG)" ; + d3f:cwe-id "CWE-338" ; + rdfs:subClassOf d3f:CWE-330 . + +d3f:CWE-339 a owl:Class ; + rdfs:label "Small Seed Space in PRNG" ; + d3f:cwe-id "CWE-339" ; + rdfs:subClassOf d3f:CWE-335 . + +d3f:CWE-34 a owl:Class ; + rdfs:label "Path Traversal: '....//'" ; + d3f:cwe-id "CWE-34" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-341 a owl:Class ; + rdfs:label "Predictable from Observable State" ; + d3f:cwe-id "CWE-341" ; + rdfs:subClassOf d3f:CWE-340 . + +d3f:CWE-342 a owl:Class ; + rdfs:label "Predictable Exact Value from Previous Values" ; + d3f:cwe-id "CWE-342" ; + rdfs:subClassOf d3f:CWE-340 . + +d3f:CWE-343 a owl:Class ; + rdfs:label "Predictable Value Range from Previous Values" ; + d3f:cwe-id "CWE-343" ; + rdfs:subClassOf d3f:CWE-340 . + +d3f:CWE-347 a owl:Class ; + rdfs:label "Improper Verification of Cryptographic Signature" ; + d3f:cwe-id "CWE-347" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-348 a owl:Class ; + rdfs:label "Use of Less Trusted Source" ; + d3f:cwe-id "CWE-348" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-349 a owl:Class ; + rdfs:label "Acceptance of Extraneous Untrusted Data With Trusted Data" ; + d3f:cwe-id "CWE-349" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-35 a owl:Class ; + rdfs:label "Path Traversal: '.../...//'" ; + d3f:cwe-id "CWE-35" ; + rdfs:subClassOf d3f:CWE-23 . + +d3f:CWE-350 a owl:Class ; + rdfs:label "Reliance on Reverse DNS Resolution for a Security-Critical Action" ; + d3f:cwe-id "CWE-350" ; + rdfs:subClassOf d3f:CWE-290, + d3f:CWE-807 . + +d3f:CWE-351 a owl:Class ; + rdfs:label "Insufficient Type Distinction" ; + d3f:cwe-id "CWE-351" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-352 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cross-Site Request Forgery (CSRF)" ; + d3f:cwe-id "CWE-352" ; + d3f:weakness-of d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-345 . + +d3f:CWE-353 a owl:Class ; + rdfs:label "Missing Support for Integrity Check" ; + d3f:cwe-id "CWE-353" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-354 a owl:Class ; + rdfs:label "Improper Validation of Integrity Check Value" ; + d3f:cwe-id "CWE-354" ; + rdfs:subClassOf d3f:CWE-345, + d3f:CWE-754 . + +d3f:CWE-356 a owl:Class ; + rdfs:label "Product UI does not Warn User of Unsafe Actions" ; + d3f:cwe-id "CWE-356" ; + rdfs:subClassOf d3f:CWE-221 . + +d3f:CWE-358 a owl:Class ; + rdfs:label "Improperly Implemented Security Check for Standard" ; + d3f:cwe-id "CWE-358" ; + rdfs:subClassOf d3f:CWE-573, + d3f:CWE-693 . + +d3f:CWE-359 a owl:Class ; + rdfs:label "Exposure of Private Personal Information to an Unauthorized Actor" ; + d3f:cwe-id "CWE-359" ; + rdfs:subClassOf d3f:CWE-200 . + +d3f:CWE-363 a owl:Class ; + rdfs:label "Race Condition Enabling Link Following" ; + d3f:cwe-id "CWE-363" ; + rdfs:subClassOf d3f:CWE-367 . + +d3f:CWE-366 a owl:Class ; + rdfs:label "Race Condition within a Thread" ; + d3f:cwe-id "CWE-366" ; + rdfs:subClassOf d3f:CWE-362 . + +d3f:CWE-368 a owl:Class ; + rdfs:label "Context Switching Race Condition" ; + d3f:cwe-id "CWE-368" ; + rdfs:subClassOf d3f:CWE-362 . + +d3f:CWE-369 a owl:Class ; + rdfs:label "Divide By Zero" ; + d3f:cwe-id "CWE-369" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-37 a owl:Class ; + rdfs:label "Path Traversal: '/absolute/pathname/here'" ; + d3f:cwe-id "CWE-37" ; + rdfs:subClassOf d3f:CWE-160, + d3f:CWE-36 . + +d3f:CWE-370 a owl:Class ; + rdfs:label "Missing Check for Certificate Revocation after Initial Check" ; + d3f:cwe-id "CWE-370" ; + rdfs:subClassOf d3f:CWE-299 . + +d3f:CWE-372 a owl:Class ; + rdfs:label "Incomplete Internal State Distinction" ; + d3f:cwe-id "CWE-372" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-374 a owl:Class ; + rdfs:label "Passing Mutable Objects to an Untrusted Method" ; + d3f:cwe-id "CWE-374" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-375 a owl:Class ; + rdfs:label "Returning a Mutable Object to an Untrusted Caller" ; + d3f:cwe-id "CWE-375" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-378 a owl:Class ; + rdfs:label "Creation of Temporary File With Insecure Permissions" ; + d3f:cwe-id "CWE-378" ; + rdfs:subClassOf d3f:CWE-377 . + +d3f:CWE-379 a owl:Class ; + rdfs:label "Creation of Temporary File in Directory with Insecure Permissions" ; + d3f:cwe-id "CWE-379" ; + rdfs:subClassOf d3f:CWE-377 . + +d3f:CWE-38 a owl:Class ; + rdfs:label "Path Traversal: '\\absolute\\pathname\\here'" ; + d3f:cwe-id "CWE-38" ; + rdfs:subClassOf d3f:CWE-36 . + +d3f:CWE-382 a owl:Class ; + rdfs:label "J2EE Bad Practices: Use of System.exit()" ; + d3f:cwe-id "CWE-382" ; + rdfs:subClassOf d3f:CWE-705 . + +d3f:CWE-383 a owl:Class ; + rdfs:label "J2EE Bad Practices: Direct Use of Threads" ; + d3f:cwe-id "CWE-383" ; + rdfs:subClassOf d3f:CWE-695 . + +d3f:CWE-384 a owl:Class ; + rdfs:label "Session Fixation" ; + d3f:cwe-id "CWE-384" ; + rdfs:subClassOf d3f:CWE-610 . + +d3f:CWE-385 a owl:Class ; + rdfs:label "Covert Timing Channel" ; + d3f:cwe-id "CWE-385" ; + rdfs:subClassOf d3f:CWE-514 . + +d3f:CWE-386 a owl:Class ; + rdfs:label "Symbolic Name not Mapping to Correct Object" ; + d3f:cwe-id "CWE-386" ; + rdfs:subClassOf d3f:CWE-706 . + +d3f:CWE-39 a owl:Class ; + rdfs:label "Path Traversal: 'C:dirname'" ; + d3f:cwe-id "CWE-39" ; + rdfs:subClassOf d3f:CWE-36 . + +d3f:CWE-390 a owl:Class ; + rdfs:label "Detection of Error Condition Without Action" ; + d3f:cwe-id "CWE-390" ; + rdfs:subClassOf d3f:CWE-755 . + +d3f:CWE-391 a owl:Class ; + rdfs:label "Unchecked Error Condition" ; + d3f:cwe-id "CWE-391" ; + rdfs:subClassOf d3f:CWE-754 . + +d3f:CWE-392 a owl:Class ; + rdfs:label "Missing Report of Error Condition" ; + d3f:cwe-id "CWE-392" ; + rdfs:subClassOf d3f:CWE-684, + d3f:CWE-703 . + +d3f:CWE-393 a owl:Class ; + rdfs:label "Return of Wrong Status Code" ; + d3f:cwe-id "CWE-393" ; + rdfs:subClassOf d3f:CWE-684, + d3f:CWE-703 . + +d3f:CWE-394 a owl:Class ; + rdfs:label "Unexpected Status Code or Return Value" ; + d3f:cwe-id "CWE-394" ; + rdfs:subClassOf d3f:CWE-754 . + +d3f:CWE-395 a owl:Class ; + rdfs:label "Use of NullPointerException Catch to Detect NULL Pointer Dereference" ; + d3f:cwe-id "CWE-395" ; + rdfs:subClassOf d3f:CWE-705, + d3f:CWE-755 . + +d3f:CWE-396 a owl:Class ; + rdfs:label "Declaration of Catch for Generic Exception" ; + d3f:cwe-id "CWE-396" ; + rdfs:subClassOf d3f:CWE-221, + d3f:CWE-705, + d3f:CWE-755 . + +d3f:CWE-397 a owl:Class ; + rdfs:label "Declaration of Throws for Generic Exception" ; + d3f:cwe-id "CWE-397" ; + rdfs:subClassOf d3f:CWE-221, + d3f:CWE-703, + d3f:CWE-705 . + +d3f:CWE-40 a owl:Class ; + rdfs:label "Path Traversal: '\\\\UNC\\share\\name\\' (Windows UNC Share)" ; + d3f:cwe-id "CWE-40" ; + rdfs:subClassOf d3f:CWE-36 . + +d3f:CWE-401 a owl:Class ; + rdfs:label "Missing Release of Memory after Effective Lifetime" ; + d3f:cwe-id "CWE-401" ; + rdfs:subClassOf d3f:CWE-772 . + +d3f:CWE-403 a owl:Class ; + rdfs:label "Exposure of File Descriptor to Unintended Control Sphere ('File Descriptor Leak')" ; + d3f:cwe-id "CWE-403" ; + rdfs:subClassOf d3f:CWE-402 . + +d3f:CWE-406 a owl:Class ; + rdfs:label "Insufficient Control of Network Message Volume (Network Amplification)" ; + d3f:cwe-id "CWE-406" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-408 a owl:Class ; + rdfs:label "Incorrect Behavior Order: Early Amplification" ; + d3f:cwe-id "CWE-408" ; + rdfs:subClassOf d3f:CWE-405, + d3f:CWE-696 . + +d3f:CWE-409 a owl:Class ; + rdfs:label "Improper Handling of Highly Compressed Data (Data Amplification)" ; + d3f:cwe-id "CWE-409" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-410 a owl:Class ; + rdfs:label "Insufficient Resource Pool" ; + d3f:cwe-id "CWE-410" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-412 a owl:Class ; + rdfs:label "Unrestricted Externally Accessible Lock" ; + d3f:cwe-id "CWE-412" ; + rdfs:subClassOf d3f:CWE-667 . + +d3f:CWE-414 a owl:Class ; + rdfs:label "Missing Lock Check" ; + d3f:cwe-id "CWE-414" ; + rdfs:subClassOf d3f:CWE-667 . + +d3f:CWE-415 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Double Free" ; + d3f:cwe-id "CWE-415" ; + d3f:weakness-of d3f:MemoryFreeFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:MemoryFreeFunction ], + d3f:CWE-1341, + d3f:CWE-666, + d3f:CWE-825 . + +d3f:CWE-416 a owl:Class ; + rdfs:label "Use After Free" ; + d3f:cwe-id "CWE-416" ; + rdfs:subClassOf d3f:CWE-825 . + +d3f:CWE-419 a owl:Class ; + rdfs:label "Unprotected Primary Channel" ; + d3f:cwe-id "CWE-419" ; + rdfs:subClassOf d3f:CWE-923 . + +d3f:CWE-421 a owl:Class ; + rdfs:label "Race Condition During Access to Alternate Channel" ; + d3f:cwe-id "CWE-421" ; + rdfs:subClassOf d3f:CWE-362, + d3f:CWE-420 . + +d3f:CWE-422 a owl:Class ; + rdfs:label "Unprotected Windows Messaging Channel ('Shatter')" ; + d3f:cwe-id "CWE-422" ; + rdfs:subClassOf d3f:CWE-360, + d3f:CWE-420 . + +d3f:CWE-425 a owl:Class ; + rdfs:label "Direct Request ('Forced Browsing')" ; + d3f:cwe-id "CWE-425" ; + rdfs:subClassOf d3f:CWE-288, + d3f:CWE-424, + d3f:CWE-862 . + +d3f:CWE-426 a owl:Class ; + rdfs:label "Untrusted Search Path" ; + d3f:cwe-id "CWE-426" ; + rdfs:subClassOf d3f:CWE-642, + d3f:CWE-673 . + +d3f:CWE-427 a owl:Class ; + rdfs:label "Uncontrolled Search Path Element" ; + d3f:cwe-id "CWE-427" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-428 a owl:Class ; + rdfs:label "Unquoted Search Path or Element" ; + d3f:cwe-id "CWE-428" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-43 a owl:Class ; + rdfs:label "Path Equivalence: 'filename....' (Multiple Trailing Dot)" ; + d3f:cwe-id "CWE-43" ; + rdfs:subClassOf d3f:CWE-163, + d3f:CWE-42 . + +d3f:CWE-430 a owl:Class ; + rdfs:label "Deployment of Wrong Handler" ; + d3f:cwe-id "CWE-430" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-431 a owl:Class ; + rdfs:label "Missing Handler" ; + d3f:cwe-id "CWE-431" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-432 a owl:Class ; + rdfs:label "Dangerous Signal Handler not Disabled During Sensitive Operations" ; + d3f:cwe-id "CWE-432" ; + rdfs:subClassOf d3f:CWE-364 . + +d3f:CWE-433 a owl:Class ; + rdfs:label "Unparsed Raw Web Content Delivery" ; + d3f:cwe-id "CWE-433" ; + rdfs:subClassOf d3f:CWE-219 . + +d3f:CWE-434 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Unrestricted Upload of File with Dangerous Type" ; + d3f:cwe-id "CWE-434" ; + d3f:weakness-of d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-669 . + +d3f:CWE-437 a owl:Class ; + rdfs:label "Incomplete Model of Endpoint Features" ; + d3f:cwe-id "CWE-437" ; + rdfs:subClassOf d3f:CWE-436 . + +d3f:CWE-439 a owl:Class ; + rdfs:label "Behavioral Change in New Version or Environment" ; + d3f:cwe-id "CWE-439" ; + rdfs:subClassOf d3f:CWE-435 . + +d3f:CWE-440 a owl:Class ; + rdfs:label "Expected Behavior Violation" ; + d3f:cwe-id "CWE-440" ; + rdfs:subClassOf d3f:CWE-684 . + +d3f:CWE-444 a owl:Class ; + rdfs:label "Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling')" ; + d3f:cwe-id "CWE-444" ; + rdfs:subClassOf d3f:CWE-436 . + +d3f:CWE-447 a owl:Class ; + rdfs:label "Unimplemented or Unsupported Feature in UI" ; + d3f:cwe-id "CWE-447" ; + rdfs:subClassOf d3f:CWE-446, + d3f:CWE-671 . + +d3f:CWE-448 a owl:Class ; + rdfs:label "Obsolete Feature in UI" ; + d3f:cwe-id "CWE-448" ; + rdfs:subClassOf d3f:CWE-446 . + +d3f:CWE-449 a owl:Class ; + rdfs:label "The UI Performs the Wrong Action" ; + d3f:cwe-id "CWE-449" ; + rdfs:subClassOf d3f:CWE-446 . + +d3f:CWE-45 a owl:Class ; + rdfs:label "Path Equivalence: 'file...name' (Multiple Internal Dot)" ; + d3f:cwe-id "CWE-45" ; + rdfs:subClassOf d3f:CWE-165, + d3f:CWE-44 . + +d3f:CWE-450 a owl:Class ; + rdfs:label "Multiple Interpretations of UI Input" ; + d3f:cwe-id "CWE-450" ; + rdfs:subClassOf d3f:CWE-357 . + +d3f:CWE-453 a owl:Class ; + rdfs:label "Insecure Default Variable Initialization" ; + d3f:cwe-id "CWE-453" ; + rdfs:subClassOf d3f:CWE-1188 . + +d3f:CWE-454 a owl:Class ; + rdfs:label "External Initialization of Trusted Variables or Data Stores" ; + d3f:cwe-id "CWE-454" ; + rdfs:subClassOf d3f:CWE-665 . + +d3f:CWE-455 a owl:Class ; + rdfs:label "Non-exit on Failed Initialization" ; + d3f:cwe-id "CWE-455" ; + rdfs:subClassOf d3f:CWE-636, + d3f:CWE-665, + d3f:CWE-705 . + +d3f:CWE-456 a owl:Class ; + rdfs:label "Missing Initialization of a Variable" ; + d3f:cwe-id "CWE-456" ; + rdfs:subClassOf d3f:CWE-909 . + +d3f:CWE-457 a owl:Class ; + rdfs:label "Use of Uninitialized Variable" ; + d3f:cwe-id "CWE-457" ; + rdfs:subClassOf d3f:CWE-908 . + +d3f:CWE-46 a owl:Class ; + rdfs:label "Path Equivalence: 'filename ' (Trailing Space)" ; + d3f:cwe-id "CWE-46" ; + rdfs:subClassOf d3f:CWE-162, + d3f:CWE-41 . + +d3f:CWE-460 a owl:Class ; + rdfs:label "Improper Cleanup on Thrown Exception" ; + d3f:cwe-id "CWE-460" ; + rdfs:subClassOf d3f:CWE-459, + d3f:CWE-755 . + +d3f:CWE-462 a owl:Class ; + rdfs:label "Duplicate Key in Associative List (Alist)" ; + d3f:cwe-id "CWE-462" ; + rdfs:subClassOf d3f:CWE-694 . + +d3f:CWE-463 a owl:Class ; + rdfs:label "Deletion of Data Structure Sentinel" ; + d3f:cwe-id "CWE-463" ; + rdfs:subClassOf d3f:CWE-707 . + +d3f:CWE-464 a owl:Class ; + rdfs:label "Addition of Data Structure Sentinel" ; + d3f:cwe-id "CWE-464" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-466 a owl:Class ; + rdfs:label "Return of Pointer Value Outside of Expected Range" ; + d3f:cwe-id "CWE-466" ; + rdfs:subClassOf d3f:CWE-119 . + +d3f:CWE-467 a owl:Class ; + rdfs:label "Use of sizeof() on a Pointer Type" ; + d3f:cwe-id "CWE-467" ; + rdfs:subClassOf d3f:CWE-131 . + +d3f:CWE-468 a owl:Class ; + rdfs:label "Incorrect Pointer Scaling" ; + d3f:cwe-id "CWE-468" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-469 a owl:Class ; + rdfs:label "Use of Pointer Subtraction to Determine Size" ; + d3f:cwe-id "CWE-469" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-47 a owl:Class ; + rdfs:label "Path Equivalence: ' filename' (Leading Space)" ; + d3f:cwe-id "CWE-47" ; + rdfs:subClassOf d3f:CWE-41 . + +d3f:CWE-470 a owl:Class ; + rdfs:label "Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')" ; + d3f:cwe-id "CWE-470" ; + rdfs:subClassOf d3f:CWE-610, + d3f:CWE-913 . + +d3f:CWE-472 a owl:Class ; + rdfs:label "External Control of Assumed-Immutable Web Parameter" ; + d3f:cwe-id "CWE-472" ; + rdfs:subClassOf d3f:CWE-471, + d3f:CWE-642 . + +d3f:CWE-473 a owl:Class ; + rdfs:label "PHP External Variable Modification" ; + d3f:cwe-id "CWE-473" ; + rdfs:subClassOf d3f:CWE-471 . + +d3f:CWE-475 a owl:Class ; + rdfs:label "Undefined Behavior for Input to API" ; + d3f:cwe-id "CWE-475" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-477 a owl:Class ; + rdfs:label "Use of Obsolete Function" ; + d3f:cwe-id "CWE-477" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-478 a owl:Class ; + rdfs:label "Missing Default Case in Multiple Condition Expression" ; + d3f:cwe-id "CWE-478" ; + rdfs:subClassOf d3f:CWE-1023 . + +d3f:CWE-479 a owl:Class ; + rdfs:label "Signal Handler Use of a Non-reentrant Function" ; + d3f:cwe-id "CWE-479" ; + rdfs:subClassOf d3f:CWE-663, + d3f:CWE-828 . + +d3f:CWE-48 a owl:Class ; + rdfs:label "Path Equivalence: 'file name' (Internal Whitespace)" ; + d3f:cwe-id "CWE-48" ; + rdfs:subClassOf d3f:CWE-41 . + +d3f:CWE-481 a owl:Class ; + rdfs:label "Assigning instead of Comparing" ; + d3f:cwe-id "CWE-481" ; + rdfs:subClassOf d3f:CWE-480 . + +d3f:CWE-482 a owl:Class ; + rdfs:label "Comparing instead of Assigning" ; + d3f:cwe-id "CWE-482" ; + rdfs:subClassOf d3f:CWE-480 . + +d3f:CWE-483 a owl:Class ; + rdfs:label "Incorrect Block Delimitation" ; + d3f:cwe-id "CWE-483" ; + rdfs:subClassOf d3f:CWE-670 . + +d3f:CWE-484 a owl:Class ; + rdfs:label "Omitted Break Statement in Switch" ; + d3f:cwe-id "CWE-484" ; + rdfs:subClassOf d3f:CWE-670, + d3f:CWE-710 . + +d3f:CWE-486 a owl:Class ; + rdfs:label "Comparison of Classes by Name" ; + d3f:cwe-id "CWE-486" ; + rdfs:subClassOf d3f:CWE-1025 . + +d3f:CWE-487 a owl:Class ; + rdfs:label "Reliance on Package-level Scope" ; + d3f:cwe-id "CWE-487" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-488 a owl:Class ; + rdfs:label "Exposure of Data Element to Wrong Session" ; + d3f:cwe-id "CWE-488" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-49 a owl:Class ; + rdfs:label "Path Equivalence: 'filename/' (Trailing Slash)" ; + d3f:cwe-id "CWE-49" ; + rdfs:subClassOf d3f:CWE-162, + d3f:CWE-41 . + +d3f:CWE-491 a owl:Class ; + rdfs:label "Public cloneable() Method Without Final ('Object Hijack')" ; + d3f:cwe-id "CWE-491" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-492 a owl:Class ; + rdfs:label "Use of Inner Class Containing Sensitive Data" ; + d3f:cwe-id "CWE-492" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-494 a owl:Class ; + rdfs:label "Download of Code Without Integrity Check" ; + d3f:cwe-id "CWE-494" ; + rdfs:subClassOf d3f:CWE-345, + d3f:CWE-669 . + +d3f:CWE-495 a owl:Class ; + rdfs:label "Private Data Structure Returned From A Public Method" ; + d3f:cwe-id "CWE-495" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-496 a owl:Class ; + rdfs:label "Public Data Assigned to Private Array-Typed Field" ; + d3f:cwe-id "CWE-496" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-498 a owl:Class ; + rdfs:label "Cloneable Class Containing Sensitive Information" ; + d3f:cwe-id "CWE-498" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-499 a owl:Class ; + rdfs:label "Serializable Class Containing Sensitive Data" ; + d3f:cwe-id "CWE-499" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-5 a owl:Class ; + rdfs:label "J2EE Misconfiguration: Data Transmission Without Encryption" ; + d3f:cwe-id "CWE-5" ; + rdfs:subClassOf d3f:CWE-319 . + +d3f:CWE-50 a owl:Class ; + rdfs:label "Path Equivalence: '//multiple/leading/slash'" ; + d3f:cwe-id "CWE-50" ; + rdfs:subClassOf d3f:CWE-161, + d3f:CWE-41 . + +d3f:CWE-500 a owl:Class ; + rdfs:label "Public Static Field Not Marked Final" ; + d3f:cwe-id "CWE-500" ; + rdfs:subClassOf d3f:CWE-493 . + +d3f:CWE-501 a owl:Class ; + rdfs:label "Trust Boundary Violation" ; + d3f:cwe-id "CWE-501" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-502 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Deserialization of Untrusted Data" ; + d3f:cwe-id "CWE-502" ; + d3f:may-be-weakness-of d3f:UserInputFunction ; + d3f:weakness-of d3f:DeserializationFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-be-weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:DeserializationFunction ], + d3f:CWE-913 . + +d3f:CWE-508 a owl:Class ; + rdfs:label "Non-Replicating Malicious Code" ; + d3f:cwe-id "CWE-508" ; + rdfs:subClassOf d3f:CWE-507 . + +d3f:CWE-509 a owl:Class ; + rdfs:label "Replicating Malicious Code (Virus or Worm)" ; + d3f:cwe-id "CWE-509" ; + rdfs:subClassOf d3f:CWE-507 . + +d3f:CWE-51 a owl:Class ; + rdfs:label "Path Equivalence: '/multiple//internal/slash'" ; + d3f:cwe-id "CWE-51" ; + rdfs:subClassOf d3f:CWE-41 . + +d3f:CWE-510 a owl:Class ; + rdfs:label "Trapdoor" ; + d3f:cwe-id "CWE-510" ; + rdfs:subClassOf d3f:CWE-506 . + +d3f:CWE-511 a owl:Class ; + rdfs:label "Logic/Time Bomb" ; + d3f:cwe-id "CWE-511" ; + rdfs:subClassOf d3f:CWE-506 . + +d3f:CWE-512 a owl:Class ; + rdfs:label "Spyware" ; + d3f:cwe-id "CWE-512" ; + rdfs:subClassOf d3f:CWE-506 . + +d3f:CWE-515 a owl:Class ; + rdfs:label "Covert Storage Channel" ; + d3f:cwe-id "CWE-515" ; + rdfs:subClassOf d3f:CWE-514 . + +d3f:CWE-52 a owl:Class ; + rdfs:label "Path Equivalence: '/multiple/trailing/slash//'" ; + d3f:cwe-id "CWE-52" ; + rdfs:subClassOf d3f:CWE-163, + d3f:CWE-41 . + +d3f:CWE-520 a owl:Class ; + rdfs:label ".NET Misconfiguration: Use of Impersonation" ; + d3f:cwe-id "CWE-520" ; + rdfs:subClassOf d3f:CWE-266 . + +d3f:CWE-523 a owl:Class ; + rdfs:label "Unprotected Transport of Credentials" ; + d3f:cwe-id "CWE-523" ; + rdfs:subClassOf d3f:CWE-522 . + +d3f:CWE-525 a owl:Class ; + rdfs:label "Use of Web Browser Cache Containing Sensitive Information" ; + d3f:cwe-id "CWE-525" ; + rdfs:subClassOf d3f:CWE-524 . + +d3f:CWE-526 a owl:Class ; + rdfs:label "Cleartext Storage of Sensitive Information in an Environment Variable" ; + d3f:cwe-id "CWE-526" ; + rdfs:subClassOf d3f:CWE-312 . + +d3f:CWE-527 a owl:Class ; + rdfs:label "Exposure of Version-Control Repository to an Unauthorized Control Sphere" ; + d3f:cwe-id "CWE-527" ; + rdfs:subClassOf d3f:CWE-552 . + +d3f:CWE-528 a owl:Class ; + rdfs:label "Exposure of Core Dump File to an Unauthorized Control Sphere" ; + d3f:cwe-id "CWE-528" ; + rdfs:subClassOf d3f:CWE-552 . + +d3f:CWE-529 a owl:Class ; + rdfs:label "Exposure of Access Control List Files to an Unauthorized Control Sphere" ; + d3f:cwe-id "CWE-529" ; + rdfs:subClassOf d3f:CWE-552 . + +d3f:CWE-53 a owl:Class ; + rdfs:label "Path Equivalence: '\\multiple\\\\internal\\backslash'" ; + d3f:cwe-id "CWE-53" ; + rdfs:subClassOf d3f:CWE-165, + d3f:CWE-41 . + +d3f:CWE-530 a owl:Class ; + rdfs:label "Exposure of Backup File to an Unauthorized Control Sphere" ; + d3f:cwe-id "CWE-530" ; + rdfs:subClassOf d3f:CWE-552 . + +d3f:CWE-531 a owl:Class ; + rdfs:label "Inclusion of Sensitive Information in Test Code" ; + d3f:cwe-id "CWE-531" ; + rdfs:subClassOf d3f:CWE-540 . + +d3f:CWE-532 a owl:Class ; + rdfs:label "Insertion of Sensitive Information into Log File" ; + d3f:cwe-id "CWE-532" ; + rdfs:subClassOf d3f:CWE-538 . + +d3f:CWE-535 a owl:Class ; + rdfs:label "Exposure of Information Through Shell Error Message" ; + d3f:cwe-id "CWE-535" ; + rdfs:subClassOf d3f:CWE-211 . + +d3f:CWE-536 a owl:Class ; + rdfs:label "Servlet Runtime Error Message Containing Sensitive Information" ; + d3f:cwe-id "CWE-536" ; + rdfs:subClassOf d3f:CWE-211 . + +d3f:CWE-537 a owl:Class ; + rdfs:label "Java Runtime Error Message Containing Sensitive Information" ; + d3f:cwe-id "CWE-537" ; + rdfs:subClassOf d3f:CWE-211 . + +d3f:CWE-539 a owl:Class ; + rdfs:label "Use of Persistent Cookies Containing Sensitive Information" ; + d3f:cwe-id "CWE-539" ; + rdfs:subClassOf d3f:CWE-552 . + +d3f:CWE-54 a owl:Class ; + rdfs:label "Path Equivalence: 'filedir\\' (Trailing Backslash)" ; + d3f:cwe-id "CWE-54" ; + rdfs:subClassOf d3f:CWE-162, + d3f:CWE-41 . + +d3f:CWE-541 a owl:Class ; + rdfs:label "Inclusion of Sensitive Information in an Include File" ; + d3f:cwe-id "CWE-541" ; + rdfs:subClassOf d3f:CWE-540 . + +d3f:CWE-543 a owl:Class ; + rdfs:label "Use of Singleton Pattern Without Synchronization in a Multithreaded Context" ; + d3f:cwe-id "CWE-543" ; + rdfs:subClassOf d3f:CWE-820 . + +d3f:CWE-544 a owl:Class ; + rdfs:label "Missing Standardized Error Handling Mechanism" ; + d3f:cwe-id "CWE-544" ; + rdfs:subClassOf d3f:CWE-755 . + +d3f:CWE-546 a owl:Class ; + rdfs:label "Suspicious Comment" ; + d3f:cwe-id "CWE-546" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-547 a owl:Class ; + rdfs:label "Use of Hard-coded, Security-relevant Constants" ; + d3f:cwe-id "CWE-547" ; + rdfs:subClassOf d3f:CWE-1078 . + +d3f:CWE-548 a owl:Class ; + rdfs:label "Exposure of Information Through Directory Listing" ; + d3f:cwe-id "CWE-548" ; + rdfs:subClassOf d3f:CWE-497 . + +d3f:CWE-549 a owl:Class ; + rdfs:label "Missing Password Field Masking" ; + d3f:cwe-id "CWE-549" ; + rdfs:subClassOf d3f:CWE-522 . + +d3f:CWE-55 a owl:Class ; + rdfs:label "Path Equivalence: '/./' (Single Dot Directory)" ; + d3f:cwe-id "CWE-55" ; + rdfs:subClassOf d3f:CWE-41 . + +d3f:CWE-550 a owl:Class ; + rdfs:label "Server-generated Error Message Containing Sensitive Information" ; + d3f:cwe-id "CWE-550" ; + rdfs:subClassOf d3f:CWE-209 . + +d3f:CWE-551 a owl:Class ; + rdfs:label "Incorrect Behavior Order: Authorization Before Parsing and Canonicalization" ; + d3f:cwe-id "CWE-551" ; + rdfs:subClassOf d3f:CWE-696, + d3f:CWE-863 . + +d3f:CWE-553 a owl:Class ; + rdfs:label "Command Shell in Externally Accessible Directory" ; + d3f:cwe-id "CWE-553" ; + rdfs:subClassOf d3f:CWE-552 . + +d3f:CWE-554 a owl:Class ; + rdfs:label "ASP.NET Misconfiguration: Not Using Input Validation Framework" ; + d3f:cwe-id "CWE-554" ; + rdfs:subClassOf d3f:CWE-1173 . + +d3f:CWE-555 a owl:Class ; + rdfs:label "J2EE Misconfiguration: Plaintext Password in Configuration File" ; + d3f:cwe-id "CWE-555" ; + rdfs:subClassOf d3f:CWE-260 . + +d3f:CWE-556 a owl:Class ; + rdfs:label "ASP.NET Misconfiguration: Use of Identity Impersonation" ; + d3f:cwe-id "CWE-556" ; + rdfs:subClassOf d3f:CWE-266 . + +d3f:CWE-558 a owl:Class ; + rdfs:label "Use of getlogin() in Multithreaded Application" ; + d3f:cwe-id "CWE-558" ; + rdfs:subClassOf d3f:CWE-663 . + +d3f:CWE-56 a owl:Class ; + rdfs:label "Path Equivalence: 'filedir*' (Wildcard)" ; + d3f:cwe-id "CWE-56" ; + rdfs:subClassOf d3f:CWE-155, + d3f:CWE-41 . + +d3f:CWE-560 a owl:Class ; + rdfs:label "Use of umask() with chmod-style Argument" ; + d3f:cwe-id "CWE-560" ; + rdfs:subClassOf d3f:CWE-687 . + +d3f:CWE-561 a owl:Class ; + rdfs:label "Dead Code" ; + d3f:cwe-id "CWE-561" ; + rdfs:subClassOf d3f:CWE-1164 . + +d3f:CWE-562 a owl:Class ; + rdfs:label "Return of Stack Variable Address" ; + d3f:cwe-id "CWE-562" ; + rdfs:subClassOf d3f:CWE-758 . + +d3f:CWE-563 a owl:Class ; + rdfs:label "Assignment to Variable without Use" ; + d3f:cwe-id "CWE-563" ; + rdfs:subClassOf d3f:CWE-1164 . + +d3f:CWE-564 a owl:Class ; + rdfs:label "SQL Injection: Hibernate" ; + d3f:cwe-id "CWE-564" ; + rdfs:subClassOf d3f:CWE-89 . + +d3f:CWE-566 a owl:Class ; + rdfs:label "Authorization Bypass Through User-Controlled SQL Primary Key" ; + d3f:cwe-id "CWE-566" ; + rdfs:subClassOf d3f:CWE-639 . + +d3f:CWE-567 a owl:Class ; + rdfs:label "Unsynchronized Access to Shared Data in a Multithreaded Context" ; + d3f:cwe-id "CWE-567" ; + rdfs:subClassOf d3f:CWE-820 . + +d3f:CWE-568 a owl:Class ; + rdfs:label "finalize() Method Without super.finalize()" ; + d3f:cwe-id "CWE-568" ; + rdfs:subClassOf d3f:CWE-459, + d3f:CWE-573 . + +d3f:CWE-57 a owl:Class ; + rdfs:label "Path Equivalence: 'fakedir/../realdir/filename'" ; + d3f:cwe-id "CWE-57" ; + rdfs:subClassOf d3f:CWE-41 . + +d3f:CWE-570 a owl:Class ; + rdfs:label "Expression is Always False" ; + d3f:cwe-id "CWE-570" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-571 a owl:Class ; + rdfs:label "Expression is Always True" ; + d3f:cwe-id "CWE-571" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-572 a owl:Class ; + rdfs:label "Call to Thread run() instead of start()" ; + d3f:cwe-id "CWE-572" ; + rdfs:subClassOf d3f:CWE-821 . + +d3f:CWE-574 a owl:Class ; + rdfs:label "EJB Bad Practices: Use of Synchronization Primitives" ; + d3f:cwe-id "CWE-574" ; + rdfs:subClassOf d3f:CWE-695, + d3f:CWE-821 . + +d3f:CWE-575 a owl:Class ; + rdfs:label "EJB Bad Practices: Use of AWT Swing" ; + d3f:cwe-id "CWE-575" ; + rdfs:subClassOf d3f:CWE-695 . + +d3f:CWE-576 a owl:Class ; + rdfs:label "EJB Bad Practices: Use of Java I/O" ; + d3f:cwe-id "CWE-576" ; + rdfs:subClassOf d3f:CWE-695 . + +d3f:CWE-577 a owl:Class ; + rdfs:label "EJB Bad Practices: Use of Sockets" ; + d3f:cwe-id "CWE-577" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-578 a owl:Class ; + rdfs:label "EJB Bad Practices: Use of Class Loader" ; + d3f:cwe-id "CWE-578" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-579 a owl:Class ; + rdfs:label "J2EE Bad Practices: Non-serializable Object Stored in Session" ; + d3f:cwe-id "CWE-579" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-58 a owl:Class ; + rdfs:label "Path Equivalence: Windows 8.3 Filename" ; + d3f:cwe-id "CWE-58" ; + rdfs:subClassOf d3f:CWE-41 . + +d3f:CWE-580 a owl:Class ; + rdfs:label "clone() Method Without super.clone()" ; + d3f:cwe-id "CWE-580" ; + rdfs:subClassOf d3f:CWE-573, + d3f:CWE-664 . + +d3f:CWE-581 a owl:Class ; + rdfs:label "Object Model Violation: Just One of Equals and Hashcode Defined" ; + d3f:cwe-id "CWE-581" ; + rdfs:subClassOf d3f:CWE-573, + d3f:CWE-697 . + +d3f:CWE-582 a owl:Class ; + rdfs:label "Array Declared Public, Final, and Static" ; + d3f:cwe-id "CWE-582" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-583 a owl:Class ; + rdfs:label "finalize() Method Declared Public" ; + d3f:cwe-id "CWE-583" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-584 a owl:Class ; + rdfs:label "Return Inside Finally Block" ; + d3f:cwe-id "CWE-584" ; + rdfs:subClassOf d3f:CWE-705 . + +d3f:CWE-585 a owl:Class ; + rdfs:label "Empty Synchronized Block" ; + d3f:cwe-id "CWE-585" ; + rdfs:subClassOf d3f:CWE-1071 . + +d3f:CWE-586 a owl:Class ; + rdfs:label "Explicit Call to Finalize()" ; + d3f:cwe-id "CWE-586" ; + rdfs:subClassOf d3f:CWE-1076 . + +d3f:CWE-587 a owl:Class ; + rdfs:label "Assignment of a Fixed Address to a Pointer" ; + d3f:cwe-id "CWE-587" ; + rdfs:subClassOf d3f:CWE-344, + d3f:CWE-758 . + +d3f:CWE-588 a owl:Class ; + rdfs:label "Attempt to Access Child of a Non-structure Pointer" ; + d3f:cwe-id "CWE-588" ; + rdfs:subClassOf d3f:CWE-704, + d3f:CWE-758 . + +d3f:CWE-589 a owl:Class ; + rdfs:label "Call to Non-ubiquitous API" ; + d3f:cwe-id "CWE-589" ; + rdfs:subClassOf d3f:CWE-474 . + +d3f:CWE-590 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Free of Memory not on the Heap" ; + d3f:cwe-id "CWE-590" ; + d3f:weakness-of d3f:MemoryFreeFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:MemoryFreeFunction ], + d3f:CWE-762 . + +d3f:CWE-591 a owl:Class ; + rdfs:label "Sensitive Data Storage in Improperly Locked Memory" ; + d3f:cwe-id "CWE-591" ; + rdfs:subClassOf d3f:CWE-413 . + +d3f:CWE-593 a owl:Class ; + rdfs:label "Authentication Bypass: OpenSSL CTX Object Modified after SSL Objects are Created" ; + d3f:cwe-id "CWE-593" ; + rdfs:subClassOf d3f:CWE-1390, + d3f:CWE-666 . + +d3f:CWE-594 a owl:Class ; + rdfs:label "J2EE Framework: Saving Unserializable Objects to Disk" ; + d3f:cwe-id "CWE-594" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-597 a owl:Class ; + rdfs:label "Use of Wrong Operator in String Comparison" ; + d3f:cwe-id "CWE-597" ; + rdfs:subClassOf d3f:CWE-480, + d3f:CWE-595 . + +d3f:CWE-598 a owl:Class ; + rdfs:label "Use of GET Request Method With Sensitive Query Strings" ; + d3f:cwe-id "CWE-598" ; + rdfs:subClassOf d3f:CWE-201 . + +d3f:CWE-599 a owl:Class ; + rdfs:label "Missing Validation of OpenSSL Certificate" ; + d3f:cwe-id "CWE-599" ; + rdfs:subClassOf d3f:CWE-295 . + +d3f:CWE-6 a owl:Class ; + rdfs:label "J2EE Misconfiguration: Insufficient Session-ID Length" ; + d3f:cwe-id "CWE-6" ; + rdfs:subClassOf d3f:CWE-334 . + +d3f:CWE-600 a owl:Class ; + rdfs:label "Uncaught Exception in Servlet" ; + d3f:cwe-id "CWE-600" ; + rdfs:subClassOf d3f:CWE-248 . + +d3f:CWE-601 a owl:Class ; + rdfs:label "URL Redirection to Untrusted Site ('Open Redirect')" ; + d3f:cwe-id "CWE-601" ; + rdfs:subClassOf d3f:CWE-610 . + +d3f:CWE-603 a owl:Class ; + rdfs:label "Use of Client-Side Authentication" ; + d3f:cwe-id "CWE-603" ; + rdfs:subClassOf d3f:CWE-1390, + d3f:CWE-602 . + +d3f:CWE-605 a owl:Class ; + rdfs:label "Multiple Binds to the Same Port" ; + d3f:cwe-id "CWE-605" ; + rdfs:subClassOf d3f:CWE-666, + d3f:CWE-675 . + +d3f:CWE-606 a owl:Class ; + rdfs:label "Unchecked Input for Loop Condition" ; + d3f:cwe-id "CWE-606" ; + rdfs:subClassOf d3f:CWE-1284 . + +d3f:CWE-607 a owl:Class ; + rdfs:label "Public Static Final Field References Mutable Object" ; + d3f:cwe-id "CWE-607" ; + rdfs:subClassOf d3f:CWE-471 . + +d3f:CWE-608 a owl:Class ; + rdfs:label "Struts: Non-private Field in ActionForm Class" ; + d3f:cwe-id "CWE-608" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-609 a owl:Class ; + rdfs:label "Double-Checked Locking" ; + d3f:cwe-id "CWE-609" ; + rdfs:subClassOf d3f:CWE-667 . + +d3f:CWE-61 a owl:Class ; + rdfs:label "UNIX Symbolic Link (Symlink) Following" ; + d3f:cwe-id "CWE-61" ; + rdfs:subClassOf d3f:CWE-59 . + +d3f:CWE-611 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Restriction of XML External Entity Reference" ; + d3f:cwe-id "CWE-611" ; + d3f:weakness-of d3f:ExternalContentInclusionFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:ExternalContentInclusionFunction ], + d3f:CWE-610 . + +d3f:CWE-612 a owl:Class ; + rdfs:label "Improper Authorization of Index Containing Sensitive Information" ; + d3f:cwe-id "CWE-612" ; + rdfs:subClassOf d3f:CWE-1230 . + +d3f:CWE-613 a owl:Class ; + rdfs:label "Insufficient Session Expiration" ; + d3f:cwe-id "CWE-613" ; + rdfs:subClassOf d3f:CWE-672 . + +d3f:CWE-614 a owl:Class ; + rdfs:label "Sensitive Cookie in HTTPS Session Without 'Secure' Attribute" ; + d3f:cwe-id "CWE-614" ; + rdfs:subClassOf d3f:CWE-319 . + +d3f:CWE-615 a owl:Class ; + rdfs:label "Inclusion of Sensitive Information in Source Code Comments" ; + d3f:cwe-id "CWE-615" ; + rdfs:subClassOf d3f:CWE-540 . + +d3f:CWE-616 a owl:Class ; + rdfs:label "Incomplete Identification of Uploaded File Variables (PHP)" ; + d3f:cwe-id "CWE-616" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-617 a owl:Class ; + rdfs:label "Reachable Assertion" ; + d3f:cwe-id "CWE-617" ; + rdfs:subClassOf d3f:CWE-670 . + +d3f:CWE-618 a owl:Class ; + rdfs:label "Exposed Unsafe ActiveX Method" ; + d3f:cwe-id "CWE-618" ; + rdfs:subClassOf d3f:CWE-749 . + +d3f:CWE-619 a owl:Class ; + rdfs:label "Dangling Database Cursor ('Cursor Injection')" ; + d3f:cwe-id "CWE-619" ; + rdfs:subClassOf d3f:CWE-402 . + +d3f:CWE-62 a owl:Class ; + rdfs:label "UNIX Hard Link" ; + d3f:cwe-id "CWE-62" ; + rdfs:subClassOf d3f:CWE-59 . + +d3f:CWE-620 a owl:Class ; + rdfs:label "Unverified Password Change" ; + d3f:cwe-id "CWE-620" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-621 a owl:Class ; + rdfs:label "Variable Extraction Error" ; + d3f:cwe-id "CWE-621" ; + rdfs:subClassOf d3f:CWE-914 . + +d3f:CWE-622 a owl:Class ; + rdfs:label "Improper Validation of Function Hook Arguments" ; + d3f:cwe-id "CWE-622" ; + rdfs:subClassOf d3f:CWE-20 . + +d3f:CWE-623 a owl:Class ; + rdfs:label "Unsafe ActiveX Control Marked Safe For Scripting" ; + d3f:cwe-id "CWE-623" ; + rdfs:subClassOf d3f:CWE-267 . + +d3f:CWE-624 a owl:Class ; + rdfs:label "Executable Regular Expression Error" ; + d3f:cwe-id "CWE-624" ; + rdfs:subClassOf d3f:CWE-77 . + +d3f:CWE-626 a owl:Class ; + rdfs:label "Null Byte Interaction Error (Poison Null Byte)" ; + d3f:cwe-id "CWE-626" ; + rdfs:subClassOf d3f:CWE-147, + d3f:CWE-436 . + +d3f:CWE-627 a owl:Class ; + rdfs:label "Dynamic Variable Evaluation" ; + d3f:cwe-id "CWE-627" ; + rdfs:subClassOf d3f:CWE-914 . + +d3f:CWE-637 a owl:Class ; + rdfs:label "Unnecessary Complexity in Protection Mechanism (Not Using 'Economy of Mechanism')" ; + d3f:cwe-id "CWE-637" ; + rdfs:subClassOf d3f:CWE-657 . + +d3f:CWE-64 a owl:Class ; + rdfs:label "Windows Shortcut Following (.LNK)" ; + d3f:cwe-id "CWE-64" ; + rdfs:subClassOf d3f:CWE-59 . + +d3f:CWE-640 a owl:Class ; + rdfs:label "Weak Password Recovery Mechanism for Forgotten Password" ; + d3f:cwe-id "CWE-640" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-641 a owl:Class ; + rdfs:label "Improper Restriction of Names for Files and Other Resources" ; + d3f:cwe-id "CWE-641" ; + rdfs:subClassOf d3f:CWE-99 . + +d3f:CWE-643 a owl:Class ; + rdfs:label "Improper Neutralization of Data within XPath Expressions ('XPath Injection')" ; + d3f:cwe-id "CWE-643" ; + rdfs:subClassOf d3f:CWE-91, + d3f:CWE-943 . + +d3f:CWE-644 a owl:Class ; + rdfs:label "Improper Neutralization of HTTP Headers for Scripting Syntax" ; + d3f:cwe-id "CWE-644" ; + rdfs:subClassOf d3f:CWE-116 . + +d3f:CWE-645 a owl:Class ; + rdfs:label "Overly Restrictive Account Lockout Mechanism" ; + d3f:cwe-id "CWE-645" ; + rdfs:subClassOf d3f:CWE-287 . + +d3f:CWE-646 a owl:Class ; + rdfs:label "Reliance on File Name or Extension of Externally-Supplied File" ; + d3f:cwe-id "CWE-646" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-647 a owl:Class ; + rdfs:label "Use of Non-Canonical URL Paths for Authorization Decisions" ; + d3f:cwe-id "CWE-647" ; + rdfs:subClassOf d3f:CWE-863 . + +d3f:CWE-648 a owl:Class ; + rdfs:label "Incorrect Use of Privileged APIs" ; + d3f:cwe-id "CWE-648" ; + rdfs:subClassOf d3f:CWE-269 . + +d3f:CWE-649 a owl:Class ; + rdfs:label "Reliance on Obfuscation or Encryption of Security-Relevant Inputs without Integrity Checking" ; + d3f:cwe-id "CWE-649" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-65 a owl:Class ; + rdfs:label "Windows Hard Link" ; + d3f:cwe-id "CWE-65" ; + rdfs:subClassOf d3f:CWE-59 . + +d3f:CWE-650 a owl:Class ; + rdfs:label "Trusting HTTP Permission Methods on the Server Side" ; + d3f:cwe-id "CWE-650" ; + rdfs:subClassOf d3f:CWE-436 . + +d3f:CWE-651 a owl:Class ; + rdfs:label "Exposure of WSDL File Containing Sensitive Information" ; + d3f:cwe-id "CWE-651" ; + rdfs:subClassOf d3f:CWE-538 . + +d3f:CWE-652 a owl:Class ; + rdfs:label "Improper Neutralization of Data within XQuery Expressions ('XQuery Injection')" ; + d3f:cwe-id "CWE-652" ; + rdfs:subClassOf d3f:CWE-91, + d3f:CWE-943 . + +d3f:CWE-655 a owl:Class ; + rdfs:label "Insufficient Psychological Acceptability" ; + d3f:cwe-id "CWE-655" ; + rdfs:subClassOf d3f:CWE-657, + d3f:CWE-693 . + +d3f:CWE-656 a owl:Class ; + rdfs:label "Reliance on Security Through Obscurity" ; + d3f:cwe-id "CWE-656" ; + rdfs:subClassOf d3f:CWE-657, + d3f:CWE-693 . + +d3f:CWE-67 a owl:Class ; + rdfs:label "Improper Handling of Windows Device Names" ; + d3f:cwe-id "CWE-67" ; + rdfs:subClassOf d3f:CWE-66 . + +d3f:CWE-680 a owl:Class ; + rdfs:label "Integer Overflow to Buffer Overflow" ; + d3f:cwe-id "CWE-680" ; + rdfs:subClassOf d3f:CWE-119 . + +d3f:CWE-683 a owl:Class ; + rdfs:label "Function Call With Incorrect Order of Arguments" ; + d3f:cwe-id "CWE-683" ; + rdfs:subClassOf d3f:CWE-628 . + +d3f:CWE-685 a owl:Class ; + rdfs:label "Function Call With Incorrect Number of Arguments" ; + d3f:cwe-id "CWE-685" ; + rdfs:subClassOf d3f:CWE-628 . + +d3f:CWE-686 a owl:Class ; + rdfs:label "Function Call With Incorrect Argument Type" ; + d3f:cwe-id "CWE-686" ; + rdfs:subClassOf d3f:CWE-628 . + +d3f:CWE-688 a owl:Class ; + rdfs:label "Function Call With Incorrect Variable or Reference as Argument" ; + d3f:cwe-id "CWE-688" ; + rdfs:subClassOf d3f:CWE-628 . + +d3f:CWE-689 a owl:Class ; + rdfs:label "Permission Race Condition During Resource Copy" ; + d3f:cwe-id "CWE-689" ; + rdfs:subClassOf d3f:CWE-362 . + +d3f:CWE-69 a owl:Class ; + rdfs:label "Improper Handling of Windows ::DATA Alternate Data Stream" ; + d3f:cwe-id "CWE-69" ; + rdfs:subClassOf d3f:CWE-66 . + +d3f:CWE-690 a owl:Class ; + rdfs:label "Unchecked Return Value to NULL Pointer Dereference" ; + d3f:cwe-id "CWE-690" ; + rdfs:subClassOf d3f:CWE-476 . + +d3f:CWE-692 a owl:Class ; + rdfs:label "Incomplete Denylist to Cross-Site Scripting" ; + d3f:cwe-id "CWE-692" ; + rdfs:subClassOf d3f:CWE-79 . + +d3f:CWE-698 a owl:Class ; + rdfs:label "Execution After Redirect (EAR)" ; + d3f:cwe-id "CWE-698" ; + rdfs:subClassOf d3f:CWE-670, + d3f:CWE-705 . + +d3f:CWE-7 a owl:Class ; + rdfs:label "J2EE Misconfiguration: Missing Custom Error Page" ; + d3f:cwe-id "CWE-7" ; + rdfs:subClassOf d3f:CWE-756 . + +d3f:CWE-708 a owl:Class ; + rdfs:label "Incorrect Ownership Assignment" ; + d3f:cwe-id "CWE-708" ; + rdfs:subClassOf d3f:CWE-282 . + +d3f:CWE-72 a owl:Class ; + rdfs:label "Improper Handling of Apple HFS+ Alternate Data Stream Path" ; + d3f:cwe-id "CWE-72" ; + rdfs:subClassOf d3f:CWE-66 . + +d3f:CWE-757 a owl:Class ; + rdfs:label "Selection of Less-Secure Algorithm During Negotiation ('Algorithm Downgrade')" ; + d3f:cwe-id "CWE-757" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-759 a owl:Class ; + rdfs:label "Use of a One-Way Hash without a Salt" ; + d3f:cwe-id "CWE-759" ; + rdfs:subClassOf d3f:CWE-916 . + +d3f:CWE-76 a owl:Class ; + rdfs:label "Improper Neutralization of Equivalent Special Elements" ; + d3f:cwe-id "CWE-76" ; + rdfs:subClassOf d3f:CWE-75 . + +d3f:CWE-760 a owl:Class ; + rdfs:label "Use of a One-Way Hash with a Predictable Salt" ; + d3f:cwe-id "CWE-760" ; + rdfs:subClassOf d3f:CWE-916 . + +d3f:CWE-761 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Free of Pointer not at Start of Buffer" ; + d3f:cwe-id "CWE-761" ; + d3f:weakness-of d3f:MemoryFreeFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:MemoryFreeFunction ], + d3f:CWE-763 . + +d3f:CWE-764 a owl:Class ; + rdfs:label "Multiple Locks of a Critical Resource" ; + d3f:cwe-id "CWE-764" ; + rdfs:subClassOf d3f:CWE-667, + d3f:CWE-675 . + +d3f:CWE-765 a owl:Class ; + rdfs:label "Multiple Unlocks of a Critical Resource" ; + d3f:cwe-id "CWE-765" ; + rdfs:subClassOf d3f:CWE-667, + d3f:CWE-675 . + +d3f:CWE-766 a owl:Class ; + rdfs:label "Critical Data Element Declared Public" ; + d3f:cwe-id "CWE-766" ; + rdfs:subClassOf d3f:CWE-1061 . + +d3f:CWE-767 a owl:Class ; + rdfs:label "Access to Critical Private Variable via Public Method" ; + d3f:cwe-id "CWE-767" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-768 a owl:Class ; + rdfs:label "Incorrect Short Circuit Evaluation" ; + d3f:cwe-id "CWE-768" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-773 a owl:Class ; + rdfs:label "Missing Reference to Active File Descriptor or Handle" ; + d3f:cwe-id "CWE-773" ; + rdfs:subClassOf d3f:CWE-771 . + +d3f:CWE-774 a owl:Class ; + rdfs:label "Allocation of File Descriptors or Handles Without Limits or Throttling" ; + d3f:cwe-id "CWE-774" ; + rdfs:subClassOf d3f:CWE-770 . + +d3f:CWE-775 a owl:Class ; + rdfs:label "Missing Release of File Descriptor or Handle after Effective Lifetime" ; + d3f:cwe-id "CWE-775" ; + rdfs:subClassOf d3f:CWE-772 . + +d3f:CWE-776 a owl:Class ; + rdfs:label "Improper Restriction of Recursive Entity References in DTDs ('XML Entity Expansion')" ; + d3f:cwe-id "CWE-776" ; + rdfs:subClassOf d3f:CWE-405, + d3f:CWE-674 . + +d3f:CWE-777 a owl:Class ; + rdfs:label "Regular Expression without Anchors" ; + d3f:cwe-id "CWE-777" ; + rdfs:subClassOf d3f:CWE-625 . + +d3f:CWE-778 a owl:Class ; + rdfs:label "Insufficient Logging" ; + d3f:cwe-id "CWE-778" ; + rdfs:subClassOf d3f:CWE-223, + d3f:CWE-693 . + +d3f:CWE-779 a owl:Class ; + rdfs:label "Logging of Excessive Data" ; + d3f:cwe-id "CWE-779" ; + rdfs:subClassOf d3f:CWE-400 . + +d3f:CWE-78 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')" ; + d3f:cwe-id "CWE-78" ; + d3f:may-be-weakness-of d3f:EvalFunction, + d3f:ProcessStartFunction, + d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-be-weakness-of ; + owl:someValuesFrom d3f:ProcessStartFunction ], + [ a owl:Restriction ; + owl:onProperty d3f:may-be-weakness-of ; + owl:someValuesFrom d3f:EvalFunction ], + [ a owl:Restriction ; + owl:onProperty d3f:may-be-weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-77 . + +d3f:CWE-780 a owl:Class ; + rdfs:label "Use of RSA Algorithm without OAEP" ; + d3f:cwe-id "CWE-780" ; + rdfs:subClassOf d3f:CWE-327 . + +d3f:CWE-781 a owl:Class ; + rdfs:label "Improper Address Validation in IOCTL with METHOD_NEITHER I/O Control Code" ; + d3f:cwe-id "CWE-781" ; + rdfs:subClassOf d3f:CWE-1285 . + +d3f:CWE-782 a owl:Class ; + rdfs:label "Exposed IOCTL with Insufficient Access Control" ; + d3f:cwe-id "CWE-782" ; + rdfs:subClassOf d3f:CWE-749 . + +d3f:CWE-783 a owl:Class ; + rdfs:label "Operator Precedence Logic Error" ; + d3f:cwe-id "CWE-783" ; + rdfs:subClassOf d3f:CWE-670 . + +d3f:CWE-784 a owl:Class ; + rdfs:label "Reliance on Cookies without Validation and Integrity Checking in a Security Decision" ; + d3f:cwe-id "CWE-784" ; + rdfs:subClassOf d3f:CWE-565, + d3f:CWE-807 . + +d3f:CWE-785 a owl:Class ; + rdfs:label "Use of Path Manipulation Function without Maximum-sized Buffer" ; + d3f:cwe-id "CWE-785" ; + rdfs:subClassOf d3f:CWE-120, + d3f:CWE-676 . + +d3f:CWE-789 a owl:Class ; + rdfs:label "Memory Allocation with Excessive Size Value" ; + d3f:cwe-id "CWE-789" ; + rdfs:subClassOf d3f:CWE-1284, + d3f:CWE-770 . + +d3f:CWE-793 a owl:Class ; + rdfs:label "Only Filtering One Instance of a Special Element" ; + d3f:cwe-id "CWE-793" ; + rdfs:subClassOf d3f:CWE-792 . + +d3f:CWE-794 a owl:Class ; + rdfs:label "Incomplete Filtering of Multiple Instances of Special Elements" ; + d3f:cwe-id "CWE-794" ; + rdfs:subClassOf d3f:CWE-792 . + +d3f:CWE-796 a owl:Class ; + rdfs:label "Only Filtering Special Elements Relative to a Marker" ; + d3f:cwe-id "CWE-796" ; + rdfs:subClassOf d3f:CWE-795 . + +d3f:CWE-797 a owl:Class ; + rdfs:label "Only Filtering Special Elements at an Absolute Position" ; + d3f:cwe-id "CWE-797" ; + rdfs:subClassOf d3f:CWE-795 . + +d3f:CWE-8 a owl:Class ; + rdfs:label "J2EE Misconfiguration: Entity Bean Declared Remote" ; + d3f:cwe-id "CWE-8" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-80 a owl:Class ; + rdfs:label "Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS)" ; + d3f:cwe-id "CWE-80" ; + rdfs:subClassOf d3f:CWE-79 . + +d3f:CWE-804 a owl:Class ; + rdfs:label "Guessable CAPTCHA" ; + d3f:cwe-id "CWE-804" ; + rdfs:subClassOf d3f:CWE-1390, + d3f:CWE-863 . + +d3f:CWE-806 a owl:Class ; + rdfs:label "Buffer Access Using Size of Source Buffer" ; + d3f:cwe-id "CWE-806" ; + rdfs:subClassOf d3f:CWE-805 . + +d3f:CWE-81 a owl:Class ; + rdfs:label "Improper Neutralization of Script in an Error Message Web Page" ; + d3f:cwe-id "CWE-81" ; + rdfs:subClassOf d3f:CWE-79 . + +d3f:CWE-82 a owl:Class ; + rdfs:label "Improper Neutralization of Script in Attributes of IMG Tags in a Web Page" ; + d3f:cwe-id "CWE-82" ; + rdfs:subClassOf d3f:CWE-83 . + +d3f:CWE-822 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Untrusted Pointer Dereference" ; + d3f:cwe-id "CWE-822" ; + d3f:weakness-of d3f:PointerDereferencingFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:PointerDereferencingFunction ], + d3f:CWE-119 . + +d3f:CWE-823 a owl:Class ; + rdfs:label "Use of Out-of-range Pointer Offset" ; + d3f:cwe-id "CWE-823" ; + rdfs:subClassOf d3f:CWE-119 . + +d3f:CWE-824 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Access of Uninitialized Pointer" ; + d3f:cwe-id "CWE-824" ; + d3f:weakness-of d3f:PointerDereferencingFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:PointerDereferencingFunction ], + d3f:CWE-119 . + +d3f:CWE-826 a owl:Class ; + rdfs:label "Premature Release of Resource During Expected Lifetime" ; + d3f:cwe-id "CWE-826" ; + rdfs:subClassOf d3f:CWE-666 . + +d3f:CWE-827 a owl:Class ; + rdfs:label "Improper Control of Document Type Definition" ; + d3f:cwe-id "CWE-827" ; + rdfs:subClassOf d3f:CWE-706, + d3f:CWE-829 . + +d3f:CWE-830 a owl:Class ; + rdfs:label "Inclusion of Web Functionality from an Untrusted Source" ; + d3f:cwe-id "CWE-830" ; + rdfs:subClassOf d3f:CWE-829 . + +d3f:CWE-831 a owl:Class ; + rdfs:label "Signal Handler Function Associated with Multiple Signals" ; + d3f:cwe-id "CWE-831" ; + rdfs:subClassOf d3f:CWE-364 . + +d3f:CWE-832 a owl:Class ; + rdfs:label "Unlock of a Resource that is not Locked" ; + d3f:cwe-id "CWE-832" ; + rdfs:subClassOf d3f:CWE-667 . + +d3f:CWE-833 a owl:Class ; + rdfs:label "Deadlock" ; + d3f:cwe-id "CWE-833" ; + rdfs:subClassOf d3f:CWE-667 . + +d3f:CWE-835 a owl:Class ; + rdfs:label "Loop with Unreachable Exit Condition ('Infinite Loop')" ; + d3f:cwe-id "CWE-835" ; + rdfs:subClassOf d3f:CWE-834 . + +d3f:CWE-836 a owl:Class ; + rdfs:label "Use of Password Hash Instead of Password for Authentication" ; + d3f:cwe-id "CWE-836" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-837 a owl:Class ; + rdfs:label "Improper Enforcement of a Single, Unique Action" ; + d3f:cwe-id "CWE-837" ; + rdfs:subClassOf d3f:CWE-799 . + +d3f:CWE-838 a owl:Class ; + rdfs:label "Inappropriate Encoding for Output Context" ; + d3f:cwe-id "CWE-838" ; + rdfs:subClassOf d3f:CWE-116 . + +d3f:CWE-839 a owl:Class ; + rdfs:label "Numeric Range Comparison Without Minimum Check" ; + d3f:cwe-id "CWE-839" ; + rdfs:subClassOf d3f:CWE-1023 . + +d3f:CWE-84 a owl:Class ; + rdfs:label "Improper Neutralization of Encoded URI Schemes in a Web Page" ; + d3f:cwe-id "CWE-84" ; + rdfs:subClassOf d3f:CWE-79 . + +d3f:CWE-841 a owl:Class ; + rdfs:label "Improper Enforcement of Behavioral Workflow" ; + d3f:cwe-id "CWE-841" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-842 a owl:Class ; + rdfs:label "Placement of User into Incorrect Group" ; + d3f:cwe-id "CWE-842" ; + rdfs:subClassOf d3f:CWE-286 . + +d3f:CWE-843 a owl:Class ; + rdfs:label "Access of Resource Using Incompatible Type ('Type Confusion')" ; + d3f:cwe-id "CWE-843" ; + rdfs:subClassOf d3f:CWE-704 . + +d3f:CWE-85 a owl:Class ; + rdfs:label "Doubled Character XSS Manipulations" ; + d3f:cwe-id "CWE-85" ; + rdfs:subClassOf d3f:CWE-79 . + +d3f:CWE-86 a owl:Class ; + rdfs:label "Improper Neutralization of Invalid Characters in Identifiers in Web Pages" ; + d3f:cwe-id "CWE-86" ; + rdfs:subClassOf d3f:CWE-436, + d3f:CWE-79 . + +d3f:CWE-87 a owl:Class ; + rdfs:label "Improper Neutralization of Alternate XSS Syntax" ; + d3f:cwe-id "CWE-87" ; + rdfs:subClassOf d3f:CWE-79 . + +d3f:CWE-88 a owl:Class ; + rdfs:label "Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')" ; + d3f:cwe-id "CWE-88" ; + rdfs:subClassOf d3f:CWE-77 . + +d3f:CWE-9 a owl:Class ; + rdfs:label "J2EE Misconfiguration: Weak Access Permissions for EJB Methods" ; + d3f:cwe-id "CWE-9" ; + rdfs:subClassOf d3f:CWE-266 . + +d3f:CWE-90 a owl:Class ; + rdfs:label "Improper Neutralization of Special Elements used in an LDAP Query ('LDAP Injection')" ; + d3f:cwe-id "CWE-90" ; + rdfs:subClassOf d3f:CWE-943 . + +d3f:CWE-910 a owl:Class ; + rdfs:label "Use of Expired File Descriptor" ; + d3f:cwe-id "CWE-910" ; + rdfs:subClassOf d3f:CWE-672 . + +d3f:CWE-911 a owl:Class ; + rdfs:label "Improper Update of Reference Count" ; + d3f:cwe-id "CWE-911" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-917 a owl:Class ; + rdfs:label "Improper Neutralization of Special Elements used in an Expression Language Statement ('Expression Language Injection')" ; + d3f:cwe-id "CWE-917" ; + rdfs:subClassOf d3f:CWE-77 . + +d3f:CWE-918 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Server-Side Request Forgery (SSRF)" ; + d3f:cwe-id "CWE-918" ; + d3f:weakness-of d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-441 . + +d3f:CWE-920 a owl:Class ; + rdfs:label "Improper Restriction of Power Consumption" ; + d3f:cwe-id "CWE-920" ; + rdfs:subClassOf d3f:CWE-400 . + +d3f:CWE-921 a owl:Class ; + rdfs:label "Storage of Sensitive Data in a Mechanism without Access Control" ; + d3f:cwe-id "CWE-921" ; + rdfs:subClassOf d3f:CWE-922 . + +d3f:CWE-924 a owl:Class ; + rdfs:label "Improper Enforcement of Message Integrity During Transmission in a Communication Channel" ; + d3f:cwe-id "CWE-924" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-925 a owl:Class ; + rdfs:label "Improper Verification of Intent by Broadcast Receiver" ; + d3f:cwe-id "CWE-925" ; + rdfs:subClassOf d3f:CWE-940 . + +d3f:CWE-926 a owl:Class ; + rdfs:label "Improper Export of Android Application Components" ; + d3f:cwe-id "CWE-926" ; + rdfs:subClassOf d3f:CWE-285 . + +d3f:CWE-927 a owl:Class ; + rdfs:label "Use of Implicit Intent for Sensitive Communication" ; + d3f:cwe-id "CWE-927" ; + rdfs:subClassOf d3f:CWE-285, + d3f:CWE-668 . + +d3f:CWE-939 a owl:Class ; + rdfs:label "Improper Authorization in Handler for Custom URL Scheme" ; + d3f:cwe-id "CWE-939" ; + rdfs:subClassOf d3f:CWE-862 . + +d3f:CWE-941 a owl:Class ; + rdfs:label "Incorrectly Specified Destination in a Communication Channel" ; + d3f:cwe-id "CWE-941" ; + rdfs:subClassOf d3f:CWE-923 . + +d3f:CWE-942 a owl:Class ; + rdfs:label "Permissive Cross-domain Policy with Untrusted Domains" ; + d3f:cwe-id "CWE-942" ; + rdfs:subClassOf d3f:CWE-183, + d3f:CWE-923 . + +d3f:CWE-95 a owl:Class ; + rdfs:label "Improper Neutralization of Directives in Dynamically Evaluated Code ('Eval Injection')" ; + d3f:cwe-id "CWE-95" ; + rdfs:subClassOf d3f:CWE-94 . + +d3f:CWE-97 a owl:Class ; + rdfs:label "Improper Neutralization of Server-Side Includes (SSI) Within a Web Page" ; + d3f:cwe-id "CWE-97" ; + rdfs:subClassOf d3f:CWE-96 . + +d3f:CWE-98 a owl:Class ; + rdfs:label "Improper Control of Filename for Include/Require Statement in PHP Program ('PHP Remote File Inclusion')" ; + d3f:cwe-id "CWE-98" ; + rdfs:subClassOf d3f:CWE-706, + d3f:CWE-829 . + +d3f:CanopyClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Canopy Clustering" ; + d3f:d3fend-id "D3A-CC" ; + d3f:definition "The canopy clustering algorithm is an unsupervised pre-clustering algorithm often used as preprocessing step for the K-means algorithm or the Hierarchical clustering algorithm. It is intended to speed up clustering operations on large data sets." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Canopy clustering algorithm. [Link](https://en.wikipedia.org/wiki/Canopy_clustering_algorithm)""" ; + rdfs:subClassOf d3f:ClusterAnalysis . + +d3f:Capability a owl:Class ; + rdfs:label "Capability" ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ExternalThing . + +d3f:ChatroomClient a owl:Class ; + rdfs:label "Chatroom Client" ; + d3f:definition "Client software used to describe conduct any form of synchronous conferencing, occasionally even asynchronous conferencing. The term can thus mean any technology ranging from real-time online chat and online interaction with strangers (e.g., online forums) to fully immersive graphical social environments." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:CollaborativeSoftware ; + skos:altLabel "Chat Room Client" . + +d3f:ChildProcess a owl:Class ; + rdfs:label "Child Process" ; + d3f:definition "A child process in computing is a process created by another process (the parent process). This technique pertains to multitasking operating systems, and is sometimes called a subprocess or traditionally a subtask. There are two major procedures for creating a child process: the fork system call (preferred in Unix-like systems and the POSIX standard) and the spawn (preferred in the modern (NT) kernel of Microsoft Windows, as well as in some historical operating systems)." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Process . + +d3f:CloudServiceProvider a owl:Class ; + rdfs:label "Cloud Service Provider" ; + d3f:definition "A cloud service provider delivers scalable and distributed computing resources over a network, enabling clients to access infrastructure, platforms, and applications remotely." ; + rdfs:subClassOf d3f:ServiceProvider . + +d3f:CloudServiceSensor a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Service Sensor" ; + d3f:definition "Senses data from cloud service platforms. Including data from cloud service authentications, authorizations, and other activities." ; + d3f:monitors d3f:CloudServiceAuthentication, + d3f:CloudServiceAuthorization ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:CloudServiceAuthentication ], + [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:CloudServiceAuthorization ], + d3f:CyberSensor . + +d3f:ComputeDeviceEvent a owl:Class ; + rdfs:label "Compute Device Event" ; + d3f:definition "An event capturing the operation, state, or performance of computational hardware, such as CPUs, GPUs, or accelerators. These events reflect processing capacity changes, utilization anomalies, or device health." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Processor ], + d3f:HardwareDeviceEvent . + +d3f:ComputingServer a owl:Class ; + rdfs:label "Computing Server" ; + d3f:definition "A compute server is a system specifically designed to undertake large amounts of computation, usually but not necessarily in a client/server environment." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Server . + +d3f:ConfigurationManagementDatabase a owl:Class ; + rdfs:label "Configuration Management Database" ; + d3f:definition "A database used to store configuration records throughout their lifecycle. The Configuration Management System (CMS) maintains one or more CMDBs, and each CMDB stores attributes of configuration items (CIs), and relationships with other CIs." ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + , + ; + rdfs:subClassOf d3f:ConfigurationDatabase . + +d3f:ConsoleOutputFunction a owl:Class ; + rdfs:label "Console Output Function" ; + d3f:definition "Outputs characters to a computer console." ; + rdfs:subClassOf d3f:Subroutine . + +d3f:ContainerBuildTool a owl:Class ; + rdfs:label "Container Build Tool" ; + d3f:definition "A software build tool that creates a container (e.g., Docker container) for deployment." ; + rdfs:subClassOf d3f:SoftwarePackagingTool . + +d3f:ContainerProcess a owl:Class ; + rdfs:label "Container Process" ; + d3f:definition "A running instance of a d3f:ContainerImage" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ApplicationProcess . + +d3f:ContainerRuntime a owl:Class, + owl:NamedIndividual ; + rdfs:label "Container Runtime" ; + d3f:definition "A software layer between d3f:ContainerProcess and d3f:Kernel which often mediates the invocation of d3f:SystemCall" ; + d3f:runs d3f:ContainerImage ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:runs ; + owl:someValuesFrom d3f:ContainerImage ], + d3f:ServiceApplication . + +d3f:CopyMemoryFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Copy Memory Function" ; + d3f:copies d3f:MemoryBlock ; + d3f:definition "Copies a memory block from one location to another." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:copies ; + owl:someValuesFrom d3f:MemoryBlock ], + d3f:Subroutine . + +d3f:CramersV a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cramer's V" ; + d3f:d3fend-id "D3A-CV" ; + d3f:definition "Cramér's V (sometimes referred to as Cramér's phi and denoted as φc) is a measure of association between two nominal variables, giving a value between 0 and +1 (inclusive) and is based on Pearson's chi-squared statistic." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Cramér's V. [Link](https://en.wikipedia.org/wiki/Cram%C3%A9r%27s_V)""" ; + d3f:synonym "Cramer's Phi" ; + rdfs:subClassOf d3f:Correlation . + +d3f:CycleGAN a owl:Class, + owl:NamedIndividual ; + rdfs:label "CycleGAN" ; + d3f:d3fend-id "D3A-CYC" ; + d3f:definition "The Cycle Generative Adversarial Network (CycleGAN) is an approach to training a deep convolutional neural network for image-to-image translation tasks by mapping between input and output images using unpaired dataset." ; + d3f:kb-article """## References +Esri. (n.d.). How CycleGAN Works. [Link](https://developers.arcgis.com/python/guide/how-cyclegan-works/)""" ; + rdfs:subClassOf d3f:Image-to-ImageTranslationGAN . + +d3f:DBSCAN a owl:Class, + owl:NamedIndividual ; + rdfs:label "DBSCAN" ; + d3f:d3fend-id "D3A-DBS" ; + d3f:definition "A density-based clustering algorithm that works on the assumption that clusters are dense regions in space separated by regions of lower density." ; + d3f:kb-article """## References +Analytics Vidhya. (2020, September 15). How DBSCAN Clustering Works: A Comprehensive Guide with Implementations in Python. [Link](https://www.analyticsvidhya.com/blog/2020/09/how-dbscan-clustering-works/#:~:text=DBSCAN%20is%20a%20density%2Dbased,points%20into%20a%20single%20cluster.)""" ; + rdfs:subClassOf d3f:Density-basedClustering . + +d3f:DHCPAckEvent a owl:Class ; + rdfs:label "DHCP Ack Event" ; + d3f:definition "An event where a DHCP server sends an ACK message to acknowledge a client's REQUEST, confirming the allocation of an IP address and associated network settings." ; + rdfs:subClassOf d3f:DHCPEvent ; + skos:altLabel "DHCPACK" . + +d3f:DHCPDiscoverEvent a owl:Class ; + rdfs:label "DHCP Discover Event" ; + d3f:definition "An event where a DHCP client broadcasts a DISCOVER message to identify available DHCP servers capable of providing IP configuration." ; + rdfs:subClassOf d3f:DHCPEvent ; + skos:altLabel "DHCPDISCOVER" . + +d3f:DHCPInformEvent a owl:Class ; + rdfs:label "DHCP Inform Event" ; + d3f:definition "An event where a DHCP client sends an INFORM message to request configuration parameters, such as DNS or gateway information, without requiring IP address assignment." ; + rdfs:subClassOf d3f:DHCPEvent ; + skos:altLabel "DHCPINFORM" . + +d3f:DHCPLeaseExpireEvent a owl:Class ; + rdfs:label "DHCP Lease Expire Event" ; + d3f:definition "An event indicating that a DHCP lease has expired, rendering the previously assigned IP address available for reassignment to other devices." ; + rdfs:subClassOf d3f:DHCPEvent ; + skos:altLabel "DHCPLEASEEXPIRE" . + +d3f:DHCPNakEvent a owl:Class ; + rdfs:label "DHCP Nak Event" ; + d3f:definition "An event where a DHCP server sends a NAK message to reject a client's REQUEST, indicating that the requested configuration cannot be granted." ; + rdfs:subClassOf d3f:DHCPEvent ; + skos:altLabel "DHCPNAK" . + +d3f:DHCPOfferEvent a owl:Class ; + rdfs:label "DHCP Offer Event" ; + d3f:definition "An event where a DHCP server sends an OFFER message to a client in response to a DISCOVER request, proposing an IP address and associated configuration parameters." ; + rdfs:subClassOf d3f:DHCPEvent ; + skos:altLabel "DHCPOFFER" . + +d3f:DHCPReleaseEvent a owl:Class ; + rdfs:label "DHCP Release Event" ; + d3f:definition "An event where a DHCP client sends a RELEASE message to relinquish its assigned IP address and cancel any remaining lease duration." ; + rdfs:subClassOf d3f:DHCPEvent ; + skos:altLabel "DHCPRELEASE" . + +d3f:DHCPRequestEvent a owl:Class ; + rdfs:label "DHCP Request Event" ; + d3f:definition "An event where a DHCP client sends a REQUEST message to confirm or renew its desired IP configuration with a specific DHCP server." ; + rdfs:subClassOf d3f:DHCPEvent ; + skos:altLabel "DHCPREQUEST" . + +d3f:DHCPServer a owl:Class ; + rdfs:label "DHCP Server" ; + d3f:definition "A Dynamic Host Configuration Protocol (DHCP) server is a type of server that assigns IP addresses to computers. DHCP servers are used to assign IP addresses to computers and other devices automatically. The DHCP server is responsible for assigning the unique IP address to each device." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Server . + +d3f:DNN-basedClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "DNN-based Clustering" ; + d3f:d3fend-id "D3A-DBC" ; + d3f:definition "DNNs serve for clustering as mappings to better representations. The features of these representations can be drawn from different layers of the network or even from several layers." ; + d3f:kb-article """## References +OpenReview. (n.d.). Unsupervised Clustering using Pseudo Ensemble Models. [Link](https://openreview.net/pdf?id=B1eT9VMgOX)""" ; + rdfs:subClassOf d3f:ANN-basedClustering . + +d3f:DNSQueryEvent a owl:Class ; + rdfs:label "DNS Query Event" ; + d3f:definition "An event where a DNS query is made to resolve a domain name." ; + rdfs:subClassOf d3f:DNSEvent . + +d3f:DNSResponseEvent a owl:Class ; + rdfs:label "DNS Response Event" ; + d3f:definition "An event where a DNS server responds to a query with resolution data." ; + rdfs:subClassOf d3f:DNSEvent . + +d3f:DNSServer a owl:Class ; + rdfs:label "DNS Server" ; + d3f:definition """A Domain Name System (DNS) name server is a kind of name server. Domain names are one of the two principal namespaces of the Internet. The most important function of DNS servers is the translation (resolution) of human-memorable domain names and hostnames into the corresponding numeric Internet Protocol (IP) addresses, the second principal name space of the Internet which is used to identify and locate computer systems and resources on the Internet. (en). + +More generally, a name server is a computer application that implements a network service for providing responses to queries against a directory service. It translates an often humanly meaningful, text-based identifier to a system-internal, often numeric identification or addressing component. This service is performed by the server in response to a service protocol request.""" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Server . + +d3f:DS0001 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Firmware (ATT&CK DS)" ; + d3f:definition "Computer software that provides low-level control for the hardware and device(s) of a host, such as BIOS or UEFI/EFI" ; + rdfs:comment "This data source captures events relating to firmware and therefore has no direct mappings to digital artifacts." . + +d3f:DS0002 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "User Account (ATT&CK DS)" ; + d3f:definition "A profile representing a user, device, service, or application used to authenticate and access resources" ; + d3f:exactly d3f:UserAccount ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the User Account Metadata component" . + +d3f:DS0003 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Scheduled Job (ATT&CK DS)" ; + d3f:definition "Automated tasks that can be executed at a specific time or on a recurring schedule running in the background (ex: Cron daemon, task scheduler, BITS)" ; + d3f:exactly d3f:ScheduledJob ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Scheduled Job Metadata component" . + +d3f:DS0004 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Malware Repository (ATT&CK DS)" ; + d3f:definition "Information obtained (via shared or submitted samples) regarding malicious software (droppers, backdoors, etc.) used by adversaries" ; + d3f:narrower d3f:FileHash, + d3f:ImageCodeSegment ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Scheduled Job Metadata component" . + +d3f:DS0005 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "WMI (ATT&CK DS)" ; + d3f:definition "The infrastructure for management data and operations that enables local and remote management of Windows personal computers and servers" ; + rdfs:comment "This data source captures events relating to WMI objects and therefore has no direct mappings to digital artifacts." . + +d3f:DS0006 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Web Credential (ATT&CK DS)" ; + d3f:definition "Credential material, such as session cookies or tokens, used to authenticate to web applications and services" ; + rdfs:comment "This data source captures events relating to web credentials and therefore has no direct mappings to digital artifacts." . + +d3f:DS0007 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Image (ATT&CK DS)" ; + d3f:definition "A single file used to deploy a virtual machine/bootable disk into an on-premise or third-party cloud environment" ; + d3f:exactly d3f:VMImage ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Image Metadata component" . + +d3f:DS0008 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Kernel (ATT&CK DS)" ; + d3f:definition "A computer program, at the core of a computer OS, that resides in memory and facilitates interactions between hardware and software components" ; + rdfs:comment "This data source captures events relating to kernel modules and therefore has no direct mappings to digital artifacts." . + +d3f:DS0009 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Process (ATT&CK DS)" ; + d3f:definition "Instances of computer programs that are being executed by at least one thread. Processes have memory space for process executables, loaded modules (DLLs or shared libraries), and allocated memory regions containing everything from user input to application-specific data structures" ; + d3f:exactly d3f:Process ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Process Metadata component" . + +d3f:DS0010 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Cloud Storage (ATT&CK DS)" ; + d3f:definition "Data object storage infrastructure hosted on-premise or by third-party providers, made available to users through network connections and/or APIs" ; + d3f:exactly d3f:CloudStorage ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Cloud Storage Metadata component" . + +d3f:DS0011 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Module (ATT&CK DS)" ; + d3f:definition "Executable files consisting of one or more shared classes and interfaces, such as portable executable (PE) format binaries/dynamic link libraries (DLL), executable and linkable format (ELF) binaries/shared libraries, and Mach-O format binaries/shared libraries" ; + rdfs:comment "This data source captures events relating to software libraries and therefore has no direct mappings to digital artifacts." . + +d3f:DS0012 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Script (ATT&CK DS)" ; + d3f:definition "A file or stream containing a list of commands, allowing them to be launched in sequence" ; + rdfs:comment "This data source captures events relating to scripts and therefore has no direct mappings to digital artifacts." . + +d3f:DS0013 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Sensor Health (ATT&CK DS)" ; + d3f:definition "Information from host telemetry providing insights about system status, errors, or other notable functional activity" ; + rdfs:comment "This data source currently has no mappings to digital artifacts." . + +d3f:DS0014 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Pod (ATT&CK DS)" ; + d3f:definition "A single unit of shared resources within a cluster, comprised of one or more containers" ; + rdfs:comment "This data source captures events relating to pods and therefore has no direct mappings to digital artifacts." . + +d3f:DS0015 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Application Log (ATT&CK DS)" ; + d3f:broader d3f:Log ; + d3f:definition "Events collected by third-party services such as mail servers, web applications, or other appliances (not by the native OS or platform)" . + +d3f:DS0016 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Drive (ATT&CK DS)" ; + d3f:definition "A non-volatile data storage device (hard drive, floppy disk, USB flash drive) with at least one formatted partition, typically mounted to the file system and/or assigned a drive letter" ; + rdfs:comment "This data source captures events relating to drives and therefore has no direct mappings to digital artifacts." . + +d3f:DS0017 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Command (ATT&CK DS)" ; + d3f:definition "A directive given to a computer program, acting as an interpreter of some kind, in order to perform a specific task" ; + rdfs:comment "This data source captures events relating to commands and therefore has no direct mappings to digital artifacts." . + +d3f:DS0018 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Firewall (ATT&CK DS)" ; + d3f:definition "A network security system, running locally on an endpoint or remotely as a service (ex: cloud environment), that monitors and controls incoming/outgoing network traffic based on predefined rules" ; + d3f:exactly d3f:Firewall ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Firewall Metadata component" . + +d3f:DS0019 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Service (ATT&CK DS)" ; + d3f:definition "A computer process that is configured to execute continuously in the background and perform system tasks, in some cases before any user has logged in" ; + d3f:exactly d3f:ServiceApplicationProcess ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Service Metadata component" . + +d3f:DS0020 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Snapshot (ATT&CK DS)" ; + d3f:definition "A point-in-time copy of cloud volumes (files, settings, etc.) that can be created and/or deployed in cloud environments" ; + d3f:exactly d3f:VolumeSnapshot ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Volume Metadata component" . + +d3f:DS0021 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Persona (ATT&CK DS)" ; + d3f:definition "A malicious online profile representing a user commonly used by adversaries to social engineer or otherwise target victims" ; + rdfs:comment "This data source currently has no mappings to digital artifacts." . + +d3f:DS0022 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "File (ATT&CK DS)" ; + d3f:definition "A computer resource object, managed by the I/O system, for storing data (such as images, text, videos, computer programs, or any wide variety of other media)" ; + d3f:narrower d3f:FileSystemMetadata ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the File Metadata component" . + +d3f:DS0023 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Named Pipe (ATT&CK DS)" ; + d3f:definition "Mechanisms that allow inter-process communication locally or over the network. A named pipe is usually found as a file and processes attach to it" ; + d3f:exactly d3f:NamedPipe . + +d3f:DS0024 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Windows Registry (ATT&CK DS)" ; + d3f:definition "A Windows OS hierarchical database that stores much of the information and settings for software programs, hardware devices, user preferences, and operating-system configurations" ; + rdfs:comment "This data source captures events relating to Windows registry keys and values and therefore has no direct mappings to digital artifacts." . + +d3f:DS0025 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Cloud Service (ATT&CK DS)" ; + d3f:definition "Infrastructure, platforms, or software that are hosted on-premise or by third-party providers, made available to users through network connections and/or APIs" ; + rdfs:comment "This data source currently has no mappings to digital artifacts." . + +d3f:DS0026 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Active Directory (ATT&CK DS)" ; + d3f:definition "A database and set of services that allows administrators to manage permissions, access to network resources, and stored data objects (user, group, application, or devices)" ; + rdfs:comment "This data source captures events relating to Active Directory objects and therefore has no direct mappings to digital artifacts." . + +d3f:DS0027 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Driver (ATT&CK DS)" ; + d3f:definition "A computer program that operates or controls a particular type of device that is attached to a computer. Provides a software interface to hardware devices, enabling operating systems and other computer programs to access hardware functions without needing to know precise details about the hardware being used" ; + rdfs:comment "This data source captures events relating to hardware drivers and therefore has no direct mappings to digital artifacts." . + +d3f:DS0028 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Logon Session (ATT&CK DS)" ; + d3f:broader d3f:LoginSession ; + d3f:definition "Logon occurring on a system or resource (local, domain, or cloud) to which a user/device is gaining access after successful authentication and authorization" ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Login Session Metadata component" . + +d3f:DS0029 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Network Traffic (ATT&CK DS)" ; + d3f:definition "Data transmitted across a network (ex: Web, DNS, Mail, File, etc.), that is either summarized (ex: Netflow) and/or captured as raw data in an analyzable format (ex: PCAP)" ; + d3f:exactly d3f:NetworkTraffic ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Network Traffic Content component" . + +d3f:DS0030 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Instance (ATT&CK DS)" ; + d3f:definition "A virtual server environment which runs workloads, hosted on-premise or by third-party cloud providers" ; + rdfs:comment "This data source currently has no mappings to digital artifacts." . + +d3f:DS0032 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Container (ATT&CK DS)" ; + d3f:definition "A standard unit of virtualized software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another" ; + rdfs:comment "This data source captures events relating to containers and therefore has no direct mappings to digital artifacts." . + +d3f:DS0033 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Network Share (ATT&CK DS)" ; + d3f:definition "A storage resource (typically a folder or drive) made available from one host to others using network protocols, such as Server Message Block (SMB) or Network File System (NFS)" ; + rdfs:comment "This data source captures events relating to shared network resources and therefore has no direct mappings to digital artifacts." . + +d3f:DS0034 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Volume (ATT&CK DS)" ; + d3f:definition "Block object storage hosted on-premise or by third-party providers, typically made available to resources as virtualized hard drives" ; + rdfs:comment "This data source currently has no mappings to digital artifacts." . + +d3f:DS0035 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Internet Scan (ATT&CK DS)" ; + d3f:definition "Information obtained (commonly via active network traffic probes or web crawling) regarding various types of resources and servers connected to the public Internet" ; + rdfs:comment "This data source currently has no mappings to digital artifacts." . + +d3f:DS0036 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Group (ATT&CK DS)" ; + d3f:definition "A collection of multiple user accounts that share the same access rights to the computer and/or network resources and have common security rights" ; + d3f:exactly d3f:UserGroup ; + rdfs:comment "The digital artifact mapping for this data source is only applicable to the Group Metadata component" . + +d3f:DS0037 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Certificate (ATT&CK DS)" ; + d3f:definition "A digital document, which highlights information such as the owner's identity, used to instill trust in public keys used while encrypting network communications" ; + rdfs:comment "This data source captures events relating to certificates and therefore has no direct mappings to digital artifacts." . + +d3f:DS0038 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Domain Name (ATT&CK DS)" ; + d3f:definition "Information obtained (commonly through registration or activity logs) regarding one or more IP addresses registered with human readable names (ex: mitre.org)" ; + rdfs:comment "This data source currently has no mappings to digital artifacts." . + +d3f:DS0039 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Asset (ATT&CK DS)" ; + d3f:definition "Data sources with information about the set of devices found within the network, along with their current software and configurations" ; + d3f:exactly d3f:AssetInventoryAgent . + +d3f:DS0040 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Operational Database (ATT&CK DS)" ; + d3f:definition "Operational databases contain information about the status of the operational process and associated devices, including any measurements, events, history, or alarms that have occurred" ; + rdfs:comment "This data source currently has no mappings to digital artifacts." . + +d3f:DS0041 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "Application Vetting (ATT&CK DS)" ; + d3f:broader d3f:CodeAnalyzer ; + d3f:definition "Application vetting report generated by an external cloud service." . + +d3f:DS0042 a d3f:ATTACKEnterpriseDataSource, + owl:NamedIndividual ; + rdfs:label "User Interface (ATT&CK DS)" ; + d3f:definition "Visual activity on the device that could alert the user to potentially malicious behavior." ; + rdfs:comment "This data source currently has no mappings to digital artifacts, but may be updated in future releases." . + +d3f:DataArtifactServer a owl:Class ; + rdfs:label "Data Artifact Server" ; + d3f:definition "A data artifact server provides access services to content in a content repository. The content repository or content store is a database of digital content with an associated set of data management, search and access methods allowing application-independent access to the content, rather like a digital library, but with the ability to store and modify content in addition to searching and retrieving. The content repository acts as the storage engine for a larger application such as a content management system or a document management system, which adds a user interface on top of the repository's application programming interface." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ArtifactServer . + +d3f:DataLinkLink a owl:Class ; + rdfs:label "Data Link Link" ; + d3f:definition "A communication link between two network devices connected directly at the physical layer and on the same network segment; i.e., an OSI Layer 2 link." ; + d3f:synonym "Data Link Layer Link", + "Layer-2 Link", + "Link Layer Link" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:LogicalLink . + +d3f:DatabaseServer a owl:Class, + owl:NamedIndividual ; + rdfs:label "Database Server" ; + d3f:contains d3f:Database ; + d3f:definition "A database server is a server which uses a database application that provides database services to other computer programs or to computers, as defined by the client-server model. Database management systems (DBMSs) frequently provide database-server functionality, and some database management systems (such as MySQL) rely exclusively on the client-server model for database access (while others e.g. SQLite are meant for using as an embedded database). For clarification, a database server is simply a server that maintains services related to clients via database applications." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Database ], + d3f:Server ; + skos:altLabel "Network Database Resource" . + +d3f:Datalog a owl:Class, + owl:NamedIndividual ; + rdfs:label "Datalog" ; + d3f:d3fend-id "D3A-DAT" ; + d3f:definition "Datalog is a declarative logic programming language that is a syntactically a subset of Prolog." ; + d3f:kb-article """## How it works +Datalog generally uses a bottom-up rather than top-down evaluation model. This difference yields significantly different behavior and properties from Prolog. It is often used as a query language for deductive databases. Datalog has been applied to problems in data integration, networking, program analysis, and more. + +## References +1. Datalog. (2023, April 20). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Datalog)""" ; + rdfs:subClassOf d3f:LogicProgramming . + +d3f:DecisionTreeRegression a owl:Class, + owl:NamedIndividual ; + rdfs:label "Decision Tree Regression" ; + d3f:d3fend-id "D3A-DTR" ; + d3f:definition "Decision Trees Regression is asupervised learning method with the goal to create a model that predicts the value of a target variable by learning simple decision rules inferred from the data features" ; + d3f:kb-article """## References +scikit-learn. (n.d.). Decision Trees. [Link](https://scikit-learn.org/stable/modules/tree.html#tree)""" ; + rdfs:subClassOf d3f:RegressionAnalysisLearning . + +d3f:DeepConvolutionalGAN a owl:Class, + owl:NamedIndividual ; + rdfs:label "Deep Convolutional GAN" ; + d3f:d3fend-id "D3A-DCG" ; + d3f:definition "Deep Convolutional GAN (DCGAN) uses convolutional and convolutional-transpose layers in the generator and discriminator, respectively." ; + d3f:kb-article """## References +Analytics Vidhya. (2021). Deep Convolutional Generative Adversarial Network (DCGAN) for Beginners. [Link](https://www.analyticsvidhya.com/blog/2021/07/deep-convolutional-generative-adversarial-network-dcgan-for-beginners/)""" ; + d3f:synonym "DCGAN" ; + rdfs:subClassOf d3f:ImageSynthesisGAN . + +d3f:DeepQ-learning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Deep Q-learning" ; + d3f:d3fend-id "D3A-DQL" ; + d3f:definition "Uses a deep convolutional neural network, with layers of tiled convolutional filters to mimic the effects of receptive fields." ; + d3f:kb-article """## References +Q-learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Q-learning#Deep_Q-learning).""" ; + rdfs:subClassOf d3f:Q-Learning . + +d3f:Density-weightedMethod a owl:Class, + owl:NamedIndividual ; + rdfs:label "Density-weighted Method" ; + d3f:d3fend-id "D3A-DWM" ; + d3f:definition "An Actvie Learning technique that uses a density estimate meta-parameter to avoid sampling sparsely populated regions of the feature space and can be based parametrically or from a parameter free model." ; + d3f:kb-article """## References +Intro to Active Learning. inovex Blog. [Link](https://www.inovex.de/de/blog/intro-to-active-learning/).""" ; + rdfs:subClassOf d3f:ActiveLearning . + +d3f:DeonticLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Deontic Logic" ; + d3f:d3fend-id "D3A-DL" ; + d3f:definition "Deontic logic addresses the modality of obligations and norms; i.e., the modality of morality." ; + d3f:kb-article """## References +1. Deontic logic. (2023, June 4). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Modal_logic#Deontic_logic)""" ; + rdfs:subClassOf d3f:ModalLogic . + +d3f:DesktopComputer a owl:Class ; + rdfs:label "Desktop Computer" ; + d3f:definition "A desktop computer is a personal computer designed for regular use at a single location on or near a desk or table due to its size and power requirements. The most common configuration has a case that houses the power supply, motherboard (a printed circuit board with a microprocessor as the central processing unit (CPU), memory, bus, and other electronic components, disk storage (usually one or more hard disk drives, solid state drives, optical disc drives, and in early models a floppy disk drive); a keyboard and mouse for input; and a computer monitor, speakers, and, often, a printer for output. The case may be oriented horizontally or vertically and placed either underneath, beside, or on top of a desk." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:PersonalComputer . + +d3f:DialUpModem a owl:Class ; + rdfs:label "Dial Up Modem" ; + d3f:definition "A dial-up modem transmits computer data over an ordinary switched telephone line that has not been designed for data use. This contrasts with leased line modems, which also operate over lines provided by a telephone company, but ones which are intended for data use and do not impose the same signaling constraints. The modulated data must fit the frequency constraints of a normal voice audio signal, and the modem must be able to perform the actions needed to connect a call through a telephone exchange, namely: picking up the line, dialing, understanding signals sent back by phone company equipment (dial tone, ringing, busy signal,) and on the far end of the call, the second modem in the connection must be able to recognize the incoming ring signal and answer the line." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Modem . + +d3f:DifferentialVolumeSnapshot a owl:Class ; + rdfs:label "Differential Volume Snapshot" ; + d3f:definition "A differential volume snapshot is a point-in-time capture of the files and directories that were changed since the last full snapshot." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:VolumeSnapshot . + +d3f:DiscriminantAnalysis a owl:Class, + owl:NamedIndividual ; + rdfs:label "Discriminant Analysis" ; + d3f:d3fend-id "D3A-DA" ; + d3f:definition "Discriminant analysis attempts to establish whether a set of variables can be used to distinguish between two or more groups of cases." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Multivariate statistics. [Link](https://en.wikipedia.org/wiki/Multivariate_statistics)""" ; + rdfs:subClassOf d3f:MultivariateAnalysis . + +d3f:DisplayDeviceDriver a owl:Class, + owl:NamedIndividual ; + rdfs:label "Display Device Driver" ; + d3f:definition "A device driver for a display adapter." ; + d3f:drives d3f:DisplayAdapter ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:drives ; + owl:someValuesFrom d3f:DisplayAdapter ], + d3f:HardwareDriver . + +d3f:DivisiveClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Divisive Clustering" ; + d3f:d3fend-id "D3A-DC" ; + d3f:definition "A divisive clustering approach is a hierarchical, top-down approach to clustering a dataset." ; + rdfs:subClassOf d3f:HierarchicalClustering . + +d3f:Dyna-Q a owl:Class, + owl:NamedIndividual ; + rdfs:label "Dyna-Q" ; + d3f:d3fend-id "D3A-DQ" ; + d3f:definition "A Dyna-Q agent combines acting, learning, and planning." ; + d3f:kb-article """## References +CompNeuro Neuromatch Academy Tutorials. [Link](https://compneuro.neuromatch.io/tutorials/W3D4_ReinforcementLearning/student/W3D4_Tutorial4.html)""" ; + rdfs:subClassOf d3f:Model-basedReinforcementLearning . + +d3f:DynamicAnalysisTool a owl:Class ; + rdfs:label "Dynamic Analysis Tool" ; + d3f:definition "Dynamic program analysis is the analysis of computer software that is performed by executing programs on a real or virtual processor." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:CodeAnalyzer . + +d3f:EmailAttachment a owl:Class, + owl:NamedIndividual ; + rdfs:label "Email Attachment" ; + d3f:attached-to d3f:Email ; + d3f:definition "An email attachment is a computer file sent along with an email message. One or more files can be attached to any email message, and be sent along with it to the recipient. This is typically used as a simple method to share documents and images." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:attached-to ; + owl:someValuesFrom d3f:Email ], + d3f:DocumentFile . + +d3f:EmailReceiveEvent a owl:Class ; + rdfs:label "Email Receive Event" ; + d3f:definition "An event where an email is delivered to a recipient's mail server or mailbox. This includes receiving messages from internal or external sources via protocols such as IMAP, POP3, or their secure variants." ; + rdfs:subClassOf d3f:EmailEvent . + +d3f:EmailScanEvent a owl:Class ; + rdfs:label "Email Scan Event" ; + d3f:definition "An event where an email is inspected or analyzed for content, security, or compliance purposes. Scanning often involves identifying spam, detecting malware, or ensuring policy adherence before delivery or after reception." ; + rdfs:subClassOf d3f:EmailEvent . + +d3f:EmailSendEvent a owl:Class ; + rdfs:label "Email Send Event" ; + d3f:definition "An event where an email is transmitted from a client to a recipient via a mail server. This process often involves protocols such as SMTP or its secure variants, with potential authentication and encryption for secure delivery." ; + rdfs:subClassOf d3f:EmailEvent . + +d3f:Enclave a owl:Class, + owl:NamedIndividual ; + rdfs:label "Enclave" ; + d3f:definition "Network enclaves consist of standalone assets that do not interact with other information systems or networks. A major difference between a DMZ or demilitarized zone and a network enclave is a DMZ allows inbound and outbound traffic access, where firewall boundaries are traversed. In an enclave, firewall boundaries are not traversed. Enclave protection tools can be used to provide protection within specific security domains. These mechanisms are installed as part of an Intranet to connect networks that have similar security requirements." ; + d3f:may-contain d3f:LocalAreaNetwork ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:LocalAreaNetwork ], + d3f:DigitalInformationBearer ; + skos:altLabel "Network Enclave" . + +d3f:EncryptedPassword a owl:Class ; + rdfs:label "Encrypted Password" ; + rdfs:subClassOf d3f:EncryptedCredential, + d3f:Password . + +d3f:EpistemicLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Epistemic Logic" ; + d3f:d3fend-id "D3A-EL" ; + d3f:definition "Epistemic logic addresses modalities of knowledge; i.e., the certainty of sentences." ; + d3f:kb-article """## References +1. Epistemic logic. (2023, June 4). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Modal_logic#Epistemic_logic)""" ; + d3f:synonym "Epistemic Modal Logic" ; + rdfs:subClassOf d3f:ModalLogic . + +d3f:EventLogArchiveEvent a owl:Class ; + rdfs:label "Event Log Archive Event" ; + d3f:definition "An event involving the archiving of event log data, typically to preserve historical records in a compressed or secure format." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EventLogClearEvent a owl:Class ; + rdfs:label "Event Log Clear Event" ; + d3f:definition "An event where the event log data is cleared from the system, often as part of log maintenance or potentially to cover tracks." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EventLogDeleteEvent a owl:Class ; + rdfs:label "Event Log Delete Event" ; + d3f:definition "An event where the event log database, file, or cache is deleted from the system, removing the log's historical records." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EventLogDisableEvent a owl:Class ; + rdfs:label "Event Log Disable Event" ; + d3f:definition "An event indicating that the event logging service has been disabled, preventing it from collecting or recording logs." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EventLogEnableEvent a owl:Class ; + rdfs:label "Event Log Enable Event" ; + d3f:definition "An event where the event logging service is enabled, allowing it to actively collect and record logs." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EventLogExportEvent a owl:Class ; + rdfs:label "Event Log Export Event" ; + d3f:definition "An event representing the export of event log data to a file or external system for backup or analysis purposes." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EventLogRestartEvent a owl:Class ; + rdfs:label "Event Log Restart Event" ; + d3f:definition "An event representing the restarting of the event logging service, often performed during system maintenance or troubleshooting." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EventLogRotateEvent a owl:Class ; + rdfs:label "Event Log Rotate Event" ; + d3f:definition "An event where the event log is rotated, often as part of log rotation policies to manage storage and ensure continuity." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EventLogStartEvent a owl:Class ; + rdfs:label "Event Log Start Event" ; + d3f:definition "An event where the event logging service is started, enabling the collection and recording of system events." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EventLogStopEvent a owl:Class ; + rdfs:label "Event Log Stop Event" ; + d3f:definition "An event indicating that the event logging service has been stopped, halting the recording of system events." ; + rdfs:subClassOf d3f:EventLogEvent . + +d3f:EvictionEvent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Eviction Event" ; + d3f:definition "An event describing actions to remove adversaries or malicious resources from a system, re-establishing security and operational integrity." ; + d3f:related d3f:Evict ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:preceded-by ; + owl:someValuesFrom d3f:DetectionEvent ], + d3f:SecurityEvent . + +d3f:ExactMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exact Matching" ; + d3f:d3fend-id "D3A-EM" ; + d3f:definition "Exact matching for numeric types is just the simple test for mathematical equivalence of the values being matched." ; + d3f:kb-article """## References +1. Equality (mathematics). (2023, May 31). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Equality_(mathematics)]""" ; + d3f:synonym "Numeric Equivalence Matching" ; + rdfs:subClassOf d3f:EquivalenceMatching, + d3f:NumericPatternMatching . + +d3f:ExceptionHandler a owl:Class ; + rdfs:label "Exception Handler" ; + d3f:definition "An exception handler is a code segment that processes an exception." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Subroutine . + +d3f:Expectation-maximizationClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Expectation-maximization Clustering" ; + d3f:d3fend-id "D3A-EMC" ; + d3f:definition "An unsupervised clustering algorithm and extends to NLP applications like Latent Dirichlet Allocation, the Baum-Welch algorithm for Hidden Markov Models, and medical imaging." ; + d3f:kb-article """## References +Towards Data Science. (n.d.). Expectation Maximization Explained. [Link](https://towardsdatascience.com/expectation-maximization-explained-c82f5ed438e5#:~:text=Expectation%20Maximization%20(EM)%20is%20a,Markov%20Models%2C%20and%20medical%20imaging.)""" ; + rdfs:subClassOf d3f:Distribution-basedClustering . + +d3f:ExpectedErrorReduction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Expected Error Reduction" ; + d3f:d3fend-id "D3A-EER" ; + d3f:definition "Expected Error Reduction (EER) follows similar ideas as EMC, but again looks at the model output instead of the model itself and also takes the other data into account. In particular, a sample x is considered useful, if we can expect that knowing the label will reduce the future error on unseen samples" ; + d3f:kb-article """## References +Intro to Active Learning. inovex Blog. [Link](https://www.inovex.de/de/blog/intro-to-active-learning/).""" ; + rdfs:subClassOf d3f:ActiveLearning . + +d3f:ExpectedModelChange a owl:Class, + owl:NamedIndividual ; + rdfs:label "Expected Model Change" ; + d3f:d3fend-id "D3A-EMC" ; + d3f:definition "Supervised learning establishes a relationship between the known input and output variables to conduct a predictive analysis." ; + d3f:kb-article """nal Consiterations + +## References +Intro to Active Learning. inovex Blog. [Link](https://www.inovex.de/de/blog/intro-to-active-learning/).""" ; + rdfs:subClassOf d3f:ActiveLearning . + +d3f:FQDNDomainName a d3f:DomainName, + owl:NamedIndividual ; + rdfs:label "FQDN Domain Name" . + +d3f:FTPDeleteEvent a owl:Class ; + rdfs:label "FTP Delete Event" ; + d3f:definition "An event where files or directories are removed from an FTP server, resulting in their permanent deletion from the remote system." ; + rdfs:subClassOf d3f:FTPEvent . + +d3f:FTPGetEvent a owl:Class ; + rdfs:label "FTP Get Event" ; + d3f:definition "An event where a file is downloaded from an FTP server to a client, retrieving data from the remote system to the local destination." ; + rdfs:subClassOf d3f:FTPEvent . + +d3f:FTPListEvent a owl:Class ; + rdfs:label "FTP List Event" ; + d3f:definition "An event where the contents of a directory on an FTP server are listed, providing metadata such as file names, sizes, and timestamps." ; + rdfs:subClassOf d3f:FTPEvent . + +d3f:FTPPollEvent a owl:Class ; + rdfs:label "FTP Poll Event" ; + d3f:definition "An event where a client queries an FTP server to check for the presence of specific files or directories without initiating a transfer." ; + rdfs:subClassOf d3f:FTPEvent . + +d3f:FTPPutEvent a owl:Class ; + rdfs:label "FTP Put Event" ; + d3f:definition "An event where a file is uploaded from a client to an FTP server, transferring data from the local system to the remote destination." ; + rdfs:subClassOf d3f:FTPEvent . + +d3f:FTPRenameEvent a owl:Class ; + rdfs:label "FTP Rename Event" ; + d3f:definition "An event where files or directories on an FTP server are renamed, modifying their identifiers without altering their content or location." ; + rdfs:subClassOf d3f:FTPEvent . + +d3f:FastSymbolicLink a owl:Class ; + rdfs:label "Fast Symbolic Link" ; + d3f:definition "Fast symbolic links, allow storage of the target path within the data structures used for storing file information on disk (e.g., within the inodes). This space normally stores a list of disk block addresses allocated to a file. Thus, symlinks with short target paths are accessed quickly. Systems with fast symlinks often fall back to using the original method if the target path exceeds the available inode space." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:SymbolicLink, + d3f:UnixLink ; + owl:disjointWith d3f:SlowSymbolicLink ; + skos:altLabel "Fast Symlink" . + +d3f:FileAccessEvent a owl:Class ; + rdfs:label "File Access Event" ; + d3f:definition "An event where a file is accessed for operations such as reading, opening, or inspecting its contents or metadata, without necessarily modifying its state." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileCopyEvent a owl:Class ; + rdfs:label "File Copy Event" ; + d3f:definition "An event where a file is duplicated, creating a new file in a different location or under a different name while preserving the original file's content and attributes." ; + rdfs:subClassOf d3f:FileCreationEvent . + +d3f:FileDecryptionEvent a owl:Class ; + rdfs:label "File Decryption Event" ; + d3f:definition "An event where a previously encrypted file is decoded, rendering its content accessible to authorized users or processes." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileDeletionEvent a owl:Class ; + rdfs:label "File Deletion Event" ; + d3f:definition "An event where a file is permanently removed from the file system or storage medium, potentially triggering actions related to data retention or recovery." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileEncryptionEvent a owl:Class ; + rdfs:label "File Encryption Event" ; + d3f:definition "An event involving the application of cryptographic techniques to a file, ensuring its content is securely encoded and inaccessible without proper decryption keys." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileGetAttributesEvent a owl:Class ; + rdfs:label "File Get Attributes Event" ; + d3f:definition "An event where a file's metadata attributes, such as size, creation date, or type, are queried or retrieved without altering its content." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileGetPermissionsEvent a owl:Class ; + rdfs:label "File Get Permissions Event" ; + d3f:definition "An event where a file's security settings or access control list (ACL) is retrieved, detailing permissions granted to users or processes." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileMountEvent a owl:Class ; + rdfs:label "File Mount Event" ; + d3f:definition "An event where a file system or storage volume is mounted, making its files and directories accessible to the operating system or applications." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FilePathOpenFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "File Path Open Function" ; + d3f:accesses d3f:File ; + d3f:definition "Has an input of a file path, and opens a file handle for reading or writing." ; + d3f:invokes d3f:OpenFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:OpenFile ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:File ], + d3f:Subroutine . + +d3f:FileRenamingEvent a owl:Class ; + rdfs:label "File Renaming Event" ; + d3f:definition "An event representing the renaming of a file, modifying its identifier within the file system while retaining its content and metadata." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileServer a owl:Class ; + rdfs:label "File Server" ; + d3f:definition "The term server highlights the role of the machine in the traditional client-server scheme, where the clients are the workstations using the storage. A file server does not normally perform computational tasks or run programs on behalf of its client workstations. File servers are commonly found in schools and offices, where users use a local area network to connect their client computers." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Server . + +d3f:FileSetAttributesEvent a owl:Class ; + rdfs:label "File Set Attributes Event" ; + d3f:definition "An event where a file's metadata attributes are modified, such as changing its timestamps, labels, or categorization within the system." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileSetPermissionsEvent a owl:Class ; + rdfs:label "File Set Permissions Event" ; + d3f:definition "An event involving the modification of a file's permissions or access control list (ACL), specifying which users or processes are granted or restricted access." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileShareService a owl:Class ; + rdfs:label "File Share Service" ; + d3f:definition "A file sharing service (or file share service) provides the ability to share data across a network." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:NetworkService . + +d3f:FileSystemSensor a owl:Class, + owl:NamedIndividual ; + rdfs:label "File System Sensor" ; + d3f:definition "Collects files and file metadata on an endpoint." ; + d3f:monitors d3f:File ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:File ], + d3f:EndpointSensor . + +d3f:FileUnmountEvent a owl:Class ; + rdfs:label "File Unmount Event" ; + d3f:definition "An event where a file system or storage volume is unmounted, disconnecting its files and directories from the operating system or applications." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FileUpdateEvent a owl:Class ; + rdfs:label "File Update Event" ; + d3f:definition "An event involving changes to the content or metadata of an existing file, reflecting updates that alter its state or properties." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:FingerPrintScannerInputDevice a owl:Class ; + rdfs:label "Finger Print Scanner Input Device" ; + d3f:definition "A fingerprint sensor is an electronic device used to capture a digital image of the fingerprint pattern. The captured image is called a live scan. This live scan is digitally processed to create a biometric template (a collection of extracted features) which is stored and used for matching. Many technologies have been used including optical, capacitive, RF, thermal, piezoresistive, ultrasonic, piezoelectric, and MEMS." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ImageScannerInputDevice ; + skos:altLabel "Fingerprint Sensor" . + +d3f:FirmwareSensor a owl:Class, + owl:NamedIndividual ; + rdfs:label "Firmware Sensor" ; + d3f:definition "Collects information on firmware installed on an Endpoint." ; + d3f:monitors d3f:Firmware ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:Firmware ], + d3f:EndpointSensor . + +d3f:First-orderLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "First-order Logic" ; + d3f:d3fend-id "D3A-FOL" ; + d3f:definition "First-order logic is a collection of formal systems used in mathematics, philosophy, linguistics, and computer science. First-order logic uses quantified variables over non-logical objects, and allows the use of sentences that contain variables." ; + d3f:kb-article """## How it works + +For propositions such as "Socrates is a man", one can have expressions in the form "there exists x such that x is Socrates and x is a man", where "there exists" is a quantifier, while x is a variable. This distinguishes it from propositional logic, which does not use quantifiers or relations. + +The term "first-order" distinguishes first-order logic from higher-order logic, in which there are predicates having predicates or functions as arguments, or in which quantification over predicates, functions, or both, are permitted. + +## Considerations + +- Advantages: +-- First-order logic is more expressive than propositional logic; one can talk about objects and their properties, relations between objects. +-- First-order logic is able to make use of variables and quantifiers (e.g., "for all" and "exists".) +-- First-order logic supports power forms of reasoning, such as inferring the properties of an unknown object from the properties of known objects. + +- Disadvantages: +-- First-order logic is more difficult to learn and use than propositional logic, due to its greater complexity. +-- First-order logic is also less tractable than propositional logic in many cases; reasoning about quantifiers and variables adds complexity. +-- First-order logic can be difficult to apply in practice, due to the need to find appropriate axioms and rules for each application. + +### Verification Approach + +- Automated theorem provers can assist in formal verification, performing automated reasoning over system modeled in first-order logic and explore a complete space of system behaviors +- First-order logic may be more expressive than necessary for many types of problems and may be more difficult to verify by SMEs. +- Theorem provers based in FOL are capable of use in software verification tasks, but an SMT solver such as Z3 might be more appropriate. +- Defining a set of competency questions (i.e., query use cases for a first-order logic ontology) can help scope the logic required for a complete solution. + +### Validation Approach + +- Domain SMEs should be identified to review the analytics results and compare them to expected results for a given input. +- Where possible, an outside team of SMEs should inspect the formal logic specification of a system against its stated requirements and suitability to address its domain problem sets. +- Defining a set of competency questions and the expected results provides one means of validation. + +## References + +1. First-order logic. (2023, May 26). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/First-order_logic) +2. Shapiro, S. and Kissel, T. Classical Logic. (2022). Stanford Encyclopedia of Philosophy. [Link](https://plato.stanford.edu/entries/logic-classical/) +3. A.I. For Anyone. First-order Logic (n.d.). [Link](https://www.aiforanyone.org/glossary/first-order-logic) +4. Smith, P. An Introduction to Formal Logic. (2020). [Link](https://doi.org/10.1017/9781108328999) +5. Gruninger, M. and Fox, M. (1995). Methodology for the Design and Evaluation of Ontologies. [Link](https://www.researchgate.net/publication/2288533_Methodology_for_the_Design_and_Evaluation_of_Ontologies) +6. Keet, C., Suarez-Figurosa, M., and Poveda-Villalon, M. (2014). Pitfalls in Ontologies and TIPS to Prevent Them. [Link](https://dl.acm.org/doi/10.4018/ijswis.2014040102) +7. Bjorner, N. et al. The inner magic behind the Z3 theorem prover. (2019) [Link](https://www.microsoft.com/en-us/research/blog/the-inner-magic-behind-the-z3-theorem-prover/)""" ; + d3f:synonym "FOL", + "First-order Predicate Calculus", + "Quantificational Logic" ; + rdfs:subClassOf d3f:PredicateLogic . + +d3f:First-stageBootLoader a owl:Class ; + rdfs:label "First-stage Boot Loader" ; + d3f:definition "The very first routine run in order to load the operating system." ; + rdfs:subClassOf d3f:BootLoader . + +d3f:FlashMemory a owl:Class ; + rdfs:label "Flash Memory" ; + d3f:definition "Flash memory is an electronic non-volatile computer memory storage medium that can be electrically erased and reprogrammed." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:SecondaryStorage . + +d3f:ForwardProxyServer a owl:Class ; + rdfs:label "Forward Proxy Server" ; + d3f:definition "An forward (or open) proxy is a proxy server that is accessible by any Internet user. Generally, a proxy server only allows users within a network group (i.e. a closed proxy) to store and forward Internet services such as DNS or web pages to reduce and control the bandwidth used by the group. With an open proxy, however, any user on the Internet is able to use this forwarding service." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ProxyServer . + +d3f:FullVolumeSnapshot a owl:Class ; + rdfs:label "Full Volume Snapshot" ; + d3f:definition "A full volume snapshot is a point-in-time copy of the complete contents of a volume." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:VolumeSnapshot . + +d3f:FuzzyLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Fuzzy Logic" ; + d3f:d3fend-id "D3A-FL" ; + d3f:definition "Fuzzy logic is a form of many-valued logic in which the truth value of variables may be any real number between 0 and 1." ; + d3f:kb-article """## How it works +It is employed to handle the concept of partial truth, where the truth value may range between completely true and completely false.[1] By contrast, in Boolean logic, the truth values of variables may only be the integer values 0 or 1. + +## References +1. Fuzzy logic. (2023, May 28). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Fuzzy_logic)""" ; + rdfs:subClassOf d3f:SymbolicAI . + +d3f:GPT a owl:Class, + owl:NamedIndividual ; + rdfs:label "GPT" ; + d3f:d3fend-id "D3A-GPT" ; + d3f:definition "Generative pre-trained transformers (GPT) are a type of large language model (LLM) and a prominent framework for generative artificial intelligence." ; + d3f:kb-article """## References +Generative pre-trained transformer. (n.d.). In Wikipedia. [Link](https://en.wikipedia.org/wiki/Generative_pre-trained_transformer)""" ; + d3f:synonym "Generative Pre-trained Transformer" ; + rdfs:subClassOf d3f:Transformer-basedLearning . + +d3f:GatedRecurrentUnit a owl:Class, + owl:NamedIndividual ; + rdfs:label "Gated Recurrent Unit" ; + d3f:d3fend-id "D3A-GRU" ; + d3f:definition "The GRU is like a long short-term memory (LSTM) with a forget gate, but has fewer parameters than LSTM, as it lacks an output gate. GRU's performance on certain tasks of polyphonic music modeling, speech signal modeling and natural language processing was found to be similar to that of LSTM" ; + d3f:kb-article """## References +Wikipedia. (2021, September 20). Gated Recurrent Unit. [Link](https://en.wikipedia.org/wiki/Gated_recurrent_unit)""" ; + rdfs:subClassOf d3f:RecurrentNeuralNetwork . + +d3f:GetForegroundWindow a d3f:GetOpenWindows, + owl:NamedIndividual ; + rdfs:label "Get Foreground Window" ; + rdfs:isDefinedBy . + +d3f:GoodmanAndKruskalsGamma a owl:Class, + owl:NamedIndividual ; + rdfs:label "Goodman and Kruskal's Gamma" ; + d3f:d3fend-id "D3A-GAKG" ; + d3f:definition "Goodman-Kruskal $\\\\gamma$ is a measure of rank correlation between x and y and is given by $(n_c -n_d) / (n_c + n_d)$, where $n_c$ is the number of concordant pairs of the observations and $n_d$ is the number of discordant pairs." ; + d3f:kb-article """## References +1. Wolfram Research. (2012). GoodmanKruskalGamma. Wolfram Language function. [Link](https://reference.wolfram.com/language/ref/GoodmanKruskalGamma.html) +1. Goodman and Kruskal's gamma. (2022, Nov 23). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Goodman_and_Kruskal%27s_gamma]""" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:RankCorrelationCoefficient . + +d3f:GradientBoostedDecisionTree a owl:Class, + owl:NamedIndividual ; + rdfs:label "Gradient-Boosted Decision Tree" ; + d3f:d3fend-id "D3A-GBDT" ; + d3f:definition "A gradient-boosted decision tree is, as in other bagging and boosting methods, a method where the relatively 'weak' machine learning model (a decision tree) is used in an ensemble to form a 'strong' machine learning model." ; + d3f:kb-article """## Reference + +1. Google. (28 Sep 2023). Gradient Boosted Decision Trees. +[Link](https://developers.google.com/machine-learning/decision-forests/intro-to-gbdt).""" ; + rdfs:subClassOf d3f:CART . + +d3f:Graph-basedSemi-supervisedLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Graph-based Semi-supervised Learning" ; + d3f:d3fend-id "D3A-GBSSL" ; + d3f:definition "Graph-based Semi-Supervised Learning (GSSL) methods aim to classify unlabeled data by learning the graph structure and labeled data jointly." ; + d3f:kb-article """## References +Yang, S., Pan, L., & Cheng, J. (2021). Graph-based Semi-Supervised Learning Methods for Imbalanced Data Classification. [Link](https://www.sciencedirect.com/science/article/pii/S0031320321002132?viewFullText=true).""" ; + rdfs:subClassOf d3f:Semi-supervisedTransductiveLearning . + +d3f:GraphicsCardFirmware a owl:Class ; + rdfs:label "Graphics Card Firmware" ; + d3f:definition "Firmware that is installed on computer graphics card." ; + rdfs:seeAlso d3f:Firmware ; + rdfs:subClassOf d3f:PeripheralFirmware ; + skos:altLabel "Video Card Firmware" . + +d3f:GraphicsProcessingUnit a owl:Class ; + rdfs:label "Graphics Processing Unit" ; + d3f:synonym "GPU" ; + rdfs:subClassOf d3f:Processor . + +d3f:Grid-CNN a owl:Class, + owl:NamedIndividual ; + rdfs:label "Grid-CNN" ; + d3f:d3fend-id "D3A-GC" ; + d3f:definition "A class of neural networks that specializes in processing data that has a grid-like topology, such as an image." ; + d3f:kb-article """## References +Talukdar, P. (2020, June 10). Convolutional Neural Networks Explained. Towards Data Science. [Link](https://towardsdatascience.com/convolutional-neural-networks-explained-9cc5188c4939)""" ; + rdfs:subClassOf d3f:ConvolutionalNeuralNetwork . + +d3f:Grid-basedClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Grid-based Clustering" ; + d3f:d3fend-id "D3A-GBC" ; + d3f:definition "Divides the entire data space into a finite number of cells reducing the complexity of the data and focuses on the cells rather than the data." ; + d3f:kb-article """## References +TechVidvan. (n.d.). Clustering in Machine Learning Tutorial. [Link](https://techvidvan.com/tutorials/clustering-in-machine-learning/)""" ; + rdfs:subClassOf d3f:High-dimensionClustering . + +d3f:GroupCreationEvent a owl:Class ; + rdfs:label "Group Creation Event" ; + d3f:definition "An event where a new group is established within the system, defining an entity to manage users and permissions collectively." ; + rdfs:subClassOf d3f:GroupManagementEvent . + +d3f:GroupDeletionEvent a owl:Class ; + rdfs:label "Group Deletion Event" ; + d3f:definition "An event where an existing group is permanently removed from the system, dissolving its associated memberships and privileges." ; + rdfs:subClassOf d3f:GroupManagementEvent . + +d3f:HTTPConnectEvent a owl:Class ; + rdfs:label "HTTP CONNECT Event" ; + d3f:definition "An event where the HTTP CONNECT method is used to establish a tunnel to the server identified by the target resource." ; + rdfs:subClassOf d3f:HTTPRequestEvent . + +d3f:HTTPDeleteEvent a owl:Class ; + rdfs:label "HTTP DELETE Event" ; + d3f:definition "An event where the HTTP DELETE method is used to delete the specified resource." ; + rdfs:subClassOf d3f:HTTPRequestEvent . + +d3f:HTTPGetEvent a owl:Class ; + rdfs:label "HTTP GET Event" ; + d3f:definition "An event where the HTTP GET method is used to request a representation of the specified resource." ; + rdfs:subClassOf d3f:HTTPRequestEvent . + +d3f:HTTPHeadEvent a owl:Class ; + rdfs:label "HTTP HEAD Event" ; + d3f:definition "An event where the HTTP HEAD method is used to request metadata about the specified resource without the response body." ; + rdfs:subClassOf d3f:HTTPRequestEvent . + +d3f:HTTPOptionsEvent a owl:Class ; + rdfs:label "HTTP OPTIONS Event" ; + d3f:definition "An event where the HTTP OPTIONS method is used to describe the communication options for the target resource." ; + rdfs:subClassOf d3f:HTTPRequestEvent . + +d3f:HTTPPostEvent a owl:Class ; + rdfs:label "HTTP POST Event" ; + d3f:definition "An event where the HTTP POST method is used to submit data to the specified resource, often causing a change in state or side effects on the server." ; + rdfs:subClassOf d3f:HTTPRequestEvent . + +d3f:HTTPPutEvent a owl:Class ; + rdfs:label "HTTP PUT Event" ; + d3f:definition "An event where the HTTP PUT method is used to replace all current representations of the target resource with the request payload." ; + rdfs:subClassOf d3f:HTTPRequestEvent . + +d3f:HTTPResponseEvent a owl:Class ; + rdfs:label "HTTP Response Event" ; + d3f:definition "An event where an HTTP response is sent from a server to a client over an established TCP connection." ; + rdfs:subClassOf d3f:HTTPEvent . + +d3f:HTTPSURL a d3f:URL, + owl:NamedIndividual ; + rdfs:label "HTTPS URL" . + +d3f:HTTPTraceEvent a owl:Class ; + rdfs:label "HTTP TRACE Event" ; + d3f:definition "An event where the HTTP TRACE method is used to perform a message loop-back test along the path to the target resource." ; + rdfs:subClassOf d3f:HTTPRequestEvent . + +d3f:HTTPURL a d3f:URL, + owl:NamedIndividual ; + rdfs:label "HTTP URL" . + +d3f:HardDiskFirmware a owl:Class ; + rdfs:label "Hard Disk Firmware" ; + d3f:definition "Firmware that is installed on a hard disk device." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:PeripheralFirmware ; + skos:altLabel "Hard Drive Firmware" . + +d3f:HardeningEvent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hardening Event" ; + d3f:definition "An event involving actions to strengthen defenses, such as applying patches or implementing secure configurations, reducing attack surfaces, and increasing the difficulty of exploitation by adversaries." ; + d3f:related d3f:Harden ; + rdfs:subClassOf d3f:SecurityEvent . + +d3f:HardwareDeviceBindEvent a owl:Class ; + rdfs:label "Hardware Device Bind Event" ; + d3f:definition "An event where a device is logically bound to a system or process, typically for exclusive use or integration with specific software components." ; + rdfs:subClassOf d3f:HardwareDeviceStateEvent . + +d3f:HardwareDeviceConnectionEvent a owl:Class ; + rdfs:label "Hardware Device Connection Event" ; + d3f:definition "An event representing the physical or logical attachment of a device to a system, enabling its operational functionality." ; + rdfs:subClassOf d3f:HardwareDeviceStateEvent . + +d3f:HardwareDeviceDisabledEvent a owl:Class ; + rdfs:label "Hardware Device Disabled Event" ; + d3f:definition "An event where a device transitions to an inactive or unavailable state, often due to deactivation, failure, or maintenance." ; + rdfs:subClassOf d3f:HardwareDeviceStateEvent . + +d3f:HardwareDeviceDisconnectionEvent a owl:Class ; + rdfs:label "Hardware Device Disconnection Event" ; + d3f:definition "An event representing the removal of a device from a system, ceasing its operational functionality or availability." ; + rdfs:subClassOf d3f:HardwareDeviceStateEvent . + +d3f:HardwareDeviceEnabledEvent a owl:Class ; + rdfs:label "Hardware Device Enabled Event" ; + d3f:definition "An event where a device becomes operational and available for use, typically following initialization, activation, or repair." ; + rdfs:subClassOf d3f:HardwareDeviceStateEvent . + +d3f:HardwareDeviceMoveEvent a owl:Class ; + rdfs:label "Hardware Device Move Event" ; + d3f:definition "An event where a device is relocated or reassigned within a system or network, potentially affecting its operational scope or connectivity." ; + rdfs:subClassOf d3f:HardwareDeviceStateEvent . + +d3f:HardwareDeviceUnbindEvent a owl:Class ; + rdfs:label "Hardware Device Unbind Event" ; + d3f:definition "An event where a device is logically unbound from a system or process, releasing it from exclusive use or integration." ; + rdfs:subClassOf d3f:HardwareDeviceStateEvent . + +d3f:HardwareDeviceUpdateEvent a owl:Class ; + rdfs:label "Hardware Device Update Event" ; + d3f:definition "An event capturing updates or changes to a device's configuration, properties, or state, including firmware updates, reconfigurations, or optimizations." ; + rdfs:subClassOf d3f:HardwareDeviceStateEvent . + +d3f:HeapSegment a owl:Class ; + rdfs:label "Heap Segment" ; + d3f:definition "The heap segment (or free store) is a large pool of memory from which dynamic memory requests of a process are allocated and satisfied." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ProcessSegment . + +d3f:HeterogeneousAsymmetricFeature-basedTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Heterogeneous Asymmetric Feature-based Transfer Learning" ; + d3f:d3fend-id "D3A-HAFBTL" ; + d3f:definition "Asymmetric transformation mapping transforms the source feature space to align with that of the target or the target to that of the source. This, in effect, bridges the feature space gap and reduces the problem into a homogeneous transfer problem when further distribution differences need to be corrected." ; + d3f:kb-article """## References +Wang, Q., Mao, K. Z., Wang, B., & Guan, J. (2017). Big data clustering by hybrid optimization algorithm. Journal of Big Data, 4(1), 25. [Link](https://journalofbigdata.springeropen.com/articles/10.1186/s40537-017-0089-0).""" ; + rdfs:subClassOf d3f:HeterogeneousTransferLearning . + +d3f:HeterogeneousFeature-basedTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Heterogeneous Feature-based Transfer Learning" ; + d3f:d3fend-id "D3A-HFBTL" ; + d3f:definition "Symmetric transformation takes both the source feature space Xs and target feature space Xt and learns feature transformations as to project each onto a common subspace Xc for adaptation purposes. This derived subspace becomes a domain-invariant feature subspace to associate cross-domain data, and in effect, reduces marginal distribution differences." ; + d3f:kb-article """## References +Wang, Q., Mao, K. Z., Wang, B., & Guan, J. (2017). Big data clustering by hybrid optimization algorithm. Journal of Big Data, 4(1), 25. [Link](https://journalofbigdata.springeropen.com/articles/10.1186/s40537-017-0089-0).""" ; + rdfs:subClassOf d3f:HeterogeneousTransferLearning . + +d3f:Higher-orderLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Higher-order Logic" ; + d3f:d3fend-id "D3A-HOL" ; + d3f:definition "Higher-order logic is a form of predicate logic that is distinguished from first-order logic by additional quantifiers and, sometimes, stronger semantics. Higher-order logics with their standard semantics are more expressive, but their model-theoretic properties are less well-behaved than those of first-order logic." ; + d3f:kb-article """## References +1. Higher-order logic. (2023, May 13). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Higher-order_logic)""" ; + d3f:synonym "HOL" ; + rdfs:subClassOf d3f:PredicateLogic . + +d3f:HostConfigurationSensor a owl:Class, + owl:NamedIndividual ; + rdfs:label "Host Configuration Sensor" ; + d3f:definition "Collects the configuration data on an endpoint." ; + d3f:monitors d3f:ApplicationConfiguration, + d3f:OperatingSystemConfiguration ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:OperatingSystemConfiguration ], + [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:ApplicationConfiguration ], + d3f:EndpointSensor . + +d3f:HostGroup a owl:Class, + owl:NamedIndividual ; + rdfs:label "Host Group" ; + d3f:contains d3f:Host ; + d3f:definition "A collection of Hosts used to allow operations such as access control to be applied to the entire group." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Host ], + d3f:AccessControlGroup . + +d3f:Hostname a d3f:DomainName, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Hostname" ; + d3f:definition "In computer networking, a hostname (archaically nodename) is a label that is assigned to a device connected to a computer network and that is used to identify the device in various forms of electronic communication, such as the World Wide Web. Hostnames may be simple names consisting of a single word or phrase, or they may be structured." ; + d3f:identifies d3f:Host ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:Host ], + d3f:Identifier ; + skos:altLabel "Nodename" . + +d3f:HumanInputDeviceFirmware a owl:Class ; + rdfs:label "Human Input Device Firmware" ; + d3f:definition "Firmware that is installed on an HCI device such as a mouse or keyboard." ; + rdfs:seeAlso d3f:Firmware, + ; + rdfs:subClassOf d3f:PeripheralFirmware . + +d3f:Hybrid-basedTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hybrid-based Transfer Learning" ; + d3f:d3fend-id "D3A-HBTL" ; + d3f:definition "This method creates an asymmetric mapping from the target to the source and takes into account bias issues of cross-domain correspondences." ; + d3f:kb-article """## References +Day, O., & Khoshgoftaar, T.M. (2017). A survey on heterogeneous transfer learning. Journal of Big Data, 4(1), 29. [Link](https://doi.org/10.1186/s40537-017-0089-0).""" ; + rdfs:subClassOf d3f:HomogenousTransferLearning . + +d3f:ID3 a owl:Class, + owl:NamedIndividual ; + rdfs:label "ID3" ; + d3f:d3fend-id "D3A-ID3" ; + d3f:definition "ID3 stands for Iterative Dichotomiser 3 and is named such because the algorithm iteratively (repeatedly) dichotomizes(divides) features into two or more groups at each step." ; + d3f:kb-article """## Addtional Consiterations +ID3 is the basis of C4.5, and is best used in natural language processing. + +## References +Decision Trees for Classification: ID3 Algorithm Explained. Towards Data Science. [Link](https://towardsdatascience.com/decision-trees-for-classification-id3-algorithm-explained-89df76e72df1).""" ; + rdfs:subClassOf d3f:DecisionTree . + +d3f:IPPhone a owl:Class ; + rdfs:label "IP Phone" ; + d3f:definition "A VoIP phone or IP phone uses voice over IP technologies for placing and transmitting telephone calls over an IP network, such as the Internet, instead of the traditional public switched telephone network (PSTN). Digital IP-based telephone service uses control protocols such as the Session Initiation Protocol (SIP), Skinny Client Control Protocol (SCCP) or various other proprietary protocols." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:PersonalComputer ; + skos:altLabel "VoIP Phone" . + +d3f:ImportLibraryFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Import Library Function" ; + d3f:definition "Loads an external software library to enable the invocations of its methods." ; + d3f:loads d3f:SharedLibraryFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:loads ; + owl:someValuesFrom d3f:SharedLibraryFile ], + d3f:Subroutine . + +d3f:InputDeviceEvent a owl:Class ; + rdfs:label "Input Device Event" ; + d3f:definition "An event involving human-machine interface devices, such as keyboards, mice, or touchscreens." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:InputDevice ], + d3f:HardwareDeviceEvent . + +d3f:Instance-basedTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Instance-based Transfer Learning" ; + d3f:d3fend-id "D3A-IBTL" ; + d3f:definition "Instance-based transfer learning methods try to reweight the samples in the source domain in an attempt to correct for marginal distribution differences. These reweighted instances are then directly used in the target domain for training." ; + d3f:kb-article """## References +Georgian Impact Blog. (n.d.). Transfer Learning Part 1. [Link](https://medium.com/georgian-impact-blog/transfer-learning-part-1-ed0c174ad6e7#:~:text=Homogeneous%20Transfer%20Learning-,1.,the%20target%20domain%20for%20training).""" ; + rdfs:subClassOf d3f:HomogenousTransferLearning . + +d3f:InstantMessagingClient a owl:Class ; + rdfs:label "Instant Messaging Client" ; + d3f:definition "Client software used to engage in Instant Messaging, a type of online chat that offers real-time text transmission over the Internet. A LAN messenger operates in a similar way over a local area network. Short messages are typically transmitted between two parties, when each user chooses to complete a thought and select \"send\". Some IM applications can use push technology to provide real-time text, which transmits messages character by character, as they are composed. More advanced instant messaging can add file transfer, clickable hyperlinks, Voice over IP, or video chat." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:CollaborativeSoftware . + +d3f:IntegrationTestExecutionTool a owl:Class ; + rdfs:label "Integration Test Execution Tool" ; + d3f:definition "An integration test execution tool automatically performs integration testing. Integration testing (sometimes called integration and testing, abbreviated I&T) is the phase in software testing in which individual software modules are combined and tested as a group." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:TestExecutionTool . + +d3f:InternationalizedDomainName a d3f:DomainName, + owl:NamedIndividual ; + rdfs:label "Internationalized Domain Name" . + +d3f:InternetDNSLookup a owl:Class ; + rdfs:label "Internet DNS Lookup" ; + d3f:definition "An internet Domain Name System (DNS) lookup is a DNS lookup made from a host on a network that is resolved after querying a DNS name server hosted on a different network." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DNSLookup . + +d3f:InternetFileTransferTraffic a owl:Class ; + rdfs:label "Internet File Transfer Traffic" ; + d3f:definition "Internet file transfer network traffic is network traffic related to file transfers between network nodes that crosses a boundary between networks. This includes only network traffic conforming to standard file transfer protocols, not custom transfer protocols." ; + rdfs:subClassOf d3f:FileTransferNetworkTraffic, + d3f:InternetNetworkTraffic . + +d3f:InternetNetwork a owl:Class ; + rdfs:label "Internet Network" ; + d3f:definition "A network of multiple, connected networks. Internetworking is the practice of connecting a computer network with other networks through the use of gateways that provide a common method of routing information packets between the networks. The resulting system of interconnected networks are called an internetwork, or simply an internet. Internetworking is a combination of the words inter (\"between\") and networking; not internet-working or international-network." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Network ; + skos:altLabel "Interconnected Network", + "Internet", + "Internetwork" . + +d3f:InternetPersona a owl:Class ; + rdfs:label "Internet Persona" ; + d3f:definition "A social identity that an Internet user establishes in online communities and websites. It may also be an actively constructed presentation of oneself." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "Online Identity", + "Online Persona", + "Online Personality" . + +d3f:IntervalEstimation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Interval Estimation" ; + d3f:d3fend-id "D3A-IE" ; + d3f:definition "Interval estimation is the use of sample data to estimate an interval of possible values of a parameter of interest." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Interval estimation. [Link](https://en.wikipedia.org/wiki/Interval_estimation)""" ; + rdfs:subClassOf d3f:Estimation . + +d3f:IntranetDNSLookup a owl:Class ; + rdfs:label "Intranet DNS Lookup" ; + d3f:definition "An Intranet Domain Name System (DNS) lookup is a DNS lookup made from a host on a network that is resolved after querying a DNS name server hosted on a that same network." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DNSLookup . + +d3f:IntranetRPCNetworkTraffic a owl:Class ; + rdfs:label "Intranet RPC Network Traffic" ; + d3f:definition "Intranet RPC network traffic is network traffic that does not cross a given network's boundaries and uses a standard remote procedure call (e.g., RFC 1050) protocol." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:IntranetNetworkTraffic, + d3f:RPCNetworkTraffic . + +d3f:IntrusionPreventionSystem a owl:Class ; + rdfs:label "Intrusion Prevention System" ; + d3f:definition """Intrusion prevention systems (IPS), also known as intrusion detection and prevention systems (IDPS), are network security appliances that monitor network or system activities for malicious activity. The main functions of intrusion prevention systems are to identify malicious activity, log information about this activity, report it and attempt to block or stop it. + +Intrusion prevention systems are considered extensions of intrusion detection systems because they both monitor network traffic and/or system activities for malicious activity. The main differences are, unlike intrusion detection systems, intrusion prevention systems are placed in-line and are able to actively prevent or block intrusions that are detected. IPS can take such actions as sending an alarm, dropping detected malicious packets, resetting a connection or blocking traffic from the offending IP address. An IPS also can correct cyclic redundancy check (CRC) errors, defragment packet streams, mitigate TCP sequencing issues, and clean up unwanted transport and network layer options.""" ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:IntrusionDetectionSystem ; + skos:altLabel "IDPS", + "IPS", + "Intrusion Detection and Prevention System" . + +d3f:IsolationEvent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Isolation Event" ; + d3f:definition "An event involving actions to create logical or physical barriers that isolate compromised components, preventing adversary movement and reducing attack surfaces." ; + d3f:related d3f:Isolate ; + rdfs:subClassOf d3f:SecurityEvent . + +d3f:JavaArchive a owl:Class ; + rdfs:label "Java Archive" ; + d3f:definition "A JAR (Java ARchive) is a package file format typically used to aggregate many Java class files and associated metadata and resources (text, images, etc.) into one file for distribution." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ArchiveFile, + d3f:SoftwarePackage . + +d3f:K-CenterClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "K-Center Clustering" ; + d3f:d3fend-id "D3A-KCC" ; + d3f:definition "K-center Clustering is a type of clustering based on an combinatorial optimization methods. It clusters a set of points so as to minimize the maximum intercluster distance." ; + d3f:kb-article """## How it works + +An example K-center Clustering problem is to mimimize the number of points in a set that are necessary so that a every other point in the set is within some fixed distance of those points. For instance, given n cities with specified distances, one wants to build k warehouses in different cities and minimize the maximum distance of a city to a warehouse. + +## Considerations + +- **Scalability**: Exact solutions are NP-hard. However, algorithms + that have been proven effective and create no more than 2x the + optimal set of clusters can run in O(kn) proportional to k*n where + k is the minimum number of clusters and n is the number of data + points being clustered. + +## Key Test Considerations + +- **Unsupervised Learning**: + + - **Number of Clusters**: The Gonzalez (Gon) algorithm guarantees + creating no more than twice the optimal number of clusters, + where the optimal number is the minimum number of clusters to + minimize total distance between representative points in the + clusters [1]. + +- **Cluster Analysis**: + + - **Rand Index and Adjusted Rand Index**: Given ground truth set + of class labels for the data, the Rand Index is a measure of the + similarity between two data clusterings. The Rand Index is the + accuracy of determining if a link belongs within a cluster or + not. A form of the Rand Index may be defined that is adjusted + for the chance grouping of elements, this is the Adjusted Rand + Index [5]. + + - **Adjusted Mutual Information**: Given ground truth set of class + labels for the data, Adjusted Mutual Information corrects the + effect of agreement solely due to chance between clusterings, + similar to the way the Adjusted Rand Index corrects the Rand + Index [6]. + +- **Connection-based Clustering**: + + - **Choice of Distance Metric**: The outcome can vary significantly depending on the chosen distance metric (e.g., Euclidean, Manhattan). + + - **Sensitivity**: Connection-based method can be sensitive to outliers, which might affect the quality of the clusters formed. + +- **K-center Clustering**: + + - **Silhouette Score**: The silhouette score refers to a scoring + method that helps validate the consistency between clusters of + data. The evaluation technique also produces a concise graphical + representation of how well each object appear to have been + classified. It is suited to K-centric Clustering in that it also + works for different metric spaces. + + - **Distance Metric**: The distance measure must be a true metric (see + [2]). Differences in the metric chosen may (e.g., Euclidean,a + Manhattan) affect results significantly. + + - **Sensitivity**: Greedy implementations may be sensitive to + outliers. + +## Platforms, Tools, or Libraries + +N/A. _Note that this algorithm is relatively simple and so it is +usually implemented from scratch by those incorporating this algorithm +into a system._ + +## References + +1. Gonzalez, T.F. (1985). Clustering to Minimize the Maximum Intercluster Distance. Theor. Comput. Sci., 38, 293-306. +[Link](https://www.sciencedirect.com/science/article/pii/0304397585902245?via%3Dihub). + +1. Weisstein, Eric W. (n.d.). "Metric." From MathWorld--A Wolfram Web Resource. [Link](https://mathworld.wolfram.com/Metric.html). + +1. Wikipedia. (8 Aug 2023). Metric k-center [Link](https://en.wikipedia.org/wiki/Metric_k-center). + +1. Wikipedia. (14 Aug 2023). Vertex k-center problem. [Link](https://en.wikipedia.org/wiki/Vertex_k-center_problem). + +1. Wikipedia. (n.d.). Rand Index. [Link](https://en.wikipedia.org/wiki/Rand_index). + +1. Wikipedia. (n.d.). Adjusted Mutual Information. [Link](https://en.wikipedia.org/wiki/Adjusted_mutual_information). + +1. Wikipedia. (1 Aug 2023). Silhouette (clustering). [Link](https://en.wikipedia.org/wiki/Silhouette_(clustering)).""" ; + rdfs:subClassOf d3f:Graph-basedClustering . + +d3f:K-FoldCross-Validation a owl:Class, + owl:NamedIndividual ; + rdfs:label "K-Fold Cross-Validation" ; + d3f:d3fend-id "D3A-KFCV" ; + d3f:definition "Cross-validation is a resampling procedure used to evaluate machine learning models on a limited data sample. The procedure has a single parameter called k that refers to the number of groups that a given data sample is to be split into. As such, the procedure is often called k-fold cross-validation. When a specific value for k is chosen, it may be used in place of k in the reference to the model, such as k=10 becoming 10-fold cross-validation" ; + d3f:kb-article """## References +K-Fold Cross-Validation. Machine Learning Mastery. [Link](https://machinelearningmastery.com/k-fold-cross-validation/#:~:text=Cross%2Dvalidation%20is%20a%20resampling,k%2Dfold%20cross%2Dvalidation).""" ; + rdfs:subClassOf d3f:ResamplingEnsemble . + +d3f:K-NearestNeighbors a owl:Class, + owl:NamedIndividual ; + rdfs:label "K-Nearest Neighbors" ; + d3f:d3fend-id "D3A-KNN" ; + d3f:definition "The k-nearest neighbors algorithm, also known as KNN or k-NN, is a non-parametric, supervised learning classifier, which uses proximity to make classifications or predictions about the grouping of an individual data point." ; + d3f:kb-article """## **How it works** +The goal of the k-nearest neighbor algorithm is to identify the nearest neighbors of a given query point, so that we can assign a class label to that point. To determine which data points are closest to a given query point, the distance between the query point and the other data points will need to be calculated. The distance measures used can vary depending on the data set or implementation and help inform decision boundaries, which query points into different regions. Then, by defining the k-value (the number of neighbors to be checked to determine the classification of a specific query point), the data can be assigned its class label. + +For classification problems, a class label is assigned on the basis of a majority vote—i.e. the label that is most frequently represented around a given data point is used (the term “majority vote” is commonly used in literature, however, the technique is more technically considered “plurality voting”). Regression problems use a similar concept as classification problem, but in this case, the average the k nearest neighbors is taken to make a prediction about a classification. The main distinction here is that classification is used for discrete values, whereas regression is used with continuous ones. + +Unlike other algorithms that explicitly model the problem, such as linear regression, KNN is instance-based. It means that the algorithm doesn't explicitly learn a model. Instead, it memorizes the training instances and uses them as "knowledge" for the prediction phase. It's also worth noting that the KNN algorithm is also part of a family of “lazy learning” models, meaning that it only stores a training dataset versus undergoing a training stage. + +## **Considerations** + +* **Scaling:** Scaling is a problem as KNN is a lazy algorithm and takes up more memory and storage compared to other classification methods. + +* **Implementation and Hyperparameters:** As KNN only requires a k-value and a distance metric, it is often an easy implementation and can adjust will to new training data. + +## Key Test Considerations + +- **Supervised Learning:** + + - **Cross Validation:** As cross validation methods like k-fold, leave-one-out, and stratified cross validation can help validate model performance. However, nuances like pessimism bias in k-fold cross validation or high variability in leave-one-out cross validation may need consideration. + +- **Classification:** + + - **ROC Curve:** A standard technique used to summarize classifier performance over a range of tradeoffs between true and false positives is the Receiver Operating Characteristic (ROC) curve. + + - **Data Imbalance:** Imbalanced data sets where one class significantly outnumbers others, under sampling techniques like SMOTE may be beneficial in sampling minority classes. + +- **K-Nearest Neighbor** + + - **Choice of K:** The number of neighbors, K, affects the decision boundary. A smaller K can lead to a noisy decision boundary, while a large K can smooth it out, but may also blur class distinctions. + + - **K-d Tree:** Exact searching on large datasets can be computationally costly and inefficient. Implementing approximate nearest neighbor algorithms like the K-d tree algorithm. + + - **Dimensionality:** KNN does not perform well while using high-dimensional data and can be sensitive to irrelevant features which can lead to overfitting. + + - **Distance Metric:** Choosing the appropriate distance metric (Euclidean, Manhattan, MinKowski, Hamming etc.) is essential, based on the nature of the data. + +## **References** +1. IBM. K-Nearest Neighbors Algorithm. [Link](https://www.ibm.com/topics/knn?mhsrc=ibmsearch_a&mhq=k-nearest%20neighbors%20). +2. Muja, M., & Lowe, D. G. (2014). Scalable nearest neighbor algorithms for high dimensional data. IEEE Transactions on Pattern Analysis and Machine Intelligence. [Link]( https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=6809191). +3. Chawla, N. V., Bowyer, K. W., Hall, L. O., & Kegelmeyer, W. P. (2002). SMOTE: synthetic minority over-sampling technique. Journal of artificial intelligence research, 16, 321-357. [Link]( https://www.jair.org/index.php/jair/article/view/10302/24590). +4. Kohavi, R. (1995). A study of cross-validation and bootstrap for accuracy estimation and model selection. Proceedings of the 14th international joint conference on Artificial intelligence . [Link]( https://www.ijcai.org/Proceedings/95-2/Papers/016.pdf).""" ; + rdfs:subClassOf d3f:Classification . + +d3f:K-meansClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "K-means Clustering" ; + d3f:d3fend-id "D3A-KMC" ; + d3f:definition "K-means algorithm identifies k number of centroids, and then allocates every data point to the nearest cluster, while keeping the centroids as small as possible." ; + d3f:kb-article """## References +Towards Data Science. (n.d.). Understanding K-means Clustering in Machine Learning. [Link](https://towardsdatascience.com/understanding-k-means-clustering-in-machine-learning-6a6e67336aa1)""" ; + rdfs:subClassOf d3f:Centroid-basedClustering . + +d3f:KendallsRankCorrelationCoefficient a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kendall's Rank Correlation Coefficient" ; + d3f:d3fend-id "D3A-KRCC" ; + d3f:definition "Kendall's $\\\\tau$ between and is given by $(n_c - n_d) / \\\\sqrt((n_c+n_d+n_x)(n_c+n_d+n_y)$, where is the number of concordant pairs of observations, is the number of discordant pairs, is the number of ties involving only the variable, and is the number of ties involving only the variable.\" ;" ; + d3f:kb-article """## References +1. Wolfram Research. (2012). KendallTau. Wolfram Language function. [Link](https://reference.wolfram.com/language/ref/KendallTau.html) +1. Kendall's Tau. (2023, May 23). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Kendall_rank_correlation_coefficient]\"\"\",""" ; + d3f:synonym "Kendall's Tau Coefficient" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:RankCorrelationCoefficient . + +d3f:KerberosTicketGrantingServiceTicket a owl:Class ; + rdfs:label "Kerberos Ticket Granting Service Ticket" ; + d3f:definition "A Kerberos ticket-granting service (TGS) ticket is given in response to requesting a Kerberos TGS request." ; + rdfs:subClassOf d3f:KerberosTicket ; + skos:altLabel "TGS Ticket" . + +d3f:KerberosTicketGrantingTicketAccount a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kerberos Ticket Granting Ticket Account" ; + d3f:creates d3f:KerberosTicketGrantingTicket ; + d3f:definition "KRBTGT is an account used by Key Distribution Center (KDC) service to issue Ticket Granting Tickets (TGTs) as part of the Kerberos authentication protocol." ; + d3f:synonym "krbtgt" ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:KerberosTicketGrantingTicket ], + d3f:ServiceAccount . + +d3f:KernelAPISensor a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kernel API Sensor" ; + d3f:definition "Monitors system calls (operating system api functions)." ; + d3f:monitors d3f:SystemCall ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:SystemCall ], + d3f:EndpointSensor . + +d3f:KernelModuleLoadEvent a owl:Class ; + rdfs:label "Kernel Module Load Event" ; + d3f:definition "An event representing the loading of a kernel module, such as a device driver or dynamically linked extension, into the operating system kernel to extend or modify its capabilities." ; + rdfs:subClassOf d3f:KernelModuleEvent . + +d3f:KernelModuleUnloadEvent a owl:Class ; + rdfs:label "Kernel Module Unload Event" ; + d3f:definition "An event representing the removal of a kernel module from the operating system kernel, deallocating resources and potentially altering system functionality." ; + rdfs:subClassOf d3f:KernelModuleEvent . + +d3f:KioskComputer a owl:Class ; + rdfs:label "Kiosk Computer" ; + d3f:definition "An interactive kiosk is a computer terminal featuring specialized hardware and software that provides access to information and applications for communication, commerce, entertainment, or education. Early interactive kiosks sometimes resembled telephone booths, but have been embraced by retail, food service and hospitality to improve customer service and streamline operations. Interactive kiosks are typically placed in high foot traffic settings such as shops, hotel lobbies or airports." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:SharedComputer ; + skos:altLabel "Interactive Kiosk" . + +d3f:LDIFRecord a d3f:UserAccount, + owl:NamedIndividual ; + rdfs:label "LDIF Record" . + +d3f:LaptopComputer a owl:Class ; + rdfs:label "Laptop Computer" ; + d3f:definition "A laptop computer (also laptop), is a small, portable personal computer (PC) with a \"clamshell\" form factor, typically having a thin LCD or LED computer screen mounted on the inside of the upper lid of the clamshell and an alphanumeric keyboard on the inside of the lower lid. The clamshell is opened up to use the computer. Laptops are folded shut for transportation, and thus are suitable for mobile use. Its name comes from lap, as it was deemed to be placed on a person's lap when being used. Although originally there was a distinction between laptops and notebooks (the former being bigger and heavier than the latter), as of 2014, there is often no longer any difference. Today, laptops are commonly used in a variety of settings, such as at work, in education, for playing games, web browsing" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:PersonalComputer ; + skos:altLabel "Laptop", + "Notebook" . + +d3f:LevenshteinMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Levenschtein Matching" ; + d3f:d3fend-id "D3A-LM" ; + d3f:definition "The Levenshtein distance (LD) is a metric for measuring the differences between two sequences - or strings. Informally, the LD is the number of individual edits one would have to make to turn one sequence into another." ; + d3f:kb-article """## References +1. Navarro, G. (2001). A guided tour to approximate string matching. _ACM Computing Surveys_, 33(1), 31-88. [Link](https://doi.org/10.1145/375360.375365)""" ; + d3f:synonym "Edit Distance" ; + rdfs:subClassOf d3f:ApproximateStringMatching . + +d3f:LinearClassifier a owl:Class, + owl:NamedIndividual ; + rdfs:label "Linear Classifier" ; + d3f:d3fend-id "D3A-LC" ; + d3f:definition "A linear classifier is a model that makes a decision to categories a set of data points to a discrete class based on a linear combination of its explanatory variables" ; + d3f:kb-article """## References +A Look at the Maths Behind Linear Classification. Towards Data Science. [Link](https://towardsdatascience.com/a-look-at-the-maths-behind-linear-classification-166e99a9e5fb).""" ; + rdfs:subClassOf d3f:Classification . + +d3f:LinearLogicProgramming a owl:Class, + owl:NamedIndividual ; + rdfs:label "Linear Logic Programming" ; + d3f:d3fend-id "D3A-LLP" ; + d3f:definition "Linear logic programming is a form of logic programming that uses linear logic, that is, it emphasizes the use of formulas as resources." ; + d3f:kb-article """## References +1. Cosmo, R. and Miller D. (2019, May 24). _Linear logic_. Stanford Encyclopedia of Philosophy. [Link](https://plato.stanford.edu/entries/logic-linear/#LinLogComSci) +2. Linear logic programming. (2023, May 16). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Logic_programming#Linear_logic_programming)""" ; + rdfs:subClassOf d3f:LogicProgramming . + +d3f:LinearRegressionLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Linear Regression Learning" ; + d3f:d3fend-id "D3A-LRL" ; + d3f:definition "A supervised learning method that builds a linear regression model using training data." ; + d3f:kb-article """## References +- Gawali, Suvarna. “Linear Regression Algorithm to Make Predictions Easily.” Analytics Vidhya, 22 July 2022, https://www.analyticsvidhya.com/blog/2021/06/linear-regression-in-machine-learning/. +- Nau, Robert. “Statistical Forecasting: Notes On Regression and Time Series Analysis.” Introduction to Linear Regression Analysis, Duke University Fuqua School of Business, 18 Aug. 2020, https://people.duke.edu/~rnau/regintro.htm. +- Ng, Ritchie. “Evaluating a Linear Regression Model.” Ritchieng.github.io, 8 Jan. 2023, https://www.ritchieng.com/machine-learning-evaluate-linear-regression-model/. +- Bochkarev, Alexei. "A New Typology Design of Performance Metrics to Measure Errors in Machine Learning Regression Algorithms", 2019, https://www.researchgate.net/publication/330661543_A_New_Typology_Design_of_Performance_Metrics_to_Measure_Errors_in_Machine_Learning_Regression_Algorithms.""" ; + rdfs:seeAlso d3f:LinearRegression ; + rdfs:subClassOf d3f:RegressionAnalysisLearning . + +d3f:LinuxClone a owl:Class ; + rdfs:label "Linux Clone" ; + d3f:definition "Creates a child process and provides more precise control over the data shared between the parent and child processes" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateProcess . + +d3f:LinuxClone3 a owl:Class ; + rdfs:label "Linux Clone3" ; + d3f:definition """Creates a child process and provides more precise control over the data shared between the parent and child processes. + +Newer system call.""" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateProcess . + +d3f:LinuxClone3ArgumentCLONE_THREAD a owl:Class ; + rdfs:label "Linux Clone3 Argument CLONE_THREAD" ; + d3f:definition "A flag parameter to the Clone3 syscall. If set, the child is placed in the same thread group as the calling process." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateThread . + +d3f:LinuxCloneArgumentCLONE_THREAD a owl:Class ; + rdfs:label "Linux Clone Argument CLONE_THREAD" ; + d3f:definition "A flag parameter to the Clone syscall. If set, the child is placed in the same thread group as the calling process." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateThread . + +d3f:LinuxConnect a owl:Class ; + rdfs:label "Linux Connect" ; + d3f:definition "Initiate a connection on a socket." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIConnectSocket . + +d3f:LinuxCreat a owl:Class ; + rdfs:label "Linux Creat" ; + d3f:definition "Equivalent to calling Linux Open with flags equal to O_CREAT|O_WRONLY|O_TRUNC." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateFile . + +d3f:LinuxDeleteModule a owl:Class ; + rdfs:label "Linux Delete Module" ; + d3f:definition "Attempts to remove the unused loadable module entry identified by name. If the module has an exit function, then that function is executed before unloading the module." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIUnloadModule . + +d3f:LinuxELFFile32bit a d3f:ExecutableBinary, + owl:NamedIndividual ; + rdfs:label "Linux ELF File 32bit" ; + d3f:definition "test" . + +d3f:LinuxELFFile64bit a d3f:ExecutableBinary, + owl:NamedIndividual ; + rdfs:label "Linux ELF File 64bit" . + +d3f:LinuxExecve a owl:Class ; + rdfs:label "Linux Execve" ; + d3f:definition "Executes a program by replacing the calling process with a new program, with newly initialized stack, heap, and (initialized and uninitialized) data segments. The PID stays the same." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIExec . + +d3f:LinuxExecveat a owl:Class ; + rdfs:label "Linux Execveat" ; + d3f:definition "Execute program relative to a directory file descriptor. Behavior is similar to Linux Execve." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIExec . + +d3f:LinuxFork a owl:Class ; + rdfs:label "Linux Fork" ; + d3f:definition "Creates a child process with unique PID but retains parent PID as Parent Process Identifier (PPID)" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateProcess . + +d3f:LinuxInitModule a owl:Class ; + rdfs:label "Linux Init Module" ; + d3f:definition "Loads an ELF image into kernel space, performs any necessary symbol relocations, initializes module parameters to values provided by the caller, and then runs the module's init function." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPILoadModule . + +d3f:LinuxKillArgumentSIGKILL a owl:Class ; + rdfs:label "Linux Kill Argument SIGKILL" ; + d3f:definition "Send SIGKILL signal to a process." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPITerminateProcess . + +d3f:LinuxMmap a owl:Class ; + rdfs:label "Linux Mmap" ; + d3f:definition "Map files or devices into memory." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIAllocateMemory . + +d3f:LinuxMmap2 a owl:Class ; + rdfs:label "Linux Mmap2" ; + d3f:definition "Map files or devices into memory." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIAllocateMemory . + +d3f:LinuxMunmap a owl:Class ; + rdfs:label "Linux Munmap" ; + d3f:definition "Unmap files or devices from memory." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIFreeMemory . + +d3f:LinuxOpenArgumentO_CREAT a owl:Class ; + rdfs:label "Linux Open Argument O_CREAT" ; + d3f:definition "Create a regular file." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateFile . + +d3f:LinuxOpenArgumentO_RDONLY-O_WRONLY-O_RDWR a owl:Class ; + rdfs:label "Linux Open Argument O_RDONLY, O_WRONLY, O_RDWR" ; + d3f:definition "Opens a file specified by pathname." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIOpenFile . + +d3f:LinuxOpenAt2ArgumentO_CREAT a owl:Class ; + rdfs:label "Linux OpenAt2 Argument O_CREAT" ; + d3f:definition "Create a regular file. Extension of Linux Openat." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateFile . + +d3f:LinuxOpenAt2ArgumentO_RDONLY-O_WRONLY-O_RDWR a owl:Class ; + rdfs:label "Linux OpenAt2 Argument O_RDONLY, O_WRONLY, O_RDWR" ; + d3f:definition "Extension of Linux Openat." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIOpenFile . + +d3f:LinuxOpenAtArgumentO_CREAT a owl:Class ; + rdfs:label "Linux OpenAt Argument O_CREAT" ; + d3f:definition "Create a regular file. Same functionality as Linux Open but slight differences in parameter." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateFile . + +d3f:LinuxOpenAtArgumentO_RDONLY-O_WRONLY-O_RDWR a owl:Class ; + rdfs:label "Linux OpenAt Argument O_RDONLY, O_WRONLY, O_RDWR" ; + d3f:definition "Same functionality as Linux Open but slight differences in parameter." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIOpenFile . + +d3f:LinuxPauseProcess a owl:Class ; + rdfs:label "Linux Pause Process" ; + d3f:definition "Causes the calling process to sleep until a signal is delivered that either terminates the process or causes the invocation of a signal-catching function." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPISuspendProcess . + +d3f:LinuxPauseThread a owl:Class ; + rdfs:label "Linux Pause Thread" ; + d3f:definition "Causes the calling thread to sleep until a signal is delivered that either terminates the thread or causes the invocation of a signal-catching function." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPISuspendThread . + +d3f:LinuxProcess a d3f:Process, + owl:NamedIndividual ; + rdfs:label "Linux Process" . + +d3f:LinuxPtraceArgumentPTRACEATTACH a owl:Class ; + rdfs:label "Linux Ptrace Argument PTRACE_ATTACH" ; + d3f:definition "Attach to the process specified in pid, making it a tracee of the calling process." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIAccessProcess . + +d3f:LinuxPtraceArgumentPTRACECONT a owl:Class ; + rdfs:label "Linux Ptrace Argument PTRACE_CONT" ; + d3f:definition "Restart the stopped tracee process." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIResumeProcess . + +d3f:LinuxPtraceArgumentPTRACEGETREGS a owl:Class ; + rdfs:label "Linux Ptrace Argument PTRACE_GETREGS" ; + d3f:definition "Copy the tracee's general-purpose or floating-point registers, respectively, to the address data in the tracer." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPISaveRegisters . + +d3f:LinuxPtraceArgumentPTRACEINTERRUPT a owl:Class ; + rdfs:label "Linux Ptrace Argument PTRACE_INTERRUPT" ; + d3f:definition "Stops a tracee." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPISuspendProcess . + +d3f:LinuxPtraceArgumentPTRACEPEEKTEXT a owl:Class ; + rdfs:label "Linux Ptrace Argument PTRACE_PEEKTEXT" ; + d3f:definition "Read a word at the address addr in the tracee's memory, returning the word as the result of the ptrace() call." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIReadMemory . + +d3f:LinuxPtraceArgumentPTRACEPOKETEXT a owl:Class ; + rdfs:label "Linux Ptrace Argument PTRACE_POKETEXT" ; + d3f:definition "Copy the word data to the address addr in the tracee's memory." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIWriteMemory . + +d3f:LinuxPtraceArgumentPTRACESETREGS a owl:Class ; + rdfs:label "Linux Ptrace Argument PTRACE_SETREGS" ; + d3f:definition "Modify the tracee's general-purpose or floating-point registers, respectively, from the address data in the tracer." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPISetRegisters . + +d3f:LinuxPtraceArgumentPTRACE_DETACH a owl:Class ; + rdfs:label "Linux Ptrace Argument PTRACE_DETACH" ; + d3f:definition "Restart the stopped tracee as for PTRACE_CONT, but first detach from it." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIResumeProcess . + +d3f:LinuxPtraceArgumentPTRACE_TRACEME a owl:Class ; + rdfs:label "Linux Ptrace Argument PTRACE_TRACEME" ; + d3f:definition "Indicates that the process is to be traced by its parent." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPITraceProcess . + +d3f:LinuxRead a owl:Class ; + rdfs:label "Linux Read" ; + d3f:definition "Read from a file descriptor." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIReadFile . + +d3f:LinuxReadv a owl:Class ; + rdfs:label "Linux Readv" ; + d3f:definition "Read data into multiple buffers." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIReadFile . + +d3f:LinuxRename a owl:Class ; + rdfs:label "Linux Rename" ; + d3f:definition "Change the name or location of a file" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIMoveFile . + +d3f:LinuxRenameat a owl:Class ; + rdfs:label "Linux Renameat" ; + d3f:definition "Change the name or location of a file. Different parameter handling than Linux Rename." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIMoveFile . + +d3f:LinuxRenameat2 a owl:Class ; + rdfs:label "Linux Renameat2" ; + d3f:definition "Change the name or location of a file. Additional flags argument." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIMoveFile . + +d3f:LinuxSocket a owl:Class ; + rdfs:label "Linux Socket" ; + d3f:definition "Create an endpoint for communication." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateSocket . + +d3f:LinuxSocketcallArgumentSYS_CONNECT a owl:Class ; + rdfs:label "Linux Socketcall Argument SYS_CONNECT" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIConnectSocket . + +d3f:LinuxSocketcallArgumentSYS_SOCKET a owl:Class ; + rdfs:label "Linux Socketcall Argument SYS_SOCKET" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateSocket . + +d3f:LinuxTime a owl:Class ; + rdfs:label "Linux Time" ; + d3f:definition "Get time in seconds." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIGetSystemTime . + +d3f:LinuxUnlink a owl:Class ; + rdfs:label "Linux Unlink" ; + d3f:definition "Delete a name and possibly the file it refers to." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIDeleteFile . + +d3f:LinuxUnlinkat a owl:Class ; + rdfs:label "Linux Unlinkat" ; + d3f:definition "Delete a name and possibly the file it refers to. Different parameter handling than Linux Unlink" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIDeleteFile . + +d3f:LinuxVfork a owl:Class ; + rdfs:label "Linux Vfork" ; + d3f:definition "Create child process that temp suspends parent process until it terminates" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPICreateProcess . + +d3f:LinuxWrite a owl:Class ; + rdfs:label "Linux Write" ; + d3f:definition "Write to a file descriptor." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIWriteFile . + +d3f:LinuxWritev a owl:Class ; + rdfs:label "Linux Writev" ; + d3f:definition "Write data into multiple buffers." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPIWriteFile . + +d3f:Linux_Exit a owl:Class ; + rdfs:label "Linux _Exit" ; + d3f:definition "Terminate the calling process." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OSAPITerminateProcess . + +d3f:LoadLibraryEvent a owl:Class ; + rdfs:label "Load Library Event" ; + d3f:definition "An event where a process dynamically loads a library or module into its memory space, extending its capabilities." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:SharedLibraryFile ], + d3f:ProcessEvent . + +d3f:LocalAuthenticationService a owl:Class ; + rdfs:label "Local Authentication Service" ; + d3f:definition "A local authentication service running on a host can authenticate a user logged into just that local host computer." ; + rdfs:subClassOf d3f:AuthenticationService, + d3f:SystemServiceSoftware . + +d3f:LocalAuthorizationService a owl:Class ; + rdfs:label "Local Authorization Service" ; + d3f:definition "A local authorization service running on a host can authorize a user logged into just that local host computer." ; + rdfs:subClassOf d3f:AuthorizationService, + d3f:SystemServiceSoftware . + +d3f:LogMessageFunction a owl:Class ; + rdfs:label "Log Message Function" ; + d3f:definition "Produces an entry in a log." ; + rdfs:subClassOf d3f:Subroutine . + +d3f:LogististicRegressionLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Logistic Regression Learning" ; + d3f:d3fend-id "D3A-LRL" ; + d3f:definition "A supervised learning method that builds a logistic regression model using training data." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Logistic regression. [Link](https://en.wikipedia.org/wiki/Logistic_regression)""" ; + rdfs:seeAlso d3f:LogisticRegression ; + rdfs:subClassOf d3f:RegressionAnalysisLearning . + +d3f:LogoffEvent a owl:Class ; + rdfs:label "Logoff Event" ; + d3f:definition "An authentication event where an active session is conclusively terminated, resulting in the cessation of access and deallocation of resources associated with the session, ensuring that the connection to the system, application, or resource no longer exists." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:preceded-by ; + owl:someValuesFrom d3f:LogonEvent ], + [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Session ], + d3f:AuthenticationEvent . + +d3f:LogonUser a owl:Class, + owl:NamedIndividual ; + rdfs:label "Logon User" ; + d3f:authenticates d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:UserAccount ], + d3f:SystemCall . + +d3f:LongShort-termMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Long Short-term Memory" ; + d3f:d3fend-id "D3A-LSTM" ; + d3f:definition "Unlike standard feedforward neural networks, LSTM has feedback connections. Such a recurrent neural network (RNN) can process not only single data points (such as images), but also entire sequences of data (such as speech or video). This characteristic makes LSTM networks ideal for processing and predicting data" ; + d3f:kb-article """## References +Wikipedia. (2021, September 29). Long short-term memory. [Link](https://en.wikipedia.org/wiki/Long_short-term_memory)""" ; + rdfs:subClassOf d3f:RecurrentNeuralNetwork . + +d3f:LuaScriptFile a d3f:ExecutableScript, + owl:NamedIndividual ; + rdfs:label "Lua Script File" . + +d3f:M1013 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Application Developer Guidance" ; + d3f:d3fend-comment "A future release of D3FEND will define a taxonomy of Source Code Hardening Techniques." . + +d3f:M1015 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Active Directory Configuration" ; + d3f:d3fend-comment "M1015 scope is broad, touches on an wide variety of techniques in D3FEND." ; + d3f:related d3f:AuthenticationCacheInvalidation, + d3f:DomainTrustPolicy, + d3f:UserAccountPermissions . + +d3f:M1016 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Vulnerability Scanning" ; + d3f:d3fend-comment "Future D3FEND releases will model the scanning and inventory domains." . + +d3f:M1017 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "User Training" ; + d3f:d3fend-comment "Modeling user training is outside the scope of D3FEND." . + +d3f:M1018 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "User Account Management" ; + d3f:related d3f:LocalFilePermissions, + d3f:SystemCallFiltering, + d3f:SystemConfigurationPermissions . + +d3f:M1019 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Threat Intelligence Program" ; + d3f:d3fend-comment "Establishing and running a Threat Intelligence Program is outside the scope of D3FEND." . + +d3f:M1020 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "SSL/TLS Inspection" ; + d3f:d3fend-comment "D3FEND models this as an infrastructure dependency to support D3-NTA." ; + d3f:related d3f:NetworkTrafficAnalysis . + +d3f:M1021 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Restrict Web-Based Content" ; + d3f:d3fend-comment "M1021 scope is broad, touches on an wide variety of techniques in d3fend." ; + d3f:related d3f:DNSAllowlisting, + d3f:DNSDenylisting, + d3f:FileAnalysis, + d3f:InboundTrafficFiltering, + d3f:NetworkTrafficAnalysis, + d3f:OutboundTrafficFiltering, + d3f:URLAnalysis . + +d3f:M1022 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Restrict File and Directory Permissions" ; + d3f:related d3f:LocalFilePermissions . + +d3f:M1024 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Restrict Registry Permission" ; + d3f:related d3f:SystemConfigurationPermissions . + +d3f:M1025 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Privileged Process Integrity" ; + d3f:related d3f:BootloaderAuthentication, + d3f:DriverLoadIntegrityChecking, + d3f:ProcessSegmentExecutionPrevention, + d3f:SystemCallFiltering . + +d3f:M1026 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Privileged Account Management" ; + d3f:related d3f:DomainAccountMonitoring, + d3f:LocalAccountMonitoring, + d3f:StrongPasswordPolicy . + +d3f:M1027 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Password Policies" ; + d3f:related d3f:One-timePassword, + d3f:StrongPasswordPolicy . + +d3f:M1028 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Operating System Configuration" ; + d3f:related d3f:PlatformHardening . + +d3f:M1029 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Remote Data Storage" ; + d3f:d3fend-comment "IT disaster recovery plans are outside the current scope of D3FEND." . + +d3f:M1030 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Network Segmentation" ; + d3f:related d3f:BroadcastDomainIsolation, + d3f:EncryptedTunnels, + d3f:InboundSessionVolumeAnalysis, + d3f:InboundTrafficFiltering . + +d3f:M1031 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Network Intrusion Prevention" ; + d3f:related d3f:InboundTrafficFiltering, + d3f:NetworkTrafficAnalysis, + d3f:OutboundTrafficFiltering . + +d3f:M1032 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Multi-factor Authentication" ; + d3f:related d3f:Multi-factorAuthentication . + +d3f:M1033 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Limit Software Installation" ; + d3f:related d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting . + +d3f:M1034 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Limit Hardware Installation" ; + d3f:related d3f:IOPortRestriction . + +d3f:M1035 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Limit Access to Resource Over Network" ; + d3f:related d3f:NetworkIsolation . + +d3f:M1036 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Account Use Policies" ; + d3f:d3fend-comment "D3-AZET may be related (is potentially related though not called out in ATT&CK definition.)" ; + d3f:related d3f:AccountLocking, + d3f:AuthenticationCacheInvalidation, + d3f:AuthenticationEventThresholding . + +d3f:M1037 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Filter Network Traffic" ; + d3f:related d3f:NetworkIsolation . + +d3f:M1038 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Execution Prevention" ; + d3f:related d3f:DriverLoadIntegrityChecking, + d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting, + d3f:ProcessSegmentExecutionPrevention . + +d3f:M1039 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Environment Variable Permissions" ; + d3f:related d3f:ApplicationConfigurationHardening, + d3f:SystemFileAnalysis . + +d3f:M1040 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Behavior Prevention on Endpoint" ; + d3f:related d3f:AuthenticationEventThresholding, + d3f:AuthorizationEventThresholding, + d3f:JobFunctionAccessPatternAnalysis, + d3f:ResourceAccessPatternAnalysis, + d3f:SessionDurationAnalysis, + d3f:UserDataTransferAnalysis, + d3f:UserGeolocationLogonPatternAnalysis, + d3f:WebSessionActivityAnalysis . + +d3f:M1041 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Encrypt Sensitive Information" ; + d3f:related d3f:DiskEncryption, + d3f:EncryptedTunnels, + d3f:FileEncryption, + d3f:MessageEncryption . + +d3f:M1042 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Disable or Remove Feature or Program" ; + d3f:related d3f:ApplicationConfigurationHardening, + d3f:ExecutableDenylisting, + d3f:SystemCallFiltering . + +d3f:M1043 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Credential Access Protection" ; + d3f:related d3f:Hardware-basedProcessIsolation . + +d3f:M1044 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Restrict Library Loading" ; + d3f:d3fend-comment "D3-SCF is one possible way to filter library loading." ; + d3f:related d3f:SystemCallFiltering . + +d3f:M1045 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Code Signing" ; + d3f:related d3f:DriverLoadIntegrityChecking, + d3f:ExecutableAllowlisting, + d3f:ServiceBinaryVerification . + +d3f:M1046 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Boot Integrity" ; + d3f:related d3f:BootloaderAuthentication, + d3f:TPMBootIntegrity . + +d3f:M1047 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Audit" ; + d3f:d3fend-comment "M1047 scope is broad, touches on an wide variety of techniques in d3fend." ; + d3f:related d3f:DomainAccountMonitoring, + d3f:LocalAccountMonitoring, + d3f:SystemFileAnalysis . + +d3f:M1048 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Application Isolation and Sandboxing" ; + d3f:d3fend-comment "\"Sandboxing\" is often used to describe a detection environment which includes some forms of analysis (see D3-DA.)\" Many forms of isolation (e.g., quarantining) are more static in nature and simply limit software's access to system resources." ; + d3f:related d3f:DynamicAnalysis, + d3f:Hardware-basedProcessIsolation, + d3f:SystemCallFiltering . + +d3f:M1049 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Antivirus/Antimalware" ; + d3f:d3fend-comment "Process Analysis and subclasses." ; + d3f:related d3f:FileContentRules, + d3f:FileHashing, + d3f:ProcessAnalysis . + +d3f:M1050 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Exploit Protection" ; + d3f:related d3f:ApplicationHardening, + d3f:ExceptionHandlerPointerValidation, + d3f:InboundTrafficFiltering, + d3f:ShadowStackComparisons . + +d3f:M1051 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Update Software" ; + d3f:related d3f:SoftwareUpdate . + +d3f:M1052 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "User Account Control" ; + d3f:related d3f:SystemCallFiltering . + +d3f:M1053 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Data Backup" ; + d3f:d3fend-comment "Comprehensive IT disaster recovery plans are outside the current scope of D3FEND." . + +d3f:M1054 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Software Configuration" ; + d3f:related d3f:ApplicationConfigurationHardening, + d3f:CertificatePinning . + +d3f:M1055 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Do Not Mitigate" . + +d3f:M1056 a d3f:ATTACKEnterpriseMitigation, + owl:NamedIndividual ; + rdfs:label "Pre-compromise" ; + d3f:related d3f:DecoyEnvironment, + d3f:DecoyObject . + +d3f:MACAddress a owl:Class, + owl:NamedIndividual ; + rdfs:label "MAC Address" ; + d3f:definition "A media access control address (MAC address) is a unique identifier assigned to a network interface controller (NIC) for use as a network address in communications within a network segment." ; + d3f:identifies d3f:NetworkInterfaceCard ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:NetworkInterfaceCard ], + d3f:Identifier . + +d3f:MSGEmailFile a d3f:Email, + owl:NamedIndividual ; + rdfs:label "MSG Email File" . + +d3f:Maximum-marginLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Maximum-margin Learning" ; + d3f:d3fend-id "D3A-MML" ; + d3f:definition "Maximum-margin classifiers attempt to maximize the distance between the given data points and the decision boundary" ; + d3f:kb-article """## References +Engelen, S., & Hoos, H. (2020). A survey on semi-supervised learning. Machine Learning, 109(2), 299-337. [Link](https://link.springer.com/article/10.1007/s10994-019-05855-6). + +Support Vector Machines for Machine Learning. [Link](https://machinelearningmastery.com/support-vector-machines-for-machine-learning/#:~:text=The%20distance%20between%20the%20line,called%20the%20Maximal%2DMargin%20hyperplane.)""" ; + rdfs:subClassOf d3f:IntrinsicallySemi-supervisedLearning . + +d3f:MediaGeneration a owl:Class ; + rdfs:label "Media Generation" ; + rdfs:subClassOf d3f:Generation ; + owl:disjointWith d3f:Simulation . + +d3f:MediaServer a owl:Class ; + rdfs:label "Media Server" ; + d3f:definition "A media server is a computer appliance or an application software that stores digital media (video, audio or images) and makes it available over a network. Media servers range from servers that provide video on demand to smaller personal computers or NAS (Network Attached Storage) for the home." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Server . + +d3f:MemoryAllocationEvent a owl:Class ; + rdfs:label "Memory Allocation Event" ; + d3f:definition "An event representing the allocation of memory resources to a process, providing it with the capacity to store data or execute instructions." ; + rdfs:subClassOf d3f:MemoryEvent . + +d3f:MemoryAllocationFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Allocation Function" ; + d3f:definition "Reserves memory for a running process to use." ; + d3f:invokes d3f:AllocateMemory ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:AllocateMemory ], + d3f:Subroutine . + +d3f:MemoryDeletionEvent a owl:Class ; + rdfs:label "Memory Deletion Event" ; + d3f:definition "An event marking the release or deallocation of memory resources, reclaiming them for reuse within the system." ; + rdfs:subClassOf d3f:MemoryEvent . + +d3f:MemoryDeviceEvent a owl:Class ; + rdfs:label "Memory Device Event" ; + d3f:definition "An event describing activity in primary storage devices, such as DRAM or SRAM memory initialization, reconfiguration, or failures." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:PrimaryStorage ], + d3f:HardwareDeviceEvent . + +d3f:MemoryMapEvent a owl:Class ; + rdfs:label "Memory Map Event" ; + d3f:definition "An event representing the mapping of memory regions into a process's virtual address space, enabling efficient access to shared or reserved memory." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:VirtualMemorySpace ], + d3f:MemoryEvent . + +d3f:MemoryModificationEvent a owl:Class ; + rdfs:label "Memory Modification Event" ; + d3f:definition "An event where a process modifies allocated memory, potentially altering its content, behavior, or state." ; + rdfs:subClassOf d3f:MemoryEvent . + +d3f:MemoryPool a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Pool" ; + d3f:contains d3f:MemoryBlock ; + d3f:definition "Memory pools, also called fixed-size blocks allocation, is the use of pools for memory management… preallocating a number of memory blocks with the same size called the memory pool. The application can allocate, access, and free blocks represented by handles at run time." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:MemoryBlock ], + d3f:MemoryExtent . + +d3f:MemoryReadEvent a owl:Class ; + rdfs:label "Memory Read Event" ; + d3f:definition "An event where a process retrieves data from a specific memory address, either from its own allocated space or that of another process." ; + rdfs:subClassOf d3f:MemoryEvent . + +d3f:MemoryWriteEvent a owl:Class ; + rdfs:label "Memory Write Event" ; + d3f:definition "An event where a process writes data to a memory address, storing new information or updating existing content." ; + rdfs:subClassOf d3f:MemoryEvent . + +d3f:Microcode a owl:Class ; + rdfs:label "Microcode" ; + d3f:definition "Microcode is a computer hardware technique that interposes a layer of organization between the CPU hardware and the programmer-visible instruction set architecture of the computer. As such, the microcode is a layer of hardware-level instructions that implement higher-level machine code instructions or internal state machine sequencing in many digital processing elements." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Firmware . + +d3f:MicrosoftWordDOCBFile a d3f:DocumentFile, + owl:NamedIndividual ; + rdfs:label "Microsoft Word DOCB File" . + +d3f:MicrosoftWordDOCFile a d3f:DocumentFile, + owl:NamedIndividual ; + rdfs:label "Microsoft Word DOC File" . + +d3f:MicrosoftWordDOCMFile a d3f:DocumentFile, + owl:NamedIndividual ; + rdfs:label "Microsoft Word DOCM File" . + +d3f:MicrosoftWordDOCXFile a d3f:DocumentFile, + owl:NamedIndividual ; + rdfs:label "Microsoft Word DOCX File" . + +d3f:MicrosoftWordDOTFile a d3f:DocumentFile, + owl:NamedIndividual ; + rdfs:label "Microsoft Word DOT File" . + +d3f:MicrosoftWordDOTMFile a d3f:DocumentFile, + owl:NamedIndividual ; + rdfs:label "Microsoft Word DOTM File" . + +d3f:MicrosoftWordDOTXFile a d3f:DocumentFile, + owl:NamedIndividual ; + rdfs:label "Microsoft Word DOTX File" . + +d3f:MicrosoftWordWBKFile a d3f:DocumentFile, + owl:NamedIndividual ; + rdfs:label "Microsoft Word WBK File" . + +d3f:MobilePhone a owl:Class ; + rdfs:label "Mobile Phone" ; + d3f:definition "A mobile phone, cellular phone, cell phone, cellphone or hand phone, sometimes shortened to simply mobile, cell or just phone, is a portable telephone that can make and receive calls over a radio frequency link while the user is moving within a telephone service area. The radio frequency link establishes a connection to the switching systems of a mobile phone operator, which provides access to the public switched telephone network (PSTN). Modern mobile telephone services use a cellular network architecture and, therefore, mobile telephones are called cellular telephones or cell phones in North America. In addition to telephony, digital mobile phones (2G) support a variety of other services, such as text messaging, MMS, email, Internet access, short-range wireless communications (infrared," ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:PersonalComputer ; + skos:altLabel "Cellphone", + "Cellular Phone" . + +d3f:Model-basedPolicyOptimization a owl:Class, + owl:NamedIndividual ; + rdfs:label "Model-based Policy Optimization" ; + d3f:d3fend-id "D3A-MBPO" ; + d3f:definition "Model-based policy optimization (MBPO) is a model-based, online, off-policy reinforcement learning algorithm. For more information on the different types of reinforcement learning agents" ; + d3f:kb-article """## References +MBPO Agents. MathWorks. [Link](https://www.mathworks.com/help/reinforcement-learning/ug/mbpo-agents.html).""" ; + rdfs:subClassOf d3f:Model-basedReinforcementLearning . + +d3f:Model-basedValueIteration a owl:Class, + owl:NamedIndividual ; + rdfs:label "Model-based Value Iteration" ; + d3f:d3fend-id "D3A-MBVI" ; + d3f:definition "Value Iteration effectively reducesthe evaluation stage down to a single sweep of the states. Additionally, to improve things further, it combines the Policy Evaluation and Policy Improvement stages into a single update." ; + d3f:kb-article """## References +Policy and Value Iteration. Towards Data Science. [Link](https://towardsdatascience.com/policy-and-value-iteration-78501afb41d2).""" ; + d3f:synonym "MBVI" ; + rdfs:subClassOf d3f:Model-basedReinforcementLearning . + +d3f:MouseInputDevice a owl:Class ; + rdfs:label "Mouse Input Device" ; + d3f:definition "A computer mouse (plural mice or mouses) is a hand-held pointing device that detects two-dimensional motion relative to a surface. This motion is typically translated into the motion of a pointer on a display, which allows a smooth control of the graphical user interface of a computer. In addition to moving a cursor, computer mice have one or more buttons to allow operations such as selection of a menu item on a display. Mice often also feature other elements, such as touch surfaces and scroll wheels, which enable additional control and dimensional input." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:InputDevice ; + skos:altLabel "Computer Mouse" . + +d3f:MovingAverageModel a owl:Class, + owl:NamedIndividual ; + rdfs:label "Moving Average Model" ; + d3f:d3fend-id "D3A-MAM" ; + d3f:definition "the moving-average model (MA model) is an approach for modeling univariate time series and specifies that the output variable is cross-correlated with a non-identical to itself random-variable." ; + d3f:kb-article """## Refrences +Wikipedia. (n.d.). Moving average model. [Link](https://en.wikipedia.org/wiki/Moving_average_model)""" ; + d3f:synonym "MA Model" ; + rdfs:subClassOf d3f:TimeSeriesAnalysis . + +d3f:MulticlassClassification a owl:Class ; + rdfs:label "Multiclass Classification" ; + rdfs:subClassOf d3f:Classifying . + +d3f:MultilayerPerceptronClassification a owl:Class, + owl:NamedIndividual ; + rdfs:label "Multilayer Perceptron Classification" ; + d3f:d3fend-id "D3A-MPC" ; + d3f:definition "A multilayer perceptron (MLP) is a fully connected class of feedforward artificial neural network (ANN).An MLP consists of at least three layers of nodes: an input layer, a hidden layer and an output layer." ; + d3f:kb-article """## References +Multilayer perceptron. Wikipedia. [Link](https://en.wikipedia.org/wiki/Multilayer_perceptron).""" ; + rdfs:subClassOf d3f:ArtificialNeuralNetClassification . + +d3f:MultimediaDocumentFile a owl:Class ; + rdfs:label "Multimedia Document File" ; + d3f:definition "Digital video files which often contain audio." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DocumentFile . + +d3f:MultipleRegressionLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Multiple Regression Learning" ; + d3f:d3fend-id "D3A-MRL" ; + d3f:definition "A supervised learning method that builds a multiple regression model using training data." ; + d3f:kb-article """## References +Yale University Department of Statistics. (1997-98). Linear regression and multivariate analysis. [Link](http://www.stat.yale.edu/Courses/1997-98/101/linmult.htm)""" ; + rdfs:seeAlso d3f:MultipleRegression ; + rdfs:subClassOf d3f:RegressionAnalysisLearning . + +d3f:NIST_SP_800-53_R3 a d3f:NISTSP800-53ControlCatalog, + owl:NamedIndividual ; + rdfs:label "NIST SP 800-53 R3" ; + d3f:archived-at "https://csrc.nist.gov/publications/detail/sp/800-53/rev-4/archive/2013-04-30"^^xsd:anyURI ; + d3f:version 3 ; + rdfs:seeAlso . + +d3f:NIST_SP_800-53_R4 a d3f:NISTSP800-53ControlCatalog, + owl:NamedIndividual ; + rdfs:label "NIST SP 800-53 R4" ; + d3f:archived-at "https://csrc.nist.gov/publications/detail/sp/800-53/rev-4/archive/2013-04-30"^^xsd:anyURI ; + d3f:version 4 ; + rdfs:seeAlso . + +d3f:NTFSHardLink a owl:Class ; + rdfs:label "NTFS Hard Link" ; + d3f:definition "An NTFS hard link points to another file, and files share the same MFT entry (inode), in the same filesystem." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:HardLink, + d3f:NTFSLink . + +d3f:NTFSJunctionPoint a owl:Class ; + rdfs:label "NTFS Junction Point" ; + d3f:definition "NTFS junction points are are similar to NTFS symlinks but are defined only for directories. Only accepts local absolute paths." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:NTFSLink, + d3f:SymbolicLink ; + skos:altLabel "Junction Point" . + +d3f:NTFSSymbolicLink a owl:Class ; + rdfs:label "NTFS Symbolic Link" ; + d3f:definition "An NTFS symbolic link records the path of another file that the links contents should show. Can accept relative paths. SMB networking (UNC path) and directory support added in NTFS 3.1." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:NTFSLink, + d3f:SymbolicLink ; + skos:altLabel "NTFS Symlink" . + +d3f:NTPBroadcastEvent a owl:Class ; + rdfs:label "NTP Broadcast Event" ; + d3f:definition "An event where an NTP server broadcasts time synchronization messages to multiple clients simultaneously, enabling synchronization without individual request-response cycles." ; + rdfs:subClassOf d3f:NTPEvent . + +d3f:NTPClientSyncEvent a owl:Class ; + rdfs:label "NTP Client Synchronization Event" ; + d3f:definition "An event where an NTP client requests and adjusts its clock based on time synchronization data provided by an NTP server, ensuring alignment with a standard time source." ; + rdfs:subClassOf d3f:NTPEvent . + +d3f:NTPControlMessageEvent a owl:Class ; + rdfs:label "NTP Control Message Event" ; + d3f:definition "An event where an NTP client or server exchanges control messages used for diagnostic, monitoring, or administrative management of the NTP protocol, rather than time synchronization." ; + rdfs:subClassOf d3f:NTPEvent . + +d3f:NTPServerResponseEvent a owl:Class ; + rdfs:label "NTP Server Response Event" ; + d3f:definition "An event where an NTP server sends time synchronization data to a client, enabling the client to align its local clock with the server's reference time." ; + rdfs:subClassOf d3f:NTPEvent . + +d3f:NTPSymmetricActiveExchangeEvent a owl:Class ; + rdfs:label "NTP Symmetric Active Exchange Event" ; + d3f:definition "An event where an NTP peer operating in symmetric active mode initiates clock synchronization messages to a peer in symmetric passive mode, enabling time synchronization between equal-status systems." ; + rdfs:subClassOf d3f:NTPEvent . + +d3f:NTPSymmetricPassiveExchangeEvent a owl:Class ; + rdfs:label "NTP Symmetric Passive Exchange Event" ; + d3f:definition "An event where an NTP peer operating in symmetric passive mode responds to clock synchronization messages initiated by a symmetric active peer, facilitating mutual timekeeping." ; + rdfs:subClassOf d3f:NTPEvent . + +d3f:NaiveBayesClassifier a owl:Class, + owl:NamedIndividual ; + rdfs:label "Naive Bayes Classifier" ; + d3f:d3fend-id "D3A-NBC" ; + d3f:definition "The Naïve Bayes classifier is a supervised machine learning algorithm, which is used for classification tasks, like text classification. It is also part of a family of generative learning algorithms, meaning that it seeks to model the distribution of inputs of a given class or category." ; + d3f:kb-article """## References +Naive Bayes. IBM. [Link](https://www.ibm.com/topics/naive-bayes?mhsrc=ibmsearch_a&mhq=naive%20bayes).""" ; + rdfs:subClassOf d3f:Classification . + +d3f:NetworkCardFirmware a owl:Class ; + rdfs:label "Network Card Firmware" ; + d3f:definition "Firmware that is installed on a network card (network interface controller)." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:PeripheralFirmware ; + skos:altLabel "Network Controller Firmware" . + +d3f:NetworkDeviceEvent a owl:Class ; + rdfs:label "Network Device Event" ; + d3f:definition "An event capturing the activity or state of network devices, such as Ethernet adapters, Wi-Fi modules, or virtual interfaces. These events highlight connectivity, configuration, or performance changes." ; + rdfs:subClassOf d3f:HardwareDeviceEvent . + +d3f:NetworkDirectoryResource a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Directory Resource" ; + d3f:contains d3f:Directory ; + d3f:definition "A directory resource made available from one host to other hosts on a computer network." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Directory ], + d3f:NetworkFileShareResource . + +d3f:NetworkFlowSensor a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Flow Sensor" ; + d3f:definition "Monitors network traffic and produces summaries of data flows traversing the network." ; + d3f:monitors d3f:NetworkFlow ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:NetworkFlow ], + d3f:NetworkSensor . + +d3f:NetworkLink a owl:Class ; + rdfs:label "Network Link" ; + d3f:definition "A network link is a link within the network layer, which is responsible for packet forwarding including routing through intermediate routers." ; + d3f:synonym "Layer-3 Link", + "Network Layer Link" ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:LogicalLink . + +d3f:NetworkPrinter a owl:Class ; + rdfs:label "Network Printer" ; + d3f:definition "In computing, a network printer is a device that can be accessed over a network which makes a persistent representation of graphics or text, usually on paper. While most output is human-readable, bar code printers are an example of an expanded use for printers. The different types of printers include 3D printer, inkjet printer, laser printer, thermal printer, etc. Note that not all printers are networked and the digital information to be printed must be passed either by removable media or as directly connecting the printer to a computer (e.g., by USB.)" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:SharedComputer . + +d3f:NetworkProtocolAnalyzer a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Protocol Analyzer" ; + d3f:definition "Monitors and parses network protocols to extract values from various network protocol layers." ; + d3f:monitors d3f:NetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:NetworkSensor . + +d3f:NetworkScanner a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Scanner" ; + d3f:definition "A network scanner is a computer program used to retrieve usernames and info on groups, shares, and services of networked computers. This type of program scans networks for vulnerabilities in the security of that network. If there is a vulnerability with the security of the network, it will send a report back to a hacker who may use this info to exploit that network glitch to gain entry to the network or for other malicious activities. Ethical hackers often also use the information to remove the glitches and strengthen their network." ; + d3f:monitors d3f:Network ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:Network ], + d3f:CyberSensor ; + skos:altLabel "Network Enumerator" . + +d3f:NetworkTrafficAnalysisSoftware a d3f:DigitalArtifact, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Traffic Analysis Software" ; + d3f:definition "A packet analyzer, also known as packet sniffer, protocol analyzer, or network analyzer, is a computer program or computer hardware such as a packet capture appliance, that can intercept and log traffic that passes over a computer network or part of a network." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DeveloperApplication ; + skos:altLabel "Network Sniffer" . + +d3f:Non-ParametricTests a owl:Class, + owl:NamedIndividual ; + rdfs:label "Non-Parametric Tests" ; + d3f:d3fend-id "D3A-NPT" ; + d3f:definition "A non-parametric test relies is used when the underlying distribution of data is non-symmetric (non-normal distribution)." ; + d3f:kb-article """## References +Newcastle University. (n.d.). Parametric Hypothesis Tests. [Link](https://www.ncl.ac.uk/webtemplate/ask-assets/external/maths-resources/psychology/non-parametric-hypothesis-tests.html)""" ; + rdfs:subClassOf d3f:HypothesisTesting . + +d3f:Non-monotonicLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Non-monotonic Logic" ; + d3f:d3fend-id "D3A-NML" ; + d3f:definition "Non-monotonic logic is a formal logic whose conclusion relation is not monotonic. In other words, non-monotonic logics are devised to capture and represent defeasible inferences (cf. defeasible reasoning), i.e., a kind of inference in which reasoners draw tentative conclusions, enabling reasoners to retract their conclusion(s) based on further evidence." ; + d3f:kb-article """## References +1. Non-monotonic logic. (2023, June 1). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Non-monotonic_logic)""" ; + rdfs:subClassOf d3f:SymbolicAI . + +d3f:NonlinearRegressionLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Nonlinear Regression Learning" ; + d3f:d3fend-id "D3A-NRL" ; + d3f:definition "A supervised learning method that builds a non-linear regression model using training data." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Nonlinear regression. [Link](https://en.wikipedia.org/wiki/Nonlinear_regression)""" ; + rdfs:seeAlso d3f:NonlinearRegression ; + rdfs:subClassOf d3f:RegressionAnalysisLearning . + +d3f:OTController a owl:Class, + owl:NamedIndividual ; + rdfs:label "OT Controller" ; + d3f:communicates-with d3f:OTIOModule ; + d3f:controls d3f:OTActuator ; + d3f:definition "An OT Controller is an industrial control device that automatically regulates one or more controlled variables in response to command inputs and real-time feedback signals." ; + d3f:monitors d3f:OTSensor ; + d3f:powered-by d3f:OTPowerSupply ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:powered-by ; + owl:someValuesFrom d3f:OTPowerSupply ], + [ a owl:Restriction ; + owl:onProperty d3f:communicates-with ; + owl:someValuesFrom d3f:OTIOModule ], + [ a owl:Restriction ; + owl:onProperty d3f:controls ; + owl:someValuesFrom d3f:OTActuator ], + [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:OTSensor ], + d3f:OTEmbeddedComputer . + +d3f:OWL a owl:Class, + owl:NamedIndividual ; + rdfs:label "OWL" ; + d3f:d3fend-id "D3A-OWL" ; + d3f:definition "The Web Ontology Language (OWL) is a family of knowledge representation languages for authoring ontologies." ; + d3f:kb-article """## How it works +Ontologies are a formal way to describe taxonomies and classification networks, essentially defining the structure of knowledge for various domains: the nouns representing classes of objects and the verbs representing relations between the objects. + +The OWL languages are characterized by formal semantics. They are built upon the World Wide Web Consortium's (W3C) standard for objects called the Resource Description Framework (RDF). OWL classes correspond to description logic (DL) _concepts_. OWL properties to DL _roles_, and individuals are named the same way in OWL and other DLs. + +## References +1. Web Ontology Language. (2023, April 23). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Web_Ontology_Language)""" ; + d3f:synonym "Web Ontology Language" ; + rdfs:subClassOf d3f:DescriptionLogic . + +d3f:OffensiveAction a owl:Class ; + rdfs:label "Offensive Action" ; + rdfs:subClassOf d3f:CyberAction . + +d3f:Open-sourceDeveloper a owl:Class ; + rdfs:label "Open-source Developer" ; + rdfs:subClassOf d3f:ProductDeveloper . + +d3f:OperatingSystemPackagingTool a owl:Class ; + rdfs:label "Operating System Packaging Tool" ; + d3f:definition "A software packaging tool oriented on building a software package for a particular operating system (e.g. rpmbuild.)" ; + rdfs:subClassOf d3f:SoftwarePackagingTool . + +d3f:OperationsCenterComputer a owl:Class ; + rdfs:label "Operations Center Computer" ; + d3f:definition "Mainframe computers or mainframes (colloquially referred to as \"big iron\") are computers used primarily by large organizations for critical applications; bulk data processing, such as census, industry and consumer statistics, and enterprise resource planning; and transaction processing. They are larger and have more processing power than some other classes of computers: minicomputers, servers, workstations, and personal computers." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:SharedComputer ; + skos:altLabel "Mainframe" . + +d3f:OpticalDiscImage a owl:Class ; + rdfs:label "Optical Disc Image" ; + d3f:definition "An optical disc image (or ISO image, from the ISO 9660 file system used with CD-ROM media) is a disk image that contains everything that would be written to an optical disc, disk sector by disc sector, including the optical disc file system." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DiskImage . + +d3f:OpticalModem a owl:Class ; + rdfs:label "Optical Modem" ; + d3f:definition "A modem that connects to a fiber optic network is known as an optical network terminal (ONT) or optical network unit (ONU). These are commonly used in fiber to the home installations, installed inside or outside a house to convert the optical medium to a copper Ethernet interface, after which a router or gateway is often installed to perform authentication, routing, NAT, and other typical consumer internet functions, in addition to \"triple play\" features such as telephony and television service." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Modem . + +d3f:OrchestrationController a owl:Class, + owl:NamedIndividual ; + rdfs:label "Orchestration Controller" ; + d3f:contains d3f:ContainerOrchestrationSoftware ; + d3f:definition "An orchestration server provides orchestration services that automate the configuration, coordination, and management of computer systems and software." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ContainerOrchestrationSoftware ], + d3f:OrchestrationServer . + +d3f:OrchestrationWorker a owl:Class ; + rdfs:label "Orchestration Worker" ; + d3f:definition "A d3f:Server which receives commands from a d3f:OrchestrationController to execute workloads." ; + rdfs:seeAlso "d3f:OrchestrationController" ; + rdfs:subClassOf d3f:OrchestrationServer . + +d3f:OutboundInternetRPCTraffic a owl:Class ; + rdfs:label "Outbound Internet RPC Traffic" ; + d3f:definition "Outbound internet RPC traffic is RPC traffic that is: (a) on an outgoing connection initiated from a host within a network to a host outside the network, and (b) using a standard RPC protocol." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:OutboundInternetNetworkTraffic, + d3f:OutboundNetworkTraffic, + d3f:RPCNetworkTraffic . + +d3f:OutputDeviceEvent a owl:Class ; + rdfs:label "Output Device Event" ; + d3f:definition "An event describing the activity or state of output devices, including sound cards, display adapters, or media controllers. These events relate to audio, video, or graphics functionality." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:OutputDevice ], + d3f:HardwareDeviceEvent . + +d3f:PE32ExecutableFile a d3f:ExecutableBinary, + owl:NamedIndividual ; + rdfs:label "PE32 Executable File" . + +d3f:PE32PLUSExecutableFile a d3f:ExecutableBinary, + owl:NamedIndividual ; + rdfs:label "PE32+ Executable File" . + +d3f:POSIXSymbolicLink a owl:Class ; + rdfs:label "POSIX Symbolic Link" ; + d3f:definition "A POSIX-compliant symbolic link. These are often fast symbolic links, but need not be." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:SymbolicLink, + d3f:UnixLink . + +d3f:PacketLog a owl:Class, + owl:NamedIndividual ; + rdfs:label "Packet Log" ; + d3f:definition "A log of all the network packet data captured from a network by a network sensor (i.e., packet analyzer)," ; + d3f:records d3f:NetworkSession ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:records ; + owl:someValuesFrom d3f:NetworkSession ], + d3f:Log . + +d3f:Page a owl:Class ; + rdfs:label "Page" ; + d3f:definition "A page, memory page, logical page, or virtual page is a fixed-length contiguous block of virtual memory, described by a single entry in the page table. It is the smallest unit of data for memory management in a virtual memory operating system." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:MemoryBlock . + +d3f:Parameter-basedTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Parameter-based Transfer Learning" ; + d3f:d3fend-id "D3A-PBTL" ; + d3f:definition "The idea behind parameter-based methods is that a well-trained model on the source domain has learned a well-defined structure, and if two tasks are related, this structure can be transferred to the target model." ; + d3f:kb-article """## References +Georgian Impact Blog. (n.d.). Transfer Learning Part 1. [Link](https://medium.com/georgian-impact-blog/transfer-learning-part-1-ed0c174ad6e7#:~:text=Homogeneous%20Transfer%20Learning-,1.,the%20target%20domain%20for%20training).""" ; + rdfs:subClassOf d3f:HomogenousTransferLearning . + +d3f:ParametricTests a owl:Class, + owl:NamedIndividual ; + rdfs:label "Parametric Tests" ; + d3f:d3fend-id "D3A-PT" ; + d3f:definition "A parametric test relies upon the assumption that the data you want to test is (or approximately is) normally distributed." ; + d3f:kb-article """## References +Newcastle University. (n.d.). Parametric Hypothesis Tests. [Link](https://www.ncl.ac.uk/webtemplate/ask-assets/external/maths-resources/psychology/parametric-hypothesis-tests.html)""" ; + rdfs:subClassOf d3f:HypothesisTesting . + +d3f:ParentProcess a owl:Class ; + rdfs:label "Parent Process" ; + d3f:definition "In computing, a parent process is a process that has created one or more child processes." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Process . + +d3f:PasswordManager a owl:Class ; + rdfs:label "Password Manager" ; + d3f:definition "A password manager is a software application or hardware that helps a user store and organize passwords. Password managers usually store passwords encrypted, requiring the user to create a master password: a single, ideally very strong password which grants the user access to their entire password database. Some password managers store passwords on the user's computer (called offline password managers), whereas others store data in the provider's cloud (often called online password managers). However offline password managers also offer data storage in the user's own cloud accounts rather than the provider's cloud. While the core functionality of a password manager is to securely store large collections of passwords, many provide additional features such as form filling and password generation." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Application . + +d3f:PearsonsCorrelationCoefficient a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pearson's Correlation Coefficient" ; + d3f:d3fend-id "D3A-PCC" ; + d3f:kb-article """## References +Wolfram MathWorld. (n.d.). Correlation Coefficient. [Link](https://mathworld.wolfram.com/CorrelationCoefficient.html)""" ; + rdfs:subClassOf d3f:Correlation . + +d3f:PeripheralDeviceEvent a owl:Class ; + rdfs:label "Peripheral Device Event" ; + d3f:definition "An event involving external or auxiliary devices, such as USB drives, Thunderbolt peripherals, or Bluetooth devices. Peripheral events provide visibility into resource availability and potential unauthorized access." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:RemovableMediaDevice ], + d3f:HardwareDeviceEvent . + +d3f:PeripheralHubFirmware a owl:Class ; + rdfs:label "Peripheral Hub Firmware" ; + d3f:definition "Firmware that is installed on peripheral hub device such as a USB or Firewire hub." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:PeripheralFirmware ; + skos:altLabel "USB Hub Firmware" . + +d3f:PermissionGrantingEvent a owl:Class ; + rdfs:label "Permission Granting Event" ; + d3f:definition "An administrative event where authorization is given, allowing a subject to perform specific operations on a protected resource, effectuating a policy decision to allow access rights." ; + rdfs:subClassOf d3f:AccessControlAdministrationEvent . + +d3f:PermissionRevokingEvent a owl:Class ; + rdfs:label "Permission Revoking Event" ; + d3f:definition "An administrative event entailing the withdrawal of previously granted access rights, reconfiguring permissions to prevent a subject from performing specific actions on a resource, in accordance with updated access policies." ; + rdfs:subClassOf d3f:AccessControlAdministrationEvent . + +d3f:Perturbation-basedLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Perturbation-based Learning" ; + d3f:d3fend-id "D3A-PBL" ; + d3f:definition "Perturbation based methods are proposed under the smoothness assumption, which indicates that two data points close to each other in feature space are likely to have the same label." ; + d3f:kb-article """## References +Zheng, Y., & Song, Y. (2021). An Effective Perturbation-Based Semi-Supervised Learning Method for Acoustic Event Classification. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 29, 3580-3591. [Link](https://www.semanticscholar.org/paper/An-Effective-Perturbation-Based-Semi-Supervised-for-Zheng-Song/b75ae37d137ac354eb2ed42917e461b4dccdc977). + +Engelen, S., & Hoos, H. (2020). A survey on semi-supervised learning. Machine Learning, 109(2), 299-337. [Link](https://link.springer.com/article/10.1007/s10994-019-05855-6).""" ; + rdfs:subClassOf d3f:IntrinsicallySemi-supervisedLearning . + +d3f:PhiCoefficient a owl:Class, + owl:NamedIndividual ; + rdfs:label "Phi Coefficient" ; + d3f:d3fend-id "D3A-PC" ; + d3f:definition "The phi coefficient (or mean square contingency coefficient is a measure of association for two binary variables." ; + d3f:kb-article """## References +\\Wikipedia. (n.d.). Phi coefficient. [Link](https://en.wikipedia.org/wiki/Phi_coefficient)""" ; + d3f:synonym "MCC", + "Matthews Correlation Coefficient (in machine learning)" ; + rdfs:subClassOf d3f:Correlation . + +d3f:Pix2Pix a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pix2Pix" ; + d3f:d3fend-id "D3A-PIX" ; + d3f:definition "Pix2Pix is based on condtional GAN architecture and are trained on paired set of images or scenes from two domains to be used for translation." ; + d3f:kb-article """## References +Esri. (n.d.). How Pix2Pix Works. [Link](https://developers.arcgis.com/python/guide/how-pix2pix-works/)""" ; + rdfs:subClassOf d3f:Image-to-ImageTranslationGAN . + +d3f:Point-biserialCorrelationCoefficient a owl:Class, + owl:NamedIndividual ; + rdfs:label "Point-biserial Correlation Coefficient" ; + d3f:d3fend-id "D3A-PBCC" ; + d3f:definition "The point biserial correlation coefficient (rpb) is a correlation coefficient used when one variable (e.g. Y) is dichotomous; Y can either be \"naturally\" dichotomous, like whether a coin lands heads or tails, or an artificially dichotomized variable." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Point-biserial correlation coefficient. [Link](https://en.wikipedia.org/wiki/Point-biserial_correlation_coefficient)""" ; + rdfs:subClassOf d3f:Correlation . + +d3f:PointEstimation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Point Estimation" ; + d3f:d3fend-id "D3A-PE" ; + d3f:definition "A point estimation is a single value that estimates the parameter. Point estimates are single values calculated from the sample" ; + d3f:kb-article """## References +Pennsylvania State University. (n.d.). Statistical Inference and Estimation. [Link](https://online.stat.psu.edu/stat504/lesson/statistical-inference-and-estimation)""" ; + rdfs:subClassOf d3f:Estimation . + +d3f:PowerThermalDeviceEvent a owl:Class ; + rdfs:label "Power and Thermal Device Event" ; + d3f:definition "An event involving power supplies, batteries, or thermal management devices. These events represent changes in power states, temperature thresholds, or cooling system activity." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Sensor ], + d3f:HardwareDeviceEvent . + +d3f:PowershellScriptFile a d3f:ExecutableScript, + owl:NamedIndividual ; + rdfs:label "Powershell Script File" . + +d3f:PreAuthenticationEvent a owl:Class ; + rdfs:label "Pre-Authentication Event" ; + d3f:definition "An event representing preparatory steps or processes conducted prior to the primary authentication operation. Pre-authentication often involves initial protocol exchanges, cryptographic challenges, or the validation of supplemental factors (e.g., pre-shared keys) to ensure the readiness and security of the authentication workflow." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:precedes ; + owl:someValuesFrom d3f:Authentication ], + d3f:AuthenticationEvent . + +d3f:PrincipalComponentAnalysis a owl:Class, + owl:NamedIndividual ; + rdfs:label "Principal Component Analysis" ; + d3f:d3fend-id "D3A-PCA" ; + d3f:definition "Principal components analysis (PCA) creates a new set of orthogonal variables that contain the same information as the original set. It rotates the axes of variation to give a new set of orthogonal axes, ordered so that they summarize decreasing proportions of the variation." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Multivariate statistics. [Link](https://en.wikipedia.org/wiki/Multivariate_statistics)""" ; + d3f:synonym "PCA" ; + rdfs:subClassOf d3f:MultivariateAnalysis . + +d3f:PrincipalComponentsAnalysis a owl:Class, + owl:NamedIndividual ; + rdfs:label "Principal Components Analysis" ; + d3f:d3fend-id "D3A-PCA" ; + d3f:definition "Principal Component Analysis (PCA) is a statistic-based method of identifying patterns in a large dataset while increasing interpretability and preserving information." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Principal component analysis. [Link](https://en.wikipedia.org/wiki/Principal_component_analysis)""" ; + rdfs:subClassOf d3f:DimensionReduction . + +d3f:PrintServer a owl:Class ; + rdfs:label "Print Server" ; + d3f:definition "A print server, or printer server, is a device that connects printers to client computers over a network. It accepts print jobs from the computers and sends the jobs to the appropriate printers, queuing the jobs locally to accommodate the fact that work may arrive more quickly than the printer can actually handle." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Server . + +d3f:PrivilegedUserAccount a owl:Class ; + rdfs:label "Privileged User Account" ; + d3f:definition "A privileged account is a user account that has more privileges than ordinary users. Privileged accounts might, for example, be able to install or remove software, upgrade the operating system, or modify system or application configurations. They might also have access to files that are not normally accessible to standard users. Typical examples are root and administrator accounts. But there also service accounts, system accounts, etc. Privileged accounts are especially powerful, and should be monitored especially closely." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:UserAccount . + +d3f:ProbabilisticLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Probabilistic Logic" ; + d3f:d3fend-id "D3A-PL" ; + d3f:definition "Probabilistic logic extends traditional logic truth tables with probabilistic expressions." ; + d3f:kb-article """## References +1. Probabilistic logic. (2023, June 5). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Probabilistic_logic)""" ; + rdfs:subClassOf d3f:SymbolicAI . + +d3f:ProcessAccessEvent a owl:Class ; + rdfs:label "Process Access Event" ; + d3f:definition "An event where one process interacts with another, such as reading memory, inspecting state, or altering behavior." ; + rdfs:subClassOf d3f:ProcessEvent . + +d3f:ProcessCreationEvent a owl:Class ; + rdfs:label "Process Creation Event" ; + d3f:definition "An event where a new process is spawned, initializing its execution context and resource allocation." ; + rdfs:subClassOf d3f:ProcessEvent . + +d3f:ProcessSetUserIDEvent a owl:Class ; + rdfs:label "Process Set User ID Event" ; + d3f:definition "An event where a process changes or adopts a specific user identity, modifying its access privileges or operational context." ; + rdfs:subClassOf d3f:ProcessEvent . + +d3f:ProcessTerminationEvent a owl:Class ; + rdfs:label "Process Termination Event" ; + d3f:definition "An event marking the cessation of a process, including resource deallocation and cleanup, either due to normal completion or abnormal termination." ; + rdfs:subClassOf d3f:ProcessEvent . + +d3f:ProgressivelyGrowingGAN a owl:Class, + owl:NamedIndividual ; + rdfs:label "Progressively Growing GAN" ; + d3f:d3fend-id "D3A-PGG" ; + d3f:definition "Progressive Growing GAN (ProGAN) is an extension to the GAN training process that allows for the stable training of generator models that can output large high-quality images." ; + d3f:kb-article """## References + +Machine Learning Mastery. (n.d.). Introduction to Progressive Growing Generative Adversarial Networks. [Link](https://machinelearningmastery.com/introduction-to-progressive-growing-generative-adversarial-networks/)""" ; + d3f:synonym "ProGAN" ; + rdfs:subClassOf d3f:ImageSynthesisGAN . + +d3f:ProjectedClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Projected Clustering" ; + d3f:d3fend-id "D3A-PC" ; + d3f:definition "Projected clustering is a dimension reduction subspace clustering method." ; + d3f:kb-article """## References +GeeksforGeeks. (n.d.). Projected Clustering in Data Analytics. [Link](https://www.geeksforgeeks.org/projected-clustering-in-data-analytics/)""" ; + rdfs:subClassOf d3f:High-dimensionClustering . + +d3f:Prolog a owl:Class, + owl:NamedIndividual ; + rdfs:label "Prolog" ; + d3f:d3fend-id "D3A-PRO" ; + d3f:definition "Prolog has its roots in first-order logic, a formal logic, and unlike many other programming languages." ; + d3f:kb-article """## How it works +Prolog is intended primarily as a declarative programming language: the program logic is expressed in terms of relations, represented as facts and rules. A computation is initiated by running a query over these relations. + +## References +1. Prolog. (2023, April 5). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Prolog)""" ; + rdfs:subClassOf d3f:LogicProgramming . + +d3f:PropositionalLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Propositional Logic" ; + d3f:d3fend-id "D3A-PL" ; + d3f:definition "Propositional logic deals with statements (i.e., propositions, which can be true or false) and relations between propositions, including the construction of arguments based on them." ; + d3f:kb-article """## How it works +Compound propositions are formed by connecting propositions by logical connectives. Propositions that contain no logical connectives are called atomic propositions. + +## References +1. Propositional Calculus. (2022, May 31). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Propositional_calculus)""" ; + d3f:synonym "Propositional Calculus" ; + rdfs:subClassOf d3f:SymbolicAI . + +d3f:PythonPackage a owl:Class ; + rdfs:label "Python Package" ; + d3f:definition "A Python package is an aggregation of many Python files - either in source code or in bytecode - and associated metadata and resources (text, images, etc.). Python packages can be distributed in different file formats." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:SoftwarePackage . + +d3f:PythonScriptFile a owl:Class ; + rdfs:label "Python Script File" ; + rdfs:subClassOf d3f:ExecutableScript . + +d3f:QueryByCommittee a owl:Class, + owl:NamedIndividual ; + rdfs:label "Query By Committee" ; + d3f:d3fend-id "D3A-QBC" ; + d3f:definition "Query by Committee (QBC) takes inspiration from ensemble methods. Instead of just one classifier, it takes into account the decision of a committee C=ℎ1,…,ℎc of classifiers ℎi. Each classifier has the same target classes, but a different underlying model or a different view on the data." ; + d3f:kb-article """## References +Intro to Active Learning. inovex Blog. [Link](https://www.inovex.de/de/blog/intro-to-active-learning/).""" ; + rdfs:subClassOf d3f:ActiveLearning . + +d3f:RAM a owl:Class ; + rdfs:label "RAM" ; + d3f:definition "Random-access memory (RAM) is a form of computer memory that can be read and changed in any order, typically used to store working data and machine code." ; + d3f:synonym "Random-access Memory" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:PrimaryStorage . + +d3f:RDPConnectRequestEvent a owl:Class ; + rdfs:label "RDP Connect Request Event" ; + d3f:definition "An event where an RDP client sends a connection request specifying session parameters, such as display settings, compression preferences, and security requirements, to prepare for an interactive session." ; + rdfs:subClassOf d3f:RDPEvent . + +d3f:RDPConnectResponseEvent a owl:Class ; + rdfs:label "RDP Connect Response Event" ; + d3f:definition "An event where an RDP server acknowledges a connection request, finalizing session parameters and confirming the transition to an interactive remote session." ; + rdfs:subClassOf d3f:RDPEvent . + +d3f:RDPInitialRequestEvent a owl:Class ; + rdfs:label "RDP Initial Request Event" ; + d3f:definition "An event where an RDP client initiates communication with a server by sending a request to establish a session and negotiate protocol capabilities for remote interaction." ; + rdfs:subClassOf d3f:RDPEvent . + +d3f:RDPInitialResponseEvent a owl:Class ; + rdfs:label "RDP Initial Response Event" ; + d3f:definition "An event where an RDP server responds to an initial request from a client, presenting its supported capabilities and agreeing to proceed with session negotiation." ; + rdfs:subClassOf d3f:RDPEvent . + +d3f:RDPTLSHandshakeEvent a owl:Class ; + rdfs:label "RDP TLS Handshake Event" ; + d3f:definition "An event representing the cryptographic exchange of keys and certificates between an RDP client and server to establish a secure communication channel. The handshake ensures encryption, integrity, and authentication for the session." ; + rdfs:subClassOf d3f:RDPEvent, + d3f:TCPEvent . + +d3f:RFReceiver a owl:Class ; + rdfs:label "RF Receiver" ; + rdfs:subClassOf d3f:RFNode . + +d3f:RFTransceiver a owl:Class ; + rdfs:label "RF Transceiver" ; + rdfs:subClassOf d3f:RFNode . + +d3f:ROM a owl:Class ; + rdfs:label "ROM" ; + d3f:definition "Read-only memory (ROM) is a type of non-volatile memory used in computers and other electronic devices. Data stored in ROM cannot be electronically modified after the manufacture of the memory device. Read-only memory is useful for storing software that is rarely changed during the life of the system, also known as firmware." ; + d3f:synonym "Read-only Memory" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:PrimaryStorage . + +d3f:RadioModem a owl:Class ; + rdfs:label "Radio Modem" ; + d3f:definition "A radio modem provides the means to send digital data wirelessly. Radio modems are used to communicate by direct broadcast satellite, WiFi, WiMax, mobile phones, GPS, Bluetooth and NFC. Modern telecommunications and data networks also make extensive use of radio modems where long distance data links are required. Such systems are an important part of the PSTN, and are also in common use for high-speed computer network links to outlying areas where fiber optic is not economical." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Modem . + +d3f:RandomForest a owl:Class, + owl:NamedIndividual ; + rdfs:label "Random Forest" ; + d3f:d3fend-id "D3A-RF" ; + d3f:definition "Random Forest is a ML method that combines several other ML methods. At its core, Random Forest is an ensemble method of multiple bootstrapped decision trees filled with training data and random feature selection." ; + d3f:kb-article """## References +Random forest. Wikipedia. [Link](https://en.wikipedia.org/wiki/Random_forest).""" ; + rdfs:subClassOf d3f:BootstrapAggregating . + +d3f:RandomSplits a owl:Class, + owl:NamedIndividual ; + rdfs:label "Random Splits" ; + d3f:d3fend-id "D3A-RS" ; + d3f:definition "The dataset is repeatedly sampled with a random split of the data into train and test sets." ; + d3f:kb-article """## References +How to Create a Random Split Cross-Validation and Bagging Ensemble for Deep Learning in Keras."*Machine Learning Mastery*. [Link](https://machinelearningmastery.com/how-to-create-a-random-split-cross-validation-and-bagging-ensemble-for-deep-learning-in-keras/).""" ; + rdfs:subClassOf d3f:ResamplingEnsemble . + +d3f:RangeMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Range Matching" ; + d3f:d3fend-id "D3A-RM" ; + d3f:definition "Numeric Range Matching determines if a value lies with an interval of values (i.e., within the range of values.)" ; + rdfs:subClassOf d3f:NumericPatternMatching . + +d3f:Reference-ApparatusForToProvideContentToAndQueryAReverseDomainNameSystemServer a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Apparatus for to provide content to and query a reverse domain name system server - Barrracuda Networks" ; + d3f:has-link "https://patents.google.com/patent/US20100174829A1/en?oq=20100174829"^^xsd:anyURI ; + d3f:kb-abstract "An apparatus is disclosed for to provide content to and query a reverse domain name system (DNS) server without depending on the kindness of domain name system registrars, registrants. DNS replies are observed by firewalls or filters, analyzed, and transmitted to a reverse domain name system server. An embodiment of the present invention can be within a DNS server or SMTP server." ; + d3f:kb-author "Dean Danko" ; + d3f:kb-mitre-analysis "This patent includes the description of a method of blocking email traffic from untrusted domains by analyzing the TCP/IP source IP addresses and blocking traffic for IPs whose reverse lookup response FQDN matches a denylist." ; + d3f:kb-reference-title "Apparatus for to provide content to and query a reverse domain name system server" . + +d3f:Reference-BiometricChallenge-ResponseAuthentication-Accenture a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Biometric Challenge-Response Authentication - Accenture" ; + d3f:has-link "https://www.patentguru.com/US2021110015A1"^^xsd:anyURI ; + d3f:kb-abstract """Secret biometric responses to authentication challenges for MFA. + +Methods, systems, and apparatus, including computer programs encoded on computer storage media, for authenticating users based on a sequence of biometric authentication challenges. In one aspect, a process includes receiving a first image of the face of the user and processing the first image according to a first authentication process to determine whether the face of the user shown in the first image matches the face of an authorized user. A second authentication process including a sequence of biometric authentication challenges is identified. The sequence includes at least one facial expression challenge. The user is authenticated in response to determining that the first authentication process is satisfied based on the face of the user shown in the first image matching the face of the authorized user and the second authentication process is satisfied based on the user providing a valid biometric response to each biometric authentication challenge.""" ; + d3f:kb-author "Ben McCarty, Ellie Daw" ; + d3f:kb-mitre-analysis "MITRE Analysis was not found." ; + d3f:kb-organization "Accenture" ; + d3f:kb-reference-of d3f:Multi-factorAuthentication ; + d3f:kb-reference-title "Biometric Challenge-Response Authentication" . + +d3f:Reference-CAR-2020-11-010%3ACMSTP_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-010: CMSTP - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-010/"^^xsd:anyURI ; + d3f:kb-abstract "CMSTP.exe is the Microsoft Connection Manager Profile Installer, which can be leveraged to setup listeners that will receive and install malware from remote sources in trusted fashion. When CMSTP.exe is seen in combination with an external connection, it is a good indication of this TTP." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-11-010: CMSTP" . + +d3f:Reference-EmbeddingContextsForOn-lineThreatsIntoResponsePolicyZones-VerisignInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Embedding contexts for on-line threats into response policy zones - Verisign Inc" ; + d3f:has-link "https://patents.google.com/patent/US10440059B1"^^xsd:anyURI ; + d3f:kb-abstract """Hierarchical threat intelligence embedded in subdomain CNAMEs of a DNS denylist. + +In one embodiment, a response policy zone (RPZ) application generates an RPZ that includes contexts for the on-line threats that are associated with domain names. For a domain name that is associated with an on-line threat, the RPZ application determines a threat specification that describes a characteristic of the on-line threat. The RPZ application then generates an alias based on the domain name and the threat specification. Subsequently, the RPZ application generates a domain name system (DNS) resource record that maps the domain name to the alias, includes the resource record in the RPZ, and transmits the RPZ to a DNS name server that implements the RPZ. Upon receiving a DNS query associated with the domain name, the DNS name server generates a DNS response based on the alias. Because the domain name and the threat specification is reflected in the alias, the DNS response automatically provides a relevant context.""" ; + d3f:kb-author "Ben McCarty" ; + d3f:kb-mitre-analysis "MITRE Analysis was not found." ; + d3f:kb-reference-of d3f:HierarchicalDomainDenylisting ; + d3f:kb-reference-title "Embedding contexts for on-line threats into response policy zones" . + +d3f:Reference-FWTKDocumentation-Fwtk.org a d3f:TechniqueReference, + owl:NamedIndividual ; + rdfs:label "Reference - FWTK Documentation - fwtk.org" ; + d3f:has-link "https://web.archive.org/web/20070510153306/http://www.fwtk.org/fwtk/docs/documentation.html#1.1"^^xsd:anyURI ; + d3f:kb-abstract """In case you don't already know, FWTK stands for the FireW all Tool Kit. It is used as a base to create a secure firewall system. If you need good documentation, please read the source code. If you are not familiar with C or do not feel comfortable with performing the configuration and security verification yourself, then I would suggest that you purchase a commercial firewall from a vendor (such as TIS, Checkpoint, Raptor, etc.). + +A machine needs other tools to secure it, including, but hardly limited to, tools to check files (tripwire), audit tools (tiger/cops), secure access methods (kerberos/ssh), something to watch logs and machine states (swatch/watcher some to mind) and filtering and routing tools such as screend/ipfilterd/ipacl. + +Again, I would recommend that you do not proceed to build a production FWTK firewall unless you are familiar with UNIX security.""" ; + d3f:kb-author "fwtk.org" ; + d3f:kb-organization "fwtk.org" ; + d3f:kb-reference-of d3f:InboundTrafficFiltering ; + d3f:kb-reference-title "FWTK Documentation" . + +d3f:Reference-IdentificationOfVisualInternationalDomainNameCollisions-VerisignInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Identification of visual international domain name collisions - Verisign Inc" ; + d3f:has-link "https://patents.google.com/patent/US10599836B2/en"^^xsd:anyURI ; + d3f:kb-abstract """Fuzzy OCR to detect domain name homoglyph attacks. + +Various embodiments of the invention disclosed herein provide techniques for detecting a homograph attack. An IDN collision detection server retrieves a first domain name that includes a punycode element. The IDN collision detection server converts the first domain into a second domain name that includes a Unicode character corresponding to the punycode element. The IDN collision detection server converts the second domain name into an image. The IDN collision detection server performs one or more optical character recognition operations on the image to generate a textual string associated with the image. The IDN collision detection server determines that the textual string matches at least a portion of a third domain name.""" ; + d3f:kb-author "Ben McCarty, Preston Zeh" ; + d3f:kb-mitre-analysis "MITRE Analysis was not found." ; + d3f:kb-organization "Verisign Inc" ; + d3f:kb-reference-of d3f:HomoglyphDetection ; + d3f:kb-reference-title "Identification of visual international domain name collisions" . + +d3f:Reference-IntroducingFirefoxNewSiteIsolationArchitecture a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Introducing Firefox's new Site Isolation Architecture" ; + d3f:has-link "https://hacks.mozilla.org/2021/05/introducing-firefox-new-site-isolation-security-architecture/"^^xsd:anyURI ; + d3f:kb-abstract "" ; + d3f:kb-author "Anny Gakhokidze" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Mozilla Foundation" ; + d3f:kb-reference-of d3f:Application-basedProcessIsolation ; + d3f:kb-reference-title "Site Isolation Design Document" ; + d3f:release-date "May 18, 2021" . + +d3f:Reference-Intrusion_and_misuse_deterrence_system_employing_a_virtual_network a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Intrusion and misuse deterrence system employing a virtual network" ; + d3f:has-link "https://patents.google.com/patent/US7240368B1"^^xsd:anyURI ; + d3f:kb-reference-of d3f:NetworkTrafficSignatureAnalysis ; + d3f:kb-reference-title "Intrusion and misuse deterrence system employing a virtual network" . + +d3f:Reference-LibreNMSDocsOxidizedExtension a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Libre NMS - Oxidized Extension" ; + d3f:has-link "https://docs.librenms.org/Extensions/Oxidized/"^^xsd:anyURI ; + d3f:kb-abstract """Integrating LibreNMS with Oxidized brings the following benefits: + +* Config viewing: Current, History, and Diffs all under the Configs tab of each device +* Automatic addition of devices to Oxidized: Including filtering and grouping to ease credential management +* Configuration searching""" ; + d3f:kb-organization "LibreNMS.org" ; + d3f:kb-reference-of d3f:DiskEncryption ; + d3f:kb-reference-title "LibreNMSDocs - Oxidized Extension" . + +d3f:Reference-RemotelyTriggeredBlackHoleFiltering-Cisco a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Remotely Triggered Black Hole FIltering - Cisco" ; + d3f:has-link "https://www.cisco.com/c/dam/en_us/about/security/intelligence/blackhole.pdf"^^xsd:anyURI ; + d3f:kb-organization "Cisco" ; + d3f:kb-reference-title "Remotely Triggered Black Hole Filtering - Destination Based and Source Based" . + +d3f:Reference-Securing_Web_Transactions__TLS_Server_Certificate_Management_Appendix_A_Passive_Inspection a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Securing Web Transactions TLS Server Certificate Management - Appendix A Passive Inspection" ; + d3f:has-link "https://www.nccoe.nist.gov/publication/1800-16/VolD/vol-d-appendix.html"^^xsd:anyURI ; + d3f:kb-abstract "The example implementation demonstrates the ability to perform passive inspection of encrypted TLS connections. The question of whether or not to perform such an inspection is complex. There are important tradeoffs between traffic security and traffic visibility that each organization should consider. Some organizations prefer to decrypt internal TLS traffic, so it can be inspected to detect attacks that may be hiding within encrypted connections. Such inspection can detect intrusion, malware, and fraud, and can conduct troubleshooting, forensics, and performance monitoring. For these organizations, TLS inspection may serve as both a standard practice and a critical component of their threat detection and service assurance strategies." ; + d3f:kb-author "NIST" ; + d3f:kb-reference-of d3f:PassiveCertificateAnalysis ; + d3f:kb-reference-title "Securing Web Transactions TLS Server Certificate Management - Appendix A Passive Inspection" . + +d3f:Reference-SystemAndMethodForManagedSecurityAssessmentAndMitigation a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for managed security assessment and mitigation" ; + d3f:has-link "https://patents.google.com/patent/US9544324B2"^^xsd:anyURI ; + d3f:kb-abstract "In an embodiment of the invention, a system for assessing vulnerabilities includes: a security management system; a network device in a system under test (SUT), wherein the network device is privy to traffic in the SUT; and wherein the SMS is privy to traffic that is known by the network device and/or to one or more traffic observations that is known by the network device." ; + d3f:kb-author "Scott Parcel" ; + d3f:kb-organization "Cenzic Inc, Trustwave Holdings Inc" ; + d3f:kb-reference-of d3f:NetworkVulnerabilityAssessment ; + d3f:kb-reference-title "System and method for managed security assessment and mitigation" . + +d3f:Reference-SystemAndMethodsThereofForDetectionOfPersistentThreatsInAComputerizedEnvironmentBackground_PaloAltoNetworksIncCyberSecdoLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and methods thereof for detection of persistent threats in a computerized environment background - Palo Alto Networks IncCyber Secdo Ltd" ; + d3f:has-link "https://patents.google.com/patent/US20170206358A1/en?oq=US-2017206358-A1"^^xsd:anyURI ; + d3f:kb-abstract "A system is used for detection of advanced persistent and non-persistent threats in a computerized environment. The system is connected to a plurality of user devices coupled to an enterprise's network. The system receives via an interface an electronic notification of at least one event in the operating system of the computer. The system then analyzes the at least one event. The system then generates a causality chain for the at least one event respective of the analysis. The causality chain comprises all the threads that attributed to the at least one event in a chronological order. The system then identifies a main thread that started the causality chain that led to the at least one event. Then, the system determines whether the main thread is associated with malicious software. Upon determination that the main thread is associated with malicious software, the causality chain is marked as infected." ; + d3f:kb-author "Gil BARAK" ; + d3f:kb-mitre-analysis "The patent describes detecting malicious events on a host. For each new event (e.x. new file request received from a user device, a change in an existing file in a container) a causality chain is developed for all threads associated with the event. The causality chain identifies the thread that started the process of the event (main thread). If a thread in the causality chain has no parent, i.e. no main thread associated with it, the process is identified as malicious." ; + d3f:kb-organization "Palo Alto Networks IncCyber Secdo Ltd" ; + d3f:kb-reference-title "System and methods thereof for detection of persistent threats in a computerized environment background" . + +d3f:Reference-TechniquesForImpedingAndDetectingNetworkThreats_VerisignInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Techniques for impeding and detecting network threats - Verisign Inc" ; + d3f:has-link "https://patents.google.com/patent/US10904273B1/"^^xsd:anyURI ; + d3f:kb-abstract """Infinite DNS decoy trap resource to catch threats scanning for network resources to attack. + +In various embodiments, a name server transmits a canonical name as resolution to another canonical name. In operation, when a resource name is requested for resolution, a determination is made that the resource name corresponds to a trap resource name. A first canonical name is transmitted as resolution to the trap resource name. The first canonical name is requested for resolution, and a second canonical name is transmitted as resolution. By providing trap canonical names as resolutions to trap canonical names, unauthorized software making the resolution requests is kept occupied with requesting resolution of canonical name after canonical name, impeding the ability of the unauthorized software from traversing a network.""" ; + d3f:kb-author "Ben McCarty, James Graham" ; + d3f:kb-mitre-analysis "MITRE Analysis was not found." ; + d3f:kb-organization "Verisign Inc" ; + d3f:kb-reference-of d3f:DecoyNetworkResource ; + d3f:kb-reference-title "Techniques for impeding and detecting network threats" . + +d3f:Reference-TrustedCommunicationsWithChildProcesses_MicrosoftTechnologyLicensingLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Trusted Communications With Child Processes - Microsoft Technology Licensing LLC" ; + d3f:has-link "https://patents.google.com/patent/US20120174210A1"^^xsd:anyURI ; + d3f:kb-abstract "A method to identify a child process to a parent process in an operating system includes obtaining a token and login identifier from the operating system. The parent process creates a remote procedure call communications endpoint to communicate with the child process. Thereafter, a child process is spawned by the parent process. A child-initiated request to communicate with the parent process is then received by the parent process. In order to verify the identity of the child-initiated request, the parent process impersonates the child process and receives as identifier that identifies the requestor child process. The requestor process identifier and the spawned child identifier are compared. Based on the comparison, the parent process responds to the child-initiated request. In another embodiment, process identifiers are used by the parent process to verify the identity of a child process the requests communication with the parent process." ; + d3f:kb-author "Kedarnath Atmaram Dubhashi, Jonathan D. Schwartz, Sambavi Muthukrishnan, Simon Skaria" ; + d3f:kb-mitre-analysis "This patent describes a technique for detecting malicious processes that claim to be the child process of a legitimate parent process. During the spawning of a child process, a child process identifier is generated. The child process identifier is a unique identifier that can be used to identify a child process. The child process identifier is transmitted by the security system of the operating system to the parent process. The parent process keeps track of the child process identifier. When a new child-initiated communications request is received by the parent process, the parent process checks if the requesting child process identifier and the child process identifier that the parent process is tracking are the same. If the identifiers are not the same, the parent process refuses the request." ; + d3f:kb-organization "Microsoft Technology Licensing LLC" ; + d3f:kb-reference-title "Trusted Communications With Child Processes" . + +d3f:Reference-UseRkillToStopMalwareProcesses-Ghacks.net a d3f:TechniqueReference, + owl:NamedIndividual ; + rdfs:label "Reference - Use Rkill to Stop Malware Processes - ghacks.net" ; + d3f:has-link "https://www.ghacks.net/2011/07/29/use-rkill-to-stop-malware-processes/"^^xsd:anyURI ; + d3f:kb-author "Melanie Gross" ; + d3f:kb-organization "ghacks.net" ; + d3f:kb-reference-of d3f:ProcessTermination ; + d3f:kb-reference-title "Use Rkill to Stop Malware Processes" . + +d3f:RegOpenKeyA a d3f:GetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegOpenKeyA" . + +d3f:RegOpenKeyExA a d3f:GetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegOpenKeyExA" . + +d3f:RegOpenKeyExW a d3f:GetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegOpenKeyExW" . + +d3f:RegOpenKeyTransactedA a d3f:GetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegOpenKeyTransactedA" . + +d3f:RegOpenKeyTransactedW a d3f:GetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegOpenKeyTransactedW" . + +d3f:RegOpenKeyW a d3f:GetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegOpenKeyW" . + +d3f:RegSetKeyValueA a d3f:SetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegSetKeyValueA" . + +d3f:RegSetKeyValueW a d3f:SetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegSetKeyValueW" . + +d3f:RegSetValueA a d3f:SetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegSetValueA" . + +d3f:RegSetValueExA a d3f:SetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegSetValueExA" . + +d3f:RegSetValueExW a d3f:SetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegSetValueExW" . + +d3f:RegSetValueW a d3f:SetSystemConfigValue, + owl:NamedIndividual ; + rdfs:label "RegSetValueW" . + +d3f:RegexMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Regex Matching" ; + d3f:d3fend-id "D3A-RM" ; + d3f:definition "Regular expression matching is type of partial string matching using a regular expression, which is a sequence of characters that specifies a match pattern in text." ; + d3f:kb-article """## How it works + +A regular expression (shortened as regex or regexp) is a sequence of characters that specifies a match pattern in text. Usually such patterns are used by string-searching algorithms for "find" or "find and replace" operations on strings, or for input validation. + +## Key Test Considerations + +- **External review of regular expressions**: Regular expressions used in rules should be reviewed by a independent developer SME. Regex testing and visualization tools may be used to aid this review. Back-tests for failure modes identified during the review shoud be developed. Regular expressions are easy to get wrong and may appear to work on limited tests; small mistakes can lead to unintended misses and matches.] + +- **Processing Performance Review**: Review of resource-intensive rules may be necessary if system performance degraded. Look for cases of “exponential backtracking” Some regexes are computationally expensive. + +## References +1. Regular expression. (2023, June 1). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Regular_expression). +2. String-searching algorithm. (2023, April 8). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/String-searching_algorithm).""" ; + d3f:synonym "Regex", + "Regexp" ; + rdfs:subClassOf d3f:PartialMatching . + +d3f:Relational-basedTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Relational-based Transfer Learning" ; + d3f:d3fend-id "D3A-RBTL" ; + d3f:definition "Relational-based Transfer Learning is a subfield of machine learning where knowledge and patterns learned from one domain, characterized by relational and structured data, are transferred to enhance the learning of another related domain. This approach leverages shared concepts, relations, and structures across domains, taking advantage of the rich semantic knowledge within relational data to improve learning performance in the target task." ; + d3f:kb-article """## References +V7 Labs. (n.d.). Transfer Learning Guide. [Link](https://www.v7labs.com/blog/transfer-learning-guide#:~:text=Relational%2Dbased%20transfer%20learning%20approaches,domain%20to%20the%20target%20domain).""" ; + rdfs:subClassOf d3f:HomogenousTransferLearning . + +d3f:RemoteAuthenticationService a owl:Class ; + rdfs:label "Remote Authentication Service" ; + d3f:definition "A remote authentication service provides for the authentication of a user across a network (i.e., remotely)." ; + rdfs:subClassOf d3f:AuthenticationService, + d3f:NetworkService . + +d3f:RemoteAuthorizationService a owl:Class ; + rdfs:label "Remote Authorization Service" ; + d3f:definition "A remote authorization service provides for the authorization of a user across a network (i.e., remotely)." ; + rdfs:subClassOf d3f:AuthorizationService . + +d3f:RemoteDatabaseQuery a owl:Class ; + rdfs:label "Remote Database Query" ; + d3f:definition "A remote query session enabling a user to make an SQL, SPARQL, or similar query over the network from one host to another." ; + rdfs:subClassOf d3f:DatabaseQuery, + d3f:RemoteCommand . + +d3f:RemoteLoginSession a owl:Class ; + rdfs:label "Remote Login Session" ; + d3f:definition "A remote login session is a login session where a client has logged in from their local host machine to a server via a network." ; + rdfs:subClassOf d3f:NetworkSession . + +d3f:RemoteProcedureCall a owl:Class ; + rdfs:label "Remote Procedure Call" ; + d3f:definition "In distributed computing a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in another address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction. That is, the programmer writes essentially the same code whether the subroutine is local to the executing program, or remote. This is a form of client-server interaction (caller is client, executor is server), typically implemented via a request-response message-passing system. The object-oriented programming analog is remote method invocation (RMI). The RPC model implies a level of location transparency." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:RemoteCommand . + +d3f:RemoteTerminalSession a owl:Class ; + rdfs:label "Remote Terminal Session" ; + d3f:definition "A remote terminal session is a session that provides a user access from one host to another host via a terminal." ; + rdfs:subClassOf d3f:NetworkSession . + +d3f:RemoveUserFromGroupEvent a owl:Class ; + rdfs:label "Remove User from Group Event" ; + d3f:definition "An event where a user is removed from a group, revoking the permissions and privileges associated with the group from the user." ; + rdfs:subClassOf d3f:GroupManagementEvent . + +d3f:ResidualNeuralNetwork a owl:Class, + owl:NamedIndividual ; + rdfs:label "Residual Neural Network" ; + d3f:d3fend-id "D3A-RNN" ; + d3f:definition "A residual neural network (ResNet) is an artificial neural network (ANN). It is a gateless or open-gated variant of the HighwayNet, the first working very deep feedforward neural network with hundreds of layers, much deeper than previous neural networks." ; + d3f:kb-article """## References +Wikipedia contributors. (2021, August 23). Residual neural network. In Wikipedia, The Free Encyclopedia. [Link](https://en.wikipedia.org/wiki/Residual_neural_network)""" ; + rdfs:subClassOf d3f:ConvolutionalNeuralNetwork . + +d3f:RestorationEvent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Restoration Event" ; + d3f:definition "An event representing actions to return a compromised system or resource to a trusted operational state, such as through backup restoration, system reinstallation, or repair." ; + d3f:related d3f:Restore ; + rdfs:subClassOf d3f:SecurityEvent . + +d3f:ReverseProxyServer a owl:Class ; + rdfs:label "Reverse Proxy Server" ; + d3f:definition "In computer networks, a reverse proxy is a type of proxy server that retrieves resources on behalf of a client from one or more servers. These resources are then returned to the client, appearing as if they originated from the proxy server itself. Unlike a forward proxy, which is an intermediary for its associated clients to contact any server, a reverse proxy is an intermediary for its associated servers to be contacted by any client. In other words, a proxy acts on behalf of the client(s), while a reverse proxy acts on behalf of the server(s); a reverse proxy is usually an internal-facing proxy used as a 'front-end' to control and protect access to a server on a private network." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ProxyServer . + +d3f:RevokePrivilegesFromGroupEvent a owl:Class ; + rdfs:label "Revoke Privileges from Group Event" ; + d3f:definition "An event where specific privileges or rights are removed from a group, restricting its members from performing actions or accessing resources previously allowed by those privileges." ; + rdfs:subClassOf d3f:GroupManagementEvent . + +d3f:RubyScriptFile a d3f:ExecutableScript, + owl:NamedIndividual ; + rdfs:label "Ruby Script File" . + +d3f:SARSA a owl:Class, + owl:NamedIndividual ; + rdfs:label "SARSA" ; + d3f:d3fend-id "D3A-SAR" ; + d3f:definition "State-action-reward-state-action (SARSA) is an algorithm for learning a Markov decision process policy, used in the reinforcement learning area of machine learning." ; + d3f:kb-article """## References +State-action-reward-state-action. Wikipedia. [Link](https://en.wikipedia.org/wiki/State%E2%80%93action%E2%80%93reward%E2%80%93state%E2%80%93action).""" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Model-freeReinforcementLearning . + +d3f:SMBFileCreateEvent a owl:Class ; + rdfs:label "SMB File Create Event" ; + d3f:definition "An event where a file is created if it does not already exist, failing if the file is already present. This operation strictly enforces new file creation." ; + rdfs:subClassOf d3f:SMBEvent . + +d3f:SMBFileOpenEvent a owl:Class ; + rdfs:label "SMB File Open Event" ; + d3f:definition "An event where a file is opened if it exists, failing otherwise. This operation is used to access or query the existing file." ; + rdfs:subClassOf d3f:SMBEvent . + +d3f:SMBFileOpenIfEvent a owl:Class ; + rdfs:label "SMB File Open If Event" ; + d3f:definition "An event where a file is opened if it exists, or created if it does not. This operation merges file creation and access behavior." ; + rdfs:subClassOf d3f:SMBEvent . + +d3f:SMBFileOverwriteEvent a owl:Class ; + rdfs:label "SMB File Overwrite Event" ; + d3f:definition "An event where a file is opened and truncated if it exists, failing if the file does not already exist. This operation is destructive and focuses on replacing the file's contents." ; + rdfs:subClassOf d3f:SMBEvent . + +d3f:SMBFileOverwriteIfEvent a owl:Class ; + rdfs:label "SMB File Overwrite If Event" ; + d3f:definition "An event where a file is opened and truncated if it exists, or created otherwise. This operation combines destructive overwrite and creation behaviors." ; + rdfs:subClassOf d3f:SMBEvent . + +d3f:SMBFileSupersedeEvent a owl:Class ; + rdfs:label "SMB File Supersede Event" ; + d3f:definition "An event where a file is overwritten if it exists or created if it does not. This operation combines file creation and modification semantics." ; + rdfs:subClassOf d3f:SMBEvent . + +d3f:SPARTAThing a owl:Class ; + rdfs:label "SPARTA Thing" ; + rdfs:subClassOf d3f:ExternalThreatModelThing . + +d3f:SSHConnectionCloseEvent a owl:Class ; + rdfs:label "SSH Connection Close Event" ; + d3f:definition "An event indicating the termination of an SSH connection, signaling the end of a secure session." ; + rdfs:subClassOf d3f:NetworkConnectionCloseEvent, + d3f:SSHEvent . + +d3f:SSHConnectionFailEvent a owl:Class ; + rdfs:label "SSH Connection Fail Event" ; + d3f:definition "An event indicating a failure to establish an SSH connection, often due to issues such as authentication errors, network timeouts, or server unavailability." ; + rdfs:subClassOf d3f:NetworkConnectionFailEvent, + d3f:SSHEvent . + +d3f:SSHConnectionOpenEvent a owl:Class ; + rdfs:label "SSH Connection Open Event" ; + d3f:definition "An event indicating the successful establishment of an SSH connection between a client and a server, marking the initiation of a secure session." ; + rdfs:subClassOf d3f:NetworkConnectionOpenEvent, + d3f:SSHEvent . + +d3f:SSHConnectionRefuseEvent a owl:Class ; + rdfs:label "SSH Connection Refuse Event" ; + d3f:definition "An event indicating that an SSH connection attempt was refused, typically due to server-side restrictions or closed ports." ; + rdfs:subClassOf d3f:NetworkConnectionRefuseEvent, + d3f:SSHEvent . + +d3f:SSHConnectionResetEvent a owl:Class ; + rdfs:label "SSH Connection Reset Event" ; + d3f:definition "An event indicating the abrupt termination of an SSH connection due to protocol errors, network disruptions, or administrative actions." ; + rdfs:subClassOf d3f:NetworkConnectionResetEvent, + d3f:SSHEvent . + +d3f:SSHListenEvent a owl:Class ; + rdfs:label "SSH Listen Event" ; + d3f:definition "An event indicating that an SSH server has started listening for incoming connection requests, enabling potential clients to initiate secure sessions." ; + rdfs:subClassOf d3f:NetworkConnectionListenEvent, + d3f:SSHEvent . + +d3f:SavedInstructionPointer a owl:Class ; + rdfs:label "Saved Instruction Pointer" ; + d3f:definition "A saved instruction pointer points to the instruction that generated an exception (trap or fault)." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Pointer, + d3f:StackComponent . + +d3f:ScheduledJobCreationEvent a owl:Class ; + rdfs:label "Scheduled Job Creation Event" ; + d3f:definition "An event representing the addition of a new task to the system's scheduler, defining its execution criteria and associated actions." ; + rdfs:subClassOf d3f:ScheduledJobEvent . + +d3f:ScheduledJobDeletionEvent a owl:Class ; + rdfs:label "Scheduled Job Deletion Event" ; + d3f:definition "An event marking the removal of a scheduled task from the system, terminating its execution schedule." ; + rdfs:subClassOf d3f:ScheduledJobEvent . + +d3f:ScheduledJobDisableEvent a owl:Class ; + rdfs:label "Scheduled Job Disable Event" ; + d3f:definition "An event where a scheduled task is deactivated, preventing further execution until re-enabled." ; + rdfs:subClassOf d3f:ScheduledJobEvent . + +d3f:ScheduledJobEnableEvent a owl:Class ; + rdfs:label "Scheduled Job Enable Event" ; + d3f:definition "An event where a scheduled task is activated, allowing it to execute according to its defined parameters." ; + rdfs:subClassOf d3f:ScheduledJobEvent . + +d3f:ScheduledJobStartEvent a owl:Class ; + rdfs:label "Scheduled Job Start Event" ; + d3f:definition "An event indicating the execution of a scheduled task, triggered either automatically by the scheduler or manually by a user." ; + rdfs:subClassOf d3f:ScheduledJobEvent . + +d3f:ScheduledJobUpdateEvent a owl:Class ; + rdfs:label "Scheduled Job Update Event" ; + d3f:definition "An event where an existing scheduled task is updated, altering parameters such as timing, conditions, or actions." ; + rdfs:subClassOf d3f:ScheduledJobEvent . + +d3f:Scheduling a owl:Class ; + rdfs:label "Scheduling" ; + rdfs:subClassOf d3f:Planning . + +d3f:Second-stageBootLoader a owl:Class ; + rdfs:label "Second-stage Boot Loader" ; + d3f:definition "An optional, often feature rich, second stage set of routines run in order to load the operating system." ; + rdfs:subClassOf d3f:BootLoader . + +d3f:SecurityArchitects a d3f:TargetAudience, + owl:NamedIndividual ; + rdfs:label "Security Architects" . + +d3f:Self-organizingMap a owl:Class, + owl:NamedIndividual ; + rdfs:label "Self-organizing Map" ; + d3f:d3fend-id "D3A-SOM" ; + d3f:definition "A Self-Organizing Map (SOM) is a unsupervised learning model in Artificial Neural Network where the feature maps are the generated two-dimensional discretized form of an input space during the model training (based on competitive learning)" ; + d3f:kb-article """## References +GeeksforGeeks. (n.d.). ANN - Self Organizing Neural Network (SONN). [Link](https://www.geeksforgeeks.org/ann-self-organizing-neural-network-sonn/)""" ; + rdfs:subClassOf d3f:ANN-basedClustering . + +d3f:Semi-supervisedBoosting a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Boosting" ; + d3f:d3fend-id "D3A-SSB" ; + d3f:definition "Boosting methods can be readily extended to the semi-supervised setting, by introducing pseudo-labeled data after each learning step; which gives rise to the idea of semi-supervised boosting methods. The pseudo-labeling approach of self- training and co-training can be easily extended to boosting methods. Several boosting methods such as SSMBoost, ASSEMBLE, SemiBoost, RegBoost, etc can be found which can be applied for utilizing unlabeled datasets for supervised classifiers." ; + d3f:kb-article """## References +Jashish Shrestha. (n.d.). Beginner's Guide to Semi-Supervised Learning. [Link](http://jashish.com.np/blog/posts/beginners-guide-to-semi-supervised-learning/)""" ; + rdfs:subClassOf d3f:Semi-supervisedWrapperMethod . + +d3f:Semi-supervisedCluster-then-label a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Cluster-then-label" ; + d3f:d3fend-id "D3A-SSCTL" ; + d3f:definition "Pre-training methods are aimed to guide the parameters of a network towards interesting regions in model space using unlabeled data, before fine-tuning the parameters with the labeled data." ; + d3f:kb-article """## References +Jashish Shrestha. (n.d.). Beginner's Guide to Semi-Supervised Learning. [Link](http://jashish.com.np/blog/posts/beginners-guide-to-semi-supervised-learning/)""" ; + rdfs:subClassOf d3f:UnsupervisedPreprocessing . + +d3f:Semi-supervisedCo-training a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Co-training" ; + d3f:d3fend-id "D3A-SSCT" ; + d3f:definition "Multi-view co-training involves training the classifiers in completely different views of training data. On the other hand, single-view co-training methods are generally applied as ensemble methods." ; + d3f:kb-article """## References +Jashish Shrestha. (n.d.). Beginner's Guide to Semi-Supervised Learning. [Link](http://jashish.com.np/blog/posts/beginners-guide-to-semi-supervised-learning/)""" ; + rdfs:subClassOf d3f:Semi-supervisedWrapperMethod . + +d3f:Semi-supervisedFeatureExtraction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Feature Extraction" ; + d3f:d3fend-id "D3A-SSFE" ; + d3f:definition "Feature extraction refers to reducing the number of dimensions in a data point so that it is computationally feasible and effective to learn a model." ; + d3f:kb-article """## References +Jashish Shrestha. (n.d.). Beginner's Guide to Semi-Supervised Learning. [Link](http://jashish.com.np/blog/posts/beginners-guide-to-semi-supervised-learning/)""" ; + rdfs:subClassOf d3f:UnsupervisedPreprocessing . + +d3f:Semi-supervisedGenerativeModelLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Generative Model Learning" ; + d3f:d3fend-id "D3A-SSGML" ; + d3f:definition "A Semi Supervised Machine Learning model which assume that the distributions take some particular form p(x|y,theta) parameterized by the vector. If these assumptions are incorrect, the unlabeled data may actually decrease the accuracy of the solution relative to what would have been obtained from labeled data alone. However, if the assumptions are correct, then the unlabeled data necessarily improves performance." ; + d3f:kb-article """## References +Weak supervision. Wikipedia. [Link](https://en.wikipedia.org/wiki/Weak_supervision#Generative_models).""" ; + rdfs:subClassOf d3f:IntrinsicallySemi-supervisedLearning . + +d3f:Semi-supervisedInductiveLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Inductive Learning" ; + d3f:d3fend-id "D3A-SSIL" ; + d3f:definition """The goal of inductive learning is to infer the correct mapping from +X to Y""" ; + d3f:kb-article """## References +Semi-Supervised Learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Semi-Supervised_Learning#Semi-supervised_learning). + +Zhou, D., & Li, M. (2005). Semi-supervised learning by higher order regularization. In Proceedings of the 43rd Annual Meeting of the Association for Computational Linguistics (ACL) (pp. 1-9). [Link](https://www.cs.sfu.ca/~anoop/papers/pdf/semisup_naacl.pdf).""" ; + rdfs:subClassOf d3f:Semi-SupervisedLearning . + +d3f:Semi-supervisedManifoldLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Manifold Learning" ; + d3f:d3fend-id "D3A-SSML" ; + d3f:definition "A version of Semi-Supervised Learning that applies the Manifold assumption that the data like approximately on a manifold of much lower dimension than the input space." ; + d3f:kb-article """## References +Weak supervision. Wikipedia. [Link](https://en.wikipedia.org/wiki/Weak_supervision#Generative_models).""" ; + rdfs:subClassOf d3f:IntrinsicallySemi-supervisedLearning . + +d3f:Semi-supervisedPre-training a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Pre-training" ; + d3f:d3fend-id "D3A-SSPT" ; + d3f:definition "Pre-training methods are aimed to guide the parameters of a network towards interesting regions in model space using unlabeled data, before fine-tuning the parameters with the labeled data" ; + d3f:kb-article """## References +Jashish Shrestha. (n.d.). Beginner's Guide to Semi-Supervised Learning. [Link](http://jashish.com.np/blog/posts/beginners-guide-to-semi-supervised-learning/)""" ; + rdfs:subClassOf d3f:UnsupervisedPreprocessing . + +d3f:Semi-supervisedSelf-training a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Self-training" ; + d3f:d3fend-id "D3A-SSST" ; + d3f:definition "Self-training is the procedure in which a supervised method for classification or regression is modified it to work in a semi-supervised manner, taking advantage of labeled and unlabeled data" ; + d3f:kb-article """## References +AltexSoft. (n.d.). Semi-Supervised Learning: A Technical Guide with Python Examples. [Link](https://www.altexsoft.com/blog/semi-supervised-learning/#:~:text=One%20of%20the%20simplest%20examples,of%20labeled%20and%20unlabeled%20data.)""" ; + rdfs:subClassOf d3f:Semi-supervisedWrapperMethod . + +d3f:SeqGAN a owl:Class, + owl:NamedIndividual ; + rdfs:label "SeqGAN" ; + d3f:d3fend-id "D3A-SEQ" ; + d3f:definition "Sequence Generation Framework (SeqGAN) models the data generator as a stochastic policy in reinforcement learning (RL), SeqGAN bypasses the generator differentiation problem by directly performing gradient policy update." ; + d3f:kb-article """## References +Yu, L., Zhang, W., Wang, J., & Yu, Y. (2017). SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient. ArXiv preprint ArXiv:1609.05473. [Link](https://arxiv.org/abs/1609.05473)""" ; + d3f:synonym "Sequence GAN" ; + rdfs:subClassOf d3f:GenerativeAdversarialNetwork . + +d3f:SerializationFunction a owl:Class ; + rdfs:label "Serialization Function" ; + d3f:definition "A function which has an operation that serializes data." ; + rdfs:subClassOf d3f:Subroutine . + +d3f:ServiceDeletionEvent a owl:Class ; + rdfs:label "Service Deletion Event" ; + d3f:definition "An event capturing the uninstallation or deregistration of a service application, ensuring it is no longer operational or available to clients." ; + rdfs:subClassOf d3f:ApplicationDeletionEvent, + d3f:ServiceEvent . + +d3f:ServiceDisableEvent a owl:Class ; + rdfs:label "Service Disable Event" ; + d3f:definition "An event capturing the deactivation of a service application, preventing it from being started or accessed until re-enabled." ; + rdfs:subClassOf d3f:ApplicationDisableEvent, + d3f:ServiceEvent . + +d3f:ServiceEnableEvent a owl:Class ; + rdfs:label "Service Enable Event" ; + d3f:definition "An event representing the activation of a service application, allowing it to start and provide its background or networked functionality." ; + rdfs:subClassOf d3f:ApplicationEnableEvent, + d3f:ServiceEvent . + +d3f:ServiceInstallationEvent a owl:Class ; + rdfs:label "Service Installation Event" ; + d3f:definition "An event representing the installation or registration of a service application within the system, enabling it to provide background or reusable functionality." ; + rdfs:subClassOf d3f:ApplicationInstallationEvent, + d3f:ServiceEvent . + +d3f:ServiceRestartEvent a owl:Class ; + rdfs:label "Service Restart Event" ; + d3f:definition "An event describing the sequential stopping and starting of a service application to refresh its state, apply updates, or resolve operational issues." ; + rdfs:subClassOf d3f:ApplicationRestartEvent, + d3f:ServiceEvent . + +d3f:ServiceStartEvent a owl:Class ; + rdfs:label "Service Start Event" ; + d3f:definition "An event representing the initiation of a service application, transitioning it from an inactive state to an active state, enabling its background or networked operations." ; + rdfs:subClassOf d3f:ApplicationStartEvent, + d3f:ServiceEvent . + +d3f:ServiceStopEvent a owl:Class ; + rdfs:label "Service Stop Event" ; + d3f:definition "An event capturing the cessation of a service application’s operations, transitioning it to an inactive state while ceasing its functionality to clients or dependent systems." ; + rdfs:subClassOf d3f:ApplicationStopEvent, + d3f:ServiceEvent . + +d3f:ServiceUpdateEvent a owl:Class ; + rdfs:label "Service Update Event" ; + d3f:definition "An event describing changes made to a service application, such as updates, reconfigurations, or patch installations, ensuring its continued availability and functionality." ; + rdfs:subClassOf d3f:ApplicationUpdateEvent, + d3f:ServiceEvent . + +d3f:ShadowStack a owl:Class, + owl:NamedIndividual ; + rdfs:label "Shadow Stack" ; + d3f:copy-of d3f:CallStack ; + d3f:definition "A shadow stack is a mechanism for protecting a procedure's stored return address, such as from a stack buffer overflow. The shadow stack itself is a second, separate stack that \"shadows\" the program call stack. In the function prologue, a function stores its return address to both the call stack and the shadow stack. In the function epilogue, a function loads the return address from both the call stack and the shadow stack, and then compares them. If the two records of the return address differ, then an attack is detected." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:copy-of ; + owl:someValuesFrom d3f:CallStack ], + d3f:DigitalInformationBearer . + +d3f:SingularValueDecomposition a owl:Class, + owl:NamedIndividual ; + rdfs:label "Singular Value Decomposition" ; + d3f:d3fend-id "D3A-SVD" ; + d3f:definition "Singular Value Decomposition (SVD) is an algorithm that represents a matrix as a linear series of data and to find the set of factors that will best predict an outcome" ; + d3f:kb-article """## References +Wikipedia. (n.d.). Singular value decomposition. [Link](https://en.wikipedia.org/wiki/Singular_value_decomposition)""" ; + rdfs:subClassOf d3f:DimensionReduction . + +d3f:SoftwareArtifactServer a owl:Class ; + rdfs:label "Software Artifact Server" ; + d3f:definition "A software artifact server provides access to the software artifacts in a software repository. A software repository, or \"repo\" for short, is a storage location for software packages. Often a table of contents is stored, as well as metadata. Repositories group packages. Sometimes the grouping is for a programming language, such as CPAN for the Perl programming language, sometimes for an entire operating system, sometimes the license of the contents is the criteria. At client side, a package manager helps installing from and updating the repositories." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:ArtifactServer . + +d3f:SoftwareLibrary a owl:Class, + owl:NamedIndividual ; + rdfs:label "Software Library" ; + d3f:contains d3f:SoftwareLibraryFile ; + d3f:definition "A software library is a collection of software components that are used to build a software product." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:SoftwareLibraryFile ], + d3f:Software . + +d3f:SoftwarePatch a owl:Class ; + rdfs:label "Software Patch" ; + d3f:definition "A patch is a piece of software designed to update a computer program or its supporting data, to fix or improve it. This includes fixing security vulnerabilities and other bugs, with such patches usually called bugfixes or bug fixes, and improving the usability or performance. Although meant to fix problems, poorly designed patches can sometimes introduce new problems (see software regressions). In some special cases updates may knowingly break the functionality, for instance, by removing components for which the update provider is no longer licensed or disabling a device." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Software ; + skos:altLabel "Patch" . + +d3f:SoftwareRepository a owl:Class, + owl:NamedIndividual ; + rdfs:label "Software Repository" ; + d3f:contains d3f:SoftwarePackage ; + d3f:definition "A software repository, or repo for short, is a storage location for software packages. Often a table of contents is also stored, along with metadata. A software repository is typically managed by source or version control, or repository managers. Package managers allow automatically installing and updating repositories, sometimes called 'packages'." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:SoftwarePackage ], + d3f:Repository ; + skos:altLabel "Package Repository" . + +d3f:SomersD a owl:Class, + owl:NamedIndividual ; + rdfs:label "Somers' D" ; + d3f:d3fend-id "D3A-SD" ; + rdfs:subClassOf d3f:RankCorrelationCoefficient . + +d3f:SoundexMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Soundex Matching" ; + d3f:d3fend-id "D3A-SM" ; + d3f:definition "Soundex is a phonetic algorithm for indexing names by sound, as pronounced in English." ; + d3f:kb-article """## How it works +The goal is for homophones to be encoded to the same representation so that they can be matched despite minor differences in spelling. The algorithm mainly encodes consonants; a vowel will not be encoded unless it is the first letter. Soundex is the most widely known of all phonetic algorithms (in part because it is a standard feature of popular database software. Improvements to Soundex are the basis for many modern phonetic algorithms. + +## References +1. Soundex. (2023, April 19). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Soundex)""" ; + rdfs:subClassOf d3f:PartialMatching . + +d3f:SourceCodeAnalyzerTool a owl:Class ; + rdfs:label "Source Code Analyzer Tool" ; + d3f:definition "A source code analyzer tool is a static analysis tool that operates specifically on source code, but not object code." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:StaticAnalysisTool . + +d3f:SpearmansRankCorrelationCoefficient a owl:Class, + owl:NamedIndividual ; + rdfs:label "Spearman's Rank Correlation Coefficient" ; + d3f:d3fend-id "D3A-SRCC" ; + d3f:synonym "Spearman's Rho" ; + rdfs:subClassOf d3f:RankCorrelationCoefficient . + +d3f:SpectralClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Spectral Clustering" ; + d3f:d3fend-id "D3A-SC" ; + d3f:definition "Spectral clustering is a technique that identifies communities of nodes in a graph based on the edges connecting them." ; + d3f:kb-article """## References +Towards Data Science. (n.d.). Spectral Clustering. [Link](https://towardsdatascience.com/spectral-clustering-aba2640c0d5b)""" ; + rdfs:subClassOf d3f:Graph-basedClustering . + +d3f:StackSegment a owl:Class, + owl:NamedIndividual ; + rdfs:label "Stack Segment" ; + d3f:contains d3f:StackFrame ; + d3f:definition "The stack segment contains the program stack, a last-in-first-out structure, typically allocated in the higher parts of memory for the process." ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:StackFrame ], + d3f:ProcessSegment . + +d3f:Stacking a owl:Class, + owl:NamedIndividual ; + rdfs:label "Stacking" ; + d3f:d3fend-id "D3A-STA" ; + d3f:definition "Stacking is a method of using the results and predictions from one layer of ML models as inputs to another layer of ML models. Stacking (sometimes called stacked generalization) involves training a model to combine the predictions of several other learning algorithms." ; + d3f:kb-article """## References +Ensemble learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Ensemble_learning).""" ; + rdfs:subClassOf d3f:EnsembleLearning . + +d3f:StartupDirectory a owl:Class ; + rdfs:label "Startup Directory" ; + d3f:definition "A startup directory is a directory containing executable files or links to executable files which are run when a user logs in or when a system component or service is started." ; + rdfs:subClassOf d3f:Directory, + d3f:LocalResource . + +d3f:StorageDeviceEvent a owl:Class ; + rdfs:label "Storage Device Event" ; + d3f:definition "An event describing the activity, configuration, or errors of storage devices, including physical disks, SSDs, or logical partitions. These events often pertain to data availability, integrity, and storage health." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:SecondaryStorage ], + d3f:HardwareDeviceEvent . + +d3f:StringEquivalenceMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "String Equivalence Matching" ; + d3f:d3fend-id "D3A-SEM" ; + d3f:definition "String equivalence matching is a type of string pattern matching which is exact; that is, the strings being compared must have the same value for each character in their sequence and be of the same length." ; + d3f:kb-article """## References +1. String-searching algorithm. (2023, April 8). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/String-searching_algorithm) +2. Types of Equality. (2007, March 2). In _WikiWikiWeb_. [Link](https://wiki.c2.com/?TypesOfEquality)""" ; + rdfs:subClassOf d3f:EquivalenceMatching, + d3f:StringPatternMatching . + +d3f:StringFormatFunction a owl:Class ; + rdfs:label "String Format Function" ; + d3f:definition "A function which creates a new string based on a format specification and correspondingi specified values." ; + rdfs:subClassOf d3f:Subroutine . + +d3f:StyleGAN a owl:Class, + owl:NamedIndividual ; + rdfs:label "StyleGAN" ; + d3f:d3fend-id "D3A-STY" ; + d3f:definition "Successor to the ProGAN." ; + d3f:kb-article """## References +Wikipedia. (n.d.). StyleGAN. [Link](https://en.wikipedia.org/wiki/StyleGAN)""" ; + d3f:synonym "Style GAN" ; + rdfs:subClassOf d3f:ImageSynthesisGAN . + +d3f:SubspaceClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Subspace Clustering" ; + d3f:d3fend-id "D3A-SC" ; + d3f:definition "Subspace clustering is an extension of traditional clustering that seeks to find clusters in different subspaces within a dataset." ; + d3f:kb-article """## References +Parsons, L., Haque, E., & Liu, H. (2004). Subspace Clustering for High Dimensional Data: A Review. [Link](https://www.kdd.org/exploration_files/parsons.pdf)""" ; + rdfs:subClassOf d3f:CorrelationClustering . + +d3f:SubstringMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Substring Matching" ; + d3f:d3fend-id "D3A-SM" ; + d3f:definition "String-searching algorithms, sometimes called string-matching algorithms, are an important class of string algorithms that try to find a place where one or several strings (also called patterns) are found within a larger string or text." ; + d3f:kb-article """## References +1. String-searching algorithm. (2023, April 8). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/String-searching_algorithm)""" ; + rdfs:subClassOf d3f:PartialMatching . + +d3f:SupportVectorMachineClassification a owl:Class, + owl:NamedIndividual ; + rdfs:label "Support Vector Machine Classification" ; + d3f:d3fend-id "D3A-SVMC" ; + d3f:definition "Support Vector Machine (SVM) is a robust classification and regression technique that maximizes the predictive accuracy of a model without overfitting the training data. SVM is particularly suited to analyzing data with very large numbers (for example, thousands) of predictor fields." ; + d3f:kb-article """## References +About Support Vector Machine (SVM). IBM SPSS Modeler SaaS Documentation. [Link](https://www.ibm.com/docs/en/spss-modeler/saas?topic=models-about-svm&mhsrc=ibmsearch_a&mhq=support%20vector%20machine).""" ; + rdfs:subClassOf d3f:Classification . + +d3f:Switch a owl:Class ; + rdfs:label "Switch" ; + d3f:definition "A network switch (also called switching hub, bridging hub, and by the IEEE MAC bridge) is networking hardware that connects devices on a computer network by using packet switching to receive and forward data to the destination device. A network switch is a multiport network bridge that uses MAC addresses to forward data at the data link layer (layer 2) of the OSI model. Some switches can also forward data at the network layer (layer 3) by additionally incorporating routing functionality. Such switches are commonly known as layer-3 switches or multilayer switches." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ComputerNetworkNode ; + skos:altLabel "Bridging Hub", + "MAC Bridge", + "Network Switch", + "Switching Hub" . + +d3f:SymmetricFeature-basedTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Symmetric Feature-based Transfer Learning" ; + d3f:d3fend-id "D3A-SFTL" ; + d3f:definition "Homogeneous symmetric transformation takes both the source feature space Xs and target feature space Xt and learns feature transformations as to project each onto a common subspace Xc for adaptation purposes. This derived subspace becomes a domain-invariant feature subspace to associate cross-domain data, and in effect, reduces marginal distribution differences." ; + d3f:kb-article """## References +Day, O., & Khoshgoftaar, T.M. (2017). A survey on heterogeneous transfer learning. *Journal of Big Data, 4*(1), 29. [Link](https://doi.org/10.1186/s40537-017-0089-0).""" ; + rdfs:subClassOf d3f:HomogenousTransferLearning . + +d3f:SymmetricKey a owl:Class ; + rdfs:label "Symmetric Key" ; + d3f:definition "A symmetric key is a single key used for both encryption and decryption and used with a symmetric-key algorithm. Symmetric-key algorithms are algorithms for cryptography that use the same cryptographic keys for both encryption of plaintext and decryption of ciphertext. The keys may be identical or there may be a simple transformation to go between the two keys. The keys, in practice, represent a shared secret between two or more parties that can be used to maintain a private information link. This requirement that both parties have access to the secret key is one of the main drawbacks of symmetric key encryption, in comparison to public-key encrytption (also known as asymmetric key encryption)." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:CryptographicKey . + +d3f:SystemCallEvent a owl:Class ; + rdfs:label "System Call Event" ; + d3f:definition "An event where a user-space process requests a service or resource from the operating system kernel through a system call interface, enabling controlled interactions with hardware or kernel-level operations." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:SystemCall ], + d3f:KernelEvent . + +d3f:SystemInitProcess a owl:Class ; + rdfs:label "System Init Process" ; + d3f:definition "A system initialization process is a process that executes to initialize (boot) an operating system." ; + rdfs:seeAlso , + , + ; + rdfs:subClassOf d3f:OperatingSystemProcess ; + skos:altLabel "System Initialization Process", + "System Startup Process" . + +d3f:SystemUtilizationRecord a owl:Class ; + rdfs:label "System Utilization Record" ; + d3f:definition "A system utilization record is a record for the tracking of resource utilization e.g. CPU, Disk, Network, Memory Bandwidth, GPU, or other resources for a given time period." ; + rdfs:subClassOf d3f:Record . + +d3f:T1001.001 a owl:Class ; + rdfs:label "Junk Data" ; + d3f:attack-id "T1001.001" ; + d3f:definition "Adversaries may add junk data to protocols used for command and control to make detection more difficult.(Citation: FireEye SUNBURST Backdoor December 2020) By adding random or meaningless data to the protocols used for command and control, adversaries can prevent trivial methods for decoding, deciphering, or otherwise analyzing the traffic. Examples may include appending/prepending data with junk characters or writing junk characters between significant characters." ; + rdfs:subClassOf d3f:T1001 . + +d3f:T1001.002 a owl:Class ; + rdfs:label "Steganography" ; + d3f:attack-id "T1001.002" ; + d3f:definition "Adversaries may use steganographic techniques to hide command and control traffic to make detection efforts more difficult. Steganographic techniques can be used to hide data in digital messages that are transferred between systems. This hidden information can be used for command and control of compromised systems. In some cases, the passing of files embedded using steganography, such as image or document files, can be used for command and control." ; + rdfs:subClassOf d3f:T1001 . + +d3f:T1001.003 a owl:Class ; + rdfs:label "Protocol or Service Impersonation" ; + d3f:attack-id "T1001.003" ; + d3f:definition "Adversaries may impersonate legitimate protocols or web service traffic to disguise command and control activity and thwart analysis efforts. By impersonating legitimate protocols or web services, adversaries can make their command and control traffic blend in with legitimate network traffic." ; + rdfs:subClassOf d3f:T1001 . + +d3f:T1002 a owl:Class ; + rdfs:label "Data Compressed" ; + d3f:attack-id "T1002" ; + d3f:definition "An adversary may compress data (e.g., sensitive documents) that is collected prior to exfiltration in order to make it portable and minimize the amount of data sent over the network. The compression is done separately from the exfiltration channel and is performed using a custom program or algorithm, or a more common compression library or utility such as 7zip, RAR, ZIP, or zlib." ; + rdfs:comment "This technique has been revoked by T1560" ; + rdfs:seeAlso "T1560" ; + rdfs:subClassOf d3f:ExfiltrationTechnique ; + owl:deprecated true . + +d3f:T1003.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "LSASS Memory" ; + d3f:accesses d3f:AuthenticationService, + d3f:Process ; + d3f:attack-id "T1003.001" ; + d3f:definition "Adversaries may attempt to access credential material stored in the process memory of the Local Security Authority Subsystem Service (LSASS). After a user logs on, the system generates and stores a variety of credential materials in LSASS process memory. These credential materials can be harvested by an administrative user or SYSTEM and used to conduct [Lateral Movement](https://attack.mitre.org/tactics/TA0008) using [Use Alternate Authentication Material](https://attack.mitre.org/techniques/T1550)." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Process ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:AuthenticationService ], + d3f:T1003 . + +d3f:T1003.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Security Account Manager" ; + d3f:attack-id "T1003.002" ; + d3f:definition "Adversaries may attempt to extract credential material from the Security Account Manager (SAM) database either through in-memory techniques or through the Windows Registry where the SAM database is stored. The SAM is a database file that contains local accounts for the host, typically those found with the net user command. Enumerating the SAM database requires SYSTEM level access." ; + d3f:may-access d3f:AuthenticationService, + d3f:Process, + d3f:SystemPasswordDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:AuthenticationService ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:SystemPasswordDatabase ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:Process ], + d3f:T1003 . + +d3f:T1003.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "NTDS" ; + d3f:accesses d3f:EncryptedCredential ; + d3f:attack-id "T1003.003" ; + d3f:definition "Adversaries may attempt to access or create a copy of the Active Directory domain database in order to steal credential information, as well as obtain other information about domain members such as devices, users, and access rights. By default, the NTDS file (NTDS.dit) is located in %SystemRoot%\\NTDS\\Ntds.dit of a domain controller.(Citation: Wikipedia Active Directory)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:EncryptedCredential ], + d3f:T1003 . + +d3f:T1003.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "LSA Secrets" ; + d3f:attack-id "T1003.004" ; + d3f:definition "Adversaries with SYSTEM access to a host may attempt to access Local Security Authority (LSA) secrets, which can contain a variety of different credential materials, such as credentials for service accounts.(Citation: Passcape LSA Secrets)(Citation: Microsoft AD Admin Tier Model)(Citation: Tilbury Windows Credentials) LSA secrets are stored in the registry at HKEY_LOCAL_MACHINE\\SECURITY\\Policy\\Secrets. LSA secrets can also be dumped from memory.(Citation: ired Dumping LSA Secrets)" ; + d3f:may-access d3f:Process, + d3f:SystemPasswordDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:SystemPasswordDatabase ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:Process ], + d3f:T1003 . + +d3f:T1003.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cached Domain Credentials" ; + d3f:accesses d3f:EncryptedCredential ; + d3f:attack-id "T1003.005" ; + d3f:definition "Adversaries may attempt to access cached domain credentials used to allow authentication to occur in the event a domain controller is unavailable.(Citation: Microsoft - Cached Creds)" ; + d3f:may-modify d3f:Log ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:Log ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:EncryptedCredential ], + d3f:T1003 . + +d3f:T1003.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "DCSync" ; + d3f:attack-id "T1003.006" ; + d3f:definition "Adversaries may attempt to access credentials and other sensitive information by abusing a Windows Domain Controller's application programming interface (API)(Citation: Microsoft DRSR Dec 2017) (Citation: Microsoft GetNCCChanges) (Citation: Samba DRSUAPI) (Citation: Wine API samlib.dll) to simulate the replication process from a remote domain controller using a technique called DCSync." ; + d3f:may-modify d3f:EventLog ; + d3f:produces d3f:IntranetAdministrativeNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetAdministrativeNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:EventLog ], + d3f:T1003 . + +d3f:T1003.007 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Proc Filesystem" ; + d3f:accesses d3f:OperatingSystemFile, + d3f:ProcessImage ; + d3f:attack-id "T1003.007" ; + d3f:definition "Adversaries may gather credentials from the proc filesystem or `/proc`. The proc filesystem is a pseudo-filesystem used as an interface to kernel data structures for Linux based systems managing virtual memory. For each process, the `/proc//maps` file shows how memory is mapped within the process’s virtual address space. And `/proc//mem`, exposed for debugging purposes, provides access to the process’s virtual address space.(Citation: Picus Labs Proc cump 2022)(Citation: baeldung Linux proc map 2022)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:ProcessImage ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:OperatingSystemFile ], + d3f:T1003 . + +d3f:T1003.008 a owl:Class, + owl:NamedIndividual ; + rdfs:label "/etc/passwd and /etc/shadow" ; + d3f:accesses d3f:EncryptedCredential, + d3f:PasswordFile ; + d3f:attack-id "T1003.008" ; + d3f:definition "Adversaries may attempt to dump the contents of /etc/passwd and /etc/shadow to enable offline password cracking. Most modern Linux operating systems use a combination of /etc/passwd and /etc/shadow to store user account information including password hashes in /etc/shadow. By default, /etc/shadow is only readable by the root user.(Citation: Linux Password and Shadow File Formats)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:PasswordFile ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:EncryptedCredential ], + d3f:T1003 . + +d3f:T1004 a owl:Class ; + rdfs:label "Winlogon Helper DLL" ; + d3f:attack-id "T1004" ; + d3f:definition "Winlogon.exe is a Windows component responsible for actions at logon/logoff as well as the secure attention sequence (SAS) triggered by Ctrl-Alt-Delete. Registry entries in HKLM\\Software\\[Wow6432Node\\]Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\ and HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\ are used to manage additional helper programs and functionalities that support Winlogon. (Citation: Cylance Reg Persistence Sept 2013)" ; + rdfs:comment "This technique has been revoked by T1547.004" ; + rdfs:seeAlso "T1547.004" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Data from Local System" ; + d3f:accesses d3f:File, + d3f:LocalResource ; + d3f:attack-id "T1005" ; + d3f:definition "Adversaries may search local system sources, such as file systems and configuration files or local databases, to find files of interest and sensitive data prior to Exfiltration." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:LocalResource ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:File ], + d3f:CollectionTechnique . + +d3f:T1006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Direct Volume Access" ; + d3f:accesses d3f:Volume ; + d3f:attack-id "T1006" ; + d3f:definition "Adversaries may directly access a volume to bypass file access controls and file system monitoring. Windows allows programs to have direct access to logical volumes. Programs with direct access may read and write files directly from the drive by analyzing file system data structures. This technique may bypass Windows file access controls as well as file system monitoring tools. (Citation: Hakobyan 2009)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Volume ], + d3f:DefenseEvasionTechnique . + +d3f:T1007 a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Service Discovery" ; + d3f:attack-id "T1007" ; + d3f:definition "Adversaries may try to gather information about registered local system services. Adversaries may obtain information about services using tools as well as OS utility commands such as sc query, tasklist /svc, systemctl --type=service, and net start." ; + d3f:may-invoke d3f:CreateProcess, + d3f:GetRunningProcesses ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetRunningProcesses ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:DiscoveryTechnique . + +d3f:T1008 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Fallback Channels" ; + d3f:attack-id "T1008" ; + d3f:definition "Adversaries may use fallback or alternate communication channels if the primary channel is compromised or inaccessible in order to maintain reliable command and control and to avoid data transfer thresholds." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1009 a owl:Class ; + rdfs:label "Binary Padding" ; + d3f:attack-id "T1009" ; + d3f:definition "Adversaries can use binary padding to add junk data and change the on-disk representation of malware without affecting the functionality or behavior of the binary. This will often increase the size of the binary beyond what some security tools are capable of handling due to file size limitations." ; + rdfs:comment "This technique has been revoked by T1027.001" ; + rdfs:seeAlso "T1027.001" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1010 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Window Discovery" ; + d3f:attack-id "T1010" ; + d3f:definition "Adversaries may attempt to get a listing of open application windows. Window listings could convey information about how the system is used.(Citation: Prevailion DarkWatchman 2021) For example, information about application windows could be used identify potential data to collect as well as identifying security tooling ([Security Software Discovery](https://attack.mitre.org/techniques/T1518/001)) to evade.(Citation: ESET Grandoreiro April 2020)" ; + d3f:may-invoke d3f:CreateProcess, + d3f:GetOpenWindows ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetOpenWindows ], + d3f:DiscoveryTechnique . + +d3f:T1011.001 a owl:Class ; + rdfs:label "Exfiltration Over Bluetooth" ; + d3f:attack-id "T1011.001" ; + d3f:definition "Adversaries may attempt to exfiltrate data over Bluetooth rather than the command and control channel. If the command and control network is a wired Internet connection, an adversary may opt to exfiltrate data using a Bluetooth communication channel." ; + rdfs:subClassOf d3f:T1011 . + +d3f:T1012 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Query Registry" ; + d3f:accesses d3f:SystemConfigurationDatabase ; + d3f:attack-id "T1012" ; + d3f:definition "Adversaries may interact with the Windows Registry to gather information about the system, configuration, and installed software." ; + d3f:may-invoke d3f:GetSystemConfigValue ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetSystemConfigValue ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + d3f:DiscoveryTechnique . + +d3f:T1013 a owl:Class ; + rdfs:label "Port Monitors" ; + d3f:attack-id "T1013" ; + d3f:definition "A port monitor can be set through the (Citation: AddMonitor) API call to set a DLL to be loaded at startup. (Citation: AddMonitor) This DLL can be located in C:\\Windows\\System32 and will be loaded by the print spooler service, spoolsv.exe, on boot. The spoolsv.exe process also runs under SYSTEM level permissions. (Citation: Bloxham) Alternatively, an arbitrary DLL can be loaded if permissions allow writing a fully-qualified pathname for that DLL to HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print\\Monitors." ; + rdfs:comment "This technique has been revoked by T1547.010" ; + rdfs:seeAlso "T1547.010" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1014 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Rootkit" ; + d3f:attack-id "T1014" ; + d3f:definition "Adversaries may use rootkits to hide the presence of programs, files, network connections, services, drivers, and other system components. Rootkits are programs that hide the existence of malware by intercepting/hooking and modifying operating system API calls that supply system information. (Citation: Symantec Windows Rootkits)" ; + d3f:may-modify d3f:BootSector, + d3f:Firmware, + d3f:Kernel, + d3f:KernelModule, + d3f:SharedLibraryFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:Kernel ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:KernelModule ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:Firmware ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SharedLibraryFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:BootSector ], + d3f:DefenseEvasionTechnique . + +d3f:T1015 a owl:Class ; + rdfs:label "Accessibility Features" ; + d3f:attack-id "T1015" ; + d3f:definition "Windows contains accessibility features that may be launched with a key combination before a user has logged in (for example, when the user is on the Windows logon screen). An adversary can modify the way these programs are launched to get a command prompt or backdoor without logging in to the system." ; + rdfs:comment "This technique has been revoked by T1546.008" ; + rdfs:seeAlso "T1546.008" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1016.001 a owl:Class ; + rdfs:label "Internet Connection Discovery" ; + d3f:attack-id "T1016.001" ; + d3f:definition "Adversaries may check for Internet connectivity on compromised systems. This may be performed during automated discovery and can be accomplished in numerous ways such as using [Ping](https://attack.mitre.org/software/S0097), tracert, and GET requests to websites." ; + rdfs:subClassOf d3f:T1016 . + +d3f:T1016.002 a owl:Class ; + rdfs:label "Wi-Fi Discovery" ; + d3f:attack-id "T1016.002" ; + d3f:definition "Adversaries may search for information about Wi-Fi networks, such as network names and passwords, on compromised systems. Adversaries may use Wi-Fi information as part of [Account Discovery](https://attack.mitre.org/techniques/T1087), [Remote System Discovery](https://attack.mitre.org/techniques/T1018), and other discovery or [Credential Access](https://attack.mitre.org/tactics/TA0006) activity to support both ongoing and future campaigns." ; + rdfs:subClassOf d3f:T1016 . + +d3f:T1017 a owl:Class ; + rdfs:label "Application Deployment Software" ; + d3f:attack-id "T1017" ; + d3f:definition "Adversaries may deploy malicious software to systems within a network using application deployment systems employed by enterprise administrators. The permissions required for this action vary by system configuration; local credentials may be sufficient with direct access to the deployment server, or specific domain credentials may be required. However, the system may require an administrative account to log in or to perform software deployment." ; + rdfs:comment "This technique has been revoked by T1072" ; + rdfs:seeAlso "T1072" ; + rdfs:subClassOf d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1018 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote System Discovery" ; + d3f:attack-id "T1018" ; + d3f:definition "Adversaries may attempt to get a listing of other systems by IP address, hostname, or other logical identifier on a network that may be used for Lateral Movement from the current system. Functionality could exist within remote access tools to enable this, but utilities available on the operating system could also be used such as [Ping](https://attack.mitre.org/software/S0097) or net view using [Net](https://attack.mitre.org/software/S0039)." ; + d3f:may-access d3f:OperatingSystemConfigurationFile ; + d3f:may-invoke d3f:CreateProcess, + d3f:CreateSocket ; + d3f:produces d3f:NetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:OperatingSystemConfigurationFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateSocket ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:NetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:DiscoveryTechnique . + +d3f:T1019 a owl:Class ; + rdfs:label "System Firmware" ; + d3f:attack-id "T1019" ; + d3f:definition "The BIOS (Basic Input/Output System) and The Unified Extensible Firmware Interface (UEFI) or Extensible Firmware Interface (EFI) are examples of system firmware that operate as the software interface between the operating system and hardware of a computer. (Citation: Wikipedia BIOS) (Citation: Wikipedia UEFI) (Citation: About UEFI)" ; + rdfs:comment "This technique has been revoked by T1542.001" ; + rdfs:seeAlso "T1542.001" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1020.001 a owl:Class ; + rdfs:label "Traffic Duplication" ; + d3f:attack-id "T1020.001" ; + d3f:definition "Adversaries may leverage traffic mirroring in order to automate data exfiltration over compromised infrastructure. Traffic mirroring is a native feature for some devices, often used for network analysis. For example, devices may be configured to forward network traffic to one or more destinations for analysis by a network analyzer or other monitoring device. (Citation: Cisco Traffic Mirroring)(Citation: Juniper Traffic Mirroring)" ; + rdfs:subClassOf d3f:T1020 . + +d3f:T1021.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote Desktop Protocol" ; + d3f:attack-id "T1021.001" ; + d3f:creates d3f:RDPSession ; + d3f:definition "Adversaries may use [Valid Accounts](https://attack.mitre.org/techniques/T1078) to log into a computer using the Remote Desktop Protocol (RDP). The adversary may then perform actions as the logged-on user." ; + d3f:produces d3f:AdministrativeNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:RDPSession ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:AdministrativeNetworkTraffic ], + d3f:T1021 . + +d3f:T1021.002 a owl:Class ; + rdfs:label "SMB/Windows Admin Shares" ; + d3f:attack-id "T1021.002" ; + d3f:definition "Adversaries may use [Valid Accounts](https://attack.mitre.org/techniques/T1078) to interact with a remote network share using Server Message Block (SMB). The adversary may then perform actions as the logged-on user." ; + rdfs:subClassOf d3f:T1021 . + +d3f:T1021.003 a owl:Class ; + rdfs:label "Distributed Component Object Model" ; + d3f:attack-id "T1021.003" ; + d3f:definition "Adversaries may use [Valid Accounts](https://attack.mitre.org/techniques/T1078) to interact with remote machines by taking advantage of Distributed Component Object Model (DCOM). The adversary may then perform actions as the logged-on user." ; + rdfs:subClassOf d3f:T1021 . + +d3f:T1021.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "SSH" ; + d3f:attack-id "T1021.004" ; + d3f:creates d3f:SSHSession ; + d3f:definition "Adversaries may use [Valid Accounts](https://attack.mitre.org/techniques/T1078) to log into remote machines using Secure Shell (SSH). The adversary may then perform actions as the logged-on user." ; + d3f:produces d3f:AdministrativeNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:SSHSession ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:AdministrativeNetworkTraffic ], + d3f:T1021 . + +d3f:T1021.005 a owl:Class ; + rdfs:label "VNC" ; + d3f:attack-id "T1021.005" ; + d3f:definition "Adversaries may use [Valid Accounts](https://attack.mitre.org/techniques/T1078) to remotely control machines using Virtual Network Computing (VNC). VNC is a platform-independent desktop sharing system that uses the RFB (“remote framebuffer”) protocol to enable users to remotely control another computer’s display by relaying the screen, mouse, and keyboard inputs over the network.(Citation: The Remote Framebuffer Protocol)" ; + rdfs:subClassOf d3f:T1021 . + +d3f:T1021.006 a owl:Class ; + rdfs:label "Windows Remote Management" ; + d3f:attack-id "T1021.006" ; + d3f:definition "Adversaries may use [Valid Accounts](https://attack.mitre.org/techniques/T1078) to interact with remote systems using Windows Remote Management (WinRM). The adversary may then perform actions as the logged-on user." ; + rdfs:subClassOf d3f:T1021 . + +d3f:T1021.007 a owl:Class ; + rdfs:label "Cloud Services" ; + d3f:attack-id "T1021.007" ; + d3f:definition "Adversaries may log into accessible cloud services within a compromised environment using [Valid Accounts](https://attack.mitre.org/techniques/T1078) that are synchronized with or federated to on-premises user identities. The adversary may then perform management actions or access cloud-hosted resources as the logged-on user." ; + rdfs:subClassOf d3f:T1021 . + +d3f:T1021.008 a owl:Class ; + rdfs:label "Direct Cloud VM Connections" ; + d3f:attack-id "T1021.008" ; + d3f:definition "Adversaries may leverage [Valid Accounts](https://attack.mitre.org/techniques/T1078) to log directly into accessible cloud hosted compute infrastructure through cloud native methods. Many cloud providers offer interactive connections to virtual infrastructure that can be accessed through the [Cloud API](https://attack.mitre.org/techniques/T1059/009), such as Azure Serial Console(Citation: Azure Serial Console), AWS EC2 Instance Connect(Citation: EC2 Instance Connect)(Citation: lucr-3: Getting SaaS-y in the cloud), and AWS System Manager.(Citation: AWS System Manager)." ; + rdfs:subClassOf d3f:T1021 . + +d3f:T1022 a owl:Class ; + rdfs:label "Data Encrypted" ; + d3f:attack-id "T1022" ; + d3f:definition "Data is encrypted before being exfiltrated in order to hide the information that is being exfiltrated from detection or to make the exfiltration less conspicuous upon inspection by a defender. The encryption is performed by a utility, programming library, or custom algorithm on the data itself and is considered separate from any encryption performed by the command and control or file transfer protocol. Common file archive formats that can encrypt files are RAR and zip." ; + rdfs:comment "This technique has been revoked by T1560" ; + rdfs:seeAlso "T1560" ; + rdfs:subClassOf d3f:ExfiltrationTechnique ; + owl:deprecated true . + +d3f:T1023 a owl:Class ; + rdfs:label "Shortcut Modification" ; + d3f:attack-id "T1023" ; + d3f:definition "Shortcuts or symbolic links are ways of referencing other files or programs that will be opened or executed when the shortcut is clicked or executed by a system startup process. Adversaries could use shortcuts to execute their tools for persistence. They may create a new shortcut as a means of indirection that may use [Masquerading](https://attack.mitre.org/techniques/T1036) to look like a legitimate program. Adversaries could also edit the target path or entirely replace an existing shortcut so their tools will be executed instead of the intended legitimate program." ; + rdfs:comment "This technique has been revoked by T1547.009" ; + rdfs:seeAlso "T1547.009" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1024 a owl:Class ; + rdfs:label "Custom Cryptographic Protocol" ; + d3f:attack-id "T1024" ; + d3f:definition "Adversaries may use a custom cryptographic protocol or algorithm to hide command and control traffic. A simple scheme, such as XOR-ing the plaintext with a fixed key, will produce a very weak ciphertext." ; + rdfs:comment "This technique has been revoked by T1573" ; + rdfs:seeAlso "T1573" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1025 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Data from Removable Media" ; + d3f:accesses d3f:RemovableMediaDevice ; + d3f:attack-id "T1025" ; + d3f:definition "Adversaries may search connected removable media on computers they have compromised to find files of interest. Sensitive data can be collected from any removable media (optical disk drive, USB memory, etc.) connected to the compromised system prior to Exfiltration. Interactive command shells may be in use, and common functionality within [cmd](https://attack.mitre.org/software/S0106) may be used to gather information." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:RemovableMediaDevice ], + d3f:CollectionTechnique . + +d3f:T1026 a owl:Class ; + rdfs:label "Multiband Communication" ; + d3f:attack-id "T1026" ; + d3f:definition "**This technique has been deprecated and should no longer be used.**" ; + rdfs:comment "**This technique has been deprecated and should no longer be used.**" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1027.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Binary Padding" ; + d3f:attack-id "T1027.001" ; + d3f:definition "Adversaries may use binary padding to add junk data and change the on-disk representation of malware. This can be done without affecting the functionality or behavior of a binary, but can increase the size of the binary beyond what some security tools are capable of handling due to file size limitations." ; + d3f:modifies d3f:ExecutableBinary ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ExecutableBinary ], + d3f:T1027 . + +d3f:T1027.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Software Packing" ; + d3f:attack-id "T1027.002" ; + d3f:definition "Adversaries may perform software packing or virtual machine software protection to conceal their code. Software packing is a method of compressing or encrypting an executable. Packing an executable changes the file signature in an attempt to avoid signature-based detection. Most decompression techniques decompress the executable code in memory. Virtual machine software protection translates an executable's original code into a special format that only a special virtual machine can run. A virtual machine is then called to run this code.(Citation: ESET FinFisher Jan 2018)" ; + d3f:obfuscates d3f:ExecutableFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:obfuscates ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:T1027 . + +d3f:T1027.003 a owl:Class ; + rdfs:label "Steganography" ; + d3f:attack-id "T1027.003" ; + d3f:definition "Adversaries may use steganography techniques in order to prevent the detection of hidden information. Steganographic techniques can be used to hide data in digital media such as images, audio tracks, video clips, or text files." ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1027.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Compile After Delivery" ; + d3f:attack-id "T1027.004" ; + d3f:creates d3f:ExecutableFile ; + d3f:definition "Adversaries may attempt to make payloads difficult to discover and analyze by delivering files to victims as uncompiled code. Text-based source code files may subvert analysis and scrutiny from protections targeting executables/binaries. These payloads will need to be compiled before execution; typically via native utilities such as csc.exe or GCC/MinGW.(Citation: ClearSky MuddyWater Nov 2018)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:T1027 . + +d3f:T1027.005 a owl:Class ; + rdfs:label "Indicator Removal from Tools" ; + d3f:attack-id "T1027.005" ; + d3f:definition "Adversaries may remove indicators from tools if they believe their malicious tool was detected, quarantined, or otherwise curtailed. They can modify the tool by removing the indicator and using the updated version that is no longer detected by the target's defensive systems or subsequent targets that may use similar systems." ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1027.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "HTML Smuggling" ; + d3f:attack-id "T1027.006" ; + d3f:creates d3f:JavaScriptBlob ; + d3f:definition "Adversaries may smuggle data and files past content filters by hiding malicious payloads inside of seemingly benign HTML files. HTML documents can store large binary objects known as JavaScript Blobs (immutable data that represents raw bytes) that can later be constructed into file-like objects. Data may also be stored in Data URLs, which enable embedding media type or MIME files inline of HTML documents. HTML5 also introduced a download attribute that may be used to initiate file downloads.(Citation: HTML Smuggling Menlo Security 2020)(Citation: Outlflank HTML Smuggling 2018)" ; + d3f:hides d3f:DigitalArtifact ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hides ; + owl:someValuesFrom d3f:DigitalArtifact ], + [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:JavaScriptBlob ], + d3f:T1027 . + +d3f:T1027.007 a owl:Class ; + rdfs:label "Dynamic API Resolution" ; + d3f:attack-id "T1027.007" ; + d3f:definition "Adversaries may obfuscate then dynamically resolve API functions called by their malware in order to conceal malicious functionalities and impair defensive analysis. Malware commonly uses various [Native API](https://attack.mitre.org/techniques/T1106) functions provided by the OS to perform various tasks such as those involving processes, files, and other system artifacts." ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1027.008 a owl:Class ; + rdfs:label "Stripped Payloads" ; + d3f:attack-id "T1027.008" ; + d3f:definition "Adversaries may attempt to make a payload difficult to analyze by removing symbols, strings, and other human readable information. Scripts and executables may contain variables names and other strings that help developers document code functionality. Symbols are often created by an operating system’s `linker` when executable payloads are compiled. Reverse engineers use these symbols and strings to analyze code and to identify functionality in payloads.(Citation: Mandiant golang stripped binaries explanation)(Citation: intezer stripped binaries elf files 2018)" ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1027.009 a owl:Class ; + rdfs:label "Embedded Payloads" ; + d3f:attack-id "T1027.009" ; + d3f:definition "Adversaries may embed payloads within other files to conceal malicious content from defenses. Otherwise seemingly benign files (such as scripts and executables) may be abused to carry and obfuscate malicious payloads and content. In some cases, embedded payloads may also enable adversaries to [Subvert Trust Controls](https://attack.mitre.org/techniques/T1553) by not impacting execution controls such as digital signatures and notarization tickets.(Citation: Sentinel Labs)" ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1027.010 a owl:Class ; + rdfs:label "Command Obfuscation" ; + d3f:attack-id "T1027.010" ; + d3f:definition "Adversaries may obfuscate content during command execution to impede detection. Command-line obfuscation is a method of making strings and patterns within commands and scripts more difficult to signature and analyze. This type of obfuscation can be included within commands executed by delivered payloads (e.g., [Phishing](https://attack.mitre.org/techniques/T1566) and [Drive-by Compromise](https://attack.mitre.org/techniques/T1189)) or interactively via [Command and Scripting Interpreter](https://attack.mitre.org/techniques/T1059).(Citation: Akamai JS)(Citation: Malware Monday VBE)" ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1027.011 a owl:Class ; + rdfs:label "Fileless Storage" ; + d3f:attack-id "T1027.011" ; + d3f:definition "Adversaries may store data in \"fileless\" formats to conceal malicious activity from defenses. Fileless storage can be broadly defined as any format other than a file. Common examples of non-volatile fileless storage include the Windows Registry, event logs, or WMI repository.(Citation: Microsoft Fileless)(Citation: SecureList Fileless)" ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1027.012 a owl:Class ; + rdfs:label "LNK Icon Smuggling" ; + d3f:attack-id "T1027.012" ; + d3f:definition "Adversaries may smuggle commands to download malicious payloads past content filters by hiding them within otherwise seemingly benign windows shortcut files. Windows shortcut files (.LNK) include many metadata fields, including an icon location field (also known as the `IconEnvironmentDataBlock`) designed to specify the path to an icon file that is to be displayed for the LNK file within a host directory." ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1027.013 a owl:Class ; + rdfs:label "Encrypted/Encoded File" ; + d3f:attack-id "T1027.013" ; + d3f:definition "Adversaries may encrypt or encode files to obfuscate strings, bytes, and other specific patterns to impede detection. Encrypting and/or encoding file content aims to conceal malicious artifacts within a file used in an intrusion. Many other techniques, such as [Software Packing](https://attack.mitre.org/techniques/T1027/002), [Steganography](https://attack.mitre.org/techniques/T1027/003), and [Embedded Payloads](https://attack.mitre.org/techniques/T1027/009), share this same broad objective. Encrypting and/or encoding files could lead to a lapse in detection of static signatures, only for this malicious content to be revealed (i.e., [Deobfuscate/Decode Files or Information](https://attack.mitre.org/techniques/T1140)) at the time of execution/use." ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1027.014 a owl:Class ; + rdfs:label "Polymorphic Code" ; + d3f:attack-id "T1027.014" ; + d3f:definition "Adversaries may utilize polymorphic code (also known as metamorphic or mutating code) to evade detection. Polymorphic code is a type of software capable of changing its runtime footprint during code execution.(Citation: polymorphic-blackberry) With each execution of the software, the code is mutated into a different version of itself that achieves the same purpose or objective as the original. This functionality enables the malware to evade traditional signature-based defenses, such as antivirus and antimalware tools.(Citation: polymorphic-sentinelone)" ; + rdfs:subClassOf d3f:T1027 . + +d3f:T1028 a owl:Class ; + rdfs:label "Windows Remote Management" ; + d3f:attack-id "T1028" ; + d3f:definition "Windows Remote Management (WinRM) is the name of both a Windows service and a protocol that allows a user to interact with a remote system (e.g., run an executable, modify the Registry, modify services). (Citation: Microsoft WinRM) It may be called with the winrm command or by any number of programs such as PowerShell. (Citation: Jacobsen 2014)" ; + rdfs:comment "This technique has been revoked by T1021.006" ; + rdfs:seeAlso "T1021.006" ; + rdfs:subClassOf d3f:ExecutionTechnique, + d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1029 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Scheduled Transfer" ; + d3f:attack-id "T1029" ; + d3f:definition "Adversaries may schedule data exfiltration to be performed only at certain times of day or at certain intervals. This could be done to blend traffic patterns with normal activity or availability." ; + d3f:produces d3f:InternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InternetNetworkTraffic ], + d3f:ExfiltrationTechnique . + +d3f:T1030 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Data Transfer Size Limits" ; + d3f:attack-id "T1030" ; + d3f:definition "An adversary may exfiltrate data in fixed size chunks instead of whole files or limit packet sizes below certain thresholds. This approach may be used to avoid triggering network data transfer threshold alerts." ; + d3f:produces d3f:InternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InternetNetworkTraffic ], + d3f:ExfiltrationTechnique . + +d3f:T1031 a owl:Class ; + rdfs:label "Modify Existing Service" ; + d3f:attack-id "T1031" ; + d3f:definition "Windows service configuration information, including the file path to the service's executable or recovery programs/commands, is stored in the Registry. Service configurations can be modified using utilities such as sc.exe and [Reg](https://attack.mitre.org/software/S0075)." ; + rdfs:comment "This technique has been revoked by T1543.003" ; + rdfs:seeAlso "T1543.003" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1032 a owl:Class ; + rdfs:label "Standard Cryptographic Protocol" ; + d3f:attack-id "T1032" ; + d3f:definition "Adversaries may explicitly employ a known encryption algorithm to conceal command and control traffic rather than relying on any inherent protections provided by a communication protocol. Despite the use of a secure algorithm, these implementations may be vulnerable to reverse engineering if necessary secret keys are encoded and/or generated within malware samples/configuration files." ; + rdfs:comment "This technique has been revoked by T1573" ; + rdfs:seeAlso "T1573" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1033 a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Owner/User Discovery" ; + d3f:attack-id "T1033" ; + d3f:definition "Adversaries may attempt to identify the primary user, currently logged in user, set of users that commonly uses a system, or whether a user is actively using the system. They may do this, for example, by retrieving account usernames or by using [OS Credential Dumping](https://attack.mitre.org/techniques/T1003). The information may be collected in a number of different ways using other Discovery techniques, because user and username details are prevalent throughout a system and include running process ownership, file/directory ownership, session information, and system logs. Adversaries may use the information from [System Owner/User Discovery](https://attack.mitre.org/techniques/T1033) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions." ; + d3f:may-access d3f:DirectoryService, + d3f:GetSystemConfigValue, + d3f:PasswordFile, + d3f:ProcessSegment ; + d3f:may-invoke d3f:CopyToken, + d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:GetSystemConfigValue ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:ProcessSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:PasswordFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CopyToken ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:DirectoryService ], + d3f:DiscoveryTechnique . + +d3f:T1034 a owl:Class ; + rdfs:label "Path Interception" ; + d3f:attack-id "T1034" ; + d3f:definition "**This technique has been deprecated. Please use [Path Interception by PATH Environment Variable](https://attack.mitre.org/techniques/T1574/007), [Path Interception by Search Order Hijacking](https://attack.mitre.org/techniques/T1574/008), and/or [Path Interception by Unquoted Path](https://attack.mitre.org/techniques/T1574/009).**" ; + rdfs:comment "**This technique has been deprecated. Please use [Path Interception by PATH Environment Variable](https://attack.mitre.org/techniques/T1574/007), [Path Interception by Search Order Hijacking](https://attack.mitre.org/techniques/T1574/008), and/or [Path Interception by Unquoted Path](https://attack.mitre.org/techniques/T1574/009).**" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1035 a owl:Class ; + rdfs:label "Service Execution" ; + d3f:attack-id "T1035" ; + d3f:definition "Adversaries may execute a binary, command, or script via a method that interacts with Windows services, such as the Service Control Manager. This can be done by either creating a new service or modifying an existing service. This technique is the execution used in conjunction with [New Service](https://attack.mitre.org/techniques/T1050) and [Modify Existing Service](https://attack.mitre.org/techniques/T1031) during service persistence or privilege escalation." ; + rdfs:comment "This technique has been revoked by T1569.002" ; + rdfs:seeAlso "T1569.002" ; + rdfs:subClassOf d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1036.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Invalid Code Signature" ; + d3f:attack-id "T1036.001" ; + d3f:creates d3f:ExecutableBinary ; + d3f:definition "Adversaries may attempt to mimic features of valid code signatures to increase the chance of deceiving a user, analyst, or tool. Code signing provides a level of authenticity on a binary from the developer and a guarantee that the binary has not been tampered with. Adversaries can copy the metadata and signature information from a signed program, then use it as a template for an unsigned program. Files with invalid code signatures will fail digital signature validation checks, but they may appear more legitimate to users and security tools may improperly handle these files.(Citation: Threatexpress MetaTwin 2017)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ExecutableBinary ], + d3f:T1036 . + +d3f:T1036.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Right-to-Left Override" ; + d3f:attack-id "T1036.002" ; + d3f:definition "Adversaries may abuse the right-to-left override (RTLO or RLO) character (U+202E) to disguise a string and/or file name to make it appear benign. RTLO is a non-printing Unicode character that causes the text that follows it to be displayed in reverse. For example, a Windows screensaver executable named March 25 \\u202Excod.scr will display as March 25 rcs.docx. A JavaScript file named photo_high_re\\u202Egnp.js will be displayed as photo_high_resj.png.(Citation: Infosecinstitute RTLO Technique)" ; + d3f:modifies d3f:FileSystemMetadata ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:FileSystemMetadata ], + d3f:T1036 . + +d3f:T1036.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Rename System Utilities" ; + d3f:attack-id "T1036.003" ; + d3f:definition "Adversaries may rename legitimate system utilities to try to evade security mechanisms concerning the usage of those utilities. Security monitoring and control mechanisms may be in place for system utilities adversaries are capable of abusing. (Citation: LOLBAS Main Site) It may be possible to bypass those security mechanisms by renaming the utility prior to utilization (ex: rename rundll32.exe). (Citation: Elastic Masquerade Ball) An alternative case occurs when a legitimate utility is copied or moved to a different directory and renamed to avoid detections based on system utilities executing from non-standard paths. (Citation: F-Secure CozyDuke)" ; + d3f:may-create d3f:ExecutableFile ; + d3f:may-modify d3f:OperatingSystemExecutableFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:OperatingSystemExecutableFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:T1036 . + +d3f:T1036.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Masquerade Task or Service" ; + d3f:attack-id "T1036.004" ; + d3f:definition "Adversaries may attempt to manipulate the name of a task or service to make it appear legitimate or benign. Tasks/services executed by the Task Scheduler or systemd will typically be given a name and/or description.(Citation: TechNet Schtasks)(Citation: Systemd Service Units) Windows services will have a service name as well as a display name. Many benign tasks and services exist that have commonly associated names. Adversaries may give tasks or services names that are similar or identical to those of legitimate ones." ; + d3f:modifies d3f:JobSchedule ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:JobSchedule ], + d3f:T1036 . + +d3f:T1036.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Match Legitimate Name or Location" ; + d3f:attack-id "T1036.005" ; + d3f:definition "Adversaries may match or approximate the name or location of legitimate files or resources when naming/placing them. This is done for the sake of evading defenses and observation. This may be done by placing an executable in a commonly trusted directory (ex: under System32) or giving it the name of a legitimate, trusted program (ex: svchost.exe). In containerized environments, this may also be done by creating a resource in a namespace that matches the naming convention of a container pod or cluster. Alternatively, a file or container image name given may be a close approximation to legitimate programs/images or something innocuous." ; + d3f:invokes d3f:MoveFile ; + d3f:may-create d3f:File ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:MoveFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:File ], + d3f:T1036 . + +d3f:T1036.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Space after Filename" ; + d3f:attack-id "T1036.006" ; + d3f:creates d3f:File ; + d3f:definition "Adversaries can hide a program's true filetype by changing the extension of a file. With certain file types (specifically this does not work with .app extensions), appending a space to the end of a filename will change how the file is processed by the operating system." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:File ], + d3f:T1036 . + +d3f:T1036.007 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Double File Extension" ; + d3f:attack-id "T1036.007" ; + d3f:definition "Adversaries may abuse a double extension in the filename as a means of masquerading the true file type. A file name may include a secondary file type extension that may cause only the first extension to be displayed (ex: File.txt.exe may render in some views as just File.txt). However, the second extension is the true file type that determines how the file is opened and executed. The real file extension may be hidden by the operating system in the file browser (ex: explorer.exe), as well as in any software configured using or similar to the system’s policies.(Citation: PCMag DoubleExtension)(Citation: SOCPrime DoubleExtension)" ; + d3f:modifies d3f:FileSystemMetadata ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:FileSystemMetadata ], + d3f:T1036 . + +d3f:T1036.008 a owl:Class ; + rdfs:label "Masquerade File Type" ; + d3f:attack-id "T1036.008" ; + d3f:definition "Adversaries may masquerade malicious payloads as legitimate files through changes to the payload's formatting, including the file’s signature, extension, and contents. Various file types have a typical standard format, including how they are encoded and organized. For example, a file’s signature (also known as header or magic bytes) is the beginning bytes of a file and is often used to identify the file’s type. For example, the header of a JPEG file, is 0xFF 0xD8 and the file extension is either `.JPE`, `.JPEG` or `.JPG`." ; + rdfs:subClassOf d3f:T1036 . + +d3f:T1036.009 a owl:Class ; + rdfs:label "Break Process Trees" ; + d3f:attack-id "T1036.009" ; + d3f:definition "An adversary may attempt to evade process tree-based analysis by modifying executed malware's parent process ID (PPID). If endpoint protection software leverages the “parent-child\" relationship for detection, breaking this relationship could result in the adversary’s behavior not being associated with previous process tree activity. On Unix-based systems breaking this process tree is common practice for administrators to execute software using scripts and programs.(Citation: 3OHA double-fork 2022)" ; + rdfs:subClassOf d3f:T1036 . + +d3f:T1036.010 a owl:Class ; + rdfs:label "Masquerade Account Name" ; + d3f:attack-id "T1036.010" ; + d3f:definition "Adversaries may match or approximate the names of legitimate accounts to make newly created ones appear benign. This will typically occur during [Create Account](https://attack.mitre.org/techniques/T1136), although accounts may also be renamed at a later date. This may also coincide with [Account Access Removal](https://attack.mitre.org/techniques/T1531) if the actor first deletes an account before re-creating one with the same name.(Citation: Huntress MOVEit 2023)" ; + rdfs:subClassOf d3f:T1036 . + +d3f:T1037.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Logon Script (Windows)" ; + d3f:attack-id "T1037.001" ; + d3f:definition "Adversaries may use Windows logon scripts automatically executed at logon initialization to establish persistence. Windows allows logon scripts to be run whenever a specific user or group of users log into a system.(Citation: TechNet Logon Scripts) This is done via adding a path to a script to the HKCU\\Environment\\UserInitMprLogonScript Registry key.(Citation: Hexacorn Logon Scripts)" ; + d3f:modifies d3f:UserInitScript ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:UserInitScript ], + d3f:T1037 . + +d3f:T1037.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Login Hook" ; + d3f:attack-id "T1037.002" ; + d3f:definition "Adversaries may use a Login Hook to establish persistence executed upon user logon. A login hook is a plist file that points to a specific script to execute with root privileges upon user logon. The plist file is located in the /Library/Preferences/com.apple.loginwindow.plist file and can be modified using the defaults command-line utility. This behavior is the same for logout hooks where a script can be executed upon user logout. All hooks require administrator permissions to modify or create hooks.(Citation: Login Scripts Apple Dev)(Citation: LoginWindowScripts Apple Dev)" ; + d3f:modifies d3f:UserInitScript ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:UserInitScript ], + d3f:T1037 . + +d3f:T1037.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Logon Script" ; + d3f:attack-id "T1037.003" ; + d3f:definition "Group Policy Object / Active Directory Users and Computers are both Active Directory-based" ; + d3f:modifies d3f:NetworkInitScriptFileResource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:NetworkInitScriptFileResource ], + d3f:T1037 . + +d3f:T1037.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "RC Scripts" ; + d3f:attack-id "T1037.004" ; + d3f:definition "Adversaries may establish persistence by modifying RC scripts which are executed during a Unix-like system’s startup. These files allow system administrators to map and start custom services at startup for different run levels. RC scripts require root privileges to modify." ; + d3f:modifies d3f:SystemInitScript ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemInitScript ], + d3f:T1037 . + +d3f:T1037.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Startup Items" ; + d3f:attack-id "T1037.005" ; + d3f:definition "Adversaries may use startup items automatically executed at boot initialization to establish persistence. Startup items execute during the final phase of the boot process and contain shell scripts or other executable files along with configuration information used by the system to determine the execution order for all startup items.(Citation: Startup Items)" ; + d3f:modifies d3f:SystemStartupDirectory ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemStartupDirectory ], + d3f:T1037 . + +d3f:T1038 a owl:Class ; + rdfs:label "DLL Search Order Hijacking" ; + d3f:attack-id "T1038" ; + d3f:definition "Windows systems use a common method to look for required DLLs to load into a program. (Citation: Microsoft DLL Search) Adversaries may take advantage of the Windows DLL search order and programs that ambiguously specify DLLs to gain privilege escalation and persistence." ; + rdfs:comment "This technique has been revoked by T1574.001" ; + rdfs:seeAlso "T1574.001" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1039 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Data from Network Shared Drive" ; + d3f:accesses d3f:NetworkFileShareResource ; + d3f:attack-id "T1039" ; + d3f:definition "Adversaries may search network shares on computers they have compromised to find files of interest. Sensitive data can be collected from remote systems via shared network drives (host shared directory, network file server, etc.) that are accessible from the current system prior to Exfiltration. Interactive command shells may be in use, and common functionality within [cmd](https://attack.mitre.org/software/S0106) may be used to gather information." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:NetworkFileShareResource ], + d3f:CollectionTechnique . + +d3f:T1040 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Sniffing" ; + d3f:attack-id "T1040" ; + d3f:definition "Adversaries may passively sniff network traffic to capture information about an environment, including authentication material passed over the network. Network sniffing refers to using the network interface on a system to monitor or capture information sent over a wired or wireless connection. An adversary may place a network interface into promiscuous mode to passively access data in transit over the network, or use span ports to capture a larger amount of data." ; + d3f:may-produce d3f:DNSLookup ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-produce ; + owl:someValuesFrom d3f:DNSLookup ], + d3f:CredentialAccessTechnique, + d3f:DiscoveryTechnique . + +d3f:T1041 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration Over C2 Channel" ; + d3f:attack-id "T1041" ; + d3f:definition "Adversaries may steal data by exfiltrating it over an existing command and control channel. Stolen data is encoded into the normal communications channel using the same protocol as command and control communications." ; + d3f:may-transfer d3f:CertificateFile ; + d3f:produces d3f:InternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InternetNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:may-transfer ; + owl:someValuesFrom d3f:CertificateFile ], + d3f:ExfiltrationTechnique . + +d3f:T1042 a owl:Class ; + rdfs:label "Change Default File Association" ; + d3f:attack-id "T1042" ; + d3f:definition "When a file is opened, the default program used to open the file (also called the file association or handler) is checked. File association selections are stored in the Windows Registry and can be edited by users, administrators, or programs that have Registry access (Citation: Microsoft Change Default Programs) (Citation: Microsoft File Handlers) or by administrators using the built-in assoc utility. (Citation: Microsoft Assoc Oct 2017) Applications can modify the file association for a given file extension to call an arbitrary program when a file with the given extension is opened." ; + rdfs:comment "This technique has been revoked by T1546.001" ; + rdfs:seeAlso "T1546.001" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1043 a owl:Class ; + rdfs:label "Commonly Used Port" ; + d3f:attack-id "T1043" ; + d3f:definition "**This technique has been deprecated. Please use [Non-Standard Port](https://attack.mitre.org/techniques/T1571) where appropriate.**" ; + rdfs:comment "**This technique has been deprecated. Please use [Non-Standard Port](https://attack.mitre.org/techniques/T1571) where appropriate.**" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1044 a owl:Class ; + rdfs:label "File System Permissions Weakness" ; + d3f:attack-id "T1044" ; + d3f:definition "Processes may automatically execute specific binaries as part of their functionality or to perform other actions. If the permissions on the file system directory containing a target binary, or permissions on the binary itself, are improperly set, then the target binary may be overwritten with another binary using user-level permissions and executed by the original process. If the original process and thread are running under a higher permissions level, then the replaced binary will also execute under higher-level permissions, which could include SYSTEM." ; + rdfs:comment "This technique has been revoked by T1574.010" ; + rdfs:seeAlso "T1574.010" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1045 a owl:Class ; + rdfs:label "Software Packing" ; + d3f:attack-id "T1045" ; + d3f:definition "Software packing is a method of compressing or encrypting an executable. Packing an executable changes the file signature in an attempt to avoid signature-based detection. Most decompression techniques decompress the executable code in memory." ; + rdfs:comment "This technique has been revoked by T1027.002" ; + rdfs:seeAlso "T1027.002" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1046 a owl:Class ; + rdfs:label "Network Service Discovery" ; + d3f:attack-id "T1046" ; + d3f:definition "Adversaries may attempt to get a listing of services running on remote hosts and local network infrastructure devices, including those that may be vulnerable to remote software exploitation. Common methods to acquire this information include port and/or vulnerability scans using tools that are brought onto a system.(Citation: CISA AR21-126A FIVEHANDS May 2021)" ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1047 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows Management Instrumentation" ; + d3f:attack-id "T1047" ; + d3f:definition "Adversaries may abuse Windows Management Instrumentation (WMI) to execute malicious commands and payloads. WMI is designed for programmers and is the infrastructure for management data and operations on Windows systems.(Citation: WMI 1-3) WMI is an administration feature that provides a uniform environment to access Windows system components." ; + d3f:may-create d3f:IntranetAdministrativeNetworkTraffic ; + d3f:may-invoke d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:IntranetAdministrativeNetworkTraffic ], + d3f:ExecutionTechnique . + +d3f:T1048.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration Over Symmetric Encrypted Non-C2 Protocol" ; + d3f:attack-id "T1048.001" ; + d3f:definition "Adversaries may steal data by exfiltrating it over a symmetrically encrypted network protocol other than that of the existing command and control channel. The data may also be sent to an alternate network location from the main command and control server." ; + d3f:produces d3f:OutboundInternetEncryptedTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetEncryptedTraffic ], + d3f:T1048 . + +d3f:T1048.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration Over Asymmetric Encrypted Non-C2 Protocol" ; + d3f:attack-id "T1048.002" ; + d3f:definition "Adversaries may steal data by exfiltrating it over an asymmetrically encrypted network protocol other than that of the existing command and control channel. The data may also be sent to an alternate network location from the main command and control server." ; + d3f:may-transfer d3f:CertificateFile ; + d3f:produces d3f:OutboundInternetEncryptedTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-transfer ; + owl:someValuesFrom d3f:CertificateFile ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetEncryptedTraffic ], + d3f:T1048 . + +d3f:T1048.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration Over Unencrypted Non-C2 Protocol" ; + d3f:attack-id "T1048.003" ; + d3f:definition "Adversaries may steal data by exfiltrating it over an un-encrypted network protocol other than that of the existing command and control channel. The data may also be sent to an alternate network location from the main command and control server.(Citation: copy_cmd_cisco)" ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:T1048 . + +d3f:T1049 a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Network Connections Discovery" ; + d3f:attack-id "T1049" ; + d3f:definition "Adversaries may attempt to get a listing of network connections to or from the compromised system they are currently accessing or from remote systems by querying for information over the network." ; + d3f:may-invoke d3f:GetOpenSockets ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetOpenSockets ], + d3f:DiscoveryTechnique . + +d3f:T1050 a owl:Class ; + rdfs:label "New Service" ; + d3f:attack-id "T1050" ; + d3f:definition "When operating systems boot up, they can start programs or applications called services that perform background system functions. (Citation: TechNet Services) A service's configuration information, including the file path to the service's executable, is stored in the Windows Registry." ; + rdfs:comment "This technique has been revoked by T1543.003" ; + rdfs:seeAlso "T1543.003" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1051 a owl:Class ; + rdfs:label "Shared Webroot" ; + d3f:attack-id "T1051" ; + d3f:definition "**This technique has been deprecated and should no longer be used.**" ; + rdfs:comment "**This technique has been deprecated and should no longer be used.**" ; + rdfs:subClassOf d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1052.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration over USB" ; + d3f:attack-id "T1052.001" ; + d3f:definition "Adversaries may attempt to exfiltrate data over a USB connected physical device. In certain circumstances, such as an air-gapped network compromise, exfiltration could occur via a USB device introduced by a user. The USB device could be used as the final exfiltration point or to hop between otherwise disconnected systems." ; + d3f:modifies d3f:RemovableMediaDevice ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:RemovableMediaDevice ], + d3f:T1052 . + +d3f:T1053.001 a owl:Class ; + rdfs:label "At (Linux) Execution" ; + d3f:attack-id "T1053.001" ; + d3f:definition "Adversaries may abuse the [at](https://attack.mitre.org/software/S0110) utility to perform task scheduling for initial, recurring, or future execution of malicious code. The [at](https://attack.mitre.org/software/S0110) command within Linux operating systems enables administrators to schedule tasks.(Citation: Kifarunix - Task Scheduling in Linux)" ; + rdfs:comment "This technique has been revoked by T1053.002" ; + rdfs:seeAlso "T1053.002" ; + rdfs:subClassOf d3f:T1053 ; + owl:deprecated true . + +d3f:T1053.002 a owl:Class ; + rdfs:label "At" ; + d3f:attack-id "T1053.002" ; + d3f:definition "Adversaries may abuse the [at](https://attack.mitre.org/software/S0110) utility to perform task scheduling for initial or recurring execution of malicious code. The [at](https://attack.mitre.org/software/S0110) utility exists as an executable within Windows, Linux, and macOS for scheduling tasks at a specified time and date. Although deprecated in favor of [Scheduled Task](https://attack.mitre.org/techniques/T1053/005)'s [schtasks](https://attack.mitre.org/software/S0111) in Windows environments, using [at](https://attack.mitre.org/software/S0110) requires that the Task Scheduler service be running, and the user to be logged on as a member of the local Administrators group." ; + rdfs:subClassOf d3f:T1053 . + +d3f:T1053.003 a owl:Class ; + rdfs:label "Cron" ; + d3f:attack-id "T1053.003" ; + d3f:definition "Adversaries may abuse the cron utility to perform task scheduling for initial or recurring execution of malicious code.(Citation: 20 macOS Common Tools and Techniques) The cron utility is a time-based job scheduler for Unix-like operating systems. The crontab file contains the schedule of cron entries to be run and the specified times for execution. Any crontab files are stored in operating system-specific file paths." ; + rdfs:subClassOf d3f:T1053 . + +d3f:T1053.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Launchd" ; + d3f:attack-id "T1053.004" ; + d3f:creates d3f:PropertyListFile ; + d3f:definition "This technique is deprecated due to the inaccurate usage. The report cited did not provide technical detail as to how the malware interacted directly with launchd rather than going through known services. Other system services are used to interact with launchd rather than launchd being used by itself." ; + rdfs:comment "This technique is deprecated due to the inaccurate usage. The report cited did not provide technical detail as to how the malware interacted directly with launchd rather than going through known services. Other system services are used to interact with launchd rather than launchd being used by itself." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:PropertyListFile ], + d3f:T1053 ; + owl:deprecated true . + +d3f:T1053.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Scheduled Task" ; + d3f:attack-id "T1053.005" ; + d3f:definition "Renamed from ATT&CK to be consistent with at, launchd, cron siblings; name as is looks like parent. Not sure why parent is not just Scheduled Task [Execution[." ; + d3f:executes d3f:ScheduledJob ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:ScheduledJob ], + d3f:T1053 . + +d3f:T1053.006 a owl:Class ; + rdfs:label "Systemd Timers" ; + d3f:attack-id "T1053.006" ; + d3f:definition "Adversaries may abuse systemd timers to perform task scheduling for initial or recurring execution of malicious code. Systemd timers are unit files with file extension .timer that control services. Timers can be set to run on a calendar event or after a time span relative to a starting point. They can be used as an alternative to [Cron](https://attack.mitre.org/techniques/T1053/003) in Linux environments.(Citation: archlinux Systemd Timers Aug 2020) Systemd timers may be activated remotely via the systemctl command line utility, which operates over [SSH](https://attack.mitre.org/techniques/T1021/004).(Citation: Systemd Remote Control)" ; + rdfs:subClassOf d3f:T1053 . + +d3f:T1053.007 a owl:Class ; + rdfs:label "Container Orchestration Job" ; + d3f:attack-id "T1053.007" ; + d3f:definition "Adversaries may abuse task scheduling functionality provided by container orchestration tools such as Kubernetes to schedule deployment of containers configured to execute malicious code. Container orchestration jobs run these automated tasks at a specific date and time, similar to cron jobs on a Linux system. Deployments of this type can also be configured to maintain a quantity of containers over time, automating the process of maintaining persistence within a cluster." ; + rdfs:subClassOf d3f:T1053 . + +d3f:T1054 a owl:Class ; + rdfs:label "Indicator Blocking" ; + d3f:attack-id "T1054" ; + d3f:definition "An adversary may attempt to block indicators or events typically captured by sensors from being gathered and analyzed. This could include maliciously redirecting (Citation: Microsoft Lamin Sept 2017) or even disabling host-based sensors, such as Event Tracing for Windows (ETW),(Citation: Microsoft About Event Tracing 2018) by tampering settings that control the collection and flow of event telemetry. (Citation: Medium Event Tracing Tampering 2018) These settings may be stored on the system in configuration files and/or in the Registry as well as being accessible via administrative utilities such as [PowerShell](https://attack.mitre.org/techniques/T1086) or [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047)." ; + rdfs:comment "This technique has been revoked by T1562.006" ; + rdfs:seeAlso "T1562.006" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1055.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Dynamic-link Library Injection" ; + d3f:adds d3f:SharedLibraryFile ; + d3f:attack-id "T1055.001" ; + d3f:definition "Adversaries may inject dynamic-link libraries (DLLs) into processes in order to evade process-based defenses as well as possibly elevate privileges. DLL injection is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:invokes d3f:SystemCall ; + d3f:loads d3f:SharedLibraryFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:SharedLibraryFile ], + [ a owl:Restriction ; + owl:onProperty d3f:loads ; + owl:someValuesFrom d3f:SharedLibraryFile ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SystemCall ], + d3f:T1055 . + +d3f:T1055.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Portable Executable Injection" ; + d3f:attack-id "T1055.002" ; + d3f:definition "Adversaries may inject portable executables (PE) into processes in order to evade process-based defenses as well as possibly elevate privileges. PE injection is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:may-add d3f:ObjectFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-add ; + owl:someValuesFrom d3f:ObjectFile ], + d3f:T1055 . + +d3f:T1055.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Thread Execution Hijacking" ; + d3f:attack-id "T1055.003" ; + d3f:definition "Adversaries may inject malicious code into hijacked processes in order to evade process-based defenses as well as possibly elevate privileges. Thread Execution Hijacking is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:invokes d3f:SystemCall ; + d3f:may-add d3f:ExecutableBinary ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SystemCall ], + [ a owl:Restriction ; + owl:onProperty d3f:may-add ; + owl:someValuesFrom d3f:ExecutableBinary ], + d3f:T1055 . + +d3f:T1055.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Asynchronous Procedure Call" ; + d3f:attack-id "T1055.004" ; + d3f:definition "Adversaries may inject malicious code into processes via the asynchronous procedure call (APC) queue in order to evade process-based defenses as well as possibly elevate privileges. APC injection is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:may-invoke d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:T1055 . + +d3f:T1055.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Thread Local Storage" ; + d3f:attack-id "T1055.005" ; + d3f:definition "Adversaries may inject malicious code into processes via thread local storage (TLS) callbacks in order to evade process-based defenses as well as possibly elevate privileges. TLS callback injection is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:invokes d3f:SystemCall ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SystemCall ], + d3f:T1055 . + +d3f:T1055.008 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Ptrace System Calls" ; + d3f:attack-id "T1055.008" ; + d3f:definition "Adversaries may inject malicious code into processes via ptrace (process trace) system calls in order to evade process-based defenses as well as possibly elevate privileges. Ptrace system call injection is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:invokes d3f:SystemCall ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SystemCall ], + d3f:T1055 . + +d3f:T1055.009 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Proc Memory" ; + d3f:accesses d3f:OperatingSystemFile ; + d3f:attack-id "T1055.009" ; + d3f:definition "Adversaries may inject malicious code into processes via the /proc filesystem in order to evade process-based defenses as well as possibly elevate privileges. Proc memory injection is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:may-modify d3f:OperatingSystemFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:OperatingSystemFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:OperatingSystemFile ], + d3f:T1055 . + +d3f:T1055.011 a owl:Class ; + rdfs:label "Extra Window Memory Injection" ; + d3f:attack-id "T1055.011" ; + d3f:definition "Adversaries may inject malicious code into process via Extra Window Memory (EWM) in order to evade process-based defenses as well as possibly elevate privileges. EWM injection is a method of executing arbitrary code in the address space of a separate live process." ; + rdfs:subClassOf d3f:T1055 . + +d3f:T1055.012 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Hollowing" ; + d3f:attack-id "T1055.012" ; + d3f:definition "Adversaries may inject malicious code into suspended and hollowed processes in order to evade process-based defenses. Process hollowing is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:modifies d3f:ProcessCodeSegment ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ProcessCodeSegment ], + d3f:T1055 . + +d3f:T1055.013 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Doppelgänging" ; + d3f:attack-id "T1055.013" ; + d3f:definition "Adversaries may inject malicious code into process via process doppelgänging in order to evade process-based defenses as well as possibly elevate privileges. Process doppelgänging is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:invokes d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:T1055 . + +d3f:T1055.014 a owl:Class, + owl:NamedIndividual ; + rdfs:label "VDSO Hijacking" ; + d3f:accesses d3f:SharedLibraryFile ; + d3f:attack-id "T1055.014" ; + d3f:definition "Adversaries may inject malicious code into processes via VDSO hijacking in order to evade process-based defenses as well as possibly elevate privileges. Virtual dynamic shared object (vdso) hijacking is a method of executing arbitrary code in the address space of a separate live process." ; + d3f:invokes d3f:SystemCall ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:SharedLibraryFile ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SystemCall ], + d3f:T1055 . + +d3f:T1055.015 a owl:Class ; + rdfs:label "ListPlanting" ; + d3f:attack-id "T1055.015" ; + d3f:definition "Adversaries may abuse list-view controls to inject malicious code into hijacked processes in order to evade process-based defenses as well as possibly elevate privileges. ListPlanting is a method of executing arbitrary code in the address space of a separate live process. Code executed via ListPlanting may also evade detection from security products since the execution is masked under a legitimate process." ; + rdfs:subClassOf d3f:T1055 . + +d3f:T1056.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Keylogging" ; + d3f:accesses d3f:KeyboardInputDevice ; + d3f:attack-id "T1056.001" ; + d3f:definition "Adversaries may log user keystrokes to intercept credentials as the user types them. Keylogging is likely to be used to acquire credentials for new access opportunities when [OS Credential Dumping](https://attack.mitre.org/techniques/T1003) efforts are not effective, and may require an adversary to intercept keystrokes on a system for a substantial period of time before credentials can be successfully captured. In order to increase the likelihood of capturing credentials quickly, an adversary may also perform actions such as clearing browser cookies to force users to reauthenticate to systems.(Citation: Talos Kimsuky Nov 2021)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:KeyboardInputDevice ], + d3f:T1056 . + +d3f:T1056.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "GUI Input Capture" ; + d3f:accesses d3f:GraphicalUserInterface ; + d3f:attack-id "T1056.002" ; + d3f:definition "Adversaries may mimic common operating system GUI components to prompt users for credentials with a seemingly legitimate prompt. When programs are executed that need additional privileges than are present in the current user context, it is common for the operating system to prompt the user for proper credentials to authorize the elevated privileges for the task (ex: [Bypass User Account Control](https://attack.mitre.org/techniques/T1548/002))." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:GraphicalUserInterface ], + d3f:T1056 . + +d3f:T1056.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Portal Capture" ; + d3f:attack-id "T1056.003" ; + d3f:definition "Adversaries may install code on externally facing portals, such as a VPN login page, to capture and transmit credentials of users who attempt to log into the service. For example, a compromised login page may log provided user credentials before logging the user in to the service." ; + d3f:modifies d3f:WebServerApplication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:WebServerApplication ], + d3f:T1056 . + +d3f:T1056.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential API Hooking" ; + d3f:attack-id "T1056.004" ; + d3f:definition "Adversaries may hook into Windows application programming interface (API) functions to collect user credentials. Malicious hooking mechanisms may capture API calls that include parameters that reveal user authentication credentials.(Citation: Microsoft TrojanSpy:Win32/Ursnif.gen!I Sept 2017) Unlike [Keylogging](https://attack.mitre.org/techniques/T1056/001), this technique focuses specifically on API functions that include parameters that reveal user credentials. Hooking involves redirecting calls to these functions and can be implemented via:" ; + d3f:may-modify d3f:ProcessCodeSegment ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ProcessCodeSegment ], + d3f:T1056 . + +d3f:T1057 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Discovery" ; + d3f:attack-id "T1057" ; + d3f:definition "Adversaries may attempt to get information about running processes on a system. Information obtained could be used to gain an understanding of common software/applications running on systems within the network. Administrator or otherwise elevated access may provide better process details. Adversaries may use the information from [Process Discovery](https://attack.mitre.org/techniques/T1057) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions." ; + d3f:may-invoke d3f:CreateProcess, + d3f:GetRunningProcesses ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetRunningProcesses ], + d3f:DiscoveryTechnique . + +d3f:T1058 a owl:Class ; + rdfs:label "Service Registry Permissions Weakness" ; + d3f:attack-id "T1058" ; + d3f:definition "Windows stores local service configuration information in the Registry under HKLM\\SYSTEM\\CurrentControlSet\\Services. The information stored under a service's Registry keys can be manipulated to modify a service's execution parameters through tools such as the service controller, sc.exe, [PowerShell](https://attack.mitre.org/techniques/T1086), or [Reg](https://attack.mitre.org/software/S0075). Access to Registry keys is controlled through Access Control Lists and permissions. (Citation: MSDN Registry Key Security)" ; + rdfs:comment "This technique has been revoked by T1574.011" ; + rdfs:seeAlso "T1574.011" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1059.001 a owl:Class ; + rdfs:label "PowerShell" ; + d3f:attack-id "T1059.001" ; + d3f:definition "Adversaries may abuse PowerShell commands and scripts for execution. PowerShell is a powerful interactive command-line interface and scripting environment included in the Windows operating system.(Citation: TechNet PowerShell) Adversaries can use PowerShell to perform a number of actions, including discovery of information and execution of code. Examples include the Start-Process cmdlet which can be used to run an executable and the Invoke-Command cmdlet which runs a command locally or on a remote computer (though administrator permissions are required to use PowerShell to connect to remote systems)." ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1059.002 a owl:Class ; + rdfs:label "AppleScript" ; + d3f:attack-id "T1059.002" ; + d3f:definition "Adversaries may abuse AppleScript for execution. AppleScript is a macOS scripting language designed to control applications and parts of the OS via inter-application messages called AppleEvents.(Citation: Apple AppleScript) These AppleEvent messages can be sent independently or easily scripted with AppleScript. These events can locate open windows, send keystrokes, and interact with almost any open application locally or remotely." ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1059.003 a owl:Class ; + rdfs:label "Windows Command Shell" ; + d3f:attack-id "T1059.003" ; + d3f:definition "Adversaries may abuse the Windows command shell for execution. The Windows command shell ([cmd](https://attack.mitre.org/software/S0106)) is the primary command prompt on Windows systems. The Windows command prompt can be used to control almost any aspect of a system, with various permission levels required for different subsets of commands. The command prompt can be invoked remotely via [Remote Services](https://attack.mitre.org/techniques/T1021) such as [SSH](https://attack.mitre.org/techniques/T1021/004).(Citation: SSH in Windows)" ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1059.004 a owl:Class ; + rdfs:label "Unix Shell" ; + d3f:attack-id "T1059.004" ; + d3f:definition "Adversaries may abuse Unix shell commands and scripts for execution. Unix shells are the primary command prompt on Linux and macOS systems, though many variations of the Unix shell exist (e.g. sh, bash, zsh, etc.) depending on the specific OS or distribution.(Citation: DieNet Bash)(Citation: Apple ZShell) Unix shells can control every aspect of a system, with certain commands requiring elevated privileges." ; + rdfs:subClassOf d3f:T1059 ; + skos:altLabel "Bash Execution" . + +d3f:T1059.005 a owl:Class ; + rdfs:label "Visual Basic" ; + d3f:attack-id "T1059.005" ; + d3f:definition "Adversaries may abuse Visual Basic (VB) for execution. VB is a programming language created by Microsoft with interoperability with many Windows technologies such as [Component Object Model](https://attack.mitre.org/techniques/T1559/001) and the [Native API](https://attack.mitre.org/techniques/T1106) through the Windows API. Although tagged as legacy with no planned future evolutions, VB is integrated and supported in the .NET Framework and cross-platform .NET Core.(Citation: VB .NET Mar 2020)(Citation: VB Microsoft)" ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1059.006 a owl:Class ; + rdfs:label "Python" ; + d3f:attack-id "T1059.006" ; + d3f:definition "Adversaries may abuse Python commands and scripts for execution. Python is a very popular scripting/programming language, with capabilities to perform many functions. Python can be executed interactively from the command-line (via the python.exe interpreter) or via scripts (.py) that can be written and distributed to different systems. Python code can also be compiled into binary executables.(Citation: Zscaler APT31 Covid-19 October 2020)" ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1059.007 a owl:Class ; + rdfs:label "JavaScript" ; + d3f:attack-id "T1059.007" ; + d3f:definition "Adversaries may abuse various implementations of JavaScript for execution. JavaScript (JS) is a platform-independent scripting language (compiled just-in-time at runtime) commonly associated with scripts in webpages, though JS can be executed in runtime environments outside the browser.(Citation: NodeJS)" ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1059.008 a owl:Class ; + rdfs:label "Network Device CLI" ; + d3f:attack-id "T1059.008" ; + d3f:definition "Adversaries may abuse scripting or built-in command line interpreters (CLI) on network devices to execute malicious command and payloads. The CLI is the primary means through which users and administrators interact with the device in order to view system information, modify device operations, or perform diagnostic and administrative functions. CLIs typically contain various permission levels required for different commands." ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1059.009 a owl:Class ; + rdfs:label "Cloud API" ; + d3f:attack-id "T1059.009" ; + d3f:definition "Adversaries may abuse cloud APIs to execute malicious commands. APIs available in cloud environments provide various functionalities and are a feature-rich method for programmatic access to nearly all aspects of a tenant. These APIs may be utilized through various methods such as command line interpreters (CLIs), in-browser Cloud Shells, [PowerShell](https://attack.mitre.org/techniques/T1059/001) modules like Azure for PowerShell(Citation: Microsoft - Azure PowerShell), or software developer kits (SDKs) available for languages such as [Python](https://attack.mitre.org/techniques/T1059/006)." ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1059.010 a owl:Class ; + rdfs:label "AutoHotKey & AutoIT" ; + d3f:attack-id "T1059.010" ; + d3f:definition "Adversaries may execute commands and perform malicious tasks using AutoIT and AutoHotKey automation scripts. AutoIT and AutoHotkey (AHK) are scripting languages that enable users to automate Windows tasks. These automation scripts can be used to perform a wide variety of actions, such as clicking on buttons, entering text, and opening and closing programs.(Citation: AutoIT)(Citation: AutoHotKey)" ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1059.011 a owl:Class ; + rdfs:label "Lua" ; + d3f:attack-id "T1059.011" ; + d3f:definition "Adversaries may abuse Lua commands and scripts for execution. Lua is a cross-platform scripting and programming language primarily designed for embedded use in applications. Lua can be executed on the command-line (through the stand-alone lua interpreter), via scripts (.lua), or from Lua-embedded programs (through the struct lua_State).(Citation: Lua main page)(Citation: Lua state)" ; + rdfs:subClassOf d3f:T1059 . + +d3f:T1060 a owl:Class ; + rdfs:label "Registry Run Keys / Startup Folder" ; + d3f:attack-id "T1060" ; + d3f:definition "Adversaries may achieve persistence by adding a program to a startup folder or referencing it with a Registry run key. Adding an entry to the \"run keys\" in the Registry or startup folder will cause the program referenced to be executed when a user logs in. (Citation: Microsoft Run Key) These programs will be executed under the context of the user and will have the account's associated permissions level." ; + rdfs:comment "This technique has been revoked by T1547.001" ; + rdfs:seeAlso "T1547.001" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1061 a owl:Class ; + rdfs:label "Graphical User Interface" ; + d3f:attack-id "T1061" ; + d3f:definition "**This technique has been deprecated. Please use [Remote Services](https://attack.mitre.org/techniques/T1021) where appropriate.**" ; + rdfs:comment "**This technique has been deprecated. Please use [Remote Services](https://attack.mitre.org/techniques/T1021) where appropriate.**" ; + rdfs:subClassOf d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1062 a owl:Class ; + rdfs:label "Hypervisor" ; + d3f:attack-id "T1062" ; + d3f:definition "**This technique has been deprecated and should no longer be used.**" ; + rdfs:comment "**This technique has been deprecated and should no longer be used.**" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1063 a owl:Class ; + rdfs:label "Security Software Discovery" ; + d3f:attack-id "T1063" ; + d3f:definition "Adversaries may attempt to get a listing of security software, configurations, defensive tools, and sensors that are installed on the system. This may include things such as local firewall rules and anti-virus. Adversaries may use the information from [Security Software Discovery](https://attack.mitre.org/techniques/T1063) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions." ; + rdfs:comment "This technique has been revoked by T1518.001" ; + rdfs:seeAlso "T1518.001" ; + rdfs:subClassOf d3f:DiscoveryTechnique ; + owl:deprecated true . + +d3f:T1064 a owl:Class ; + rdfs:label "Scripting" ; + d3f:attack-id "T1064" ; + d3f:definition "**This technique has been deprecated. Please use [Command and Scripting Interpreter](https://attack.mitre.org/techniques/T1059) where appropriate.**" ; + rdfs:comment "**This technique has been deprecated. Please use [Command and Scripting Interpreter](https://attack.mitre.org/techniques/T1059) where appropriate.**" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1065 a owl:Class ; + rdfs:label "Uncommonly Used Port" ; + d3f:attack-id "T1065" ; + d3f:definition "Adversaries may conduct C2 communications over a non-standard port to bypass proxies and firewalls that have been improperly configured." ; + rdfs:comment "This technique has been revoked by T1571" ; + rdfs:seeAlso "T1571" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1066 a owl:Class ; + rdfs:label "Indicator Removal from Tools" ; + d3f:attack-id "T1066" ; + d3f:definition "If a malicious tool is detected and quarantined or otherwise curtailed, an adversary may be able to determine why the malicious tool was detected (the indicator), modify the tool by removing the indicator, and use the updated version that is no longer detected by the target's defensive systems or subsequent targets that may use similar systems." ; + rdfs:comment "This technique has been revoked by T1027.005" ; + rdfs:seeAlso "T1027.005" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1067 a owl:Class ; + rdfs:label "Bootkit" ; + d3f:attack-id "T1067" ; + d3f:definition "A bootkit is a malware variant that modifies the boot sectors of a hard drive, including the Master Boot Record (MBR) and Volume Boot Record (VBR). (Citation: MTrends 2016)" ; + rdfs:comment "This technique has been revoked by T1542.003" ; + rdfs:seeAlso "T1542.003" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1068 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exploitation for Privilege Escalation" ; + d3f:attack-id "T1068" ; + d3f:definition "Adversaries may exploit software vulnerabilities in an attempt to elevate privileges. Exploitation of a software vulnerability occurs when an adversary takes advantage of a programming error in a program, service, or within the operating system software or kernel itself to execute adversary-controlled code. Security constructs such as permission levels will often hinder access to information and use of certain techniques, so adversaries will likely need to perform privilege escalation to include use of software exploitation to circumvent those restrictions." ; + d3f:enables d3f:TA0004 ; + d3f:may-modify d3f:StackFrame ; + d3f:modifies d3f:ProcessCodeSegment ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0004 ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ProcessCodeSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:StackFrame ], + d3f:PrivilegeEscalationTechnique . + +d3f:T1069.001 a owl:Class ; + rdfs:label "Local Groups" ; + d3f:attack-id "T1069.001" ; + d3f:definition "Adversaries may attempt to find local system groups and permission settings. The knowledge of local system permission groups can help adversaries determine which groups exist and which users belong to a particular group. Adversaries may use this information to determine which users have elevated permissions, such as the users found within the local administrators group." ; + rdfs:subClassOf d3f:T1069 . + +d3f:T1069.002 a owl:Class ; + rdfs:label "Domain Groups" ; + d3f:attack-id "T1069.002" ; + d3f:definition "Adversaries may attempt to find domain-level groups and permission settings. The knowledge of domain-level permission groups can help adversaries determine which groups exist and which users belong to a particular group. Adversaries may use this information to determine which users have elevated permissions, such as domain administrators." ; + rdfs:subClassOf d3f:T1069 . + +d3f:T1069.003 a owl:Class ; + rdfs:label "Cloud Groups" ; + d3f:attack-id "T1069.003" ; + d3f:definition "Adversaries may attempt to find cloud groups and permission settings. The knowledge of cloud permission groups can help adversaries determine the particular roles of users and groups within an environment, as well as which users are associated with a particular group." ; + rdfs:subClassOf d3f:T1069 . + +d3f:T1070.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Clear Windows Event Logs" ; + d3f:attack-id "T1070.001" ; + d3f:definition "Adversaries may clear Windows Event Logs to hide the activity of an intrusion. Windows Event Logs are a record of a computer's alerts and notifications. There are three system-defined sources of events: System, Application, and Security, with five event types: Error, Warning, Information, Success Audit, and Failure Audit." ; + d3f:modifies d3f:EventLog ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:EventLog ], + d3f:T1070 . + +d3f:T1070.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Clear Linux or Mac System Logs" ; + d3f:attack-id "T1070.002" ; + d3f:definition "Adversaries may clear system logs to hide evidence of an intrusion. macOS and Linux both keep track of system or user-initiated actions via system logs. The majority of native system logging is stored under the /var/log/ directory. Subfolders in this directory categorize logs by their related functions, such as:(Citation: Linux Logs)" ; + d3f:modifies d3f:OperatingSystemLogFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:OperatingSystemLogFile ], + d3f:T1070 . + +d3f:T1070.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Clear Command History" ; + d3f:attack-id "T1070.003" ; + d3f:definition "In addition to clearing system logs, an adversary may clear the command history of a compromised account to conceal the actions undertaken during an intrusion. Various command interpreters keep track of the commands users type in their terminal so that users can retrace what they've done." ; + d3f:modifies d3f:CommandHistoryLog ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:CommandHistoryLog ], + d3f:T1070 . + +d3f:T1070.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "File Deletion" ; + d3f:attack-id "T1070.004" ; + d3f:definition "Adversaries may delete files left behind by the actions of their intrusion activity. Malware, tools, or other non-native files dropped or created on a system by an adversary (ex: [Ingress Tool Transfer](https://attack.mitre.org/techniques/T1105)) may leave traces to indicate to what was done within a network and how. Removal of these files can occur during an intrusion, or as part of a post-intrusion process to minimize the adversary's footprint." ; + d3f:deletes d3f:File ; + d3f:may-modify d3f:File ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:File ], + d3f:T1070 . + +d3f:T1070.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Share Connection Removal" ; + d3f:attack-id "T1070.005" ; + d3f:definition "Adversaries may remove share connections that are no longer useful in order to clean up traces of their operation. Windows shared drive and [SMB/Windows Admin Shares](https://attack.mitre.org/techniques/T1021/002) connections can be removed when no longer needed. [Net](https://attack.mitre.org/software/S0039) is an example utility that can be used to remove network share connections with the net use \\\\system\\share /delete command. (Citation: Technet Net Use)" ; + d3f:unmounts d3f:NetworkFileShareResource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:unmounts ; + owl:someValuesFrom d3f:NetworkFileShareResource ], + d3f:T1070 . + +d3f:T1070.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Timestomp" ; + d3f:attack-id "T1070.006" ; + d3f:definition "Adversaries may modify file time attributes to hide new or changes to existing files. Timestomping is a technique that modifies the timestamps of a file (the modify, access, create, and change times), often to mimic files that are in the same folder. This is done, for example, on files that have been modified or created by the adversary so that they do not appear conspicuous to forensic investigators or file analysis tools." ; + d3f:forges d3f:FileSystemMetadata ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:forges ; + owl:someValuesFrom d3f:FileSystemMetadata ], + d3f:T1070 . + +d3f:T1070.007 a owl:Class ; + rdfs:label "Clear Network Connection History and Configurations" ; + d3f:attack-id "T1070.007" ; + d3f:definition "Adversaries may clear or remove evidence of malicious network connections in order to clean up traces of their operations. Configuration settings as well as various artifacts that highlight connection history may be created on a system and/or in application logs from behaviors that require network connections, such as [Remote Services](https://attack.mitre.org/techniques/T1021) or [External Remote Services](https://attack.mitre.org/techniques/T1133). Defenders may use these artifacts to monitor or otherwise analyze network connections created by adversaries." ; + rdfs:subClassOf d3f:T1070 . + +d3f:T1070.008 a owl:Class ; + rdfs:label "Clear Mailbox Data" ; + d3f:attack-id "T1070.008" ; + d3f:definition "Adversaries may modify mail and mail application data to remove evidence of their activity. Email applications allow users and other programs to export and delete mailbox data via command line tools or use of APIs. Mail application data can be emails, email metadata, or logs generated by the application or operating system, such as export requests." ; + rdfs:subClassOf d3f:T1070 . + +d3f:T1070.009 a owl:Class ; + rdfs:label "Clear Persistence" ; + d3f:attack-id "T1070.009" ; + d3f:definition "Adversaries may clear artifacts associated with previously established persistence on a host system to remove evidence of their activity. This may involve various actions, such as removing services, deleting executables, [Modify Registry](https://attack.mitre.org/techniques/T1112), [Plist File Modification](https://attack.mitre.org/techniques/T1647), or other methods of cleanup to prevent defenders from collecting evidence of their persistent presence.(Citation: Cylance Dust Storm) Adversaries may also delete accounts previously created to maintain persistence (i.e. [Create Account](https://attack.mitre.org/techniques/T1136)).(Citation: Talos - Cisco Attack 2022)" ; + rdfs:subClassOf d3f:T1070 . + +d3f:T1070.010 a owl:Class ; + rdfs:label "Relocate Malware" ; + d3f:attack-id "T1070.010" ; + d3f:definition "Once a payload is delivered, adversaries may reproduce copies of the same malware on the victim system to remove evidence of their presence and/or avoid defenses. Copying malware payloads to new locations may also be combined with [File Deletion](https://attack.mitre.org/techniques/T1070/004) to cleanup older artifacts." ; + rdfs:subClassOf d3f:T1070 . + +d3f:T1071.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Protocols" ; + d3f:attack-id "T1071.001" ; + d3f:definition "Adversaries may communicate using application layer protocols associated with web traffic to avoid detection/network filtering by blending in with existing traffic. Commands to the remote system, and often the results of those commands, will be embedded within the protocol traffic between the client and server." ; + d3f:may-transfer d3f:CertificateFile ; + d3f:produces d3f:OutboundInternetWebTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-transfer ; + owl:someValuesFrom d3f:CertificateFile ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetWebTraffic ], + d3f:T1071 . + +d3f:T1071.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "File Transfer Protocols" ; + d3f:attack-id "T1071.002" ; + d3f:definition "Adversaries may communicate using application layer protocols associated with transferring files to avoid detection/network filtering by blending in with existing traffic. Commands to the remote system, and often the results of those commands, will be embedded within the protocol traffic between the client and server." ; + d3f:produces d3f:OutboundInternetFileTransferTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetFileTransferTraffic ], + d3f:T1071 . + +d3f:T1071.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Mail Protocols" ; + d3f:attack-id "T1071.003" ; + d3f:definition "Adversaries may communicate using application layer protocols associated with electronic mail delivery to avoid detection/network filtering by blending in with existing traffic. Commands to the remote system, and often the results of those commands, will be embedded within the protocol traffic between the client and server." ; + d3f:produces d3f:OutboundInternetMailTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetMailTraffic ], + d3f:T1071 . + +d3f:T1071.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "DNS" ; + d3f:attack-id "T1071.004" ; + d3f:definition "Adversaries may communicate using the Domain Name System (DNS) application layer protocol to avoid detection/network filtering by blending in with existing traffic. Commands to the remote system, and often the results of those commands, will be embedded within the protocol traffic between the client and server." ; + d3f:produces d3f:OutboundInternetDNSLookupTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetDNSLookupTraffic ], + d3f:T1071 . + +d3f:T1071.005 a owl:Class ; + rdfs:label "Publish/Subscribe Protocols" ; + d3f:attack-id "T1071.005" ; + d3f:definition "Adversaries may communicate using publish/subscribe (pub/sub) application layer protocols to avoid detection/network filtering by blending in with existing traffic. Commands to the remote system, and often the results of those commands, will be embedded within the protocol traffic between the client and server." ; + rdfs:subClassOf d3f:T1071 . + +d3f:T1072 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Software Deployment Tools" ; + d3f:adds d3f:File ; + d3f:attack-id "T1072" ; + d3f:definition "Adversaries may gain access to and use centralized software suites installed within an enterprise to execute commands and move laterally through the network. Configuration management and software deployment applications may be used in an enterprise network or cloud environment for routine administration purposes. These systems may also be integrated into CI/CD pipelines. Examples of such solutions include: SCCM, HBSS, Altiris, AWS Systems Manager, Microsoft Intune, Azure Arc, and GCP Deployment Manager." ; + d3f:executes d3f:SoftwareDeploymentTool ; + d3f:installs d3f:Software ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:installs ; + owl:someValuesFrom d3f:Software ], + [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:SoftwareDeploymentTool ], + d3f:ExecutionTechnique, + d3f:LateralMovementTechnique . + +d3f:T1073 a owl:Class ; + rdfs:label "DLL Side-Loading" ; + d3f:attack-id "T1073" ; + d3f:definition "Programs may specify DLLs that are loaded at runtime. Programs that improperly or vaguely specify a required DLL may be open to a vulnerability in which an unintended DLL is loaded. Side-loading vulnerabilities specifically occur when Windows Side-by-Side (WinSxS) manifests (Citation: MSDN Manifests) are not explicit enough about characteristics of the DLL to be loaded. Adversaries may take advantage of a legitimate program that is vulnerable to side-loading to load a malicious DLL. (Citation: Stewart 2014)" ; + rdfs:comment "This technique has been revoked by T1574.002" ; + rdfs:seeAlso "T1574.002" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1074.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Data Staging" ; + d3f:attack-id "T1074.001" ; + d3f:definition "Adversaries may stage collected data in a central location or directory on the local system prior to Exfiltration. Data may be kept in separate files or combined into one file through techniques such as [Archive Collected Data](https://attack.mitre.org/techniques/T1560). Interactive command shells may be used, and common functionality within [cmd](https://attack.mitre.org/software/S0106) and bash may be used to copy data into a staging location." ; + d3f:may-create d3f:File ; + d3f:may-invoke d3f:CreateFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateFile ], + d3f:T1074 . + +d3f:T1074.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote Data Staging" ; + d3f:attack-id "T1074.002" ; + d3f:definition "Adversaries may stage data collected from multiple systems in a central location or directory on one system prior to Exfiltration. Data may be kept in separate files or combined into one file through techniques such as [Archive Collected Data](https://attack.mitre.org/techniques/T1560). Interactive command shells may be used, and common functionality within [cmd](https://attack.mitre.org/software/S0106) and bash may be used to copy data into a staging location." ; + d3f:modifies d3f:NetworkResource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:NetworkResource ], + d3f:T1074 . + +d3f:T1075 a owl:Class ; + rdfs:label "Pass the Hash" ; + d3f:attack-id "T1075" ; + d3f:definition "Pass the hash (PtH) is a method of authenticating as a user without having access to the user's cleartext password. This method bypasses standard authentication steps that require a cleartext password, moving directly into the portion of the authentication that uses the password hash. In this technique, valid password hashes for the account being used are captured using a Credential Access technique. Captured hashes are used with PtH to authenticate as that user. Once authenticated, PtH may be used to perform actions on local or remote systems." ; + rdfs:comment "This technique has been revoked by T1550.002" ; + rdfs:seeAlso "T1550.002" ; + rdfs:subClassOf d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1076 a owl:Class ; + rdfs:label "Remote Desktop Protocol" ; + d3f:attack-id "T1076" ; + d3f:definition "Remote desktop is a common feature in operating systems. It allows a user to log into an interactive session with a system desktop graphical user interface on a remote system. Microsoft refers to its implementation of the Remote Desktop Protocol (RDP) as Remote Desktop Services (RDS). (Citation: TechNet Remote Desktop Services) There are other implementations and third-party tools that provide graphical access [Remote Services](https://attack.mitre.org/techniques/T1021) similar to RDS." ; + rdfs:comment "This technique has been revoked by T1021.001" ; + rdfs:seeAlso "T1021.001" ; + rdfs:subClassOf d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1077 a owl:Class ; + rdfs:label "Windows Admin Shares" ; + d3f:attack-id "T1077" ; + d3f:definition "Windows systems have hidden network shares that are accessible only to administrators and provide the ability for remote file copy and other administrative functions. Example network shares include C$, ADMIN$, and IPC$." ; + rdfs:comment "This technique has been revoked by T1021.002" ; + rdfs:seeAlso "T1021.002" ; + rdfs:subClassOf d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1078.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Default Accounts" ; + d3f:attack-id "T1078.001" ; + d3f:definition "Adversaries may obtain and abuse credentials of a default account as a means of gaining Initial Access, Persistence, Privilege Escalation, or Defense Evasion. Default accounts are those that are built-into an OS, such as the Guest or Administrator accounts on Windows systems. Default accounts also include default factory/provider set accounts on other types of systems, software, or devices, including the root user account in AWS and the default service account in Kubernetes.(Citation: Microsoft Local Accounts Feb 2019)(Citation: AWS Root User)(Citation: Threat Matrix for Kubernetes)" ; + d3f:uses d3f:DefaultUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:DefaultUserAccount ], + d3f:T1078 . + +d3f:T1078.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Accounts" ; + d3f:attack-id "T1078.002" ; + d3f:definition "Adversaries may obtain and abuse credentials of a domain account as a means of gaining Initial Access, Persistence, Privilege Escalation, or Defense Evasion.(Citation: TechNet Credential Theft) Domain accounts are those managed by Active Directory Domain Services where access and permissions are configured across systems and services that are part of that domain. Domain accounts can cover users, administrators, and services.(Citation: Microsoft AD Accounts)" ; + d3f:uses d3f:DomainUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:DomainUserAccount ], + d3f:T1078 . + +d3f:T1078.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Accounts" ; + d3f:attack-id "T1078.003" ; + d3f:definition "Adversaries may obtain and abuse credentials of a local account as a means of gaining Initial Access, Persistence, Privilege Escalation, or Defense Evasion. Local accounts are those configured by an organization for use by users, remote support, services, or for administration on a single system or service." ; + d3f:uses d3f:LocalUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:LocalUserAccount ], + d3f:T1078 . + +d3f:T1078.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Accounts" ; + d3f:attack-id "T1078.004" ; + d3f:definition "Valid accounts in cloud environments may allow adversaries to perform actions to achieve Initial Access, Persistence, Privilege Escalation, or Defense Evasion. Cloud accounts are those created and configured by an organization for use by users, remote support, services, or for administration of resources within a cloud service provider or SaaS application. Cloud Accounts can exist solely in the cloud; alternatively, they may be hybrid-joined between on-premises systems and the cloud through syncing or federation with other identity sources such as Windows Active Directory. (Citation: AWS Identity Federation)(Citation: Google Federating GC)(Citation: Microsoft Deploying AD Federation)" ; + d3f:uses d3f:CloudUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:CloudUserAccount ], + d3f:T1078 . + +d3f:T1079 a owl:Class ; + rdfs:label "Multilayer Encryption" ; + d3f:attack-id "T1079" ; + d3f:definition "An adversary performs C2 communications using multiple layers of encryption, typically (but not exclusively) tunneling a custom encryption scheme within a protocol encryption scheme such as HTTPS or SMTPS." ; + rdfs:comment "This technique has been revoked by T1573" ; + rdfs:seeAlso "T1573" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1080 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Taint Shared Content" ; + d3f:attack-id "T1080" ; + d3f:definition "" ; + d3f:modifies d3f:NetworkResource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:NetworkResource ], + d3f:LateralMovementTechnique . + +d3f:T1081 a owl:Class ; + rdfs:label "Credentials in Files" ; + d3f:attack-id "T1081" ; + d3f:definition "Adversaries may search local file systems and remote file shares for files containing passwords. These can be files created by users to store their own credentials, shared credential stores for a group of individuals, configuration files containing passwords for a system or service, or source code/binary files containing embedded passwords." ; + rdfs:comment "This technique has been revoked by T1552.001" ; + rdfs:seeAlso "T1552.001" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1082 a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Information Discovery" ; + d3f:attack-id "T1082" ; + d3f:definition "An adversary may attempt to get detailed information about the operating system and hardware, including version, patches, hotfixes, service packs, and architecture. Adversaries may use the information from [System Information Discovery](https://attack.mitre.org/techniques/T1082) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions." ; + d3f:may-access d3f:DecoyArtifact ; + d3f:may-invoke d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:DecoyArtifact ], + d3f:DiscoveryTechnique . + +d3f:T1083 a owl:Class, + owl:NamedIndividual ; + rdfs:label "File and Directory Discovery" ; + d3f:accesses d3f:Directory, + d3f:File ; + d3f:attack-id "T1083" ; + d3f:definition "Adversaries may enumerate files and directories or may search in specific locations of a host or network share for certain information within a file system. Adversaries may use the information from [File and Directory Discovery](https://attack.mitre.org/techniques/T1083) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Directory ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:File ], + d3f:DiscoveryTechnique . + +d3f:T1084 a owl:Class ; + rdfs:label "Windows Management Instrumentation Event Subscription" ; + d3f:attack-id "T1084" ; + d3f:definition "Windows Management Instrumentation (WMI) can be used to install event filters, providers, consumers, and bindings that execute code when a defined event occurs. Adversaries may use the capabilities of WMI to subscribe to an event and execute arbitrary code when that event occurs, providing persistence on a system. Adversaries may attempt to evade detection of this technique by compiling WMI scripts into Windows Management Object (MOF) files (.mof extension). (Citation: Dell WMI Persistence) Examples of events that may be subscribed to are the wall clock time or the computer's uptime. (Citation: Kazanciyan 2014) Several threat groups have reportedly used this technique to maintain persistence. (Citation: Mandiant M-Trends 2015)" ; + rdfs:comment "This technique has been revoked by T1546.003" ; + rdfs:seeAlso "T1546.003" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1085 a owl:Class ; + rdfs:label "Rundll32" ; + d3f:attack-id "T1085" ; + d3f:definition "The rundll32.exe program can be called to execute an arbitrary binary. Adversaries may take advantage of this functionality to proxy execution of code to avoid triggering security tools that may not monitor execution of the rundll32.exe process because of whitelists or false positives from Windows using rundll32.exe for normal operations." ; + rdfs:comment "This technique has been revoked by T1218.011" ; + rdfs:seeAlso "T1218.011" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1086 a owl:Class ; + rdfs:label "PowerShell" ; + d3f:attack-id "T1086" ; + d3f:definition "PowerShell is a powerful interactive command-line interface and scripting environment included in the Windows operating system. (Citation: TechNet PowerShell) Adversaries can use PowerShell to perform a number of actions, including discovery of information and execution of code. Examples include the Start-Process cmdlet which can be used to run an executable and the Invoke-Command cmdlet which runs a command locally or on a remote computer." ; + rdfs:comment "This technique has been revoked by T1059.001" ; + rdfs:seeAlso "T1059.001" ; + rdfs:subClassOf d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1087.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Account" ; + d3f:attack-id "T1087.001" ; + d3f:definition "Adversaries may attempt to get a listing of local system accounts. This information can help adversaries determine which local accounts exist on a system to aid in follow-on behavior." ; + d3f:enumerates d3f:LocalUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enumerates ; + owl:someValuesFrom d3f:LocalUserAccount ], + d3f:T1087 . + +d3f:T1087.003 a owl:Class ; + rdfs:label "Email Account" ; + d3f:attack-id "T1087.003" ; + d3f:definition "Adversaries may attempt to get a listing of email addresses and accounts. Adversaries may try to dump Exchange address lists such as global address lists (GALs).(Citation: Microsoft Exchange Address Lists)" ; + rdfs:subClassOf d3f:T1087 . + +d3f:T1087.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Account" ; + d3f:attack-id "T1087.004" ; + d3f:definition "Adversaries may attempt to get a listing of cloud accounts. Cloud accounts are those created and configured by an organization for use by users, remote support, services, or for administration of resources within a cloud service provider or SaaS application." ; + d3f:enumerates d3f:CloudUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enumerates ; + owl:someValuesFrom d3f:CloudUserAccount ], + d3f:T1087 . + +d3f:T1088 a owl:Class ; + rdfs:label "Bypass User Account Control" ; + d3f:attack-id "T1088" ; + d3f:definition "Windows User Account Control (UAC) allows a program to elevate its privileges to perform a task under administrator-level permissions by prompting the user for confirmation. The impact to the user ranges from denying the operation under high enforcement to allowing the user to perform the action if they are in the local administrators group and click through the prompt or allowing them to enter an administrator password to complete the action. (Citation: TechNet How UAC Works)" ; + rdfs:comment "This technique has been revoked by T1548.002" ; + rdfs:seeAlso "T1548.002" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1089 a owl:Class ; + rdfs:label "Disabling Security Tools" ; + d3f:attack-id "T1089" ; + d3f:definition "Adversaries may disable security tools to avoid possible detection of their tools and activities. This can take the form of killing security software or event logging processes, deleting Registry keys so that tools do not start at run time, or other methods to interfere with security scanning or event reporting." ; + rdfs:comment "This technique has been revoked by T1562.001" ; + rdfs:seeAlso "T1562.001" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1090.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Internal Proxy" ; + d3f:attack-id "T1090.001" ; + d3f:definition "Adversaries may use an internal proxy to direct command and control traffic between two or more systems in a compromised environment. Many tools exist that enable traffic redirection through proxies or port redirection, including [HTRAN](https://attack.mitre.org/software/S0040), ZXProxy, and ZXPortMap. (Citation: Trend Micro APT Attack Tools) Adversaries use internal proxies to manage command and control communications inside a compromised environment, to reduce the number of simultaneous outbound network connections, to provide resiliency in the face of connection loss, or to ride over existing trusted communications paths between infected systems to avoid suspicion. Internal proxy connections may use common peer-to-peer (p2p) networking protocols, such as SMB, to better blend in with the environment." ; + d3f:produces d3f:IntranetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetNetworkTraffic ], + d3f:T1090 . + +d3f:T1090.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "External Proxy" ; + d3f:attack-id "T1090.002" ; + d3f:definition "Adversaries may use an external proxy to act as an intermediary for network communications to a command and control server to avoid direct connections to their infrastructure. Many tools exist that enable traffic redirection through proxies or port redirection, including [HTRAN](https://attack.mitre.org/software/S0040), ZXProxy, and ZXPortMap. (Citation: Trend Micro APT Attack Tools) Adversaries use these types of proxies to manage command and control communications, to provide resiliency in the face of connection loss, or to ride over existing trusted communications paths to avoid suspicion." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:T1090 . + +d3f:T1090.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Multi-hop Proxy" ; + d3f:attack-id "T1090.003" ; + d3f:definition "Adversaries may chain together multiple proxies to disguise the source of malicious traffic. Typically, a defender will be able to identify the last proxy traffic traversed before it enters their network; the defender may or may not be able to identify any previous proxies before the last-hop proxy. This technique makes identifying the original source of the malicious traffic even more difficult by requiring the defender to trace malicious traffic through several proxies to identify its source." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:T1090 . + +d3f:T1090.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Fronting" ; + d3f:attack-id "T1090.004" ; + d3f:definition "Adversaries may take advantage of routing schemes in Content Delivery Networks (CDNs) and other services which host multiple domains to obfuscate the intended destination of HTTPS traffic or traffic tunneled through HTTPS. (Citation: Fifield Blocking Resistent Communication through domain fronting 2015) Domain fronting involves using different domain names in the SNI field of the TLS header and the Host field of the HTTP header. If both domains are served from the same CDN, then the CDN may route to the address specified in the HTTP header after unwrapping the TLS header. A variation of the the technique, \"domainless\" fronting, utilizes a SNI field that is left blank; this may allow the fronting to work even when the CDN attempts to validate that the SNI and HTTP Host fields match (if the blank SNI fields are ignored)." ; + d3f:produces d3f:OutboundInternetEncryptedWebTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetEncryptedWebTraffic ], + d3f:T1090 . + +d3f:T1091 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Replication Through Removable Media" ; + d3f:attack-id "T1091" ; + d3f:definition "Adversaries may move onto systems, possibly those on disconnected or air-gapped networks, by copying malware to removable media and taking advantage of Autorun features when the media is inserted into a system and executes. In the case of Lateral Movement, this may occur through modification of executable files stored on removable media or by copying malware and renaming it to look like a legitimate file to trick users into executing it on a separate system. In the case of Initial Access, this may occur through manual manipulation of the media, modification of systems used to initially format the media, or modification to the media's firmware itself." ; + d3f:executes d3f:RemovableMediaDevice ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:RemovableMediaDevice ], + d3f:InitialAccessTechnique, + d3f:LateralMovementTechnique . + +d3f:T1092 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Communication Through Removable Media" ; + d3f:attack-id "T1092" ; + d3f:definition "Adversaries can perform command and control between compromised hosts on potentially disconnected networks using removable media to transfer commands from system to system.(Citation: ESET Sednit USBStealer 2014) Both systems would need to be compromised, with the likelihood that an Internet-connected system was compromised first and the second through lateral movement by [Replication Through Removable Media](https://attack.mitre.org/techniques/T1091). Commands and files would be relayed from the disconnected system to the Internet-connected system to which the adversary has direct access." ; + d3f:modifies d3f:RemovableMediaDevice ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:RemovableMediaDevice ], + d3f:CommandAndControlTechnique . + +d3f:T1093 a owl:Class ; + rdfs:label "Process Hollowing" ; + d3f:attack-id "T1093" ; + d3f:definition "Process hollowing occurs when a process is created in a suspended state then its memory is unmapped and replaced with malicious code. Similar to [Process Injection](https://attack.mitre.org/techniques/T1055), execution of the malicious code is masked under a legitimate process and may evade defenses and detection analysis. (Citation: Leitch Hollowing) (Citation: Elastic Process Injection July 2017)" ; + rdfs:comment "This technique has been revoked by T1055.012" ; + rdfs:seeAlso "T1055.012" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1094 a owl:Class ; + rdfs:label "Custom Command and Control Protocol" ; + d3f:attack-id "T1094" ; + d3f:definition "Adversaries may communicate using a custom command and control protocol instead of encapsulating commands/data in an existing [Application Layer Protocol](https://attack.mitre.org/techniques/T1071). Implementations include mimicking well-known protocols or developing custom protocols (including raw sockets) on top of fundamental protocols provided by TCP/IP/another standard network stack." ; + rdfs:comment "This technique has been revoked by T1095" ; + rdfs:seeAlso "T1095" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1095 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Non-Application Layer Protocol" ; + d3f:attack-id "T1095" ; + d3f:definition "Adversaries may use an OSI non-application layer protocol for communication between host and C2 server or among infected hosts within a network. The list of possible protocols is extensive.(Citation: Wikipedia OSI) Specific examples include use of network layer protocols, such as the Internet Control Message Protocol (ICMP), transport layer protocols, such as the User Datagram Protocol (UDP), session layer protocols, such as Socket Secure (SOCKS), as well as redirected/tunneled protocols, such as Serial over LAN (SOL)." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1096 a owl:Class ; + rdfs:label "NTFS File Attributes" ; + d3f:attack-id "T1096" ; + d3f:definition "Every New Technology File System (NTFS) formatted partition contains a Master File Table (MFT) that maintains a record for every file/directory on the partition. (Citation: SpectorOps Host-Based Jul 2017) Within MFT entries are file attributes, (Citation: Microsoft NTFS File Attributes Aug 2010) such as Extended Attributes (EA) and Data [known as Alternate Data Streams (ADSs) when more than one Data attribute is present], that can be used to store arbitrary data (and even complete files). (Citation: SpectorOps Host-Based Jul 2017) (Citation: Microsoft File Streams) (Citation: MalwareBytes ADS July 2015) (Citation: Microsoft ADS Mar 2014)" ; + rdfs:comment "This technique has been revoked by T1564.004" ; + rdfs:seeAlso "T1564.004" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1097 a owl:Class ; + rdfs:label "Pass the Ticket" ; + d3f:attack-id "T1097" ; + d3f:definition "Pass the ticket (PtT) is a method of authenticating to a system using Kerberos tickets without having access to an account's password. Kerberos authentication can be used as the first step to lateral movement to a remote system." ; + rdfs:comment "This technique has been revoked by T1550.003" ; + rdfs:seeAlso "T1550.003" ; + rdfs:subClassOf d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1098.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Additional Cloud Credentials" ; + d3f:attack-id "T1098.001" ; + d3f:creates d3f:Credential ; + d3f:definition "Adversaries may add adversary-controlled credentials to a cloud account to maintain persistent access to victim accounts and instances within the environment." ; + d3f:produces d3f:IntranetAdministrativeNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:Credential ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetAdministrativeNetworkTraffic ], + d3f:T1098 . + +d3f:T1098.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Additional Email Delegate Permissions" ; + d3f:attack-id "T1098.002" ; + d3f:definition "Adversaries may grant additional permission levels to maintain persistent access to an adversary-controlled email account." ; + d3f:modifies d3f:DomainUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:DomainUserAccount ], + d3f:T1098 . + +d3f:T1098.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Additional Cloud Roles" ; + d3f:attack-id "T1098.003" ; + d3f:definition "An adversary may add additional roles or permissions to an adversary-controlled cloud account to maintain persistent access to a tenant. For example, adversaries may update IAM policies in cloud-based environments or add a new global administrator in Office 365 environments.(Citation: AWS IAM Policies and Permissions)(Citation: Google Cloud IAM Policies)(Citation: Microsoft Support O365 Add Another Admin, October 2019)(Citation: Microsoft O365 Admin Roles) With sufficient permissions, a compromised account can gain almost unlimited access to data and settings (including the ability to reset the passwords of other admins).(Citation: Expel AWS Attacker)" ; + d3f:modifies d3f:GlobalUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:GlobalUserAccount ], + d3f:T1098 . + +d3f:T1098.004 a owl:Class ; + rdfs:label "SSH Authorized Keys" ; + d3f:attack-id "T1098.004" ; + d3f:definition "Adversaries may modify the SSH authorized_keys file to maintain persistence on a victim host. Linux distributions and macOS commonly use key-based authentication to secure the authentication process of SSH sessions for remote management. The authorized_keys file in SSH specifies the SSH keys that can be used for logging into the user account for which the file is configured. This file is usually found in the user's home directory under <user-home>/.ssh/authorized_keys.(Citation: SSH Authorized Keys) Users may edit the system’s SSH config file to modify the directives PubkeyAuthentication and RSAAuthentication to the value “yes” to ensure public key and RSA authentication are enabled. The SSH config file is usually located under /etc/ssh/sshd_config." ; + rdfs:subClassOf d3f:T1098 . + +d3f:T1098.005 a owl:Class ; + rdfs:label "Device Registration" ; + d3f:attack-id "T1098.005" ; + d3f:definition "Adversaries may register a device to an adversary-controlled account. Devices may be registered in a multifactor authentication (MFA) system, which handles authentication to the network, or in a device management system, which handles device access and compliance." ; + rdfs:subClassOf d3f:T1098 . + +d3f:T1098.006 a owl:Class ; + rdfs:label "Additional Container Cluster Roles" ; + d3f:attack-id "T1098.006" ; + d3f:definition "An adversary may add additional roles or permissions to an adversary-controlled user or service account to maintain persistent access to a container orchestration system. For example, an adversary with sufficient permissions may create a RoleBinding or a ClusterRoleBinding to bind a Role or ClusterRole to a Kubernetes account.(Citation: Kubernetes RBAC)(Citation: Aquasec Kubernetes Attack 2023) Where attribute-based access control (ABAC) is in use, an adversary with sufficient permissions may modify a Kubernetes ABAC policy to give the target account additional permissions.(Citation: Kuberentes ABAC)" ; + rdfs:subClassOf d3f:T1098 . + +d3f:T1098.007 a owl:Class ; + rdfs:label "Additional Local or Domain Groups" ; + d3f:attack-id "T1098.007" ; + d3f:definition "An adversary may add additional local or domain groups to an adversary-controlled account to maintain persistent access to a system or domain." ; + rdfs:subClassOf d3f:T1098 . + +d3f:T1099 a owl:Class ; + rdfs:label "Timestomp" ; + d3f:attack-id "T1099" ; + d3f:definition "Adversaries may take actions to hide the deployment of new, or modification of existing files to obfuscate their activities. Timestomping is a technique that modifies the timestamps of a file (the modify, access, create, and change times), often to mimic files that are in the same folder. This is done, for example, on files that have been modified or created by the adversary so that they do not appear conspicuous to forensic investigators or file analysis tools. Timestomping may be used along with file name [Masquerading](https://attack.mitre.org/techniques/T1036) to hide malware and tools. (Citation: WindowsIR Anti-Forensic Techniques)" ; + rdfs:comment "This technique has been revoked by T1070.006" ; + rdfs:seeAlso "T1070.006" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1100 a owl:Class ; + rdfs:label "Web Shell" ; + d3f:attack-id "T1100" ; + d3f:definition "A Web shell is a Web script that is placed on an openly accessible Web server to allow an adversary to use the Web server as a gateway into a network. A Web shell may provide a set of functions to execute or a command-line interface on the system that hosts the Web server. In addition to a server-side script, a Web shell may have a client interface program that is used to talk to the Web server (see, for example, China Chopper Web shell client). (Citation: Lee 2013)" ; + rdfs:comment "This technique has been revoked by T1505.003" ; + rdfs:seeAlso "T1505.003" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1101 a owl:Class ; + rdfs:label "Security Support Provider" ; + d3f:attack-id "T1101" ; + d3f:definition "Windows Security Support Provider (SSP) DLLs are loaded into the Local Security Authority (LSA) process at system start. Once loaded into the LSA, SSP DLLs have access to encrypted and plaintext passwords that are stored in Windows, such as any logged-on user's Domain password or smart card PINs. The SSP configuration is stored in two Registry keys: HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\Security Packages and HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\OSConfig\\Security Packages. An adversary may modify these Registry keys to add new SSPs, which will be loaded the next time the system boots, or when the AddSecurityPackage Windows API function is called." ; + rdfs:comment "This technique has been revoked by T1547.005" ; + rdfs:seeAlso "T1547.005" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1102.001 a owl:Class ; + rdfs:label "Dead Drop Resolver" ; + d3f:attack-id "T1102.001" ; + d3f:definition "Adversaries may use an existing, legitimate external Web service to host information that points to additional command and control (C2) infrastructure. Adversaries may post content, known as a dead drop resolver, on Web services with embedded (and often obfuscated/encoded) domains or IP addresses. Once infected, victims will reach out to and be redirected by these resolvers." ; + rdfs:subClassOf d3f:T1102 . + +d3f:T1102.002 a owl:Class ; + rdfs:label "Bidirectional Communication" ; + d3f:attack-id "T1102.002" ; + d3f:definition "Adversaries may use an existing, legitimate external Web service as a means for sending commands to and receiving output from a compromised system over the Web service channel. Compromised systems may leverage popular websites and social media to host command and control (C2) instructions. Those infected systems can then send the output from those commands back over that Web service channel. The return traffic may occur in a variety of ways, depending on the Web service being utilized. For example, the return traffic may take the form of the compromised system posting a comment on a forum, issuing a pull request to development project, updating a document hosted on a Web service, or by sending a Tweet." ; + rdfs:subClassOf d3f:T1102 . + +d3f:T1102.003 a owl:Class ; + rdfs:label "One-Way Communication" ; + d3f:attack-id "T1102.003" ; + d3f:definition "Adversaries may use an existing, legitimate external Web service as a means for sending commands to a compromised system without receiving return output over the Web service channel. Compromised systems may leverage popular websites and social media to host command and control (C2) instructions. Those infected systems may opt to send the output from those commands back over a different C2 channel, including to another distinct Web service. Alternatively, compromised systems may return no output at all in cases where adversaries want to send instructions to systems and do not want a response." ; + rdfs:subClassOf d3f:T1102 . + +d3f:T1103 a owl:Class ; + rdfs:label "AppInit DLLs" ; + d3f:attack-id "T1103" ; + d3f:definition "Dynamic-link libraries (DLLs) that are specified in the AppInit_DLLs value in the Registry keys HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows or HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\Windows are loaded by user32.dll into every process that loads user32.dll. In practice this is nearly every program, since user32.dll is a very common library. (Citation: Elastic Process Injection July 2017) Similar to [Process Injection](https://attack.mitre.org/techniques/T1055), these values can be abused to obtain persistence and privilege escalation by causing a malicious DLL to be loaded and run in the context of separate processes on the computer. (Citation: AppInit Registry)" ; + rdfs:comment "This technique has been revoked by T1546.010" ; + rdfs:seeAlso "T1546.010" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1104 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Multi-Stage Channels" ; + d3f:attack-id "T1104" ; + d3f:definition "Adversaries may create multiple stages for command and control that are employed under different conditions or for certain functions. Use of multiple stages may obfuscate the command and control channel to make detection more difficult." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1105 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Ingress Tool Transfer" ; + d3f:attack-id "T1105" ; + d3f:definition "Session is initiated by the client, and may be a custom protocol which is why it is related to generic network traffic instead of file transfer network traffic." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1106 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Native API" ; + d3f:attack-id "T1106" ; + d3f:definition "Adversaries may interact with the native OS application programming interface (API) to execute behaviors. Native APIs provide a controlled means of calling low-level OS services within the kernel, such as those involving hardware/devices, memory, and processes.(Citation: NT API Windows)(Citation: Linux Kernel API) These native APIs are leveraged by the OS during system boot (when other system components are not yet initialized) as well as carrying out tasks and requests during routine operations." ; + d3f:invokes d3f:SystemCall ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SystemCall ], + d3f:ExecutionTechnique . + +d3f:T1107 a owl:Class ; + rdfs:label "File Deletion" ; + d3f:attack-id "T1107" ; + d3f:definition "Adversaries may delete files left behind by the actions of their intrusion activity. Malware, tools, or other non-native files dropped or created on a system by an adversary may leave traces to indicate to what was done within a network and how. Removal of these files can occur during an intrusion, or as part of a post-intrusion process to minimize the adversary's footprint." ; + rdfs:comment "This technique has been revoked by T1070.004" ; + rdfs:seeAlso "T1070.004" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1108 a owl:Class ; + rdfs:label "Redundant Access" ; + d3f:attack-id "T1108" ; + d3f:definition "**This technique has been deprecated. Please use [Create Account](https://attack.mitre.org/techniques/T1136), [Web Shell](https://attack.mitre.org/techniques/T1505/003), and [External Remote Services](https://attack.mitre.org/techniques/T1133) where appropriate.**" ; + rdfs:comment "**This technique has been deprecated. Please use [Create Account](https://attack.mitre.org/techniques/T1136), [Web Shell](https://attack.mitre.org/techniques/T1505/003), and [External Remote Services](https://attack.mitre.org/techniques/T1133) where appropriate.**" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1109 a owl:Class ; + rdfs:label "Component Firmware" ; + d3f:attack-id "T1109" ; + d3f:definition "Some adversaries may employ sophisticated means to compromise computer components and install malicious firmware that will execute adversary code outside of the operating system and main system firmware or BIOS. This technique may be similar to [System Firmware](https://attack.mitre.org/techniques/T1019) but conducted upon other system components that may not have the same capability or level of integrity checking. Malicious device firmware could provide both a persistent level of access to systems despite potential typical failures to maintain access and hard disk re-images, as well as a way to evade host software-based defenses and integrity checks." ; + rdfs:comment "This technique has been revoked by T1542.002" ; + rdfs:seeAlso "T1542.002" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1110.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Password Guessing" ; + d3f:accesses d3f:Password ; + d3f:attack-id "T1110.001" ; + d3f:definition "Adversaries with no prior knowledge of legitimate credentials within the system or environment may guess passwords to attempt access to accounts. Without knowledge of the password for an account, an adversary may opt to systematically guess the password using a repetitive or iterative mechanism. An adversary may guess login credentials without prior knowledge of system or environment passwords during an operation by using a list of common passwords. Password guessing may or may not take into account the target's policies on password complexity or use policies that may lock accounts out after a number of failed attempts." ; + d3f:modifies d3f:AuthenticationLog ; + d3f:produces d3f:Authentication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Password ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Authentication ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:AuthenticationLog ], + d3f:T1110 . + +d3f:T1110.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Password Cracking" ; + d3f:accesses d3f:Password ; + d3f:attack-id "T1110.002" ; + d3f:definition "Adversaries may use password cracking to attempt to recover usable credentials, such as plaintext passwords, when credential material such as password hashes are obtained. [OS Credential Dumping](https://attack.mitre.org/techniques/T1003) can be used to obtain password hashes, this may only get an adversary so far when [Pass the Hash](https://attack.mitre.org/techniques/T1550/002) is not an option. Further, adversaries may leverage [Data from Configuration Repository](https://attack.mitre.org/techniques/T1602) in order to obtain hashed credentials for network devices.(Citation: US-CERT-TA18-106A)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Password ], + d3f:T1110 . + +d3f:T1110.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Password Spraying" ; + d3f:accesses d3f:Password ; + d3f:attack-id "T1110.003" ; + d3f:definition "Adversaries may use a single or small list of commonly used passwords against many different accounts to attempt to acquire valid account credentials. Password spraying uses one password (e.g. 'Password01'), or a small list of commonly used passwords, that may match the complexity policy of the domain. Logins are attempted with that password against many different accounts on a network to avoid account lockouts that would normally occur when brute forcing a single account with many passwords. (Citation: BlackHillsInfosec Password Spraying)" ; + d3f:may-create d3f:IntranetAdministrativeNetworkTraffic ; + d3f:modifies d3f:AuthenticationLog ; + d3f:produces d3f:Authentication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:IntranetAdministrativeNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Password ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Authentication ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:AuthenticationLog ], + d3f:T1110 . + +d3f:T1110.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Stuffing" ; + d3f:attack-id "T1110.004" ; + d3f:definition "Adversaries may use credentials obtained from breach dumps of unrelated accounts to gain access to target accounts through credential overlap. Occasionally, large numbers of username and password pairs are dumped online when a website or service is compromised and the user account credentials accessed. The information may be useful to an adversary attempting to compromise accounts by taking advantage of the tendency for users to use the same passwords across personal and business accounts." ; + d3f:may-create d3f:IntranetAdministrativeNetworkTraffic ; + d3f:modifies d3f:AuthenticationLog ; + d3f:produces d3f:Authentication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:AuthenticationLog ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:IntranetAdministrativeNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Authentication ], + d3f:T1110 . + +d3f:T1111 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Multi-Factor Authentication Interception" ; + d3f:attack-id "T1111" ; + d3f:definition "Adversaries may target multi-factor authentication (MFA) mechanisms, (i.e., smart cards, token generators, etc.) to gain access to credentials that can be used to access systems, services, and network resources. Use of MFA is recommended and provides a higher level of security than usernames and passwords alone, but organizations should be aware of techniques that could be used to intercept and bypass these security mechanisms." ; + d3f:may-access d3f:SecurityToken ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:SecurityToken ], + d3f:CredentialAccessTechnique . + +d3f:T1112 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Modify Registry" ; + d3f:attack-id "T1112" ; + d3f:definition "Adversaries may interact with the Windows Registry to hide configuration information within Registry keys, remove information as part of cleaning up, or as part of other techniques to aid in persistence and execution." ; + d3f:modifies d3f:WindowsRegistry ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:WindowsRegistry ], + d3f:DefenseEvasionTechnique . + +d3f:T1113 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Screen Capture" ; + d3f:attack-id "T1113" ; + d3f:definition "Adversaries may attempt to take screen captures of the desktop to gather information over the course of an operation. Screen capturing functionality may be included as a feature of a remote access tool used in post-compromise operations. Taking a screenshot is also typically possible through native utilities or API calls, such as CopyFromScreen, xwd, or screencapture.(Citation: CopyFromScreen .NET)(Citation: Antiquated Mac Malware)" ; + d3f:may-access d3f:DisplayServer ; + d3f:may-invoke d3f:GetScreenCapture ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:DisplayServer ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetScreenCapture ], + d3f:CollectionTechnique . + +d3f:T1114.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Email Collection" ; + d3f:attack-id "T1114.001" ; + d3f:definition "Adversaries may target user email on local systems to collect sensitive information. Files containing email data can be acquired from a user’s local system, such as Outlook storage or cache files." ; + d3f:reads d3f:Email ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:Email ], + d3f:T1114 . + +d3f:T1114.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote Email Collection" ; + d3f:accesses d3f:MailServer ; + d3f:attack-id "T1114.002" ; + d3f:definition "Adversaries may target an Exchange server, Office 365, or Google Workspace to collect sensitive information. Adversaries may leverage a user's credentials and interact directly with the Exchange server to acquire information from within a network. Adversaries may also access externally facing Exchange services, Office 365, or Google Workspace to access email using credentials or access tokens. Tools such as [MailSniper](https://attack.mitre.org/software/S0413) can be used to automate searches for specific keywords." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:MailServer ], + d3f:T1114 . + +d3f:T1114.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Email Forwarding Rule" ; + d3f:attack-id "T1114.003" ; + d3f:definition "Adversaries may setup email forwarding rules to collect sensitive information. Adversaries may abuse email forwarding rules to monitor the activities of a victim, steal information, and further gain intelligence on the victim or the victim’s organization to use as part of further exploits or operations.(Citation: US-CERT TA18-068A 2018) Furthermore, email forwarding rules can allow adversaries to maintain persistent access to victim's emails even after compromised credentials are reset by administrators.(Citation: Pfammatter - Hidden Inbox Rules) Most email clients allow users to create inbox rules for various email functions, including forwarding to a different recipient. These rules may be created through a local email application, a web interface, or by command-line interface. Messages can be forwarded to internal or external recipients, and there are no restrictions limiting the extent of this rule. Administrators may also create forwarding rules for user accounts with the same considerations and outcomes.(Citation: Microsoft Tim McMichael Exchange Mail Forwarding 2)(Citation: Mac Forwarding Rules)" ; + d3f:modifies d3f:ApplicationConfiguration ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ApplicationConfiguration ], + d3f:T1114 . + +d3f:T1115 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Clipboard Data" ; + d3f:attack-id "T1115" ; + d3f:definition "Adversaries may collect data stored in the clipboard from users copying information within or between applications." ; + d3f:reads d3f:Clipboard ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:Clipboard ], + d3f:CollectionTechnique . + +d3f:T1116 a owl:Class ; + rdfs:label "Code Signing" ; + d3f:attack-id "T1116" ; + d3f:definition "Code signing provides a level of authenticity on a binary from the developer and a guarantee that the binary has not been tampered with. (Citation: Wikipedia Code Signing) However, adversaries are known to use code signing certificates to masquerade malware and tools as legitimate binaries (Citation: Janicab). The certificates used during an operation may be created, forged, or stolen by the adversary. (Citation: Securelist Digital Certificates) (Citation: Symantec Digital Certificates)" ; + rdfs:comment "This technique has been revoked by T1553.002" ; + rdfs:seeAlso "T1553.002" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1117 a owl:Class ; + rdfs:label "Regsvr32" ; + d3f:attack-id "T1117" ; + d3f:definition "Regsvr32.exe is a command-line program used to register and unregister object linking and embedding controls, including dynamic link libraries (DLLs), on Windows systems. Regsvr32.exe can be used to execute arbitrary binaries. (Citation: Microsoft Regsvr32)" ; + rdfs:comment "This technique has been revoked by T1218.010" ; + rdfs:seeAlso "T1218.010" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1118 a owl:Class ; + rdfs:label "InstallUtil" ; + d3f:attack-id "T1118" ; + d3f:definition "InstallUtil is a command-line utility that allows for installation and uninstallation of resources by executing specific installer components specified in .NET binaries. (Citation: MSDN InstallUtil) InstallUtil is located in the .NET directories on a Windows system: C:\\Windows\\Microsoft.NET\\Framework\\v\\InstallUtil.exe and C:\\Windows\\Microsoft.NET\\Framework64\\v\\InstallUtil.exe. InstallUtil.exe is digitally signed by Microsoft." ; + rdfs:comment "This technique has been revoked by T1218.004" ; + rdfs:seeAlso "T1218.004" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1119 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Automated Collection" ; + d3f:accesses d3f:File ; + d3f:attack-id "T1119" ; + d3f:definition "Once established within a system or network, an adversary may use automated techniques for collecting internal data. Methods for performing this technique could include use of a [Command and Scripting Interpreter](https://attack.mitre.org/techniques/T1059) to search for and copy information fitting set criteria such as file type, location, or name at specific time intervals." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:File ], + d3f:CollectionTechnique . + +d3f:T1120 a owl:Class ; + rdfs:label "Peripheral Device Discovery" ; + d3f:attack-id "T1120" ; + d3f:definition "Adversaries may attempt to gather information about attached peripheral devices and components connected to a computer system.(Citation: Peripheral Discovery Linux)(Citation: Peripheral Discovery macOS) Peripheral devices could include auxiliary resources that support a variety of functionalities such as keyboards, printers, cameras, smart card readers, or removable storage. The information may be used to enhance their awareness of the system and network environment or may be used for further actions." ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1121 a owl:Class ; + rdfs:label "Regsvcs/Regasm" ; + d3f:attack-id "T1121" ; + d3f:definition "Regsvcs and Regasm are Windows command-line utilities that are used to register .NET Component Object Model (COM) assemblies. Both are digitally signed by Microsoft. (Citation: MSDN Regsvcs) (Citation: MSDN Regasm)" ; + rdfs:comment "This technique has been revoked by T1218.009" ; + rdfs:seeAlso "T1218.009" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1122 a owl:Class ; + rdfs:label "Component Object Model Hijacking" ; + d3f:attack-id "T1122" ; + d3f:definition "The Component Object Model (COM) is a system within Windows to enable interaction between software components through the operating system. (Citation: Microsoft Component Object Model) Adversaries can use this system to insert malicious code that can be executed in place of legitimate software through hijacking the COM references and relationships as a means for persistence. Hijacking a COM object requires a change in the Windows Registry to replace a reference to a legitimate system component which may cause that component to not work when executed. When that system component is executed through normal system operation the adversary's code will be executed instead. (Citation: GDATA COM Hijacking) An adversary is likely to hijack objects that are used frequently enough to maintain a consistent level of persistence, but are unlikely to break noticeable functionality within the system as to avoid system instability that could lead to detection." ; + rdfs:comment "This technique has been revoked by T1546.015" ; + rdfs:seeAlso "T1546.015" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1123 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Audio Capture" ; + d3f:accesses d3f:AudioInputDevice ; + d3f:attack-id "T1123" ; + d3f:definition "An adversary can leverage a computer's peripheral devices (e.g., microphones and webcams) or applications (e.g., voice and video call services) to capture audio recordings for the purpose of listening into sensitive conversations to gather information.(Citation: ESET Attor Oct 2019)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:AudioInputDevice ], + d3f:CollectionTechnique . + +d3f:T1124 a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Time Discovery" ; + d3f:attack-id "T1124" ; + d3f:definition "An adversary may gather the system time and/or time zone settings from a local or remote system. The system time is set and stored by services, such as the Windows Time Service on Windows or systemsetup on macOS.(Citation: MSDN System Time)(Citation: Technet Windows Time Service)(Citation: systemsetup mac time) These time settings may also be synchronized between systems and services in an enterprise network, typically accomplished with a network time server within a domain.(Citation: Mac Time Sync)(Citation: linux system time)" ; + d3f:may-invoke d3f:CreateProcess, + d3f:GetSystemTime ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetSystemTime ], + d3f:DiscoveryTechnique . + +d3f:T1125 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Video Capture" ; + d3f:accesses d3f:VideoInputDevice ; + d3f:attack-id "T1125" ; + d3f:definition "An adversary can leverage a computer's peripheral devices (e.g., integrated cameras or webcams) or applications (e.g., video call services) to capture video recordings for the purpose of gathering information. Images may also be captured from devices or applications, potentially in specified intervals, in lieu of video files." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:VideoInputDevice ], + d3f:CollectionTechnique . + +d3f:T1126 a owl:Class ; + rdfs:label "Network Share Connection Removal" ; + d3f:attack-id "T1126" ; + d3f:definition "Adversaries may remove share connections that are no longer useful in order to clean up traces of their operation. Windows shared drive and [Windows Admin Shares](https://attack.mitre.org/techniques/T1077) connections can be removed when no longer needed. [Net](https://attack.mitre.org/software/S0039) is an example utility that can be used to remove network share connections with the net use \\\\system\\share /delete command. (Citation: Technet Net Use)" ; + rdfs:comment "This technique has been revoked by T1070.005" ; + rdfs:seeAlso "T1070.005" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1127.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "MSBuild" ; + d3f:attack-id "T1127.001" ; + d3f:definition "Adversaries may use MSBuild to proxy execution of code through a trusted Windows utility. MSBuild.exe (Microsoft Build Engine) is a software build platform used by Visual Studio. It handles XML formatted project files that define requirements for loading and building various platforms and configurations.(Citation: MSDN MSBuild)" ; + d3f:modifies d3f:CompilerConfigurationFile ; + d3f:runs d3f:Compiler ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:CompilerConfigurationFile ], + [ a owl:Restriction ; + owl:onProperty d3f:runs ; + owl:someValuesFrom d3f:Compiler ], + d3f:T1127 . + +d3f:T1127.002 a owl:Class ; + rdfs:label "ClickOnce" ; + d3f:attack-id "T1127.002" ; + d3f:definition "Adversaries may use ClickOnce applications (.appref-ms and .application files) to proxy execution of code through a trusted Windows utility.(Citation: Burke/CISA ClickOnce BlackHat) ClickOnce is a deployment that enables a user to create self-updating Windows-based .NET applications (i.e, .XBAP, .EXE, or .DLL) that install and run from a file share or web page with minimal user interaction. The application launches as a child process of DFSVC.EXE, which is responsible for installing, launching, and updating the application.(Citation: SpectorOps Medium ClickOnce)" ; + rdfs:subClassOf d3f:T1127 . + +d3f:T1128 a owl:Class ; + rdfs:label "Netsh Helper DLL" ; + d3f:attack-id "T1128" ; + d3f:definition "Netsh.exe (also referred to as Netshell) is a command-line scripting utility used to interact with the network configuration of a system. It contains functionality to add helper DLLs for extending functionality of the utility. (Citation: TechNet Netsh) The paths to registered netsh.exe helper DLLs are entered into the Windows Registry at HKLM\\SOFTWARE\\Microsoft\\Netsh." ; + rdfs:comment "This technique has been revoked by T1546.007" ; + rdfs:seeAlso "T1546.007" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1129 a owl:Class ; + rdfs:label "Shared Modules" ; + d3f:attack-id "T1129" ; + d3f:definition "Adversaries may execute malicious payloads via loading shared modules. Shared modules are executable files that are loaded into processes to provide access to reusable code, such as specific custom functions or invoking OS API functions (i.e., [Native API](https://attack.mitre.org/techniques/T1106))." ; + rdfs:subClassOf d3f:ExecutionTechnique . + +d3f:T1130 a owl:Class ; + rdfs:label "Install Root Certificate" ; + d3f:attack-id "T1130" ; + d3f:definition "Root certificates are used in public key cryptography to identify a root certificate authority (CA). When a root certificate is installed, the system or application will trust certificates in the root's chain of trust that have been signed by the root certificate. (Citation: Wikipedia Root Certificate) Certificates are commonly used for establishing secure TLS/SSL communications within a web browser. When a user attempts to browse a website that presents a certificate that is not trusted an error message will be displayed to warn the user of the security risk. Depending on the security settings, the browser may not allow the user to establish a connection to the website." ; + rdfs:comment "This technique has been revoked by T1553.004" ; + rdfs:seeAlso "T1553.004" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1131 a owl:Class ; + rdfs:label "Authentication Package" ; + d3f:attack-id "T1131" ; + d3f:definition "Windows Authentication Package DLLs are loaded by the Local Security Authority (LSA) process at system start. They provide support for multiple logon processes and multiple security protocols to the operating system. (Citation: MSDN Authentication Packages)" ; + rdfs:comment "This technique has been revoked by T1547.002" ; + rdfs:seeAlso "T1547.002" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1132.001 a owl:Class ; + rdfs:label "Standard Encoding" ; + d3f:attack-id "T1132.001" ; + d3f:definition "Adversaries may encode data with a standard data encoding system to make the content of command and control traffic more difficult to detect. Command and control (C2) information can be encoded using a standard data encoding system that adheres to existing protocol specifications. Common data encoding schemes include ASCII, Unicode, hexadecimal, Base64, and MIME.(Citation: Wikipedia Binary-to-text Encoding)(Citation: Wikipedia Character Encoding) Some data encoding systems may also result in data compression, such as gzip." ; + rdfs:subClassOf d3f:T1132 . + +d3f:T1132.002 a owl:Class ; + rdfs:label "Non-Standard Encoding" ; + d3f:attack-id "T1132.002" ; + d3f:definition "Adversaries may encode data with a non-standard data encoding system to make the content of command and control traffic more difficult to detect. Command and control (C2) information can be encoded using a non-standard data encoding system that diverges from existing protocol specifications. Non-standard data encoding schemes may be based on or related to standard data encoding schemes, such as a modified Base64 encoding for the message body of an HTTP request.(Citation: Wikipedia Binary-to-text Encoding) (Citation: Wikipedia Character Encoding)" ; + rdfs:subClassOf d3f:T1132 . + +d3f:T1133 a owl:Class, + owl:NamedIndividual ; + rdfs:label "External Remote Services" ; + d3f:attack-id "T1133" ; + d3f:definition "Adversaries may leverage external-facing remote services to initially access and/or persist within a network. Remote services such as VPNs, Citrix, and other access mechanisms allow users to connect to internal enterprise network resources from external locations. There are often remote service gateways that manage connections and credential authentication for these services. Services such as [Windows Remote Management](https://attack.mitre.org/techniques/T1021/006) and [VNC](https://attack.mitre.org/techniques/T1021/005) can also be used externally.(Citation: MacOS VNC software for Remote Desktop)" ; + d3f:produces d3f:Authentication, + d3f:Authorization, + d3f:NetworkSession ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:NetworkSession ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Authorization ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Authentication ], + d3f:InitialAccessTechnique, + d3f:PersistenceTechnique . + +d3f:T1134.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Create Process with Token" ; + d3f:attack-id "T1134.002" ; + d3f:copies d3f:AccessToken ; + d3f:definition "Adversaries may create a new process with an existing token to escalate privileges and bypass access controls. Processes can be created with the token and resulting security context of another user using features such as CreateProcessWithTokenW and runas.(Citation: Microsoft RunAs)" ; + d3f:may-modify d3f:EventLog ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:copies ; + owl:someValuesFrom d3f:AccessToken ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:EventLog ], + d3f:T1134 . + +d3f:T1134.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Make and Impersonate Token" ; + d3f:attack-id "T1134.003" ; + d3f:copies d3f:AccessToken ; + d3f:creates d3f:LoginSession ; + d3f:definition "Adversaries may make new tokens and impersonate users to escalate privileges and bypass access controls. For example, if an adversary has a username and password but the user is not logged onto the system the adversary can then create a logon session for the user using the `LogonUser` function.(Citation: LogonUserW function) The function will return a copy of the new session's access token and the adversary can use `SetThreadToken` to assign the token to a thread." ; + d3f:may-modify d3f:EventLog ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:copies ; + owl:someValuesFrom d3f:AccessToken ], + [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:LoginSession ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:EventLog ], + d3f:T1134 . + +d3f:T1134.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Parent PID Spoofing" ; + d3f:attack-id "T1134.004" ; + d3f:definition "Adversaries may spoof the parent process identifier (PPID) of a new process to evade process-monitoring defenses or to elevate privileges. New processes are typically spawned directly from their parent, or calling, process unless explicitly specified. One way of explicitly assigning the PPID of a new process is via the CreateProcess API call, which supports a parameter that defines the PPID to use.(Citation: DidierStevens SelectMyParent Nov 2009) This functionality is used by Windows features such as User Account Control (UAC) to correctly set the PPID after a requested elevated process is spawned by SYSTEM (typically via svchost.exe or consent.exe) rather than the current user context.(Citation: Microsoft UAC Nov 2018)" ; + d3f:invokes d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:T1134 . + +d3f:T1134.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "SID-History Injection" ; + d3f:attack-id "T1134.005" ; + d3f:definition "Adversaries may use SID-History Injection to escalate privileges and bypass access controls. The Windows security identifier (SID) is a unique value that identifies a user or group account. SIDs are used by Windows security in both security descriptors and access tokens. (Citation: Microsoft SID) An account can hold additional SIDs in the SID-History Active Directory attribute (Citation: Microsoft SID-History Attribute), allowing inter-operable account migration between domains (e.g., all values in SID-History are included in access tokens)." ; + d3f:modifies d3f:AccessControlConfiguration ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:AccessControlConfiguration ], + d3f:T1134 . + +d3f:T1135 a owl:Class ; + rdfs:label "Network Share Discovery" ; + d3f:attack-id "T1135" ; + d3f:definition "Adversaries may look for folders and drives shared on remote systems as a means of identifying sources of information to gather as a precursor for Collection and to identify potential systems of interest for Lateral Movement. Networks often contain shared network drives and folders that enable users to access file directories on various systems across a network." ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1136.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Account" ; + d3f:attack-id "T1136.001" ; + d3f:creates d3f:LocalUserAccount ; + d3f:definition "Adversaries may create a local account to maintain access to victim systems. Local accounts are those configured by an organization for use by users, remote support, services, or for administration on a single system or service." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:LocalUserAccount ], + d3f:T1136 . + +d3f:T1136.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Account" ; + d3f:attack-id "T1136.002" ; + d3f:creates d3f:DomainUserAccount ; + d3f:definition "Adversaries may create a domain account to maintain access to victim systems. Domain accounts are those managed by Active Directory Domain Services where access and permissions are configured across systems and services that are part of that domain. Domain accounts can cover user, administrator, and service accounts. With a sufficient level of access, the net user /add /domain command can be used to create a domain account.(Citation: Savill 1999)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:DomainUserAccount ], + d3f:T1136 . + +d3f:T1136.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Account" ; + d3f:attack-id "T1136.003" ; + d3f:creates d3f:CloudUserAccount ; + d3f:definition "Adversaries may create a cloud account to maintain access to victim systems. With a sufficient level of access, such accounts may be used to establish secondary credentialed access that does not require persistent remote access tools to be deployed on the system.(Citation: Microsoft O365 Admin Roles)(Citation: Microsoft Support O365 Add Another Admin, October 2019)(Citation: AWS Create IAM User)(Citation: GCP Create Cloud Identity Users)(Citation: Microsoft Azure AD Users)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:CloudUserAccount ], + d3f:T1136 . + +d3f:T1137.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Office Template Macros" ; + d3f:attack-id "T1137.001" ; + d3f:definition "Adversaries may abuse Microsoft Office templates to obtain persistence on a compromised system. Microsoft Office contains templates that are part of common Office applications and are used to customize styles. The base templates within the application are used each time an application starts. (Citation: Microsoft Change Normal Template)" ; + d3f:may-add d3f:ExecutableScript ; + d3f:may-modify d3f:ExecutableScript, + d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-add ; + owl:someValuesFrom d3f:ExecutableScript ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ExecutableScript ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1137 . + +d3f:T1137.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Office Test" ; + d3f:attack-id "T1137.002" ; + d3f:definition "Adversaries may abuse the Microsoft Office \"Office Test\" Registry key to obtain persistence on a compromised system. An Office Test Registry location exists that allows a user to specify an arbitrary DLL that will be executed every time an Office application is started. This Registry key is thought to be used by Microsoft to load DLLs for testing and debugging purposes while developing Office applications. This Registry key is not created by default during an Office installation.(Citation: Hexacorn Office Test)(Citation: Palo Alto Office Test Sofacy)" ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1137 . + +d3f:T1137.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outlook Forms" ; + d3f:adds d3f:OfficeApplicationFile ; + d3f:attack-id "T1137.003" ; + d3f:definition "Adversaries may abuse Microsoft Outlook forms to obtain persistence on a compromised system. Outlook forms are used as templates for presentation and functionality in Outlook messages. Custom Outlook forms can be created that will execute code when a specifically crafted email is sent by an adversary utilizing the same custom Outlook form.(Citation: SensePost Outlook Forms)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:OfficeApplicationFile ], + d3f:T1137 . + +d3f:T1137.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outlook Home Page" ; + d3f:attack-id "T1137.004" ; + d3f:definition "Adversaries may abuse Microsoft Outlook's Home Page feature to obtain persistence on a compromised system. Outlook Home Page is a legacy feature used to customize the presentation of Outlook folders. This feature allows for an internal or external URL to be loaded and presented whenever a folder is opened. A malicious HTML page can be crafted that will execute code when loaded by Outlook Home Page.(Citation: SensePost Outlook Home Page)" ; + d3f:modifies d3f:ApplicationConfigurationDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ApplicationConfigurationDatabase ], + d3f:T1137 . + +d3f:T1137.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outlook Rules" ; + d3f:attack-id "T1137.005" ; + d3f:definition "Adversaries may abuse Microsoft Outlook rules to obtain persistence on a compromised system. Outlook rules allow a user to define automated behavior to manage email messages. A benign rule might, for example, automatically move an email to a particular folder in Outlook if it contains specific words from a specific sender. Malicious Outlook rules can be created that can trigger code execution when an adversary sends a specifically crafted email to that user.(Citation: SilentBreak Outlook Rules)" ; + d3f:modifies d3f:ApplicationConfigurationDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ApplicationConfigurationDatabase ], + d3f:T1137 . + +d3f:T1137.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Add-ins" ; + d3f:adds d3f:Software ; + d3f:attack-id "T1137.006" ; + d3f:definition "Adversaries may abuse Microsoft Office add-ins to obtain persistence on a compromised system. Office add-ins can be used to add functionality to Office programs. (Citation: Microsoft Office Add-ins) There are different types of add-ins that can be used by the various Office products; including Word/Excel add-in Libraries (WLL/XLL), VBA add-ins, Office Component Object Model (COM) add-ins, automation add-ins, VBA Editor (VBE), Visual Studio Tools for Office (VSTO) add-ins, and Outlook add-ins. (Citation: MRWLabs Office Persistence Add-ins)(Citation: FireEye Mail CDS 2018)" ; + d3f:may-modify d3f:SystemConfigurationDatabase ; + d3f:modifies d3f:OfficeApplication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:Software ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:OfficeApplication ], + d3f:T1137 . + +d3f:T1138 a owl:Class ; + rdfs:label "Application Shimming" ; + d3f:attack-id "T1138" ; + d3f:definition "The Microsoft Windows Application Compatibility Infrastructure/Framework (Application Shim) was created to allow for backward compatibility of software as the operating system codebase changes over time. For example, the application shimming feature allows developers to apply fixes to applications (without rewriting code) that were created for Windows XP so that it will work with Windows 10. (Citation: Elastic Process Injection July 2017) Within the framework, shims are created to act as a buffer between the program (or more specifically, the Import Address Table) and the Windows OS. When a program is executed, the shim cache is referenced to determine if the program requires the use of the shim database (.sdb). If so, the shim database uses [Hooking](https://attack.mitre.org/techniques/T1179) to redirect the code as necessary in order to communicate with the OS." ; + rdfs:comment "This technique has been revoked by T1546.011" ; + rdfs:seeAlso "T1546.011" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1139 a owl:Class ; + rdfs:label "Bash History" ; + d3f:attack-id "T1139" ; + d3f:definition "Bash keeps track of the commands users type on the command-line with the \"history\" utility. Once a user logs out, the history is flushed to the user’s .bash_history file. For each user, this file resides at the same location: ~/.bash_history. Typically, this file keeps track of the user’s last 500 commands. Users often type usernames and passwords on the command-line as parameters to programs, which then get saved to this file when they log out. Attackers can abuse this by looking through the file for potential credentials. (Citation: External to DA, the OS X Way)" ; + rdfs:comment "This technique has been revoked by T1552.003" ; + rdfs:seeAlso "T1552.003" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1140 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Deobfuscate/Decode Files or Information" ; + d3f:attack-id "T1140" ; + d3f:definition "Adversaries may use [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027) to hide artifacts of an intrusion from analysis. They may require separate mechanisms to decode or deobfuscate that information depending on how they intend to use it. Methods for doing that include built-in functionality of malware or by using utilities present on the system." ; + d3f:invokes d3f:CreateProcess ; + d3f:may-add d3f:ExecutableFile ; + d3f:may-modify d3f:EventLog ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-add ; + owl:someValuesFrom d3f:ExecutableFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:EventLog ], + d3f:DefenseEvasionTechnique . + +d3f:T1141 a owl:Class ; + rdfs:label "Input Prompt" ; + d3f:attack-id "T1141" ; + d3f:definition "When programs are executed that need additional privileges than are present in the current user context, it is common for the operating system to prompt the user for proper credentials to authorize the elevated privileges for the task (ex: [Bypass User Account Control](https://attack.mitre.org/techniques/T1088))." ; + rdfs:comment "This technique has been revoked by T1056.002" ; + rdfs:seeAlso "T1056.002" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1142 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Keychain" ; + d3f:accesses d3f:EncryptedCredential ; + d3f:attack-id "T1142" ; + d3f:definition "Keychains are the built-in way for macOS to keep track of users' passwords and credentials for many services and features such as WiFi passwords, websites, secure notes, certificates, and Kerberos. Keychain files are located in ~/Library/Keychains/,/Library/Keychains/, and /Network/Library/Keychains/. (Citation: Wikipedia keychain) The security command-line utility, which is built into macOS by default, provides a useful way to manage these credentials." ; + rdfs:comment "This technique has been revoked by T1555.001" ; + rdfs:seeAlso "T1555.001" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:EncryptedCredential ], + d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1143 a owl:Class ; + rdfs:label "Hidden Window" ; + d3f:attack-id "T1143" ; + d3f:definition "Adversaries may implement hidden windows to conceal malicious activity from the plain sight of users. In some cases, windows that would typically be displayed when an application carries out an operation can be hidden. This may be utilized by system administrators to avoid disrupting user work environments when carrying out administrative tasks. Adversaries may abuse operating system functionality to hide otherwise visible windows from users so as not to alert the user to adversary activity on the system." ; + rdfs:comment "This technique has been revoked by T1564.003" ; + rdfs:seeAlso "T1564.003" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1144 a owl:Class ; + rdfs:label "Gatekeeper Bypass" ; + d3f:attack-id "T1144" ; + d3f:definition "In macOS and OS X, when applications or programs are downloaded from the internet, there is a special attribute set on the file called com.apple.quarantine. This attribute is read by Apple's Gatekeeper defense program at execution time and provides a prompt to the user to allow or deny execution." ; + rdfs:comment "This technique has been revoked by T1553.001" ; + rdfs:seeAlso "T1553.001" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1145 a owl:Class ; + rdfs:label "Private Keys" ; + d3f:attack-id "T1145" ; + d3f:definition "Private cryptographic keys and certificates are used for authentication, encryption/decryption, and digital signatures. (Citation: Wikipedia Public Key Crypto)" ; + rdfs:comment "This technique has been revoked by T1552.004" ; + rdfs:seeAlso "T1552.004" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1146 a owl:Class ; + rdfs:label "Clear Command History" ; + d3f:attack-id "T1146" ; + d3f:definition "In addition to clearing system logs, an adversary may clear the command history of a compromised account to conceal the actions undertaken during an intrusion. macOS and Linux both keep track of the commands users type in their terminal so that users can retrace what they've done. These logs can be accessed in a few different ways. While logged in, this command history is tracked in a file pointed to by the environment variable HISTFILE. When a user logs off a system, this information is flushed to a file in the user's home directory called ~/.bash_history. The benefit of this is that it allows users to go back to commands they've used before in different sessions. Since everything typed on the command-line is saved, passwords passed in on the command line are also saved. Adversaries can abuse this by searching these files for cleartext passwords. Additionally, adversaries can use a variety of methods to prevent their own commands from appear in these logs such as unset HISTFILE, export HISTFILESIZE=0, history -c, rm ~/.bash_history." ; + rdfs:comment "This technique has been revoked by T1070.003" ; + rdfs:seeAlso "T1070.003" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1147 a owl:Class ; + rdfs:label "Hidden Users" ; + d3f:attack-id "T1147" ; + d3f:definition "Every user account in macOS has a userID associated with it. When creating a user, you can specify the userID for that account. There is a property value in /Library/Preferences/com.apple.loginwindow called Hide500Users that prevents users with userIDs 500 and lower from appearing at the login screen. By using the [Create Account](https://attack.mitre.org/techniques/T1136) technique with a userID under 500 and enabling this property (setting it to Yes), an adversary can hide their user accounts much more easily: sudo dscl . -create /Users/username UniqueID 401 (Citation: Cybereason OSX Pirrit)." ; + rdfs:comment "This technique has been revoked by T1564.002" ; + rdfs:seeAlso "T1564.002" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1148 a owl:Class ; + rdfs:label "HISTCONTROL" ; + d3f:attack-id "T1148" ; + d3f:definition "The HISTCONTROL environment variable keeps track of what should be saved by the history command and eventually into the ~/.bash_history file when a user logs out. This setting can be configured to ignore commands that start with a space by simply setting it to \"ignorespace\". HISTCONTROL can also be set to ignore duplicate commands by setting it to \"ignoredups\". In some Linux systems, this is set by default to \"ignoreboth\" which covers both of the previous examples. This means that “ ls” will not be saved, but “ls” would be saved by history. HISTCONTROL does not exist by default on macOS, but can be set by the user and will be respected. Adversaries can use this to operate without leaving traces by simply prepending a space to all of their terminal commands." ; + rdfs:comment "This technique has been revoked by T1562.003" ; + rdfs:seeAlso "T1562.003" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1149 a owl:Class ; + rdfs:label "LC_MAIN Hijacking" ; + d3f:attack-id "T1149" ; + d3f:definition "**This technique has been deprecated and should no longer be used.**" ; + rdfs:comment "**This technique has been deprecated and should no longer be used.**" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1150 a owl:Class ; + rdfs:label "Plist Modification" ; + d3f:attack-id "T1150" ; + d3f:definition "Property list (plist) files contain all of the information that macOS and OS X uses to configure applications and services. These files are UTF-8 encoded and formatted like XML documents via a series of keys surrounded by < >. They detail when programs should execute, file paths to the executables, program arguments, required OS permissions, and many others. plists are located in certain locations depending on their purpose such as /Library/Preferences (which execute with elevated privileges) and ~/Library/Preferences (which execute with a user's privileges)." ; + rdfs:comment "This technique has been revoked by T1547.011" ; + rdfs:seeAlso "T1547.011" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1151 a owl:Class ; + rdfs:label "Space after Filename" ; + d3f:attack-id "T1151" ; + d3f:definition "Adversaries can hide a program's true filetype by changing the extension of a file. With certain file types (specifically this does not work with .app extensions), appending a space to the end of a filename will change how the file is processed by the operating system. For example, if there is a Mach-O executable file called evil.bin, when it is double clicked by a user, it will launch Terminal.app and execute. If this file is renamed to evil.txt, then when double clicked by a user, it will launch with the default text editing application (not executing the binary). However, if the file is renamed to \"evil.txt \" (note the space at the end), then when double clicked by a user, the true file type is determined by the OS and handled appropriately and the binary will be executed (Citation: Mac Backdoors are back)." ; + rdfs:comment "This technique has been revoked by T1036.006" ; + rdfs:seeAlso "T1036.006" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1152 a owl:Class ; + rdfs:label "Launchctl" ; + d3f:attack-id "T1152" ; + d3f:definition "Launchctl controls the macOS launchd process which handles things like launch agents and launch daemons, but can execute other commands or programs itself. Launchctl supports taking subcommands on the command-line, interactively, or even redirected from standard input. By loading or reloading launch agents or launch daemons, adversaries can install persistence or execute changes they made (Citation: Sofacy Komplex Trojan). Running a command from launchctl is as simple as launchctl submit -l -- /Path/to/thing/to/execute \"arg\" \"arg\" \"arg\". Loading, unloading, or reloading launch agents or launch daemons can require elevated privileges." ; + rdfs:comment "This technique has been revoked by T1569.001" ; + rdfs:seeAlso "T1569.001" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique, + d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1153 a owl:Class ; + rdfs:label "Source" ; + d3f:attack-id "T1153" ; + d3f:definition "**This technique has been deprecated and should no longer be used.**" ; + rdfs:comment "**This technique has been deprecated and should no longer be used.**" ; + rdfs:subClassOf d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1154 a owl:Class ; + rdfs:label "Trap" ; + d3f:attack-id "T1154" ; + d3f:definition "The trap command allows programs and shells to specify commands that will be executed upon receiving interrupt signals. A common situation is a script allowing for graceful termination and handling of common keyboard interrupts like ctrl+c and ctrl+d. Adversaries can use this to register code to be executed when the shell encounters specific interrupts either to gain execution or as a persistence mechanism. Trap commands are of the following format trap 'command list' signals where \"command list\" will be executed when \"signals\" are received.(Citation: Trap Manual)(Citation: Cyberciti Trap Statements)" ; + rdfs:comment "This technique has been revoked by T1546.005" ; + rdfs:seeAlso "T1546.005" ; + rdfs:subClassOf d3f:ExecutionTechnique, + d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1155 a owl:Class ; + rdfs:label "AppleScript" ; + d3f:attack-id "T1155" ; + d3f:definition "macOS and OS X applications send AppleEvent messages to each other for interprocess communications (IPC). These messages can be easily scripted with AppleScript for local or remote IPC. Osascript executes AppleScript and any other Open Scripting Architecture (OSA) language scripts. A list of OSA languages installed on a system can be found by using the osalang program." ; + rdfs:comment "This technique has been revoked by T1059.002" ; + rdfs:seeAlso "T1059.002" ; + rdfs:subClassOf d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1156 a owl:Class ; + rdfs:label "Malicious Shell Modification" ; + d3f:attack-id "T1156" ; + d3f:definition "Adversaries may establish persistence through executing malicious commands triggered by a user’s shell. User shells execute several configuration scripts at different points throughout the session based on events. For example, when a user opens a command line interface or remotely logs in (such as SSH) a login shell is initiated. The login shell executes scripts from the system (/etc) and the user’s home directory (~/) to configure the environment. All login shells on a system use /etc/profile when initiated. These configuration scripts run at the permission level of their directory and are often used to set environment variables, create aliases, and customize the user’s environment. When the shell exits or terminates, additional shell scripts are executed to ensure the shell exits appropriately." ; + rdfs:comment "This technique has been revoked by T1546.004" ; + rdfs:seeAlso "T1546.004" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1157 a owl:Class ; + rdfs:label "Dylib Hijacking" ; + d3f:attack-id "T1157" ; + d3f:definition "macOS and OS X use a common method to look for required dynamic libraries (dylib) to load into a program based on search paths. Adversaries can take advantage of ambiguous paths to plant dylibs to gain privilege escalation or persistence." ; + rdfs:comment "This technique has been revoked by T1574.004" ; + rdfs:seeAlso "T1574.004" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1158 a owl:Class ; + rdfs:label "Hidden Files and Directories" ; + d3f:attack-id "T1158" ; + d3f:definition "To prevent normal users from accidentally changing special files on a system, most operating systems have the concept of a ‘hidden’ file. These files don’t show up when a user browses the file system with a GUI or when using normal commands on the command line. Users must explicitly ask to show the hidden files either via a series of Graphical User Interface (GUI) prompts or with command line switches (dir /a for Windows and ls –a for Linux and macOS)." ; + rdfs:comment "This technique has been revoked by T1564.001" ; + rdfs:seeAlso "T1564.001" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1159 a owl:Class ; + rdfs:label "Launch Agent" ; + d3f:attack-id "T1159" ; + d3f:definition "Per Apple’s developer documentation, when a user logs in, a per-user launchd process is started which loads the parameters for each launch-on-demand user agent from the property list (plist) files found in /System/Library/LaunchAgents, /Library/LaunchAgents, and $HOME/Library/LaunchAgents (Citation: AppleDocs Launch Agent Daemons) (Citation: OSX Keydnap malware) (Citation: Antiquated Mac Malware). These launch agents have property list files which point to the executables that will be launched (Citation: OSX.Dok Malware)." ; + rdfs:comment "This technique has been revoked by T1543.001" ; + rdfs:seeAlso "T1543.001" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1160 a owl:Class ; + rdfs:label "Launch Daemon" ; + d3f:attack-id "T1160" ; + d3f:definition "Per Apple’s developer documentation, when macOS and OS X boot up, launchd is run to finish system initialization. This process loads the parameters for each launch-on-demand system-level daemon from the property list (plist) files found in /System/Library/LaunchDaemons and /Library/LaunchDaemons (Citation: AppleDocs Launch Agent Daemons). These LaunchDaemons have property list files which point to the executables that will be launched (Citation: Methods of Mac Malware Persistence)." ; + rdfs:comment "This technique has been revoked by T1543.004" ; + rdfs:seeAlso "T1543.004" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1161 a owl:Class ; + rdfs:label "LC_LOAD_DYLIB Addition" ; + d3f:attack-id "T1161" ; + d3f:definition "Mach-O binaries have a series of headers that are used to perform certain operations when a binary is loaded. The LC_LOAD_DYLIB header in a Mach-O binary tells macOS and OS X which dynamic libraries (dylibs) to load during execution time. These can be added ad-hoc to the compiled binary as long adjustments are made to the rest of the fields and dependencies (Citation: Writing Bad Malware for OSX). There are tools available to perform these changes. Any changes will invalidate digital signatures on binaries because the binary is being modified. Adversaries can remediate this issue by simply removing the LC_CODE_SIGNATURE command from the binary so that the signature isn’t checked at load time (Citation: Malware Persistence on OS X)." ; + rdfs:comment "This technique has been revoked by T1546.006" ; + rdfs:seeAlso "T1546.006" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1162 a owl:Class ; + rdfs:label "Login Item" ; + d3f:attack-id "T1162" ; + d3f:definition "MacOS provides the option to list specific applications to run when a user logs in. These applications run under the logged in user's context, and will be started every time the user logs in. Login items installed using the Service Management Framework are not visible in the System Preferences and can only be removed by the application that created them (Citation: Adding Login Items). Users have direct control over login items installed using a shared file list which are also visible in System Preferences (Citation: Adding Login Items). These login items are stored in the user's ~/Library/Preferences/ directory in a plist file called com.apple.loginitems.plist (Citation: Methods of Mac Malware Persistence). Some of these applications can open visible dialogs to the user, but they don’t all have to since there is an option to ‘Hide’ the window. If an adversary can register their own login item or modified an existing one, then they can use it to execute their code for a persistence mechanism each time the user logs in (Citation: Malware Persistence on OS X) (Citation: OSX.Dok Malware). The API method SMLoginItemSetEnabled can be used to set Login Items, but scripting languages like [AppleScript](https://attack.mitre.org/techniques/T1155) can do this as well (Citation: Adding Login Items)." ; + rdfs:comment "This technique has been revoked by T1547.011" ; + rdfs:seeAlso "T1547.011" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1163 a owl:Class ; + rdfs:label "Rc.common" ; + d3f:attack-id "T1163" ; + d3f:definition "During the boot process, macOS executes source /etc/rc.common, which is a shell script containing various utility functions. This file also defines routines for processing command-line arguments and for gathering system settings, and is thus recommended to include in the start of Startup Item Scripts (Citation: Startup Items). In macOS and OS X, this is now a deprecated technique in favor of launch agents and launch daemons, but is currently still used." ; + rdfs:comment "This technique has been revoked by T1037.004" ; + rdfs:seeAlso "T1037.004" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1164 a owl:Class ; + rdfs:label "Re-opened Applications" ; + d3f:attack-id "T1164" ; + d3f:definition "Starting in Mac OS X 10.7 (Lion), users can specify certain applications to be re-opened when a user reboots their machine. While this is usually done via a Graphical User Interface (GUI) on an app-by-app basis, there are property list files (plist) that contain this information as well located at ~/Library/Preferences/com.apple.loginwindow.plist and ~/Library/Preferences/ByHost/com.apple.loginwindow.* .plist." ; + rdfs:comment "This technique has been revoked by T1547.007" ; + rdfs:seeAlso "T1547.007" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1165 a owl:Class ; + rdfs:label "Startup Items" ; + d3f:attack-id "T1165" ; + d3f:definition "Per Apple’s documentation, startup items execute during the final phase of the boot process and contain shell scripts or other executable files along with configuration information used by the system to determine the execution order for all startup items (Citation: Startup Items). This is technically a deprecated version (superseded by Launch Daemons), and thus the appropriate folder, /Library/StartupItems isn’t guaranteed to exist on the system by default, but does appear to exist by default on macOS Sierra. A startup item is a directory whose executable and configuration property list (plist), StartupParameters.plist, reside in the top-level directory." ; + rdfs:comment "This technique has been revoked by T1037.005" ; + rdfs:seeAlso "T1037.005" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1166 a owl:Class ; + rdfs:label "Setuid and Setgid" ; + d3f:attack-id "T1166" ; + d3f:definition "When the setuid or setgid bits are set on Linux or macOS for an application, this means that the application will run with the privileges of the owning user or group respectively (Citation: setuid man page). Normally an application is run in the current user’s context, regardless of which user or group owns the application. There are instances where programs need to be executed in an elevated context to function properly, but the user running them doesn’t need the elevated privileges. Instead of creating an entry in the sudoers file, which must be done by root, any user can specify the setuid or setgid flag to be set for their own applications. These bits are indicated with an \"s\" instead of an \"x\" when viewing a file's attributes via ls -l. The chmod program can set these bits with via bitmasking, chmod 4777 [file] or via shorthand naming, chmod u+s [file]." ; + rdfs:comment "This technique has been revoked by T1548.001" ; + rdfs:seeAlso "T1548.001" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1167 a owl:Class ; + rdfs:label "Securityd Memory" ; + d3f:attack-id "T1167" ; + d3f:definition "In OS X prior to El Capitan, users with root access can read plaintext keychain passwords of logged-in users because Apple’s keychain implementation allows these credentials to be cached so that users are not repeatedly prompted for passwords. (Citation: OS X Keychain) (Citation: External to DA, the OS X Way) Apple’s securityd utility takes the user’s logon password, encrypts it with PBKDF2, and stores this master key in memory. Apple also uses a set of keys and algorithms to encrypt the user’s password, but once the master key is found, an attacker need only iterate over the other values to unlock the final password. (Citation: OS X Keychain)" ; + rdfs:comment "This technique has been revoked by T1555.002" ; + rdfs:seeAlso "T1555.002" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1168 a owl:Class ; + rdfs:label "Local Job Scheduling" ; + d3f:attack-id "T1168" ; + d3f:definition "On Linux and macOS systems, multiple methods are supported for creating pre-scheduled and periodic background jobs: cron, (Citation: Die.net Linux crontab Man Page) at, (Citation: Die.net Linux at Man Page) and launchd. (Citation: AppleDocs Scheduling Timed Jobs) Unlike [Scheduled Task/Job](https://attack.mitre.org/techniques/T1053) on Windows systems, job scheduling on Linux-based systems cannot be done remotely unless used in conjunction within an established remote session, like secure shell (SSH)." ; + rdfs:comment "This technique has been revoked by T1053" ; + rdfs:seeAlso "T1053" ; + rdfs:subClassOf d3f:ExecutionTechnique, + d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1169 a owl:Class ; + rdfs:label "Sudo" ; + d3f:attack-id "T1169" ; + d3f:definition "The sudoers file, /etc/sudoers, describes which users can run which commands and from which terminals. This also describes which commands users can run as other users or groups. This provides the idea of least privilege such that users are running in their lowest possible permissions for most of the time and only elevate to other users or permissions as needed, typically by prompting for a password. However, the sudoers file can also specify when to not prompt users for passwords with a line like user1 ALL=(ALL) NOPASSWD: ALL (Citation: OSX.Dok Malware)." ; + rdfs:comment "This technique has been revoked by T1548.003" ; + rdfs:seeAlso "T1548.003" ; + rdfs:subClassOf d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1170 a owl:Class ; + rdfs:label "Mshta" ; + d3f:attack-id "T1170" ; + d3f:definition "Mshta.exe is a utility that executes Microsoft HTML Applications (HTA). HTA files have the file extension .hta. (Citation: Wikipedia HTML Application) HTAs are standalone applications that execute using the same models and technologies of Internet Explorer, but outside of the browser. (Citation: MSDN HTML Applications)" ; + rdfs:comment "This technique has been revoked by T1218.005" ; + rdfs:seeAlso "T1218.005" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1171 a owl:Class ; + rdfs:label "LLMNR/NBT-NS Poisoning and Relay" ; + d3f:attack-id "T1171" ; + d3f:definition "Link-Local Multicast Name Resolution (LLMNR) and NetBIOS Name Service (NBT-NS) are Microsoft Windows components that serve as alternate methods of host identification. LLMNR is based upon the Domain Name System (DNS) format and allows hosts on the same local link to perform name resolution for other hosts. NBT-NS identifies systems on a local network by their NetBIOS name. (Citation: Wikipedia LLMNR) (Citation: TechNet NetBIOS)" ; + rdfs:comment "This technique has been revoked by T1557.001" ; + rdfs:seeAlso "T1557.001" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1172 a owl:Class ; + rdfs:label "Domain Fronting" ; + d3f:attack-id "T1172" ; + d3f:definition "Domain fronting takes advantage of routing schemes in Content Delivery Networks (CDNs) and other services which host multiple domains to obfuscate the intended destination of HTTPS traffic or traffic tunneled through HTTPS. (Citation: Fifield Blocking Resistent Communication through domain fronting 2015) The technique involves using different domain names in the SNI field of the TLS header and the Host field of the HTTP header. If both domains are served from the same CDN, then the CDN may route to the address specified in the HTTP header after unwrapping the TLS header. A variation of the the technique, \"domainless\" fronting, utilizes a SNI field that is left blank; this may allow the fronting to work even when the CDN attempts to validate that the SNI and HTTP Host fields match (if the blank SNI fields are ignored)." ; + rdfs:comment "This technique has been revoked by T1090.004" ; + rdfs:seeAlso "T1090.004" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1173 a owl:Class ; + rdfs:label "Dynamic Data Exchange" ; + d3f:attack-id "T1173" ; + d3f:definition "Windows Dynamic Data Exchange (DDE) is a client-server protocol for one-time and/or continuous inter-process communication (IPC) between applications. Once a link is established, applications can autonomously exchange transactions consisting of strings, warm data links (notifications when a data item changes), hot data links (duplications of changes to a data item), and requests for command execution." ; + rdfs:comment "This technique has been revoked by T1559.002" ; + rdfs:seeAlso "T1559.002" ; + rdfs:subClassOf d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1174 a owl:Class ; + rdfs:label "Password Filter DLL" ; + d3f:attack-id "T1174" ; + d3f:definition "Windows password filters are password policy enforcement mechanisms for both domain and local accounts. Filters are implemented as dynamic link libraries (DLLs) containing a method to validate potential passwords against password policies. Filter DLLs can be positioned on local computers for local accounts and/or domain controllers for domain accounts." ; + rdfs:comment "This technique has been revoked by T1556.002" ; + rdfs:seeAlso "T1556.002" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1175 a owl:Class ; + rdfs:label "Component Object Model and Distributed COM" ; + d3f:attack-id "T1175" ; + d3f:definition "**This technique has been deprecated. Please use [Distributed Component Object Model](https://attack.mitre.org/techniques/T1021/003) and [Component Object Model](https://attack.mitre.org/techniques/T1559/001).**" ; + rdfs:comment "**This technique has been deprecated. Please use [Distributed Component Object Model](https://attack.mitre.org/techniques/T1021/003) and [Component Object Model](https://attack.mitre.org/techniques/T1559/001).**" ; + rdfs:subClassOf d3f:ExecutionTechnique, + d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1176 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Browser Extensions" ; + d3f:attack-id "T1176" ; + d3f:definition "Adversaries may abuse Internet browser extensions to establish persistent access to victim systems. Browser extensions or plugins are small programs that can add functionality and customize aspects of Internet browsers. They can be installed directly or through a browser's app store and generally have access and permissions to everything that the browser can access.(Citation: Wikipedia Browser Extension)(Citation: Chrome Extensions Definition)" ; + d3f:modifies d3f:BrowserExtension ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:BrowserExtension ], + d3f:PersistenceTechnique . + +d3f:T1177 a owl:Class ; + rdfs:label "LSASS Driver" ; + d3f:attack-id "T1177" ; + d3f:definition "The Windows security subsystem is a set of components that manage and enforce the security policy for a computer or domain. The Local Security Authority (LSA) is the main component responsible for local security policy and user authentication. The LSA includes multiple dynamic link libraries (DLLs) associated with various other security functions, all of which run in the context of the LSA Subsystem Service (LSASS) lsass.exe process. (Citation: Microsoft Security Subsystem)" ; + rdfs:comment "This technique has been revoked by T1547.008" ; + rdfs:seeAlso "T1547.008" ; + rdfs:subClassOf d3f:ExecutionTechnique, + d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1178 a owl:Class ; + rdfs:label "SID-History Injection" ; + d3f:attack-id "T1178" ; + d3f:definition "The Windows security identifier (SID) is a unique value that identifies a user or group account. SIDs are used by Windows security in both security descriptors and access tokens. (Citation: Microsoft SID) An account can hold additional SIDs in the SID-History Active Directory attribute (Citation: Microsoft SID-History Attribute), allowing inter-operable account migration between domains (e.g., all values in SID-History are included in access tokens)." ; + rdfs:comment "This technique has been revoked by T1134.005" ; + rdfs:seeAlso "T1134.005" ; + rdfs:subClassOf d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1179 a owl:Class ; + rdfs:label "Hooking" ; + d3f:attack-id "T1179" ; + d3f:definition "Windows processes often leverage application programming interface (API) functions to perform tasks that require reusable system resources. Windows API functions are typically stored in dynamic-link libraries (DLLs) as exported functions." ; + rdfs:comment "This technique has been revoked by T1056.004" ; + rdfs:seeAlso "T1056.004" ; + rdfs:subClassOf d3f:CredentialAccessTechnique, + d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1180 a owl:Class ; + rdfs:label "Screensaver" ; + d3f:attack-id "T1180" ; + d3f:definition "Screensavers are programs that execute after a configurable time of user inactivity and consist of Portable Executable (PE) files with a .scr file extension.(Citation: Wikipedia Screensaver) The Windows screensaver application scrnsave.scr is located in C:\\Windows\\System32\\, and C:\\Windows\\sysWOW64\\ on 64-bit Windows systems, along with screensavers included with base Windows installations." ; + rdfs:comment "This technique has been revoked by T1546.002" ; + rdfs:seeAlso "T1546.002" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1181 a owl:Class ; + rdfs:label "Extra Window Memory Injection" ; + d3f:attack-id "T1181" ; + d3f:definition "Before creating a window, graphical Windows-based processes must prescribe to or register a windows class, which stipulate appearance and behavior (via windows procedures, which are functions that handle input/output of data). (Citation: Microsoft Window Classes) Registration of new windows classes can include a request for up to 40 bytes of extra window memory (EWM) to be appended to the allocated memory of each instance of that class. This EWM is intended to store data specific to that window and has specific application programming interface (API) functions to set and get its value. (Citation: Microsoft GetWindowLong function) (Citation: Microsoft SetWindowLong function)" ; + rdfs:comment "This technique has been revoked by T1055.011" ; + rdfs:seeAlso "T1055.011" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1182 a owl:Class ; + rdfs:label "AppCert DLLs" ; + d3f:attack-id "T1182" ; + d3f:definition "Dynamic-link libraries (DLLs) that are specified in the AppCertDLLs Registry key under HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager are loaded into every process that calls the ubiquitously used application programming interface (API) functions CreateProcess, CreateProcessAsUser, CreateProcessWithLoginW, CreateProcessWithTokenW, or WinExec. (Citation: Elastic Process Injection July 2017)" ; + rdfs:comment "This technique has been revoked by T1546.009" ; + rdfs:seeAlso "T1546.009" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1183 a owl:Class ; + rdfs:label "Image File Execution Options Injection" ; + d3f:attack-id "T1183" ; + d3f:definition "Image File Execution Options (IFEO) enable a developer to attach a debugger to an application. When a process is created, a debugger present in an application’s IFEO will be prepended to the application’s name, effectively launching the new process under the debugger (e.g., “C:\\dbg\\ntsd.exe -g notepad.exe”). (Citation: Microsoft Dev Blog IFEO Mar 2010)" ; + rdfs:comment "This technique has been revoked by T1546.012" ; + rdfs:seeAlso "T1546.012" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1184 a owl:Class ; + rdfs:label "SSH Hijacking" ; + d3f:attack-id "T1184" ; + d3f:definition "Secure Shell (SSH) is a standard means of remote access on Linux and macOS systems. It allows a user to connect to another system via an encrypted tunnel, commonly authenticating through a password, certificate or the use of an asymmetric encryption key pair." ; + rdfs:comment "This technique has been revoked by T1563.001" ; + rdfs:seeAlso "T1563.001" ; + rdfs:subClassOf d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1185 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Browser Session Hijacking" ; + d3f:attack-id "T1185" ; + d3f:definition "Adversaries may take advantage of security vulnerabilities and inherent functionality in browser software to change content, modify user-behaviors, and intercept information as part of various browser session hijacking techniques.(Citation: Wikipedia Man in the Browser)" ; + d3f:produces d3f:WebNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:WebNetworkTraffic ], + d3f:CollectionTechnique . + +d3f:T1186 a owl:Class ; + rdfs:label "Process Doppelgänging" ; + d3f:attack-id "T1186" ; + d3f:definition "Windows Transactional NTFS (TxF) was introduced in Vista as a method to perform safe file operations. (Citation: Microsoft TxF) To ensure data integrity, TxF enables only one transacted handle to write to a file at a given time. Until the write handle transaction is terminated, all other handles are isolated from the writer and may only read the committed version of the file that existed at the time the handle was opened. (Citation: Microsoft Basic TxF Concepts) To avoid corruption, TxF performs an automatic rollback if the system or application fails during a write transaction. (Citation: Microsoft Where to use TxF)" ; + rdfs:comment "This technique has been revoked by T1055.013" ; + rdfs:seeAlso "T1055.013" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1187 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Forced Authentication" ; + d3f:attack-id "T1187" ; + d3f:definition "Adversaries may gather credential material by invoking or forcing a user to automatically provide authentication information through a mechanism in which they can intercept." ; + d3f:may-modify d3f:WindowsShortcutFile ; + d3f:modifies d3f:AuthenticationLog ; + d3f:produces d3f:Authentication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Authentication ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:WindowsShortcutFile ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:AuthenticationLog ], + d3f:CredentialAccessTechnique . + +d3f:T1188 a owl:Class ; + rdfs:label "Multi-hop Proxy" ; + d3f:attack-id "T1188" ; + d3f:definition "To disguise the source of malicious traffic, adversaries may chain together multiple proxies. Typically, a defender will be able to identify the last proxy traffic traversed before it enters their network; the defender may or may not be able to identify any previous proxies before the last-hop proxy. This technique makes identifying the original source of the malicious traffic even more difficult by requiring the defender to trace malicious traffic through several proxies to identify its source." ; + rdfs:comment "This technique has been revoked by T1090.003" ; + rdfs:seeAlso "T1090.003" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1189 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Drive-by Compromise" ; + d3f:attack-id "T1189" ; + d3f:definition "Adversaries may gain access to a system through a user visiting a website over the normal course of browsing. With this technique, the user's web browser is typically targeted for exploitation, but adversaries may also use compromised websites for non-exploitation behavior such as acquiring [Application Access Token](https://attack.mitre.org/techniques/T1550/001)." ; + d3f:modifies d3f:ProcessSegment ; + d3f:produces d3f:OutboundInternetNetworkTraffic, + d3f:URL ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:URL ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ProcessSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:InitialAccessTechnique . + +d3f:T1190 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exploit Public-Facing Application" ; + d3f:attack-id "T1190" ; + d3f:definition "Adversaries may attempt to exploit a weakness in an Internet-facing host or system to initially access a network. The weakness in the system can be a software bug, a temporary glitch, or a misconfiguration." ; + d3f:injects d3f:DatabaseQuery ; + d3f:modifies d3f:ProcessSegment ; + d3f:produces d3f:InboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InboundInternetNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:injects ; + owl:someValuesFrom d3f:DatabaseQuery ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ProcessSegment ], + d3f:InitialAccessTechnique . + +d3f:T1191 a owl:Class ; + rdfs:label "CMSTP" ; + d3f:attack-id "T1191" ; + d3f:definition "The Microsoft Connection Manager Profile Installer (CMSTP.exe) is a command-line program used to install Connection Manager service profiles. (Citation: Microsoft Connection Manager Oct 2009) CMSTP.exe accepts an installation information file (INF) as a parameter and installs a service profile leveraged for remote access connections." ; + rdfs:comment "This technique has been revoked by T1218.003" ; + rdfs:seeAlso "T1218.003" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1192 a owl:Class ; + rdfs:label "Spearphishing Link" ; + d3f:attack-id "T1192" ; + d3f:definition "Spearphishing with a link is a specific variant of spearphishing. It is different from other forms of spearphishing in that it employs the use of links to download malware contained in email, instead of attaching malicious files to the email itself, to avoid defenses that may inspect email attachments." ; + rdfs:comment "This technique has been revoked by T1566.002" ; + rdfs:seeAlso "T1566.002" ; + rdfs:subClassOf d3f:InitialAccessTechnique ; + owl:deprecated true . + +d3f:T1193 a owl:Class ; + rdfs:label "Spearphishing Attachment" ; + d3f:attack-id "T1193" ; + d3f:definition "Spearphishing attachment is a specific variant of spearphishing. Spearphishing attachment is different from other forms of spearphishing in that it employs the use of malware attached to an email. All forms of spearphishing are electronically delivered social engineering targeted at a specific individual, company, or industry. In this scenario, adversaries attach a file to the spearphishing email and usually rely upon [User Execution](https://attack.mitre.org/techniques/T1204) to gain execution." ; + rdfs:comment "This technique has been revoked by T1566.001" ; + rdfs:seeAlso "T1566.001" ; + rdfs:subClassOf d3f:InitialAccessTechnique ; + owl:deprecated true . + +d3f:T1194 a owl:Class ; + rdfs:label "Spearphishing via Service" ; + d3f:attack-id "T1194" ; + d3f:definition "Spearphishing via service is a specific variant of spearphishing. It is different from other forms of spearphishing in that it employs the use of third party services rather than directly via enterprise email channels." ; + rdfs:comment "This technique has been revoked by T1566.003" ; + rdfs:seeAlso "T1566.003" ; + rdfs:subClassOf d3f:InitialAccessTechnique ; + owl:deprecated true . + +d3f:T1195.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Compromise Software Dependencies and Development Tools" ; + d3f:attack-id "T1195.001" ; + d3f:definition "Adversaries may manipulate software dependencies and development tools prior to receipt by a final consumer for the purpose of data or system compromise. Applications often depend on external software to function properly. Popular open source projects that are used as dependencies in many applications may be targeted as a means to add malicious code to users of the dependency.(Citation: Trendmicro NPM Compromise)" ; + d3f:modifies d3f:Software ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:Software ], + d3f:T1195 . + +d3f:T1195.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Compromise Software Supply Chain" ; + d3f:attack-id "T1195.002" ; + d3f:definition "Adversaries may manipulate application software prior to receipt by a final consumer for the purpose of data or system compromise. Supply chain compromise of software can take place in a number of ways, including manipulation of the application source code, manipulation of the update/distribution mechanism for that software, or replacing compiled releases with a modified version." ; + d3f:modifies d3f:Software ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:Software ], + d3f:T1195 . + +d3f:T1195.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Compromise Hardware Supply Chain" ; + d3f:attack-id "T1195.003" ; + d3f:definition "Adversaries may manipulate hardware components in products prior to receipt by a final consumer for the purpose of data or system compromise. By modifying hardware or firmware in the supply chain, adversaries can insert a backdoor into consumer networks that may be difficult to detect and give the adversary a high degree of control over the system. Hardware backdoors may be inserted into various devices, such as servers, workstations, network infrastructure, or peripherals." ; + d3f:modifies d3f:HardwareDevice ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:HardwareDevice ], + d3f:T1195 . + +d3f:T1196 a owl:Class ; + rdfs:label "Control Panel Items" ; + d3f:attack-id "T1196" ; + d3f:definition "Windows Control Panel items are utilities that allow users to view and adjust computer settings. Control Panel items are registered executable (.exe) or Control Panel (.cpl) files, the latter are actually renamed dynamic-link library (.dll) files that export a CPlApplet function. (Citation: Microsoft Implementing CPL) (Citation: TrendMicro CPL Malware Jan 2014) Control Panel items can be executed directly from the command line, programmatically via an application programming interface (API) call, or by simply double-clicking the file. (Citation: Microsoft Implementing CPL) (Citation: TrendMicro CPL Malware Jan 2014) (Citation: TrendMicro CPL Malware Dec 2013)" ; + rdfs:comment "This technique has been revoked by T1218.002" ; + rdfs:seeAlso "T1218.002" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1197 a owl:Class, + owl:NamedIndividual ; + rdfs:label "BITS Jobs" ; + d3f:attack-id "T1197" ; + d3f:definition "Adversaries may abuse BITS jobs to persistently execute code and perform various background tasks. Windows Background Intelligent Transfer Service (BITS) is a low-bandwidth, asynchronous file transfer mechanism exposed through [Component Object Model](https://attack.mitre.org/techniques/T1559/001) (COM).(Citation: Microsoft COM)(Citation: Microsoft BITS) BITS is commonly used by updaters, messengers, and other applications preferred to operate in the background (using available idle bandwidth) without interrupting other networked applications. File transfer tasks are implemented as BITS jobs, which contain a queue of one or more file operations." ; + d3f:may-produce d3f:IntranetIPCNetworkTraffic, + d3f:IntranetWebNetworkTraffic, + d3f:OutboundInternetWebTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-produce ; + owl:someValuesFrom d3f:IntranetWebNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:may-produce ; + owl:someValuesFrom d3f:IntranetIPCNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:may-produce ; + owl:someValuesFrom d3f:OutboundInternetWebTraffic ], + d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique . + +d3f:T1198 a owl:Class ; + rdfs:label "SIP and Trust Provider Hijacking" ; + d3f:attack-id "T1198" ; + d3f:definition "In user mode, Windows Authenticode (Citation: Microsoft Authenticode) digital signatures are used to verify a file's origin and integrity, variables that may be used to establish trust in signed code (ex: a driver with a valid Microsoft signature may be handled as safe). The signature validation process is handled via the WinVerifyTrust application programming interface (API) function, (Citation: Microsoft WinVerifyTrust) which accepts an inquiry and coordinates with the appropriate trust provider, which is responsible for validating parameters of a signature. (Citation: SpectorOps Subverting Trust Sept 2017)" ; + rdfs:comment "This technique has been revoked by T1553.003" ; + rdfs:seeAlso "T1553.003" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1199 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Trusted Relationship" ; + d3f:attack-id "T1199" ; + d3f:creates d3f:LoginSession ; + d3f:definition "Adversaries may breach or otherwise leverage organizations who have access to intended victims. Access through trusted third party relationship abuses an existing connection that may not be protected or receives less scrutiny than standard mechanisms of gaining access to a network." ; + d3f:produces d3f:IntranetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:LoginSession ], + d3f:InitialAccessTechnique . + +d3f:T1200 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hardware Additions" ; + d3f:attack-id "T1200" ; + d3f:connects d3f:HardwareDevice ; + d3f:definition "Adversaries may introduce computer accessories, networking hardware, or other computing devices into a system or network that can be used as a vector to gain access. Rather than just connecting and distributing payloads via removable storage (i.e. [Replication Through Removable Media](https://attack.mitre.org/techniques/T1091)), more robust hardware additions can be used to introduce new functionalities and/or features into a system that can then be abused." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:connects ; + owl:someValuesFrom d3f:HardwareDevice ], + d3f:InitialAccessTechnique . + +d3f:T1201 a owl:Class ; + rdfs:label "Password Policy Discovery" ; + d3f:attack-id "T1201" ; + d3f:definition "Adversaries may attempt to access detailed information about the password policy used within an enterprise network or cloud environment. Password policies are a way to enforce complex passwords that are difficult to guess or crack through [Brute Force](https://attack.mitre.org/techniques/T1110). This information may help the adversary to create a list of common passwords and launch dictionary and/or brute force attacks which adheres to the policy (e.g. if the minimum password length should be 8, then not trying passwords such as 'pass123'; not checking for more than 3-4 passwords per account if the lockout is set to 6 as to not lock out accounts)." ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1202 a owl:Class ; + rdfs:label "Indirect Command Execution" ; + d3f:attack-id "T1202" ; + d3f:definition "Adversaries may abuse utilities that allow for command execution to bypass security restrictions that limit the use of command-line interpreters. Various Windows utilities may be used to execute commands, possibly without invoking [cmd](https://attack.mitre.org/software/S0106). For example, [Forfiles](https://attack.mitre.org/software/S0193), the Program Compatibility Assistant (pcalua.exe), components of the Windows Subsystem for Linux (WSL), as well as other utilities may invoke the execution of programs and commands from a [Command and Scripting Interpreter](https://attack.mitre.org/techniques/T1059), Run window, or via scripts. (Citation: VectorSec ForFiles Aug 2017) (Citation: Evi1cg Forfiles Nov 2017)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1203 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exploitation for Client Execution" ; + d3f:attack-id "T1203" ; + d3f:definition "Adversaries may exploit software vulnerabilities in client applications to execute code. Vulnerabilities can exist in software due to unsecure coding practices that can lead to unanticipated behavior. Adversaries can take advantage of certain vulnerabilities through targeted exploitation for the purpose of arbitrary code execution. Oftentimes the most valuable exploits to an offensive toolkit are those that can be used to obtain code execution on a remote system because they can be used to gain access to that system. Users will expect to see files related to the applications they commonly used to do work, so they are a useful target for exploit research and development because of their high utility." ; + d3f:modifies d3f:ProcessCodeSegment, + d3f:StackFrame ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ProcessCodeSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:StackFrame ], + d3f:ExecutionTechnique . + +d3f:T1204.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Malicious Link" ; + d3f:accesses d3f:URL ; + d3f:attack-id "T1204.001" ; + d3f:definition "An adversary may rely upon a user clicking a malicious link in order to gain execution. Users may be subjected to social engineering to get them to click on a link that will lead to code execution. This user action will typically be observed as follow-on behavior from [Spearphishing Link](https://attack.mitre.org/techniques/T1566/002). Clicking on a link may also lead to other execution techniques such as exploitation of a browser or application vulnerability via [Exploitation for Client Execution](https://attack.mitre.org/techniques/T1203). Links may also lead users to download files that require execution via [Malicious File](https://attack.mitre.org/techniques/T1204/002)." ; + d3f:produces d3f:OutboundInternetWebTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetWebTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:URL ], + d3f:T1204 . + +d3f:T1204.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Malicious File" ; + d3f:attack-id "T1204.002" ; + d3f:definition "An adversary may rely upon a user opening a malicious file in order to gain execution. Users may be subjected to social engineering to get them to open a file that will lead to code execution. This user action will typically be observed as follow-on behavior from [Spearphishing Attachment](https://attack.mitre.org/techniques/T1566/001). Adversaries may use several types of files that require a user to execute them, including .doc, .pdf, .xls, .rtf, .scr, .exe, .lnk, .pif, and .cpl." ; + d3f:executes d3f:ExecutableFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:T1204 . + +d3f:T1204.003 a owl:Class ; + rdfs:label "Malicious Image" ; + d3f:attack-id "T1204.003" ; + d3f:definition "Adversaries may rely on a user running a malicious image to facilitate execution. Amazon Web Services (AWS) Amazon Machine Images (AMIs), Google Cloud Platform (GCP) Images, and Azure Images as well as popular container runtimes such as Docker can be backdoored. Backdoored images may be uploaded to a public repository via [Upload Malware](https://attack.mitre.org/techniques/T1608/001), and users may then download and deploy an instance or container from the image without realizing the image is malicious, thus bypassing techniques that specifically achieve Initial Access. This can lead to the execution of malicious code, such as code that executes cryptocurrency mining, in the instance or container.(Citation: Summit Route Malicious AMIs)" ; + rdfs:subClassOf d3f:T1204 . + +d3f:T1205.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Port Knocking" ; + d3f:attack-id "T1205.001" ; + d3f:definition "Adversaries may use port knocking to hide open ports used for persistence or command and control. To enable a port, an adversary sends a series of attempted connections to a predefined sequence of closed ports. After the sequence is completed, opening a port is often accomplished by the host based firewall, but could also be implemented by custom software." ; + d3f:produces d3f:NetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:T1205 . + +d3f:T1205.002 a owl:Class ; + rdfs:label "Socket Filters" ; + d3f:attack-id "T1205.002" ; + d3f:definition "Adversaries may attach filters to a network socket to monitor then activate backdoors used for persistence or command and control. With elevated permissions, adversaries can use features such as the `libpcap` library to open sockets and install filters to allow or disallow certain types of data to come through the socket. The filter may apply to all traffic passing through the specified network interface (or every interface if not specified). When the network interface receives a packet matching the filter criteria, additional actions can be triggered on the host, such as activation of a reverse shell." ; + rdfs:subClassOf d3f:T1205 . + +d3f:T1206 a owl:Class ; + rdfs:label "Sudo Caching" ; + d3f:attack-id "T1206" ; + d3f:definition "The sudo command \"allows a system administrator to delegate authority to give certain users (or groups of users) the ability to run some (or all) commands as root or another user while providing an audit trail of the commands and their arguments.\" (Citation: sudo man page 2018) Since sudo was made for the system administrator, it has some useful configuration features such as a timestamp_timeout that is the amount of time in minutes between instances of sudo before it will re-prompt for a password. This is because sudo has the ability to cache credentials for a period of time. Sudo creates (or touches) a file at /var/db/sudo with a timestamp of when sudo was last run to determine this timeout. Additionally, there is a tty_tickets variable that treats each new tty (terminal session) in isolation. This means that, for example, the sudo timeout of one tty will not affect another tty (you will have to type the password again)." ; + rdfs:comment "This technique has been revoked by T1548.003" ; + rdfs:seeAlso "T1548.003" ; + rdfs:subClassOf d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1207 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Rogue Domain Controller" ; + d3f:attack-id "T1207" ; + d3f:definition "Adversaries may register a rogue Domain Controller to enable manipulation of Active Directory data. DCShadow may be used to create a rogue Domain Controller (DC). DCShadow is a method of manipulating Active Directory (AD) data, including objects and schemas, by registering (or reusing an inactive registration) and simulating the behavior of a DC. (Citation: DCShadow Blog) Once registered, a rogue DC may be able to inject and replicate changes into AD infrastructure for any domain object, including credentials and keys." ; + d3f:modifies d3f:SystemConfigurationDatabase ; + d3f:produces d3f:IntranetAdministrativeNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetAdministrativeNetworkTraffic ], + d3f:DefenseEvasionTechnique . + +d3f:T1208 a owl:Class ; + rdfs:label "Kerberoasting" ; + d3f:attack-id "T1208" ; + d3f:definition "Service principal names (SPNs) are used to uniquely identify each instance of a Windows service. To enable authentication, Kerberos requires that SPNs be associated with at least one service logon account (an account specifically tasked with running a service (Citation: Microsoft Detecting Kerberoasting Feb 2018)). (Citation: Microsoft SPN) (Citation: Microsoft SetSPN) (Citation: SANS Attacking Kerberos Nov 2014) (Citation: Harmj0y Kerberoast Nov 2016)" ; + rdfs:comment "This technique has been revoked by T1558.003" ; + rdfs:seeAlso "T1558.003" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1209 a owl:Class ; + rdfs:label "Time Providers" ; + d3f:attack-id "T1209" ; + d3f:definition "The Windows Time service (W32Time) enables time synchronization across and within domains. (Citation: Microsoft W32Time Feb 2018) W32Time time providers are responsible for retrieving time stamps from hardware/network resources and outputting these values to other network clients. (Citation: Microsoft TimeProvider)" ; + rdfs:comment "This technique has been revoked by T1547.003" ; + rdfs:seeAlso "T1547.003" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1210 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exploitation of Remote Services" ; + d3f:attack-id "T1210" ; + d3f:definition "Adversaries may exploit remote services to gain unauthorized access to internal systems once inside of a network. Exploitation of a software vulnerability occurs when an adversary takes advantage of a programming error in a program, service, or within the operating system software or kernel itself to execute adversary-controlled code. A common goal for post-compromise exploitation of remote services is for lateral movement to enable access to a remote system." ; + d3f:may-modify d3f:ProcessCodeSegment, + d3f:ProcessSegment, + d3f:StackFrame ; + d3f:produces d3f:IntranetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ProcessSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:StackFrame ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ProcessCodeSegment ], + d3f:LateralMovementTechnique . + +d3f:T1211 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exploitation for Defense Evasion" ; + d3f:attack-id "T1211" ; + d3f:definition "Adversaries may exploit a system or application vulnerability to bypass security features. Exploitation of a vulnerability occurs when an adversary takes advantage of a programming error in a program, service, or within the operating system software or kernel itself to execute adversary-controlled code. Vulnerabilities may exist in defensive security software that can be used to disable or circumvent them." ; + d3f:may-modify d3f:ProcessCodeSegment, + d3f:StackFrame ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:StackFrame ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ProcessCodeSegment ], + d3f:DefenseEvasionTechnique . + +d3f:T1212 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exploitation for Credential Access" ; + d3f:attack-id "T1212" ; + d3f:definition "Adversaries may exploit software vulnerabilities in an attempt to collect credentials. Exploitation of a software vulnerability occurs when an adversary takes advantage of a programming error in a program, service, or within the operating system software or kernel itself to execute adversary-controlled code. " ; + d3f:may-access d3f:AuthenticationService, + d3f:CredentialManagementSystem ; + d3f:may-modify d3f:ProcessCodeSegment, + d3f:StackFrame ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:StackFrame ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ProcessCodeSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:AuthenticationService ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:CredentialManagementSystem ], + d3f:CredentialAccessTechnique . + +d3f:T1213.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Confluence" ; + d3f:accesses d3f:WebFileResource ; + d3f:attack-id "T1213.001" ; + d3f:definition "" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:WebFileResource ], + d3f:T1213 . + +d3f:T1213.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Sharepoint" ; + d3f:accesses d3f:WebFileResource ; + d3f:attack-id "T1213.002" ; + d3f:definition "Adversaries may leverage the SharePoint repository as a source to mine valuable information. SharePoint will often contain useful information for an adversary to learn about the structure and functionality of the internal network and systems. For example, the following is a list of example information that may hold potential value to an adversary and may also be found on SharePoint:" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:WebFileResource ], + d3f:T1213 . + +d3f:T1213.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Code Repositories" ; + d3f:attack-id "T1213.003" ; + d3f:definition "Adversaries may leverage code repositories to collect valuable information. Code repositories are tools/services that store source code and automate software builds. They may be hosted internally or privately on third party sites such as Github, GitLab, SourceForge, and BitBucket. Users typically interact with code repositories through a web application or command-line utilities such as git." ; + d3f:reads d3f:CodeRepository ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:CodeRepository ], + d3f:T1213 . + +d3f:T1213.004 a owl:Class ; + rdfs:label "Customer Relationship Management Software" ; + d3f:attack-id "T1213.004" ; + d3f:definition "Adversaries may leverage Customer Relationship Management (CRM) software to mine valuable information. CRM software is used to assist organizations in tracking and managing customer interactions, as well as storing customer data." ; + rdfs:subClassOf d3f:T1213 . + +d3f:T1213.005 a owl:Class ; + rdfs:label "Messaging Applications" ; + d3f:attack-id "T1213.005" ; + d3f:definition "Adversaries may leverage chat and messaging applications, such as Microsoft Teams, Google Chat, and Slack, to mine valuable information." ; + rdfs:subClassOf d3f:T1213 . + +d3f:T1214 a owl:Class ; + rdfs:label "Credentials in Registry" ; + d3f:attack-id "T1214" ; + d3f:definition "The Windows Registry stores configuration information that can be used by the system or other programs. Adversaries may query the Registry looking for credentials and passwords that have been stored for use by other programs or services. Sometimes these credentials are used for automatic logons." ; + rdfs:comment "This technique has been revoked by T1552.002" ; + rdfs:seeAlso "T1552.002" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1215 a owl:Class ; + rdfs:label "Kernel Modules and Extensions" ; + d3f:attack-id "T1215" ; + d3f:definition "Loadable Kernel Modules (or LKMs) are pieces of code that can be loaded and unloaded into the kernel upon demand. They extend the functionality of the kernel without the need to reboot the system. For example, one type of module is the device driver, which allows the kernel to access hardware connected to the system. (Citation: Linux Kernel Programming) When used maliciously, Loadable Kernel Modules (LKMs) can be a type of kernel-mode [Rootkit](https://attack.mitre.org/techniques/T1014) that run with the highest operating system privilege (Ring 0). (Citation: Linux Kernel Module Programming Guide) Adversaries can use loadable kernel modules to covertly persist on a system and evade defenses. Examples have been found in the wild and there are some open source projects. (Citation: Volatility Phalanx2) (Citation: CrowdStrike Linux Rootkit) (Citation: GitHub Reptile) (Citation: GitHub Diamorphine)" ; + rdfs:comment "This technique has been revoked by T1547.006" ; + rdfs:seeAlso "T1547.006" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1216.001 a owl:Class ; + rdfs:label "PubPrn" ; + d3f:attack-id "T1216.001" ; + d3f:definition "Adversaries may use PubPrn to proxy execution of malicious remote files. PubPrn.vbs is a [Visual Basic](https://attack.mitre.org/techniques/T1059/005) script that publishes a printer to Active Directory Domain Services. The script may be signed by Microsoft and is commonly executed through the [Windows Command Shell](https://attack.mitre.org/techniques/T1059/003) via Cscript.exe. For example, the following code publishes a printer within the specified domain: cscript pubprn Printer1 LDAP://CN=Container1,DC=Domain1,DC=Com.(Citation: pubprn)" ; + rdfs:subClassOf d3f:T1216 . + +d3f:T1216.002 a owl:Class ; + rdfs:label "SyncAppvPublishingServer" ; + d3f:attack-id "T1216.002" ; + d3f:definition "Adversaries may abuse SyncAppvPublishingServer.vbs to proxy execution of malicious [PowerShell](https://attack.mitre.org/techniques/T1059/001) commands. SyncAppvPublishingServer.vbs is a Visual Basic script associated with how Windows virtualizes applications (Microsoft Application Virtualization, or App-V).(Citation: 1 - appv) For example, Windows may render Win32 applications to users as virtual applications, allowing users to launch and interact with them as if they were installed locally.(Citation: 2 - appv)(Citation: 3 - appv)" ; + rdfs:subClassOf d3f:T1216 . + +d3f:T1217 a owl:Class ; + rdfs:label "Browser Information Discovery" ; + d3f:attack-id "T1217" ; + d3f:definition "Adversaries may enumerate information about browsers to learn more about compromised environments. Data saved by browsers (such as bookmarks, accounts, and browsing history) may reveal a variety of personal information about users (e.g., banking sites, relationships/interests, social media, etc.) as well as details about internal network resources such as servers, tools/dashboards, or other related infrastructure.(Citation: Kaspersky Autofill)" ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1218.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Compiled HTML File" ; + d3f:attack-id "T1218.001" ; + d3f:definition "Adversaries may abuse Compiled HTML files (.chm) to conceal malicious code. CHM files are commonly distributed as part of the Microsoft HTML Help system. CHM files are compressed compilations of various content such as HTML documents, images, and scripting/web related programming languages such VBA, JScript, Java, and ActiveX. (Citation: Microsoft HTML Help May 2018) CHM content is displayed using underlying components of the Internet Explorer browser (Citation: Microsoft HTML Help ActiveX) loaded by the HTML Help executable program (hh.exe). (Citation: Microsoft HTML Help Executable Program)" ; + d3f:invokes d3f:CreateFile, + d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateFile ], + d3f:T1218 . + +d3f:T1218.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Control Panel" ; + d3f:attack-id "T1218.002" ; + d3f:definition "Adversaries may abuse control.exe to proxy execution of malicious payloads. The Windows Control Panel process binary (control.exe) handles execution of Control Panel items, which are utilities that allow users to view and adjust computer settings." ; + d3f:invokes d3f:CreateProcess ; + d3f:may-modify d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:T1218 . + +d3f:T1218.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "CMSTP" ; + d3f:attack-id "T1218.003" ; + d3f:definition "Adversaries may abuse CMSTP to proxy execution of malicious code. The Microsoft Connection Manager Profile Installer (CMSTP.exe) is a command-line program used to install Connection Manager service profiles. (Citation: Microsoft Connection Manager Oct 2009) CMSTP.exe accepts an installation information file (INF) as a parameter and installs a service profile leveraged for remote access connections." ; + d3f:invokes d3f:CreateProcess ; + d3f:may-produce d3f:NetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-produce ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:T1218 . + +d3f:T1218.004 a owl:Class ; + rdfs:label "InstallUtil" ; + d3f:attack-id "T1218.004" ; + d3f:definition "Adversaries may use InstallUtil to proxy execution of code through a trusted Windows utility. InstallUtil is a command-line utility that allows for installation and uninstallation of resources by executing specific installer components specified in .NET binaries. (Citation: MSDN InstallUtil) The InstallUtil binary may also be digitally signed by Microsoft and located in the .NET directories on a Windows system: C:\\Windows\\Microsoft.NET\\Framework\\v\\InstallUtil.exe and C:\\Windows\\Microsoft.NET\\Framework64\\v\\InstallUtil.exe." ; + rdfs:subClassOf d3f:T1218 . + +d3f:T1218.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Mshta" ; + d3f:attack-id "T1218.005" ; + d3f:definition "Adversaries may abuse mshta.exe to proxy execution of malicious .hta files and Javascript or VBScript through a trusted Windows utility. There are several examples of different types of threats leveraging mshta.exe during initial compromise and for execution of code (Citation: Cylance Dust Storm) (Citation: Red Canary HTA Abuse Part Deux) (Citation: FireEye Attacks Leveraging HTA) (Citation: Airbus Security Kovter Analysis) (Citation: FireEye FIN7 April 2017)" ; + d3f:interprets d3f:MicrosoftHTMLApplication ; + d3f:invokes d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:interprets ; + owl:someValuesFrom d3f:MicrosoftHTMLApplication ], + d3f:T1218 . + +d3f:T1218.007 a owl:Class ; + rdfs:label "Msiexec" ; + d3f:attack-id "T1218.007" ; + d3f:definition "Adversaries may abuse msiexec.exe to proxy execution of malicious payloads. Msiexec.exe is the command-line utility for the Windows Installer and is thus commonly associated with executing installation packages (.msi).(Citation: Microsoft msiexec) The Msiexec.exe binary may also be digitally signed by Microsoft." ; + rdfs:subClassOf d3f:T1218 . + +d3f:T1218.008 a owl:Class ; + rdfs:label "Odbcconf" ; + d3f:attack-id "T1218.008" ; + d3f:definition "Adversaries may abuse odbcconf.exe to proxy execution of malicious payloads. Odbcconf.exe is a Windows utility that allows you to configure Open Database Connectivity (ODBC) drivers and data source names.(Citation: Microsoft odbcconf.exe) The Odbcconf.exe binary may be digitally signed by Microsoft." ; + rdfs:subClassOf d3f:T1218 . + +d3f:T1218.009 a owl:Class ; + rdfs:label "Regsvcs/Regasm" ; + d3f:attack-id "T1218.009" ; + d3f:definition "Adversaries may abuse Regsvcs and Regasm to proxy execution of code through a trusted Windows utility. Regsvcs and Regasm are Windows command-line utilities that are used to register .NET [Component Object Model](https://attack.mitre.org/techniques/T1559/001) (COM) assemblies. Both are binaries that may be digitally signed by Microsoft. (Citation: MSDN Regsvcs) (Citation: MSDN Regasm)" ; + rdfs:subClassOf d3f:T1218 . + +d3f:T1218.010 a owl:Class ; + rdfs:label "Regsvr32" ; + d3f:attack-id "T1218.010" ; + d3f:definition "Adversaries may abuse Regsvr32.exe to proxy execution of malicious code. Regsvr32.exe is a command-line program used to register and unregister object linking and embedding controls, including dynamic link libraries (DLLs), on Windows systems. The Regsvr32.exe binary may also be signed by Microsoft. (Citation: Microsoft Regsvr32)" ; + rdfs:subClassOf d3f:T1218 . + +d3f:T1218.011 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Rundll32" ; + d3f:attack-id "T1218.011" ; + d3f:definition "Adversaries may abuse rundll32.exe to proxy execution of malicious code. Using rundll32.exe, vice executing directly (i.e. [Shared Modules](https://attack.mitre.org/techniques/T1129)), may avoid triggering security tools that may not monitor execution of the rundll32.exe process because of allowlists or false positives from normal operations. Rundll32.exe is commonly associated with executing DLL payloads (ex: rundll32.exe {DLLname, DLLfunction})." ; + d3f:invokes d3f:CreateProcess ; + d3f:loads d3f:SharedLibraryFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:loads ; + owl:someValuesFrom d3f:SharedLibraryFile ], + d3f:T1218 . + +d3f:T1218.012 a owl:Class ; + rdfs:label "Verclsid" ; + d3f:attack-id "T1218.012" ; + d3f:definition "Adversaries may abuse verclsid.exe to proxy execution of malicious code. Verclsid.exe is known as the Extension CLSID Verification Host and is responsible for verifying each shell extension before they are used by Windows Explorer or the Windows Shell.(Citation: WinOSBite verclsid.exe)" ; + rdfs:subClassOf d3f:T1218 . + +d3f:T1218.013 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Mavinject" ; + d3f:attack-id "T1218.013" ; + d3f:definition "Adversaries may abuse mavinject.exe to proxy execution of malicious code. Mavinject.exe is the Microsoft Application Virtualization Injector, a Windows utility that can inject code into external processes as part of Microsoft Application Virtualization (App-V).(Citation: LOLBAS Mavinject)" ; + d3f:invokes d3f:CreateThread ; + d3f:modifies d3f:ProcessSegment ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ProcessSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateThread ], + d3f:T1218 . + +d3f:T1218.014 a owl:Class, + owl:NamedIndividual ; + rdfs:label "MMC" ; + d3f:attack-id "T1218.014" ; + d3f:definition "Adversaries may abuse mmc.exe to proxy execution of malicious .msc files. Microsoft Management Console (MMC) is a binary that may be signed by Microsoft and is used in several ways in either its GUI or in a command prompt.(Citation: win_mmc)(Citation: what_is_mmc) MMC can be used to create, open, and save custom consoles that contain administrative tools created by Microsoft, called snap-ins. These snap-ins may be used to manage Windows systems locally or remotely. MMC can also be used to open Microsoft created .msc files to manage system configuration.(Citation: win_msc_files_overview)" ; + d3f:executes d3f:Command ; + d3f:may-add d3f:Software ; + d3f:may-modify d3f:SystemConfigurationDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:Command ], + [ a owl:Restriction ; + owl:onProperty d3f:may-add ; + owl:someValuesFrom d3f:Software ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + d3f:T1218 . + +d3f:T1218.015 a owl:Class ; + rdfs:label "Electron Applications" ; + d3f:attack-id "T1218.015" ; + d3f:definition "Adversaries may abuse components of the Electron framework to execute malicious code. The Electron framework hosts many common applications such as Signal, Slack, and Microsoft Teams.(Citation: Electron 2) Originally developed by GitHub, Electron is a cross-platform desktop application development framework that employs web technologies like JavaScript, HTML, and CSS.(Citation: Electron 3) The Chromium engine is used to display web content and Node.js runs the backend code.(Citation: Electron 1)" ; + rdfs:subClassOf d3f:T1218 . + +d3f:T1219 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote Access Software" ; + d3f:attack-id "T1219" ; + d3f:definition "An adversary may use legitimate desktop support and remote access software to establish an interactive command and control channel to target systems within networks. These services, such as `VNC`, `Team Viewer`, `AnyDesk`, `ScreenConnect`, `LogMein`, `AmmyyAdmin`, and other remote monitoring and management (RMM) tools, are commonly used as legitimate technical support software and may be allowed by application control within a target environment.(Citation: Symantec Living off the Land)(Citation: CrowdStrike 2015 Global Threat Report)(Citation: CrySyS Blog TeamSpy)" ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1220 a owl:Class, + owl:NamedIndividual ; + rdfs:label "XSL Script Processing" ; + d3f:adds d3f:File ; + d3f:attack-id "T1220" ; + d3f:definition "Adversaries may bypass application control and obscure execution of code by embedding scripts inside XSL files. Extensible Stylesheet Language (XSL) files are commonly used to describe the processing and rendering of data within XML files. To support complex operations, the XSL standard includes support for embedded scripting in various languages. (Citation: Microsoft XSLT Script Mar 2017)" ; + d3f:interprets d3f:ExecutableScript ; + d3f:invokes d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:interprets ; + owl:someValuesFrom d3f:ExecutableScript ], + [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:DefenseEvasionTechnique . + +d3f:T1221 a owl:Class ; + rdfs:label "Template Injection" ; + d3f:attack-id "T1221" ; + d3f:definition "Adversaries may create or modify references in user document templates to conceal malicious code or force authentication attempts. For example, Microsoft’s Office Open XML (OOXML) specification defines an XML-based format for Office documents (.docx, xlsx, .pptx) to replace older binary formats (.doc, .xls, .ppt). OOXML files are packed together ZIP archives compromised of various XML files, referred to as parts, containing properties that collectively define how a document is rendered.(Citation: Microsoft Open XML July 2017)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1222.001 a owl:Class ; + rdfs:label "Windows File and Directory Permissions Modification" ; + d3f:attack-id "T1222.001" ; + d3f:definition "Adversaries may modify file or directory permissions/attributes to evade access control lists (ACLs) and access protected files.(Citation: Hybrid Analysis Icacls1 June 2018)(Citation: Hybrid Analysis Icacls2 May 2018) File and directory permissions are commonly managed by ACLs configured by the file or directory owner, or users with the appropriate permissions. File and directory ACL implementations vary by platform, but generally explicitly designate which users or groups can perform which actions (read, write, execute, etc.)." ; + rdfs:subClassOf d3f:T1222 . + +d3f:T1222.002 a owl:Class ; + rdfs:label "Linux and Mac File and Directory Permissions Modification" ; + d3f:attack-id "T1222.002" ; + d3f:definition "Adversaries may modify file or directory permissions/attributes to evade access control lists (ACLs) and access protected files.(Citation: Hybrid Analysis Icacls1 June 2018)(Citation: Hybrid Analysis Icacls2 May 2018) File and directory permissions are commonly managed by ACLs configured by the file or directory owner, or users with the appropriate permissions. File and directory ACL implementations vary by platform, but generally explicitly designate which users or groups can perform which actions (read, write, execute, etc.)." ; + rdfs:subClassOf d3f:T1222 . + +d3f:T1223 a owl:Class ; + rdfs:label "Compiled HTML File" ; + d3f:attack-id "T1223" ; + d3f:definition "Compiled HTML files (.chm) are commonly distributed as part of the Microsoft HTML Help system. CHM files are compressed compilations of various content such as HTML documents, images, and scripting/web related programming languages such VBA, JScript, Java, and ActiveX. (Citation: Microsoft HTML Help May 2018) CHM content is displayed using underlying components of the Internet Explorer browser (Citation: Microsoft HTML Help ActiveX) loaded by the HTML Help executable program (hh.exe). (Citation: Microsoft HTML Help Executable Program)" ; + rdfs:comment "This technique has been revoked by T1218.001" ; + rdfs:seeAlso "T1218.001" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique ; + owl:deprecated true . + +d3f:T1480.001 a owl:Class ; + rdfs:label "Environmental Keying" ; + d3f:attack-id "T1480.001" ; + d3f:definition "Adversaries may environmentally key payloads or other features of malware to evade defenses and constraint execution to a specific target environment. Environmental keying uses cryptography to constrain execution or actions based on adversary supplied environment specific conditions that are expected to be present on the target. Environmental keying is an implementation of [Execution Guardrails](https://attack.mitre.org/techniques/T1480) that utilizes cryptographic techniques for deriving encryption/decryption keys from specific types of values in a given computing environment.(Citation: EK Clueless Agents)" ; + rdfs:subClassOf d3f:T1480 . + +d3f:T1480.002 a owl:Class ; + rdfs:label "Mutual Exclusion" ; + d3f:attack-id "T1480.002" ; + d3f:definition "Adversaries may constrain execution or actions based on the presence of a mutex associated with malware. A mutex is a locking mechanism used to synchronize access to a resource. Only one thread or process can acquire a mutex at a given time.(Citation: Microsoft Mutexes)" ; + rdfs:subClassOf d3f:T1480 . + +d3f:T1482 a owl:Class ; + rdfs:label "Domain Trust Discovery" ; + d3f:attack-id "T1482" ; + d3f:definition "Adversaries may attempt to gather information on domain trust relationships that may be used to identify lateral movement opportunities in Windows multi-domain/forest environments. Domain trusts provide a mechanism for a domain to allow access to resources based on the authentication procedures of another domain.(Citation: Microsoft Trusts) Domain trusts allow the users of the trusted domain to access resources in the trusting domain. The information discovered may help the adversary conduct [SID-History Injection](https://attack.mitre.org/techniques/T1134/005), [Pass the Ticket](https://attack.mitre.org/techniques/T1550/003), and [Kerberoasting](https://attack.mitre.org/techniques/T1558/003).(Citation: AdSecurity Forging Trust Tickets)(Citation: Harmj0y Domain Trusts) Domain trusts can be enumerated using the `DSEnumerateDomainTrusts()` Win32 API call, .NET methods, and LDAP.(Citation: Harmj0y Domain Trusts) The Windows utility [Nltest](https://attack.mitre.org/software/S0359) is known to be used by adversaries to enumerate domain trusts.(Citation: Microsoft Operation Wilysupply)" ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1483 a owl:Class ; + rdfs:label "Domain Generation Algorithms" ; + d3f:attack-id "T1483" ; + d3f:definition "Adversaries may make use of Domain Generation Algorithms (DGAs) to dynamically identify a destination for command and control traffic rather than relying on a list of static IP addresses or domains. This has the advantage of making it much harder for defenders block, track, or take over the command and control channel, as there potentially could be thousands of domains that malware can check for instructions.(Citation: Cybereason Dissecting DGAs)(Citation: Cisco Umbrella DGA)(Citation: Unit 42 DGA Feb 2019)" ; + rdfs:comment "This technique has been revoked by T1568.002" ; + rdfs:seeAlso "T1568.002" ; + rdfs:subClassOf d3f:CommandAndControlTechnique ; + owl:deprecated true . + +d3f:T1484.001 a owl:Class ; + rdfs:label "Group Policy Modification" ; + d3f:attack-id "T1484.001" ; + d3f:definition "Adversaries may modify Group Policy Objects (GPOs) to subvert the intended discretionary access controls for a domain, usually with the intention of escalating privileges on the domain. Group policy allows for centralized management of user and computer settings in Active Directory (AD). GPOs are containers for group policy settings made up of files stored within a predictable network path `\\\\SYSVOL\\\\Policies\\`.(Citation: TechNet Group Policy Basics)(Citation: ADSecurity GPO Persistence 2016)" ; + rdfs:subClassOf d3f:T1484 . + +d3f:T1484.002 a owl:Class ; + rdfs:label "Trust Modification" ; + d3f:attack-id "T1484.002" ; + d3f:definition "Adversaries may add new domain trusts, modify the properties of existing domain trusts, or otherwise change the configuration of trust relationships between domains and tenants to evade defenses and/or elevate privileges.Trust details, such as whether or not user identities are federated, allow authentication and authorization properties to apply between domains or tenants for the purpose of accessing shared resources.(Citation: Microsoft - Azure AD Federation) These trust objects may include accounts, credentials, and other authentication material applied to servers, tokens, and domains." ; + rdfs:subClassOf d3f:T1484 . + +d3f:T1485.001 a owl:Class ; + rdfs:label "Lifecycle-Triggered Deletion" ; + d3f:attack-id "T1485.001" ; + d3f:definition "Adversaries may modify the lifecycle policies of a cloud storage bucket to destroy all objects stored within." ; + rdfs:subClassOf d3f:T1485 . + +d3f:T1486 a owl:Class ; + rdfs:label "Data Encrypted for Impact" ; + d3f:attack-id "T1486" ; + d3f:definition "Adversaries may encrypt data on target systems or on large numbers of systems in a network to interrupt availability to system and network resources. They can attempt to render stored data inaccessible by encrypting files or data on local and remote drives and withholding access to a decryption key. This may be done in order to extract monetary compensation from a victim in exchange for decryption or a decryption key (ransomware) or to render data permanently inaccessible in cases where the key is not saved or transmitted.(Citation: US-CERT Ransomware 2016)(Citation: FireEye WannaCry 2017)(Citation: US-CERT NotPetya 2017)(Citation: US-CERT SamSam 2018)" ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1487 a owl:Class ; + rdfs:label "Disk Structure Wipe" ; + d3f:attack-id "T1487" ; + d3f:definition "Adversaries may corrupt or wipe the disk data structures on hard drive necessary to boot systems; targeting specific critical systems as well as a large number of systems in a network to interrupt availability to system and network resources." ; + rdfs:comment "This technique has been revoked by T1561.002" ; + rdfs:seeAlso "T1561.002" ; + rdfs:subClassOf d3f:ImpactTechnique ; + owl:deprecated true . + +d3f:T1488 a owl:Class ; + rdfs:label "Disk Content Wipe" ; + d3f:attack-id "T1488" ; + d3f:definition "Adversaries may erase the contents of storage devices on specific systems as well as large numbers of systems in a network to interrupt availability to system and network resources." ; + rdfs:comment "This technique has been revoked by T1561.001" ; + rdfs:seeAlso "T1561.001" ; + rdfs:subClassOf d3f:ImpactTechnique ; + owl:deprecated true . + +d3f:T1489 a owl:Class ; + rdfs:label "Service Stop" ; + d3f:attack-id "T1489" ; + d3f:definition "Adversaries may stop or disable services on a system to render those services unavailable to legitimate users. Stopping critical services or processes can inhibit or stop response to an incident or aid in the adversary's overall objectives to cause damage to the environment.(Citation: Talos Olympic Destroyer 2018)(Citation: Novetta Blockbuster)" ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1490 a owl:Class ; + rdfs:label "Inhibit System Recovery" ; + d3f:attack-id "T1490" ; + d3f:definition "Adversaries may delete or remove built-in data and turn off services designed to aid in the recovery of a corrupted system to prevent recovery.(Citation: Talos Olympic Destroyer 2018)(Citation: FireEye WannaCry 2017) This may deny access to available backups and recovery options." ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1491.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Internal Defacement" ; + d3f:attack-id "T1491.001" ; + d3f:definition "An adversary may deface systems internal to an organization in an attempt to intimidate or mislead users, thus discrediting the integrity of the systems. This may take the form of modifications to internal websites, or directly to user systems with the replacement of the desktop wallpaper.(Citation: Novetta Blockbuster) Disturbing or offensive images may be used as a part of [Internal Defacement](https://attack.mitre.org/techniques/T1491/001) in order to cause user discomfort, or to pressure compliance with accompanying messages. Since internally defacing systems exposes an adversary's presence, it often takes place after other intrusion goals have been accomplished.(Citation: Novetta Blockbuster Destructive Malware)" ; + d3f:modifies d3f:Resource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:Resource ], + d3f:T1491 . + +d3f:T1491.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "External Defacement" ; + d3f:attack-id "T1491.002" ; + d3f:definition "An adversary may deface systems external to an organization in an attempt to deliver messaging, intimidate, or otherwise mislead an organization or users. [External Defacement](https://attack.mitre.org/techniques/T1491/002) may ultimately cause users to distrust the systems and to question/discredit the system’s integrity. Externally-facing websites are a common victim of defacement; often targeted by adversary and hacktivist groups in order to push a political message or spread propaganda.(Citation: FireEye Cyber Threats to Media Industries)(Citation: Kevin Mandia Statement to US Senate Committee on Intelligence)(Citation: Anonymous Hackers Deface Russian Govt Site) [External Defacement](https://attack.mitre.org/techniques/T1491/002) may be used as a catalyst to trigger events, or as a response to actions taken by an organization or government. Similarly, website defacement may also be used as setup, or a precursor, for future attacks such as [Drive-by Compromise](https://attack.mitre.org/techniques/T1189).(Citation: Trend Micro Deep Dive Into Defacement)" ; + d3f:modifies d3f:NetworkResource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:NetworkResource ], + d3f:T1491 . + +d3f:T1492 a owl:Class ; + rdfs:label "Stored Data Manipulation" ; + d3f:attack-id "T1492" ; + d3f:definition "Adversaries may insert, delete, or manipulate data at rest in order to manipulate external outcomes or hide activity.(Citation: FireEye APT38 Oct 2018)(Citation: DOJ Lazarus Sony 2018) By manipulating stored data, adversaries may attempt to affect a business process, organizational understanding, and decision making." ; + rdfs:comment "This technique has been revoked by T1565.001" ; + rdfs:seeAlso "T1565.001" ; + rdfs:subClassOf d3f:ImpactTechnique ; + owl:deprecated true . + +d3f:T1493 a owl:Class ; + rdfs:label "Transmitted Data Manipulation" ; + d3f:attack-id "T1493" ; + d3f:definition "Adversaries may alter data en route to storage or other systems in order to manipulate external outcomes or hide activity.(Citation: FireEye APT38 Oct 2018)(Citation: DOJ Lazarus Sony 2018) By manipulating transmitted data, adversaries may attempt to affect a business process, organizational understanding, and decision making." ; + rdfs:comment "This technique has been revoked by T1565.002" ; + rdfs:seeAlso "T1565.002" ; + rdfs:subClassOf d3f:ImpactTechnique ; + owl:deprecated true . + +d3f:T1494 a owl:Class ; + rdfs:label "Runtime Data Manipulation" ; + d3f:attack-id "T1494" ; + d3f:definition "Adversaries may modify systems in order to manipulate the data as it is accessed and displayed to an end user.(Citation: FireEye APT38 Oct 2018)(Citation: DOJ Lazarus Sony 2018) By manipulating runtime data, adversaries may attempt to affect a business process, organizational understanding, and decision making." ; + rdfs:comment "This technique has been revoked by T1565.003" ; + rdfs:seeAlso "T1565.003" ; + rdfs:subClassOf d3f:ImpactTechnique ; + owl:deprecated true . + +d3f:T1495 a owl:Class ; + rdfs:label "Firmware Corruption" ; + d3f:attack-id "T1495" ; + d3f:definition "Adversaries may overwrite or corrupt the flash memory contents of system BIOS or other firmware in devices attached to a system in order to render them inoperable or unable to boot, thus denying the availability to use the devices and/or the system.(Citation: Symantec Chernobyl W95.CIH) Firmware is software that is loaded and executed from non-volatile memory on hardware devices in order to initialize and manage device functionality. These devices may include the motherboard, hard drive, or video cards." ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1496.001 a owl:Class ; + rdfs:label "Compute Hijacking" ; + d3f:attack-id "T1496.001" ; + d3f:definition "Adversaries may leverage the compute resources of co-opted systems to complete resource-intensive tasks, which may impact system and/or hosted service availability." ; + rdfs:subClassOf d3f:T1496 . + +d3f:T1496.002 a owl:Class ; + rdfs:label "Bandwidth Hijacking" ; + d3f:attack-id "T1496.002" ; + d3f:definition "Adversaries may leverage the network bandwidth resources of co-opted systems to complete resource-intensive tasks, which may impact system and/or hosted service availability." ; + rdfs:subClassOf d3f:T1496 . + +d3f:T1496.003 a owl:Class ; + rdfs:label "SMS Pumping" ; + d3f:attack-id "T1496.003" ; + d3f:definition "Adversaries may leverage messaging services for SMS pumping, which may impact system and/or hosted service availability.(Citation: Twilio SMS Pumping) SMS pumping is a type of telecommunications fraud whereby a threat actor first obtains a set of phone numbers from a telecommunications provider, then leverages a victim’s messaging infrastructure to send large amounts of SMS messages to numbers in that set. By generating SMS traffic to their phone number set, a threat actor may earn payments from the telecommunications provider.(Citation: Twilio SMS Pumping Fraud)" ; + rdfs:subClassOf d3f:T1496 . + +d3f:T1496.004 a owl:Class ; + rdfs:label "Cloud Service Hijacking" ; + d3f:attack-id "T1496.004" ; + d3f:definition "Adversaries may leverage compromised software-as-a-service (SaaS) applications to complete resource-intensive tasks, which may impact hosted service availability." ; + rdfs:subClassOf d3f:T1496 . + +d3f:T1497.001 a owl:Class ; + rdfs:label "System Checks" ; + d3f:attack-id "T1497.001" ; + d3f:definition "Adversaries may employ various system checks to detect and avoid virtualization and analysis environments. This may include changing behaviors based on the results of checks for the presence of artifacts indicative of a virtual machine environment (VME) or sandbox. If the adversary detects a VME, they may alter their malware to disengage from the victim or conceal the core functions of the implant. They may also search for VME artifacts before dropping secondary or additional payloads. Adversaries may use the information learned from [Virtualization/Sandbox Evasion](https://attack.mitre.org/techniques/T1497) during automated discovery to shape follow-on behaviors.(Citation: Deloitte Environment Awareness)" ; + rdfs:subClassOf d3f:T1497 . + +d3f:T1497.002 a owl:Class ; + rdfs:label "User Activity Based Checks" ; + d3f:attack-id "T1497.002" ; + d3f:definition "Adversaries may employ various user activity checks to detect and avoid virtualization and analysis environments. This may include changing behaviors based on the results of checks for the presence of artifacts indicative of a virtual machine environment (VME) or sandbox. If the adversary detects a VME, they may alter their malware to disengage from the victim or conceal the core functions of the implant. They may also search for VME artifacts before dropping secondary or additional payloads. Adversaries may use the information learned from [Virtualization/Sandbox Evasion](https://attack.mitre.org/techniques/T1497) during automated discovery to shape follow-on behaviors.(Citation: Deloitte Environment Awareness)" ; + rdfs:subClassOf d3f:T1497 . + +d3f:T1497.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Time Based Evasion" ; + d3f:attack-id "T1497.003" ; + d3f:definition "Adversaries may employ various time-based methods to detect and avoid virtualization and analysis environments. This may include enumerating time-based properties, such as uptime or the system clock, as well as the use of timers or other triggers to avoid a virtual machine environment (VME) or sandbox, specifically those that are automated or only operate for a limited amount of time." ; + d3f:may-invoke d3f:GetSystemTime ; + d3f:may-run d3f:SystemTimeApplication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetSystemTime ], + [ a owl:Restriction ; + owl:onProperty d3f:may-run ; + owl:someValuesFrom d3f:SystemTimeApplication ], + d3f:T1497 . + +d3f:T1498.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Direct Network Flood" ; + d3f:attack-id "T1498.001" ; + d3f:creates d3f:InboundInternetNetworkTraffic ; + d3f:definition "Adversaries may attempt to cause a denial of service (DoS) by directly sending a high-volume of network traffic to a target. This DoS attack may also reduce the availability and functionality of the targeted system(s) and network. [Direct Network Flood](https://attack.mitre.org/techniques/T1498/001)s are when one or more systems are used to send a high-volume of network packets towards the targeted service's network. Almost any network protocol may be used for flooding. Stateless protocols such as UDP or ICMP are commonly used but stateful protocols such as TCP can be used as well." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:InboundInternetNetworkTraffic ], + d3f:T1498 . + +d3f:T1498.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Reflection Amplification" ; + d3f:attack-id "T1498.002" ; + d3f:definition "Adversaries may attempt to cause a denial of service (DoS) by reflecting a high-volume of network traffic to a target. This type of Network DoS takes advantage of a third-party server intermediary that hosts and will respond to a given spoofed source IP address. This third-party server is commonly termed a reflector. An adversary accomplishes a reflection attack by sending packets to reflectors with the spoofed address of the victim. Similar to Direct Network Floods, more than one system may be used to conduct the attack, or a botnet may be used. Likewise, one or more reflectors may be used to focus traffic on the target.(Citation: Cloudflare ReflectionDoS May 2017) This Network DoS attack may also reduce the availability and functionality of the targeted system(s) and network." ; + d3f:produces d3f:InboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InboundInternetNetworkTraffic ], + d3f:T1498 . + +d3f:T1499.001 a owl:Class ; + rdfs:label "OS Exhaustion Flood" ; + d3f:attack-id "T1499.001" ; + d3f:definition "Adversaries may launch a denial of service (DoS) attack targeting an endpoint's operating system (OS). A system's OS is responsible for managing the finite resources as well as preventing the entire system from being overwhelmed by excessive demands on its capacity. These attacks do not need to exhaust the actual resources on a system; the attacks may simply exhaust the limits and available resources that an OS self-imposes." ; + rdfs:subClassOf d3f:T1499 . + +d3f:T1499.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Service Exhaustion Flood" ; + d3f:attack-id "T1499.002" ; + d3f:definition "Adversaries may target the different network services provided by systems to conduct a denial of service (DoS). Adversaries often target the availability of DNS and web services, however others have been targeted as well.(Citation: Arbor AnnualDoSreport Jan 2018) Web server software can be attacked through a variety of means, some of which apply generally while others are specific to the software being used to provide the service." ; + d3f:produces d3f:InboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InboundInternetNetworkTraffic ], + d3f:T1498 . + +d3f:T1499.003 a owl:Class ; + rdfs:label "Application Exhaustion Flood" ; + d3f:attack-id "T1499.003" ; + d3f:definition "Adversaries may target resource intensive features of applications to cause a denial of service (DoS), denying availability to those applications. For example, specific features in web applications may be highly resource intensive. Repeated requests to those features may be able to exhaust system resources and deny access to the application or the server itself.(Citation: Arbor AnnualDoSreport Jan 2018)" ; + rdfs:subClassOf d3f:T1499 . + +d3f:T1499.004 a owl:Class ; + rdfs:label "Application or System Exploitation" ; + d3f:attack-id "T1499.004" ; + d3f:definition "Adversaries may exploit software vulnerabilities that can cause an application or system to crash and deny availability to users. (Citation: Sucuri BIND9 August 2015) Some systems may automatically restart critical applications and services when crashes occur, but they can likely be re-exploited to cause a persistent denial of service (DoS) condition." ; + rdfs:subClassOf d3f:T1499 . + +d3f:T1500 a owl:Class ; + rdfs:label "Compile After Delivery" ; + d3f:attack-id "T1500" ; + d3f:definition "Adversaries may attempt to make payloads difficult to discover and analyze by delivering files to victims as uncompiled code. Similar to [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027), text-based source code files may subvert analysis and scrutiny from protections targeting executables/binaries. These payloads will need to be compiled before execution; typically via native utilities such as csc.exe or GCC/MinGW.(Citation: ClearSky MuddyWater Nov 2018)" ; + rdfs:comment "This technique has been revoked by T1027.004" ; + rdfs:seeAlso "T1027.004" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1501 a owl:Class ; + rdfs:label "Systemd Service" ; + d3f:attack-id "T1501" ; + d3f:definition "Systemd services can be used to establish persistence on a Linux system. The systemd service manager is commonly used for managing background daemon processes (also known as services) and other system resources.(Citation: Linux man-pages: systemd January 2014)(Citation: Freedesktop.org Linux systemd 29SEP2018) Systemd is the default initialization (init) system on many Linux distributions starting with Debian 8, Ubuntu 15.04, CentOS 7, RHEL 7, Fedora 15, and replaces legacy init systems including SysVinit and Upstart while remaining backwards compatible with the aforementioned init systems." ; + rdfs:comment "This technique has been revoked by T1543.002" ; + rdfs:seeAlso "T1543.002" ; + rdfs:subClassOf d3f:PersistenceTechnique ; + owl:deprecated true . + +d3f:T1502 a owl:Class ; + rdfs:label "Parent PID Spoofing" ; + d3f:attack-id "T1502" ; + d3f:definition "Adversaries may spoof the parent process identifier (PPID) of a new process to evade process-monitoring defenses or to elevate privileges. New processes are typically spawned directly from their parent, or calling, process unless explicitly specified. One way of explicitly assigning the PPID of a new process is via the CreateProcess API call, which supports a parameter that defines the PPID to use.(Citation: DidierStevens SelectMyParent Nov 2009) This functionality is used by Windows features such as User Account Control (UAC) to correctly set the PPID after a requested elevated process is spawned by SYSTEM (typically via svchost.exe or consent.exe) rather than the current user context.(Citation: Microsoft UAC Nov 2018)" ; + rdfs:comment "This technique has been revoked by T1134.004" ; + rdfs:seeAlso "T1134.004" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1503 a owl:Class ; + rdfs:label "Credentials from Web Browsers" ; + d3f:attack-id "T1503" ; + d3f:definition "Adversaries may acquire credentials from web browsers by reading files specific to the target browser. (Citation: Talos Olympic Destroyer 2018)" ; + rdfs:comment "This technique has been revoked by T1555.003" ; + rdfs:seeAlso "T1555.003" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1504 a owl:Class ; + rdfs:label "PowerShell Profile" ; + d3f:attack-id "T1504" ; + d3f:definition "Adversaries may gain persistence and elevate privileges in certain situations by abusing [PowerShell](https://attack.mitre.org/techniques/T1086) profiles. A PowerShell profile (profile.ps1) is a script that runs when PowerShell starts and can be used as a logon script to customize user environments. PowerShell supports several profiles depending on the user or host program. For example, there can be different profiles for PowerShell host programs such as the PowerShell console, PowerShell ISE or Visual Studio Code. An administrator can also configure a profile that applies to all users and host programs on the local computer. (Citation: Microsoft About Profiles)" ; + rdfs:comment "This technique has been revoked by T1546.013" ; + rdfs:seeAlso "T1546.013" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1505.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "SQL Stored Procedures" ; + d3f:attack-id "T1505.001" ; + d3f:creates d3f:StoredProcedure ; + d3f:definition "Adversaries may abuse SQL stored procedures to establish persistent access to systems. SQL Stored Procedures are code that can be saved and reused so that database users do not waste time rewriting frequently used SQL queries. Stored procedures can be invoked via SQL statements to the database using the procedure name or via defined events (e.g. when a SQL server application is started/restarted)." ; + d3f:invokes d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:StoredProcedure ], + d3f:T1505 . + +d3f:T1505.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Transport Agent" ; + d3f:adds d3f:MessageTransferAgent ; + d3f:attack-id "T1505.002" ; + d3f:definition "Adversaries may abuse Microsoft transport agents to establish persistent access to systems. Microsoft Exchange transport agents can operate on email messages passing through the transport pipeline to perform various tasks such as filtering spam, filtering malicious attachments, journaling, or adding a corporate signature to the end of all outgoing emails.(Citation: Microsoft TransportAgent Jun 2016)(Citation: ESET LightNeuron May 2019) Transport agents can be written by application developers and then compiled to .NET assemblies that are subsequently registered with the Exchange server. Transport agents will be invoked during a specified stage of email processing and carry out developer defined tasks." ; + d3f:modifies d3f:MailServer ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:MailServer ], + [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:MessageTransferAgent ], + d3f:T1505 . + +d3f:T1505.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Shell" ; + d3f:adds d3f:WebScriptFile ; + d3f:attack-id "T1505.003" ; + d3f:definition "Adversaries may backdoor web servers with web shells to establish persistent access to systems. A Web shell is a Web script that is placed on an openly accessible Web server to allow an adversary to access the Web server as a gateway into a network. A Web shell may provide a set of functions to execute or a command-line interface on the system that hosts the Web server.(Citation: volexity_0day_sophos_FW)" ; + d3f:modifies d3f:WebServer ; + d3f:produces d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:WebServer ], + [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:WebScriptFile ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Process ], + d3f:T1505 . + +d3f:T1505.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "IIS Components" ; + d3f:adds d3f:Software ; + d3f:attack-id "T1505.004" ; + d3f:definition "Adversaries may install malicious components that run on Internet Information Services (IIS) web servers to establish persistence. IIS provides several mechanisms to extend the functionality of the web servers. For example, Internet Server Application Programming Interface (ISAPI) extensions and filters can be installed to examine and/or modify incoming and outgoing IIS web requests. Extensions and filters are deployed as DLL files that export three functions: Get{Extension/Filter}Version, Http{Extension/Filter}Proc, and (optionally) Terminate{Extension/Filter}. IIS modules may also be installed to extend IIS web servers.(Citation: Microsoft ISAPI Extension Overview 2017)(Citation: Microsoft ISAPI Filter Overview 2017)(Citation: IIS Backdoor 2011)(Citation: Trustwave IIS Module 2013)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:Software ], + d3f:T1505 . + +d3f:T1505.005 a owl:Class ; + rdfs:label "Terminal Services DLL" ; + d3f:attack-id "T1505.005" ; + d3f:definition "Adversaries may abuse components of Terminal Services to enable persistent access to systems. Microsoft Terminal Services, renamed to Remote Desktop Services in some Windows Server OSs as of 2022, enable remote terminal connections to hosts. Terminal Services allows servers to transmit a full, interactive, graphical user interface to clients via RDP.(Citation: Microsoft Remote Desktop Services)" ; + rdfs:subClassOf d3f:T1505 . + +d3f:T1506 a owl:Class ; + rdfs:label "Web Session Cookie" ; + d3f:attack-id "T1506" ; + d3f:definition "Adversaries can use stolen session cookies to authenticate to web applications and services. This technique bypasses some multi-factor authentication protocols since the session is already authenticated.(Citation: Pass The Cookie)" ; + rdfs:comment "This technique has been revoked by T1550.004" ; + rdfs:seeAlso "T1550.004" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1514 a owl:Class ; + rdfs:label "Elevated Execution with Prompt" ; + d3f:attack-id "T1514" ; + d3f:definition "Adversaries may leverage the AuthorizationExecuteWithPrivileges API to escalate privileges by prompting the user for credentials.(Citation: AppleDocs AuthorizationExecuteWithPrivileges) The purpose of this API is to give application developers an easy way to perform operations with root privileges, such as for application installation or updating. This API does not validate that the program requesting root privileges comes from a reputable source or has been maliciously modified. Although this API is deprecated, it still fully functions in the latest releases of macOS. When calling this API, the user will be prompted to enter their credentials but no checks on the origin or integrity of the program are made. The program calling the API may also load world writable files which can be modified to perform malicious behavior with elevated privileges." ; + rdfs:comment "This technique has been revoked by T1548.004" ; + rdfs:seeAlso "T1548.004" ; + rdfs:subClassOf d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1518.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Security Software Discovery" ; + d3f:attack-id "T1518.001" ; + d3f:definition "Adversaries may attempt to get a listing of security software, configurations, defensive tools, and sensors that are installed on a system or in a cloud environment. This may include things such as cloud monitoring agents and anti-virus. Adversaries may use the information from [Security Software Discovery](https://attack.mitre.org/techniques/T1518/001) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions." ; + d3f:may-access d3f:FileSystemMetadata, + d3f:KernelProcessTable, + d3f:SystemConfigurationDatabaseRecord, + d3f:SystemFirewallConfiguration ; + d3f:may-invoke d3f:GetRunningProcesses ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:KernelProcessTable ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:SystemFirewallConfiguration ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetRunningProcesses ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:FileSystemMetadata ], + d3f:T1518 . + +d3f:T1519 a owl:Class ; + rdfs:label "Emond" ; + d3f:attack-id "T1519" ; + d3f:definition "Adversaries may use Event Monitor Daemon (emond) to establish persistence by scheduling malicious commands to run on predictable event triggers. Emond is a [Launch Daemon](https://attack.mitre.org/techniques/T1160) that accepts events from various services, runs them through a simple rules engine, and takes action. The emond binary at /sbin/emond will load any rules from the /etc/emond.d/rules/ directory and take action once an explicitly defined event takes place. The rule files are in the plist format and define the name, event type, and action to take. Some examples of event types include system startup and user authentication. Examples of actions are to run a system command or send an email. The emond service will not launch if there is no file present in the QueueDirectories path /private/var/db/emondClients, specified in the [Launch Daemon](https://attack.mitre.org/techniques/T1160) configuration file at/System/Library/LaunchDaemons/com.apple.emond.plist.(Citation: xorrior emond Jan 2018)(Citation: magnusviri emond Apr 2016)(Citation: sentinelone macos persist Jun 2019)" ; + rdfs:comment "This technique has been revoked by T1546.014" ; + rdfs:seeAlso "T1546.014" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique ; + owl:deprecated true . + +d3f:T1522 a owl:Class ; + rdfs:label "Cloud Instance Metadata API" ; + d3f:attack-id "T1522" ; + d3f:definition "Adversaries may attempt to access the Cloud Instance Metadata API to collect credentials and other sensitive data." ; + rdfs:comment "This technique has been revoked by T1552.005" ; + rdfs:seeAlso "T1552.005" ; + rdfs:subClassOf d3f:CredentialAccessTechnique ; + owl:deprecated true . + +d3f:T1525 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Implant Internal Image" ; + d3f:adds d3f:ContainerImage ; + d3f:attack-id "T1525" ; + d3f:definition "Adversaries may implant cloud or container images with malicious code to establish persistence after gaining access to an environment. Amazon Web Services (AWS) Amazon Machine Images (AMIs), Google Cloud Platform (GCP) Images, and Azure Images as well as popular container runtimes such as Docker can be implanted or backdoored. Unlike [Upload Malware](https://attack.mitre.org/techniques/T1608/001), this technique focuses on adversaries implanting an image in a registry within a victim’s environment. Depending on how the infrastructure is provisioned, this could provide persistent access if the infrastructure provisioning tool is instructed to always use the latest image.(Citation: Rhino Labs Cloud Image Backdoor Technique Sept 2019)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:ContainerImage ], + d3f:PersistenceTechnique . + +d3f:T1526 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Service Discovery" ; + d3f:attack-id "T1526" ; + d3f:definition "An adversary may attempt to enumerate the cloud services running on a system after gaining access. These methods can differ from platform-as-a-service (PaaS), to infrastructure-as-a-service (IaaS), or software-as-a-service (SaaS). Many services exist throughout the various cloud providers and can include Continuous Integration and Continuous Delivery (CI/CD), Lambda Functions, Azure AD, etc. They may also include security services, such as AWS GuardDuty and Microsoft Defender for Cloud, and logging services, such as AWS CloudTrail and Google Cloud Audit Logs." ; + d3f:reads d3f:CloudConfiguration ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:CloudConfiguration ], + d3f:DiscoveryTechnique . + +d3f:T1527 a owl:Class ; + rdfs:label "Application Access Token" ; + d3f:attack-id "T1527" ; + d3f:definition "Adversaries may use application access tokens to bypass the typical authentication process and access restricted accounts, information, or services on remote systems. These tokens are typically stolen from users and used in lieu of login credentials." ; + rdfs:comment "This technique has been revoked by T1550.001" ; + rdfs:seeAlso "T1550.001" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:LateralMovementTechnique ; + owl:deprecated true . + +d3f:T1528 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Steal Application Access Token" ; + d3f:accesses d3f:AccessToken ; + d3f:attack-id "T1528" ; + d3f:definition "Adversaries can steal application access tokens as a means of acquiring credentials to access remote systems and resources." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:AccessToken ], + d3f:CredentialAccessTechnique . + +d3f:T1529 a owl:Class ; + rdfs:label "System Shutdown/Reboot" ; + d3f:attack-id "T1529" ; + d3f:definition "Adversaries may shutdown/reboot systems to interrupt access to, or aid in the destruction of, those systems. Operating systems may contain commands to initiate a shutdown/reboot of a machine or network device. In some cases, these commands may also be used to initiate a shutdown/reboot of a remote computer or network device via [Network Device CLI](https://attack.mitre.org/techniques/T1059/008) (e.g. reload).(Citation: Microsoft Shutdown Oct 2017)(Citation: alert_TA18_106A)" ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1530 a owl:Class ; + rdfs:label "Data from Cloud Storage" ; + d3f:attack-id "T1530" ; + d3f:definition "Adversaries may access data from cloud storage." ; + rdfs:subClassOf d3f:CollectionTechnique . + +d3f:T1531 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Account Access Removal" ; + d3f:attack-id "T1531" ; + d3f:definition "Adversaries may interrupt availability of system and network resources by inhibiting access to accounts utilized by legitimate users. Accounts may be deleted, locked, or manipulated (ex: changed credentials) to remove access to accounts. Adversaries may also subsequently log off and/or perform a [System Shutdown/Reboot](https://attack.mitre.org/techniques/T1529) to set malicious changes into place.(Citation: CarbonBlack LockerGoga 2019)(Citation: Unit42 LockerGoga 2019)" ; + d3f:modifies d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:UserAccount ], + d3f:ImpactTechnique . + +d3f:T1534 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Internal Spearphishing" ; + d3f:attack-id "T1534" ; + d3f:definition "After they already have access to accounts or systems within the environment, adversaries may use internal spearphishing to gain access to additional information or compromise other users within the same organization. Internal spearphishing is multi-staged campaign where a legitimate account is initially compromised either by controlling the user's device or by compromising the account credentials of the user. Adversaries may then attempt to take advantage of the trusted internal account to increase the likelihood of tricking more victims into falling for phish attempts, often incorporating [Impersonation](https://attack.mitre.org/techniques/T1656).(Citation: Trend Micro - Int SP)" ; + d3f:produces d3f:Email ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Email ], + d3f:LateralMovementTechnique . + +d3f:T1535 a owl:Class ; + rdfs:label "Unused/Unsupported Cloud Regions" ; + d3f:attack-id "T1535" ; + d3f:definition "Adversaries may create cloud instances in unused geographic service regions in order to evade detection. Access is usually obtained through compromising accounts used to manage cloud infrastructure." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1536 a owl:Class ; + rdfs:label "Revert Cloud Instance" ; + d3f:attack-id "T1536" ; + d3f:definition "An adversary may revert changes made to a cloud instance after they have performed malicious activities in attempt to evade detection and remove evidence of their presence. In highly virtualized environments, such as cloud-based infrastructure, this may be accomplished by restoring virtual machine (VM) or data storage snapshots through the cloud management dashboard or cloud APIs." ; + rdfs:comment "This technique has been revoked by T1578.004" ; + rdfs:seeAlso "T1578.004" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique ; + owl:deprecated true . + +d3f:T1537 a owl:Class ; + rdfs:label "Transfer Data to Cloud Account" ; + d3f:attack-id "T1537" ; + d3f:definition "Adversaries may exfiltrate data by transferring the data, including through sharing/syncing and creating backups of cloud environments, to another cloud account they control on the same service." ; + rdfs:subClassOf d3f:ExfiltrationTechnique . + +d3f:T1538 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Service Dashboard" ; + d3f:accesses d3f:CloudConfiguration ; + d3f:attack-id "T1538" ; + d3f:definition "An adversary may use a cloud service dashboard GUI with stolen credentials to gain useful information from an operational cloud environment, such as specific services, resources, and features. For example, the GCP Command Center can be used to view all assets, findings of potential security risks, and to run additional queries, such as finding public IP addresses and open ports.(Citation: Google Command Center Dashboard)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:CloudConfiguration ], + d3f:DiscoveryTechnique . + +d3f:T1539 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Steal Web Session Cookie" ; + d3f:accesses d3f:SessionCookie ; + d3f:attack-id "T1539" ; + d3f:definition "An adversary may steal web application or service session cookies and use them to gain access to web applications or Internet services as an authenticated user without needing credentials. Web applications and services often use session cookies as an authentication token after a user has authenticated to a website." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:SessionCookie ], + d3f:CredentialAccessTechnique . + +d3f:T1542.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Firmware" ; + d3f:attack-id "T1542.001" ; + d3f:definition "Adversaries may modify system firmware to persist on systems.The BIOS (Basic Input/Output System) and The Unified Extensible Firmware Interface (UEFI) or Extensible Firmware Interface (EFI) are examples of system firmware that operate as the software interface between the operating system and hardware of a computer.(Citation: Wikipedia BIOS)(Citation: Wikipedia UEFI)(Citation: About UEFI)" ; + d3f:modifies d3f:SystemFirmware ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemFirmware ], + d3f:T1542 . + +d3f:T1542.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Component Firmware" ; + d3f:attack-id "T1542.002" ; + d3f:definition "Adversaries may modify component firmware to persist on systems. Some adversaries may employ sophisticated means to compromise computer components and install malicious firmware that will execute adversary code outside of the operating system and main system firmware or BIOS. This technique may be similar to [System Firmware](https://attack.mitre.org/techniques/T1542/001) but conducted upon other system components/devices that may not have the same capability or level of integrity checking." ; + d3f:modifies d3f:Firmware ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:Firmware ], + d3f:T1542 . + +d3f:T1542.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bootkit" ; + d3f:attack-id "T1542.003" ; + d3f:definition "Adversaries may use bootkits to persist on systems. Bootkits reside at a layer below the operating system and may make it difficult to perform full remediation unless an organization suspects one was used and can act accordingly." ; + d3f:may-modify d3f:BootLoader, + d3f:BootSector, + d3f:VolumeBootRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:BootLoader ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:BootSector ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:VolumeBootRecord ], + d3f:T1542 . + +d3f:T1542.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "ROMMONkit" ; + d3f:attack-id "T1542.004" ; + d3f:definition "Adversaries may abuse the ROM Monitor (ROMMON) by loading an unauthorized firmware with adversary code to provide persistent access and manipulate device behavior that is difficult to detect. (Citation: Cisco Synful Knock Evolution)(Citation: Cisco Blog Legacy Device Attacks)" ; + d3f:modifies d3f:SystemFirmware ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemFirmware ], + d3f:T1542 . + +d3f:T1542.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "TFTP Boot" ; + d3f:attack-id "T1542.005" ; + d3f:creates d3f:TFTPNetworkTraffic ; + d3f:definition "Adversaries may abuse netbooting to load an unauthorized network device operating system from a Trivial File Transfer Protocol (TFTP) server. TFTP boot (netbooting) is commonly used by network administrators to load configuration-controlled network device images from a centralized management server. Netbooting is one option in the boot sequence and can be used to centralize, manage, and control device images." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:TFTPNetworkTraffic ], + d3f:T1542 . + +d3f:T1543.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Launch Agent" ; + d3f:attack-id "T1543.001" ; + d3f:creates d3f:PropertyListFile ; + d3f:definition "Adversaries may create or modify launch agents to repeatedly execute malicious payloads as part of persistence. When a user logs in, a per-user launchd process is started which loads the parameters for each launch-on-demand user agent from the property list (.plist) file found in /System/Library/LaunchAgents, /Library/LaunchAgents, and ~/Library/LaunchAgents.(Citation: AppleDocs Launch Agent Daemons)(Citation: OSX Keydnap malware) (Citation: Antiquated Mac Malware) Property list files use the Label, ProgramArguments , and RunAtLoad keys to identify the Launch Agent's name, executable location, and execution time.(Citation: OSX.Dok Malware) Launch Agents are often installed to perform updates to programs, launch user specified programs at login, or to conduct other developer tasks." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:PropertyListFile ], + d3f:T1543 . + +d3f:T1543.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Systemd Service" ; + d3f:attack-id "T1543.002" ; + d3f:definition "Adversaries may create or modify systemd services to repeatedly execute malicious payloads as part of persistence. Systemd is a system and service manager commonly used for managing background daemon processes (also known as services) and other system resources.(Citation: Linux man-pages: systemd January 2014) Systemd is the default initialization (init) system on many Linux distributions replacing legacy init systems, including SysVinit and Upstart, while remaining backwards compatible." ; + d3f:may-create d3f:OperatingSystemConfigurationFile ; + d3f:may-modify d3f:OperatingSystemConfigurationFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:OperatingSystemConfigurationFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:OperatingSystemConfigurationFile ], + d3f:T1543 . + +d3f:T1543.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows Service" ; + d3f:attack-id "T1543.003" ; + d3f:definition "Adversaries may create or modify Windows services to repeatedly execute malicious payloads as part of persistence. When Windows boots up, it starts programs or applications called services that perform background system functions.(Citation: TechNet Services) Windows service configuration information, including the file path to the service's executable or recovery programs/commands, is stored in the Windows Registry." ; + d3f:modifies d3f:SystemConfigurationDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + d3f:T1543 . + +d3f:T1543.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Launch Daemon" ; + d3f:attack-id "T1543.004" ; + d3f:definition "Adversaries may create or modify Launch Daemons to execute malicious payloads as part of persistence. Launch Daemons are plist files used to interact with Launchd, the service management framework used by macOS. Launch Daemons require elevated privileges to install, are executed for every user on a system prior to login, and run in the background without the need for user interaction. During the macOS initialization startup, the launchd process loads the parameters for launch-on-demand system-level daemons from plist files found in /System/Library/LaunchDaemons/ and /Library/LaunchDaemons/. Required Launch Daemons parameters include a Label to identify the task, Program to provide a path to the executable, and RunAtLoad to specify when the task is run. Launch Daemons are often used to provide access to shared resources, updates to software, or conduct automation tasks.(Citation: AppleDocs Launch Agent Daemons)(Citation: Methods of Mac Malware Persistence)(Citation: launchd Keywords for plists)" ; + d3f:modifies d3f:PropertyListFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:PropertyListFile ], + d3f:T1543 . + +d3f:T1543.005 a owl:Class ; + rdfs:label "Container Service" ; + d3f:attack-id "T1543.005" ; + d3f:definition "Adversaries may create or modify container or container cluster management tools that run as daemons, agents, or services on individual hosts. These include software for creating and managing individual containers, such as Docker and Podman, as well as container cluster node-level agents such as kubelet. By modifying these services, an adversary may be able to achieve persistence or escalate their privileges on a host." ; + rdfs:subClassOf d3f:T1543 . + +d3f:T1546.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Change Default File Association" ; + d3f:attack-id "T1546.001" ; + d3f:definition "Adversaries may establish persistence by executing malicious content triggered by a file type association. When a file is opened, the default program used to open the file (also called the file association or handler) is checked. File association selections are stored in the Windows Registry and can be edited by users, administrators, or programs that have Registry access or by administrators using the built-in assoc utility.(Citation: Microsoft Change Default Programs)(Citation: Microsoft File Handlers)(Citation: Microsoft Assoc Oct 2017) Applications can modify the file association for a given file extension to call an arbitrary program when a file with the given extension is opened." ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1546 . + +d3f:T1546.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Screensaver" ; + d3f:attack-id "T1546.002" ; + d3f:creates d3f:ExecutableFile ; + d3f:definition "Adversaries may establish persistence by executing malicious content triggered by user inactivity. Screensavers are programs that execute after a configurable time of user inactivity and consist of Portable Executable (PE) files with a .scr file extension.(Citation: Wikipedia Screensaver) The Windows screensaver application scrnsave.scr is located in C:\\Windows\\System32\\, and C:\\Windows\\sysWOW64\\ on 64-bit Windows systems, along with screensavers included with base Windows installations." ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ExecutableFile ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1546 . + +d3f:T1546.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows Management Instrumentation Event Subscription" ; + d3f:attack-id "T1546.003" ; + d3f:definition "Adversaries may establish persistence and elevate privileges by executing malicious content triggered by a Windows Management Instrumentation (WMI) event subscription. WMI can be used to install event filters, providers, consumers, and bindings that execute code when a defined event occurs. Examples of events that may be subscribed to are the wall clock time, user login, or the computer's uptime.(Citation: Mandiant M-Trends 2015)" ; + d3f:modifies d3f:EventLog ; + d3f:produces d3f:IntranetAdministrativeNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:EventLog ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetAdministrativeNetworkTraffic ], + d3f:T1546 . + +d3f:T1546.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Unix Shell Configuration Modification" ; + d3f:attack-id "T1546.004" ; + d3f:definition "Adversaries may establish persistence through executing malicious commands triggered by a user’s shell. User [Unix Shell](https://attack.mitre.org/techniques/T1059/004)s execute several configuration scripts at different points throughout the session based on events. For example, when a user opens a command-line interface or remotely logs in (such as via SSH) a login shell is initiated. The login shell executes scripts from the system (/etc) and the user’s home directory (~/) to configure the environment. All login shells on a system use /etc/profile when initiated. These configuration scripts run at the permission level of their directory and are often used to set environment variables, create aliases, and customize the user’s environment. When the shell exits or terminates, additional shell scripts are executed to ensure the shell exits appropriately." ; + d3f:modifies d3f:UserInitConfigurationFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:UserInitConfigurationFile ], + d3f:T1546 . + +d3f:T1546.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Trap" ; + d3f:attack-id "T1546.005" ; + d3f:definition "Adversaries may establish persistence by executing malicious content triggered by an interrupt signal. The trap command allows programs and shells to specify commands that will be executed upon receiving interrupt signals. A common situation is a script allowing for graceful termination and handling of common keyboard interrupts like ctrl+c and ctrl+d." ; + d3f:executes d3f:Command ; + d3f:may-create d3f:ExecutableScript ; + d3f:may-modify d3f:ExecutableScript ; + d3f:modifies d3f:EventLog ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:EventLog ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ExecutableScript ], + [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:Command ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:ExecutableScript ], + d3f:T1546 . + +d3f:T1546.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "LC_LOAD_DYLIB Addition" ; + d3f:attack-id "T1546.006" ; + d3f:definition "Adversaries may establish persistence by executing malicious content triggered by the execution of tainted binaries. Mach-O binaries have a series of headers that are used to perform certain operations when a binary is loaded. The LC_LOAD_DYLIB header in a Mach-O binary tells macOS and OS X which dynamic libraries (dylibs) to load during execution time. These can be added ad-hoc to the compiled binary as long as adjustments are made to the rest of the fields and dependencies.(Citation: Writing Bad Malware for OSX) There are tools available to perform these changes." ; + d3f:modifies d3f:ExecutableBinary ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ExecutableBinary ], + d3f:T1546 . + +d3f:T1546.007 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Netsh Helper DLL" ; + d3f:attack-id "T1546.007" ; + d3f:definition "Adversaries may establish persistence by executing malicious content triggered by Netsh Helper DLLs. Netsh.exe (also referred to as Netshell) is a command-line scripting utility used to interact with the network configuration of a system. It contains functionality to add helper DLLs for extending functionality of the utility.(Citation: TechNet Netsh) The paths to registered netsh.exe helper DLLs are entered into the Windows Registry at HKLM\\SOFTWARE\\Microsoft\\Netsh." ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + d3f:produces d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Process ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1546 . + +d3f:T1546.008 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Accessibility Features" ; + d3f:attack-id "T1546.008" ; + d3f:definition "Adversaries may establish persistence and/or elevate privileges by executing malicious content triggered by accessibility features. Windows contains accessibility features that may be launched with a key combination before a user has logged in (ex: when the user is on the Windows logon screen). An adversary can modify the way these programs are launched to get a command prompt or backdoor without logging in to the system." ; + d3f:may-create d3f:IntranetAdministrativeNetworkTraffic ; + d3f:may-modify d3f:ExecutableBinary, + d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:IntranetAdministrativeNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ExecutableBinary ], + d3f:T1546 . + +d3f:T1546.009 a owl:Class, + owl:NamedIndividual ; + rdfs:label "AppCert DLLs" ; + d3f:attack-id "T1546.009" ; + d3f:definition "Adversaries may establish persistence and/or elevate privileges by executing malicious content triggered by AppCert DLLs loaded into processes. Dynamic-link libraries (DLLs) that are specified in the AppCertDLLs Registry key under HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\ are loaded into every process that calls the ubiquitously used application programming interface (API) functions CreateProcess, CreateProcessAsUser, CreateProcessWithLoginW, CreateProcessWithTokenW, or WinExec. (Citation: Elastic Process Injection July 2017)" ; + d3f:invokes d3f:CreateProcess ; + d3f:loads d3f:SharedLibraryFile ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:loads ; + owl:someValuesFrom d3f:SharedLibraryFile ], + d3f:T1546 . + +d3f:T1546.010 a owl:Class, + owl:NamedIndividual ; + rdfs:label "AppInit DLLs" ; + d3f:attack-id "T1546.010" ; + d3f:definition "Adversaries may establish persistence and/or elevate privileges by executing malicious content triggered by AppInit DLLs loaded into processes. Dynamic-link libraries (DLLs) that are specified in the AppInit_DLLs value in the Registry keys HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows or HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\Windows are loaded by user32.dll into every process that loads user32.dll. In practice this is nearly every program, since user32.dll is a very common library. (Citation: Elastic Process Injection July 2017)" ; + d3f:invokes d3f:CreateProcess ; + d3f:loads d3f:SharedLibraryFile ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:loads ; + owl:someValuesFrom d3f:SharedLibraryFile ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1546 . + +d3f:T1546.011 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Shimming" ; + d3f:attack-id "T1546.011" ; + d3f:creates d3f:Shim ; + d3f:definition "Adversaries may establish persistence and/or elevate privileges by executing malicious content triggered by application shims. The Microsoft Windows Application Compatibility Infrastructure/Framework (Application Shim) was created to allow for backward compatibility of software as the operating system codebase changes over time. For example, the application shimming feature allows developers to apply fixes to applications (without rewriting code) that were created for Windows XP so that it will work with Windows 10. (Citation: Elastic Process Injection July 2017)" ; + d3f:modifies d3f:ShimDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ShimDatabase ], + [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:Shim ], + d3f:T1546 . + +d3f:T1546.012 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Image File Execution Options Injection" ; + d3f:attack-id "T1546.012" ; + d3f:definition "Adversaries may establish persistence and/or elevate privileges by executing malicious content triggered by Image File Execution Options (IFEO) debuggers. IFEOs enable a developer to attach a debugger to an application. When a process is created, a debugger present in an application’s IFEO will be prepended to the application’s name, effectively launching the new process under the debugger (e.g., C:\\dbg\\ntsd.exe -g notepad.exe). (Citation: Microsoft Dev Blog IFEO Mar 2010)" ; + d3f:modifies d3f:SystemConfigurationDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + d3f:T1546 . + +d3f:T1546.013 a owl:Class, + owl:NamedIndividual ; + rdfs:label "PowerShell Profile" ; + d3f:attack-id "T1546.013" ; + d3f:definition "Adversaries may gain persistence and elevate privileges by executing malicious content triggered by PowerShell profiles. A PowerShell profile (profile.ps1) is a script that runs when [PowerShell](https://attack.mitre.org/techniques/T1059/001) starts and can be used as a logon script to customize user environments." ; + d3f:modifies d3f:PowerShellProfileScript ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:PowerShellProfileScript ], + d3f:T1546 . + +d3f:T1546.014 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Emond" ; + d3f:attack-id "T1546.014" ; + d3f:definition "Adversaries may gain persistence and elevate privileges by executing malicious content triggered by the Event Monitor Daemon (emond). Emond is a [Launch Daemon](https://attack.mitre.org/techniques/T1543/004) that accepts events from various services, runs them through a simple rules engine, and takes action. The emond binary at /sbin/emond will load any rules from the /etc/emond.d/rules/ directory and take action once an explicitly defined event takes place." ; + d3f:may-create d3f:PropertyListFile ; + d3f:may-modify d3f:PropertyListFile ; + d3f:modifies d3f:ConfigurationResource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:PropertyListFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:PropertyListFile ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ConfigurationResource ], + d3f:T1546 . + +d3f:T1546.015 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Component Object Model Hijacking" ; + d3f:attack-id "T1546.015" ; + d3f:definition "Adversaries may establish persistence by executing malicious content triggered by hijacked references to Component Object Model (COM) objects. COM is a system within Windows to enable interaction between software components through the operating system.(Citation: Microsoft Component Object Model) References to various COM objects are stored in the Registry." ; + d3f:loads d3f:ExecutableBinary ; + d3f:modifies d3f:SystemConfigurationDatabase ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + [ a owl:Restriction ; + owl:onProperty d3f:loads ; + owl:someValuesFrom d3f:ExecutableBinary ], + d3f:T1546 . + +d3f:T1546.016 a owl:Class ; + rdfs:label "Installer Packages" ; + d3f:attack-id "T1546.016" ; + d3f:definition "Adversaries may establish persistence and elevate privileges by using an installer to trigger the execution of malicious content. Installer packages are OS specific and contain the resources an operating system needs to install applications on a system. Installer packages can include scripts that run prior to installation as well as after installation is complete. Installer scripts may inherit elevated permissions when executed. Developers often use these scripts to prepare the environment for installation, check requirements, download dependencies, and remove files after installation.(Citation: Installer Package Scripting Rich Trouton)" ; + rdfs:subClassOf d3f:T1546 . + +d3f:T1546.017 a owl:Class ; + rdfs:label "Udev Rules" ; + d3f:attack-id "T1546.017" ; + d3f:definition "Adversaries may maintain persistence through executing malicious content triggered using udev rules. Udev is the Linux kernel device manager that dynamically manages device nodes, handles access to pseudo-device files in the `/dev` directory, and responds to hardware events, such as when external devices like hard drives or keyboards are plugged in or removed. Udev uses rule files with `match keys` to specify the conditions a hardware event must meet and `action keys` to define the actions that should follow. Root permissions are required to create, modify, or delete rule files located in `/etc/udev/rules.d/`, `/run/udev/rules.d/`, `/usr/lib/udev/rules.d/`, `/usr/local/lib/udev/rules.d/`, and `/lib/udev/rules.d/`. Rule priority is determined by both directory and by the digit prefix in the rule filename.(Citation: Ignacio Udev research 2024)(Citation: Elastic Linux Persistence 2024)" ; + rdfs:subClassOf d3f:T1546 . + +d3f:T1547.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Registry Run Keys / Startup Folder" ; + d3f:attack-id "T1547.001" ; + d3f:definition "Adversaries may achieve persistence by adding a program to a startup folder or referencing it with a Registry run key. Adding an entry to the \"run keys\" in the Registry or startup folder will cause the program referenced to be executed when a user logs in.(Citation: Microsoft Run Key) These programs will be executed under the context of the user and will have the account's associated permissions level." ; + d3f:may-modify d3f:SystemConfigurationInitDatabaseRecord, + d3f:UserStartupScriptFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SystemConfigurationInitDatabaseRecord ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:UserStartupScriptFile ], + d3f:T1547 . + +d3f:T1547.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Authentication Package" ; + d3f:attack-id "T1547.002" ; + d3f:definition "Adversaries may abuse authentication packages to execute DLLs when the system boots. Windows authentication package DLLs are loaded by the Local Security Authority (LSA) process at system start. They provide support for multiple logon processes and multiple security protocols to the operating system.(Citation: MSDN Authentication Packages)" ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1547 . + +d3f:T1547.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Time Providers" ; + d3f:attack-id "T1547.003" ; + d3f:definition "Adversaries may abuse time providers to execute DLLs when the system boots. The Windows Time service (W32Time) enables time synchronization across and within domains.(Citation: Microsoft W32Time Feb 2018) W32Time time providers are responsible for retrieving time stamps from hardware/network resources and outputting these values to other network clients.(Citation: Microsoft TimeProvider)" ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1547 . + +d3f:T1547.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Winlogon Helper DLL" ; + d3f:attack-id "T1547.004" ; + d3f:definition "Adversaries may abuse features of Winlogon to execute DLLs and/or executables when a user logs in. Winlogon.exe is a Windows component responsible for actions at logon/logoff as well as the secure attention sequence (SAS) triggered by Ctrl-Alt-Delete. Registry entries in HKLM\\Software[\\\\Wow6432Node\\\\]\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\ and HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\ are used to manage additional helper programs and functionalities that support Winlogon.(Citation: Cylance Reg Persistence Sept 2013)" ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1547 . + +d3f:T1547.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Security Support Provider" ; + d3f:attack-id "T1547.005" ; + d3f:definition "Adversaries may abuse security support providers (SSPs) to execute DLLs when the system boots. Windows SSP DLLs are loaded into the Local Security Authority (LSA) process at system start. Once loaded into the LSA, SSP DLLs have access to encrypted and plaintext passwords that are stored in Windows, such as any logged-on user's Domain password or smart card PINs." ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1547 . + +d3f:T1547.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kernel Modules and Extensions" ; + d3f:attack-id "T1547.006" ; + d3f:definition "Adversaries may modify the kernel to automatically execute programs on system boot. Loadable Kernel Modules (LKMs) are pieces of code that can be loaded and unloaded into the kernel upon demand. They extend the functionality of the kernel without the need to reboot the system. For example, one type of module is the device driver, which allows the kernel to access hardware connected to the system.(Citation: Linux Kernel Programming) " ; + d3f:modifies d3f:KernelModule ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:KernelModule ], + d3f:T1547 . + +d3f:T1547.007 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Re-opened Applications" ; + d3f:attack-id "T1547.007" ; + d3f:definition "Adversaries may modify plist files to automatically run an application when a user logs in. When a user logs out or restarts via the macOS Graphical User Interface (GUI), a prompt is provided to the user with a checkbox to \"Reopen windows when logging back in\".(Citation: Re-Open windows on Mac) When selected, all applications currently open are added to a property list file named com.apple.loginwindow.[UUID].plist within the ~/Library/Preferences/ByHost directory.(Citation: Methods of Mac Malware Persistence)(Citation: Wardle Persistence Chapter) Applications listed in this file are automatically reopened upon the user’s next logon." ; + d3f:modifies d3f:ApplicationConfigurationFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ApplicationConfigurationFile ], + d3f:T1547 . + +d3f:T1547.008 a owl:Class, + owl:NamedIndividual ; + rdfs:label "LSASS Driver" ; + d3f:attack-id "T1547.008" ; + d3f:definition "Adversaries may modify or add LSASS drivers to obtain persistence on compromised systems. The Windows security subsystem is a set of components that manage and enforce the security policy for a computer or domain. The Local Security Authority (LSA) is the main component responsible for local security policy and user authentication. The LSA includes multiple dynamic link libraries (DLLs) associated with various other security functions, all of which run in the context of the LSA Subsystem Service (LSASS) lsass.exe process.(Citation: Microsoft Security Subsystem)" ; + d3f:may-create d3f:SharedLibraryFile ; + d3f:modifies d3f:SystemServiceSoftware ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:SharedLibraryFile ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemServiceSoftware ], + d3f:T1547 . + +d3f:T1547.009 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Shortcut Modification" ; + d3f:attack-id "T1547.009" ; + d3f:definition "Adversaries may create or modify shortcuts that can execute a program during system boot or user login. Shortcuts or symbolic links are used to reference other files or programs that will be opened or executed when the shortcut is clicked or executed by a system startup process." ; + d3f:may-modify d3f:SymbolicLink, + d3f:UserStartupScriptFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:UserStartupScriptFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SymbolicLink ], + d3f:T1547 . + +d3f:T1547.010 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Port Monitors" ; + d3f:attack-id "T1547.010" ; + d3f:definition "Adversaries may use port monitors to run an adversary supplied DLL during system boot for persistence or privilege escalation. A port monitor can be set through the AddMonitor API call to set a DLL to be loaded at startup.(Citation: AddMonitor) This DLL can be located in C:\\Windows\\System32 and will be loaded and run by the print spooler service, `spoolsv.exe`, under SYSTEM level permissions on boot.(Citation: Bloxham)" ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1547 . + +d3f:T1547.011 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Plist Modification" ; + d3f:attack-id "T1547.011" ; + d3f:definition "Adversaries can modify property list files (plist files) to execute their code as part of establishing persistence. Plist files are used by macOS applications to store properties and configuration settings for applications and services. Applications use information plist files, Info.plist, to tell the operating system how to handle the application at runtime using structured metadata in the form of keys and values. Plist files are formatted in XML and based on Apple's Core Foundation DTD and can be saved in text or binary format.(Citation: fileinfo plist file description)" ; + d3f:modifies d3f:ApplicationConfigurationFile ; + rdfs:comment "This technique has been revoked by T1647" ; + rdfs:seeAlso "T1647" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ApplicationConfigurationFile ], + d3f:T1547 ; + owl:deprecated true . + +d3f:T1547.012 a owl:Class ; + rdfs:label "Print Processors" ; + d3f:attack-id "T1547.012" ; + d3f:definition "Adversaries may abuse print processors to run malicious DLLs during system boot for persistence and/or privilege escalation. Print processors are DLLs that are loaded by the print spooler service, `spoolsv.exe`, during boot.(Citation: Microsoft Intro Print Processors)" ; + rdfs:subClassOf d3f:T1547 . + +d3f:T1547.013 a owl:Class ; + rdfs:label "XDG Autostart Entries" ; + d3f:attack-id "T1547.013" ; + d3f:definition "Adversaries may add or modify XDG Autostart Entries to execute malicious programs or commands when a user’s desktop environment is loaded at login. XDG Autostart entries are available for any XDG-compliant Linux system. XDG Autostart entries use Desktop Entry files (`.desktop`) to configure the user’s desktop environment upon user login. These configuration files determine what applications launch upon user login, define associated applications to open specific file types, and define applications used to open removable media.(Citation: Free Desktop Application Autostart Feb 2006)(Citation: Free Desktop Entry Keys)" ; + rdfs:subClassOf d3f:T1547 . + +d3f:T1547.014 a owl:Class ; + rdfs:label "Active Setup" ; + d3f:attack-id "T1547.014" ; + d3f:definition "Adversaries may achieve persistence by adding a Registry key to the Active Setup of the local machine. Active Setup is a Windows mechanism that is used to execute programs when a user logs in. The value stored in the Registry key will be executed after a user logs into the computer.(Citation: Klein Active Setup 2010) These programs will be executed under the context of the user and will have the account's associated permissions level." ; + rdfs:subClassOf d3f:T1547 . + +d3f:T1547.015 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Login Items" ; + d3f:attack-id "T1547.015" ; + d3f:definition "Adversaries may add login items to execute upon user login to gain persistence or escalate privileges. Login items are applications, documents, folders, or server connections that are automatically launched when a user logs in.(Citation: Open Login Items Apple) Login items can be added via a shared file list or Service Management Framework.(Citation: Adding Login Items) Shared file list login items can be set using scripting languages such as [AppleScript](https://attack.mitre.org/techniques/T1059/002), whereas the Service Management Framework uses the API call SMLoginItemSetEnabled." ; + d3f:modifies d3f:UserLogonInitResource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:UserLogonInitResource ], + d3f:T1547 . + +d3f:T1548.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Setuid and Setgid" ; + d3f:attack-id "T1548.001" ; + d3f:definition "An adversary may abuse configurations where an application has the setuid or setgid bits set in order to get code running in a different (and possibly more privileged) user’s context. On Linux or macOS, when the setuid or setgid bits are set for an application binary, the application will run with the privileges of the owning user or group respectively.(Citation: setuid man page) Normally an application is run in the current user’s context, regardless of which user or group owns the application. However, there are instances where programs need to be executed in an elevated context to function properly, but the user running them may not have the specific required privileges." ; + d3f:modifies d3f:AccessControlConfiguration ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:AccessControlConfiguration ], + d3f:T1548 . + +d3f:T1548.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bypass User Account Control" ; + d3f:attack-id "T1548.002" ; + d3f:definition "Adversaries may bypass UAC mechanisms to elevate process privileges on system. Windows User Account Control (UAC) allows a program to elevate its privileges (tracked as integrity levels ranging from low to high) to perform a task under administrator-level permissions, possibly by prompting the user for confirmation. The impact to the user ranges from denying the operation under high enforcement to allowing the user to perform the action if they are in the local administrators group and click through the prompt or allowing them to enter an administrator password to complete the action.(Citation: TechNet How UAC Works)" ; + d3f:executes d3f:ExecutableFile ; + d3f:invokes d3f:CreateProcess ; + d3f:may-modify d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:T1548 . + +d3f:T1548.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Sudo and Sudo Caching" ; + d3f:attack-id "T1548.003" ; + d3f:definition "Adversaries may perform sudo caching and/or use the sudoers file to elevate privileges. Adversaries may do this to execute commands as other users or spawn processes with higher privileges." ; + d3f:may-modify d3f:EventLog ; + d3f:modifies d3f:OperatingSystemConfigurationFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:EventLog ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:OperatingSystemConfigurationFile ], + d3f:T1548 . + +d3f:T1548.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Elevated Execution with Prompt" ; + d3f:attack-id "T1548.004" ; + d3f:creates d3f:SystemConfigurationDatabase ; + d3f:definition "Adversaries may leverage the AuthorizationExecuteWithPrivileges API to escalate privileges by prompting the user for credentials.(Citation: AppleDocs AuthorizationExecuteWithPrivileges) The purpose of this API is to give application developers an easy way to perform operations with root privileges, such as for application installation or updating. This API does not validate that the program requesting root privileges comes from a reputable source or has been maliciously modified." ; + d3f:invokes d3f:SystemCall ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SystemCall ], + [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + d3f:T1548 . + +d3f:T1548.005 a owl:Class ; + rdfs:label "Temporary Elevated Cloud Access" ; + d3f:attack-id "T1548.005" ; + d3f:definition "Adversaries may abuse permission configurations that allow them to gain temporarily elevated access to cloud resources. Many cloud environments allow administrators to grant user or service accounts permission to request just-in-time access to roles, impersonate other accounts, pass roles onto resources and services, or otherwise gain short-term access to a set of privileges that may be distinct from their own." ; + rdfs:subClassOf d3f:T1548 . + +d3f:T1548.006 a owl:Class ; + rdfs:label "TCC Manipulation" ; + d3f:attack-id "T1548.006" ; + d3f:definition "Adversaries can manipulate or abuse the Transparency, Consent, & Control (TCC) service or database to execute malicious applications with elevated permissions. TCC is a Privacy & Security macOS control mechanism used to determine if the running process has permission to access the data or services protected by TCC, such as screen sharing, camera, microphone, or Full Disk Access (FDA)." ; + rdfs:subClassOf d3f:T1548 . + +d3f:T1550.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Access Token" ; + d3f:attack-id "T1550.001" ; + d3f:definition "Adversaries may use stolen application access tokens to bypass the typical authentication process and access restricted accounts, information, or services on remote systems. These tokens are typically stolen from users or services and used in lieu of login credentials." ; + d3f:may-produce d3f:NetworkTraffic ; + d3f:uses d3f:AccessToken ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-produce ; + owl:someValuesFrom d3f:NetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:AccessToken ], + d3f:T1550 . + +d3f:T1550.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pass the Hash" ; + d3f:attack-id "T1550.002" ; + d3f:creates d3f:Authentication ; + d3f:definition "Adversaries may “pass the hash” using stolen password hashes to move laterally within an environment, bypassing normal system access controls. Pass the hash (PtH) is a method of authenticating as a user without having access to the user's cleartext password. This method bypasses standard authentication steps that require a cleartext password, moving directly into the portion of the authentication that uses the password hash." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:Authentication ], + d3f:T1550 . + +d3f:T1550.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pass the Ticket" ; + d3f:attack-id "T1550.003" ; + d3f:creates d3f:Authentication ; + d3f:definition "Adversaries may “pass the ticket” using stolen Kerberos tickets to move laterally within an environment, bypassing normal system access controls. Pass the ticket (PtT) is a method of authenticating to a system using Kerberos tickets without having access to an account's password. Kerberos authentication can be used as the first step to lateral movement to a remote system." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:Authentication ], + d3f:T1550 . + +d3f:T1550.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Session Cookie" ; + d3f:adds d3f:SessionCookie ; + d3f:attack-id "T1550.004" ; + d3f:definition "Adversaries can use stolen session cookies to authenticate to web applications and services. This technique bypasses some multi-factor authentication protocols since the session is already authenticated.(Citation: Pass The Cookie)" ; + d3f:produces d3f:WebNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:WebNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:SessionCookie ], + d3f:T1550 . + +d3f:T1552.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Credentials In Files" ; + d3f:accesses d3f:File ; + d3f:attack-id "T1552.001" ; + d3f:definition "Adversaries may search local file systems and remote file shares for files containing insecurely stored credentials. These can be files created by users to store their own credentials, shared credential stores for a group of individuals, configuration files containing passwords for a system or service, or source code/binary files containing embedded passwords." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:File ], + d3f:T1552 . + +d3f:T1552.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Credentials in Registry" ; + d3f:accesses d3f:SystemConfigurationDatabase ; + d3f:attack-id "T1552.002" ; + d3f:definition "Adversaries may search the Registry on compromised systems for insecurely stored credentials. The Windows Registry stores configuration information that can be used by the system or other programs. Adversaries may query the Registry looking for credentials and passwords that have been stored for use by other programs or services. Sometimes these credentials are used for automatic logons." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + d3f:T1552 . + +d3f:T1552.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bash History" ; + d3f:accesses d3f:CommandHistoryLogFile ; + d3f:attack-id "T1552.003" ; + d3f:definition "Adversaries may search the bash command history on compromised systems for insecurely stored credentials. Bash keeps track of the commands users type on the command-line with the \"history\" utility. Once a user logs out, the history is flushed to the user’s .bash_history file. For each user, this file resides at the same location: ~/.bash_history. Typically, this file keeps track of the user’s last 500 commands. Users often type usernames and passwords on the command-line as parameters to programs, which then get saved to this file when they log out. Adversaries can abuse this by looking through the file for potential credentials. (Citation: External to DA, the OS X Way)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:CommandHistoryLogFile ], + d3f:T1552 . + +d3f:T1552.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Private Keys" ; + d3f:accesses d3f:PrivateKey ; + d3f:attack-id "T1552.004" ; + d3f:definition "Adversaries may search for private key certificate files on compromised systems for insecurely stored credentials. Private cryptographic keys and certificates are used for authentication, encryption/decryption, and digital signatures.(Citation: Wikipedia Public Key Crypto) Common key and certificate file extensions include: .key, .pgp, .gpg, .ppk., .p12, .pem, .pfx, .cer, .p7b, .asc." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:PrivateKey ], + d3f:T1552 . + +d3f:T1552.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Instance Metadata API" ; + d3f:accesses d3f:CloudInstanceMetadata ; + d3f:attack-id "T1552.005" ; + d3f:definition "Adversaries may attempt to access the Cloud Instance Metadata API to collect credentials and other sensitive data." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:CloudInstanceMetadata ], + d3f:T1552 . + +d3f:T1552.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Group Policy Preferences" ; + d3f:accesses d3f:GroupPolicy ; + d3f:attack-id "T1552.006" ; + d3f:definition "Adversaries may attempt to find unsecured credentials in Group Policy Preferences (GPP). GPP are tools that allow administrators to create domain policies with embedded credentials. These policies allow administrators to set local accounts.(Citation: Microsoft GPP 2016)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:GroupPolicy ], + d3f:T1552 . + +d3f:T1552.007 a owl:Class ; + rdfs:label "Container API" ; + d3f:attack-id "T1552.007" ; + d3f:definition "Adversaries may gather credentials via APIs within a containers environment. APIs in these environments, such as the Docker API and Kubernetes APIs, allow a user to remotely manage their container resources and cluster components.(Citation: Docker API)(Citation: Kubernetes API)" ; + rdfs:subClassOf d3f:T1552 . + +d3f:T1552.008 a owl:Class ; + rdfs:label "Chat Messages" ; + d3f:attack-id "T1552.008" ; + d3f:definition "Adversaries may directly collect unsecured credentials stored or passed through user communication services. Credentials may be sent and stored in user chat communication applications such as email, chat services like Slack or Teams, collaboration tools like Jira or Trello, and any other services that support user communication. Users may share various forms of credentials (such as usernames and passwords, API keys, or authentication tokens) on private or public corporate internal communications channels." ; + rdfs:subClassOf d3f:T1552 . + +d3f:T1553.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Gatekeeper Bypass" ; + d3f:attack-id "T1553.001" ; + d3f:definition "Adversaries may modify file attributes and subvert Gatekeeper functionality to evade user prompts and execute untrusted programs. Gatekeeper is a set of technologies that act as layer of Apple’s security model to ensure only trusted applications are executed on a host. Gatekeeper was built on top of File Quarantine in Snow Leopard (10.6, 2009) and has grown to include Code Signing, security policy compliance, Notarization, and more. Gatekeeper also treats applications running for the first time differently than reopened applications.(Citation: TheEclecticLightCompany Quarantine and the flag)(Citation: TheEclecticLightCompany apple notarization )" ; + d3f:modifies d3f:FileSystemMetadata ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:FileSystemMetadata ], + d3f:T1553 . + +d3f:T1553.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Code Signing" ; + d3f:attack-id "T1553.002" ; + d3f:definition "Adversaries may create, acquire, or steal code signing materials to sign their malware or tools. Code signing provides a level of authenticity on a binary from the developer and a guarantee that the binary has not been tampered with. (Citation: Wikipedia Code Signing) The certificates used during an operation may be created, acquired, or stolen by the adversary. (Citation: Securelist Digital Certificates) (Citation: Symantec Digital Certificates) Unlike [Invalid Code Signature](https://attack.mitre.org/techniques/T1036/001), this activity will result in a valid signature." ; + d3f:enables d3f:TA0005 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0005 ], + d3f:T1553 . + +d3f:T1553.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "SIP and Trust Provider Hijacking" ; + d3f:attack-id "T1553.003" ; + d3f:definition "Adversaries may tamper with SIP and trust provider components to mislead the operating system and application control tools when conducting signature validation checks. In user mode, Windows Authenticode (Citation: Microsoft Authenticode) digital signatures are used to verify a file's origin and integrity, variables that may be used to establish trust in signed code (ex: a driver with a valid Microsoft signature may be handled as safe). The signature validation process is handled via the WinVerifyTrust application programming interface (API) function, (Citation: Microsoft WinVerifyTrust) which accepts an inquiry and coordinates with the appropriate trust provider, which is responsible for validating parameters of a signature. (Citation: SpectorOps Subverting Trust Sept 2017)" ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1553 . + +d3f:T1553.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Install Root Certificate" ; + d3f:attack-id "T1553.004" ; + d3f:definition "Adversaries may install a root certificate on a compromised system to avoid warnings when connecting to adversary controlled web servers. Root certificates are used in public key cryptography to identify a root certificate authority (CA). When a root certificate is installed, the system or application will trust certificates in the root's chain of trust that have been signed by the root certificate.(Citation: Wikipedia Root Certificate) Certificates are commonly used for establishing secure TLS/SSL communications within a web browser. When a user attempts to browse a website that presents a certificate that is not trusted an error message will be displayed to warn the user of the security risk. Depending on the security settings, the browser may not allow the user to establish a connection to the website." ; + d3f:modifies d3f:CertificateTrustStore ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:CertificateTrustStore ], + d3f:T1553 . + +d3f:T1553.005 a owl:Class ; + rdfs:label "Mark-of-the-Web Bypass" ; + d3f:attack-id "T1553.005" ; + d3f:definition "Adversaries may abuse specific file formats to subvert Mark-of-the-Web (MOTW) controls. In Windows, when files are downloaded from the Internet, they are tagged with a hidden NTFS Alternate Data Stream (ADS) named Zone.Identifier with a specific value known as the MOTW.(Citation: Microsoft Zone.Identifier 2020) Files that are tagged with MOTW are protected and cannot perform certain actions. For example, starting in MS Office 10, if a MS Office file has the MOTW, it will open in Protected View. Executables tagged with the MOTW will be processed by Windows Defender SmartScreen that compares files with an allowlist of well-known executables. If the file is not known/trusted, SmartScreen will prevent the execution and warn the user not to run it.(Citation: Beek Use of VHD Dec 2020)(Citation: Outflank MotW 2020)(Citation: Intezer Russian APT Dec 2020)" ; + rdfs:subClassOf d3f:T1553 . + +d3f:T1553.006 a owl:Class ; + rdfs:label "Code Signing Policy Modification" ; + d3f:attack-id "T1553.006" ; + d3f:definition "Adversaries may modify code signing policies to enable execution of unsigned or self-signed code. Code signing provides a level of authenticity on a program from a developer and a guarantee that the program has not been tampered with. Security controls can include enforcement mechanisms to ensure that only valid, signed code can be run on an operating system." ; + rdfs:subClassOf d3f:T1553 . + +d3f:T1555.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Keychain" ; + d3f:accesses d3f:MacOSKeychain ; + d3f:attack-id "T1555.001" ; + d3f:definition "Adversaries may acquire credentials from Keychain. Keychain (or Keychain Services) is the macOS credential management system that stores account names, passwords, private keys, certificates, sensitive application data, payment data, and secure notes. There are three types of Keychains: Login Keychain, System Keychain, and Local Items (iCloud) Keychain. The default Keychain is the Login Keychain, which stores user passwords and information. The System Keychain stores items accessed by the operating system, such as items shared among users on a host. The Local Items (iCloud) Keychain is used for items synced with Apple’s iCloud service." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:MacOSKeychain ], + d3f:T1555 . + +d3f:T1555.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Securityd Memory" ; + d3f:accesses d3f:In-memoryPasswordStore ; + d3f:attack-id "T1555.002" ; + d3f:definition "An adversary with root access may gather credentials by reading `securityd`’s memory. `securityd` is a service/daemon responsible for implementing security protocols such as encryption and authorization.(Citation: Apple Dev SecurityD) A privileged adversary may be able to scan through `securityd`'s memory to find the correct sequence of keys to decrypt the user’s logon keychain. This may provide the adversary with various plaintext passwords, such as those for users, WiFi, mail, browsers, certificates, secure notes, etc.(Citation: OS X Keychain)(Citation: OSX Keydnap malware)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:In-memoryPasswordStore ], + d3f:T1555 . + +d3f:T1555.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Credentials from Web Browsers" ; + d3f:accesses d3f:DatabaseFile ; + d3f:attack-id "T1555.003" ; + d3f:definition "Adversaries may acquire credentials from web browsers by reading files specific to the target browser.(Citation: Talos Olympic Destroyer 2018) Web browsers commonly save credentials such as website usernames and passwords so that they do not need to be entered manually in the future. Web browsers typically store the credentials in an encrypted format within a credential store; however, methods exist to extract plaintext credentials from web browsers." ; + d3f:may-access d3f:In-memoryPasswordStore ; + d3f:may-invoke d3f:ReadFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:In-memoryPasswordStore ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:DatabaseFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:ReadFile ], + d3f:T1555 . + +d3f:T1555.004 a owl:Class ; + rdfs:label "Windows Credential Manager" ; + d3f:attack-id "T1555.004" ; + d3f:definition "Adversaries may acquire credentials from the Windows Credential Manager. The Credential Manager stores credentials for signing into websites, applications, and/or devices that request authentication through NTLM or Kerberos in Credential Lockers (previously known as Windows Vaults).(Citation: Microsoft Credential Manager store)(Citation: Microsoft Credential Locker)" ; + rdfs:subClassOf d3f:T1555 . + +d3f:T1555.005 a owl:Class ; + rdfs:label "Password Managers" ; + d3f:attack-id "T1555.005" ; + d3f:definition "Adversaries may acquire user credentials from third-party password managers.(Citation: ise Password Manager February 2019) Password managers are applications designed to store user credentials, normally in an encrypted database. Credentials are typically accessible after a user provides a master password that unlocks the database. After the database is unlocked, these credentials may be copied to memory. These databases can be stored as files on disk.(Citation: ise Password Manager February 2019)" ; + rdfs:subClassOf d3f:T1555 . + +d3f:T1555.006 a owl:Class ; + rdfs:label "Cloud Secrets Management Stores" ; + d3f:attack-id "T1555.006" ; + d3f:definition "Adversaries may acquire credentials from cloud-native secret management solutions such as AWS Secrets Manager, GCP Secret Manager, Azure Key Vault, and Terraform Vault." ; + rdfs:subClassOf d3f:T1555 . + +d3f:T1556.001 a owl:Class ; + rdfs:label "Domain Controller Authentication" ; + d3f:attack-id "T1556.001" ; + d3f:definition "Adversaries may patch the authentication process on a domain controller to bypass the typical authentication mechanisms and enable access to accounts." ; + rdfs:subClassOf d3f:T1556 . + +d3f:T1556.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Password Filter DLL" ; + d3f:attack-id "T1556.002" ; + d3f:creates d3f:SharedLibraryFile ; + d3f:definition "Adversaries may register malicious password filter dynamic link libraries (DLLs) into the authentication process to acquire user credentials as they are validated." ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:SharedLibraryFile ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:T1556 . + +d3f:T1556.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pluggable Authentication Modules" ; + d3f:attack-id "T1556.003" ; + d3f:definition "Adversaries may modify pluggable authentication modules (PAM) to access user credentials or enable otherwise unwarranted access to accounts. PAM is a modular system of configuration files, libraries, and executable files which guide authentication for many services. The most common authentication module is pam_unix.so, which retrieves, sets, and verifies account authentication information in /etc/passwd and /etc/shadow.(Citation: Apple PAM)(Citation: Man Pam_Unix)(Citation: Red Hat PAM)" ; + d3f:may-modify d3f:OperatingSystemConfigurationFile, + d3f:OperatingSystemSharedLibraryFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:OperatingSystemConfigurationFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:OperatingSystemSharedLibraryFile ], + d3f:T1556 . + +d3f:T1556.004 a owl:Class ; + rdfs:label "Network Device Authentication" ; + d3f:attack-id "T1556.004" ; + d3f:definition "Adversaries may use [Patch System Image](https://attack.mitre.org/techniques/T1601/001) to hard code a password in the operating system, thus bypassing of native authentication mechanisms for local accounts on network devices." ; + rdfs:subClassOf d3f:T1556 . + +d3f:T1556.005 a owl:Class ; + rdfs:label "Reversible Encryption" ; + d3f:attack-id "T1556.005" ; + d3f:definition "An adversary may abuse Active Directory authentication encryption properties to gain access to credentials on Windows systems. The AllowReversiblePasswordEncryption property specifies whether reversible password encryption for an account is enabled or disabled. By default this property is disabled (instead storing user credentials as the output of one-way hashing functions) and should not be enabled unless legacy or other software require it.(Citation: store_pwd_rev_enc)" ; + rdfs:subClassOf d3f:T1556 . + +d3f:T1556.006 a owl:Class ; + rdfs:label "Multi-Factor Authentication" ; + d3f:attack-id "T1556.006" ; + d3f:definition "Adversaries may disable or modify multi-factor authentication (MFA) mechanisms to enable persistent access to compromised accounts." ; + rdfs:subClassOf d3f:T1556 . + +d3f:T1556.007 a owl:Class ; + rdfs:label "Hybrid Identity" ; + d3f:attack-id "T1556.007" ; + d3f:definition "Adversaries may patch, modify, or otherwise backdoor cloud authentication processes that are tied to on-premises user identities in order to bypass typical authentication mechanisms, access credentials, and enable persistent access to accounts." ; + rdfs:subClassOf d3f:T1556 . + +d3f:T1556.008 a owl:Class ; + rdfs:label "Network Provider DLL" ; + d3f:attack-id "T1556.008" ; + d3f:definition "Adversaries may register malicious network provider dynamic link libraries (DLLs) to capture cleartext user credentials during the authentication process. Network provider DLLs allow Windows to interface with specific network protocols and can also support add-on credential management functions.(Citation: Network Provider API) During the logon process, Winlogon (the interactive logon module) sends credentials to the local `mpnotify.exe` process via RPC. The `mpnotify.exe` process then shares the credentials in cleartext with registered credential managers when notifying that a logon event is happening.(Citation: NPPSPY - Huntress)(Citation: NPPSPY Video)(Citation: NPLogonNotify)" ; + rdfs:subClassOf d3f:T1556 . + +d3f:T1556.009 a owl:Class ; + rdfs:label "Conditional Access Policies" ; + d3f:attack-id "T1556.009" ; + d3f:definition "Adversaries may disable or modify conditional access policies to enable persistent access to compromised accounts. Conditional access policies are additional verifications used by identity providers and identity and access management systems to determine whether a user should be granted access to a resource." ; + rdfs:subClassOf d3f:T1556 . + +d3f:T1557.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "LLMNR/NBT-NS Poisoning and SMB Relay" ; + d3f:attack-id "T1557.001" ; + d3f:definition "By responding to LLMNR/NBT-NS network traffic, adversaries may spoof an authoritative source for name resolution to force communication with an adversary controlled system. This activity may be used to collect or relay authentication materials." ; + d3f:produces d3f:IntranetMulticastNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetMulticastNetworkTraffic ], + d3f:T1557 . + +d3f:T1557.002 a owl:Class ; + rdfs:label "ARP Cache Poisoning" ; + d3f:attack-id "T1557.002" ; + d3f:definition "Adversaries may poison Address Resolution Protocol (ARP) caches to position themselves between the communication of two or more networked devices. This activity may be used to enable follow-on behaviors such as [Network Sniffing](https://attack.mitre.org/techniques/T1040) or [Transmitted Data Manipulation](https://attack.mitre.org/techniques/T1565/002)." ; + rdfs:subClassOf d3f:T1557 . + +d3f:T1557.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "DHCP Spoofing" ; + d3f:attack-id "T1557.003" ; + d3f:creates d3f:DHCPNetworkTraffic ; + d3f:definition "Adversaries may redirect network traffic to adversary-owned systems by spoofing Dynamic Host Configuration Protocol (DHCP) traffic and acting as a malicious DHCP server on the victim network. By achieving the adversary-in-the-middle (AiTM) position, adversaries may collect network communications, including passed credentials, especially those sent over insecure, unencrypted protocols. This may also enable follow-on behaviors such as [Network Sniffing](https://attack.mitre.org/techniques/T1040) or [Transmitted Data Manipulation](https://attack.mitre.org/techniques/T1565/002)." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:DHCPNetworkTraffic ], + d3f:T1557 . + +d3f:T1557.004 a owl:Class ; + rdfs:label "Evil Twin" ; + d3f:attack-id "T1557.004" ; + d3f:definition "Adversaries may host seemingly genuine Wi-Fi access points to deceive users into connecting to malicious networks as a way of supporting follow-on behaviors such as [Network Sniffing](https://attack.mitre.org/techniques/T1040), [Transmitted Data Manipulation](https://attack.mitre.org/techniques/T1565/002), or [Input Capture](https://attack.mitre.org/techniques/T1056).(Citation: Australia ‘Evil Twin’)" ; + rdfs:subClassOf d3f:T1557 . + +d3f:T1558.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Golden Ticket" ; + d3f:attack-id "T1558.001" ; + d3f:definition "Adversaries who have the KRBTGT account password hash may forge Kerberos ticket-granting tickets (TGT), also known as a golden ticket.(Citation: AdSecurity Kerberos GT Aug 2015) Golden tickets enable adversaries to generate authentication material for any account in Active Directory.(Citation: CERT-EU Golden Ticket Protection)" ; + d3f:forges d3f:KerberosTicketGrantingTicket ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:forges ; + owl:someValuesFrom d3f:KerberosTicketGrantingTicket ], + d3f:T1558 . + +d3f:T1558.002 a owl:Class ; + rdfs:label "Silver Ticket" ; + d3f:attack-id "T1558.002" ; + d3f:definition "Adversaries who have the password hash of a target service account (e.g. SharePoint, MSSQL) may forge Kerberos ticket granting service (TGS) tickets, also known as silver tickets. Kerberos TGS tickets are also known as service tickets.(Citation: ADSecurity Silver Tickets)" ; + rdfs:subClassOf d3f:T1558 . + +d3f:T1558.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kerberoasting" ; + d3f:attack-id "T1558.003" ; + d3f:definition "Service Provider Name (SPN) scanning is one way to gather hashes, which results in RPC calls conforming to the NSPI protocol." ; + d3f:may-produce d3f:RPCNetworkTraffic ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-produce ; + owl:someValuesFrom d3f:RPCNetworkTraffic ], + d3f:T1558 . + +d3f:T1558.004 a owl:Class ; + rdfs:label "AS-REP Roasting" ; + d3f:attack-id "T1558.004" ; + d3f:definition "Adversaries may reveal credentials of accounts that have disabled Kerberos preauthentication by [Password Cracking](https://attack.mitre.org/techniques/T1110/002) Kerberos messages.(Citation: Harmj0y Roasting AS-REPs Jan 2017)" ; + rdfs:subClassOf d3f:T1558 . + +d3f:T1558.005 a owl:Class ; + rdfs:label "Ccache Files" ; + d3f:attack-id "T1558.005" ; + d3f:definition "Adversaries may attempt to steal Kerberos tickets stored in credential cache files (or ccache). These files are used for short term storage of a user's active session credentials. The ccache file is created upon user authentication and allows for access to multiple services without the user having to re-enter credentials." ; + rdfs:subClassOf d3f:T1558 . + +d3f:T1559.001 a owl:Class ; + rdfs:label "Component Object Model" ; + d3f:attack-id "T1559.001" ; + d3f:definition "Adversaries may use the Windows Component Object Model (COM) for local code execution. COM is an inter-process communication (IPC) component of the native Windows application programming interface (API) that enables interaction between software objects, or executable code that implements one or more interfaces.(Citation: Fireeye Hunting COM June 2019) Through COM, a client object can call methods of server objects, which are typically binary Dynamic Link Libraries (DLL) or executables (EXE).(Citation: Microsoft COM) Remote COM execution is facilitated by [Remote Services](https://attack.mitre.org/techniques/T1021) such as [Distributed Component Object Model](https://attack.mitre.org/techniques/T1021/003) (DCOM).(Citation: Fireeye Hunting COM June 2019)" ; + rdfs:subClassOf d3f:T1559 . + +d3f:T1559.002 a owl:Class ; + rdfs:label "Dynamic Data Exchange" ; + d3f:attack-id "T1559.002" ; + d3f:definition "Adversaries may use Windows Dynamic Data Exchange (DDE) to execute arbitrary commands. DDE is a client-server protocol for one-time and/or continuous inter-process communication (IPC) between applications. Once a link is established, applications can autonomously exchange transactions consisting of strings, warm data links (notifications when a data item changes), hot data links (duplications of changes to a data item), and requests for command execution." ; + rdfs:subClassOf d3f:T1559 . + +d3f:T1559.003 a owl:Class ; + rdfs:label "XPC Services" ; + d3f:attack-id "T1559.003" ; + d3f:definition "Adversaries can provide malicious content to an XPC service daemon for local code execution. macOS uses XPC services for basic inter-process communication between various processes, such as between the XPC Service daemon and third-party application privileged helper tools. Applications can send messages to the XPC Service daemon, which runs as root, using the low-level XPC Service C API or the high level NSXPCConnection API in order to handle tasks that require elevated privileges (such as network connections). Applications are responsible for providing the protocol definition which serves as a blueprint of the XPC services. Developers typically use XPC Services to provide applications stability and privilege separation between the application client and the daemon.(Citation: creatingXPCservices)(Citation: Designing Daemons Apple Dev)" ; + rdfs:subClassOf d3f:T1559 . + +d3f:T1560.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Archive via Utility" ; + d3f:attack-id "T1560.001" ; + d3f:creates d3f:ArchiveFile ; + d3f:definition "Adversaries may use utilities to compress and/or encrypt collected data prior to exfiltration. Many utilities include functionalities to compress, encrypt, or otherwise package data into a format that is easier/more secure to transport." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ArchiveFile ], + d3f:T1560 . + +d3f:T1560.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Archive via Library" ; + d3f:attack-id "T1560.002" ; + d3f:creates d3f:ArchiveFile ; + d3f:definition "An adversary may compress or encrypt data that is collected prior to exfiltration using 3rd party libraries. Many libraries exist that can archive data, including [Python](https://attack.mitre.org/techniques/T1059/006) rarfile (Citation: PyPI RAR), libzip (Citation: libzip), and zlib (Citation: Zlib Github). Most libraries include functionality to encrypt and/or compress data." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ArchiveFile ], + d3f:T1560 . + +d3f:T1560.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Archive via Custom Method" ; + d3f:attack-id "T1560.003" ; + d3f:creates d3f:CustomArchiveFile ; + d3f:definition "An adversary may compress or encrypt data that is collected prior to exfiltration using a custom method. Adversaries may choose to use custom archival methods, such as encryption with XOR or stream ciphers implemented with no external library or utility references. Custom implementations of well-known compression algorithms have also been used.(Citation: ESET Sednit Part 2)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:CustomArchiveFile ], + d3f:T1560 . + +d3f:T1561.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Disk Content Wipe" ; + d3f:attack-id "T1561.001" ; + d3f:definition "Adversaries may erase the contents of storage devices on specific systems or in large numbers in a network to interrupt availability to system and network resources." ; + d3f:may-modify d3f:BootSector, + d3f:Partition, + d3f:PartitionTable, + d3f:Volume ; + d3f:modifies d3f:BlockDevice ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:Volume ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:PartitionTable ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:BlockDevice ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:BootSector ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:Partition ], + d3f:T1561 . + +d3f:T1561.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Disk Structure Wipe" ; + d3f:attack-id "T1561.002" ; + d3f:definition "Adversaries may corrupt or wipe the disk data structures on a hard drive necessary to boot a system; targeting specific critical systems or in large numbers in a network to interrupt availability to system and network resources." ; + d3f:may-modify d3f:BootSector, + d3f:PartitionTable ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:BootSector ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:PartitionTable ], + d3f:T1561 . + +d3f:T1562.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Disable or Modify Tools" ; + d3f:attack-id "T1562.001" ; + d3f:definition "Adversaries may modify and/or disable security tools to avoid possible detection of their malware/tools and activities. This may take many forms, such as killing security software processes or services, modifying / deleting Registry keys or configuration files so that tools do not operate properly, or other methods to interfere with security tools scanning or reporting information. Adversaries may also disable updates to prevent the latest security patches from reaching tools on victim systems.(Citation: SCADAfence_ransomware)" ; + d3f:disables d3f:OperatingSystemProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:disables ; + owl:someValuesFrom d3f:OperatingSystemProcess ], + d3f:T1562 . + +d3f:T1562.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Disable Windows Event Logging" ; + d3f:attack-id "T1562.002" ; + d3f:definition "Adversaries may disable Windows event logging to limit data that can be leveraged for detections and audits. Windows event logs record user and system activity such as login attempts, process creation, and much more.(Citation: Windows Log Events) This data is used by security tools and analysts to generate detections." ; + d3f:may-modify d3f:ApplicationConfiguration, + d3f:OperatingSystemConfigurationComponent ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:OperatingSystemConfigurationComponent ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ApplicationConfiguration ], + d3f:T1562 . + +d3f:T1562.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Impair Command History Logging" ; + d3f:attack-id "T1562.003" ; + d3f:definition "Adversaries may impair command history logging to hide commands they run on a compromised system. Various command interpreters keep track of the commands users type in their terminal so that users can retrace what they've done." ; + d3f:may-modify d3f:UserInitScript, + d3f:WindowsRegistryKey ; + d3f:modifies d3f:ProcessEnvironmentVariable ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:UserInitScript ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:WindowsRegistryKey ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ProcessEnvironmentVariable ], + d3f:T1562 . + +d3f:T1562.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Disable or Modify System Firewall" ; + d3f:attack-id "T1562.004" ; + d3f:definition "Adversaries may disable or modify system firewalls in order to bypass controls limiting network usage. Changes could be disabling the entire mechanism as well as adding, deleting, or modifying particular rules. This can be done numerous ways depending on the operating system, including via command-line, editing Windows Registry keys, and Windows Control Panel." ; + d3f:modifies d3f:SystemFirewallConfiguration ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemFirewallConfiguration ], + d3f:T1562 . + +d3f:T1562.006 a owl:Class ; + rdfs:label "Indicator Blocking" ; + d3f:attack-id "T1562.006" ; + d3f:definition "An adversary may attempt to block indicators or events typically captured by sensors from being gathered and analyzed. This could include maliciously redirecting(Citation: Microsoft Lamin Sept 2017) or even disabling host-based sensors, such as Event Tracing for Windows (ETW)(Citation: Microsoft About Event Tracing 2018), by tampering settings that control the collection and flow of event telemetry.(Citation: Medium Event Tracing Tampering 2018) These settings may be stored on the system in configuration files and/or in the Registry as well as being accessible via administrative utilities such as [PowerShell](https://attack.mitre.org/techniques/T1059/001) or [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047)." ; + rdfs:subClassOf d3f:T1562 . + +d3f:T1562.007 a owl:Class ; + rdfs:label "Disable or Modify Cloud Firewall" ; + d3f:attack-id "T1562.007" ; + d3f:definition "Adversaries may disable or modify a firewall within a cloud environment to bypass controls that limit access to cloud resources. Cloud firewalls are separate from system firewalls that are described in [Disable or Modify System Firewall](https://attack.mitre.org/techniques/T1562/004)." ; + rdfs:subClassOf d3f:T1562 . + +d3f:T1562.008 a owl:Class ; + rdfs:label "Disable or Modify Cloud Logs" ; + d3f:attack-id "T1562.008" ; + d3f:definition "An adversary may disable or modify cloud logging capabilities and integrations to limit what data is collected on their activities and avoid detection. Cloud environments allow for collection and analysis of audit and application logs that provide insight into what activities a user does within the environment. If an adversary has sufficient permissions, they can disable or modify logging to avoid detection of their activities." ; + rdfs:subClassOf d3f:T1562 . + +d3f:T1562.009 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Safe Mode Boot" ; + d3f:attack-id "T1562.009" ; + d3f:definition "Adversaries may abuse Windows safe mode to disable endpoint defenses. Safe mode starts up the Windows operating system with a limited set of drivers and services. Third-party security software such as endpoint detection and response (EDR) tools may not start after booting Windows in safe mode. There are two versions of safe mode: Safe Mode and Safe Mode with Networking. It is possible to start additional services after a safe mode boot.(Citation: Microsoft Safe Mode)(Citation: Sophos Snatch Ransomware 2019)" ; + d3f:disables d3f:EndpointSensor, + d3f:SystemConfigurationInitDatabaseRecord ; + d3f:may-modify d3f:EndpointHealthBeacon ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:EndpointHealthBeacon ], + [ a owl:Restriction ; + owl:onProperty d3f:disables ; + owl:someValuesFrom d3f:EndpointSensor ], + [ a owl:Restriction ; + owl:onProperty d3f:disables ; + owl:someValuesFrom d3f:SystemConfigurationInitDatabaseRecord ], + d3f:T1562 . + +d3f:T1562.010 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Downgrade Attack" ; + d3f:accesses d3f:LegacySystem ; + d3f:attack-id "T1562.010" ; + d3f:definition "Adversaries may downgrade or use a version of system features that may be outdated, vulnerable, and/or does not support updated security controls. Downgrade attacks typically take advantage of a system’s backward compatibility to force it into less secure modes of operation." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:LegacySystem ], + d3f:T1562 . + +d3f:T1562.011 a owl:Class ; + rdfs:label "Spoof Security Alerting" ; + d3f:attack-id "T1562.011" ; + d3f:definition "Adversaries may spoof security alerting from tools, presenting false evidence to impair defenders’ awareness of malicious activity.(Citation: BlackBasta) Messages produced by defensive tools contain information about potential security events as well as the functioning status of security software and the system. Security reporting messages are important for monitoring the normal operation of a system and identifying important events that can signal a security incident." ; + rdfs:subClassOf d3f:T1562 . + +d3f:T1562.012 a owl:Class ; + rdfs:label "Disable or Modify Linux Audit System" ; + d3f:attack-id "T1562.012" ; + d3f:definition "Adversaries may disable or modify the Linux audit system to hide malicious activity and avoid detection. Linux admins use the Linux Audit system to track security-relevant information on a system. The Linux Audit system operates at the kernel-level and maintains event logs on application and system activity such as process, network, file, and login events based on pre-configured rules." ; + rdfs:subClassOf d3f:T1562 . + +d3f:T1563.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "SSH Hijacking" ; + d3f:accesses d3f:SSHSession ; + d3f:attack-id "T1563.001" ; + d3f:definition "Adversaries may hijack a legitimate user's SSH session to move laterally within an environment. Secure Shell (SSH) is a standard means of remote access on Linux and macOS systems. It allows a user to connect to another system via an encrypted tunnel, commonly authenticating through a password, certificate or the use of an asymmetric encryption key pair." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:SSHSession ], + d3f:T1563 . + +d3f:T1563.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "RDP Hijacking" ; + d3f:accesses d3f:RDPSession ; + d3f:attack-id "T1563.002" ; + d3f:definition "Adversaries may hijack a legitimate user’s remote desktop session to move laterally within an environment. Remote desktop is a common feature in operating systems. It allows a user to log into an interactive session with a system desktop graphical user interface on a remote system. Microsoft refers to its implementation of the Remote Desktop Protocol (RDP) as Remote Desktop Services (RDS).(Citation: TechNet Remote Desktop Services)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:RDPSession ], + d3f:T1563 . + +d3f:T1564.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hidden Files and Directories" ; + d3f:attack-id "T1564.001" ; + d3f:definition "Adversaries may set files and directories to be hidden to evade detection mechanisms. To prevent normal users from accidentally changing special files on a system, most operating systems have the concept of a ‘hidden’ file. These files don’t show up when a user browses the file system with a GUI or when using normal commands on the command line. Users must explicitly ask to show the hidden files either via a series of Graphical User Interface (GUI) prompts or with command line switches (dir /a for Windows and ls –a for Linux and macOS)." ; + d3f:modifies d3f:FileSystemMetadata ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:FileSystemMetadata ], + d3f:T1564 . + +d3f:T1564.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hidden Users" ; + d3f:attack-id "T1564.002" ; + d3f:definition "Adversaries may use hidden users to hide the presence of user accounts they create or modify. Administrators may want to hide users when there are many user accounts on a given system or if they want to hide their administrative or other management accounts from other users." ; + d3f:modifies d3f:UserInitConfigurationFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:UserInitConfigurationFile ], + d3f:T1564 . + +d3f:T1564.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hidden Window" ; + d3f:attack-id "T1564.003" ; + d3f:definition "Adversaries may use hidden windows to conceal malicious activity from the plain sight of users. In some cases, windows that would typically be displayed when an application carries out an operation can be hidden. This may be utilized by system administrators to avoid disrupting user work environments when carrying out administrative tasks." ; + d3f:may-modify d3f:PropertyListFile, + d3f:SystemConfigurationDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:PropertyListFile ], + d3f:T1564 . + +d3f:T1564.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "NTFS File Attributes" ; + d3f:attack-id "T1564.004" ; + d3f:definition "Adversaries may use NTFS file attributes to hide their malicious data in order to evade detection. Every New Technology File System (NTFS) formatted partition contains a Master File Table (MFT) that maintains a record for every file/directory on the partition. (Citation: SpectorOps Host-Based Jul 2017) Within MFT entries are file attributes, (Citation: Microsoft NTFS File Attributes Aug 2010) such as Extended Attributes (EA) and Data [known as Alternate Data Streams (ADSs) when more than one Data attribute is present], that can be used to store arbitrary data (and even complete files). (Citation: SpectorOps Host-Based Jul 2017) (Citation: Microsoft File Streams) (Citation: MalwareBytes ADS July 2015) (Citation: Microsoft ADS Mar 2014)" ; + d3f:modifies d3f:FileSystemMetadata ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:FileSystemMetadata ], + d3f:T1564 . + +d3f:T1564.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hidden File System" ; + d3f:attack-id "T1564.005" ; + d3f:definition "Adversaries may use a hidden file system to conceal malicious activity from users and security tools. File systems provide a structure to store and access data from physical storage. Typically, a user engages with a file system through applications that allow them to access files and directories, which are an abstraction from their physical location (ex: disk sector). Standard file systems include FAT, NTFS, ext4, and APFS. File systems can also contain other structures, such as the Volume Boot Record (VBR) and Master File Table (MFT) in NTFS.(Citation: MalwareTech VFS Nov 2014)" ; + d3f:may-modify d3f:SystemConfigurationDatabase ; + d3f:modifies d3f:Storage ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:Storage ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + d3f:T1564 . + +d3f:T1564.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Run Virtual Instance" ; + d3f:attack-id "T1564.006" ; + d3f:creates d3f:File ; + d3f:definition "Adversaries may carry out malicious operations using a virtual instance to avoid detection. A wide variety of virtualization technologies exist that allow for the emulation of a computer or computing environment. By running malicious code inside of a virtual instance, adversaries can hide artifacts associated with their behavior from security tools that are unable to monitor activity inside the virtual instance. Additionally, depending on the virtual networking implementation (ex: bridged adapter), network traffic generated by the virtual instance can be difficult to trace back to the compromised host as the IP address and hostname might not match known values.(Citation: SingHealth Breach Jan 2019)" ; + d3f:executes d3f:VirtualizationSoftware ; + d3f:may-add d3f:VirtualizationSoftware ; + d3f:may-create d3f:Directory ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:may-add ; + owl:someValuesFrom d3f:VirtualizationSoftware ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:Directory ], + [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:VirtualizationSoftware ], + d3f:T1564 . + +d3f:T1564.007 a owl:Class, + owl:NamedIndividual ; + rdfs:label "VBA Stomping" ; + d3f:attack-id "T1564.007" ; + d3f:definition "Adversaries may hide malicious Visual Basic for Applications (VBA) payloads embedded within MS Office documents by replacing the VBA source code with benign data.(Citation: FireEye VBA stomp Feb 2020)" ; + d3f:modifies d3f:OfficeApplicationFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:OfficeApplicationFile ], + d3f:T1564 . + +d3f:T1564.008 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Email Hiding Rules" ; + d3f:attack-id "T1564.008" ; + d3f:definition "Adversaries may use email rules to hide inbound emails in a compromised user's mailbox. Many email clients allow users to create inbox rules for various email functions, including moving emails to other folders, marking emails as read, or deleting emails. Rules may be created or modified within email clients or through external features such as the New-InboxRule or Set-InboxRule [PowerShell](https://attack.mitre.org/techniques/T1059/001) cmdlets on Windows systems.(Citation: Microsoft Inbox Rules)(Citation: MacOS Email Rules)(Citation: Microsoft New-InboxRule)(Citation: Microsoft Set-InboxRule)" ; + d3f:may-create d3f:EmailRule ; + d3f:may-modify d3f:EmailRule ; + d3f:modifies d3f:ApplicationConfiguration ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ApplicationConfiguration ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:EmailRule ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:EmailRule ], + d3f:T1564 . + +d3f:T1564.009 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Resource Forking" ; + d3f:attack-id "T1564.009" ; + d3f:definition "Adversaries may abuse resource forks to hide malicious code or executables to evade detection and bypass security applications. A resource fork provides applications a structured way to store resources such as thumbnail images, menu definitions, icons, dialog boxes, and code.(Citation: macOS Hierarchical File System Overview) Usage of a resource fork is identifiable when displaying a file’s extended attributes, using ls -l@ or xattr -l commands. Resource forks have been deprecated and replaced with the application bundle structure. Non-localized resources are placed at the top level directory of an application bundle, while localized resources are placed in the /Resources folder.(Citation: Resource and Data Forks)(Citation: ELC Extended Attributes)" ; + d3f:may-create d3f:ResourceFork ; + d3f:may-modify d3f:ResourceFork ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:ResourceFork ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ResourceFork ], + d3f:T1564 . + +d3f:T1564.010 a owl:Class ; + rdfs:label "Process Argument Spoofing" ; + d3f:attack-id "T1564.010" ; + d3f:definition "Adversaries may attempt to hide process command-line arguments by overwriting process memory. Process command-line arguments are stored in the process environment block (PEB), a data structure used by Windows to store various information about/used by a process. The PEB includes the process command-line arguments that are referenced when executing the process. When a process is created, defensive tools/sensors that monitor process creations may retrieve the process arguments from the PEB.(Citation: Microsoft PEB 2021)(Citation: Xpn Argue Like Cobalt 2019)" ; + rdfs:subClassOf d3f:T1564 . + +d3f:T1564.011 a owl:Class ; + rdfs:label "Ignore Process Interrupts" ; + d3f:attack-id "T1564.011" ; + d3f:definition "Adversaries may evade defensive mechanisms by executing commands that hide from process interrupt signals. Many operating systems use signals to deliver messages to control process behavior. Command interpreters often include specific commands/flags that ignore errors and other hangups, such as when the user of the active session logs off.(Citation: Linux Signal Man) These interrupt signals may also be used by defensive tools and/or analysts to pause or terminate specified running processes." ; + rdfs:subClassOf d3f:T1564 . + +d3f:T1564.012 a owl:Class ; + rdfs:label "File/Path Exclusions" ; + d3f:attack-id "T1564.012" ; + d3f:definition "Adversaries may attempt to hide their file-based artifacts by writing them to specific folders or file names excluded from antivirus (AV) scanning and other defensive capabilities. AV and other file-based scanners often include exclusions to optimize performance as well as ease installation and legitimate use of applications. These exclusions may be contextual (e.g., scans are only initiated in response to specific triggering events/alerts), but are also often hardcoded strings referencing specific folders and/or files assumed to be trusted and legitimate.(Citation: Microsoft File Folder Exclusions)" ; + rdfs:subClassOf d3f:T1564 . + +d3f:T1565.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Stored Data Manipulation" ; + d3f:attack-id "T1565.001" ; + d3f:definition "Adversaries may insert, delete, or manipulate data at rest in order to influence external outcomes or hide activity, thus threatening the integrity of the data.(Citation: FireEye APT38 Oct 2018)(Citation: DOJ Lazarus Sony 2018) By manipulating stored data, adversaries may attempt to affect a business process, organizational understanding, and decision making." ; + d3f:modifies d3f:File ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:File ], + d3f:T1565 . + +d3f:T1565.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Transmitted Data Manipulation" ; + d3f:attack-id "T1565.002" ; + d3f:definition "Adversaries may alter data en route to storage or other systems in order to manipulate external outcomes or hide activity, thus threatening the integrity of the data.(Citation: FireEye APT38 Oct 2018)(Citation: DOJ Lazarus Sony 2018) By manipulating transmitted data, adversaries may attempt to affect a business process, organizational understanding, and decision making." ; + d3f:may-modify d3f:NetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:T1565 . + +d3f:T1565.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Runtime Data Manipulation" ; + d3f:attack-id "T1565.003" ; + d3f:definition "Adversaries may modify systems in order to manipulate the data as it is accessed and displayed to an end user, thus threatening the integrity of the data.(Citation: FireEye APT38 Oct 2018)(Citation: DOJ Lazarus Sony 2018) By manipulating runtime data, adversaries may attempt to affect a business process, organizational understanding, and decision making." ; + d3f:may-modify d3f:ExecutableFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:T1565 . + +d3f:T1566.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Spearphishing Attachment" ; + d3f:attack-id "T1566.001" ; + d3f:definition "Adversaries may send spearphishing emails with a malicious attachment in an attempt to gain access to victim systems. Spearphishing attachment is a specific variant of spearphishing. Spearphishing attachment is different from other forms of spearphishing in that it employs the use of malware attached to an email. All forms of spearphishing are electronically delivered social engineering targeted at a specific individual, company, or industry. In this scenario, adversaries attach a file to the spearphishing email and usually rely upon [User Execution](https://attack.mitre.org/techniques/T1204) to gain execution.(Citation: Unit 42 DarkHydrus July 2018) Spearphishing may also involve social engineering techniques, such as posing as a trusted source." ; + d3f:produces d3f:Email, + d3f:InboundInternetMailTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Email ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InboundInternetMailTraffic ], + d3f:T1566 . + +d3f:T1566.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Spearphishing Link" ; + d3f:attack-id "T1566.002" ; + d3f:definition "Adversaries may send spearphishing emails with a malicious link in an attempt to gain access to victim systems. Spearphishing with a link is a specific variant of spearphishing. It is different from other forms of spearphishing in that it employs the use of links to download malware contained in email, instead of attaching malicious files to the email itself, to avoid defenses that may inspect email attachments. Spearphishing may also involve social engineering techniques, such as posing as a trusted source." ; + d3f:produces d3f:Email, + d3f:InboundInternetMailTraffic, + d3f:URL ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Email ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InboundInternetMailTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:URL ], + d3f:T1566 . + +d3f:T1566.003 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Spearphishing via Service" ; + d3f:attack-id "T1566.003" ; + d3f:definition "Adversaries may send spearphishing messages via third-party services in an attempt to gain access to victim systems. Spearphishing via service is a specific variant of spearphishing. It is different from other forms of spearphishing in that it employs the use of third party services rather than directly via enterprise email channels." ; + d3f:produces d3f:File, + d3f:URL ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:URL ], + d3f:T1566 . + +d3f:T1566.004 a owl:Class ; + rdfs:label "Spearphishing Voice" ; + d3f:attack-id "T1566.004" ; + d3f:definition "Adversaries may use voice communications to ultimately gain access to victim systems. Spearphishing voice is a specific variant of spearphishing. It is different from other forms of spearphishing in that is employs the use of manipulating a user into providing access to systems through a phone call or other forms of voice communications. Spearphishing frequently involves social engineering techniques, such as posing as a trusted source (ex: [Impersonation](https://attack.mitre.org/techniques/T1656)) and/or creating a sense of urgency or alarm for the recipient." ; + rdfs:subClassOf d3f:T1566 . + +d3f:T1567.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration to Code Repository" ; + d3f:attack-id "T1567.001" ; + d3f:definition "Adversaries may exfiltrate data to a code repository rather than over their primary command and control channel. Code repositories are often accessible via an API (ex: https://api.github.com). Access to these APIs are often over HTTPS, which gives the adversary an additional level of protection." ; + d3f:may-produce d3f:OutboundInternetEncryptedRemoteTerminalTraffic, + d3f:OutboundInternetEncryptedWebTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-produce ; + owl:someValuesFrom d3f:OutboundInternetEncryptedWebTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:may-produce ; + owl:someValuesFrom d3f:OutboundInternetEncryptedRemoteTerminalTraffic ], + d3f:T1567 . + +d3f:T1567.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration to Cloud Storage" ; + d3f:attack-id "T1567.002" ; + d3f:definition "Adversaries may exfiltrate data to a cloud storage service rather than over their primary command and control channel. Cloud storage services allow for the storage, edit, and retrieval of data from a remote cloud storage server over the Internet." ; + d3f:produces d3f:OutboundInternetEncryptedWebTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetEncryptedWebTraffic ], + d3f:T1567 . + +d3f:T1567.003 a owl:Class ; + rdfs:label "Exfiltration to Text Storage Sites" ; + d3f:attack-id "T1567.003" ; + d3f:definition "Adversaries may exfiltrate data to text storage sites instead of their primary command and control channel. Text storage sites, such as pastebin[.]com, are commonly used by developers to share code and other information." ; + rdfs:subClassOf d3f:T1567 . + +d3f:T1567.004 a owl:Class ; + rdfs:label "Exfiltration Over Webhook" ; + d3f:attack-id "T1567.004" ; + d3f:definition "Adversaries may exfiltrate data to a webhook endpoint rather than over their primary command and control channel. Webhooks are simple mechanisms for allowing a server to push data over HTTP/S to a client without the need for the client to continuously poll the server.(Citation: RedHat Webhooks) Many public and commercial services, such as Discord, Slack, and `webhook.site`, support the creation of webhook endpoints that can be used by other services, such as Github, Jira, or Trello.(Citation: Discord Intro to Webhooks) When changes happen in the linked services (such as pushing a repository update or modifying a ticket), these services will automatically post the data to the webhook endpoint for use by the consuming application." ; + rdfs:subClassOf d3f:T1567 . + +d3f:T1568.001 a owl:Class ; + rdfs:label "Fast Flux DNS" ; + d3f:attack-id "T1568.001" ; + d3f:definition "Adversaries may use Fast Flux DNS to hide a command and control channel behind an array of rapidly changing IP addresses linked to a single domain resolution. This technique uses a fully qualified domain name, with multiple IP addresses assigned to it which are swapped with high frequency, using a combination of round robin IP addressing and short Time-To-Live (TTL) for a DNS resource record.(Citation: MehtaFastFluxPt1)(Citation: MehtaFastFluxPt2)(Citation: Fast Flux - Welivesecurity)" ; + rdfs:subClassOf d3f:T1568 . + +d3f:T1568.002 a owl:Class ; + rdfs:label "Domain Generation Algorithms" ; + d3f:attack-id "T1568.002" ; + d3f:definition "Adversaries may make use of Domain Generation Algorithms (DGAs) to dynamically identify a destination domain for command and control traffic rather than relying on a list of static IP addresses or domains. This has the advantage of making it much harder for defenders to block, track, or take over the command and control channel, as there potentially could be thousands of domains that malware can check for instructions.(Citation: Cybereason Dissecting DGAs)(Citation: Cisco Umbrella DGA)(Citation: Unit 42 DGA Feb 2019)" ; + rdfs:subClassOf d3f:T1568 . + +d3f:T1568.003 a owl:Class ; + rdfs:label "DNS Calculation" ; + d3f:attack-id "T1568.003" ; + d3f:definition "Adversaries may perform calculations on addresses returned in DNS results to determine which port and IP address to use for command and control, rather than relying on a predetermined port number or the actual returned IP address. A IP and/or port number calculation can be used to bypass egress filtering on a C2 channel.(Citation: Meyers Numbered Panda)" ; + rdfs:subClassOf d3f:T1568 . + +d3f:T1569.001 a owl:Class ; + rdfs:label "Launchctl" ; + d3f:attack-id "T1569.001" ; + d3f:definition "Adversaries may abuse launchctl to execute commands or programs. Launchctl interfaces with launchd, the service management framework for macOS. Launchctl supports taking subcommands on the command-line, interactively, or even redirected from standard input.(Citation: Launchctl Man)" ; + rdfs:subClassOf d3f:T1569 . + +d3f:T1569.002 a owl:Class ; + rdfs:label "Service Execution" ; + d3f:attack-id "T1569.002" ; + d3f:definition "Adversaries may abuse the Windows service control manager to execute malicious commands or payloads. The Windows service control manager (services.exe) is an interface to manage and manipulate services.(Citation: Microsoft Service Control Manager) The service control manager is accessible to users via GUI components as well as system utilities such as sc.exe and [Net](https://attack.mitre.org/software/S0039)." ; + rdfs:subClassOf d3f:T1569 . + +d3f:T1570 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Lateral Tool Transfer" ; + d3f:attack-id "T1570" ; + d3f:definition "Adversaries may transfer tools or other files between systems in a compromised environment. Once brought into the victim environment (i.e., [Ingress Tool Transfer](https://attack.mitre.org/techniques/T1105)) files may then be copied from one system to another to stage adversary tools or other files over the course of an operation." ; + d3f:produces d3f:IntranetFileTransferTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetFileTransferTraffic ], + d3f:LateralMovementTechnique . + +d3f:T1571 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Non-Standard Port" ; + d3f:attack-id "T1571" ; + d3f:definition "Adversaries may communicate using a protocol and port pairing that are typically not associated. For example, HTTPS over port 8088(Citation: Symantec Elfin Mar 2019) or port 587(Citation: Fortinet Agent Tesla April 2018) as opposed to the traditional port 443. Adversaries may make changes to the standard port used by a protocol to bypass filtering or muddle analysis/parsing of network data." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1572 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Protocol Tunneling" ; + d3f:attack-id "T1572" ; + d3f:definition "Adversaries may tunnel network communications to and from a victim system within a separate protocol to avoid detection/network filtering and/or enable access to otherwise unreachable systems. Tunneling involves explicitly encapsulating a protocol within another. This behavior may conceal malicious traffic by blending in with existing traffic and/or provide an outer layer of encryption (similar to a VPN). Tunneling could also enable routing of network packets that would otherwise not reach their intended destination, such as SMB, RDP, or other traffic that would be filtered by network appliances or not routed over the Internet." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1573.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Symmetric Cryptography" ; + d3f:attack-id "T1573.001" ; + d3f:creates d3f:OutboundInternetEncryptedTraffic ; + d3f:definition "Adversaries may employ a known symmetric encryption algorithm to conceal command and control traffic rather than relying on any inherent protections provided by a communication protocol. Symmetric encryption algorithms use the same key for plaintext encryption and ciphertext decryption. Common symmetric encryption algorithms include AES, DES, 3DES, Blowfish, and RC4." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:OutboundInternetEncryptedTraffic ], + d3f:T1573 . + +d3f:T1573.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Asymmetric Cryptography" ; + d3f:attack-id "T1573.002" ; + d3f:creates d3f:OutboundInternetEncryptedTraffic ; + d3f:definition "Adversaries may employ a known asymmetric encryption algorithm to conceal command and control traffic rather than relying on any inherent protections provided by a communication protocol. Asymmetric cryptography, also known as public key cryptography, uses a keypair per party: one public that can be freely distributed, and one private. Due to how the keys are generated, the sender encrypts data with the receiver’s public key and the receiver decrypts the data with their private key. This ensures that only the intended recipient can read the encrypted data. Common public key encryption algorithms include RSA and ElGamal." ; + d3f:may-transfer d3f:CertificateFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-transfer ; + owl:someValuesFrom d3f:CertificateFile ], + [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:OutboundInternetEncryptedTraffic ], + d3f:T1573 . + +d3f:T1574.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "DLL Search Order Hijacking" ; + d3f:attack-id "T1574.001" ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking the search order used to load DLLs. Windows systems use a common method to look for required DLLs to load into a program. (Citation: Microsoft Dynamic Link Library Search Order)(Citation: FireEye Hijacking July 2010) Hijacking DLL loads may be for the purpose of establishing persistence as well as elevating privileges and/or evading restrictions on file execution." ; + d3f:may-create d3f:SharedLibraryFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:SharedLibraryFile ], + d3f:T1574 . + +d3f:T1574.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "DLL Side-Loading" ; + d3f:attack-id "T1574.002" ; + d3f:definition "Adversaries may execute their own malicious payloads by side-loading DLLs. Similar to [DLL Search Order Hijacking](https://attack.mitre.org/techniques/T1574/001), side-loading involves hijacking which DLL a program loads. But rather than just planting the DLL within the search order of a program then waiting for the victim application to be invoked, adversaries may directly side-load their payloads by planting then invoking a legitimate application that executes their payload(s)." ; + d3f:may-create d3f:SharedLibraryFile ; + d3f:may-modify d3f:SharedLibraryFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SharedLibraryFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:SharedLibraryFile ], + d3f:T1574 . + +d3f:T1574.004 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Dylib Hijacking" ; + d3f:attack-id "T1574.004" ; + d3f:definition "Adversaries may execute their own payloads by placing a malicious dynamic library (dylib) with an expected name in a path a victim application searches at runtime. The dynamic loader will try to find the dylibs based on the sequential order of the search paths. Paths to dylibs may be prefixed with @rpath, which allows developers to use relative paths to specify an array of search paths used at runtime based on the location of the executable. Additionally, if weak linking is used, such as the LC_LOAD_WEAK_DYLIB function, an application will still execute even if an expected dylib is not present. Weak linking enables developers to run an application on multiple macOS versions as new APIs are added." ; + d3f:may-create d3f:SharedLibraryFile ; + d3f:may-modify d3f:SharedLibraryFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:SharedLibraryFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-modify ; + owl:someValuesFrom d3f:SharedLibraryFile ], + d3f:T1574 . + +d3f:T1574.005 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Executable Installer File Permissions Weakness" ; + d3f:attack-id "T1574.005" ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking the binaries used by an installer. These processes may automatically execute specific binaries as part of their functionality or to perform other actions. If the permissions on the file system directory containing a target binary, or permissions on the binary itself, are improperly set, then the target binary may be overwritten with another binary using user-level permissions and executed by the original process. If the original process and thread are running under a higher permissions level, then the replaced binary will also execute under higher-level permissions, which could include SYSTEM." ; + d3f:modifies d3f:ServiceApplication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ServiceApplication ], + d3f:T1574 . + +d3f:T1574.006 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Dynamic Linker Hijacking" ; + d3f:attack-id "T1574.006" ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking environment variables the dynamic linker uses to load shared libraries. During the execution preparation phase of a program, the dynamic linker loads specified absolute paths of shared libraries from environment variables and files, such as LD_PRELOAD on Linux or DYLD_INSERT_LIBRARIES on macOS. Libraries specified in environment variables are loaded first, taking precedence over system libraries with the same function name.(Citation: Man LD.SO)(Citation: TLDP Shared Libraries)(Citation: Apple Doco Archive Dynamic Libraries) These variables are often used by developers to debug binaries without needing to recompile, deconflict mapped symbols, and implement custom functions without changing the original library.(Citation: Baeldung LD_PRELOAD)" ; + d3f:modifies d3f:OperatingSystemConfigurationFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:OperatingSystemConfigurationFile ], + d3f:T1574 . + +d3f:T1574.007 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Path Interception by PATH Environment Variable" ; + d3f:attack-id "T1574.007" ; + d3f:creates d3f:ExecutableFile ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking environment variables used to load libraries. The PATH environment variable contains a list of directories (User and System) that the OS searches sequentially through in search of the binary that was called from a script or the command line." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:T1574 . + +d3f:T1574.008 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Path Interception by Search Order Hijacking" ; + d3f:attack-id "T1574.008" ; + d3f:creates d3f:ExecutableFile ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking the search order used to load other programs. Because some programs do not call other programs using the full path, adversaries may place their own file in the directory where the calling program is located, causing the operating system to launch their malicious software at the request of the calling program." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:T1574 . + +d3f:T1574.009 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Path Interception by Unquoted Path" ; + d3f:attack-id "T1574.009" ; + d3f:creates d3f:ExecutableFile ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking vulnerable file path references. Adversaries can take advantage of paths that lack surrounding quotations by placing an executable in a higher level directory within the path, so that Windows will choose the adversary's executable to launch." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:T1574 . + +d3f:T1574.010 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Services File Permissions Weakness" ; + d3f:attack-id "T1574.010" ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking the binaries used by services. Adversaries may use flaws in the permissions of Windows services to replace the binary that is executed upon service start. These service processes may automatically execute specific binaries as part of their functionality or to perform other actions. If the permissions on the file system directory containing a target binary, or permissions on the binary itself are improperly set, then the target binary may be overwritten with another binary using user-level permissions and executed by the original process. If the original process and thread are running under a higher permissions level, then the replaced binary will also execute under higher-level permissions, which could include SYSTEM." ; + d3f:modifies d3f:ServiceApplication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ServiceApplication ], + d3f:T1574 ; + skos:altLabel "Service Registry Permissions Weakness" . + +d3f:T1574.011 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Services Registry Permissions Weakness" ; + d3f:attack-id "T1574.011" ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking the Registry entries used by services. Adversaries may use flaws in the permissions for Registry keys related to services to redirect from the originally specified executable to one that they control, in order to launch their own code when a service starts. Windows stores local service configuration information in the Registry under HKLM\\SYSTEM\\CurrentControlSet\\Services. The information stored under a service's Registry keys can be manipulated to modify a service's execution parameters through tools such as the service controller, sc.exe, [PowerShell](https://attack.mitre.org/techniques/T1059/001), or [Reg](https://attack.mitre.org/software/S0075). Access to Registry keys is controlled through access control lists and user permissions. (Citation: Registry Key Security)(Citation: malware_hides_service)" ; + d3f:modifies d3f:SystemConfigurationInitDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationInitDatabaseRecord ], + d3f:T1574 . + +d3f:T1574.012 a owl:Class, + owl:NamedIndividual ; + rdfs:label "COR_PROFILER" ; + d3f:adds d3f:SharedLibraryFile ; + d3f:attack-id "T1574.012" ; + d3f:definition "Adversaries may leverage the COR_PROFILER environment variable to hijack the execution flow of programs that load the .NET CLR. The COR_PROFILER is a .NET Framework feature which allows developers to specify an unmanaged (or external of .NET) profiling DLL to be loaded into each .NET process that loads the Common Language Runtime (CLR). These profilers are designed to monitor, troubleshoot, and debug managed code executed by the .NET CLR.(Citation: Microsoft Profiling Mar 2017)(Citation: Microsoft COR_PROFILER Feb 2013)" ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + [ a owl:Restriction ; + owl:onProperty d3f:adds ; + owl:someValuesFrom d3f:SharedLibraryFile ], + d3f:T1574 . + +d3f:T1574.013 a owl:Class ; + rdfs:label "KernelCallbackTable" ; + d3f:attack-id "T1574.013" ; + d3f:definition "Adversaries may abuse the KernelCallbackTable of a process to hijack its execution flow in order to run their own payloads.(Citation: Lazarus APT January 2022)(Citation: FinFisher exposed ) The KernelCallbackTable can be found in the Process Environment Block (PEB) and is initialized to an array of graphic functions available to a GUI process once user32.dll is loaded.(Citation: Windows Process Injection KernelCallbackTable)" ; + rdfs:subClassOf d3f:T1574 . + +d3f:T1574.014 a owl:Class ; + rdfs:label "AppDomainManager" ; + d3f:attack-id "T1574.014" ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking how the .NET `AppDomainManager` loads assemblies. The .NET framework uses the `AppDomainManager` class to create and manage one or more isolated runtime environments (called application domains) inside a process to host the execution of .NET applications. Assemblies (`.exe` or `.dll` binaries compiled to run as .NET code) may be loaded into an application domain as executable code.(Citation: Microsoft App Domains)" ; + rdfs:subClassOf d3f:T1574 . + +d3f:T1578.001 a owl:Class ; + rdfs:label "Create Snapshot" ; + d3f:attack-id "T1578.001" ; + d3f:definition "An adversary may create a snapshot or data backup within a cloud account to evade defenses. A snapshot is a point-in-time copy of an existing cloud compute component such as a virtual machine (VM), virtual hard drive, or volume. An adversary may leverage permissions to create a snapshot in order to bypass restrictions that prevent access to existing compute service infrastructure, unlike in [Revert Cloud Instance](https://attack.mitre.org/techniques/T1578/004) where an adversary may revert to a snapshot to evade detection and remove evidence of their presence." ; + rdfs:subClassOf d3f:T1578 . + +d3f:T1578.002 a owl:Class ; + rdfs:label "Create Cloud Instance" ; + d3f:attack-id "T1578.002" ; + d3f:definition "An adversary may create a new instance or virtual machine (VM) within the compute service of a cloud account to evade defenses. Creating a new instance may allow an adversary to bypass firewall rules and permissions that exist on instances currently residing within an account. An adversary may [Create Snapshot](https://attack.mitre.org/techniques/T1578/001) of one or more volumes in an account, create a new instance, mount the snapshots, and then apply a less restrictive security policy to collect [Data from Local System](https://attack.mitre.org/techniques/T1005) or for [Remote Data Staging](https://attack.mitre.org/techniques/T1074/002).(Citation: Mandiant M-Trends 2020)" ; + rdfs:subClassOf d3f:T1578 . + +d3f:T1578.003 a owl:Class ; + rdfs:label "Delete Cloud Instance" ; + d3f:attack-id "T1578.003" ; + d3f:definition "An adversary may delete a cloud instance after they have performed malicious activities in an attempt to evade detection and remove evidence of their presence. Deleting an instance or virtual machine can remove valuable forensic artifacts and other evidence of suspicious behavior if the instance is not recoverable." ; + rdfs:subClassOf d3f:T1578 . + +d3f:T1578.004 a owl:Class ; + rdfs:label "Revert Cloud Instance" ; + d3f:attack-id "T1578.004" ; + d3f:definition "An adversary may revert changes made to a cloud instance after they have performed malicious activities in attempt to evade detection and remove evidence of their presence. In highly virtualized environments, such as cloud-based infrastructure, this may be accomplished by restoring virtual machine (VM) or data storage snapshots through the cloud management dashboard or cloud APIs." ; + rdfs:subClassOf d3f:T1578 . + +d3f:T1578.005 a owl:Class ; + rdfs:label "Modify Cloud Compute Configurations" ; + d3f:attack-id "T1578.005" ; + d3f:definition "Adversaries may modify settings that directly affect the size, locations, and resources available to cloud compute infrastructure in order to evade defenses. These settings may include service quotas, subscription associations, tenant-wide policies, or other configurations that impact available compute. Such modifications may allow adversaries to abuse the victim’s compute resources to achieve their goals, potentially without affecting the execution of running instances and/or revealing their activities to the victim." ; + rdfs:subClassOf d3f:T1578 . + +d3f:T1580 a owl:Class ; + rdfs:label "Cloud Infrastructure Discovery" ; + d3f:attack-id "T1580" ; + d3f:definition "An adversary may attempt to discover infrastructure and resources that are available within an infrastructure-as-a-service (IaaS) environment. This includes compute service resources such as instances, virtual machines, and snapshots as well as resources of other services including the storage and database services." ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1583.001 a owl:Class ; + rdfs:label "Domains" ; + d3f:attack-id "T1583.001" ; + d3f:definition "Adversaries may acquire domains that can be used during targeting. Domain names are the human readable names used to represent one or more IP addresses. They can be purchased or, in some cases, acquired for free." ; + rdfs:subClassOf d3f:T1583 . + +d3f:T1583.002 a owl:Class ; + rdfs:label "DNS Server" ; + d3f:attack-id "T1583.002" ; + d3f:definition "Adversaries may set up their own Domain Name System (DNS) servers that can be used during targeting. During post-compromise activity, adversaries may utilize DNS traffic for various tasks, including for Command and Control (ex: [Application Layer Protocol](https://attack.mitre.org/techniques/T1071)). Instead of hijacking existing DNS servers, adversaries may opt to configure and run their own DNS servers in support of operations." ; + rdfs:subClassOf d3f:T1583 . + +d3f:T1583.003 a owl:Class ; + rdfs:label "Virtual Private Server" ; + d3f:attack-id "T1583.003" ; + d3f:definition "Adversaries may rent Virtual Private Servers (VPSs) that can be used during targeting. There exist a variety of cloud service providers that will sell virtual machines/containers as a service. By utilizing a VPS, adversaries can make it difficult to physically tie back operations to them. The use of cloud infrastructure can also make it easier for adversaries to rapidly provision, modify, and shut down their infrastructure." ; + rdfs:subClassOf d3f:T1583 . + +d3f:T1583.004 a owl:Class ; + rdfs:label "Server" ; + d3f:attack-id "T1583.004" ; + d3f:definition "Adversaries may buy, lease, rent, or obtain physical servers that can be used during targeting. Use of servers allows an adversary to stage, launch, and execute an operation. During post-compromise activity, adversaries may utilize servers for various tasks, such as watering hole operations in [Drive-by Compromise](https://attack.mitre.org/techniques/T1189), enabling [Phishing](https://attack.mitre.org/techniques/T1566) operations, or facilitating [Command and Control](https://attack.mitre.org/tactics/TA0011). Instead of compromising a third-party [Server](https://attack.mitre.org/techniques/T1584/004) or renting a [Virtual Private Server](https://attack.mitre.org/techniques/T1583/003), adversaries may opt to configure and run their own servers in support of operations. Free trial periods of cloud servers may also be abused.(Citation: Free Trial PurpleUrchin)(Citation: Freejacked)" ; + rdfs:subClassOf d3f:T1583 . + +d3f:T1583.005 a owl:Class ; + rdfs:label "Botnet" ; + d3f:attack-id "T1583.005" ; + d3f:definition "Adversaries may buy, lease, or rent a network of compromised systems that can be used during targeting. A botnet is a network of compromised systems that can be instructed to perform coordinated tasks.(Citation: Norton Botnet) Adversaries may purchase a subscription to use an existing botnet from a booter/stresser service. With a botnet at their disposal, adversaries may perform follow-on activity such as large-scale [Phishing](https://attack.mitre.org/techniques/T1566) or Distributed Denial of Service (DDoS).(Citation: Imperva DDoS for Hire)(Citation: Krebs-Anna)(Citation: Krebs-Bazaar)(Citation: Krebs-Booter)" ; + rdfs:subClassOf d3f:T1583 . + +d3f:T1583.006 a owl:Class ; + rdfs:label "Web Services" ; + d3f:attack-id "T1583.006" ; + d3f:definition "Adversaries may register for web services that can be used during targeting. A variety of popular websites exist for adversaries to register for a web-based service that can be abused during later stages of the adversary lifecycle, such as during Command and Control ([Web Service](https://attack.mitre.org/techniques/T1102)), [Exfiltration Over Web Service](https://attack.mitre.org/techniques/T1567), or [Phishing](https://attack.mitre.org/techniques/T1566). Using common services, such as those offered by Google or Twitter, makes it easier for adversaries to hide in expected noise.(Citation: FireEye APT29) By utilizing a web service, adversaries can make it difficult to physically tie back operations to them." ; + rdfs:subClassOf d3f:T1583 . + +d3f:T1583.007 a owl:Class ; + rdfs:label "Serverless" ; + d3f:attack-id "T1583.007" ; + d3f:definition "Adversaries may purchase and configure serverless cloud infrastructure, such as Cloudflare Workers or AWS Lambda functions, that can be used during targeting. By utilizing serverless infrastructure, adversaries can make it more difficult to attribute infrastructure used during operations back to them." ; + rdfs:subClassOf d3f:T1583 . + +d3f:T1583.008 a owl:Class ; + rdfs:label "Malvertising" ; + d3f:attack-id "T1583.008" ; + d3f:definition "Adversaries may purchase online advertisements that can be abused to distribute malware to victims. Ads can be purchased to plant as well as favorably position artifacts in specific locations online, such as prominently placed within search engine results. These ads may make it more difficult for users to distinguish between actual search results and advertisements.(Citation: spamhaus-malvertising) Purchased ads may also target specific audiences using the advertising network’s capabilities, potentially further taking advantage of the trust inherently given to search engines and popular websites." ; + rdfs:subClassOf d3f:T1583 . + +d3f:T1584.001 a owl:Class ; + rdfs:label "Domains" ; + d3f:attack-id "T1584.001" ; + d3f:definition "Adversaries may hijack domains and/or subdomains that can be used during targeting. Domain registration hijacking is the act of changing the registration of a domain name without the permission of the original registrant.(Citation: ICANNDomainNameHijacking) Adversaries may gain access to an email account for the person listed as the owner of the domain. The adversary can then claim that they forgot their password in order to make changes to the domain registration. Other possibilities include social engineering a domain registration help desk to gain access to an account or taking advantage of renewal process gaps.(Citation: Krebs DNS Hijack 2019)" ; + rdfs:subClassOf d3f:T1584 . + +d3f:T1584.002 a owl:Class ; + rdfs:label "DNS Server" ; + d3f:attack-id "T1584.002" ; + d3f:definition "Adversaries may compromise third-party DNS servers that can be used during targeting. During post-compromise activity, adversaries may utilize DNS traffic for various tasks, including for Command and Control (ex: [Application Layer Protocol](https://attack.mitre.org/techniques/T1071)). Instead of setting up their own DNS servers, adversaries may compromise third-party DNS servers in support of operations." ; + rdfs:subClassOf d3f:T1584 . + +d3f:T1584.003 a owl:Class ; + rdfs:label "Virtual Private Server" ; + d3f:attack-id "T1584.003" ; + d3f:definition "Adversaries may compromise third-party Virtual Private Servers (VPSs) that can be used during targeting. There exist a variety of cloud service providers that will sell virtual machines/containers as a service. Adversaries may compromise VPSs purchased by third-party entities. By compromising a VPS to use as infrastructure, adversaries can make it difficult to physically tie back operations to themselves.(Citation: NSA NCSC Turla OilRig)" ; + rdfs:subClassOf d3f:T1584 . + +d3f:T1584.004 a owl:Class ; + rdfs:label "Server" ; + d3f:attack-id "T1584.004" ; + d3f:definition "Adversaries may compromise third-party servers that can be used during targeting. Use of servers allows an adversary to stage, launch, and execute an operation. During post-compromise activity, adversaries may utilize servers for various tasks, including for Command and Control.(Citation: TrendMicro EarthLusca 2022) Instead of purchasing a [Server](https://attack.mitre.org/techniques/T1583/004) or [Virtual Private Server](https://attack.mitre.org/techniques/T1583/003), adversaries may compromise third-party servers in support of operations." ; + rdfs:subClassOf d3f:T1584 . + +d3f:T1584.005 a owl:Class ; + rdfs:label "Botnet" ; + d3f:attack-id "T1584.005" ; + d3f:definition "Adversaries may compromise numerous third-party systems to form a botnet that can be used during targeting. A botnet is a network of compromised systems that can be instructed to perform coordinated tasks.(Citation: Norton Botnet) Instead of purchasing/renting a botnet from a booter/stresser service, adversaries may build their own botnet by compromising numerous third-party systems.(Citation: Imperva DDoS for Hire) Adversaries may also conduct a takeover of an existing botnet, such as redirecting bots to adversary-controlled C2 servers.(Citation: Dell Dridex Oct 2015) With a botnet at their disposal, adversaries may perform follow-on activity such as large-scale [Phishing](https://attack.mitre.org/techniques/T1566) or Distributed Denial of Service (DDoS)." ; + rdfs:subClassOf d3f:T1584 . + +d3f:T1584.006 a owl:Class ; + rdfs:label "Web Services" ; + d3f:attack-id "T1584.006" ; + d3f:definition "Adversaries may compromise access to third-party web services that can be used during targeting. A variety of popular websites exist for legitimate users to register for web-based services, such as GitHub, Twitter, Dropbox, Google, SendGrid, etc. Adversaries may try to take ownership of a legitimate user's access to a web service and use that web service as infrastructure in support of cyber operations. Such web services can be abused during later stages of the adversary lifecycle, such as during Command and Control ([Web Service](https://attack.mitre.org/techniques/T1102)), [Exfiltration Over Web Service](https://attack.mitre.org/techniques/T1567), or [Phishing](https://attack.mitre.org/techniques/T1566).(Citation: Recorded Future Turla Infra 2020) Using common services, such as those offered by Google or Twitter, makes it easier for adversaries to hide in expected noise. By utilizing a web service, particularly when access is stolen from legitimate users, adversaries can make it difficult to physically tie back operations to them. Additionally, leveraging compromised web-based email services may allow adversaries to leverage the trust associated with legitimate domains." ; + rdfs:subClassOf d3f:T1584 . + +d3f:T1584.007 a owl:Class ; + rdfs:label "Serverless" ; + d3f:attack-id "T1584.007" ; + d3f:definition "Adversaries may compromise serverless cloud infrastructure, such as Cloudflare Workers or AWS Lambda functions, that can be used during targeting. By utilizing serverless infrastructure, adversaries can make it more difficult to attribute infrastructure used during operations back to them." ; + rdfs:subClassOf d3f:T1584 . + +d3f:T1584.008 a owl:Class ; + rdfs:label "Network Devices" ; + d3f:attack-id "T1584.008" ; + d3f:definition "Adversaries may compromise third-party network devices that can be used during targeting. Network devices, such as small office/home office (SOHO) routers, may be compromised where the adversary's ultimate goal is not [Initial Access](https://attack.mitre.org/tactics/TA0001) to that environment -- instead leveraging these devices to support additional targeting." ; + rdfs:subClassOf d3f:T1584 . + +d3f:T1585.001 a owl:Class ; + rdfs:label "Social Media Accounts" ; + d3f:attack-id "T1585.001" ; + d3f:definition "Adversaries may create and cultivate social media accounts that can be used during targeting. Adversaries can create social media accounts that can be used to build a persona to further operations. Persona development consists of the development of public information, presence, history and appropriate affiliations.(Citation: NEWSCASTER2014)(Citation: BlackHatRobinSage)" ; + rdfs:subClassOf d3f:T1585 . + +d3f:T1585.002 a owl:Class ; + rdfs:label "Email Accounts" ; + d3f:attack-id "T1585.002" ; + d3f:definition "Adversaries may create email accounts that can be used during targeting. Adversaries can use accounts created with email providers to further their operations, such as leveraging them to conduct [Phishing for Information](https://attack.mitre.org/techniques/T1598) or [Phishing](https://attack.mitre.org/techniques/T1566).(Citation: Mandiant APT1) Establishing email accounts may also allow adversaries to abuse free services – such as trial periods – to [Acquire Infrastructure](https://attack.mitre.org/techniques/T1583) for follow-on purposes.(Citation: Free Trial PurpleUrchin)" ; + rdfs:subClassOf d3f:T1585 . + +d3f:T1585.003 a owl:Class ; + rdfs:label "Cloud Accounts" ; + d3f:attack-id "T1585.003" ; + d3f:definition "Adversaries may create accounts with cloud providers that can be used during targeting. Adversaries can use cloud accounts to further their operations, including leveraging cloud storage services such as Dropbox, MEGA, Microsoft OneDrive, or AWS S3 buckets for [Exfiltration to Cloud Storage](https://attack.mitre.org/techniques/T1567/002) or to [Upload Tool](https://attack.mitre.org/techniques/T1608/002)s. Cloud accounts can also be used in the acquisition of infrastructure, such as [Virtual Private Server](https://attack.mitre.org/techniques/T1583/003)s or [Serverless](https://attack.mitre.org/techniques/T1583/007) infrastructure. Establishing cloud accounts may allow adversaries to develop sophisticated capabilities without managing their own servers.(Citation: Awake Security C2 Cloud)" ; + rdfs:subClassOf d3f:T1585 . + +d3f:T1586.001 a owl:Class ; + rdfs:label "Social Media Accounts" ; + d3f:attack-id "T1586.001" ; + d3f:definition "Adversaries may compromise social media accounts that can be used during targeting. For operations incorporating social engineering, the utilization of an online persona may be important. Rather than creating and cultivating social media profiles (i.e. [Social Media Accounts](https://attack.mitre.org/techniques/T1585/001)), adversaries may compromise existing social media accounts. Utilizing an existing persona may engender a level of trust in a potential victim if they have a relationship, or knowledge of, the compromised persona." ; + rdfs:subClassOf d3f:T1586 . + +d3f:T1586.002 a owl:Class ; + rdfs:label "Email Accounts" ; + d3f:attack-id "T1586.002" ; + d3f:definition "Adversaries may compromise email accounts that can be used during targeting. Adversaries can use compromised email accounts to further their operations, such as leveraging them to conduct [Phishing for Information](https://attack.mitre.org/techniques/T1598), [Phishing](https://attack.mitre.org/techniques/T1566), or large-scale spam email campaigns. Utilizing an existing persona with a compromised email account may engender a level of trust in a potential victim if they have a relationship with, or knowledge of, the compromised persona. Compromised email accounts can also be used in the acquisition of infrastructure (ex: [Domains](https://attack.mitre.org/techniques/T1583/001))." ; + rdfs:subClassOf d3f:T1586 . + +d3f:T1586.003 a owl:Class ; + rdfs:label "Cloud Accounts" ; + d3f:attack-id "T1586.003" ; + d3f:definition "Adversaries may compromise cloud accounts that can be used during targeting. Adversaries can use compromised cloud accounts to further their operations, including leveraging cloud storage services such as Dropbox, Microsoft OneDrive, or AWS S3 buckets for [Exfiltration to Cloud Storage](https://attack.mitre.org/techniques/T1567/002) or to [Upload Tool](https://attack.mitre.org/techniques/T1608/002)s. Cloud accounts can also be used in the acquisition of infrastructure, such as [Virtual Private Server](https://attack.mitre.org/techniques/T1583/003)s or [Serverless](https://attack.mitre.org/techniques/T1583/007) infrastructure. Compromising cloud accounts may allow adversaries to develop sophisticated capabilities without managing their own servers.(Citation: Awake Security C2 Cloud)" ; + rdfs:subClassOf d3f:T1586 . + +d3f:T1587.001 a owl:Class ; + rdfs:label "Malware" ; + d3f:attack-id "T1587.001" ; + d3f:definition "Adversaries may develop malware and malware components that can be used during targeting. Building malicious software can include the development of payloads, droppers, post-compromise tools, backdoors (including backdoored images), packers, C2 protocols, and the creation of infected removable media. Adversaries may develop malware to support their operations, creating a means for maintaining control of remote machines, evading defenses, and executing post-compromise behaviors.(Citation: Mandiant APT1)(Citation: Kaspersky Sofacy)(Citation: ActiveMalwareEnergy)(Citation: FBI Flash FIN7 USB)" ; + rdfs:subClassOf d3f:T1587 . + +d3f:T1587.002 a owl:Class ; + rdfs:label "Code Signing Certificates" ; + d3f:attack-id "T1587.002" ; + d3f:definition "Adversaries may create self-signed code signing certificates that can be used during targeting. Code signing is the process of digitally signing executables and scripts to confirm the software author and guarantee that the code has not been altered or corrupted. Code signing provides a level of authenticity for a program from the developer and a guarantee that the program has not been tampered with.(Citation: Wikipedia Code Signing) Users and/or security tools may trust a signed piece of code more than an unsigned piece of code even if they don't know who issued the certificate or who the author is." ; + rdfs:subClassOf d3f:T1587 . + +d3f:T1587.003 a owl:Class ; + rdfs:label "Digital Certificates" ; + d3f:attack-id "T1587.003" ; + d3f:definition "Adversaries may create self-signed SSL/TLS certificates that can be used during targeting. SSL/TLS certificates are designed to instill trust. They include information about the key, information about its owner's identity, and the digital signature of an entity that has verified the certificate's contents are correct. If the signature is valid, and the person examining the certificate trusts the signer, then they know they can use that key to communicate with its owner. In the case of self-signing, digital certificates will lack the element of trust associated with the signature of a third-party certificate authority (CA)." ; + rdfs:subClassOf d3f:T1587 . + +d3f:T1587.004 a owl:Class ; + rdfs:label "Exploits" ; + d3f:attack-id "T1587.004" ; + d3f:definition "Adversaries may develop exploits that can be used during targeting. An exploit takes advantage of a bug or vulnerability in order to cause unintended or unanticipated behavior to occur on computer hardware or software. Rather than finding/modifying exploits from online or purchasing them from exploit vendors, an adversary may develop their own exploits.(Citation: NYTStuxnet) Adversaries may use information acquired via [Vulnerabilities](https://attack.mitre.org/techniques/T1588/006) to focus exploit development efforts. As part of the exploit development process, adversaries may uncover exploitable vulnerabilities through methods such as fuzzing and patch analysis.(Citation: Irongeek Sims BSides 2017)" ; + rdfs:subClassOf d3f:T1587 . + +d3f:T1588.001 a owl:Class ; + rdfs:label "Malware" ; + d3f:attack-id "T1588.001" ; + d3f:definition "Adversaries may buy, steal, or download malware that can be used during targeting. Malicious software can include payloads, droppers, post-compromise tools, backdoors, packers, and C2 protocols. Adversaries may acquire malware to support their operations, obtaining a means for maintaining control of remote machines, evading defenses, and executing post-compromise behaviors." ; + rdfs:subClassOf d3f:T1588 . + +d3f:T1588.002 a owl:Class ; + rdfs:label "Tool" ; + d3f:attack-id "T1588.002" ; + d3f:definition "Adversaries may buy, steal, or download software tools that can be used during targeting. Tools can be open or closed source, free or commercial. A tool can be used for malicious purposes by an adversary, but (unlike malware) were not intended to be used for those purposes (ex: [PsExec](https://attack.mitre.org/software/S0029)). Tool acquisition can involve the procurement of commercial software licenses, including for red teaming tools such as [Cobalt Strike](https://attack.mitre.org/software/S0154). Commercial software may be obtained through purchase, stealing licenses (or licensed copies of the software), or cracking trial versions.(Citation: Recorded Future Beacon 2019)" ; + rdfs:subClassOf d3f:T1588 . + +d3f:T1588.003 a owl:Class ; + rdfs:label "Code Signing Certificates" ; + d3f:attack-id "T1588.003" ; + d3f:definition "Adversaries may buy and/or steal code signing certificates that can be used during targeting. Code signing is the process of digitally signing executables and scripts to confirm the software author and guarantee that the code has not been altered or corrupted. Code signing provides a level of authenticity for a program from the developer and a guarantee that the program has not been tampered with.(Citation: Wikipedia Code Signing) Users and/or security tools may trust a signed piece of code more than an unsigned piece of code even if they don't know who issued the certificate or who the author is." ; + rdfs:subClassOf d3f:T1588 . + +d3f:T1588.004 a owl:Class ; + rdfs:label "Digital Certificates" ; + d3f:attack-id "T1588.004" ; + d3f:definition "Adversaries may buy and/or steal SSL/TLS certificates that can be used during targeting. SSL/TLS certificates are designed to instill trust. They include information about the key, information about its owner's identity, and the digital signature of an entity that has verified the certificate's contents are correct. If the signature is valid, and the person examining the certificate trusts the signer, then they know they can use that key to communicate with its owner." ; + rdfs:subClassOf d3f:T1588 . + +d3f:T1588.005 a owl:Class ; + rdfs:label "Exploits" ; + d3f:attack-id "T1588.005" ; + d3f:definition "Adversaries may buy, steal, or download exploits that can be used during targeting. An exploit takes advantage of a bug or vulnerability in order to cause unintended or unanticipated behavior to occur on computer hardware or software. Rather than developing their own exploits, an adversary may find/modify exploits from online or purchase them from exploit vendors.(Citation: Exploit Database)(Citation: TempertonDarkHotel)(Citation: NationsBuying)" ; + rdfs:subClassOf d3f:T1588 . + +d3f:T1588.006 a owl:Class ; + rdfs:label "Vulnerabilities" ; + d3f:attack-id "T1588.006" ; + d3f:definition "Adversaries may acquire information about vulnerabilities that can be used during targeting. A vulnerability is a weakness in computer hardware or software that can, potentially, be exploited by an adversary to cause unintended or unanticipated behavior to occur. Adversaries may find vulnerability information by searching open databases or gaining access to closed vulnerability databases.(Citation: National Vulnerability Database)" ; + rdfs:subClassOf d3f:T1588 . + +d3f:T1588.007 a owl:Class ; + rdfs:label "Artificial Intelligence" ; + d3f:attack-id "T1588.007" ; + d3f:definition "Adversaries may obtain access to generative artificial intelligence tools, such as large language models (LLMs), to aid various techniques during targeting. These tools may be used to inform, bolster, and enable a variety of malicious tasks including conducting [Reconnaissance](https://attack.mitre.org/tactics/TA0043), creating basic scripts, assisting social engineering, and even developing payloads.(Citation: MSFT-AI)" ; + rdfs:subClassOf d3f:T1588 . + +d3f:T1589.001 a owl:Class ; + rdfs:label "Credentials" ; + d3f:attack-id "T1589.001" ; + d3f:definition "Adversaries may gather credentials that can be used during targeting. Account credentials gathered by adversaries may be those directly associated with the target victim organization or attempt to take advantage of the tendency for users to use the same passwords across personal and business accounts." ; + rdfs:subClassOf d3f:T1589 . + +d3f:T1589.002 a owl:Class ; + rdfs:label "Email Addresses" ; + d3f:attack-id "T1589.002" ; + d3f:definition "Adversaries may gather email addresses that can be used during targeting. Even if internal instances exist, organizations may have public-facing email infrastructure and addresses for employees." ; + rdfs:subClassOf d3f:T1589 . + +d3f:T1589.003 a owl:Class ; + rdfs:label "Employee Names" ; + d3f:attack-id "T1589.003" ; + d3f:definition "Adversaries may gather employee names that can be used during targeting. Employee names be used to derive email addresses as well as to help guide other reconnaissance efforts and/or craft more-believable lures." ; + rdfs:subClassOf d3f:T1589 . + +d3f:T1590.001 a owl:Class ; + rdfs:label "Domain Properties" ; + d3f:attack-id "T1590.001" ; + d3f:definition "Adversaries may gather information about the victim's network domain(s) that can be used during targeting. Information about domains and their properties may include a variety of details, including what domain(s) the victim owns as well as administrative data (ex: name, registrar, etc.) and more directly actionable information such as contacts (email addresses and phone numbers), business addresses, and name servers." ; + rdfs:subClassOf d3f:T1590 . + +d3f:T1590.002 a owl:Class ; + rdfs:label "DNS" ; + d3f:attack-id "T1590.002" ; + d3f:definition "Adversaries may gather information about the victim's DNS that can be used during targeting. DNS information may include a variety of details, including registered name servers as well as records that outline addressing for a target’s subdomains, mail servers, and other hosts. DNS, MX, TXT, and SPF records may also reveal the use of third party cloud and SaaS providers, such as Office 365, G Suite, Salesforce, or Zendesk.(Citation: Sean Metcalf Twitter DNS Records)" ; + rdfs:subClassOf d3f:T1590 . + +d3f:T1590.003 a owl:Class ; + rdfs:label "Network Trust Dependencies" ; + d3f:attack-id "T1590.003" ; + d3f:definition "Adversaries may gather information about the victim's network trust dependencies that can be used during targeting. Information about network trusts may include a variety of details, including second or third-party organizations/domains (ex: managed service providers, contractors, etc.) that have connected (and potentially elevated) network access." ; + rdfs:subClassOf d3f:T1590 . + +d3f:T1590.004 a owl:Class ; + rdfs:label "Network Topology" ; + d3f:attack-id "T1590.004" ; + d3f:definition "Adversaries may gather information about the victim's network topology that can be used during targeting. Information about network topologies may include a variety of details, including the physical and/or logical arrangement of both external-facing and internal network environments. This information may also include specifics regarding network devices (gateways, routers, etc.) and other infrastructure." ; + rdfs:subClassOf d3f:T1590 . + +d3f:T1590.005 a owl:Class ; + rdfs:label "IP Addresses" ; + d3f:attack-id "T1590.005" ; + d3f:definition "Adversaries may gather the victim's IP addresses that can be used during targeting. Public IP addresses may be allocated to organizations by block, or a range of sequential addresses. Information about assigned IP addresses may include a variety of details, such as which IP addresses are in use. IP addresses may also enable an adversary to derive other details about a victim, such as organizational size, physical location(s), Internet service provider, and or where/how their publicly-facing infrastructure is hosted." ; + rdfs:subClassOf d3f:T1590 . + +d3f:T1590.006 a owl:Class ; + rdfs:label "Network Security Appliances" ; + d3f:attack-id "T1590.006" ; + d3f:definition "Adversaries may gather information about the victim's network security appliances that can be used during targeting. Information about network security appliances may include a variety of details, such as the existence and specifics of deployed firewalls, content filters, and proxies/bastion hosts. Adversaries may also target information about victim network-based intrusion detection systems (NIDS) or other appliances related to defensive cybersecurity operations." ; + rdfs:subClassOf d3f:T1590 . + +d3f:T1591.001 a owl:Class ; + rdfs:label "Determine Physical Locations" ; + d3f:attack-id "T1591.001" ; + d3f:definition "Adversaries may gather the victim's physical location(s) that can be used during targeting. Information about physical locations of a target organization may include a variety of details, including where key resources and infrastructure are housed. Physical locations may also indicate what legal jurisdiction and/or authorities the victim operates within." ; + rdfs:subClassOf d3f:T1591 . + +d3f:T1591.002 a owl:Class ; + rdfs:label "Business Relationships" ; + d3f:attack-id "T1591.002" ; + d3f:definition "Adversaries may gather information about the victim's business relationships that can be used during targeting. Information about an organization’s business relationships may include a variety of details, including second or third-party organizations/domains (ex: managed service providers, contractors, etc.) that have connected (and potentially elevated) network access. This information may also reveal supply chains and shipment paths for the victim’s hardware and software resources." ; + rdfs:subClassOf d3f:T1591 . + +d3f:T1591.003 a owl:Class ; + rdfs:label "Identify Business Tempo" ; + d3f:attack-id "T1591.003" ; + d3f:definition "Adversaries may gather information about the victim's business tempo that can be used during targeting. Information about an organization’s business tempo may include a variety of details, including operational hours/days of the week. This information may also reveal times/dates of purchases and shipments of the victim’s hardware and software resources." ; + rdfs:subClassOf d3f:T1591 . + +d3f:T1591.004 a owl:Class ; + rdfs:label "Identify Roles" ; + d3f:attack-id "T1591.004" ; + d3f:definition "Adversaries may gather information about identities and roles within the victim organization that can be used during targeting. Information about business roles may reveal a variety of targetable details, including identifiable information for key personnel as well as what data/resources they have access to." ; + rdfs:subClassOf d3f:T1591 . + +d3f:T1592.001 a owl:Class ; + rdfs:label "Hardware" ; + d3f:attack-id "T1592.001" ; + d3f:definition "Adversaries may gather information about the victim's host hardware that can be used during targeting. Information about hardware infrastructure may include a variety of details such as types and versions on specific hosts, as well as the presence of additional components that might be indicative of added defensive protections (ex: card/biometric readers, dedicated encryption hardware, etc.)." ; + rdfs:subClassOf d3f:T1592 . + +d3f:T1592.002 a owl:Class ; + rdfs:label "Software" ; + d3f:attack-id "T1592.002" ; + d3f:definition "Adversaries may gather information about the victim's host software that can be used during targeting. Information about installed software may include a variety of details such as types and versions on specific hosts, as well as the presence of additional components that might be indicative of added defensive protections (ex: antivirus, SIEMs, etc.)." ; + rdfs:subClassOf d3f:T1592 . + +d3f:T1592.003 a owl:Class ; + rdfs:label "Firmware" ; + d3f:attack-id "T1592.003" ; + d3f:definition "Adversaries may gather information about the victim's host firmware that can be used during targeting. Information about host firmware may include a variety of details such as type and versions on specific hosts, which may be used to infer more information about hosts in the environment (ex: configuration, purpose, age/patch level, etc.)." ; + rdfs:subClassOf d3f:T1592 . + +d3f:T1592.004 a owl:Class ; + rdfs:label "Client Configurations" ; + d3f:attack-id "T1592.004" ; + d3f:definition "Adversaries may gather information about the victim's client configurations that can be used during targeting. Information about client configurations may include a variety of details and settings, including operating system/version, virtualization, architecture (ex: 32 or 64 bit), language, and/or time zone." ; + rdfs:subClassOf d3f:T1592 . + +d3f:T1593.001 a owl:Class ; + rdfs:label "Social Media" ; + d3f:attack-id "T1593.001" ; + d3f:definition "Adversaries may search social media for information about victims that can be used during targeting. Social media sites may contain various information about a victim organization, such as business announcements as well as information about the roles, locations, and interests of staff." ; + rdfs:subClassOf d3f:T1593 . + +d3f:T1593.002 a owl:Class ; + rdfs:label "Search Engines" ; + d3f:attack-id "T1593.002" ; + d3f:definition "Adversaries may use search engines to collect information about victims that can be used during targeting. Search engine services typical crawl online sites to index context and may provide users with specialized syntax to search for specific keywords or specific types of content (i.e. filetypes).(Citation: SecurityTrails Google Hacking)(Citation: ExploitDB GoogleHacking)" ; + rdfs:subClassOf d3f:T1593 . + +d3f:T1593.003 a owl:Class ; + rdfs:label "Code Repositories" ; + d3f:attack-id "T1593.003" ; + d3f:definition "Adversaries may search public code repositories for information about victims that can be used during targeting. Victims may store code in repositories on various third-party websites such as GitHub, GitLab, SourceForge, and BitBucket. Users typically interact with code repositories through a web application or command-line utilities such as git." ; + rdfs:subClassOf d3f:T1593 . + +d3f:T1594 a owl:Class ; + rdfs:label "Search Victim-Owned Websites" ; + d3f:attack-id "T1594" ; + d3f:definition "Adversaries may search websites owned by the victim for information that can be used during targeting. Victim-owned websites may contain a variety of details, including names of departments/divisions, physical locations, and data about key employees such as names, roles, and contact info (ex: [Email Addresses](https://attack.mitre.org/techniques/T1589/002)). These sites may also have details highlighting business operations and relationships.(Citation: Comparitech Leak)" ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:T1595.001 a owl:Class ; + rdfs:label "Scanning IP Blocks" ; + d3f:attack-id "T1595.001" ; + d3f:definition "Adversaries may scan victim IP blocks to gather information that can be used during targeting. Public IP addresses may be allocated to organizations by block, or a range of sequential addresses." ; + rdfs:subClassOf d3f:T1595 . + +d3f:T1595.002 a owl:Class ; + rdfs:label "Vulnerability Scanning" ; + d3f:attack-id "T1595.002" ; + d3f:definition "Adversaries may scan victims for vulnerabilities that can be used during targeting. Vulnerability scans typically check if the configuration of a target host/application (ex: software and version) potentially aligns with the target of a specific exploit the adversary may seek to use." ; + rdfs:subClassOf d3f:T1595 . + +d3f:T1595.003 a owl:Class ; + rdfs:label "Wordlist Scanning" ; + d3f:attack-id "T1595.003" ; + d3f:definition "Adversaries may iteratively probe infrastructure using brute-forcing and crawling techniques. While this technique employs similar methods to [Brute Force](https://attack.mitre.org/techniques/T1110), its goal is the identification of content and infrastructure rather than the discovery of valid credentials. Wordlists used in these scans may contain generic, commonly used names and file extensions or terms specific to a particular software. Adversaries may also create custom, target-specific wordlists using data gathered from other Reconnaissance techniques (ex: [Gather Victim Org Information](https://attack.mitre.org/techniques/T1591), or [Search Victim-Owned Websites](https://attack.mitre.org/techniques/T1594))." ; + rdfs:subClassOf d3f:T1595 . + +d3f:T1596.001 a owl:Class ; + rdfs:label "DNS/Passive DNS" ; + d3f:attack-id "T1596.001" ; + d3f:definition "Adversaries may search DNS data for information about victims that can be used during targeting. DNS information may include a variety of details, including registered name servers as well as records that outline addressing for a target’s subdomains, mail servers, and other hosts." ; + rdfs:subClassOf d3f:T1596 . + +d3f:T1596.002 a owl:Class ; + rdfs:label "WHOIS" ; + d3f:attack-id "T1596.002" ; + d3f:definition "Adversaries may search public WHOIS data for information about victims that can be used during targeting. WHOIS data is stored by regional Internet registries (RIR) responsible for allocating and assigning Internet resources such as domain names. Anyone can query WHOIS servers for information about a registered domain, such as assigned IP blocks, contact information, and DNS nameservers.(Citation: WHOIS)" ; + rdfs:subClassOf d3f:T1596 . + +d3f:T1596.003 a owl:Class ; + rdfs:label "Digital Certificates" ; + d3f:attack-id "T1596.003" ; + d3f:definition "Adversaries may search public digital certificate data for information about victims that can be used during targeting. Digital certificates are issued by a certificate authority (CA) in order to cryptographically verify the origin of signed content. These certificates, such as those used for encrypted web traffic (HTTPS SSL/TLS communications), contain information about the registered organization such as name and location." ; + rdfs:subClassOf d3f:T1596 . + +d3f:T1596.004 a owl:Class ; + rdfs:label "CDNs" ; + d3f:attack-id "T1596.004" ; + d3f:definition "Adversaries may search content delivery network (CDN) data about victims that can be used during targeting. CDNs allow an organization to host content from a distributed, load balanced array of servers. CDNs may also allow organizations to customize content delivery based on the requestor’s geographical region." ; + rdfs:subClassOf d3f:T1596 . + +d3f:T1596.005 a owl:Class ; + rdfs:label "Scan Databases" ; + d3f:attack-id "T1596.005" ; + d3f:definition "Adversaries may search within public scan databases for information about victims that can be used during targeting. Various online services continuously publish the results of Internet scans/surveys, often harvesting information such as active IP addresses, hostnames, open ports, certificates, and even server banners.(Citation: Shodan)" ; + rdfs:subClassOf d3f:T1596 . + +d3f:T1597.001 a owl:Class ; + rdfs:label "Threat Intel Vendors" ; + d3f:attack-id "T1597.001" ; + d3f:definition "Adversaries may search private data from threat intelligence vendors for information that can be used during targeting. Threat intelligence vendors may offer paid feeds or portals that offer more data than what is publicly reported. Although sensitive details (such as customer names and other identifiers) may be redacted, this information may contain trends regarding breaches such as target industries, attribution claims, and successful TTPs/countermeasures.(Citation: D3Secutrity CTI Feeds)" ; + rdfs:subClassOf d3f:T1597 . + +d3f:T1597.002 a owl:Class ; + rdfs:label "Purchase Technical Data" ; + d3f:attack-id "T1597.002" ; + d3f:definition "Adversaries may purchase technical information about victims that can be used during targeting. Information about victims may be available for purchase within reputable private sources and databases, such as paid subscriptions to feeds of scan databases or other data aggregation services. Adversaries may also purchase information from less-reputable sources such as dark web or cybercrime blackmarkets." ; + rdfs:subClassOf d3f:T1597 . + +d3f:T1598.001 a owl:Class ; + rdfs:label "Spearphishing Service" ; + d3f:attack-id "T1598.001" ; + d3f:definition "Adversaries may send spearphishing messages via third-party services to elicit sensitive information that can be used during targeting. Spearphishing for information is an attempt to trick targets into divulging information, frequently credentials or other actionable information. Spearphishing for information frequently involves social engineering techniques, such as posing as a source with a reason to collect information (ex: [Establish Accounts](https://attack.mitre.org/techniques/T1585) or [Compromise Accounts](https://attack.mitre.org/techniques/T1586)) and/or sending multiple, seemingly urgent messages." ; + rdfs:subClassOf d3f:T1598 . + +d3f:T1598.002 a owl:Class ; + rdfs:label "Spearphishing Attachment" ; + d3f:attack-id "T1598.002" ; + d3f:definition "Adversaries may send spearphishing messages with a malicious attachment to elicit sensitive information that can be used during targeting. Spearphishing for information is an attempt to trick targets into divulging information, frequently credentials or other actionable information. Spearphishing for information frequently involves social engineering techniques, such as posing as a source with a reason to collect information (ex: [Establish Accounts](https://attack.mitre.org/techniques/T1585) or [Compromise Accounts](https://attack.mitre.org/techniques/T1586)) and/or sending multiple, seemingly urgent messages." ; + rdfs:subClassOf d3f:T1598 . + +d3f:T1598.003 a owl:Class ; + rdfs:label "Spearphishing Link" ; + d3f:attack-id "T1598.003" ; + d3f:definition "Adversaries may send spearphishing messages with a malicious link to elicit sensitive information that can be used during targeting. Spearphishing for information is an attempt to trick targets into divulging information, frequently credentials or other actionable information. Spearphishing for information frequently involves social engineering techniques, such as posing as a source with a reason to collect information (ex: [Establish Accounts](https://attack.mitre.org/techniques/T1585) or [Compromise Accounts](https://attack.mitre.org/techniques/T1586)) and/or sending multiple, seemingly urgent messages." ; + rdfs:subClassOf d3f:T1598 . + +d3f:T1598.004 a owl:Class ; + rdfs:label "Spearphishing Voice" ; + d3f:attack-id "T1598.004" ; + d3f:definition "Adversaries may use voice communications to elicit sensitive information that can be used during targeting. Spearphishing for information is an attempt to trick targets into divulging information, frequently credentials or other actionable information. Spearphishing for information frequently involves social engineering techniques, such as posing as a source with a reason to collect information (ex: [Impersonation](https://attack.mitre.org/techniques/T1656)) and/or creating a sense of urgency or alarm for the recipient." ; + rdfs:subClassOf d3f:T1598 . + +d3f:T1599.001 a owl:Class ; + rdfs:label "Network Address Translation Traversal" ; + d3f:attack-id "T1599.001" ; + d3f:definition "Adversaries may bridge network boundaries by modifying a network device’s Network Address Translation (NAT) configuration. Malicious modifications to NAT may enable an adversary to bypass restrictions on traffic routing that otherwise separate trusted and untrusted networks." ; + rdfs:subClassOf d3f:T1599 . + +d3f:T1600.001 a owl:Class ; + rdfs:label "Reduce Key Space" ; + d3f:attack-id "T1600.001" ; + d3f:definition "Adversaries may reduce the level of effort required to decrypt data transmitted over the network by reducing the cipher strength of encrypted communications.(Citation: Cisco Synful Knock Evolution)" ; + rdfs:subClassOf d3f:T1600 . + +d3f:T1600.002 a owl:Class ; + rdfs:label "Disable Crypto Hardware" ; + d3f:attack-id "T1600.002" ; + d3f:definition "Adversaries disable a network device’s dedicated hardware encryption, which may enable them to leverage weaknesses in software encryption in order to reduce the effort involved in collecting, manipulating, and exfiltrating transmitted data." ; + rdfs:subClassOf d3f:T1600 . + +d3f:T1601.001 a owl:Class ; + rdfs:label "Patch System Image" ; + d3f:attack-id "T1601.001" ; + d3f:definition "Adversaries may modify the operating system of a network device to introduce new capabilities or weaken existing defenses.(Citation: Killing the myth of Cisco IOS rootkits) (Citation: Killing IOS diversity myth) (Citation: Cisco IOS Shellcode) (Citation: Cisco IOS Forensics Developments) (Citation: Juniper Netscreen of the Dead) Some network devices are built with a monolithic architecture, where the entire operating system and most of the functionality of the device is contained within a single file. Adversaries may change this file in storage, to be loaded in a future boot, or in memory during runtime." ; + rdfs:subClassOf d3f:T1601 . + +d3f:T1601.002 a owl:Class ; + rdfs:label "Downgrade System Image" ; + d3f:attack-id "T1601.002" ; + d3f:definition "Adversaries may install an older version of the operating system of a network device to weaken security. Older operating system versions on network devices often have weaker encryption ciphers and, in general, fewer/less updated defensive features. (Citation: Cisco Synful Knock Evolution)" ; + rdfs:subClassOf d3f:T1601 . + +d3f:T1602.001 a owl:Class ; + rdfs:label "SNMP (MIB Dump)" ; + d3f:attack-id "T1602.001" ; + d3f:definition "Adversaries may target the Management Information Base (MIB) to collect and/or mine valuable information in a network managed using Simple Network Management Protocol (SNMP)." ; + rdfs:subClassOf d3f:T1602 . + +d3f:T1602.002 a owl:Class ; + rdfs:label "Network Device Configuration Dump" ; + d3f:attack-id "T1602.002" ; + d3f:definition "Adversaries may access network configuration files to collect sensitive data about the device and the network. The network configuration is a file containing parameters that determine the operation of the device. The device typically stores an in-memory copy of the configuration while operating, and a separate configuration on non-volatile storage to load after device reset. Adversaries can inspect the configuration files to reveal information about the target network and its layout, the network device and its software, or identifying legitimate accounts and credentials for later use." ; + rdfs:subClassOf d3f:T1602 . + +d3f:T1606.001 a owl:Class ; + rdfs:label "Web Cookies" ; + d3f:attack-id "T1606.001" ; + d3f:definition "Adversaries may forge web cookies that can be used to gain access to web applications or Internet services. Web applications and services (hosted in cloud SaaS environments or on-premise servers) often use session cookies to authenticate and authorize user access." ; + rdfs:subClassOf d3f:T1606 . + +d3f:T1606.002 a owl:Class ; + rdfs:label "SAML Tokens" ; + d3f:attack-id "T1606.002" ; + d3f:definition "An adversary may forge SAML tokens with any permissions claims and lifetimes if they possess a valid SAML token-signing certificate.(Citation: Microsoft SolarWinds Steps) The default lifetime of a SAML token is one hour, but the validity period can be specified in the NotOnOrAfter value of the conditions ... element in a token. This value can be changed using the AccessTokenLifetime in a LifetimeTokenPolicy.(Citation: Microsoft SAML Token Lifetimes) Forged SAML tokens enable adversaries to authenticate across services that use SAML 2.0 as an SSO (single sign-on) mechanism.(Citation: Cyberark Golden SAML)" ; + rdfs:subClassOf d3f:T1606 . + +d3f:T1608.001 a owl:Class ; + rdfs:label "Upload Malware" ; + d3f:attack-id "T1608.001" ; + d3f:definition "Adversaries may upload malware to third-party or adversary controlled infrastructure to make it accessible during targeting. Malicious software can include payloads, droppers, post-compromise tools, backdoors, and a variety of other malicious content. Adversaries may upload malware to support their operations, such as making a payload available to a victim network to enable [Ingress Tool Transfer](https://attack.mitre.org/techniques/T1105) by placing it on an Internet accessible web server." ; + rdfs:subClassOf d3f:T1608 . + +d3f:T1608.002 a owl:Class ; + rdfs:label "Upload Tool" ; + d3f:attack-id "T1608.002" ; + d3f:definition "Adversaries may upload tools to third-party or adversary controlled infrastructure to make it accessible during targeting. Tools can be open or closed source, free or commercial. Tools can be used for malicious purposes by an adversary, but (unlike malware) were not intended to be used for those purposes (ex: [PsExec](https://attack.mitre.org/software/S0029)). Adversaries may upload tools to support their operations, such as making a tool available to a victim network to enable [Ingress Tool Transfer](https://attack.mitre.org/techniques/T1105) by placing it on an Internet accessible web server." ; + rdfs:subClassOf d3f:T1608 . + +d3f:T1608.003 a owl:Class ; + rdfs:label "Install Digital Certificate" ; + d3f:attack-id "T1608.003" ; + d3f:definition "Adversaries may install SSL/TLS certificates that can be used during targeting. SSL/TLS certificates are files that can be installed on servers to enable secure communications between systems. Digital certificates include information about the key, information about its owner's identity, and the digital signature of an entity that has verified the certificate's contents are correct. If the signature is valid, and the person examining the certificate trusts the signer, then they know they can use that key to communicate securely with its owner. Certificates can be uploaded to a server, then the server can be configured to use the certificate to enable encrypted communication with it.(Citation: DigiCert Install SSL Cert)" ; + rdfs:subClassOf d3f:T1608 . + +d3f:T1608.004 a owl:Class ; + rdfs:label "Drive-by Target" ; + d3f:attack-id "T1608.004" ; + d3f:definition "Adversaries may prepare an operational environment to infect systems that visit a website over the normal course of browsing. Endpoint systems may be compromised through browsing to adversary controlled sites, as in [Drive-by Compromise](https://attack.mitre.org/techniques/T1189). In such cases, the user's web browser is typically targeted for exploitation (often not requiring any extra user interaction once landing on the site), but adversaries may also set up websites for non-exploitation behavior such as [Application Access Token](https://attack.mitre.org/techniques/T1550/001). Prior to [Drive-by Compromise](https://attack.mitre.org/techniques/T1189), adversaries must stage resources needed to deliver that exploit to users who browse to an adversary controlled site. Drive-by content can be staged on adversary controlled infrastructure that has been acquired ([Acquire Infrastructure](https://attack.mitre.org/techniques/T1583)) or previously compromised ([Compromise Infrastructure](https://attack.mitre.org/techniques/T1584))." ; + rdfs:subClassOf d3f:T1608 . + +d3f:T1608.005 a owl:Class ; + rdfs:label "Link Target" ; + d3f:attack-id "T1608.005" ; + d3f:definition "Adversaries may put in place resources that are referenced by a link that can be used during targeting. An adversary may rely upon a user clicking a malicious link in order to divulge information (including credentials) or to gain execution, as in [Malicious Link](https://attack.mitre.org/techniques/T1204/001). Links can be used for spearphishing, such as sending an email accompanied by social engineering text to coax the user to actively click or copy and paste a URL into a browser. Prior to a phish for information (as in [Spearphishing Link](https://attack.mitre.org/techniques/T1598/003)) or a phish to gain initial access to a system (as in [Spearphishing Link](https://attack.mitre.org/techniques/T1566/002)), an adversary must set up the resources for a link target for the spearphishing link." ; + rdfs:subClassOf d3f:T1608 . + +d3f:T1608.006 a owl:Class ; + rdfs:label "SEO Poisoning" ; + d3f:attack-id "T1608.006" ; + d3f:definition "Adversaries may poison mechanisms that influence search engine optimization (SEO) to further lure staged capabilities towards potential victims. Search engines typically display results to users based on purchased ads as well as the site’s ranking/score/reputation calculated by their web crawlers and algorithms.(Citation: Atlas SEO)(Citation: MalwareBytes SEO)" ; + rdfs:subClassOf d3f:T1608 . + +d3f:T1609 a owl:Class ; + rdfs:label "Container Administration Command" ; + d3f:attack-id "T1609" ; + d3f:definition "Adversaries may abuse a container administration service to execute commands within a container. A container administration service such as the Docker daemon, the Kubernetes API server, or the kubelet may allow remote management of containers within an environment.(Citation: Docker Daemon CLI)(Citation: Kubernetes API)(Citation: Kubernetes Kubelet)" ; + rdfs:subClassOf d3f:ExecutionTechnique . + +d3f:T1610 a owl:Class ; + rdfs:label "Deploy Container" ; + d3f:attack-id "T1610" ; + d3f:definition "Adversaries may deploy a container into an environment to facilitate execution or evade defenses. In some cases, adversaries may deploy a new container to execute processes associated with a particular image or deployment, such as processes that execute or download malware. In others, an adversary may deploy a new container configured without network rules, user limitations, etc. to bypass existing defenses within the environment. In Kubernetes environments, an adversary may attempt to deploy a privileged or vulnerable container into a specific node in order to [Escape to Host](https://attack.mitre.org/techniques/T1611) and access other containers running on the node. (Citation: AppSecco Kubernetes Namespace Breakout 2020)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique . + +d3f:T1611 a owl:Class ; + rdfs:label "Escape to Host" ; + d3f:attack-id "T1611" ; + d3f:definition "Adversaries may break out of a container to gain access to the underlying host. This can allow an adversary access to other containerized resources from the host level or to the host itself. In principle, containerized resources should provide a clear separation of application functionality and be isolated from the host environment.(Citation: Docker Overview)" ; + rdfs:subClassOf d3f:PrivilegeEscalationTechnique . + +d3f:T1612 a owl:Class ; + rdfs:label "Build Image on Host" ; + d3f:attack-id "T1612" ; + d3f:definition "Adversaries may build a container image directly on a host to bypass defenses that monitor for the retrieval of malicious images from a public registry. A remote build request may be sent to the Docker API that includes a Dockerfile that pulls a vanilla base image, such as alpine, from a public or local registry and then builds a custom image upon it.(Citation: Docker Build Image)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1613 a owl:Class ; + rdfs:label "Container and Resource Discovery" ; + d3f:attack-id "T1613" ; + d3f:definition "Adversaries may attempt to discover containers and other resources that are available within a containers environment. Other resources may include images, deployments, pods, nodes, and other information such as the status of a cluster." ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1614.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Language Discovery" ; + d3f:attack-id "T1614.001" ; + d3f:definition "Adversaries may attempt to gather information about the system language of a victim in order to infer the geographical location of that host. This information may be used to shape follow-on behaviors, including whether the adversary infects the target and/or attempts specific actions. This decision may be employed by malware developers and operators to reduce their risk of attracting the attention of specific law enforcement agencies or prosecution/scrutiny from other entities.(Citation: Malware System Language Check)" ; + d3f:queries d3f:SystemConfigurationDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:queries ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + d3f:T1614 . + +d3f:T1615 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Group Policy Discovery" ; + d3f:attack-id "T1615" ; + d3f:definition "Adversaries may gather information on Group Policy settings to identify paths for privilege escalation, security measures applied within a domain, and to discover patterns in domain objects that can be manipulated or used to blend in the environment. Group Policy allows for centralized management of user and computer settings in Active Directory (AD). Group policy objects (GPOs) are containers for group policy settings made up of files stored within a predictable network path `\\\\SYSVOL\\\\Policies\\`.(Citation: TechNet Group Policy Basics)(Citation: ADSecurity GPO Persistence 2016)" ; + d3f:reads d3f:GroupPolicy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:GroupPolicy ], + d3f:DiscoveryTechnique . + +d3f:T1619 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Storage Object Discovery" ; + d3f:accesses d3f:CloudStorage ; + d3f:attack-id "T1619" ; + d3f:definition "Adversaries may enumerate objects in cloud storage infrastructure. Adversaries may use this information during automated discovery to shape follow-on behaviors, including requesting all or specific objects from cloud storage. Similar to [File and Directory Discovery](https://attack.mitre.org/techniques/T1083) on a local host, after identifying available storage services (i.e. [Cloud Infrastructure Discovery](https://attack.mitre.org/techniques/T1580)) adversaries may access the contents/objects stored in cloud infrastructure." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:CloudStorage ], + d3f:DiscoveryTechnique . + +d3f:T1620 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Reflective Code Loading" ; + d3f:attack-id "T1620" ; + d3f:definition "Adversaries may reflectively load code into a process in order to conceal the execution of malicious payloads. Reflective loading involves allocating then executing payloads directly within the memory of the process, vice creating a thread or process backed by a file path on disk (e.g., [Shared Modules](https://attack.mitre.org/techniques/T1129))." ; + d3f:modifies d3f:ProcessSegment ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ProcessSegment ], + d3f:DefenseEvasionTechnique . + +d3f:T1621 a owl:Class ; + rdfs:label "Multi-Factor Authentication Request Generation" ; + d3f:attack-id "T1621" ; + d3f:definition "Adversaries may attempt to bypass multi-factor authentication (MFA) mechanisms and gain access to accounts by generating MFA requests sent to users." ; + rdfs:subClassOf d3f:CredentialAccessTechnique . + +d3f:T1622 a owl:Class ; + rdfs:label "Debugger Evasion" ; + d3f:attack-id "T1622" ; + d3f:definition "Adversaries may employ various means to detect and avoid debuggers. Debuggers are typically used by defenders to trace and/or analyze the execution of potential malware payloads.(Citation: ProcessHacker Github)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:DiscoveryTechnique . + +d3f:T1647 a owl:Class ; + rdfs:label "Plist File Modification" ; + d3f:attack-id "T1647" ; + d3f:definition "Adversaries may modify property list files (plist files) to enable other malicious activity, while also potentially evading and bypassing system defenses. macOS applications use plist files, such as the info.plist file, to store properties and configuration settings that inform the operating system how to handle the application at runtime. Plist files are structured metadata in key-value pairs formatted in XML based on Apple's Core Foundation DTD. Plist files can be saved in text or binary format.(Citation: fileinfo plist file description)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1648 a owl:Class ; + rdfs:label "Serverless Execution" ; + d3f:attack-id "T1648" ; + d3f:definition "Adversaries may abuse serverless computing, integration, and automation services to execute arbitrary code in cloud environments. Many cloud providers offer a variety of serverless resources, including compute engines, application integration services, and web servers." ; + rdfs:subClassOf d3f:ExecutionTechnique . + +d3f:T1649 a owl:Class ; + rdfs:label "Steal or Forge Authentication Certificates" ; + d3f:attack-id "T1649" ; + d3f:definition "Adversaries may steal or forge certificates used for authentication to access remote systems or resources. Digital certificates are often used to sign and encrypt messages and/or files. Certificates are also used as authentication material. For example, Azure AD device certificates and Active Directory Certificate Services (AD CS) certificates bind to an identity and can be used as credentials for domain accounts.(Citation: O365 Blog Azure AD Device IDs)(Citation: Microsoft AD CS Overview)" ; + rdfs:subClassOf d3f:CredentialAccessTechnique . + +d3f:T1650 a owl:Class ; + rdfs:label "Acquire Access" ; + d3f:attack-id "T1650" ; + d3f:definition "Adversaries may purchase or otherwise acquire an existing access to a target system or network. A variety of online services and initial access broker networks are available to sell access to previously compromised systems.(Citation: Microsoft Ransomware as a Service)(Citation: CrowdStrike Access Brokers)(Citation: Krebs Access Brokers Fortune 500) In some cases, adversary groups may form partnerships to share compromised systems with each other.(Citation: CISA Karakurt 2022)" ; + rdfs:subClassOf d3f:ResourceDevelopmentTechnique . + +d3f:T1651 a owl:Class ; + rdfs:label "Cloud Administration Command" ; + d3f:attack-id "T1651" ; + d3f:definition "Adversaries may abuse cloud management services to execute commands within virtual machines. Resources such as AWS Systems Manager, Azure RunCommand, and Runbooks allow users to remotely run scripts in virtual machines by leveraging installed virtual machine agents. (Citation: AWS Systems Manager Run Command)(Citation: Microsoft Run Command)" ; + rdfs:subClassOf d3f:ExecutionTechnique . + +d3f:T1652 a owl:Class ; + rdfs:label "Device Driver Discovery" ; + d3f:attack-id "T1652" ; + d3f:definition "Adversaries may attempt to enumerate local device drivers on a victim host. Information about device drivers may highlight various insights that shape follow-on behaviors, such as the function/purpose of the host, present security tools (i.e. [Security Software Discovery](https://attack.mitre.org/techniques/T1518/001)) or other defenses (e.g., [Virtualization/Sandbox Evasion](https://attack.mitre.org/techniques/T1497)), as well as potential exploitable vulnerabilities (e.g., [Exploitation for Privilege Escalation](https://attack.mitre.org/techniques/T1068))." ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1653 a owl:Class ; + rdfs:label "Power Settings" ; + d3f:attack-id "T1653" ; + d3f:definition "Adversaries may impair a system's ability to hibernate, reboot, or shut down in order to extend access to infected machines. When a computer enters a dormant state, some or all software and hardware may cease to operate which can disrupt malicious activity.(Citation: Sleep, shut down, hibernate)" ; + rdfs:subClassOf d3f:PersistenceTechnique . + +d3f:T1654 a owl:Class ; + rdfs:label "Log Enumeration" ; + d3f:attack-id "T1654" ; + d3f:definition "Adversaries may enumerate system and service logs to find useful data. These logs may highlight various types of valuable insights for an adversary, such as user authentication records ([Account Discovery](https://attack.mitre.org/techniques/T1087)), security or vulnerable software ([Software Discovery](https://attack.mitre.org/techniques/T1518)), or hosts within a compromised network ([Remote System Discovery](https://attack.mitre.org/techniques/T1018))." ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1656 a owl:Class ; + rdfs:label "Impersonation" ; + d3f:attack-id "T1656" ; + d3f:definition "Adversaries may impersonate a trusted person or organization in order to persuade and trick a target into performing some action on their behalf. For example, adversaries may communicate with victims (via [Phishing for Information](https://attack.mitre.org/techniques/T1598), [Phishing](https://attack.mitre.org/techniques/T1566), or [Internal Spearphishing](https://attack.mitre.org/techniques/T1534)) while impersonating a known sender such as an executive, colleague, or third-party vendor. Established trust can then be leveraged to accomplish an adversary’s ultimate goals, possibly against multiple victims." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1657 a owl:Class ; + rdfs:label "Financial Theft" ; + d3f:attack-id "T1657" ; + d3f:definition "Adversaries may steal monetary resources from targets through extortion, social engineering, technical theft, or other methods aimed at their own financial gain at the expense of the availability of these resources for victims. Financial theft is the ultimate objective of several popular campaign types including extortion by ransomware,(Citation: FBI-ransomware) business email compromise (BEC) and fraud,(Citation: FBI-BEC) \"pig butchering,\"(Citation: wired-pig butchering) bank hacking,(Citation: DOJ-DPRK Heist) and exploiting cryptocurrency networks.(Citation: BBC-Ronin)" ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1659 a owl:Class ; + rdfs:label "Content Injection" ; + d3f:attack-id "T1659" ; + d3f:definition "Adversaries may gain access and continuously communicate with victims by injecting malicious content into systems through online network traffic. Rather than luring victims to malicious payloads hosted on a compromised website (i.e., [Drive-by Target](https://attack.mitre.org/techniques/T1608/004) followed by [Drive-by Compromise](https://attack.mitre.org/techniques/T1189)), adversaries may initially access victims through compromised data-transfer channels where they can manipulate traffic and/or inject their own content. These compromised online network channels may also be used to deliver additional payloads (i.e., [Ingress Tool Transfer](https://attack.mitre.org/techniques/T1105)) and other data to already compromised systems.(Citation: ESET MoustachedBouncer)" ; + rdfs:subClassOf d3f:CommandAndControlTechnique, + d3f:InitialAccessTechnique . + +d3f:T1665 a owl:Class ; + rdfs:label "Hide Infrastructure" ; + d3f:attack-id "T1665" ; + d3f:definition "Adversaries may manipulate network traffic in order to hide and evade detection of their C2 infrastructure. This can be accomplished in various ways including by identifying and filtering traffic from defensive tools,(Citation: TA571) masking malicious domains to obfuscate the true destination from both automated scanning tools and security researchers,(Citation: Schema-abuse)(Citation: Facad1ng)(Citation: Browser-updates) and otherwise hiding malicious artifacts to delay discovery and prolong the effectiveness of adversary infrastructure that could otherwise be identified, blocked, or taken down entirely." ; + rdfs:subClassOf d3f:CommandAndControlTechnique . + +d3f:T1666 a owl:Class ; + rdfs:label "Modify Cloud Resource Hierarchy" ; + d3f:attack-id "T1666" ; + d3f:definition "Adversaries may attempt to modify hierarchical structures in infrastructure-as-a-service (IaaS) environments in order to evade defenses." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:TFTPServer a owl:Class ; + rdfs:label "TFTP Server" ; + d3f:definition "Trivial File Transfer Protocol (TFTP) is a simple file transfer protocol, typically used to automatically transfer configuration or boot files between machines. It is used where user authentication and directory visibility are not required." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Server . + +d3f:TabletComputer a owl:Class ; + rdfs:label "Tablet Computer" ; + d3f:definition "A tablet computer, commonly shortened to tablet, is a mobile device, typically with a mobile operating system and touchscreen display processing circuitry, and a rechargeable battery in a single, thin and flat package. Tablets, being computers, do what other personal computers do, but lack some input/output (I/O) abilities that others have. Modern tablets largely resemble modern smartphones, the only differences being that tablets are relatively larger than smartphones, with screens 7 inches (18 cm) or larger, measured diagonally, and may not support access to a cellular network." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:PersonalComputer ; + skos:altLabel "Tablet" . + +d3f:TemporalLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Temporal Logic" ; + d3f:d3fend-id "D3A-TL" ; + d3f:definition "Temporal logic addresses the semantics of tense; i.e., qualifying expressions of when." ; + d3f:kb-article """## References +1. Temporal logic. (2023, June 4). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Modal_logic#Temporal_logic)""" ; + rdfs:subClassOf d3f:ModalLogic . + +d3f:TertiaryStorage a owl:Class ; + rdfs:label "Tertiary Storage" ; + d3f:definition "Tertiary storage or tertiary memory is memory primarily used for archiving rarely accessed information. It is primarily useful for extraordinarily large data stores. Typical examples include tape libraries and optical jukeboxes." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:HardwareDevice, + d3f:MemoryBlock, + d3f:SecondaryStorage . + +d3f:ThreadStartFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Thread Start Function" ; + d3f:definition "A function which invokes a create thread system call." ; + d3f:executes d3f:Thread ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:Thread ], + d3f:Subroutine . + +d3f:TrajectoryPrediction a owl:Class ; + rdfs:label "Trajectory Prediction" ; + rdfs:subClassOf d3f:Forecasting . + +d3f:TransducerSensor a owl:Class ; + rdfs:label "Transducer Sensor" ; + rdfs:subClassOf d3f:Sensor . + +d3f:Transformer-XL a owl:Class, + owl:NamedIndividual ; + rdfs:label "Transformer-XL" ; + d3f:d3fend-id "D3A-TX" ; + d3f:definition "Transformer-XL is a transformer architecture that introduces the notion of recurrence to the deep self-attention network. Instead of computing the hidden states from scratch for each new segment, Transformer-XL reuses the hidden states obtained in previous segments." ; + d3f:kb-article """## References +Transformer-XL. (n.d.). Papers with Code. [Link](https://paperswithcode.com/method/transformer-xl)""" ; + rdfs:subClassOf d3f:Transformer-basedLearning . + +d3f:TransportLink a owl:Class ; + rdfs:label "Transport Link" ; + rdfs:subClassOf d3f:LogicalLink . + +d3f:TunnelCloseEvent a owl:Class ; + rdfs:label "Tunnel Close Event" ; + d3f:definition "An event where a network tunnel is terminated, ending encapsulated communication and releasing the associated resources." ; + rdfs:subClassOf d3f:TunnelEvent . + +d3f:TunnelOpenEvent a owl:Class ; + rdfs:label "Tunnel Open Event" ; + d3f:definition "An event where a network tunnel is established, enabling encapsulated communication between endpoints. This marks the initiation of secure or isolated data transport through the tunnel." ; + rdfs:subClassOf d3f:TunnelEvent . + +d3f:TunnelRenewEvent a owl:Class ; + rdfs:label "Tunnel Renew Event" ; + d3f:definition "An event where the lifecycle of a network tunnel is extended, ensuring continued encapsulated communication and avoiding session expiration." ; + rdfs:subClassOf d3f:TunnelEvent . + +d3f:UncertaintySampling a owl:Class, + owl:NamedIndividual ; + rdfs:label "Uncertainty Sampling" ; + d3f:d3fend-id "D3A-US" ; + d3f:definition "Makes the utility inversely proportional to the uncertainty of the model with respect to the sample and will work with any model provided it can assess its uncertainty of a predection." ; + d3f:kb-article """## References +Intro to Active Learning. inovex Blog. [Link](https://www.inovex.de/de/blog/intro-to-active-learning/).""" ; + rdfs:subClassOf d3f:ActiveLearning . + +d3f:UnitTestExecutionTool a owl:Class ; + rdfs:label "Unit Test Execution Tool" ; + d3f:definition "An unit test execution tool automatically performs unit testing. Unit testing is a software testing method by which individual units of source code are tested to determine whether they are fit for use. Unit test execution tools work with sets of one or more computer program modules together with associated control data, usage procedures, and operating procedures. This contrasts with integration testing, which tests inter-unit dependencies and the modules as a group." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:TestExecutionTool . + +d3f:UnixHardLink a owl:Class ; + rdfs:label "Unix Hard Link" ; + d3f:definition "A Unix hard link is a hard link on a Unix file system." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:HardLink, + d3f:UnixLink . + +d3f:UnloadLibraryEvent a owl:Class ; + rdfs:label "Unload Library Event" ; + d3f:definition "An event where a process unloads a dynamically linked library or module, reducing its memory footprint or functionality." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:SharedLibraryFile ], + d3f:ProcessEvent . + +d3f:UseCaseGoal a owl:Class ; + rdfs:label "Use Case Goal" ; + rdfs:subClassOf d3f:Goal . + +d3f:UseCasePrerequisite a owl:Class ; + rdfs:label "Use Case Prerequisite" ; + rdfs:subClassOf d3f:Condition . + +d3f:UseCaseProcedure a owl:Class ; + rdfs:label "Use Case Procedure" ; + rdfs:subClassOf d3f:Procedure . + +d3f:UseCaseStep a owl:Class ; + rdfs:label "Use Case Step" ; + rdfs:subClassOf d3f:Step . + +d3f:UserAccountAttachPolicyEvent a owl:Class ; + rdfs:label "User Account Attach Policy Event" ; + d3f:definition "An event where an IAM policy is attached to a user account." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountCreationEvent a owl:Class ; + rdfs:label "User Account Creation Event" ; + d3f:definition "An event representing the creation of a new user account within a system or domain." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountDeletionEvent a owl:Class ; + rdfs:label "User Account Deletion Event" ; + d3f:definition "An event representing the permanent deletion of a user account from a system or domain." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountDetachPolicyEvent a owl:Class ; + rdfs:label "User Account Detach Policy Event" ; + d3f:definition "An event where an IAM policy is detached from a user account." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountDisableEvent a owl:Class ; + rdfs:label "User Account Disable Event" ; + d3f:definition "An event where a user account is disabled, preventing its active use within the system." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountEnableEvent a owl:Class ; + rdfs:label "User Account Enable Event" ; + d3f:definition "An event where a user account is enabled, granting it active use within the system." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountLockEvent a owl:Class ; + rdfs:label "User Account Lock Event" ; + d3f:definition "An event where a user account is locked out due to failed authentication attempts or administrative action." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountMFADisableEvent a owl:Class ; + rdfs:label "User Account MFA Disable Event" ; + d3f:definition "An event where multi-factor authentication (MFA) is disabled for a user account." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountMFAEnableEvent a owl:Class ; + rdfs:label "User Account MFA Enable Event" ; + d3f:definition "An event where multi-factor authentication (MFA) is enabled for a user account." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountPasswordChangeEvent a owl:Class ; + rdfs:label "User Account Password Change Event" ; + d3f:definition "An event where a user account's password is modified, typically by the user or an administrator." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountPasswordResetEvent a owl:Class ; + rdfs:label "User Account Password Reset Event" ; + d3f:definition "An event where a user account's password is reset, typically due to a forgotten password or administrative action." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserAccountUpdateEvent a owl:Class ; + rdfs:label "User Account Update Event" ; + d3f:definition "An event capturing updates to a user account, including changes to its attributes or configuration." ; + rdfs:subClassOf d3f:UserAccountEvent . + +d3f:UserBehavior a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Behavior" ; + d3f:contains d3f:UserAction ; + d3f:definition "A user behavior is a pattern of user actions, or set of such patterns. Modeling and analyzing these patterns and monitoring a users actions for meaningful anomalies is known as user behavior analytics (UBA)." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:UserAction ], + d3f:DigitalInformationBearer . + +d3f:UserProfile a owl:Class ; + rdfs:label "User Profile" ; + d3f:definition "A user profile is a collection of settings and information associated with a user. It contains critical information that is used to identify an individual, such as their name, age, portrait photograph and individual characteristics such as knowledge or expertise." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:UserStartupDirectory a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Startup Directory" ; + d3f:contains d3f:UserStartupScriptFile ; + d3f:definition "A user startup directory holds information necessary to start the users session with the system." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:UserStartupScriptFile ], + d3f:UserLogonInitResource . + +d3f:VPNServer a owl:Class ; + rdfs:label "VPN Server" ; + d3f:definition """A VPN server is a type of server that enables hosting and delivery of VPN services. + +It is a combination of VPN hardware and software technologies that provides VPN clients with connectivity to a secure and/or private network, or rather, the VPN.""" ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Server . + +d3f:VarianceReduction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Variance Reduction" ; + d3f:d3fend-id "D3A-VR" ; + d3f:definition "Leverages a well-known result from statistical learning and decomposes the model error into a data noise term, a model bias term and a model variance term. As the noise term only depends on the data and the bias is induced by the choice of model, any reduction in the error can only come from the variance term." ; + d3f:kb-article """## References +Intro to Active Learning. inovex Blog. [Link](https://www.inovex.de/de/blog/intro-to-active-learning/).""" ; + rdfs:subClassOf d3f:ActiveLearning . + +d3f:Vendor a owl:Class ; + rdfs:label "Vendor" ; + rdfs:subClassOf d3f:Provider . + +d3f:VersionControlTool a owl:Class ; + rdfs:label "Version Control Tool" ; + d3f:definition "Version control tools are tools that used to conduct version control. A component of software configuration management, version control, also known as revision control, source control, or source code management systems are systems responsible for the management of changes to documents, computer programs, large web sites, and other collections of information. Changes are usually identified by a number or letter code, termed the \"revision number\", \"revision level\", or simply \"revision\". For example, an initial set of files is \"revision 1\". When the first change is made, the resulting set is \"revision 2\", and so on. Each revision is associated with a timestamp and the person making the change. Revisions can be compared, restored, and with some types of files, merged." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DeveloperApplication ; + skos:altLabel "Revision Control", + "Source Control" . + +d3f:Voting a owl:Class, + owl:NamedIndividual ; + rdfs:label "Voting" ; + d3f:d3fend-id "D3A-VOT" ; + d3f:definition "Voting is another form of ensembling." ; + d3f:kb-article """## References +Ensemble learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Ensemble_learning).""" ; + rdfs:subClassOf d3f:EnsembleLearning . + +d3f:WHOISCompatibleDomainRegistration a d3f:DomainRegistration, + owl:NamedIndividual ; + rdfs:label "WHOIS Compatible Domain Registration" . + +d3f:WebAPIResource a owl:Class ; + rdfs:label "Web API Resource" ; + d3f:definition "A web API resource is an API resource identified by a Uniform Resource Identifier (URI) and made available from one host to another host via a web protocol and across a network or networks." ; + rdfs:subClassOf d3f:WebResource . + +d3f:WebAccessToken a owl:Class ; + rdfs:label "Web Access Token" ; + d3f:definition "A web access token is a credential that allows a web client application to access a specific resource to perform specific actions on behalf of the user." ; + d3f:synonym "WAT" ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:SessionToken . + +d3f:WebApplicationFirewall a owl:Class ; + rdfs:label "Web Application Firewall" ; + d3f:definition "A web application firewall (or WAF) filters, monitors, and blocks HTTP traffic to and from a web application. A WAF is differentiated from a regular firewall in that a WAF is able to filter the content of specific web applications while regular firewalls serve as a safety gate between servers. By inspecting HTTP traffic, it can prevent attacks stemming from web application security flaws, such as SQL injection, cross-site scripting (XSS), file inclusion, and security misconfigurations." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ApplicationLayerFirewall ; + skos:altLabel "WAF" . + +d3f:WebApplicationServer a owl:Class ; + rdfs:label "Web Application Server" ; + d3f:definition "A web application server is a web server that hosts applications. Application server frameworks are software frameworks for building application servers. An application server framework provides both facilities to create web applications and a server environment to run them. In the case of Java application servers, the server behaves like an extended virtual machine for running applications, transparently handling connections to the database on one side, and, often, connections to the Web client on the other." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:WebServer . + +d3f:WebIdentityToken a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Identity Token" ; + d3f:definition "An ID token is an artifact that proves that the user has been authenticated." ; + d3f:kb-article """## How it works + +An ID token is proof of the user's authentication. An ID token is encoded as a JSON Web Token (JWT), a standard format that allows your application to easily inspect its content, and make sure it comes from the expected issuer and that no one else changed it.""" ; + d3f:signed-by d3f:CryptographicKey ; + d3f:synonym "Identity Token" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:signed-by ; + owl:someValuesFrom d3f:CryptographicKey ], + d3f:Credential . + +d3f:WebSocketURL a d3f:URL, + owl:NamedIndividual ; + rdfs:label "Web Socket URL" . + +d3f:WideAreaNetwork a owl:Class ; + rdfs:label "Wide Area Network" ; + d3f:definition "By contrast to a local area network (LAN), a wide area network (WAN), not only covers a larger geographic distance, but also generally involves leased telecommunication circuits or Internet links." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Network ; + skos:altLabel "WAN" . + +d3f:WindowOpenFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows OpenFile" ; + d3f:definition "Creates, opens, reopens, or deletes a file." ; + d3f:invokes d3f:WindowsNtOpenFile ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtOpenFile ], + d3f:OSAPICreateFile, + d3f:OSAPIOpenFile . + +d3f:WindowsBatchFile a d3f:ExecutableScript, + owl:NamedIndividual ; + rdfs:label "Windows Batch File" . + +d3f:WindowsCreateFileA a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows CreateFileA" ; + d3f:definition "Creates or opens a file or I/O device. The most commonly used I/O devices are as follows: file, file stream, directory, physical disk, volume, console buffer, tape drive, communications resource, mailslot, and pipe. The function returns a handle that can be used to access the file or device for various types of I/O depending on the file or device and the flags and attributes specified." ; + d3f:invokes d3f:WindowsNtCreateFile, + d3f:WindowsNtCreateMailslotFile, + d3f:WindowsNtCreateNamedPipeFile, + d3f:WindowsNtCreatePagingFile ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtCreateMailslotFile ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtCreatePagingFile ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtCreateFile ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtCreateNamedPipeFile ], + d3f:OSAPICreateFile, + d3f:OSAPIOpenFile . + +d3f:WindowsCreateProcessA a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows CreateProcessA" ; + d3f:definition "Creates a new process and its primary thread. The new process runs in the security context of the calling process." ; + d3f:invokes d3f:WindowsNtCreateProcess, + d3f:WindowsNtCreateProcessEx ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtCreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtCreateProcessEx ], + d3f:OSAPICreateProcess . + +d3f:WindowsCreateRemoteThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows CreateRemoteThread" ; + d3f:invokes d3f:WindowsNtCreateThreadEx ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtCreateThreadEx ], + d3f:OSAPICreateThread . + +d3f:WindowsCreateThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows CreateThread" ; + d3f:definition "Creates a thread to execute within the virtual address space of the calling process." ; + d3f:invokes d3f:WindowsNtCreateThread, + d3f:WindowsNtCreateThreadEx ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtCreateThreadEx ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtCreateThread ], + d3f:OSAPICreateThread . + +d3f:WindowsDeleteFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows DeleteFile" ; + d3f:definition "Deletes an existing file." ; + d3f:invokes d3f:WindowsNtDeleteFile ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtDeleteFile ], + d3f:OSAPIDeleteFile . + +d3f:WindowsDuplicateToken a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows DuplicateToken" ; + d3f:definition "The DuplicateToken function creates a new access token that duplicates one already in existence." ; + d3f:invokes d3f:WindowsNtDuplicateToken ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtDuplicateToken ], + d3f:OSAPICopyToken . + +d3f:WindowsGetThreadContext a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows GetThreadContext" ; + d3f:definition "Retrieves the context of the specified thread." ; + d3f:invokes d3f:WindowsNTGetThreadContext ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNTGetThreadContext ], + d3f:OSAPIGetThreadContext . + +d3f:WindowsNtAllocateVirtualMemoryEx a owl:Class ; + rdfs:label "Windows NtAllocateVirtualMemoryEx" ; + rdfs:subClassOf d3f:OSAPIAllocateMemory . + +d3f:WindowsNtSetInformationFileArgumentFileDispositionInformation a owl:Class ; + rdfs:label "Windows NtSetInformationFile Argument FileDispositionInformation" ; + d3f:definition "Request to delete the file when it is closed or cancel a previously requested deletion." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIDeleteFile . + +d3f:WindowsNtSuspendProcess a owl:Class ; + rdfs:label "Windows NtSuspendProcess" ; + rdfs:subClassOf d3f:OSAPISuspendProcess . + +d3f:WindowsOpenProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows OpenProcess" ; + d3f:definition "Opens an existing local process object." ; + d3f:invokes d3f:WindowsNtOpenProcess ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtOpenProcess ], + d3f:OSAPITraceProcess . + +d3f:WindowsOpenThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows OpenThread" ; + d3f:definition "Opens an existing thread object." ; + d3f:invokes d3f:WindowsNtOpenThread ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtOpenThread ], + d3f:OSAPITraceThread . + +d3f:WindowsProcess a d3f:Process, + owl:NamedIndividual ; + rdfs:label "Windows Process" . + +d3f:WindowsQueryPerformanceCounter a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows QueryPerformanceCounter" ; + d3f:definition "Retrieves the current value of the performance counter, which is a high resolution (<1us) time stamp that can be used for time-interval measurements." ; + d3f:invokes d3f:WindowsNtQuerySystemTime ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtQuerySystemTime ], + d3f:OSAPIGetSystemTime . + +d3f:WindowsReadFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows ReadFile" ; + d3f:definition "Reads data from the specified file or input/output (I/O) device. Reads occur at the position specified by the file pointer if supported by the device." ; + d3f:invokes d3f:WindowsNtReadFile, + d3f:WindowsNtReadFileScatter ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtReadFileScatter ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtReadFile ], + d3f:OSAPIReadFile . + +d3f:WindowsRegistryKeyCreationEvent a owl:Class ; + rdfs:label "Windows Registry Key Creation Event" ; + d3f:definition "An event where a new registry key is added to the Windows Registry, establishing a new hierarchical node for configuration." ; + rdfs:subClassOf d3f:WindowsRegistryKeyEvent . + +d3f:WindowsRegistryKeyDeletionEvent a owl:Class ; + rdfs:label "Windows Registry Key Deletion Event" ; + d3f:definition "An event representing the removal of a registry key from the Windows Registry, including its hierarchical structure and associated metadata." ; + rdfs:subClassOf d3f:WindowsRegistryKeyEvent . + +d3f:WindowsRegistryKeyExportEvent a owl:Class ; + rdfs:label "Windows Registry Key Export Event" ; + d3f:definition "An event representing the export of registry key data from the Windows Registry to an external file or format." ; + rdfs:subClassOf d3f:WindowsRegistryKeyEvent . + +d3f:WindowsRegistryKeyImportEvent a owl:Class ; + rdfs:label "Windows Registry Key Import Event" ; + d3f:definition "An event where registry key data is imported into the Windows Registry from an external source." ; + rdfs:subClassOf d3f:WindowsRegistryKeyEvent . + +d3f:WindowsRegistryKeyReadEvent a owl:Class ; + rdfs:label "Windows Registry Key Read Event" ; + d3f:definition "An event where a registry key is accessed to query its structure, properties, or associated metadata without modifying its state." ; + rdfs:subClassOf d3f:WindowsRegistryKeyEvent . + +d3f:WindowsRegistryKeyRenamingEvent a owl:Class ; + rdfs:label "Windows Registry Key Renaming Event" ; + d3f:definition "An event where the name of a registry key is changed, altering its identifier within the registry hierarchy." ; + rdfs:subClassOf d3f:WindowsRegistryKeyEvent . + +d3f:WindowsRegistryKeyRestoreEvent a owl:Class ; + rdfs:label "Windows Registry Key Restore Event" ; + d3f:definition "An event where a registry key is restored to a previous state using a backup or recovery mechanism." ; + rdfs:subClassOf d3f:WindowsRegistryKeyEvent . + +d3f:WindowsRegistryKeySetSecurityEvent a owl:Class ; + rdfs:label "Windows Registry Key Set Security Event" ; + d3f:definition "An event representing the application or modification of access controls or security settings to a registry key." ; + rdfs:subClassOf d3f:WindowsRegistryKeyEvent . + +d3f:WindowsRegistryKeyUpdateEvent a owl:Class ; + rdfs:label "Windows Registry Key Update Event" ; + d3f:definition "An event where an existing registry key is updated or reconfigured, reflecting changes to its metadata or properties." ; + rdfs:subClassOf d3f:WindowsRegistryKeyEvent . + +d3f:WindowsRegistryValueDeletionEvent a owl:Class ; + rdfs:label "Windows Registry Value Deletion Event" ; + d3f:definition "An event where a registry value is deleted from the Windows Registry, permanently removing its associated data." ; + rdfs:subClassOf d3f:WindowsRegistryValueEvent . + +d3f:WindowsRegistryValueGetEvent a owl:Class ; + rdfs:label "Windows Registry Value Get Event" ; + d3f:definition "An event where the data of a registry value is retrieved, typically to read its configuration or state." ; + rdfs:subClassOf d3f:WindowsRegistryValueEvent . + +d3f:WindowsRegistryValueSetEvent a owl:Class ; + rdfs:label "Windows Registry Value Set Event" ; + d3f:definition "An event where data is assigned to a registry value, either creating it or updating its existing content." ; + rdfs:subClassOf d3f:WindowsRegistryValueEvent . + +d3f:WindowsRegistryValueUpdateEvent a owl:Class ; + rdfs:label "Windows Registry Value Update Event" ; + d3f:definition "An event indicating changes to the data or configuration of an existing registry value within the Windows Registry." ; + rdfs:subClassOf d3f:WindowsRegistryValueEvent . + +d3f:WindowsResumeThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows ResumeThread" ; + d3f:definition "Decrements a thread's suspend count. When the suspend count is decremented to zero, the execution of the thread is resumed." ; + d3f:invokes d3f:WindowsNtResumeThread ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtResumeThread ], + d3f:OSAPIResumeThread . + +d3f:WindowsSetThreadContext a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows SetThreadContext" ; + d3f:definition "Sets the context for the specified thread." ; + d3f:invokes d3f:WindowsNtSetThreadContext ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtSetThreadContext ], + d3f:OSAPISetThreadContext . + +d3f:WindowsSuspendThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows SuspendThread" ; + d3f:definition "Suspends the specified thread." ; + d3f:invokes d3f:WindowsNtSuspendThread ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtSuspendThread ], + d3f:OSAPISuspendThread . + +d3f:WindowsTerminateProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows TerminateProcess" ; + d3f:definition "Terminates the specified process and all of its threads." ; + d3f:invokes d3f:WindowsNtTerminateProcess ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtTerminateProcess ], + d3f:OSAPITerminateProcess . + +d3f:WindowsVirtualAllocEx a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows VirtualAllocEx" ; + d3f:definition "Reserves, commits, or changes the state of a region of memory within the virtual address space of a specified process. The function initializes the memory it allocates to zero." ; + d3f:invokes d3f:WindowsNtAllocateVirtualMemory, + d3f:WindowsNtProtectVirtualMemory ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtProtectVirtualMemory ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtAllocateVirtualMemory ], + d3f:OSAPIAllocateMemory . + +d3f:WindowsVirtualFree a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows VirtualFree" ; + d3f:definition "Releases, decommits, or releases and decommits a region of pages within the virtual address space of the calling process." ; + d3f:invokes d3f:WindowsNtFreeVirtualMemory ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtFreeVirtualMemory ], + d3f:OSAPIFreeMemory . + +d3f:WindowsVirtualProtectEx a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows VirtualProtectEx" ; + d3f:definition "Changes the protection on a region of committed pages in the virtual address space of a specified process." ; + d3f:invokes d3f:WindowsNtAllocateVirtualMemory, + d3f:WindowsNtProtectVirtualMemory ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtProtectVirtualMemory ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtAllocateVirtualMemory ], + d3f:OSAPIAllocateMemory . + +d3f:WindowsWriteFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows WriteFile" ; + d3f:definition "Writes data to the specified file or input/output (I/O) device." ; + d3f:invokes d3f:WindowsNtWriteFile, + d3f:WindowsNtWriteFileGather ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtWriteFile ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtWriteFileGather ], + d3f:OSAPIWriteFile . + +d3f:WindowsWriteProcessMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows WriteProcessMemory" ; + d3f:definition "Writes data to an area of memory in a specified process. The entire area to be written to must be accessible or the operation fails." ; + d3f:invokes d3f:WindowsNtFlushInstructionCache, + d3f:WindowsNtProtectVirtualMemory, + d3f:WindowsNtWriteVirtualMemory ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtFlushInstructionCache ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtProtectVirtualMemory ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WindowsNtWriteVirtualMemory ], + d3f:OSAPIWriteMemory . + +d3f:WirelessRouter a owl:Class ; + rdfs:label "Wireless Router" ; + d3f:definition "A wireless router is a device that performs the functions of a router and also includes the functions of a wireless access point. It is used to provide access to the Internet or a private computer network. Depending on the manufacturer and model, it can function in a wired local area network, in a wireless-only LAN, or in a mixed wired and wireless network." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Router, + d3f:WirelessAccessPoint . + +d3f:X86CodeSegment a d3f:ImageCodeSegment, + d3f:ProcessCodeSegment, + owl:NamedIndividual ; + rdfs:label "X86 Code Segment" . + +d3f:ZeroClientComputer a owl:Class ; + rdfs:label "Zero Client Computer" ; + d3f:definition "Zero client is also referred as ultra thin client, contains no moving parts but centralizes all processing and storage to just what is running on the server. As a result, it requires no local driver to install, no patch management, and no local operating system licensing fees or updates. The device consumes very little power and is tamper-resistant and completely incapable of storing any data locally, providing a more secure endpoint." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ThinClientComputer . + +d3f:abuses a owl:ObjectProperty ; + rdfs:label "abuses" ; + d3f:definition "x abuses y: The entity x applies an artifact y to a wrong thing or person; x applies y badly or incorrectly." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:uses ; + skos:altLabel "misapplies", + "misuses" . + +d3f:access-mediated-by a owl:ObjectProperty ; + rdfs:label "access mediated by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:mediates-access-to . + +d3f:archived-at a owl:DatatypeProperty ; + rdfs:label "archived-at"@en ; + rdfs:range xsd:anyURI ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:attack-id a owl:AnnotationProperty ; + rdfs:label "attack-id" ; + d3f:definition "x attack-id y: The offensive technique x has the att&ck unique id of y." ; + rdfs:domain d3f:OffensiveTechnique ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:attack-kb-annotation . + +d3f:attack-kb-data-property a owl:DatatypeProperty ; + rdfs:label "attack-kb-data-property" ; + rdfs:subPropertyOf owl:topDataProperty ; + skos:altLabel "attack-kb-property" . + +d3f:available a owl:DatatypeProperty ; + rdfs:label "date available"@en ; + d3f:definition "Date that the resource became or will become available." ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf d3f:date . + +d3f:broader a owl:ObjectProperty ; + rdfs:label "broader" ; + rdfs:subPropertyOf d3f:semantic-relation . + +d3f:broader-transitive a owl:ObjectProperty ; + rdfs:label "broader-transitive" ; + rdfs:subPropertyOf d3f:semantic-relation . + +d3f:capec-id a owl:DatatypeProperty ; + rdfs:label "capec-id" ; + d3f:definition "Unique identifier for a CAPEC technique, i.e. a common attack pattern identified by the pattern CAPEC-[number]." ; + rdfs:subPropertyOf d3f:d3fend-kb-data-property . + +d3f:comments a owl:DatatypeProperty, + owl:FunctionalProperty ; + rdfs:label "comments" ; + d3f:definition "x comments y: x claim has provider comments y." ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:confidence a owl:DatatypeProperty ; + rdfs:label "confidence" ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:contributor a owl:AnnotationProperty . + +d3f:controlled-by a owl:ObjectProperty ; + rdfs:label "controlled-by" ; + d3f:definition "x controlled-by y: x's operation or behavior is directed or regulated by y." ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:controls . + +d3f:created a owl:DatatypeProperty ; + rdfs:label "date created"@en ; + d3f:definition "Date of creation of the resource." ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf d3f:date . + +d3f:cwe-id a owl:AnnotationProperty ; + rdfs:label "cwe-id" ; + rdfs:subPropertyOf d3f:cwe-kb-annotation . + +d3f:d3fend-display-property a owl:DatatypeProperty ; + rdfs:label "d3fend-display-property" ; + d3f:definition "x d3fend-display-property y: An object x should be displayed using the display property y, when it applies." ; + rdfs:subPropertyOf d3f:d3fend-data-property . + +d3f:deceives a owl:ObjectProperty ; + rdfs:label "deceives" ; + rdfs:subPropertyOf d3f:counters . + +d3f:definition a owl:AnnotationProperty ; + rdfs:label "definition" ; + d3f:definition "x definition y: The d3fend object x has the definition y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:d3fend-annotation . + +d3f:description a owl:AnnotationProperty ; + rdfs:label "description"@en ; + d3f:definition "A statement that represents something in words." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:d3fend-catalog-annotation-property . + +d3f:display-baseurl a owl:AnnotationProperty ; + rdfs:label "display-baseurl" ; + d3f:definition "A base string to use as prefix to create a full URL for an entity. The baseurl must end in a forward slash: /" ; + rdfs:subPropertyOf d3f:d3fend-display-annotation . + +d3f:display-order a owl:AnnotationProperty ; + rdfs:label "display-order" ; + d3f:definition "x display-order y: An object x should be displayed in ordinal position y when placed or listed in a d3fend display with other objects of its kind." ; + rdfs:subPropertyOf d3f:d3fend-display-annotation . + +d3f:display-priority a owl:AnnotationProperty ; + rdfs:label "display-priority" ; + rdfs:subPropertyOf d3f:d3fend-display-annotation . + +d3f:employed-by a owl:ObjectProperty ; + rdfs:label "employed-by" ; + d3f:definition "x employed-by y: An entity x is put into service by a technique or agent y. Inverse of y employs x." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:employs . + +d3f:evaluated-by a owl:ObjectProperty ; + rdfs:label "evaluated-by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:evaluates . + +d3f:exactly a owl:ObjectProperty ; + rdfs:label "exactly" ; + rdfs:subPropertyOf d3f:semantic-relation . + +d3f:executed-by a owl:ObjectProperty ; + rdfs:label "executed-by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:executes . + +d3f:expectation-rating a owl:DatatypeProperty ; + rdfs:label "expectation-rating" ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:has-audience a owl:ObjectProperty ; + rdfs:label "has-audience" ; + rdfs:subPropertyOf d3f:d3fend-use-case-object-property . + +d3f:has-contribution a owl:ObjectProperty ; + rdfs:label "has-contribution" ; + rdfs:subPropertyOf d3f:d3fend-kb-object-property . + +d3f:has-contributor a owl:ObjectProperty ; + rdfs:label "has-contributor" ; + rdfs:subPropertyOf d3f:d3fend-kb-object-property . + +d3f:has-goal a owl:ObjectProperty ; + rdfs:label "has-goal" ; + rdfs:subPropertyOf d3f:d3fend-use-case-object-property . + +d3f:has-prerequisite a owl:ObjectProperty ; + rdfs:label "has-prerequisite" ; + rdfs:subPropertyOf d3f:d3fend-use-case-object-property . + +d3f:has-procedure a owl:ObjectProperty ; + rdfs:label "has-procedure" ; + rdfs:subPropertyOf d3f:d3fend-general-object-property . + +d3f:has-weakness a owl:ObjectProperty ; + rdfs:label "has-weakness" ; + rdfs:subPropertyOf d3f:may-have-weakness ; + owl:inverseOf d3f:weakness-of . + +d3f:iOSProcess a d3f:Process, + owl:NamedIndividual ; + rdfs:label "iOS Process" . + +d3f:identifier a owl:DatatypeProperty ; + rdfs:label "identifier"@en ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:impairs a owl:ObjectProperty ; + rdfs:label "impairs" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:inventoried-by a owl:ObjectProperty ; + rdfs:label "inventoried-by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:inventories . + +d3f:invoked-by a owl:ObjectProperty ; + rdfs:label "invoked-by" ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-be-invoked-by ; + owl:inverseOf d3f:invokes . + +d3f:issued a owl:DatatypeProperty ; + rdfs:label "date issued"@en ; + d3f:definition "Date of formal issuance of the resource." ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf d3f:date . + +d3f:kb-abstract a owl:AnnotationProperty ; + rdfs:label "kb-abstract" ; + d3f:definition "x kb-abstract y: The reference x has the abstract y." ; + rdfs:domain d3f:TechniqueReference ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-kb-reference-annotation . + +d3f:kb-article a owl:AnnotationProperty ; + rdfs:label "kb-article" ; + d3f:definition "The technique x has the kb-article y, where y is written in Markdown." ; + rdfs:domain d3f:Technique ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-kb-reference-annotation . + +d3f:kb-author a owl:AnnotationProperty ; + rdfs:label "kb-author" ; + d3f:definition "x kb-author y: The reference x has some author y." ; + rdfs:domain d3f:TechniqueReference ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-kb-reference-annotation . + +d3f:kb-mitre-analysis a owl:AnnotationProperty ; + rdfs:label "kb-mitre-analysis" ; + d3f:definition "x kb-mitre-analysis y: The reference x has the mitre d3fend analysis y." ; + rdfs:domain d3f:TechniqueReference ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-kb-annotation-property . + +d3f:kb-organization a owl:AnnotationProperty ; + rdfs:label "kb-organization" ; + d3f:definition "x kb-organization y: The reference x was created or owned by the organization y." ; + rdfs:subPropertyOf d3f:d3fend-kb-annotation-property . + +d3f:label a owl:AnnotationProperty ; + rdfs:label "label"@en ; + rdfs:subPropertyOf rdfs:label . + +d3f:loaded-by a owl:ObjectProperty ; + rdfs:label "loaded-by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:loads . + +d3f:macOSProcess a d3f:Process, + owl:NamedIndividual ; + rdfs:label "macOS Process" . + +d3f:mapped-by a owl:ObjectProperty ; + rdfs:label "mapped-by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:maps . + +d3f:may-be-deceived-by a owl:ObjectProperty ; + rdfs:label "may-be-deceived-by" ; + d3f:pref-label "may be deceived by" ; + rdfs:subPropertyOf d3f:attack-may-be-countered-by ; + owl:inverseOf d3f:may-deceive . + +d3f:may-be-detected-by a owl:ObjectProperty ; + rdfs:label "may-be-detected-by" ; + d3f:pref-label "may be detected by" ; + rdfs:subPropertyOf d3f:attack-may-be-countered-by ; + owl:inverseOf d3f:may-detect . + +d3f:may-be-evicted-by a owl:ObjectProperty ; + rdfs:label "may-be-evicted-by" ; + d3f:pref-label "may be evicted by" ; + rdfs:subPropertyOf d3f:attack-may-be-countered-by ; + owl:inverseOf d3f:may-evict . + +d3f:may-be-hardened-against-by a owl:ObjectProperty ; + rdfs:label "may-be-hardened-against-by" ; + d3f:pref-label "may be hardened against by" ; + rdfs:subPropertyOf d3f:attack-may-be-countered-by ; + owl:inverseOf d3f:may-harden . + +d3f:may-be-isolated-by a owl:ObjectProperty ; + rdfs:label "may-be-isolated-by" ; + d3f:pref-label "may be isolated by" ; + rdfs:subPropertyOf d3f:attack-may-be-countered-by ; + owl:inverseOf d3f:may-isolate . + +d3f:modified a owl:DatatypeProperty ; + rdfs:label "date modified"@en ; + d3f:definition "Date on which the resource was changed." ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf d3f:date . + +d3f:modifies-part a owl:ObjectProperty ; + rdfs:label "modifies-part" ; + d3f:definition "x modifies-part y: The entity x modifies a part of y. [Note: This is a rolification property for the rule 'if one modifies a part of a whole, they modify the whole.' Reasoning for this and similar semantics to come are under evaluation and not part of current d3fend inferences.]" ; + rdfs:subPropertyOf d3f:may-modify ; + owl:propertyChainAxiom ( d3f:modifies d3f:contains ) . + +d3f:narrower a owl:ObjectProperty ; + rdfs:label "narrower" ; + rdfs:subPropertyOf d3f:semantic-relation . + +d3f:narrower-transitive a owl:ObjectProperty ; + rdfs:label "narrower-transitive" ; + rdfs:subPropertyOf d3f:semantic-relation . + +d3f:operating-system a owl:DatatypeProperty ; + rdfs:label "operating-system"@en ; + d3f:definition "x operating-system y: The product x is supported on operating system y." ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:pref-label a owl:AnnotationProperty ; + rdfs:label "pref-label" ; + d3f:definition "x pref-label y: The preferred display value for x is y in d3fend tools." ; + rdfs:subPropertyOf d3f:d3fend-annotation . + +d3f:procedure-1 a d3f:Procedure, + owl:NamedIndividual ; + rdfs:label "Procedure 1 - T1134.001 Access Token Manipulation" ; + d3f:implements d3f:T1134.001 ; + d3f:start d3f:step-1 . + +d3f:process-parent a owl:ObjectProperty ; + rdfs:label "process-parent" ; + d3f:definition "x process-parent y: The process y created the process x (directly) with a create process event." ; + rdfs:subPropertyOf d3f:process-ancestor ; + skos:altLabel "processParent" . + +d3f:produced-by a owl:ObjectProperty ; + rdfs:label "produced-by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:produces . + +d3f:rating a owl:DatatypeProperty, + owl:FunctionalProperty ; + rdfs:label "rating" ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:recorded-in a owl:ObjectProperty ; + rdfs:label "recorded-in" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:related a owl:ObjectProperty ; + rdfs:label "related" ; + d3f:definition "x related y: x has a symmetric associative relation to y." ; + rdfs:isDefinedBy skos:related ; + rdfs:subPropertyOf d3f:semantic-relation . + +d3f:release-date a owl:AnnotationProperty ; + rdfs:label "release-date" ; + d3f:definition "x release-date y: The object x has the release-date y." ; + rdfs:subPropertyOf d3f:d3fend-annotation, + owl:versionInfo . + +d3f:resume a owl:ObjectProperty ; + rdfs:label "resume" ; + d3f:definition "The agent or technique x continues a previous action on entity y. Usually occurs after suspension on y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:d3fend-process-object-property . + +d3f:stage a owl:DatatypeProperty, + owl:FunctionalProperty ; + rdfs:label "stage" ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:synonym a owl:AnnotationProperty ; + rdfs:label "synonym" ; + d3f:definition "an equivalent term." ; + rdfs:subPropertyOf d3f:d3fend-annotation . + +d3f:t-SNEClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "t-SNE Clustering" ; + d3f:d3fend-id "D3A-TSC" ; + d3f:definition "T-distributed Stochastic Neighbor Embedding (t-SNE) is a statistical method for visualizing high-dimensional data by giving each datapoint a location in a two or three-dimensional map." ; + d3f:kb-article """## References +Wikipedia. (n.d.). T-distributed stochastic neighbor embedding. [Link](https://en.wikipedia.org/wiki/T-distributed_stochastic_neighbor_embedding)""" ; + rdfs:subClassOf d3f:Projection-basedClustering . + +d3f:text a owl:DatatypeProperty ; + rdfs:label "text"@en ; + d3f:definition "The text of the document (i.e., terms of license.)" ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:title a owl:DatatypeProperty ; + rdfs:label "title"@en ; + d3f:definition "A name given to the resource." ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:valid a owl:DatatypeProperty ; + rdfs:label "date valid"@en ; + d3f:definition "Date (often a range) of validity of a resource." ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf d3f:date . + +d3f:writes a owl:ObjectProperty ; + rdfs:label "writes" ; + d3f:definition "x writes y: The subject x takes the action of writing to a digital artifact y to store data and placing it into persistent memory for later reference." ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:accesses . + +dcterms:description a owl:AnnotationProperty . + +dcterms:license a owl:AnnotationProperty . + +dcterms:title a owl:AnnotationProperty . + +rdfs:isDefinedBy a owl:AnnotationProperty ; + rdfs:label "isDefinedBy" . + +rdfs:seeAlso a owl:AnnotationProperty . + +skos:altLabel a owl:AnnotationProperty . + +skos:example a owl:AnnotationProperty . + + d3f:kb-organization "MITRE/NSA" . + + d3f:kb-author "Alessandro Vesely" . + + a owl:Ontology ; + d3f:release-date "2024-12-20T00:42:42.042000+00:00"^^xsd:dateTime ; + dcterms:description "D3FEND is a framework which encodes a countermeasure knowledge base as a knowledge graph. The graph contains the types and relations that define key concepts in the cybersecurity countermeasure domain and the relations necessary to link those concepts to each other. Each of these concepts and relations are linked to references in the cybersecurity literature." ; + dcterms:license "MIT" ; + dcterms:title "D3FEND™ - A knowledge graph of cybersecurity countermeasures" ; + rdfs:comment "Use of the D3FEND Knowledge Graph, and the associated references from this ontology are subject to the Terms of Use. D3FEND is funded by the National Security Agency (NSA) Cybersecurity Directorate and managed by the National Security Engineering Center (NSEC) which is operated by The MITRE Corporation. D3FEND™ and the D3FEND logo are trademarks of The MITRE Corporation. This software was produced for the U.S. Government under Basic Contract No. W56KGU-18-D0004, and is subject to the Rights in Noncommercial Computer Software and Noncommercial Computer Software Documentation Clause 252.227-7014 (FEB 2012) Copyright 2022 The MITRE Corporation." ; + owl:versionIRI ; + owl:versionInfo "1.0.0" . + +d3f:Actuator a owl:Class ; + rdfs:label "Actuator" ; + d3f:definition "An actuator is a mechanical or electromechanical device that, upon receiving a relatively low-energy control signal (e.g., electrical voltage, fluid pressure, or human force), translates its primary energy source (electric, hydraulic, or pneumatic) into targeted mechanical motion or adjustment. It typically works in conjunction with a control device (like a valve or logic driver) and is central to automation, enabling machines or systems to move, open, close, or otherwise manipulate their components or environment. By amplifying or redirecting energy from one form to another, the actuator executes control commands, thereby automating processes in industrial, automotive, aerospace, and other domains where precise mechanical action is essential." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OutputDevice . + +d3f:AddressSpace a owl:Class ; + rdfs:label "Address Space" ; + d3f:definition "An address space defines a range of discrete addresses, each of which may correspond to a network host, peripheral device, disk sector, a memory cell or other logical or physical entity. For software programs to save and retrieve stored data, each unit of data must have an address where it can be located. The number of address spaces available depends on the underlying address structure, which is usually limited by the computer architecture being used." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:ApplicationDeletionEvent a owl:Class ; + rdfs:label "Application Deletion Event" ; + d3f:definition "An event capturing the removal of an application from a system, ensuring its binaries, configuration files, and registry entries are deleted or deactivated." ; + rdfs:subClassOf d3f:ApplicationEvent . + +d3f:ApplicationDisableEvent a owl:Class ; + rdfs:label "Application Disable Event" ; + d3f:definition "An event capturing the disabling of an application, preventing it from being operational or accessed until re-enabled." ; + rdfs:subClassOf d3f:ApplicationEvent . + +d3f:ApplicationEnableEvent a owl:Class ; + rdfs:label "Application Enable Event" ; + d3f:definition "An event representing the enabling of an application, allowing it to be started or accessed when required." ; + rdfs:subClassOf d3f:ApplicationEvent . + +d3f:ApplicationInstallationEvent a owl:Class ; + rdfs:label "Application Installation Event" ; + d3f:definition "An event representing the installation of an application onto a system, making it available for use and interaction." ; + rdfs:subClassOf d3f:ApplicationEvent . + +d3f:ApplicationLayerFirewall a owl:Class ; + rdfs:label "Application Layer Firewall" ; + d3f:definition "An application firewall is a form of firewall that controls input, output, and/or access from, to, or by an application or service. It operates by monitoring and potentially blocking the input, output, or system service calls that do not meet the configured policy of the firewall. The application firewall is typically built to control all network traffic on any OSI layer up to the application layer. It is able to control applications or services specifically, unlike a stateful network firewall, which is - without additional software - unable to control network traffic regarding a specific application. There are two primary categories of application firewalls, network-based application firewalls and host-based application firewalls." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Firewall ; + skos:altLabel "Application Firewall" . + +d3f:ApplicationRestartEvent a owl:Class ; + rdfs:label "Application Restart Event" ; + d3f:definition "An event where an application is sequentially stopped and started, typically to refresh its state, apply updates, or resolve issues while preserving its availability." ; + rdfs:subClassOf d3f:ApplicationEvent . + +d3f:ApplicationRule a owl:Class ; + rdfs:label "Application Rule" ; + d3f:definition "A configuration of an application which is used to apply logical or data processing functions to data processed by the application." ; + rdfs:subClassOf d3f:ApplicationConfiguration . + +d3f:ApplicationStartEvent a owl:Class ; + rdfs:label "Application Start Event" ; + d3f:definition "An event where an application transitions from an inactive state to an active state, initializing its resources and becoming operational for user interaction or automated processes." ; + rdfs:subClassOf d3f:ApplicationEvent . + +d3f:ApplicationStopEvent a owl:Class ; + rdfs:label "Application Stop Event" ; + d3f:definition "An event capturing the cessation of an application’s operations, transitioning it to an inactive state and releasing any allocated resources." ; + rdfs:subClassOf d3f:ApplicationEvent . + +d3f:ApplicationUpdateEvent a owl:Class ; + rdfs:label "Application Update Event" ; + d3f:definition "An event describing changes made to an application, such as updates, reconfigurations, or patch installations, while maintaining its presence on the system." ; + rdfs:subClassOf d3f:ApplicationEvent . + +d3f:ApproximateStringMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Approximate String Matching" ; + d3f:d3fend-id "D3A-ASM" ; + d3f:definition "Approximate string matching is a form of string matching that allows errrors." ; + d3f:kb-article """## References +1. Navarro, G. (2001). A guided tour to approximate string matching. _ACM Computing Surveys_, 33(1), 31-88. [Link](https://doi.org/10.1145/375360.375365)""" ; + rdfs:subClassOf d3f:PartialMatching . + +d3f:AssetInventoryAgent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Asset Inventory Agent" ; + d3f:definition "An asset inventory agent is a software tool which captures and transmits information about the devices on a network, including their hostnames, MAC addresses, software they may be running, etc." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:CollectorAgent . + +d3f:AuthorizationEvent a owl:Class ; + rdfs:label "Authorization Event" ; + d3f:definition "An event reflecting the decision-making process and actions concerning access control, recording whether agents are permitted or denied access to resources based on pre-defined access control policies." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:caused-by ; + owl:someValuesFrom d3f:Authorization ], + [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Agent ], + d3f:DigitalEvent . + +d3f:BayesianLinearRegression a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bayesian Linear Regression" ; + d3f:d3fend-id "D3A-BLR" ; + d3f:definition "Bayesian linear regression is a type of conditional modeling in which the mean of one variable is described by a linear combination of other variables, with the goal of obtaining the posterior probability of the regression coefficients." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Bayesian linear regression. [Link](https://en.wikipedia.org/wiki/Bayesian_linear_regression)""" ; + rdfs:subClassOf d3f:RegressionAnalysis . + +d3f:BinaryLargeObject a owl:Class ; + rdfs:label "Binary Large Object" ; + d3f:definition "A binary large object (BLOB) is a collection of binary data stored as a single entity. Blobs are typically images, audio or other multimedia objects, though sometimes binary executable code is stored as a blob." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "BLOB", + "Blob" . + +d3f:BookReference a owl:Class ; + rdfs:label "Book Reference" ; + d3f:pref-label "Book" ; + rdfs:subClassOf d3f:TechniqueReference . + +d3f:BootstrapAggregating a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bootstrap Aggregating" ; + d3f:d3fend-id "D3A-BA" ; + d3f:definition "Bootstrap aggregating, also called bagging (from bootstrap aggregating), is a machine learning ensemble meta-algorithm designed to improve the stability and accuracy of machine learning algorithms used in statistical classification and regression. It also reduces variance and helps to avoid overfitting. Although it is usually applied to decision tree methods, it can be used with any type of method. Bagging is a special case of the model averaging approach." ; + d3f:kb-article """## References +Bootstrap aggregating. Wikipedia. [Link](https://en.wikipedia.org/wiki/Bootstrap_aggregating).""" ; + rdfs:subClassOf d3f:ResamplingEnsemble . + +d3f:CAPECThing a owl:Class ; + rdfs:label "CAPEC Thing" ; + rdfs:subClassOf d3f:ExternalThreatModelThing . + +d3f:CART a owl:Class, + owl:NamedIndividual ; + rdfs:label "CART" ; + d3f:d3fend-id "D3A-CAR" ; + d3f:definition "The CART algorithm is a type of classification algorithm that is required to build a decision tree on the basis of Gini’s impurity index." ; + d3f:kb-article """## References +Classification and Regression Tree (CART) Algorithm. Analytics Steps. [Link](https://www.analyticssteps.com/blogs/classification-and-regression-tree-cart-algorithm).""" ; + rdfs:subClassOf d3f:DecisionTree . + +d3f:CCI-000015_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000015" ; + d3f:broader d3f:AccountLocking, + d3f:DomainAccountMonitoring, + d3f:LocalAccountMonitoring ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs automated mechanisms to support the information system account management functions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-05-13T00:00:00"^^xsd:dateTime . + +d3f:CCI-000016_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000016" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically removes or disables temporary accounts after an organization-defined time period for each type of account." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2009-05-13T00:00:00"^^xsd:dateTime . + +d3f:CCI-000017_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000017" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically disables inactive accounts after an organization-defined time period." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2009-05-13T00:00:00"^^xsd:dateTime . + +d3f:CCI-000018_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000018" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically audits account creation actions." ; + d3f:exactly d3f:DomainAccountMonitoring ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-05-13T00:00:00"^^xsd:dateTime . + +d3f:CCI-000020_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000020" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system dynamically manages user privileges and associated access authorizations." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000022_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000022" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces one or more organization-defined nondiscretionary access control policies over an organization-defined set of users and resources." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-05-13T00:00:00"^^xsd:dateTime . + +d3f:CCI-000025_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000025" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces information flow control using explicit security attributes on information, source, and destination objects as a basis for flow control decisions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000027_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000027" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces dynamic information flow control based on organization-defined policies." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-05-13T00:00:00"^^xsd:dateTime . + +d3f:CCI-000029_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000029" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces organization-defined limitations on the embedding of data types within other data types." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-05-13T00:00:00"^^xsd:dateTime . + +d3f:CCI-000030_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000030" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces information flow control based on organization-defined metadata." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-05-13T00:00:00"^^xsd:dateTime . + +d3f:CCI-000032_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000032" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces information flow control using organization-defined security policy filters as a basis for flow control decisions for organization-defined information flows." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000034_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000034" ; + d3f:broader d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides the capability for a privileged administrator to enable/disable organization-defined security policy filters under organization-defined conditions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-05-13T00:00:00"^^xsd:dateTime . + +d3f:CCI-000035_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000035" ; + d3f:broader d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides the capability for privileged administrators to configure the organization-defined security policy filters to support different security policies." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000037_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000037" ; + d3f:broader d3f:LocalFilePermissions, + d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization implements separation of duties through assigned information system access authorizations." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000040_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000040" ; + d3f:broader d3f:AuthorizationEventThresholding, + d3f:LocalAccountMonitoring ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization audits any use of privileged accounts, or roles, with access to organization-defined security functions or security-relevant information, when accessing other system functions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000044_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000044" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces the organization-defined limit of consecutive invalid logon attempts by a user during the organization-defined time period." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000047_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000047" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system delays next login prompt according to the organization-defined delay algorithm, when the maximum number of unsuccessful attempts is exceeded, automatically locks the account/node for an organization-defined time period or locks the account/node until released by an Administrator IAW organizational policy." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000056_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000056" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system retains the session lock until the user reestablishes access using established identification and authentication procedures." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000057_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000057" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system initiates a session lock after the organization-defined time period of inactivity." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2009-05-19T00:00:00"^^xsd:dateTime . + +d3f:CCI-000058_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000058" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides the capability for users to directly initiate session lock mechanisms." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2009-05-19T00:00:00"^^xsd:dateTime . + +d3f:CCI-000060_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000060" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system conceals, via the session lock, information previously visible on the display with a publicly viewable image." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2009-05-19T00:00:00"^^xsd:dateTime . + +d3f:CCI-000066_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000066" ; + d3f:broader d3f:RemoteTerminalSessionDetection ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization enforces requirements for remote connections to the information system." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000067_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000067" ; + d3f:broader d3f:RemoteTerminalSessionDetection ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system monitors remote access methods." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000068_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000068" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to protect the confidentiality of remote access sessions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:EncryptedTunnels ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000071_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000071" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization monitors for unauthorized remote connections to the information system on an organization-defined frequency." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:RemoteTerminalSessionDetection ; + d3f:published "2009-05-19T00:00:00"^^xsd:dateTime . + +d3f:CCI-000139_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000139" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system alerts designated organization-defined personnel or roles in the event of an audit processing failure." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemDaemonMonitoring ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000143_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000143" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides a warning when allocated audit record storage volume reaches an organization-defined percentage of maximum audit record storage capacity." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemDaemonMonitoring ; + d3f:published "2009-05-20T00:00:00"^^xsd:dateTime . + +d3f:CCI-000144_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000144" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides a real-time alert when organization-defined audit failure events occur." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemDaemonMonitoring ; + d3f:published "2009-05-20T00:00:00"^^xsd:dateTime . + +d3f:CCI-000162_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000162" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects audit information from unauthorized access." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:CredentialHardening ; + d3f:published "2009-05-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-000163_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000163" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects audit information from unauthorized modification." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:PlatformHardening, + d3f:SystemConfigurationPermissions ; + d3f:published "2009-05-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-000164_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000164" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects audit information from unauthorized deletion." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:PlatformHardening ; + d3f:published "2009-05-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-000185_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000185" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, for PKI-based authentication, validates certifications by constructing and verifying a certification path to an accepted trust anchor including checking certificate status information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:CredentialHardening ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000186_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000186" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, for PKI-based authentication, enforces authorized access to the corresponding private key." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:CredentialHardening ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000187_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000187" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, for PKI-based authentication, maps the authenticated identity to the account of the individual or group." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:CredentialHardening ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000192_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000192" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces password complexity by the minimum number of upper case characters used." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000193_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000193" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces password complexity by the minimum number of lower case characters used." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000194_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000194" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces password complexity by the minimum number of numeric characters used." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000195_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000195" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, for password-based authentication, when new passwords are created, enforces that at least an organization-defined number of characters are changed." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000196_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000196" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, for password-based authentication, stores only cryptographically-protected passwords." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000197_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000197" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, for password-based authentication, transmits only cryptographically-protected passwords." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000198_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000198" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces minimum password lifetime restrictions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000199_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000199" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces maximum password lifetime restrictions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-09-15T00:00:00"^^xsd:dateTime . + +d3f:CCI-000200_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000200" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prohibits password reuse for the organization-defined number of generations." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-05-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-000205_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000205" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces minimum password length." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2009-05-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-000213_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000213" ; + d3f:broader d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication, + d3f:Multi-factorAuthentication, + d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces approved authorizations for logical access to information and system resources in accordance with applicable access control policies." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000218_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000218" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, when transferring information between different security domains, identifies information flows by data type specification and usage." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000219_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000219" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, when transferring information between different security domains, decomposes information into organization-defined policy-relevant subcomponents for submission to policy enforcement mechanisms." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000226_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000226" ; + d3f:broader d3f:ExecutionIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides the capability for a privileged administrator to configure organization-defined security policy filters to support different security policies." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-000346_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000346" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs automated mechanisms to enforce access restrictions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:LocalFilePermissions, + d3f:UserAccountPermissions ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000352_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000352" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents the installation of organization-defined critical software programs that are not signed with a certificate that is recognized and approved by the organization." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000374_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000374" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs automated mechanisms to respond to unauthorized changes to organization-defined configuration settings." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:OperatingSystemMonitoring ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000381_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000381" ; + d3f:broader d3f:PlatformHardening ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization configures the information system to provide only essential capabilities." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000382_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000382" ; + d3f:broader d3f:PlatformHardening ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization configures the information system to prohibit or restrict the use of organization-defined functions, ports, protocols, and/or services." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000386_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000386" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs automated mechanisms to prevent program execution on the information system in accordance with the organization-defined specifications." ; + d3f:exactly d3f:ExecutableDenylisting ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000417_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000417" ; + d3f:broader d3f:ExecutionIsolation, + d3f:NetworkIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization disables network access by unauthorized components/devices or notifies designated organizational officials." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000663_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000663" ; + d3f:broader d3f:ExecutionIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization (or information system) enforces explicit rules governing the installation of software by users." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-000764_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000764" ; + d3f:broader d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication, + d3f:Multi-factorAuthentication, + d3f:One-timePassword ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uniquely identifies and authenticates organizational users (or processes acting on behalf of organizational users)." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000765_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000765" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements multifactor authentication for network access to privileged accounts." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Multi-factorAuthentication ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000766_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000766" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements multifactor authentication for network access to non-privileged accounts." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Multi-factorAuthentication ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000767_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000767" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements multifactor authentication for local access to privileged accounts." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Multi-factorAuthentication ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000768_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000768" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements multifactor authentication for local access to non-privileged accounts." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Multi-factorAuthentication ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000771_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000771" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uses multifactor authentication for network access to privileged accounts where one of the factors is provided by a device separate from the information system being accessed." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Multi-factorAuthentication ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000772_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000772" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uses multifactor authentication for network access to non-privileged accounts where one of the factors is provided by a device separate from the information system being accessed." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Multi-factorAuthentication ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000774_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000774" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uses organization-defined replay-resistant authentication mechanisms for network access to privileged accounts." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:One-timePassword ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000776_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000776" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uses organization-defined replay-resistant authentication mechanisms for network access to non-privileged accounts." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:One-timePassword ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000804_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000804" ; + d3f:broader d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication, + d3f:Multi-factorAuthentication, + d3f:One-timePassword ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uniquely identifies and authenticates non-organizational users (or processes acting on behalf of non-organizational users)." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-17T00:00:00"^^xsd:dateTime . + +d3f:CCI-000831_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000831" ; + d3f:broader d3f:CredentialEviction, + d3f:ProcessEviction ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization implements a configurable capability to automatically disable the information system if organization-defined security violations are detected." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000877_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000877" ; + d3f:broader d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication, + d3f:Multi-factorAuthentication ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs strong authenticators in the establishment of nonlocal maintenance and diagnostic sessions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000880_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000880" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization audits non-local maintenance and diagnostic sessions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:OperatingSystemMonitoring ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000884_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000884" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization protects nonlocal maintenance sessions by employing organization-defined authenticators that are replay resistant." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:CredentialHardening ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-000888_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-000888" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs cryptographic mechanisms to protect the integrity and confidentiality of non-local maintenance and diagnostic communications." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:EncryptedTunnels ; + d3f:published "2009-09-18T00:00:00"^^xsd:dateTime . + +d3f:CCI-001009_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001009" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uses cryptographic mechanisms to protect and restrict access to information on portable digital media." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:FileEncryption ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001019_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001019" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs cryptographic mechanisms to protect information in storage." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DiskEncryption, + d3f:FileEncryption ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001067_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001067" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements privileged access authorization to organization-identified information system components for selected organization-defined vulnerability scanning activities." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:PlatformHardening ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001069_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001069" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs automated mechanisms to detect the presence of unauthorized software on organizational information systems and notify designated organizational officials in accordance with the organization-defined frequency." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001082_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001082" ; + d3f:broader d3f:LocalFilePermissions, + d3f:SystemConfigurationPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system separates user functionality (including user interface services) from information system management functionality." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001083_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001083" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents the presentation of information system management-related functionality at an interface for non-privileged users." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:LocalFilePermissions, + d3f:SystemConfigurationPermissions ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001084_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001084" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system isolates security functions from nonsecurity functions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemConfigurationPermissions ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001085_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001085" ; + d3f:broader d3f:Hardware-basedProcessIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system utilizes underlying hardware separation mechanisms to implement security function isolation." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001086_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001086" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system isolates security functions enforcing access and information flow control from both nonsecurity functions and from other security functions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemConfigurationPermissions ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001087_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001087" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization implements an information system isolation boundary to minimize the number of nonsecurity functions included within the boundary containing security functions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemConfigurationPermissions ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001089_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001089" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization implements security functions as a layered structure minimizing interactions between layers of the design and avoiding any dependence by lower layers on the functionality or correctness of higher layers." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemConfigurationPermissions ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001090_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001090" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents unauthorized and unintended information transfer via shared system resources." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:NetworkTrafficFiltering ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001092_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001092" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects against or limits the effects of the organization-defined or referenced types of denial of service attacks." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001094_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001094" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system restricts the ability of individuals to launch organization-defined denial of service attacks against other information systems." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001096_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001096" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system limits the use of resources by priority." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:LocalFilePermissions, + d3f:SystemConfigurationPermissions ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001100_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001100" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents public access into the organization's internal networks except as appropriately mediated by managed interfaces employing boundary protection devices." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001109_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001109" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system at managed interfaces denies network communications traffic by default and allows network communications traffic by exception (i.e., deny all, permit by exception)." ; + d3f:exactly d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001111_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001111" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents remote devices that have established a non-remote connection with the system from communicating outside of that communications path with resources in external networks." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001115_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001115" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, at managed interfaces, denies network traffic and audits internal users (or malicious code) posing a threat to external information systems." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001117_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001117" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system checks incoming communications to ensure the communications are coming from an authorized source and routed to an authorized destination." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001118_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001118" ; + d3f:broader d3f:NetworkIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements host-based boundary protection mechanisms for servers, workstations, and mobile devices." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001124_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001124" ; + d3f:broader d3f:BroadcastDomainIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents discovery of specific system components composing a managed interface." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001125_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001125" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces adherence to protocol format." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001127_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001127" ; + d3f:broader d3f:EncryptedTunnels ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects the integrity of transmitted information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001128_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001128" ; + d3f:broader d3f:EncryptedTunnels ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs cryptographic mechanisms to recognize changes to information during transmission unless otherwise protected by alternative physical measures." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001133_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001133" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system terminates the network connection associated with a communications session at the end of the session or after an organization-defined time period of inactivity." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SessionDurationAnalysis ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001144_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001144" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements required cryptographic protections using cryptographic modules that comply with applicable federal laws, Executive Orders, directives, policies, regulations, standards, and guidance." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DiskEncryption, + d3f:FileEncryption ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001145_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001145" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs, at a minimum, FIPS-validated cryptography to protect unclassified information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DiskEncryption, + d3f:FileEncryption ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001146_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001146" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs NSA-approved cryptography to protect classified information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DiskEncryption, + d3f:FileEncryption ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001147_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001147" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs, at a minimum, FIPS-validated cryptography to protect information when such information must be separated from individuals who have the necessary clearances yet lack the necessary access approvals." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DiskEncryption, + d3f:FileEncryption ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001150_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001150" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prohibits remote activation of collaborative computing devices, excluding the organization-defined exceptions where remote activation is to be allowed." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:RemoteTerminalSessionDetection ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001166_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001166" ; + d3f:broader d3f:DynamicAnalysis, + d3f:EmulatedFileAnalysis, + d3f:FileContentRules ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system identifies organization-defined unacceptable mobile code." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001169_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001169" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents the download of organization-defined unacceptable mobile code." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableDenylisting ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001170_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001170" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents the automatic execution of mobile code in organization-defined software applications." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableDenylisting ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001178_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001178" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides additional data origin authentication artifacts along with the authoritative name resolution data the system returns in response to external name/address resolution queries." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001185_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001185" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system invalidates session identifiers upon user logout or other session termination." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AuthenticationCacheInvalidation ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001199_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001199" ; + d3f:broader d3f:DiskEncryption, + d3f:FileContentRules, + d3f:FileEncryption, + d3f:FileHashing, + d3f:LocalFilePermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects the confidentiality and/or integrity of organization-defined information at rest." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001200_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001200" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs cryptographic mechanisms to prevent unauthorized disclosure of information at rest unless otherwise protected by alternative physical measures." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DiskEncryption, + d3f:FileEncryption ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001210_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001210" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, at organization-defined information system components, loads and executes the operating environment from hardware-enforced, read-only media." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DriverLoadIntegrityChecking ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001211_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001211" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, at organization-defined information system components, loads and executes organization-defined applications from hardware-enforced, read-only media." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ApplicationConfigurationHardening ; + d3f:published "2009-09-21T00:00:00"^^xsd:dateTime . + +d3f:CCI-001233_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001233" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs automated mechanisms on an organization-defined frequency to determine the state of information system components with regard to flaw remediation." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SoftwareUpdate ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001237_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001237" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs automated patch management tools to facilitate flaw remediation to organization-defined information system components." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SoftwareUpdate ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001239_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001239" ; + d3f:broader d3f:FileAnalysis, + d3f:NetworkTrafficAnalysis, + d3f:PlatformMonitoring, + d3f:ProcessAnalysis ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs malicious code protection mechanisms at information system entry and exit points to detect and eradicate malicious code transported by electronic mail, electronic mail attachments, web accesses, removable media, or other common means or inserted through the exploitation of information system vulnerabilities." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001242_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001242" ; + d3f:broader d3f:DynamicAnalysis, + d3f:EmulatedFileAnalysis, + d3f:FileContentRules ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization configures malicious code protection mechanisms to perform real-time scans of files from external sources at endpoints as the files are downloaded, opened, or executed in accordance with organizational security policy." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001262_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001262" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system monitors inbound and outbound communications for unusual or unauthorized activities or conditions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001297_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001297" ; + d3f:broader d3f:DriverLoadIntegrityChecking, + d3f:FileHashing, + d3f:PointerAuthentication, + d3f:TPMBootIntegrity ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system detects unauthorized changes to software and information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001305_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001305" ; + d3f:broader d3f:MessageAuthentication, + d3f:SenderMTAReputationAnalysis, + d3f:SenderReputationAnalysis, + d3f:TransferAgentAuthentication ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs spam protection mechanisms at information system entry and exit points to detect and take action on unsolicited messages transported by electronic mail, electronic mail attachments, web accesses, removable media, or other common means." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001310_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001310" ; + d3f:broader d3f:DatabaseQueryStringAnalysis ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system checks the validity of organization-defined inputs." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001350_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001350" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to protect the integrity of audit information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:FileEncryption ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001352_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001352" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization protects the audit records of non-local accesses to privileged accounts and the execution of privileged functions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001356_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001356" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization monitors for atypical usage of information system accounts." ; + d3f:exactly d3f:AuthenticationEventThresholding, + d3f:AuthorizationEventThresholding ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001368_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001368" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces approved authorizations for controlling the flow of information within the system based on organization-defined information flow control policies." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001372_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001372" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, when transferring information between different security domains, implements organization-defined security policy filters requiring fully enumerated formats that restrict data structure and content." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001373_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001373" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, when transferring information between different security domains, examines the information for the presence of organization-defined unsanctioned information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001374_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001374" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, when transferring information between different security domains, prohibits the transfer of organization-defined unsanctioned information in accordance with the organization-defined security policy." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001376_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001376" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uniquely identifies source domains for information transfer." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001377_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001377" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uniquely authenticates source domains for information transfer." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001399_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001399" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system supports and maintains the binding of organization-defined security attributes to information in storage." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001400_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001400" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system supports and maintains the binding of organization-defined security attributes to information in process." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001401_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001401" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system supports and maintains the binding of organization-defined security attributes to information in transmission." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-001403_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001403" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically audits account modification actions." ; + d3f:exactly d3f:DomainAccountMonitoring ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-001404_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001404" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically audits account disabling actions." ; + d3f:exactly d3f:DomainAccountMonitoring ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-001405_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001405" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically audits account removal actions." ; + d3f:exactly d3f:DomainAccountMonitoring ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-001414_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001414" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces approved authorizations for controlling the flow of information between interconnected systems based on organization-defined information flow control policies." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-001424_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001424" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system dynamically associates security attributes with organization-defined subjects in accordance with organization-defined security policies as information is created and combined." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-001425_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001425" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides authorized individuals (or processes acting on behalf of individuals) the capability to change the value of associated security attributes." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-001426_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001426" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system maintains the binding of security attributes to information with sufficient assurance that the information--attribute association can be used as the basis for automated policy actions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-001427_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001427" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system allows authorized users to associate security attributes with information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-001428_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001428" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system displays security attributes in human-readable form on each object that the system transmits to output devices to identify organization-identified special dissemination, handling, or distribution instructions using organization-identified human-readable, standard naming conventions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-001436_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001436" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization disables organization-defined networking protocols within the information system deemed to be nonsecure except for explicitly identified components in support of specific operational requirements." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2009-09-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-001452_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001452" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces the organization-defined time period during which the limit of consecutive invalid access attempts by a user is counted." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2009-05-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-001453_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001453" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to protect the integrity of remote access sessions." ; + d3f:exactly d3f:EncryptedTunnels ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-29T00:00:00"^^xsd:dateTime . + +d3f:CCI-001454_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001454" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization ensures that remote sessions for accessing an organization-defined list of security functions and security-relevant information are audited." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:RemoteTerminalSessionDetection ; + d3f:published "2009-09-29T00:00:00"^^xsd:dateTime . + +d3f:CCI-001493_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001493" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects audit tools from unauthorized access." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2009-09-29T00:00:00"^^xsd:dateTime . + +d3f:CCI-001494_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001494" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects audit tools from unauthorized modification." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:PlatformHardening, + d3f:SystemConfigurationPermissions ; + d3f:published "2009-09-29T00:00:00"^^xsd:dateTime . + +d3f:CCI-001495_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001495" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects audit tools from unauthorized deletion." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:PlatformHardening ; + d3f:published "2009-09-29T00:00:00"^^xsd:dateTime . + +d3f:CCI-001496_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001496" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to protect the integrity of audit tools." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:FileEncryption ; + d3f:published "2009-09-29T00:00:00"^^xsd:dateTime . + +d3f:CCI-001499_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001499" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization limits privileges to change software resident within software libraries." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemConfigurationPermissions, + d3f:UserAccountPermissions ; + d3f:published "2009-09-29T00:00:00"^^xsd:dateTime . + +d3f:CCI-001555_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001555" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uniquely identifies destination domains for information transfer." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2010-05-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-001556_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001556" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uniquely authenticates destination domains for information transfer." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2010-05-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-001557_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001557" ; + d3f:broader d3f:NetworkTrafficAnalysis ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system tracks problems associated with the information transfer." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2010-05-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-001574_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001574" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system rejects or delays, as defined by the organization, network traffic which exceed the organization-defined thresholds." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2010-05-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-001589_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001589" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization incorporates detection of unauthorized, security-relevant configuration changes into the organization‚Äôs incident response capability to ensure they are tracked." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:OperatingSystemMonitoring ; + d3f:published "2010-05-12T00:00:00"^^xsd:dateTime . + +d3f:CCI-001619_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001619" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces password complexity by the minimum number of special characters used." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2010-05-12T00:00:00"^^xsd:dateTime . + +d3f:CCI-001632_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001632" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization protects nonlocal maintenance sessions by separating the maintenance session from other network sessions with the information system by either physically separated communications paths or logically separated communications paths based upon encryption." ; + d3f:exactly d3f:EncryptedTunnels ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2010-05-12T00:00:00"^^xsd:dateTime . + +d3f:CCI-001662_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001662" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system takes organization-defined corrective action when organization-defined unacceptable mobile code is identified." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DynamicAnalysis, + d3f:EmulatedFileAnalysis, + d3f:FileContentRules ; + d3f:published "2010-05-12T00:00:00"^^xsd:dateTime . + +d3f:CCI-001668_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001668" ; + d3f:broader d3f:FileAnalysis, + d3f:NetworkTrafficAnalysis, + d3f:PlatformMonitoring, + d3f:ProcessAnalysis ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs malicious code protection mechanisms at workstations, servers, or mobile computing devices on the network to detect and eradicate malicious code transported by electronic mail, electronic mail attachments, web accesses, removable media, or other common means or inserted through the exploitation of information system vulnerabilities." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2010-05-12T00:00:00"^^xsd:dateTime . + +d3f:CCI-001677_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001677" ; + d3f:broader d3f:MessageAuthentication, + d3f:SenderMTAReputationAnalysis, + d3f:SenderReputationAnalysis, + d3f:TransferAgentAuthentication ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs spam protection mechanisms at workstations, servers, or mobile computing devices on the network to detect and take action on unsolicited messages transported by electronic mail, electronic mail attachments, web accesses, removable media, or other common means." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2010-05-12T00:00:00"^^xsd:dateTime . + +d3f:CCI-001682_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001682" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically removes or disables emergency accounts after an organization-defined time period for each type of account." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2011-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001683_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001683" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system notifies organization-defined personnel or roles for account creation actions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainAccountMonitoring ; + d3f:published "2011-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001684_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001684" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system notifies organization-defined personnel or roles for account modification actions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainAccountMonitoring ; + d3f:published "2011-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001685_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001685" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system notifies organization-defined personnel or roles for account disabling actions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainAccountMonitoring ; + d3f:published "2011-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001686_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001686" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system notifies organization-defined personnel or roles for account removal actions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainAccountMonitoring ; + d3f:published "2011-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001695_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001695" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents the execution of organization-defined unacceptable mobile code." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableDenylisting ; + d3f:published "2011-10-07T00:00:00"^^xsd:dateTime . + +d3f:CCI-001744_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001744" ; + d3f:broader d3f:OperatingSystemMonitoring ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements organization-defined security responses automatically if baseline configurations are changed in an unauthorized manner." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-02-28T00:00:00"^^xsd:dateTime . + +d3f:CCI-001749_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001749" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents the installation of organization-defined software components without verification the software component has been digitally signed using a certificate that is recognized and approved by the organization." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting ; + d3f:published "2013-02-28T00:00:00"^^xsd:dateTime . + +d3f:CCI-001762_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001762" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization disables organization-defined functions, ports, protocols, and services within the information system deemed to be unnecessary and/or nonsecure." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemConfigurationPermissions ; + d3f:published "2013-02-28T00:00:00"^^xsd:dateTime . + +d3f:CCI-001764_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001764" ; + d3f:broader d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents program execution in accordance with organization-defined policies regarding software program usage and restrictions, and/or rules authorizing the terms and conditions of software program usage." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-02-28T00:00:00"^^xsd:dateTime . + +d3f:CCI-001767_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001767" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs an allow-all, deny-by-exception policy to prohibit the execution of unauthorized software programs on the information system." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableDenylisting ; + d3f:published "2013-02-28T00:00:00"^^xsd:dateTime . + +d3f:CCI-001774_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001774" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs a deny-all, permit-by-exception policy to allow the execution of authorized software programs on the information system." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableAllowlisting ; + d3f:published "2013-02-28T00:00:00"^^xsd:dateTime . + +d3f:CCI-001811_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001811" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system alerts organization-defined personnel or roles when the unauthorized installation of software is detected." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:FileAnalysis ; + d3f:published "2013-03-01T00:00:00"^^xsd:dateTime . + +d3f:CCI-001812_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001812" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prohibits user installation of software without explicit privileged status." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting ; + d3f:published "2013-03-01T00:00:00"^^xsd:dateTime . + +d3f:CCI-001813_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001813" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces access restrictions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-03-01T00:00:00"^^xsd:dateTime . + +d3f:CCI-001855_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001855" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides a warning to organization-defined personnel, roles, and/or locations within an organization-defined time period when allocated audit record storage volume reaches an organization-defined percentage of repository maximum audit record storage capacity." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemDaemonMonitoring ; + d3f:published "2013-03-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-001858_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001858" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides a real-time alert in an organization-defined real-time period to organization-defined personnel, roles, and/or locations when organization-defined audit failure events requiring real-time alerts occur." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemDaemonMonitoring ; + d3f:published "2013-03-14T00:00:00"^^xsd:dateTime . + +d3f:CCI-001936_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001936" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements multifactor authentication for network access to privileged accounts such that one of the factors is provided by a device separate from the system gaining access." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Multi-factorAuthentication ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001937_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001937" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The device used in the information system implementation of multifactor authentication for network access to privileged accounts meets organization-defined strength of mechanism requirements." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Multi-factorAuthentication ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001941_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001941" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements replay-resistant authentication mechanisms for network access to privileged accounts." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:One-timePassword ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001953_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001953" ; + d3f:broader d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system accepts Personal Identity Verification (PIV) credentials." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001954_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001954" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system electronically verifies Personal Identity Verification (PIV) credentials." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001957_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001957" ; + d3f:broader d3f:One-timePassword ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements organization-defined out-of-band authentication under organization-defined conditions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-001991_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-001991" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, for PKI-based authentication, implements a local cache of revocation data to support path discovery and validation in case of inability to access revocation information via the network." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Certificate-basedAuthentication ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-002005_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002005" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, for biometric-based authentication, employs mechanisms that satisfy organization-defined biometric quality requirements." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:BiometricAuthentication ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-002009_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002009" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system accepts Personal Identity Verification (PIV) credentials from other federal agencies." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-002010_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002010" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system electronically verifies Personal Identity Verification (PIV) credentials from other federal agencies." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-002015_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002015" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system accepts Personal Identity Verification-I (PIV-I) credentials." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-002016_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002016" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system electronically verifies Personal Identity Verification-I (PIV-I) credentials." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:BiometricAuthentication, + d3f:Certificate-basedAuthentication ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-002041_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002041" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system allows the use of a temporary password for system logons with an immediate change to a permanent password." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:StrongPasswordPolicy ; + d3f:published "2013-05-03T00:00:00"^^xsd:dateTime . + +d3f:CCI-002145_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002145" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces organization-defined circumstances and/or usage conditions for organization-defined information system accounts." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:UserAccountPermissions ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002165_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002165" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces organization-defined discretionary access control policies over defined subjects and objects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002169_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002169" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces a role-based access control policy over defined subjects and objects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002178_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002178" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces the revocation of access authorizations resulting from changes to the security attributes of subjects based on organization-defined rules governing the timing of revocations of access authorizations." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemCallFiltering ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002179_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002179" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces the revocation of access authorizations resulting from changes to the security attributes of objects based on organization-defined rules governing the timing of revocations of access authorizations." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemCallFiltering ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002201_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002201" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, when transferring information between different security domains, uses organization-defined data type identifiers to validate data essential for information flow decisions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002205_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002205" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uniquely identifies and authenticates source by organization, system, application, and/or individual for information transfer." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002207_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002207" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uniquely identifies and authenticates destination by organization, system, application, and/or individual for information transfer." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002211_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002211" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, when transferring information between different security domains, applies the same security policy filtering to metadata as it applies to data payloads." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002218_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002218" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides access from a single device to computing platforms, applications, or data residing on multiple different security domains, while preventing any information flow between the different security domains." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002233_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002233" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents organization-defined software from executing at higher privilege levels than users executing the software." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableDenylisting ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002235_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002235" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents non-privileged users from executing privileged functions to include disabling, circumventing, or altering implemented security safeguards/countermeasures." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemConfigurationPermissions ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002238_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002238" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically locks the account or node for either an organization-defined time period, until the locked account or node is released by an administrator, or delays the next logon prompt according to the organization-defined delay algorithm when the maximum number of unsuccessful logon attempts is exceeded." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:AccountLocking ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002262_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002262" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization provides the means to associate organization-defined types of security attributes having organization-defined security attribute values with information in storage." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002263_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002263" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization provides the means to associate organization-defined types of security attributes having organization-defined security attribute values with information in process." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002264_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002264" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization provides the means to associate organization-defined types of security attributes having organization-defined security attribute values with information in transmission." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002272_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002272" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system dynamically associates security attributes with organization-defined objects in accordance with organization-defined security policies as information is created and combined." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002277_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002277" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides authorized individuals (or processes acting on behalf of individuals) the capability to define the value of associated security attributes." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002281_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002281" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system maintains the association of organization-defined security attributes to organization-defined subjects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002282_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002282" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system maintains the association of organization-defined security attributes to organization-defined objects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002283_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002283" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system maintains the integrity of organization-defined security attributes associated with organization-defined subjects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002284_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002284" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system maintains the integrity of organization-defined security attributes associated with organization-defined objects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002289_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002289" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system supports the association of organization-defined security attributes with organization-defined subjects by authorized individuals (or processes acting on behalf of individuals)." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002290_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002290" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system supports the association of organization-defined security attributes with organization-defined objects by authorized individuals (or processes acting on behalf of individuals)." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002302_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002302" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements organization-defined techniques or technologies with an organization-defined level of assurance in associating security attributes to information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002306_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002306" ; + d3f:broader d3f:SystemConfigurationPermissions, + d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides authorized individuals the capability to define or change the type of security attributes available for association with subjects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002307_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002307" ; + d3f:broader d3f:SystemConfigurationPermissions, + d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides authorized individuals the capability to define or change the value of security attributes available for association with subjects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002308_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002308" ; + d3f:broader d3f:SystemConfigurationPermissions, + d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides authorized individuals the capability to define or change the type of security attributes available for association with objects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002309_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002309" ; + d3f:broader d3f:SystemConfigurationPermissions, + d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides authorized individuals the capability to define or change the value of security attributes available for association with objects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002322_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002322" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization provides the capability to expeditiously disconnect or disable remote access to the information system within the organization-defined time period." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:RemoteTerminalSessionDetection ; + d3f:published "2013-06-24T00:00:00"^^xsd:dateTime . + +d3f:CCI-002346_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002346" ; + d3f:broader d3f:DatabaseQueryStringAnalysis, + d3f:DiskEncryption, + d3f:FileEncryption ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs organization-defined data mining prevention techniques for organization-defined data storage objects to adequately protect against data mining." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-002347_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002347" ; + d3f:broader d3f:FileAccessPatternAnalysis, + d3f:InputDeviceAnalysis, + d3f:ResourceAccessPatternAnalysis, + d3f:UserDataTransferAnalysis ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization employs organization-defined data mining detection techniques for organization-defined data storage objects to adequately detect data mining attempts." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-002353_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002353" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system transmits organization-defined access authorization information using organization-defined security safeguards to organization-defined information systems which enforce access control decisions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-002355_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002355" ; + d3f:broader d3f:UserAccountPermissions ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces access control decisions based on organization-defined security attributes that do not include the identity of the user or process acting on behalf of the user." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-06-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-002357_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002357" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements a reference monitor for organization-defined access control policies that is tamperproof." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:UserAccountPermissions ; + d3f:published "2013-06-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-002358_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002358" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements a reference monitor for organization-defined access control policies that is always invoked." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:UserAccountPermissions ; + d3f:published "2013-06-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-002359_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002359" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements a reference monitor for organization-defined access control policies that is small enough to be subject to analysis and testing, the completeness of which can be assured." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:UserAccountPermissions ; + d3f:published "2013-06-25T00:00:00"^^xsd:dateTime . + +d3f:CCI-002361_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002361" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically terminates a user session after organization-defined conditions or trigger events requiring session disconnect." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ProcessTermination ; + d3f:published "2013-06-26T00:00:00"^^xsd:dateTime . + +d3f:CCI-002363_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002363" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides a logout capability for user-initiated communications sessions whenever authentication is used to gain access to organization-defined information resources." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ProcessTermination ; + d3f:published "2013-06-26T00:00:00"^^xsd:dateTime . + +d3f:CCI-002364_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002364" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system displays an explicit logout message to users indicating the reliable termination of authenticated communications sessions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ProcessTermination ; + d3f:published "2013-06-26T00:00:00"^^xsd:dateTime . + +d3f:CCI-002381_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002381" ; + d3f:broader d3f:Hardware-basedProcessIsolation, + d3f:Kernel-basedProcessIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization minimizes the number of nonsecurity functions included within the isolation boundary containing security functions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002382_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002382" ; + d3f:broader d3f:Hardware-basedProcessIsolation, + d3f:Kernel-basedProcessIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization implements security functions as largely independent modules that maximize internal cohesiveness within modules and minimize coupling between modules." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002384_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002384" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system prevents unauthorized information transfer via shared resources in accordance with organization-defined procedures when system processing explicitly switches between different information classification levels or security categories." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:NetworkTrafficFiltering ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002385_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002385" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects against or limits the effects of organization-defined types of denial of service attacks by employing organization-defined security safeguards." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002394_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002394" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects the availability of resources by allocating organization-defined resources based on priority, quota, and/or organization-defined security safeguards." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SystemConfigurationPermissions ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002397_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002397" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, in conjunction with a remote device, prevents the device from simultaneously establishing non-remote connections with the system and communicating via some other connection to resources in external networks." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002400_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002400" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system audits the identity of internal users associated with denied outgoing communications traffic posing a threat to external information systems." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:OutboundTrafficFiltering ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002403_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002403" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system only allows incoming communications from organization-defined authorized sources routed to organization-defined authorized destinations." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002409_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002409" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system blocks both inbound and outbound communications traffic between organization-defined communication clients that are independently configured by end users and external service providers." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002411_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002411" ; + d3f:broader d3f:Hardware-basedProcessIsolation, + d3f:IOPortRestriction, + d3f:Kernel-basedProcessIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides the capability to dynamically isolate/segregate organization-defined information system components from other components of the system." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002420_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002420" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system maintains the confidentiality and/or integrity of information during preparation for transmission." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:EncryptedTunnels ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002421_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002421" ; + d3f:broader d3f:EncryptedTunnels ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to prevent unauthorized disclosure of information and/or detect changes to information during transmission unless otherwise protected by organization-defined alternative physical safeguards." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002422_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002422" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system maintains the confidentiality and/or integrity of information during reception." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:EncryptedTunnels ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002423_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002423" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to protect message externals (e.g., message headers and routing information) unless otherwise protected by organization-defined alternative physical safeguards." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:EncryptedTunnels ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002425_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002425" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to conceal or randomize communication patterns unless otherwise protected by organization-defined alternative physical safeguards." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:EncryptedTunnels ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002426_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002426" ; + d3f:broader d3f:EncryptedTunnels ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides a trusted communications path that is logically isolated and distinguishable from other paths." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002460_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002460" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces organization-defined actions prior to executing mobile code." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableDenylisting ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002462_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002462" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides additional data integrity verification artifacts along with the authoritative name resolution data the system returns in response to external name/address resolution queries." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002463_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002463" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides data origin artifacts for internal name/address resolution queries." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002464_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002464" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides data integrity protection artifacts for internal name/address resolution queries." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002465_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002465" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system requests data origin authentication verification on the name/address resolution responses the system receives from authoritative sources." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002466_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002466" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system requests data integrity verification on the name/address resolution responses the system receives from authoritative sources." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DomainTrustPolicy ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002467_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002467" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system performs data integrity verification on the name/address resolution responses the system receives from authoritative sources." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DNSTrafficAnalysis ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002468_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002468" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system performs data origin verification authentication on the name/address resolution responses the system receives from authoritative sources." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DNSTrafficAnalysis ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002470_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002470" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system only allows the use of organization-defined certificate authorities for verification of the establishment of protected sessions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Certificate-basedAuthentication, + d3f:CertificatePinning ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002475_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002475" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to prevent unauthorized modification of organization-defined information at rest on organization-defined information system components." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DiskEncryption, + d3f:FileEncryption ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002476_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002476" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to prevent unauthorized disclosure of organization-defined information at rest on organization-defined information system components." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DiskEncryption, + d3f:FileEncryption ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002530_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002530" ; + d3f:broader d3f:Hardware-basedProcessIsolation, + d3f:Kernel-basedProcessIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system maintains a separate execution domain for each executing process." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002531_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002531" ; + d3f:broader d3f:Hardware-basedProcessIsolation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements underlying hardware separation mechanisms to facilitate process separation." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002533_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002533" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system maintains a separate execution domain for each thread in organization-defined multi-threaded processing." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:Kernel-basedProcessIsolation ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002536_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002536" ; + d3f:broader d3f:RFShielding ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system protects organization-defined external and internal wireless links from organization-defined types of signal parameter attacks or references to sources for such attacks." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002546_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002546" ; + d3f:broader d3f:IOPortRestriction ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization physically disables or removes organization-defined connection ports or input/output devices on organization-defined information systems or information system components." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-02T00:00:00"^^xsd:dateTime . + +d3f:CCI-002605_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002605" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization installs security-relevant software updates within an organization-defined time period of the release of the updates." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SoftwareUpdate ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002607_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002607" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization installs security-relevant firmware updates within an organization-defined time period of the release of the updates." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SoftwareUpdate ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002613_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002613" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization installs organization-defined security-relevant software updates automatically to organization-defined information system components." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SoftwareUpdate ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002614_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002614" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization installs organization-defined security-relevant firmware updates automatically to organization-defined information system components." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SoftwareUpdate ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002617_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002617" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization removes organization-defined software components (e.g., previous versions) after updated versions have been installed." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SoftwareUpdate ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002618_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002618" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The organization removes organization-defined firmware components (e.g., previous versions) after updated versions have been installed." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:SoftwareUpdate ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002630_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002630" ; + d3f:broader d3f:ScriptExecutionAnalysis ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system detects organization-defined unauthorized operating system commands through the kernel application programming interface at organization-defined information system hardware components." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002631_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002631" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system issues a warning, audits the command execution, or prevents the execution of the command when organization-defined unauthorized operating system commands are detected." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ScriptExecutionAnalysis ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002661_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002661" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system monitors inbound communications traffic per organization-defined frequency for unusual or unauthorized activities or conditions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:InboundTrafficFiltering ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002662_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002662" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system monitors outbound communications traffic per organization-defined frequency for unusual or unauthorized activities or conditions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:OutboundTrafficFiltering ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002684_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002684" ; + d3f:broader d3f:NetworkTrafficAnalysis, + d3f:PlatformMonitoring ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system audits and/or alerts organization-defined personnel when unauthorized network services are detected." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002688_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002688" ; + d3f:broader d3f:FileContentRules ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system discovers indicators of compromise." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002689_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002689" ; + d3f:broader d3f:FileContentRules ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system collects indicators of compromise." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002690_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002690" ; + d3f:broader d3f:FileContentRules ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system distributes indicators of compromise." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002691_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002691" ; + d3f:broader d3f:FileContentRules ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system uses indicators of compromise." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002710_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002710" ; + d3f:broader d3f:DriverLoadIntegrityChecking, + d3f:FileHashing, + d3f:PointerAuthentication, + d3f:TPMBootIntegrity ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system performs an integrity check of organization-defined software at startup, at organization-defined transitional states or security-relevant events, or on an organization-defined frequency." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002711_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002711" ; + d3f:broader d3f:TPMBootIntegrity ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system performs an integrity check of organization-defined firmware at startup, at organization-defined transitional states or security-relevant events, or on an organization-defined frequency." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002712_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002712" ; + d3f:broader d3f:DriverLoadIntegrityChecking, + d3f:FileHashing, + d3f:PointerAuthentication, + d3f:TPMBootIntegrity ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system performs an integrity check of organization-defined information at startup, at organization-defined transitional states or security-relevant events, or on an organization-defined frequency." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002715_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002715" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system automatically shuts the information system down, restarts the information system, and/or implements organization-defined security safeguards when integrity violations are discovered." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DriverLoadIntegrityChecking, + d3f:FileHashing, + d3f:PointerAuthentication, + d3f:TPMBootIntegrity ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002716_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002716" ; + d3f:broader d3f:FileHashing ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to detect unauthorized changes to software." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002717_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002717" ; + d3f:broader d3f:FileHashing ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to detect unauthorized changes to firmware." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002718_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002718" ; + d3f:broader d3f:FileHashing ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to detect unauthorized changes to information." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002723_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002723" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, upon detection of a potential integrity violation, provides the capability to audit the event." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DriverLoadIntegrityChecking, + d3f:FileHashing, + d3f:PointerAuthentication, + d3f:TPMBootIntegrity ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002724_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002724" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system, upon detection of a potential integrity violation, initiates one or more of the following actions: generates an audit record; alerts the current user; alerts organization-defined personnel or roles; and/or organization-defined other actions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DriverLoadIntegrityChecking, + d3f:FileHashing, + d3f:PointerAuthentication, + d3f:TPMBootIntegrity ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002726_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002726" ; + d3f:broader d3f:DriverLoadIntegrityChecking, + d3f:TPMBootIntegrity ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system verifies the integrity of the boot process of organization-defined devices." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002729_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002729" ; + d3f:broader d3f:DriverLoadIntegrityChecking, + d3f:TPMBootIntegrity ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements organization-defined security safeguards to protect the integrity of boot firmware in organization-defined devices." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002740_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002740" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to authenticate organization-defined software or firmware components prior to installation." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:ExecutableAllowlisting ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002743_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002743" ; + d3f:broader d3f:SenderMTAReputationAnalysis, + d3f:SenderReputationAnalysis ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements spam protection mechanisms with a learning capability to more effectively identify legitimate communications traffic." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002746_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002746" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system provides a manual override capability for input validation of organization-defined inputs." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DatabaseQueryStringAnalysis ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002748_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002748" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system restricts the use of the manual override capability to only organization-defined authorized individuals." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DatabaseQueryStringAnalysis ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002749_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002749" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system audits the use of the manual override capability." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:DatabaseQueryStringAnalysis ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002771_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002771" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system validates information output from organization-defined software programs and/or applications to ensure that the information is consistent with the expected content." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:OutboundTrafficFiltering ; + d3f:published "2013-07-11T00:00:00"^^xsd:dateTime . + +d3f:CCI-002824_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002824" ; + d3f:broader d3f:DeadCodeElimination, + d3f:ProcessSegmentExecutionPrevention, + d3f:SegmentAddressOffsetRandomization, + d3f:StackFrameCanaryValidation ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements organization-defined security safeguards to protect its memory from unauthorized code execution." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-07-12T00:00:00"^^xsd:dateTime . + +d3f:CCI-002883_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002883" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system restricts the use of maintenance tools to authorized personnel only." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:UserAccountPermissions ; + d3f:published "2013-07-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-002890_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002890" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to protect the integrity of nonlocal maintenance and diagnostic communications." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:EncryptedTunnels ; + d3f:published "2013-07-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-002891_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-002891" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements remote disconnect verification at the termination of nonlocal maintenance and diagnostic sessions." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:RemoteTerminalSessionDetection ; + d3f:published "2013-07-22T00:00:00"^^xsd:dateTime . + +d3f:CCI-003014_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-003014" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system enforces organization-defined mandatory access control policies over all subjects and objects." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:published "2013-08-30T00:00:00"^^xsd:dateTime . + +d3f:CCI-003123_v2022-04-05 a d3f:CCIControl, + owl:NamedIndividual ; + rdfs:label "CCI-003123" ; + d3f:contributor d3f:DISA_FSO ; + d3f:definition "The information system implements cryptographic mechanisms to protect the confidentiality of nonlocal maintenance and diagnostic communications." ; + d3f:member-of d3f:CCICatalog_v2022-04-05 ; + d3f:narrower d3f:EncryptedTunnels ; + d3f:published "2013-09-24T00:00:00"^^xsd:dateTime . + +d3f:CWE-1105 a owl:Class ; + rdfs:label "Insufficient Encapsulation of Machine-Dependent Functionality" ; + d3f:cwe-id "CWE-1105" ; + rdfs:subClassOf d3f:CWE-1061, + d3f:CWE-758 . + +d3f:CWE-118 a owl:Class ; + rdfs:label "Incorrect Access of Indexable Resource ('Range Error')" ; + d3f:cwe-id "CWE-118" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-1188 a owl:Class ; + rdfs:label "Insecure Default Initialization of Resource" ; + d3f:cwe-id "CWE-1188" ; + rdfs:subClassOf d3f:CWE-665 . + +d3f:CWE-1189 a owl:Class ; + rdfs:label "Improper Isolation of Shared Resources on System-on-a-Chip (SoC)" ; + d3f:cwe-id "CWE-1189" ; + rdfs:subClassOf d3f:CWE-653, + d3f:CWE-668 . + +d3f:CWE-120 a owl:Class ; + rdfs:label "Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')" ; + d3f:cwe-id "CWE-120" ; + rdfs:subClassOf d3f:CWE-119 . + +d3f:CWE-1204 a owl:Class ; + rdfs:label "Generation of Weak Initialization Vector (IV)" ; + d3f:cwe-id "CWE-1204" ; + rdfs:subClassOf d3f:CWE-330 . + +d3f:CWE-1220 a owl:Class ; + rdfs:label "Insufficient Granularity of Access Control" ; + d3f:cwe-id "CWE-1220" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1229 a owl:Class ; + rdfs:label "Creation of Emergent Resource" ; + d3f:cwe-id "CWE-1229" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-1263 a owl:Class ; + rdfs:label "Improper Physical Access Control" ; + d3f:cwe-id "CWE-1263" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1286 a owl:Class ; + rdfs:label "Improper Validation of Syntactic Correctness of Input" ; + d3f:cwe-id "CWE-1286" ; + rdfs:subClassOf d3f:CWE-20 . + +d3f:CWE-1294 a owl:Class ; + rdfs:label "Insecure Security Identifier Mechanism" ; + d3f:cwe-id "CWE-1294" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-1300 a owl:Class ; + rdfs:label "Improper Protection of Physical Side Channels" ; + d3f:cwe-id "CWE-1300" ; + rdfs:subClassOf d3f:CWE-203 . + +d3f:CWE-1301 a owl:Class ; + rdfs:label "Insufficient or Incomplete Data Removal within Hardware Component" ; + d3f:cwe-id "CWE-1301" ; + rdfs:subClassOf d3f:CWE-226 . + +d3f:CWE-131 a owl:Class ; + rdfs:label "Incorrect Calculation of Buffer Size" ; + d3f:cwe-id "CWE-131" ; + rdfs:subClassOf d3f:CWE-682 . + +d3f:CWE-1341 a owl:Class ; + rdfs:label "Multiple Releases of Same Resource or Handle" ; + d3f:cwe-id "CWE-1341" ; + rdfs:subClassOf d3f:CWE-675 . + +d3f:CWE-147 a owl:Class ; + rdfs:label "Improper Neutralization of Input Terminators" ; + d3f:cwe-id "CWE-147" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-155 a owl:Class ; + rdfs:label "Improper Neutralization of Wildcards or Matching Symbols" ; + d3f:cwe-id "CWE-155" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-161 a owl:Class ; + rdfs:label "Improper Neutralization of Multiple Leading Special Elements" ; + d3f:cwe-id "CWE-161" ; + rdfs:subClassOf d3f:CWE-160 . + +d3f:CWE-164 a owl:Class ; + rdfs:label "Improper Neutralization of Internal Special Elements" ; + d3f:cwe-id "CWE-164" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-183 a owl:Class ; + rdfs:label "Permissive List of Allowed Inputs" ; + d3f:cwe-id "CWE-183" ; + rdfs:subClassOf d3f:CWE-697 . + +d3f:CWE-188 a owl:Class ; + rdfs:label "Reliance on Data/Memory Layout" ; + d3f:cwe-id "CWE-188" ; + rdfs:subClassOf d3f:CWE-1105, + d3f:CWE-435 . + +d3f:CWE-201 a owl:Class ; + rdfs:label "Insertion of Sensitive Information Into Sent Data" ; + d3f:cwe-id "CWE-201" ; + rdfs:subClassOf d3f:CWE-200 . + +d3f:CWE-208 a owl:Class ; + rdfs:label "Observable Timing Discrepancy" ; + d3f:cwe-id "CWE-208" ; + rdfs:subClassOf d3f:CWE-203 . + +d3f:CWE-219 a owl:Class ; + rdfs:label "Storage of File with Sensitive Data Under Web Root" ; + d3f:cwe-id "CWE-219" ; + rdfs:subClassOf d3f:CWE-552 . + +d3f:CWE-223 a owl:Class ; + rdfs:label "Omission of Security-relevant Information" ; + d3f:cwe-id "CWE-223" ; + rdfs:subClassOf d3f:CWE-221 . + +d3f:CWE-240 a owl:Class ; + rdfs:label "Improper Handling of Inconsistent Structural Elements" ; + d3f:cwe-id "CWE-240" ; + rdfs:subClassOf d3f:CWE-237, + d3f:CWE-707 . + +d3f:CWE-248 a owl:Class ; + rdfs:label "Uncaught Exception" ; + d3f:cwe-id "CWE-248" ; + rdfs:subClassOf d3f:CWE-703, + d3f:CWE-705 . + +d3f:CWE-267 a owl:Class ; + rdfs:label "Privilege Defined With Unsafe Actions" ; + d3f:cwe-id "CWE-267" ; + rdfs:subClassOf d3f:CWE-269 . + +d3f:CWE-286 a owl:Class ; + rdfs:label "Incorrect User Management" ; + d3f:cwe-id "CWE-286" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-299 a owl:Class ; + rdfs:label "Improper Check for Certificate Revocation" ; + d3f:cwe-id "CWE-299" ; + rdfs:subClassOf d3f:CWE-295, + d3f:CWE-404 . + +d3f:CWE-303 a owl:Class ; + rdfs:label "Incorrect Implementation of Authentication Algorithm" ; + d3f:cwe-id "CWE-303" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-326 a owl:Class ; + rdfs:label "Inadequate Encryption Strength" ; + d3f:cwe-id "CWE-326" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-334 a owl:Class ; + rdfs:label "Small Space of Random Values" ; + d3f:cwe-id "CWE-334" ; + rdfs:subClassOf d3f:CWE-330 . + +d3f:CWE-346 a owl:Class ; + rdfs:label "Origin Validation Error" ; + d3f:cwe-id "CWE-346" ; + rdfs:subClassOf d3f:CWE-284, + d3f:CWE-345 . + +d3f:CWE-357 a owl:Class ; + rdfs:label "Insufficient UI Warning of Dangerous Operations" ; + d3f:cwe-id "CWE-357" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-360 a owl:Class ; + rdfs:label "Trust of System Event Data" ; + d3f:cwe-id "CWE-360" ; + rdfs:subClassOf d3f:CWE-345 . + +d3f:CWE-367 a owl:Class ; + rdfs:label "Time-of-check Time-of-use (TOCTOU) Race Condition" ; + d3f:cwe-id "CWE-367" ; + rdfs:subClassOf d3f:CWE-362 . + +d3f:CWE-407 a owl:Class ; + rdfs:label "Inefficient Algorithmic Complexity" ; + d3f:cwe-id "CWE-407" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-413 a owl:Class ; + rdfs:label "Improper Resource Locking" ; + d3f:cwe-id "CWE-413" ; + rdfs:subClassOf d3f:CWE-667 . + +d3f:CWE-42 a owl:Class ; + rdfs:label "Path Equivalence: 'filename.' (Trailing Dot)" ; + d3f:cwe-id "CWE-42" ; + rdfs:subClassOf d3f:CWE-162, + d3f:CWE-41 . + +d3f:CWE-424 a owl:Class ; + rdfs:label "Improper Protection of Alternate Path" ; + d3f:cwe-id "CWE-424" ; + rdfs:subClassOf d3f:CWE-638, + d3f:CWE-693 . + +d3f:CWE-44 a owl:Class ; + rdfs:label "Path Equivalence: 'file.name' (Internal Dot)" ; + d3f:cwe-id "CWE-44" ; + rdfs:subClassOf d3f:CWE-41 . + +d3f:CWE-474 a owl:Class ; + rdfs:label "Use of Function with Inconsistent Implementations" ; + d3f:cwe-id "CWE-474" ; + rdfs:subClassOf d3f:CWE-758 . + +d3f:CWE-476 a owl:Class, + owl:NamedIndividual ; + rdfs:label "NULL Pointer Dereference" ; + d3f:cwe-id "CWE-476" ; + d3f:weakness-of d3f:PointerDereferencingFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:PointerDereferencingFunction ], + d3f:CWE-710, + d3f:CWE-754 . + +d3f:CWE-489 a owl:Class ; + rdfs:label "Active Debug Code" ; + d3f:cwe-id "CWE-489" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-493 a owl:Class ; + rdfs:label "Critical Public Variable Without Final Modifier" ; + d3f:cwe-id "CWE-493" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-521 a owl:Class ; + rdfs:label "Weak Password Requirements" ; + d3f:cwe-id "CWE-521" ; + rdfs:subClassOf d3f:CWE-1391 . + +d3f:CWE-524 a owl:Class ; + rdfs:label "Use of Cache Containing Sensitive Information" ; + d3f:cwe-id "CWE-524" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-565 a owl:Class ; + rdfs:label "Reliance on Cookies without Validation and Integrity Checking" ; + d3f:cwe-id "CWE-565" ; + rdfs:subClassOf d3f:CWE-602, + d3f:CWE-642 . + +d3f:CWE-595 a owl:Class ; + rdfs:label "Comparison of Object References Instead of Object Contents" ; + d3f:cwe-id "CWE-595" ; + rdfs:subClassOf d3f:CWE-1025 . + +d3f:CWE-625 a owl:Class ; + rdfs:label "Permissive Regular Expression" ; + d3f:cwe-id "CWE-625" ; + rdfs:subClassOf d3f:CWE-185 . + +d3f:CWE-636 a owl:Class ; + rdfs:label "Not Failing Securely ('Failing Open')" ; + d3f:cwe-id "CWE-636" ; + rdfs:subClassOf d3f:CWE-657, + d3f:CWE-755 . + +d3f:CWE-638 a owl:Class ; + rdfs:label "Not Using Complete Mediation" ; + d3f:cwe-id "CWE-638" ; + rdfs:subClassOf d3f:CWE-657, + d3f:CWE-862 . + +d3f:CWE-639 a owl:Class ; + rdfs:label "Authorization Bypass Through User-Controlled Key" ; + d3f:cwe-id "CWE-639" ; + rdfs:subClassOf d3f:CWE-863 . + +d3f:CWE-673 a owl:Class ; + rdfs:label "External Influence of Sphere Definition" ; + d3f:cwe-id "CWE-673" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-674 a owl:Class ; + rdfs:label "Uncontrolled Recursion" ; + d3f:cwe-id "CWE-674" ; + rdfs:subClassOf d3f:CWE-834 . + +d3f:CWE-676 a owl:Class ; + rdfs:label "Use of Potentially Dangerous Function" ; + d3f:cwe-id "CWE-676" ; + rdfs:subClassOf d3f:CWE-1177 . + +d3f:CWE-687 a owl:Class ; + rdfs:label "Function Call With Incorrectly Specified Argument Value" ; + d3f:cwe-id "CWE-687" ; + rdfs:subClassOf d3f:CWE-628 . + +d3f:CWE-73 a owl:Class ; + rdfs:label "External Control of File Name or Path" ; + d3f:cwe-id "CWE-73" ; + rdfs:subClassOf d3f:CWE-610, + d3f:CWE-642 . + +d3f:CWE-733 a owl:Class ; + rdfs:label "Compiler Optimization Removal or Modification of Security-critical Code" ; + d3f:cwe-id "CWE-733" ; + rdfs:subClassOf d3f:CWE-1038 . + +d3f:CWE-75 a owl:Class ; + rdfs:label "Failure to Sanitize Special Elements into a Different Plane (Special Element Injection)" ; + d3f:cwe-id "CWE-75" ; + rdfs:subClassOf d3f:CWE-74 . + +d3f:CWE-762 a owl:Class ; + rdfs:label "Mismatched Memory Management Routines" ; + d3f:cwe-id "CWE-762" ; + rdfs:subClassOf d3f:CWE-763 . + +d3f:CWE-771 a owl:Class ; + rdfs:label "Missing Reference to Active Allocated Resource" ; + d3f:cwe-id "CWE-771" ; + rdfs:subClassOf d3f:CWE-400 . + +d3f:CWE-790 a owl:Class ; + rdfs:label "Improper Filtering of Special Elements" ; + d3f:cwe-id "CWE-790" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-805 a owl:Class ; + rdfs:label "Buffer Access with Incorrect Length Value" ; + d3f:cwe-id "CWE-805" ; + rdfs:subClassOf d3f:CWE-119 . + +d3f:CWE-828 a owl:Class ; + rdfs:label "Signal Handler with Functionality that is not Asynchronous-Safe" ; + d3f:cwe-id "CWE-828" ; + rdfs:subClassOf d3f:CWE-364 . + +d3f:CWE-83 a owl:Class ; + rdfs:label "Improper Neutralization of Script in Attributes in a Web Page" ; + d3f:cwe-id "CWE-83" ; + rdfs:subClassOf d3f:CWE-79 . + +d3f:CWE-89 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')" ; + d3f:cwe-id "CWE-89" ; + d3f:weakness-of d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-943 . + +d3f:CWE-908 a owl:Class ; + rdfs:label "Use of Uninitialized Resource" ; + d3f:cwe-id "CWE-908" ; + rdfs:subClassOf d3f:CWE-665 . + +d3f:CWE-912 a owl:Class ; + rdfs:label "Hidden Functionality" ; + d3f:cwe-id "CWE-912" ; + rdfs:subClassOf d3f:CWE-684 . + +d3f:CWE-915 a owl:Class ; + rdfs:label "Improperly Controlled Modification of Dynamically-Determined Object Attributes" ; + d3f:cwe-id "CWE-915" ; + rdfs:subClassOf d3f:CWE-913 . + +d3f:CWE-93 a owl:Class ; + rdfs:label "Improper Neutralization of CRLF Sequences ('CRLF Injection')" ; + d3f:cwe-id "CWE-93" ; + rdfs:subClassOf d3f:CWE-74 . + +d3f:CWE-940 a owl:Class ; + rdfs:label "Improper Verification of Source of a Communication Channel" ; + d3f:cwe-id "CWE-940" ; + rdfs:subClassOf d3f:CWE-923 . + +d3f:CWE-96 a owl:Class ; + rdfs:label "Improper Neutralization of Directives in Statically Saved Code ('Static Code Injection')" ; + d3f:cwe-id "CWE-96" ; + rdfs:subClassOf d3f:CWE-94 . + +d3f:Centroid-basedClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Centroid-based Clustering" ; + d3f:d3fend-id "D3A-CBC" ; + d3f:definition "Centroid-based clustering organizes the data into non-hierarchical clusters, in contrast to hierarchical clustering defined below. K-means is the most widely-used centroid-based clustering algorithm. Centroid-based algorithms are efficient but sensitive to initial conditions and outliers." ; + d3f:kb-article """## References +Google Developers. (n.d.). Clustering Algorithms. [Link](https://developers.google.com/machine-learning/clustering/clustering-algorithms)""" ; + rdfs:subClassOf d3f:ClusterAnalysis . + +d3f:Clustering a owl:Class ; + rdfs:label "Clustering" ; + rdfs:subClassOf d3f:Summarizing . + +d3f:CoefficientOfVariation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Coefficient of Variation" ; + d3f:d3fend-id "D3A-COV" ; + d3f:definition """The coefficient of variation (CV), also known as relative standard deviation (RSD), is a standardized measure of dispersion of a probability distribution or frequency distribution. + +The coefficient of variation (CV) is defined as the ratio of the standard deviation to the mean .""" ; + d3f:kb-article """## References +Wikipedia. (n.d.). Coefficient of variation. [Link](https://en.wikipedia.org/wiki/Coefficient_of_variation)""" ; + d3f:synonym "RSD", + "Relative Standard Deviation" ; + rdfs:subClassOf d3f:Variability . + +d3f:CommandLineInterface a owl:Class ; + rdfs:label "Command Line Interface" ; + d3f:definition "A command-line interface or command language interpreter (CLI), also known as command-line user interface, console user interface, and character user interface (CUI), is a means of interacting with a computer program where the user (or client) issues commands to the program in the form of successive lines of text (command lines). Command-line interfaces to computer operating systems are less widely used by casual computer users, who favor graphical user interfaces. Programs with command-line interfaces are generally easier to automate via scripting." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:UserInterface ; + skos:altLabel "CLI", + "CUI", + "Command-line Interface" . + +d3f:ComputingSnapshot a owl:Class ; + rdfs:label "Computing Snapshot" ; + d3f:definition "In computer systems, a snapshot is the state of a system at a particular point in time." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "Snapshot" . + +d3f:Condition a owl:Class ; + rdfs:label "Condition" ; + d3f:definition "An assumption on which rests the validity or effect of something else." ; + rdfs:comment "Less common usage versus state, meant to superclass precondition, postcondition, and effect." ; + rdfs:isDefinedBy "n-06768279" ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:CorrelationClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Correlation Clustering" ; + d3f:d3fend-id "D3A-CC" ; + d3f:definition "Correlation clustering provides a method for clustering a set of objects into the optimum number of clusters without specifying that number in advance." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Correlation clustering. [Link](https://en.wikipedia.org/wiki/Correlation_clustering)""" ; + rdfs:subClassOf d3f:High-dimensionClustering . + +d3f:D3FENDKBThing a owl:Class ; + rdfs:label "D3FEND KB Thing" . + +d3f:Density-basedClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Density-based Clustering" ; + d3f:d3fend-id "D3A-DBC" ; + d3f:definition "Density-based clustering connects areas of high example density into clusters. This allows for arbitrary-shaped distributions as long as dense areas can be connected." ; + d3f:kb-article """## References +Google Developers. (n.d.). Clustering algorithms. [Link](https://developers.google.com/machine-learning/clustering/clustering-algorithms)""" ; + rdfs:subClassOf d3f:ClusterAnalysis . + +d3f:DescriptionLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Description Logic" ; + d3f:d3fend-id "D3A-DL" ; + d3f:definition "A description logic (DL) is a form of logic usually more expressive than propositional logic but less expressive than first-order logic." ; + d3f:kb-article """## How it works +The core reasoning problems for description logics (DLs) are (usually) decidable, and efficient decision procedures have been designed and implemented for these problems. There are general, spatial, temporal, spatiotemporal, and fuzzy description logics, and each description logic features a different balance between expressive power and reasoning complexity by supporting different sets of mathematical constructors. + +DLs are used in artificial intelligence to describe and reason about the relevant concepts of an application domain (known as terminological knowledge). It is of particular importance in providing a logical formalism for ontologies and the Semantic Web: the Web Ontology Language (OWL) and its profiles are based on DLs. + +## References +1. Description logic. (2023, April 16). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Description_logic)""" ; + rdfs:subClassOf d3f:SymbolicAI . + +d3f:DetectionEvent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Detection Event" ; + d3f:definition "An event capturing the identification of a potential security issue, such as unauthorized access attempts, policy violations, or anomalous activities. Detection events form the foundation of cybersecurity monitoring and response." ; + d3f:related d3f:Detect ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:SecurityEvent . + +d3f:DigitalFingerprint a owl:Class ; + rdfs:label "Digital Fingerprint" ; + d3f:definition "A digital signature uniquely identifies data and has the property that changing a single bit in the data will cause a completely different message digest to be generated." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Identifier . + +d3f:DiskImage a owl:Class ; + rdfs:label "Disk Image" ; + d3f:definition "A disk image is a snapshot of a storage device's structure and data typically stored in one or more computer files on another storage device." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:StorageImage . + +d3f:Distribution-basedClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Distribution-based Clustering" ; + d3f:d3fend-id "D3A-DBC" ; + d3f:definition "Distribution-based clustering creates and groups data points based on their likely hood of belonging to the same probability distribution (Gaussian, Binomial, etc.) in the data." ; + d3f:kb-article """## References +AnalytixLabs. (n.d.). Types of Clustering Algorithms. [Link](https://www.analytixlabs.co.in/blog/types-of-clustering-algorithms/#:~:text=Distribution-Based)""" ; + rdfs:subClassOf d3f:ClusterAnalysis . + +d3f:EmbeddedComputer a owl:Class ; + rdfs:label "Embedded Computer" ; + d3f:definition "An embedded computer is a computer system -- a combination of a computer processor, computer memory, and input/output peripheral devices-that has a dedicated function within a larger mechanical or electrical system. It is embedded as part of a complete device often including electrical or electronic hardware and mechanical parts. Because an embedded system typically controls physical operations of the machine that it is embedded within, it often has real-time computing constraints. Embedded systems control many devices in common use today. Ninety-eight percent of all microprocessors manufactured are used in embedded systems." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ClientComputer ; + skos:altLabel "Embedded System" . + +d3f:FileCreationEvent a owl:Class ; + rdfs:label "File Creation Event" ; + d3f:definition "An event representing the creation of a new file within the system, establishing its existence and initial attributes in the file system or storage medium." ; + rdfs:subClassOf d3f:FileEvent . + +d3f:ForwardResolutionIPDenylisting a d3f:ForwardResolutionIPDenylisting, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Forward Resolution IP Denylisting" ; + d3f:blocks d3f:InboundInternetDNSResponseTraffic ; + d3f:d3fend-id "D3-FRIDL" ; + d3f:definition "Blocking a DNS lookup's answer's IP address value." ; + d3f:kb-article """## How it works + +This technique prevents a client from learning IP addresses deemed to be potentially malicious, which would have been delivered via forward resolution responses. + +Responses to forward resolution requests (that is, requests where a domain is sent and IP(s) are returned) are collected, and the IP address(es) included as a response are examined. If the IP address(es) are in a range included in the blacklist, then the response is dropped and not forwarded to the client. + +The DNS lookup can be blocked by either dropping the network traffic with an inline device, or modifying the value of the response sent by the DNS server. To transparently prevent client applications from hanging on a request, it is common practice to replace malicious values with addresses in the range 127.0.0.0/8 or the address of a honeypot maintained by the network administrators. + +## Considerations + +* This technique does not prevent the client from contacting the blacklisted IP, only from learning about this IP address via a nameserver lookup request. +* DNS Response traffic can be transmitted over many different protocols, which presents a challenge to implementing methods to extract all DNS answer IP address value(s). + * DNS has historically used UDP port 53, with TCP port 53 instead used for responses over 512 bytes or after a lack of response over UDP. + * Usage of new protocols to provide confidentiality for DNS traffic, such as DoH (DNS over HTTPS) and DoT (DNS over TLS), complicates collection of the IP address(es) in DNS responses. These protocols have often been enabled in browser settings transparently after a browser update, with DNS requests proxied over one of these cryptographic protocols through a specified host. +* This technique must be implemented logically between the application that receives the response and the server which sent the response. + * DNS responses sent in an encrypted manner, such as those using DoH or DoT, will require interception of the TLS connections in order to determine the IP address(es) in the response. +* Replacing the response is not effective in the case that the nameserver uses a technique to provide integrity of its responses, such as DNSSEC for DNS responses.""" ; + d3f:kb-reference d3f:Reference-UseDNSPolicyForApplyingFiltersOnDNSQueries ; + d3f:synonym "Forward Resolution IP Blacklisting" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:blocks ; + owl:someValuesFrom d3f:InboundInternetDNSResponseTraffic ], + d3f:DNSDenylisting . + +d3f:GeometricMean a owl:Class, + owl:NamedIndividual ; + rdfs:label "Geometric Mean" ; + d3f:d3fend-id "D3A-GM" ; + d3f:definition "The nth root of the product of the data values, where there are n of these. This measure is valid only for data that are measured absolutely on a strictly positive scale." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Central tendency. [Link](https://en.wikipedia.org/wiki/Central_tendency)""" ; + rdfs:subClassOf d3f:CentralTendency . + +d3f:Group a owl:Class ; + rdfs:label "Group" ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:Grouping a owl:Class ; + rdfs:label "Grouping" ; + rdfs:subClassOf d3f:Summarizing . + +d3f:HTMLFile a owl:Class ; + rdfs:label "HTML File" ; + d3f:definition "A document file encoded in HTML.The HyperText Markup Language, or HTML is the standard markup language for documents designed to be displayed in a web browser. It can be assisted by technologies such as Cascading Style Sheets (CSS) and scripting languages such as JavaScript. Web browsers receive HTML documents from a web server or from local storage and render the documents into multimedia web pages. HTML describes the structure of a web page semantically and originally included cues for the appearance of the document." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DocumentFile ; + skos:altLabel "HTML File" . + +d3f:HarmonicMean a owl:Class, + owl:NamedIndividual ; + rdfs:label "Harmonic Mean" ; + d3f:d3fend-id "D3A-HM" ; + d3f:definition "The reciprocal of the arithmetic mean of the reciprocals of the data values. This measure too is valid only for data that are measured absolutely on a strictly positive scale." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Central tendency. [Link](https://en.wikipedia.org/wiki/Central_tendency)""" ; + rdfs:subClassOf d3f:CentralTendency . + +d3f:Histogramming a owl:Class ; + rdfs:label "Histogramming" ; + rdfs:subClassOf d3f:Summarizing . + +d3f:HostReboot a d3f:HostReboot, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Host Reboot" ; + d3f:d3fend-id "D3-HR" ; + d3f:definition "Initiating a host's reboot sequence to terminate all running processes." ; + d3f:kb-article """## How It Works + +Host reboot can either be initiated in the physical presence of the device using the power functions or remotely using the provided user interface or an installed EDR agent (with the available function). This process may allow for the removal of specific types of malware, such as fileless malware, and can also prevent further damage, for example, if the system is part of a botnet. + +## Considerations + +- If the attacker has achieved persistence techniques, this technique may not be effective +- Compromised systems may not respond to remote commands to shutdown or reboot, requiring physical intervention. +- Shutting down a system will usually result in the memory losing its state which can be useful in forensic activities so this should be considered when deciding to shutdown. +- Shutting down or rebooting systems may disrupt access to computer resources for legitimate users.""" ; + d3f:kb-reference d3f:Reference-NearMemoryInMemoryDetectionofFilelessMalware ; + d3f:terminates d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:terminates ; + owl:someValuesFrom d3f:Process ], + d3f:HostShutdown . + +d3f:IOModule a owl:Class ; + rdfs:label "I/O Module" ; + d3f:definition "An I/O Module is a hardware device that translates signals between external sensors or actuators and control systems. It typically handles analog-to-digital (and vice versa) conversion, serving as the data interface that allows physical processes to be monitored and controlled by digital controllers." ; + rdfs:subClassOf d3f:HardwareDevice . + +d3f:IPCNetworkTraffic a owl:Class ; + rdfs:label "IPC Network Traffic" ; + d3f:definition "IPC network traffic is network traffic related to inter-process communication (IPC) between network nodes..This includes only network traffic conforming to a standard IPC protocol; not custom protocols." ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:ImpersonateUser a d3f:SystemCall, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Impersonate User" ; + d3f:forges d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:forges ; + owl:someValuesFrom d3f:UserAccount ], + d3f:SystemCall . + +d3f:InputFunction a owl:Class ; + rdfs:label "Input Function" ; + d3f:definition "Generic function that receives input from an untrusted source." ; + rdfs:subClassOf d3f:Subroutine . + +d3f:IntegerRangeValidation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Integer Range Validation" ; + d3f:d3fend-id "D3-IRV" ; + d3f:definition "Ensuring that an integer is within a valid range." ; + d3f:hardens d3f:MathematicalFunction ; + d3f:kb-article """## How it Works +Integer Range Validation can be done by programmatically checking the value of an integer before or after an operation to determine if the resulting value will be valid. +Checking the value of an integer to ensure it is in a valid range helps prevent integer overflow, wraparound, and logical errors. + +## Considerations +* A valid range can be defined by language, data-type, or logical constraints. +* Take extra care when doing operations on integers that will result in a value close to the bounds of a valid range. +* Note: This resource should not be considered a definitive or exhaustive coding guideline.""" ; + d3f:kb-reference d3f:Reference-IntegerRangeValidation_SEI ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:MathematicalFunction ], + d3f:SourceCodeHardening . + +d3f:InterquartileRange a owl:Class, + owl:NamedIndividual ; + rdfs:label "Interquartile Range" ; + d3f:d3fend-id "D3A-IR" ; + d3f:definition "The interquartile range (IQR) is a measure of statistical dispersion, which is the spread of the data and is defined as the difference between the 75th and 25th percentiles of the data." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Interquartile range. [Link](https://en.wikipedia.org/wiki/Interquartile_range)""" ; + d3f:synonym "IQR" ; + rdfs:subClassOf d3f:Variability . + +d3f:IntrusionDetectionSystem a owl:Class ; + rdfs:label "Intrusion Detection System" ; + d3f:definition "An intrusion detection system (IDS) is a device or software application that monitors a network or systems for malicious activity or policy violations. Any intrusion activity or violation is typically reported either to an administrator or collected centrally using a security information and event management (SIEM) system. A SIEM system combines outputs from multiple sources and uses alarm filtering techniques to distinguish malicious activity from false alarms." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "IDS" . + +d3f:JavascriptFile a d3f:ExecutableScript, + owl:NamedIndividual ; + rdfs:label "Javascript File" . + +d3f:Kurtosis a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kurtosis" ; + d3f:d3fend-id "D3A-KUR" ; + d3f:definition "The measure of the \"fatness\" of the tails of a pmf or pdf. The fourth standardized moment of the distribution." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Probability distribution. [Link](https://en.wikipedia.org/wiki/Probability_distribution)""" ; + rdfs:subClassOf d3f:DistributionProperties . + +d3f:LinearRegression a owl:Class, + owl:NamedIndividual ; + rdfs:label "Linear Regression" ; + d3f:d3fend-id "D3A-LR" ; + d3f:definition "Statistical regression method used for predictive analysis by modeling the linear relationship between independent and dependent variables." ; + d3f:kb-article """## How it works +Takes independent variables (i.e. covariate, features, predictors, input variables) and dependent variables (i.e. response, output, “thing to be estimated”) and produces the coefficient(s) and intercept for a linear equation (e.g. (β1, β0) for y = β1x + β0) which predicts the relationship between the independent and independent variables by minimizing a cost function, Mean Squared Error, either directly in the case of univariate linear regression or by gradient descent* in the case of multivariate linear regression. + +## Considerations + - There are four principal assumptions required for good results using linear regression (the first letters of the four principal assumptions form the "LINE" mnemonic): + - Linearity and Additivity + - Independent Residuals + - Normal Residual Distributions + - Equal Variances (i.e. homoscedasticity) + - Linear regression is a low variance/high bias model. + - Optimizers like Adam, Batch, and Mini-Batch and others are available for certain applications and data sets. +- A large learning ratio or training coefficient may lead to divergent behavior of the model and too small of values may lead to long run times and inefficiency. + + +## Verification Approach + - Models are often evaluated by examining one or more of the metrics of R2, Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), and Mean Absolute Percentage Error (MAPE). + - While there is no generally accepted single best performance metric as a criterion, users of linear regression should consider the suitability of one or more of these metrics for assessing the performance of their model. + - Use well known data sets to verify model execution. + +## Validation Approach + - Violating the principal assumptions of linear regression results in poor or misleading results. + - Ensure data is truly representative and if there are any known biases. + + +## References +1. Gawali, Suvarna. “Linear Regression Algorithm to Make Predictions Easily.” Analytics Vidhya, 22 July 2022, https://www.analyticsvidhya.com/blog/2021/06/linear-regression-in-machine-learning/. +1. Nau, Robert. “Statistical Forecasting: Notes On Regression and Time Series Analysis.” Introduction to Linear Regression Analysis, Duke University Fuqua School of Business, 18 Aug. 2020, https://people.duke.edu/~rnau/regintro.htm. +1. Ng, Ritchie. “Evaluating a Linear Regression Model.” Ritchieng.github.io, 8 Jan. 2023, https://www.ritchieng.com/machine-learning-evaluate-linear-regression-model/. +1. Bochkarev, Alexei. "A New Typology Design of Performance Metrics to Measure Errors in Machine Learning Regression Algorithms", 2019, https://www.researchgate.net/publication/330661543_A_New_Typology_Design_of_Performance_Metrics_to_Measure_Errors_in_Machine_Learning_Regression_Algorithms.""" ; + rdfs:subClassOf d3f:RegressionAnalysis . + +d3f:LocalFileAccessMediation a d3f:LocalFileAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Local File Access Mediation" ; + d3f:d3fend-id "D3-LFAM" ; + d3f:definition "Restricting access to a local file by configuring operating system functionality." ; + d3f:filters d3f:OpenFile ; + d3f:kb-reference d3f:Reference-FileAndFolderPermissions ; + d3f:synonym "Local File Access Control" ; + rdfs:comment "Replaces d3-LFP" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:OpenFile ], + d3f:SystemCallFiltering . + +d3f:LogisticRegression a owl:Class, + owl:NamedIndividual ; + rdfs:label "Logistic Regression" ; + d3f:d3fend-id "D3A-LR" ; + d3f:definition "Logistic regression is estimating the parameters of a logistic model." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Logistic regression. [Link](https://en.wikipedia.org/wiki/Logistic_regression)""" ; + rdfs:subClassOf d3f:RegressionAnalysis . + +d3f:LogonEvent a owl:Class ; + rdfs:label "Logon Event" ; + d3f:definition "An authentication event where a new session is initiated, signifying the successful validation of credentials and establishment of an authorized connection to a system, application, or resource. This marks the beginning of the subject’s authenticated interaction with the system." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Session ], + d3f:AuthenticationEvent . + +d3f:MailService a owl:Class ; + rdfs:label "Mail Service" ; + d3f:definition "A mail service provides the ability to send and receive mail across a computer network. The mail service runs on message transfer agents (i.e., mail servers) and is accessed by users through an email client." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:NetworkService ; + skos:altLabel "Email Service" . + +d3f:Matching a owl:Class ; + rdfs:label "Matching" ; + rdfs:subClassOf d3f:AnalyticalPurpose . + +d3f:Mean a owl:Class, + owl:NamedIndividual ; + rdfs:label "Mean" ; + d3f:d3fend-id "D3A-MEA" ; + d3f:definition "The sum of all measurements divided by the number of observations in the data set." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Central tendency. [Link](https://en.wikipedia.org/wiki/Central_tendency)""" ; + rdfs:subClassOf d3f:CentralTendency . + +d3f:MeanAbsoluteDeviation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Mean Absolute Deviation" ; + d3f:d3fend-id "D3A-MAD" ; + d3f:definition "The mean absolute deviation (MAD), also referred to as the \"mean deviation\" or sometimes \"average absolute deviation\", is the mean of the data's absolute deviations around the data's mean: the average (absolute) distance from the mean." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Average absolute deviation. [Link](https://en.wikipedia.org/wiki/Average_absolute_deviation)""" ; + d3f:synonym "MAD" ; + rdfs:subClassOf d3f:AverageAbsoluteDeviation . + +d3f:Median a owl:Class, + owl:NamedIndividual ; + rdfs:label "Median" ; + d3f:d3fend-id "D3A-MED" ; + d3f:definition "The middle value that separates the higher half from the lower half of the data set. The median and the mode are the only measures of central tendency that can be used for ordinal data, in which values are ranked relative to each other but are not measured absolutely." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Central tendency. [Link](https://en.wikipedia.org/wiki/Central_tendency)""" ; + rdfs:subClassOf d3f:CentralTendency . + +d3f:MedianAbsoluteDeviation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Median Absolute Deviation" ; + d3f:d3fend-id "D3A-MAD" ; + d3f:definition "The median absolute deviation (also MAD) is the median of the absolute deviation from the median." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Average absolute deviation. [Link](https://en.wikipedia.org/wiki/Average_absolute_deviation)""" ; + rdfs:subClassOf d3f:AverageAbsoluteDeviation . + +d3f:MemoryAddressSpace a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Address Space" ; + d3f:contains d3f:MemoryAddress ; + d3f:definition "A memory address space is a space containing memory addresses." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:MemoryAddress ], + d3f:AddressSpace . + +d3f:MemoryBlockStartValidation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Block Start Validation" ; + d3f:d3fend-id "D3-MBSV" ; + d3f:definition "Ensuring that a pointer accurately references the beginning of a designated memory block." ; + d3f:hardens d3f:MemoryFreeFunction ; + d3f:kb-article """## How it Works +Ensure that a pointer is referencing the beginning of the intended block before using. + +## Considerations +Be careful with pointer arithmetic.""" ; + d3f:kb-reference d3f:Reference-CManualPointerArithmetic_GNU ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:MemoryFreeFunction ], + d3f:PointerValidation . + +d3f:MemoryManagementUnitComponent a owl:Class ; + rdfs:label "Memory Management Unit Component" ; + rdfs:subClassOf d3f:HardwareDevice . + +d3f:Metadata a owl:Class ; + rdfs:label "Metadata" ; + d3f:definition "Metadata is \"data [information] that provides information about other data\". Three distinct types of metadata exist: structural metadata, descriptive metadata, and administrative metadata. Structural metadata is data about the containers of data. For instance a \"book\" contains data, and data about the book is metadata about that container of data. Descriptive metadata uses individual instances of application data or the data content." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformation . + +d3f:Mode a owl:Class, + owl:NamedIndividual ; + rdfs:label "Mode" ; + d3f:d3fend-id "D3A-MOD" ; + d3f:definition "The most frequent value in the data set. This is the only central tendency measure that can be used with nominal data, which have purely qualitative category assignments." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Central tendency. [Link](https://en.wikipedia.org/wiki/Central_tendency)""" ; + rdfs:subClassOf d3f:CentralTendency . + +d3f:Moments a owl:Class, + owl:NamedIndividual ; + rdfs:label "Moments" ; + d3f:d3fend-id "D3A-MOM" ; + d3f:definition "With a probability distribution function, the the first moment is the expected value, the second central moment is the variance, the third standardized moment is the skewness, and the fourth standardized moment is the kurtosis." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Moment (mathematics). [Link](https://en.wikipedia.org/wiki/Moment_(mathematics))""" ; + rdfs:subClassOf d3f:DistributionProperties . + +d3f:MultipleRegression a owl:Class, + owl:NamedIndividual ; + rdfs:label "Multiple Regression" ; + d3f:d3fend-id "D3A-MR" ; + d3f:definition "Multiple (linear) regression attempts to model the relationship between two or more explanatory variables and a response variable by fitting a linear equation to observed data." ; + d3f:kb-article """## References +Yale University Department of Statistics. (1997-98). Linear regression and multivariate analysis. [Link](http://www.stat.yale.edu/Courses/1997-98/101/linmult.htm)""" ; + d3f:synonym "Multiple Linear Regression" ; + rdfs:subClassOf d3f:RegressionAnalysis . + +d3f:NIST_SP_800-53_R5_AC-17_8 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-17(8)" ; + d3f:broader d3f:ExecutableDenylisting ; + d3f:control-name "Remote Access | Disable Nonsecure Network Protocols" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-23 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-23" ; + d3f:control-name "Data Mining Protection" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:JobFunctionAccessPatternAnalysis, + d3f:LocalAccountMonitoring, + d3f:ResourceAccessPatternAnalysis, + d3f:UserDataTransferAnalysis . + +d3f:NIST_SP_800-53_R5_AC-24 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-24" ; + d3f:control-name "Access Control Decisions" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-24_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-24(1)" ; + d3f:control-name "Access Control Decisions | Transmit Access Authorization Information" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:UserAccountPermissions . + +d3f:NIST_SP_800-53_R5_AC-24_2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-24(2)" ; + d3f:control-name "Access Control Decisions | No User or Process Identity" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:UserAccountPermissions . + +d3f:NIST_SP_800-53_R5_AC-2_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-2(1)" ; + d3f:broader d3f:AccountLocking, + d3f:Multi-factorAuthentication ; + d3f:control-name "Account Management | Automated System Account Management" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-2_13 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-2(13)" ; + d3f:control-name "Account Management | Disable Accounts for High-risk Individuals" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:AccountLocking . + +d3f:NIST_SP_800-53_R5_AC-2_2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-2(2)" ; + d3f:broader d3f:AccountLocking ; + d3f:control-name "Account Management | Automated Temporary and Emergency Account Management" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-2_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-2(3)" ; + d3f:broader d3f:AccountLocking ; + d3f:control-name "Account Management | Disable Accounts" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-2_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-2(4)" ; + d3f:control-name "Account Management | Automated Audit Actions" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:DomainAccountMonitoring . + +d3f:NIST_SP_800-53_R5_AC-2_5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-2(5)" ; + d3f:control-name "Account Management | Inactivity Logout" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:AccountLocking . + +d3f:NIST_SP_800-53_R5_AC-2_6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-2(6)" ; + d3f:control-name "Account Management | Dynamic Privilege Management" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-2_7 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-2(7)" ; + d3f:control-name "Account Management | Privileged User Accounts" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:UserAccountPermissions . + +d3f:NIST_SP_800-53_R5_AC-2_9 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-2(9)" ; + d3f:control-name "Account Management | Restrictions on Use of Shared and Group Accounts" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:UserAccountPermissions . + +d3f:NIST_SP_800-53_R5_AC-3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-3" ; + d3f:control-name "Access Enforcement" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting . + +d3f:NIST_SP_800-53_R5_AC-3_11 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-3(11)" ; + d3f:control-name "Access Enforcement | Restrict Access to Specific Information Types" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-3_13 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-3(13)" ; + d3f:control-name "Access Enforcement | Attribute-based Access Control" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-3_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-3(3)" ; + d3f:control-name "Access Enforcement | Mandatory Access Control" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-3_7 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-3(7)" ; + d3f:control-name "Access Enforcement | Role-based Access Control" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-3_8 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-3(8)" ; + d3f:control-name "Access Enforcement | Revocation of Access Authorizations" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:SystemCallFiltering . + +d3f:NIST_SP_800-53_R5_AC-4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4" ; + d3f:control-name "Information Flow Enforcement" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(1)" ; + d3f:control-name "Information Flow Enforcement | Object Security and Privacy Attributes" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_10 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(10)" ; + d3f:broader d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:control-name "Information Flow Enforcement | Enable and Disable Security or Privacy Policy Filters" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-4_11 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(11)" ; + d3f:broader d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:control-name "Information Flow Enforcement | Configuration of Security or Privacy Policy Filters" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-4_12 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(12)" ; + d3f:control-name "Information Flow Enforcement | Data Type Identifiers" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_13 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(13)" ; + d3f:control-name "Information Flow Enforcement | Decomposition into Policy-relevant Subcomponents" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_14 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(14)" ; + d3f:control-name "Information Flow Enforcement | Security or Privacy Policy Filter Constraints" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_15 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(15)" ; + d3f:control-name "Information Flow Enforcement | Detection of Unsanctioned Information" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_17 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(17)" ; + d3f:control-name "Information Flow Enforcement | Domain Authentication" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:DomainTrustPolicy . + +d3f:NIST_SP_800-53_R5_AC-4_19 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(19)" ; + d3f:control-name "Information Flow Enforcement | Validation of Metadata" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_20 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(20)" ; + d3f:control-name "Information Flow Enforcement | Approved Solutions" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_21 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(21)" ; + d3f:control-name "Information Flow Enforcement | Physical or Logical Separation of Information Flows" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_26 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(26)" ; + d3f:control-name "Information Flow Enforcement | Audit Filtering Actions" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:FileContentRules . + +d3f:NIST_SP_800-53_R5_AC-4_27 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(27)" ; + d3f:control-name "Information Flow Enforcement | Redundant/independent Filtering Mechanisms" ; + d3f:exactly d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-4_28 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(28)" ; + d3f:control-name "Information Flow Enforcement | Linear Filter Pipelines" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_29 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(29)" ; + d3f:control-name "Information Flow Enforcement | Filter Orchestration Engines" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(3)" ; + d3f:control-name "Information Flow Enforcement | Dynamic Information Flow Control" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_30 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(30)" ; + d3f:control-name "Information Flow Enforcement | Filter Mechanisms Using Multiple Processes" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_32 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(32)" ; + d3f:control-name "Information Flow Enforcement | Process Requirements for Information Transfer" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(4)" ; + d3f:control-name "Information Flow Enforcement | Flow Control of Encrypted Information" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(5)" ; + d3f:control-name "Information Flow Enforcement | Embedded Data Types" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(6)" ; + d3f:control-name "Information Flow Enforcement | Metadata" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-4_8 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-4(8)" ; + d3f:control-name "Information Flow Enforcement | Security and Privacy Policy Filters" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering . + +d3f:NIST_SP_800-53_R5_AC-5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-5" ; + d3f:broader d3f:LocalFilePermissions, + d3f:UserAccountPermissions ; + d3f:control-name "Separation of Duties" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-6" ; + d3f:broader d3f:LocalFilePermissions, + d3f:UserAccountPermissions ; + d3f:control-name "Least Privilege" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-6_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-6(1)" ; + d3f:control-name "Least Privilege | Authorize Access to Security Functions" ; + d3f:exactly d3f:SystemConfigurationPermissions ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-6_10 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-6(10)" ; + d3f:control-name "Least Privilege | Prohibit Non-privileged Users from Executing Privileged Functions" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalFilePermissions, + d3f:SystemConfigurationPermissions . + +d3f:NIST_SP_800-53_R5_AC-6_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-6(3)" ; + d3f:control-name "Least Privilege | Network Access to Privileged Commands" ; + d3f:exactly d3f:SystemConfigurationPermissions ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-6_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-6(4)" ; + d3f:control-name "Least Privilege | Separate Processing Domains" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:Hardware-basedProcessIsolation . + +d3f:NIST_SP_800-53_R5_AC-6_5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-6(5)" ; + d3f:control-name "Least Privilege | Privileged Accounts" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalFilePermissions, + d3f:SystemConfigurationPermissions . + +d3f:NIST_SP_800-53_R5_AC-6_6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-6(6)" ; + d3f:control-name "Least Privilege | Privileged Access by Non-organizational Users" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalFilePermissions, + d3f:SystemConfigurationPermissions . + +d3f:NIST_SP_800-53_R5_AC-6_9 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-6(9)" ; + d3f:broader d3f:LocalAccountMonitoring, + d3f:UserBehaviorAnalysis ; + d3f:control-name "Least Privilege | Log Use of Privileged Functions" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-7 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-7" ; + d3f:control-name "Unsuccessful Logon Attempts" ; + d3f:exactly d3f:AccountLocking ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AC-7_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-7(3)" ; + d3f:control-name "Unsuccessful Logon Attempts | Biometric Attempt Limiting" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:AccountLocking . + +d3f:NIST_SP_800-53_R5_AC-7_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AC-7(4)" ; + d3f:broader d3f:AccountLocking ; + d3f:control-name "Unsuccessful Logon Attempts | Use of Alternate Authentication Factor" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AU-10_5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AU-10(5)" ; + d3f:broader d3f:DriverLoadIntegrityChecking ; + d3f:control-name "Non-repudiation | Digital Signatures" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AU-14_2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AU-14(2)" ; + d3f:control-name "Session Audit | Capture and Record Content" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalAccountMonitoring . + +d3f:NIST_SP_800-53_R5_AU-15 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AU-15" ; + d3f:control-name "Alternate Audit Logging Capability" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalAccountMonitoring . + +d3f:NIST_SP_800-53_R5_AU-2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AU-2" ; + d3f:control-name "Event Logging" ; + d3f:exactly d3f:LocalAccountMonitoring ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AU-2_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AU-2(1)" ; + d3f:control-name "Event Logging | Compilation of Audit Records from Multiple Sources" ; + d3f:exactly d3f:LocalAccountMonitoring ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AU-2_2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AU-2(2)" ; + d3f:control-name "Event Logging | Selection of Audit Events by Component" ; + d3f:exactly d3f:LocalAccountMonitoring ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AU-3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AU-3" ; + d3f:control-name "Content of Audit Records" ; + d3f:exactly d3f:LocalAccountMonitoring ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_AU-4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "AU-4" ; + d3f:control-name "Audit Log Storage Capacity" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalAccountMonitoring . + +d3f:NIST_SP_800-53_R5_CM-14 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "CM-14" ; + d3f:control-name "Signed Components" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:DriverLoadIntegrityChecking, + d3f:MessageAuthentication . + +d3f:NIST_SP_800-53_R5_CM-5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "CM-5" ; + d3f:control-name "Access Restrictions for Change" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting, + d3f:LocalAccountMonitoring . + +d3f:NIST_SP_800-53_R5_CM-5_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "CM-5(1)" ; + d3f:control-name "Access Restrictions for Change | Automated Access Enforcement and Audit Records" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalAccountMonitoring . + +d3f:NIST_SP_800-53_R5_CM-5_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "CM-5(3)" ; + d3f:control-name "Access Restrictions for Change | Signed Components" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalAccountMonitoring, + d3f:SystemConfigurationPermissions . + +d3f:NIST_SP_800-53_R5_CM-5_5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "CM-5(5)" ; + d3f:control-name "Access Restrictions for Change | Privilege Limitation for Production and Operation" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalAccountMonitoring, + d3f:SystemConfigurationPermissions . + +d3f:NIST_SP_800-53_R5_CM-5_6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "CM-5(6)" ; + d3f:control-name "Access Restrictions for Change | Limit Library Privileges" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalAccountMonitoring, + d3f:SystemConfigurationPermissions . + +d3f:NIST_SP_800-53_R5_CM-6_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "CM-6(3)" ; + d3f:broader d3f:ApplicationConfigurationHardening ; + d3f:control-name "Configuration Settings | Unauthorized Change Detection" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_IA-2_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "IA-2(1)" ; + d3f:control-name "Identification and Authentication (organizational Users) | Multi-factor Authentication to Privileged Accounts" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:Multi-factorAuthentication . + +d3f:NIST_SP_800-53_R5_IA-2_2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "IA-2(2)" ; + d3f:control-name "Identification and Authentication (organizational Users) | Multi-factor Authentication to Non-privileged Accounts" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:Multi-factorAuthentication . + +d3f:NIST_SP_800-53_R5_IA-2_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "IA-2(4)" ; + d3f:control-name "Identification and Authentication (organizational Users) | Local Access to Non-privileged Accounts" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalAccountMonitoring . + +d3f:NIST_SP_800-53_R5_IA-2_6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "IA-2(6)" ; + d3f:control-name "Identification and Authentication (organizational Users) | Access to Accounts —separate Device" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:Multi-factorAuthentication . + +d3f:NIST_SP_800-53_R5_IR-4_12 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "IR-4(12)" ; + d3f:control-name "Incident Handling | Malicious Code and Forensic Analysis" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:DynamicAnalysis . + +d3f:NIST_SP_800-53_R5_IR-4_13 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "IR-4(13)" ; + d3f:control-name "Incident Handling | Behavior Analysis" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:DecoyEnvironment, + d3f:DecoyObject . + +d3f:NIST_SP_800-53_R5_MA-3_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "MA-3(3)" ; + d3f:control-name "Maintenance Tools | Prevent Unauthorized Removal" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:UserAccountPermissions . + +d3f:NIST_SP_800-53_R5_MA-3_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "MA-3(4)" ; + d3f:control-name "Maintenance Tools | Restricted Tool Use" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:UserAccountPermissions . + +d3f:NIST_SP_800-53_R5_MA-3_5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "MA-3(5)" ; + d3f:control-name "Maintenance Tools | Execution with Privilege" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:UserAccountPermissions . + +d3f:NIST_SP_800-53_R5_MA-3_6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "MA-3(6)" ; + d3f:control-name "Maintenance Tools | Software Updates and Patches" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:SoftwareUpdate . + +d3f:NIST_SP_800-53_R5_MA-4_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "MA-4(1)" ; + d3f:control-name "Nonlocal Maintenance | Logging and Review" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalAccountMonitoring . + +d3f:NIST_SP_800-53_R5_MA-6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "MA-6" ; + d3f:control-name "Timely Maintenance" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:SoftwareUpdate . + +d3f:NIST_SP_800-53_R5_MA-6_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "MA-6(1)" ; + d3f:control-name "Timely Maintenance | Preventive Maintenance" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:SoftwareUpdate . + +d3f:NIST_SP_800-53_R5_MA-6_2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "MA-6(2)" ; + d3f:control-name "Timely Maintenance | Predictive Maintenance" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:SoftwareUpdate . + +d3f:NIST_SP_800-53_R5_MA-6_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "MA-6(3)" ; + d3f:control-name "Timely Maintenance | Automated Support for Predictive Maintenance" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:SoftwareUpdate . + +d3f:NIST_SP_800-53_R5_RA-3_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "RA-3(3)" ; + d3f:broader d3f:FileAnalysis, + d3f:IdentifierAnalysis, + d3f:MessageAnalysis, + d3f:NetworkTrafficAnalysis, + d3f:PlatformMonitoring, + d3f:ProcessAnalysis, + d3f:UserBehaviorAnalysis ; + d3f:control-name "Risk Assessment | Dynamic Threat Awareness" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_RA-3_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "RA-3(4)" ; + d3f:control-name "Risk Assessment | Predictive Cyber Analytics" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:FileAnalysis, + d3f:IdentifierAnalysis, + d3f:MessageAnalysis, + d3f:NetworkTrafficAnalysis, + d3f:PlatformMonitoring, + d3f:ProcessAnalysis, + d3f:UserBehaviorAnalysis . + +d3f:NIST_SP_800-53_R5_RA-5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "RA-5" ; + d3f:broader d3f:NetworkTrafficAnalysis ; + d3f:control-name "Vulnerability Monitoring and Scanning" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_RA-5_2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "RA-5(2)" ; + d3f:control-name "Vulnerability Monitoring and Scanning | Update Vulnerabilities to Be Scanned" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:NetworkTrafficAnalysis . + +d3f:NIST_SP_800-53_R5_RA-5_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "RA-5(3)" ; + d3f:control-name "Vulnerability Monitoring and Scanning | Breadth and Depth of Coverage" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:NetworkTrafficAnalysis . + +d3f:NIST_SP_800-53_R5_RA-5_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "RA-5(4)" ; + d3f:control-name "Vulnerability Monitoring and Scanning | Discoverable Information" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:DecoyEnvironment, + d3f:DecoyObject . + +d3f:NIST_SP_800-53_R5_RA-5_5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "RA-5(5)" ; + d3f:control-name "Vulnerability Monitoring and Scanning | Privileged Access" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:PlatformHardening . + +d3f:NIST_SP_800-53_R5_RA-5_6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "RA-5(6)" ; + d3f:control-name "Vulnerability Monitoring and Scanning | Automated Trend Analyses" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:PlatformHardening . + +d3f:NIST_SP_800-53_R5_RA-5_7 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "RA-5(7)" ; + d3f:control-name "Vulnerability Monitoring and Scanning | Automated Detection and Notification of Unauthorized Components" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:ExecutableAllowlisting, + d3f:ExecutableDenylisting . + +d3f:NIST_SP_800-53_R5_SA-10_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SA-10(1)" ; + d3f:control-name "Developer Configuration Management | Software and Firmware Integrity Verification" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:FirmwareVerification, + d3f:PlatformHardening . + +d3f:NIST_SP_800-53_R5_SA-10_3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SA-10(3)" ; + d3f:control-name "Developer Configuration Management | Hardware Integrity Verification" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:FirmwareVerification . + +d3f:NIST_SP_800-53_R5_SA-10_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SA-10(4)" ; + d3f:control-name "Developer Configuration Management | Trusted Generation" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:FirmwareVerification . + +d3f:NIST_SP_800-53_R5_SA-10_5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SA-10(5)" ; + d3f:control-name "Developer Configuration Management | Mapping Integrity for Version Control" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:FirmwareVerification, + d3f:PlatformHardening . + +d3f:NIST_SP_800-53_R5_SA-10_6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SA-10(6)" ; + d3f:control-name "Developer Configuration Management | Trusted Distribution" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:FirmwareVerification, + d3f:PlatformHardening . + +d3f:NIST_SP_800-53_R5_SA-11_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SA-11(1)" ; + d3f:control-name "Developer Testing and Evaluation | Static Code Analysis" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:ApplicationHardening . + +d3f:NIST_SP_800-53_R5_SA-11_8 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SA-11(8)" ; + d3f:control-name "Developer Testing and Evaluation | Dynamic Code Analysis" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:ApplicationHardening . + +d3f:NIST_SP_800-53_R5_SA-8_18 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SA-8(18)" ; + d3f:control-name "Security and Privacy Engineering Principles | Trusted Communications Channels" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:EncryptedTunnels . + +d3f:NIST_SP_800-53_R5_SA-8_22 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SA-8(22)" ; + d3f:control-name "Security and Privacy Engineering Principles | Accountability and Traceability" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:related d3f:DomainAccountMonitoring . + +d3f:NIST_SP_800-53_R5_SC-2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SC-2" ; + d3f:broader d3f:LocalFilePermissions, + d3f:SystemConfigurationPermissions ; + d3f:control-name "Separation of System and User Functionality" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_SC-2_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SC-2(1)" ; + d3f:control-name "Separation of System and User Functionality | Interfaces for Non-privileged Users" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalFilePermissions, + d3f:SystemConfigurationPermissions . + +d3f:NIST_SP_800-53_R5_SC-3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SC-3" ; + d3f:broader d3f:ExecutionIsolation, + d3f:NetworkIsolation ; + d3f:control-name "Security Function Isolation" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_SC-3_1 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SC-3(1)" ; + d3f:control-name "Security Function Isolation | Hardware Separation" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:ExecutionIsolation . + +d3f:NIST_SP_800-53_R5_SI-2_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-2(4)" ; + d3f:control-name "Flaw Remediation | Automated Patch Management Tools" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:SoftwareUpdate . + +d3f:NIST_SP_800-53_R5_SI-2_5 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-2(5)" ; + d3f:control-name "Flaw Remediation | Automatic Software and Firmware Updates" ; + d3f:exactly d3f:FirmwareVerification, + d3f:PeripheralFirmwareVerification, + d3f:SoftwareUpdate, + d3f:SystemFirmwareVerification ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_SI-2_6 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-2(6)" ; + d3f:control-name "Flaw Remediation | Removal of Previous Versions of Software and Firmware" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:FirmwareVerification, + d3f:PeripheralFirmwareVerification, + d3f:SoftwareUpdate, + d3f:SystemFirmwareVerification . + +d3f:NIST_SP_800-53_R5_SI-3 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-3" ; + d3f:broader d3f:FileAnalysis, + d3f:NetworkTrafficAnalysis, + d3f:PlatformMonitoring, + d3f:ProcessAnalysis ; + d3f:control-name "Malicious Code Protection" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_SI-3_10 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-3(10)" ; + d3f:control-name "Malicious Code Protection | Malicious Code Analysis" ; + d3f:exactly d3f:DynamicAnalysis ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_SI-3_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-3(4)" ; + d3f:control-name "Malicious Code Protection | Updates Only by Privileged Users" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:LocalFilePermissions, + d3f:SystemConfigurationPermissions . + +d3f:NIST_SP_800-53_R5_SI-3_8 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-3(8)" ; + d3f:control-name "Malicious Code Protection | Detect Unauthorized Commands" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:UserBehaviorAnalysis . + +d3f:NIST_SP_800-53_R5_SI-4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-4" ; + d3f:broader d3f:OperatingSystemMonitoring ; + d3f:control-name "System Monitoring" ; + d3f:member-of d3f:NIST_SP_800-53_R5 . + +d3f:NIST_SP_800-53_R5_SI-4_2 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-4(2)" ; + d3f:control-name "System Monitoring | Automated Tools and Mechanisms for Real-time Analysis" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:NetworkTrafficAnalysis . + +d3f:NIST_SP_800-53_R5_SI-4_4 a d3f:NISTControl, + owl:NamedIndividual ; + rdfs:label "SI-4(4)" ; + d3f:control-name "System Monitoring | Inbound and Outbound Communications Traffic" ; + d3f:member-of d3f:NIST_SP_800-53_R5 ; + d3f:narrower d3f:NetworkTrafficAnalysis . + +d3f:NamedPipe a owl:Class, + owl:NamedIndividual ; + rdfs:label "Named Pipe" ; + d3f:definition "In computing, a named pipe (also known as a FIFO for its behavior) is an extension to the traditional pipe concept on Unix and Unix-like systems, and is one of the methods of inter-process communication (IPC). The concept is also found in OS/2 and Microsoft Windows, although the semantics differ substantially. A traditional pipe is 'unnamed' and lasts only as long as the process. A named pipe, however, can last as long as the system is up, beyond the life of the process. It can be deleted if no longer used. Usually a named pipe appears as a file, and generally processes attach to it for IPC." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Pipe . + +d3f:NetworkConnectionCloseEvent a owl:Class ; + rdfs:label "Network Connection Close Event" ; + d3f:definition "An event where a network connection is closed." ; + rdfs:subClassOf d3f:NetworkConnectionEvent . + +d3f:NetworkConnectionFailEvent a owl:Class ; + rdfs:label "Network Connection Fail Event" ; + d3f:definition "An event where a network connection attempt fails." ; + rdfs:subClassOf d3f:NetworkConnectionEvent . + +d3f:NetworkConnectionListenEvent a owl:Class ; + rdfs:label "Network Connection Listen Event" ; + d3f:definition "An event where a network endpoint begins listening for new network connections." ; + rdfs:subClassOf d3f:NetworkConnectionEvent . + +d3f:NetworkConnectionOpenEvent a owl:Class ; + rdfs:label "Network Connection Open Event" ; + d3f:definition "An event where a network connection is successfully opened." ; + rdfs:subClassOf d3f:NetworkConnectionEvent . + +d3f:NetworkConnectionRefuseEvent a owl:Class ; + rdfs:label "Network Connection Refuse Event" ; + d3f:definition "An event where a network connection is refused." ; + rdfs:subClassOf d3f:NetworkConnectionEvent . + +d3f:NetworkConnectionResetEvent a owl:Class ; + rdfs:label "Network Connection Reset Event" ; + d3f:definition "An event where an attempt is made to establish a network connection." ; + rdfs:subClassOf d3f:NetworkConnectionEvent . + +d3f:NetworkTimeServer a owl:Class ; + rdfs:label "Network Time Server" ; + d3f:definition "A network time server is a server computer that reads the actual time from a reference clock and distributes this information to its clients using a computer network. The time server may be a local network time server or an internet time server. The time server may also be a stand-alone hardware device. It can use NTP (RFC5905) or other protocols." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Server . + +d3f:Non-PersonEntity a owl:Class ; + rdfs:label "Non-Person Entity" ; + d3f:definition "An entity related to information technology with a digital identity that acts in cyberspace, but is not a human actor. This can include organizations, hardware objects (physical entities/devices), software objects (virtual/logical entities), and information artifacts." ; + d3f:synonym "NPE" ; + rdfs:seeAlso d3f:NIST_SP_800-53_R5, + d3f:Reference-CNNSI-4009, + ; + rdfs:subClassOf d3f:Agent . + +d3f:NonlinearRegression a owl:Class, + owl:NamedIndividual ; + rdfs:label "Nonlinear Regression" ; + d3f:d3fend-id "D3A-NR" ; + d3f:definition "Nonlinear regression is a form of regression analysis in which observational data are modeled by a function which is a nonlinear combination of the model parameters and depends on one or more independent variables." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Nonlinear regression. [Link](https://en.wikipedia.org/wiki/Nonlinear_regression)""" ; + rdfs:subClassOf d3f:RegressionAnalysis . + +d3f:OSAPIAccessProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Access Process" ; + d3f:invokes d3f:AccessProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:AccessProcess ], + d3f:OSAPISystemFunction . + +d3f:OSAPIFunction a owl:Class ; + rdfs:label "OS API Function" ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:Software . + +d3f:OSAPILoadModule a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Load Module" ; + d3f:invokes d3f:LoadModule ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:LoadModule ], + d3f:OSAPISystemFunction . + +d3f:OSAPIReadMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Read Memory" ; + d3f:invokes d3f:ReadMemory ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:ReadMemory ], + d3f:OSAPISystemFunction . + +d3f:OSAPISaveRegisters a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Save Registers" ; + d3f:invokes d3f:SaveRegister ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SaveRegister ], + d3f:OSAPISystemFunction . + +d3f:OSAPISetRegisters a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Set Registers" ; + d3f:invokes d3f:SetRegisters ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SetRegisters ], + d3f:OSAPISystemFunction . + +d3f:OSAPIUnloadModule a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Unload Module" ; + d3f:invokes d3f:UnloadModule ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:UnloadModule ], + d3f:OSAPISystemFunction . + +d3f:OTEmbeddedComputer a owl:Class ; + rdfs:label "OT Embedded Computer" ; + d3f:definition "A ruggedized computational device, embedded in industrial control systems, designed to handle real-time tasks and environmental stressors common in OT." ; + rdfs:subClassOf d3f:EmbeddedComputer . + +d3f:Planning a owl:Class ; + rdfs:label "Planning" ; + rdfs:subClassOf d3f:AnalyticalPurpose . + +d3f:PolicyGradient a owl:Class, + owl:NamedIndividual ; + rdfs:label "Policy Gradient" ; + d3f:d3fend-id "D3A-PG" ; + d3f:definition "The objective of a Reinforcement Learning Policy Gradient agent is to maximize the “expected” reward when following a policy" ; + d3f:kb-article """## References +Policy Gradients in a Nutshell. Towards Data Science. [Link](https://towardsdatascience.com/policy-gradients-in-a-nutshell-8b72f9743c5d).""" ; + rdfs:subClassOf d3f:Model-freeReinforcementLearning . + +d3f:PolicyReference a owl:Class ; + rdfs:label "Policy Reference" ; + d3f:pref-label "Policy" ; + rdfs:subClassOf d3f:TechniqueReference . + +d3f:PowerSupply a owl:Class ; + rdfs:label "Power Supply" ; + d3f:definition "A power supply is an electrical device or module that converts and regulates energy from a source (e.g., the power grid or batteries) to an appropriate voltage, current, and frequency for one or more loads. It may stand alone or be integrated into its host appliance, often providing overcurrent protection, voltage regulation, or power conditioning for safe, stable operation." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:HardwareDevice . + +d3f:ProcessDataSegment a owl:Class ; + rdfs:label "Process Data Segment" ; + d3f:definition "A process data segment, is a portion of the program's virtual address space that contains executable instructions and corresponds to the loaded image data segment." ; + rdfs:seeAlso d3f:ImageDataSegment, + ; + rdfs:subClassOf d3f:ProcessSegment . + +d3f:ProductDeveloper a owl:Class ; + rdfs:label "Product Developer" ; + rdfs:subClassOf d3f:Provider . + +d3f:Projection-basedClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Projection-based Clustering" ; + d3f:d3fend-id "D3A-PBC" ; + d3f:definition "Projection Based Clustering is a clustering framework based on a chosen projection method and projection method a parameter-free high-dimensional data visualization technique." ; + d3f:kb-article """## References +R Core Team. (2021). ProjectionBasedClustering: Projection Based Clustering. [Link](https://cran.r-project.org/web/packages/ProjectionBasedClustering/ProjectionBasedClustering.pdf) + +Lai, J. H., Liu, Y., & Wu, W. (2017). Projection Based Clustering. [Link](https://www.researchgate.net/publication/319006501_Projection_Based_Clustering)""" ; + rdfs:subClassOf d3f:High-dimensionClustering . + +d3f:Q-Learning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Q-Learning" ; + d3f:d3fend-id "D3A-QL" ; + d3f:definition "Q-learning is a model-free reinforcement learning algorithm to learn the value of an action in a particular state. It does not require a model of the environment (hence \"model-free\"), and it can handle problems with stochastic transitions and rewards without requiring adaptations." ; + d3f:kb-article """## References +Q-learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Q-learning).""" ; + rdfs:subClassOf d3f:Model-freeReinforcementLearning . + +d3f:Range a owl:Class, + owl:NamedIndividual ; + rdfs:label "Range" ; + d3f:d3fend-id "D3A-RAN" ; + d3f:definition "The range of a set of data is the difference between the largest and smallest value." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Range (statistics). [Link](https://en.wikipedia.org/wiki/Range_(statistics))""" ; + rdfs:subClassOf d3f:Variability . + +d3f:Reference-AccessPermissionModification_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2019-07-001: Access Permission Modification - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2019-07-001/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries sometimes modify object access rights at the operating system level. There are varying motivations behind this action - they may not want some files/objects to be changed on systems for persistence reasons and therefore provide admin only rights; also, they may want files to be accessible with lower levels of permissions." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemFileAnalysis ; + d3f:kb-reference-title "CAR-2019-07-001: Access Permission Modification" . + +d3f:Reference-ActiveDirectoryDumpingViaNTDSUtil_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2019-08-002: Active Directory Dumping via NTDSUtil - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2019-08-002/"^^xsd:anyURI ; + d3f:kb-abstract "The NTDSUtil tool may be used to dump a Microsoft Active Directory database to disk for processing with a credential access tool such as Mimikatz. This is performed by launching ntdsutil.exe as a privileged user with command line arguments indicating that media should be created for offline Active Directory installation and specifying a folder path. This process will create a copy of the Active Directory database, ntds.dit, to the specified folder path." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2019-08-002: Active Directory Dumping via NTDSUtil" . + +d3f:Reference-AdvancedDeviceMatchingSystem a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Advanced device matching system" ; + d3f:has-link "https://patents.google.com/patent/US10892951B2/"^^xsd:anyURI ; + d3f:kb-abstract "Disclosed is a device management system for discovery and management of components added to computer systems and sub-systems. The device management system provides for recognizing a newly added component, and determining if the newly added component is already a part of the system inventory. The newly added component is matched with a component currently on the system, based on at least one matching attribute. A point total is calculated for each match level and a final match score is provided. The match score is compared with an aggressiveness level to determine if a match does indeed exist." ; + d3f:kb-author "Rajneesh Jalan, Joseph M. Schmitt, and Marco Simoes" ; + d3f:kb-organization "Device42 Inc" ; + d3f:kb-reference-of d3f:HardwareComponentInventory ; + d3f:kb-reference-title "Advanced device matching system" . + +d3f:Reference-AllLoginsSinceLastBoot_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2015-07-001: All Logins Since Last Boot - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2015-07-001/"^^xsd:anyURI ; + d3f:kb-abstract """Once a credential dumper like mimikatz runs, every user logged on since boot is potentially compromised, because the credentials were accessed via the memory of lsass.exe. When such an event occurs, this analytic will give the forensic context to identify compromised users. Those users could potentially be used in later events for additional logons. + +The time field indicates the first and last time a system reported a user logged into a given system. This means that activity could be intermittent between the times given and should not be considered a duration.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:CredentialCompromiseScopeAnalysis ; + d3f:kb-reference-title "CAR-2015-07-001: All Logins Since Last Boot" . + +d3f:Reference-AnalysisOfTheWindowsVistaSecurityModel_SymantecCorporation a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Analysis of the Windows Vista Security Model - Symantec Corporation" ; + d3f:has-link "https://web.archive.org/web/20140407025337/http://www.symantec.com/avcenter/reference/Windows_Vista_Security_Model_Analysis.pdf"^^xsd:anyURI ; + d3f:kb-abstract "This paper provides an in-depth technical assessment of the security improvements implemented in Windows Vista, focusing primarily on the areas of User Account Protection and User Interface Privilege Isolation. This paper discusses these features and touches on several of their shortcomings. It then demonstrates how it is possible to combine these attacks to gain full control over the machine from low integrity, low privilege process." ; + d3f:kb-author "Matthew Conover" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Symantec Corporation" ; + d3f:kb-reference-of d3f:SystemCallFiltering ; + d3f:kb-reference-title "Analysis of the Windows Vista Security Model" . + +d3f:Reference-AnomalyDetectionUsingAdaptiveBehavioralProfiles_SecuronixInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Anomaly Detection Using Adaptive Behavioral Profiles - Securonix Inc" ; + d3f:has-link "https://patents.google.com/patent/US20160226901A1"^^xsd:anyURI ; + d3f:kb-abstract "The invention provides a system and method for automatic creation of adaptive behavioral profiles for observables associated with resource states and events in a computer network (IT) infrastructure of an enterprise and for detecting anomalies that represent potential malicious activity and threats as deviations from normal behavior. Separate profiles may be created for each behavioral indicator, as well as for each time series of measurements, and aggregated to create an overall behavioral profile. An anomaly probability is determined from the behavioral profile and used to evaluate the data values of observables. Outlier data values which deviate from normal behavior by more than a predetermined probability threshold are identified for risk analysis as possible threats while inliers within the range of normal behavior are used to update the behavioral profile. Behavioral profiles are created for behavioral indicators based upon observables measured over predetermined time periods using algorithms employing statistical analysis approaches that work for any type of data distribution, and profiles are adapted over time using data aging to more closely represent current behavior. Algorithm parameters for creating profiles are based on the type of data, i.e., its metadata." ; + d3f:kb-author "Igor A. Baikalov; Tanuj Gulati; Sachin Nayyar; Anjaneya Shenoy; Ganpatrao H. Patwardhan" ; + d3f:kb-mitre-analysis """The patent describes a technique for detecting anomalous activity within an organization's IT infrastructure to identify threats. Behavioral profiles can be grouped by peer groups that identify functionally similar groups of actors (users or resources) based on their attributes and pre-defined grouping rules. For example, users can be grouped by their job title, organizational hierarchy, or location and can be observed for similarities in access patterns, based on granted access entitlements or actual logged resource access. + +Behavioral profiles are created from measurements of events over a time period for example: + +* Transaction counts +* Concurrent users per hour +* Daily volume of data + +Outlier data values which deviate from behavioral profile by more than a predetermined probability threshold are identified for risk analysis as possible threats.""" ; + d3f:kb-organization "Securonix Inc" ; + d3f:kb-reference-of d3f:JobFunctionAccessPatternAnalysis ; + d3f:kb-reference-title "Anomaly Detection Using Adaptive Behavioral Profiles" . + +d3f:Reference-Anti-tamperSystemWithSelf-adjustingGuards_ARXANTECHNOLOGIESInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Anti-tamper system with self-adjusting guards - ARXAN TECHNOLOGIES Inc" ; + d3f:has-link "https://patents.google.com/patent/US20150052603A1"^^xsd:anyURI ; + d3f:kb-abstract "An anti-tamper system is disclosed that includes self-adjusting guards inserted in software. Self-adjusting guards include invocation criteria and guard function. During run-time, each time the self-adjusting guard is invoked, the invocation criteria is evaluated and the guard function is only executed if the invocation criteria is satisfied. The invocation criteria can be static or dynamic, satisfied randomly with fixed or varying probability, a monotonically or exponentially decreasing function or most any other type of function. The invocation criteria can be satisfied based on elapsed inter-guard invocation time (time since last guard function execution), target inter-guard invocation time, and/or guard execution time. A method is disclosed of inserting self-adjusting guards into software, and executing the software. Evaluating the invocation criteria can include adjusting the invocation criteria when satisfied. The self-adjusting guards can be inserted into the software at a source or object code level." ; + d3f:kb-author "Kevin Dale Morgan" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "ARXAN TECHNOLOGIES Inc" ; + d3f:kb-reference-of d3f:ProcessCodeSegmentVerification ; + d3f:kb-reference-title "Anti-tamper system with self-adjusting guards" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Approaches for securing an internet endpoint using fine-grained operating system virtualization - Bromium, Inc." ; + d3f:has-link "https://patents.google.com/patent/US20110296412A1"^^xsd:anyURI ; + d3f:kb-abstract "Approaches for executing untrusted software on a client without compromising the client using micro-virtualization to execute untrusted software in isolated contexts. A template for instantiating a virtual machine on a client is identified in response to receiving a request to execute an application. After the template is identified, without human intervention, a virtual machine is instantiated, using the template, in which the application is to be executed. The template may be selected from a plurality of templates based on the nature of the request, as each template describe characteristics of a virtual machine suitable for a different type of activity. Selected resources such as files are displayed to the virtual machines according to user and organization policies and controls. When the client determines that the application has ceased to execute, the client ceases execution of the virtual machine without human intervention." ; + d3f:kb-author "Gaurav Banga, Ian Pratt, Kiran Bondalapati, Vikram Kapoor" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Bromium, Inc." ; + d3f:kb-reference-of d3f:Hardware-basedProcessIsolation ; + d3f:kb-reference-title "Approaches for securing an internet endpoint using fine-grained operating system virtualization" . + +d3f:Reference-ArchitectureOfTransparentNetworkSecurityForApplicationContainers_NeuvectorInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Architecture of transparent network security for application containers - Neuvector Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170093922A1"^^xsd:anyURI ; + d3f:kb-abstract "A system comprises one or more application containers, each application container including computer-readable instructions and initiated via a container service and isolated using operating system-level virtualization. The system also comprises one or more virtual switches configured to route traffic from the application containers. The system further comprises one or more security containers, each security container configured to transparently intercept traffic from the one or more application containers for analysis of network security. The system further comprises a user interface (UI) container configured to receive configuration settings from a user. The system also comprises an analytics container configured to perform analysis on data received from the one or more security containers. The system also comprises a management container configured to configure settings for the one or more security containers and the analytics container." ; + d3f:kb-author "Gang Duan" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Neuvector Inc" ; + d3f:kb-reference-of d3f:SystemCallFiltering ; + d3f:kb-reference-title "Architecture of transparent network security for application containers" . + +d3f:Reference-AutomatedComputerVulnerabilityResolutionSystem a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Automated computer vulnerability resolution system" ; + d3f:has-link "https://patents.google.com/patent/US7308712B2"^^xsd:anyURI ; + d3f:kb-abstract "A system and process for addressing computer security vulnerabilities. The system and process generally comprise aggregating vulnerability information on a plurality of computer vulnerabilities; constructing a remediation database of said plurality of computer vulnerabilities; constructing a remediation signature to address the computer vulnerabilities; and deploying said remediation signature to a client computer. The remediation signature essentially comprises a sequence of actions to address a corresponding vulnerability. A managed automated approach to the process is contemplated in which the system is capable of selective deployment of remediation signatures; selective resolution of vulnerabilities; scheduled deployment of remediation signatures; and scheduled scanning of client computers for vulnerabilities." ; + d3f:kb-author "Carl E. Banzhof" ; + d3f:kb-organization "McAfee LLC" ; + d3f:kb-reference-of d3f:AssetVulnerabilityEnumeration ; + d3f:kb-reference-title "Automated computer vulnerability resolution system" . + +d3f:Reference-AutomaticallyGeneratingNetworkResourceGroupsAndAssigningCustomizedDecoyPoliciesThereto_IllusiveNetworksLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Automatically generating network resource groups and assigning customized decoy policies thereto - Illusive Networks Ltd" ; + d3f:has-link "https://patents.google.com/patent/US20170310689A1"^^xsd:anyURI ; + d3f:kb-abstract "A cyber security system comprising circuitry of a decoy deployer planting one or more decoy lateral attack vectors in each of a first and a second group of resources within a common enterprise network of resources, the first and second groups of resources having different characteristics in terms of subnets, naming conventions, DNS aliases, listening ports, users and their privileges, and installed applications, wherein a lateral attack vector is an object of a first resource within the network that has a potential to be used by an attacker who discovered the first resource to further discover information regarding a second resource within the network, the second resource being previously undiscovered by the attacker, and wherein the decoy lateral attack vectors in the first group conform to the characteristics of the first group, and the decoy lateral attack vectors in the second group conform to the characteristics of the second group." ; + d3f:kb-author "Shlomo Touboul; Hanan Levin; Stephane Roubach; Assaf Mischari; Itai Ben David; Itay Avraham; Adi Ozer; Chen Kazaz; Ofer Israeli; Olga Vingurt; Liad Gareh; Israel Grimberg; Cobby Cohen; Sharon Sultan; Matan Kubovsky" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Illusive Networks Ltd" ; + d3f:kb-reference-of d3f:DecoyNetworkResource ; + d3f:kb-reference-title "Automatically generating network resource groups and assigning customized decoy policies thereto" . + +d3f:Reference-BroadcastIsolationAndLevel3NetworkSwitch_HewlettPackardEnterpriseDevelopmentLP a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Broadcast isolation and level 3 network switch - Hewlett Packard Enterprise Development LP" ; + d3f:has-link "https://patents.google.com/patent/US5920699A"^^xsd:anyURI ; + d3f:kb-abstract "A network switch comprising a switching Application Specific Integrated Circuit (ASIC) and a Virtual Switching Engine (VSE) connected to a plurality of ports. The switching ASIC has a high-speed memory table which enables it to look up addresses that it has previously obtained and to forward unicast packets to said addresses. The VSE is a CPU that makes switching decisions outside of the ASIC and keeps track of any unknown addresses, forwarding the packets out the appropriate ports and answers broadcast packets by proxy for all known addresses without forwarding any of the packets down the VLANs, thereby freeing the VLAN bandwidth from excessive traffic. The system requires no user configuration because the switching methodology is self-adaptive to the network in which it is inserted and has the ability to perform router functions such as level 2 and 3 switching, spanning tree protocols and compatibility with Internetwork Packet and Internetwork Packet Exchange networks." ; + d3f:kb-author "Ballard C. Bare" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Hewlett Packard Enterprise Development LP" ; + d3f:kb-reference-of d3f:BroadcastDomainIsolation ; + d3f:kb-reference-title "Broadcast isolation and level 3 network switch" . + +d3f:Reference-CAR-2014-05-001%3ARPCActivity_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-05-001: RPC Activity - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-05-001/"^^xsd:anyURI ; + d3f:kb-abstract """Microsoft Windows uses its implementation of Distributed Computing Environment/Remote Procedure Call (DCE/RPC), which it calls Microsoft RPC, to call certain APIs remotely. + +A Remote Procedure Call is initiated by communicating to the RPC Endpoint Mapper, which exists as the Windows service RpcEptMapper and listens on the port 135/tcp. The endpoint mapper resolves a requested endpoint/interface and responds to the client with the port that the service is listening on. Since the RPC endpoints are assigned ports when the services start, these ports are dynamically assigned from 49152 to 65535. The connection to the endpoint mapper then terminates and the client program can communicate directly with the requested service. + +RPC is a legitimate functionality of Windows that allows remote interaction with a variety of services. For a Windows environment to be properly configured, several programs use RPC to communicate legitimately with servers. The background and benign RPC activity may be enormous, but must be learned, especially peer-to-peer RPC between workstations, which is often indicative of Lateral Movement.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:RPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2014-05-001: RPC Activity" . + +d3f:Reference-CAR-2014-11-007-RemoteWindowsManagementInstrumentation_WMI_OverRPC_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-11-007: Remote Windows Management Instrumentation (WMI) over RPC - MITRE" ; + d3f:has-link ""^^xsd:anyURI ; + d3f:kb-abstract """As described in ATT&CK, an adversary can use Windows Management Instrumentation (WMI) to view or manipulate objects on a remote host. It can be used to remotely edit configuration, start services, query files, and anything that can be done with a WMI class. When remote WMI requests are over RPC (CAR-2014-05-001), it connects to a DCOM interface within the RPC group netsvcs. To detect this activity, a sensor is needed at the network level that can decode RPC traffic or on the host where the communication can be detected more natively, such as Event Tracing for Windows. Using wireshark/tshark decoders, the WMI interfaces can be extracted so that WMI activity over RPC can be detected. + +Although the description details how to detect remote WMI precisely, a decent estimate has been to look for the string RPCSS within the initial RPC connection on 135/tcp. It returns a superset of this activity, and will trigger on all DCOM-related services running within RPC, which is likely to also be activity that should be detected between hosts. More about RPCSS at : rpcss_dcom_interfaces.html""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:RPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2014-11-007: Remote Windows Management Instrumentation (WMI) over RPC" . + +d3f:Reference-CAR-2015-04-001%3ARemotelyScheduledTasksViaAT_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2015-04-001: Remotely Scheduled Tasks via AT - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2015-04-001/"^^xsd:anyURI ; + d3f:kb-abstract """When AT.exe is used to remotely schedule tasks, Windows uses named pipes over SMB to communicate with the API on the remote machine. After authentication over SMB, the Named Pipe “ATSVC” is opened, over which the JobAdd function is called. On the remote host, the job files are created by the Task Scheduler and follow the convention C:\\Windows\\System32\\AT. Unlike CAR-2013-05-004, this analytic specifically focuses on uses of AT that can be detected between hosts, indicating remotely gained execution. + +This pipe activity could be discovered with a network decoder, such as that in wireshark, that can inspect SMB traffic to identify the use of pipes. It could also be detected by looking for raw packet capture streams or from a custom sensor on the host that hooks the appropriate API functions. If no network or API level of visibility is possible, this traffic may inferred by looking at SMB connections over 445/tcp followed by the creation of files matching the pattern C:\\Windows\\System32\\AT\\.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:IPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2015-04-001: Remotely Scheduled Tasks via AT" . + +d3f:Reference-CAR-2016-04-004_SuccessfulLocalAccountLogin a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2016-04-004: Successful Local Account Login" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2016-04-004/"^^xsd:anyURI ; + d3f:kb-reference-of d3f:LocalAccountMonitoring ; + d3f:kb-reference-title "Reference - CAR-2016-04-004: Successful Local Account Login" . + +d3f:Reference-CAR-2020-04-001%3AShadowCopyDeletion_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-04-001: Shadow Copy Deletion - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-04-001/"^^xsd:anyURI ; + d3f:kb-abstract """The Windows Volume Shadow Copy Service is a built-in OS feature that can be used to create backup copies of files and volumes. + +Adversaries may delete these shadow copies, typically through the usage of system utilities such as vssadmin.exe or wmic.exe, in order prevent file and data recovery. This technique is commonly employed for this purpose by ransomware.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-04-001: Shadow Copy Deletion" . + +d3f:Reference-CAR-2020-05-001%3AMiniDumpOfLSASS_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-05-001: MiniDump of LSASS - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-05-001/"^^xsd:anyURI ; + d3f:kb-abstract """This analytic detects the minidump variant of credential dumping where a process opens lsass.exe in order to extract credentials using the Win32 API call MiniDumpWriteDump. Tools like SafetyKatz, SafetyDump, and Outflank-Dumpert default to this variant and may be detected by this analytic, though keep in mind that not all options for using those tools will result in this specific behavior. + +The analytic is based on a Sigma analytic contributed by Samir Bousseaden and written up in a blog on MENASEC. It looks for a call trace that includes either dbghelp.dll or dbgcore.dll, which export the relevant functions/permissions to perform the dump. It also detects using the Windows Task Manager (taskmgr.exe) to dump lsass, which is described in CAR-2019-08-001. In this iteration of the Sigma analytic, the GrantedAccess filter isn’t included because it didn’t seem to filter out any false positives and introduces the potential for evasion. + +This analytic was tested both in a lab and in a production environment with a very low false-positive rate. werfault.exe and tasklist.exe, both standard Windows processes, showed up multiple times as false positives.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemCallAnalysis ; + d3f:kb-reference-title "CAR-2020-05-001: MiniDump of LSASS" . + +d3f:Reference-CAR-2020-05-003%3ARareLolBASCommandLines_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-05-003: Rare LolBAS Command Lines - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-05-003/"^^xsd:anyURI ; + d3f:kb-abstract """LoLBAS are binaries and scripts that are built in to Windows, frequently are signed by Microsoft, and may be used by an attacker. Some LoLBAS are used very rarely and it might be possible to alert every time they’re used (this would depend on your environment), but many others are very common and can’t be simply alerted on. + +This analytic takes all instances of LoLBAS execution and then looks for instances of command lines that are not normal in the environment. This can detect attackers (which will tend to need the binaries for something different than normal usage) but will also tend to have false positives. + +The analytic needs to be tuned. The 1.5 in the query is the number of standard deviations away to look. It can be tuned up to filter out more noise and tuned down to get more results. This means it is probably best as a hunting analytic when you have analysts looking at the screen and able to tune the analytic up and down, because the threshold may not be stable for very long.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-05-003: Rare LolBAS Command Lines" . + +d3f:Reference-CAR-2020-08-001%3ANTFSAlternateDataStreamExecution-SystemUtilities_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-08-001: NTFS Alternate Data Stream Execution - System Utilities - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-08-001/"^^xsd:anyURI ; + d3f:kb-abstract "NTFS Alternate Data Streams (ADSs) may be used by adversaries as a means of evading security tools by storing malicious data or binaries in file attribute metadata. ADSs are also powerful because they can be directly executed by various Windows tools; accordingly, this analytic looks at common ways of executing ADSs using system utilities such as powershell." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-08-001: NTFS Alternate Data Stream Execution - System Utilities" . + +d3f:Reference-CAR-2020-09-001%3AScheduledTask-FileAccess_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-09-001: Scheduled Task - FileAccess - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-09-001/"^^xsd:anyURI ; + d3f:kb-abstract "In order to gain persistence, privilege escalation, or remote execution, an adversary may use the Windows Task Scheduler to schedule a command to be run at a specified time, date, and even host. Task Scheduler stores tasks as files in two locations - C:\\Windows\\Tasks (legacy) or C:\\Windows\\System32\\Tasks. Accordingly, this analytic looks for the creation of task files in these two locations." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:FileCreationAnalysis ; + d3f:kb-reference-title "CAR-2020-09-001: Scheduled Task - FileAccess" . + +d3f:Reference-CAR-2020-09-002%3AComponentObjectModelHijacking_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-09-002: Component Object Model Hijacking - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-09-002/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may establish persistence or escalate privileges by executing malicious content triggered by hijacked references to Component Object Model (COM) objects. This is typically done by replacing COM object registry entries under the HKEY_CURRENT_USER\\Software\\Classes\\CLSID or HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID keys. Accordingly, this analytic looks for any changes under these keys." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:UserSessionInitConfigAnalysis ; + d3f:kb-reference-title "CAR-2020-09-002: Component Object Model Hijacking" . + +d3f:Reference-CAR-2020-09-003%3AIndicatorBlocking-DriverUnloaded_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-09-003: Indicator Blocking - Driver Unloaded - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-09-003/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may attempt to evade system defenses by unloading minifilter drivers used by host-based sensors such as Sysmon through the use of the fltmc command-line utility. Accordingly, this analytic looks for command-line invocations of this utility when used to unload minifilter drivers." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-09-003: Indicator Blocking - Driver Unloaded" . + +d3f:Reference-CAR-2020-09-004%3ACredentialsInFiles%26Registry_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-09-004: Credentials in Files & Registry - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-09-004/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may search the Windows Registry on compromised systems for insecurely stored credentials for credential access. This can be accomplished using the query functionality of the reg.exe system utility, by looking for keys and values that contain strings such as “password”. In addition, adversaries may use toolkits such as PowerSploit in order to dump credentials from various applications such as IIS.Accordingly, this analytic looks for invocations of reg.exe in this capacity as well as that of several powersploit modules with similar functionality." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-09-004: Credentials in Files & Registry" . + +d3f:Reference-CAR-2020-09-005%3AAppInitDLLs_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-09-005: AppInit DLLs - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-09-005/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may establish persistence and/or elevate privileges by executing malicious content triggered by AppInit DLLs loaded into processes. Dynamic-link libraries (DLLs) that are specified in the AppInit_DLLs value in the Registry keys HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows or HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\Windows are loaded by user32.dll into every process that loads user32.dll. These values can be abused to obtain elevated privileges by causing a malicious DLL to be loaded and run in the context of separate processes. Accordingly, this analytic looks for modifications to these registry keys that may be indicative of this type of abuse." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemInitConfigAnalysis ; + d3f:kb-reference-title "CAR-2020-09-005: AppInit DLLs" . + +d3f:Reference-CAR-2020-11-002%3ALocalNetworkSniffing_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-002: Local Network Sniffing - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-002/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may use a variety of tools to gain visibility on the current status of things on the network: which processes are listening on which ports, which services are running on other hosts, etc. This analytic looks for the names of the most common network sniffing tools. While this may be noisy on networks where sysadmins are using any of these tools on a regular basis, in most networks their use is noteworthy." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2020-11-002: Local Network Sniffing" . + +d3f:Reference-CAR-2020-11-003%3ADLLInjectionWithMavinject_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-003: DLL Injection with Mavinject - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-003/"^^xsd:anyURI ; + d3f:kb-abstract "Injecting a malicious DLL into a process is a common adversary TTP. Although the ways of doing this are numerous, mavinject.exe is a commonly used tool for doing so because it roles up many of the necessary steps into one, and is available within Windows. Attackers may rename the executable, so we also use the common argument “INJECTRUNNING” as a related signature here. Whitelisting certain applications may be necessary to reduce noise for this analytic." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-11-003: DLL Injection with Mavinject" . + +d3f:Reference-CAR-2020-11-004%3AProcessesStartedFromIrregularParent_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-004: Processes Started From Irregular Parent - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-004/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may start legitimate processes and then use their memory space to run malicious code. This analytic looks for common Windows processes that have been abused this way in the past; when the processes are started for this purpose they may not have the standard parent that we would expect. This list is not exhaustive, and it is possible for cyber actors to avoid this discepency. These signatures only work if Sysmon reports the parent process, which may not always be the case if the parent dies before sysmon processes the event." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2020-11-004: Processes Started From Irregular Parent" . + +d3f:Reference-CAR-2020-11-005%3AClearPowershellConsoleCommandHistory_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-005: Clear Powershell Console Command History - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-005/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may attempt to conceal their tracks by deleting the history of commands run within the Powershell console, or turning off history saving to begin with. This analytic looks for several commands that would do this. This does not capture the event if it is done within the console itself; only commandline-based commands are detected. Note that the command to remove the history file directly may very a bit if the history file is not saved in the default path on a particular system." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-11-005: Clear Powershell Console Command History" . + +d3f:Reference-CAR-2020-11-006%3ALocalPermissionGroupDiscovery_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-006: Local Permission Group Discovery - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-006/"^^xsd:anyURI ; + d3f:kb-abstract "Cyber actors frequently enumerate local or domain permissions groups. The net utility is usually used for this purpose. This analytic looks for any instances of net.exe, which is not normally used for benign purposes, although system administrator actions may trigger false positives." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-11-006: Local Permission Group Discovery" . + +d3f:Reference-CAR-2020-11-007%3ANetworkShareConnectionRemoval_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-007: Network Share Connection Removal - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-007/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may use network shares to exfliltrate date; they will then remove the shares to cover their tracks. This analytic looks for the removal of network shares via commandline, which is otherwise a rare event." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-11-007: Network Share Connection Removal" . + +d3f:Reference-CAR-2020-11-008%3AMSBuildAndMsxsl_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-008: MSBuild and msxsl - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-008/"^^xsd:anyURI ; + d3f:kb-abstract "Trusted developer utilities such as MSBuild may be leveraged to run malicious code with elevated privileges. This analytic looks for any instances of msbuild.exe, which will execute any C# code placed within a given XML document; and msxsl.exe, which processes xsl transformation specifications for XML files and will execute a variaty of scripting languages contained within the XSL file. Both of these executables are rarely used outside of Visual Studio." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-11-008: MSBuild and msxsl" . + +d3f:Reference-CAR-2020-11-009%3ACompiledHTMLAccess_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-009: Compiled HTML Access - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-009/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may hide malicious code in .chm compiled HTML files. When these files are read, Windows uses the HTML help executable named hh.exe, which is the signature for this analytic." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2020-11-009: Compiled HTML Access" . + +d3f:Reference-CAR-2020-11-011%3ARegistryEditFromScreensaver a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-011: Registry Edit from Screensaver" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-011/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may use screensaver files to run malicious code. This analytic triggers on suspicious edits to the screensaver registry keys, which dictate which .scr file the screensaver runs." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:UserSessionInitConfigAnalysis ; + d3f:kb-reference-title "CAR-2020-11-011: Registry Edit from Screensaver" . + +d3f:Reference-CAR-2021-01-002%3AUnusuallyLongCommandLineStrings_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-01-002: Unusually Long Command Line Strings - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-01-002/"^^xsd:anyURI ; + d3f:kb-abstract "Often, after a threat actor gains access to a system, they will attempt to run some kind of malware to further infect the victim machine. These malware often have long command line strings, which could be a possible indicator of attack. Here, we use sysmon and Splunk to first find the average command string length and search for command strings that stretch over multiple lines, thus identifying anomalies and possibly malicious commands." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-01-002: Unusually Long Command Line Strings" . + +d3f:Reference-CAR-2021-01-003%3AClearingWindowsLogsWithWevtutil_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-01-003: Clearing Windows Logs with Wevtutil - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-01-003/"^^xsd:anyURI ; + d3f:kb-abstract "In an attempt to clear traces after compromising a machine, threat actors often try to clear Windows Event logs. This is often done using “wevtutil”, a legitimate tool provided by Microsoft. This action interferes with event collection and notification, and may lead to a security event going undetected, thereby potentially leading to further compromise of the network." ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-01-003: Clearing Windows Logs with Wevtutil" . + +d3f:Reference-CAR-2021-01-004%3AUnusualChildProcessForSpoolsv.ExeOrConnhost.Exe_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-01-004: Unusual Child Process for Spoolsv.Exe or Connhost.Exe - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-01-004/"^^xsd:anyURI ; + d3f:kb-abstract "After gaining initial access to a system, threat actors attempt to escalate privileges as they may be operating within a lower privileged process which does not allow them to access protected information or carry out tasks which require higher permissions. A common way of escalating privileges in a system is by externally invoking and exploiting spoolsv or connhost executables, both of which are legitimate Windows applications. This query searches for an invocation of either of these executables by a user, thus alerting us of any potentially malicious activity." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-01-004: Unusual Child Process for Spoolsv.Exe or Connhost.Exe" . + +d3f:Reference-CAR-2021-01-006%3AUnusualChildProcessSpawnedUsingDDEExploit_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-01-006: Unusual Child Process spawned using DDE exploit - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-01-006/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may use Windows Dynamic Data Exchange (DDE) to execute arbitrary commands. DDE is a client-server protocol for one-time and/or continuous inter-process communication (IPC) between applications. Once a link is established, applications can autonomously exchange transactions consisting of strings, warm data links (notifications when a data item changes), hot data links (duplications of changes to a data item), and requests for command execution." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-01-006: Unusual Child Process spawned using DDE exploit" . + +d3f:Reference-CAR-2021-01-007%3ADetectingTamperingOfWindowsDefenderCommandPrompt_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-01-007: Detecting Tampering of Windows Defender Command Prompt - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-01-007/"^^xsd:anyURI ; + d3f:kb-abstract "In an attempt to avoid detection after compromising a machine, threat actors often try to disable Windows Defender. This is often done using “sc” [service control], a legitimate tool provided by Microsoft for managing services. This action interferes with event detection and may lead to a security event going undetected, thereby potentially leading to further compromise of the network." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "d" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-01-007: Detecting Tampering of Windows Defender Command Prompt" . + +d3f:Reference-CAR-2021-01-008%3ADisableUAC_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-01-008: Disable UAC - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-01-008/"^^xsd:anyURI ; + d3f:kb-abstract "Threat actors often, after compromising a machine, try to disable User Access Control (UAC) to escalate privileges. This is often done by changing the registry key for system policies using “reg.exe”, a legitimate tool provided by Microsoft for modifying the registry via command prompt or scripts. This action interferes with UAC and may enable a threat actor to escalate privileges on the compromised system, thereby allowing further exploitation of the system." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-01-008: Disable UAC" . + +d3f:Reference-CAR-2021-01-009%3ADetectingShadowCopyDeletionViaVssadmin.exe_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-01-009: Detecting Shadow Copy Deletion via Vssadmin.exe - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-01-009/"^^xsd:anyURI ; + d3f:kb-abstract "After compromising a network of systems, threat actors often try to delete Shadow Copy in an attempt to prevent administrators from restoring the systems to versions present before the attack. This is often done via vssadmin, a legitimate Windows tool to interact with shadow copies. This non-detection of this technique, which is often employed by ransomware strains such as “Olympic Destroyer”, may lead to a failure in recovering systems after an attack." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-01-009: Detecting Shadow Copy Deletion via Vssadmin.exe" . + +d3f:Reference-CAR-2021-02-001%3AWebshell-IndicativeProcessTree_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-02-001: Webshell-Indicative Process Tree - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-02-001/"^^xsd:anyURI ; + d3f:kb-abstract "A web shell is a web script placed on an openly accessible web server to allow an adversary to use the server as a gatway in a network. As the shell operates, commands will be issued from within the web application into the broader server operating system. This analytic looks for host enumeration executables initiated by any web service that would not normally be executed within that environment." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-02-001: Webshell-Indicative Process Tree" . + +d3f:Reference-CAR-2021-02-002%3AGetSystemElevation_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-02-002: Get System Elevation - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-02-002/"^^xsd:anyURI ; + d3f:kb-abstract "Cyber actors frequently escalate to the SYSTEM account after gaining entry to a Windows host, to enable them to carry out various attacks more effectively. Tools such as Meterpreter, Cobalt Strike, and Empire carry out automated steps to “Get System”, which is the same as switching over to the System user account. Most of these tools utilize multiple techniques to try and attain SYSTEM: in the first technique, they create a named pipe and connects an instance of cmd.exe to it, which allows them to impersonate the security context of cmd.exe, which is SYSTEM. In the second technique, a malicious DLL is injected into a process that is running as SYSTEM; the injected DLL steals the SYSTEM token and applies it where necessary to escalate privileges. This analytic looks for both of these techniques." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2021-02-002: Get System Elevation" . + +d3f:Reference-CAR-2021-04-001%3ACommonWindowsProcessMasquerading_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-04-001: Common Windows Process Masquerading - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-04-001/"^^xsd:anyURI ; + d3f:kb-abstract """Masquerading (T1036) is defined by ATT&CK as follows: + +“Masquerading occurs when the name or location of an object, legitimate or malicious, is manipulated or abused for the sake of evading defenses and observation. This may include manipulating file metadata, tricking users into misidentifying the file type, and giving legitimate task or service names.” + +Malware authors often use this technique to hide malicious executables behind legitimate Windows executable names (e.g. lsass.exe, svchost.exe, etc). + +There are several sub-techniques, but this analytic focuses on Match Legitimate Name or Location only.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-04-001: Common Windows Process Masquerading" . + +d3f:Reference-CAR-2021-05-001%3AAttemptToAddCertificateToUntrustedStore_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-001: Attempt To Add Certificate To Untrusted Store - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-001/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may add their own root certificate to the certificate store, to cause the web browser to trust that certificate and not display a security warning when it encounters the previously unseen certificate. This action may be the precursor to malicious activity." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-001: Attempt To Add Certificate To Untrusted Store" . + +d3f:Reference-CAR-2021-05-002%3ABatchFileWriteToSystem32_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-002: Batch File Write to System32 - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-002/"^^xsd:anyURI ; + d3f:kb-abstract "While batch files are not inherently malicious, it is uncommon to see them created after OS installation, especially in the Windows directory. This analytic looks for the suspicious activity of a batch file being created within the C:\\Windows\\System32 directory tree. There will be only occasional false positives due to administrator actions." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-002: Batch File Write to System32" . + +d3f:Reference-CAR-2021-05-004%3ABITSJobPersistence_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-004: BITS Job Persistence - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-004/"^^xsd:anyURI ; + d3f:kb-abstract "The following query identifies Microsoft Background Intelligent Transfer Service utility bitsadmin.exe scheduling a BITS job to persist on an endpoint. The query identifies the parameters used to create, resume or add a file to a BITS job. Typically seen combined in a oneliner or ran in sequence. If identified, review the BITS job created and capture any files written to disk. It is possible for BITS to be used to upload files and this may require further network data analysis to identify. You can use bitsadmin /list /verbose to list out the jobs during investigation." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-004: BITS Job Persistence" . + +d3f:Reference-CAR-2021-05-005%3ABITSAdminDownloadFile_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-005: BITSAdmin Download File - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-005/"^^xsd:anyURI ; + d3f:kb-abstract "The following query identifies Microsoft Background Intelligent Transfer Service utility bitsadmin.exe using the transfer parameter to download a remote object. In addition, look for download or upload on the command-line, the switches are not required to perform a transfer. Capture any files downloaded. Review the reputation of the IP or domain used. Typically once executed, a follow on command will be used to execute the dropped file. Note that the network connection or file modification events related will not spawn or create from bitsadmin.exe, but the artifacts will appear in a parallel process of svchost.exe with a command-line similar to svchost.exe -k netsvcs -s BITS. It’s important to review all parallel and child processes to capture any behaviors and artifacts. In some suspicious and malicious instances, BITS jobs will be created. You can use bitsadmin /list /verbose to list out the jobs during investigation." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-005: BITSAdmin Download File" . + +d3f:Reference-CAR-2021-05-006%3ACertUtilDownloadWithURLCacheAndSplitArguments_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-006: CertUtil Download With URLCache and Split Arguments - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-006/"^^xsd:anyURI ; + d3f:kb-abstract "Certutil.exe may download a file from a remote destination using -urlcache. This behavior does require a URL to be passed on the command-line. In addition, -f (force) and -split (Split embedded ASN.1 elements, and save to files) will be used. It is not entirely common for certutil.exe to contact public IP space. However, it is uncommon for certutil.exe to write files to world writeable paths.\\ During triage, capture any files on disk and review. Review the reputation of the remote IP or domain in question." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-006: CertUtil Download With URLCache and Split Arguments" . + +d3f:Reference-CAR-2021-05-007%3ACertUtilDownloadWithVerifyCtlAndSplitArguments_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-007: CertUtil Download With VerifyCtl and Split Arguments - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-007/"^^xsd:anyURI ; + d3f:kb-abstract "Certutil.exe may download a file from a remote destination using -VerifyCtl. This behavior does require a URL to be passed on the command-line. In addition, -f (force) and -split (Split embedded ASN.1 elements, and save to files) will be used. It is not entirely common for certutil.exe to contact public IP space. \\ During triage, capture any files on disk and review. Review the reputation of the remote IP or domain in question. Using -VerifyCtl, the file will either be written to the current working directory or %APPDATA%\\..\\LocalLow\\Microsoft\\CryptnetUrlCache\\Content\\." ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-007: CertUtil Download With VerifyCtl and Split Arguments" . + +d3f:Reference-CAR-2021-05-008%3ACertutilExeCertificateExtraction_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-008: Certutil exe certificate extraction - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-008/"^^xsd:anyURI ; + d3f:kb-abstract "This search looks for arguments to certutil.exe indicating the manipulation or extraction of Certificate. This certificate can then be used to sign new authentication tokens specially inside Federated environments such as Windows ADFS." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-008: Certutil exe certificate extraction" . + +d3f:Reference-CAR-2021-05-009%3ACertUtilWithDecodeArgument_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-009: CertUtil With Decode Argument - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-009/"^^xsd:anyURI ; + d3f:kb-abstract "CertUtil.exe may be used to encode and decode a file, including PE and script code. Encoding will convert a file to base64 with -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- tags. Malicious usage will include decoding a encoded file that was downloaded. Once decoded, it will be loaded by a parallel process. Note that there are two additional command switches that may be used - encodehex and decodehex. Similarly, the file will be encoded in HEX and later decoded for further execution. During triage, identify the source of the file being decoded. Review its contents or execution behavior for further analysis." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-009: CertUtil With Decode Argument" . + +d3f:Reference-CAR-2021-05-010%3ACreateLocalAdminAccountsUsingNetExe_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-010: Create local admin accounts using net exe - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-010/"^^xsd:anyURI ; + d3f:kb-abstract "This search looks for the creation of local administrator accounts using net.exe." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-010: Create local admin accounts using net exe" . + +d3f:Reference-CAR-2021-05-011%3ACreateRemoteThreadIntoLSASS_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-011: Create Remote Thread into LSASS - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-011/"^^xsd:anyURI ; + d3f:kb-abstract "Actors may create a remote thread into the LSASS service as part of a workflow to dump credentials." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemCallAnalysis ; + d3f:kb-reference-title "CAR-2021-05-011: Create Remote Thread into LSASS" . + +d3f:Reference-CManualIntegerInitialization_GNU a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Integer Initialization - GNU C Manual" ; + d3f:has-link "https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Integer-Types"^^xsd:anyURI ; + d3f:kb-organization "GNU" ; + d3f:kb-reference-of d3f:VariableInitialization ; + d3f:kb-reference-title "Integer Initialization in C" . + +d3f:Reference-CManualPointerArithmetic_GNU a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Memory Block Start Validation - GNU C Manual" ; + d3f:has-link "https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Pointer-Arithmetic.html"^^xsd:anyURI ; + d3f:kb-organization "GNU" ; + d3f:kb-reference-of d3f:MemoryBlockStartValidation ; + d3f:kb-reference-title "Pointer Arithmetic in C" . + +d3f:Reference-CertificateAndPublicKeyPinning a d3f:TechniqueReference, + owl:NamedIndividual ; + rdfs:label "Reference - Certificate and Public Key Pinning" ; + d3f:has-link "https://owasp.org/www-community/controls/Certificate_and_Public_Key_Pinning"^^xsd:anyURI ; + d3f:kb-abstract "Certificate and Public Key Pinning technical guide to implementing certificate and public key pinning." ; + d3f:kb-author "OWASP" ; + d3f:kb-organization "OWASP" ; + d3f:kb-reference-of d3f:CertificatePinning ; + d3f:kb-reference-title "Certificate and Public Key Pinning" . + +d3f:Reference-CertificateTransparency a d3f:TechniqueReference, + owl:NamedIndividual ; + rdfs:label "Reference - Certificate Transparency" ; + d3f:has-link "https://www.certificate-transparency.org/"^^xsd:anyURI ; + d3f:kb-abstract """Google's Certificate Transparency project fixes several structural flaws in the SSL certificate system, which is the main cryptographic system that underlies all HTTPS connections. + +These flaws weaken the reliability and effectiveness of encrypted Internet connections and can compromise critical TLS/SSL mechanisms, including domain validation, end-to-end encryption, and the chains of trust set up by certificate authorities.""" ; + d3f:kb-author "Google" ; + d3f:kb-organization "Google" ; + d3f:kb-reference-of d3f:PassiveCertificateAnalysis ; + d3f:kb-reference-title "Certificate Transparency" . + +d3f:Reference-CiscoASR9000AccessListCommands a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Cisco ASR 9000 Series Aggregation Services Routers - Access List Commands" ; + d3f:has-link "https://www.cisco.com/c/en/us/td/docs/routers/asr9000/software/asr9k_r4-0/addr_serv/command/reference/ir40asrbook_chapter1.html"^^xsd:anyURI ; + d3f:kb-abstract "An access control list (ACL) consists of one or more access control entries (ACEs) that collectively define the network traffic profile. This profile can then be referenced by Cisco IOS XR Software software features such as traffic filtering, priority or custom queueing, and dynamic access control. Each ACL includes an action element (permit or deny) and a filter element based on criteria such as source address, destination address, protocol, and protocol-specific parameters." ; + d3f:kb-organization "Cisco" ; + d3f:kb-reference-of d3f:NetworkTrafficPolicyMapping ; + d3f:kb-reference-title "Cisco ASR 9000 Series Aggregation Services Routers - Access List Commands" . + +d3f:Reference-CommandLaunchedFromWinLogon_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-11-008: Command Launched from WinLogon - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-11-008/"^^xsd:anyURI ; + d3f:kb-abstract "An adversary can use accessibility features (Ease of Access), such as StickyKeys or Utilman, to launch a command shell from the logon screen and gain SYSTEM access. Since an adversary does not have physical access to the machine, this technique must be run within Remote Desktop. To prevent an adversary from getting to the login screen without first authenticating, Network-Level Authentication (NLA) must be enabled. If a debugger is set up for one of the accessibility features, then it will intercept the process launch of the feature and instead execute a new command line. This analytic looks for instances of cmd.exe or powershell.exe launched directly from the logon process, winlogon.exe. It should be used in tandem with CAR-2014-11-003, which detects the accessibility programs in the command line." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2014-11-008: Command Launched from WinLogon" . + +d3f:Reference-CommandLineUsageOfArchivingSoftware_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-07-005: Command Line Usage of Archiving Software - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-07-005/"^^xsd:anyURI ; + d3f:kb-abstract """Before exfiltrating data that an adversary has collected, it is very likely that a compressed archive will be created, so that transfer times are minimized and fewer files are transmitted. There is variety between the tools used to compress data, but the command line usage and context of archiving tools, such as ZIP, RAR, and 7ZIP, should be monitored. + +In addition to looking for RAR or 7z program names, command line usage of 7Zip or RAR can be detected with the flag usage of "\\* a \\*". This is helpful, as adversaries may change program names.""" ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2013-07-005: Command Line Usage of Archiving Software" . + +d3f:Reference-ComputationalModelingAndClassificationOfDataStreams_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Computational modeling and classification of data streams - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US20180197089A1/en?oq=US-2018197089-A1"^^xsd:anyURI ; + d3f:kb-abstract "Example techniques described herein determine a signature or classification of a data stream such as a file. The classification can indicate whether the data stream is associated with malware. A processor can locate training analysis regions of training data streams based on predetermined structure data, and determining training model inputs based on the training analysis regions. The processor can determine a computational model based on the training model inputs. The computational model can receive an input vector and provide a corresponding feature vector. The processor can then locate a trial analysis region of a trial data stream based on the predetermined structure data and determine a trial model input. The processor can operate the computational model based on the trial model input to provide a trial feature vector, e.g., a signature. The processor can operate a second computational model to provide a classification based on the signature." ; + d3f:kb-author "Sven Krasser; David Elkind; Patrick Crenshaw; Brett Meyer" ; + d3f:kb-mitre-analysis "Provides a mechanism to classify files using file signatures based on a computational model. Training data that comprises at least a portion of a file, e.g. number of bytes, is used as input to the computational model to develop a file signature and classify the file as malware." ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:FileContentRules ; + d3f:kb-reference-title "Computational modeling and classification of data streams" . + +d3f:Reference-Computer-implementedMethodsAndSystemsForIdentifyingVisuallySimilarTextCharacterStrings_GreathornInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Computer-implemented methods and systems for identifying visually similar text character strings - Greathorn Inc" ; + d3f:has-link "https://patents.google.com/patent/US10320815B2/en?oq=US-10320815-B2"^^xsd:anyURI ; + d3f:kb-abstract "Methods and systems are disclosed for selecting text character strings from a corpus of relevant strings that would commonly be considered to be visually similar to human viewer to an input string. The initial corpus may be any sufficiently broad or specific source of text, e.g., the names of users in a computer application system. The character strings in the corpus are classified such that direct, character-by-character comparisons may be limited to a small subset of likely-similar strings. The input string is then directly compared to strings that are likely to be similar to it, taking into account individual characters' similarities, combinations of characters that look similar to individual characters, transposition of characters, and simple additions and deletions." ; + d3f:kb-author "Raymond W. Wallace, III" ; + d3f:kb-mitre-analysis "Text input is compared to an engine of look-alike sets of text characters. An estimate of similar characters based on the engine is conducted, and an alert is triggered if the estimated similarity is lower than a given threshold." ; + d3f:kb-organization "Greathorn Inc" ; + d3f:kb-reference-of d3f:HomoglyphDetection ; + d3f:kb-reference-title "Computer-implemented methods and systems for identifying visually similar text character strings" . + +d3f:Reference-ComputerMotherboardHavingPeripheralSecurityFunctions a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Computer motherboard having peripheral security functions" ; + d3f:has-link "https://patents.google.com/patent/US8869308B2/en"^^xsd:anyURI ; + d3f:kb-abstract "A secure motherboard for a computer, wherein each user accessible peripheral port is protected by hardware based peripheral protection circuitry soldered to the motherboard." ; + d3f:kb-author "Aviv Soffer" ; + d3f:kb-organization "High Sec Labs Ltd" ; + d3f:kb-reference-of d3f:IOPortRestriction ; + d3f:kb-reference-title "Computer motherboard having peripheral security functions" . + +d3f:Reference-ComputerWormDefenseSystemAndMethod_FireEyeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Computer Worm Defense System and Method - FireEye Inc" ; + d3f:has-link "https://patents.google.com/patent/US20130036472A1"^^xsd:anyURI ; + d3f:kb-abstract "\"A computer worm defense system comprises multiple containment systems tied together by a management system. Each containment system is deployed on a separate communication network and contains a worm sensor and a blocking system. In various embodiments, the computer worm may be transported from a production network, where the computer worm is not readily identifiable, to an alternate network in the worm sensor where the computer worm may be readily identifiable. Computer worm identifiers generated by a worm sensor of one containment system can be provided not only to the blocking system of the same containment system, but can also be distributed by the management system to blocking systems of other containment systems.\"" ; + d3f:kb-author "Ashar Aziz" ; + d3f:kb-mitre-analysis "This patent describes network data being copied by a tap and then analyzed in an analysis environment to determine whether the network data is suspicious using a heuristic module. The analysis environment replays transmission of the suspicious network data between a configured replayer and a virtual machine to detect unauthorized activity." ; + d3f:kb-organization "FireEye Inc" ; + d3f:kb-reference-of d3f:FileCarving ; + d3f:kb-reference-title "Computer Worm Defense System and Method" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Computing apparatus with automatic integrity reference generation and maintenance - Tripwire, Inc." ; + d3f:has-link "https://patents.google.com/patent/US20040060046A1"^^xsd:anyURI ; + d3f:kb-abstract "An apparatus is equipped to automatically update one or more integrity references of a software entity, when the software entity is installed onto the apparatus. The apparatus is further equipped to periodically determine whether the integrity of the apparatus has been compromised based at least in part on the one or more integrity references of the software entity that are automatically updated during installation of the software entity." ; + d3f:kb-author "Thomas Good, Robert DiFalco, Gene Kim" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Tripwire, Inc." ; + d3f:kb-reference-of d3f:ExecutableAllowlisting ; + d3f:kb-reference-title "Computing apparatus with automatic integrity reference generation and maintenance" . + +d3f:Reference-ConfigureUserAccessControlAndPermissions a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Configure User Access Control and Permissions" ; + d3f:has-link "https://docs.microsoft.com/en-us/windows-server/manage/windows-admin-center/configure/user-access-control"^^xsd:anyURI ; + d3f:kb-abstract "When deployed on Windows Server, Windows Admin Center provides a centralized point of management for your server environment. By controlling access to Windows Admin Center, you can improve the security of your management landscape." ; + d3f:kb-author "Microsoft" ; + d3f:kb-reference-of d3f:UserAccountPermissions ; + d3f:kb-reference-title "Configure User Access Control and Permissions" . + +d3f:Reference-ContainerImageAnalysis a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Container Image Analysis" ; + d3f:has-link "https://media.defense.gov/2021/Aug/03/2002820425/-1/-1/0/CTR_Kubernetes_Hardening_Guidance_1.1_20220315.PDF"^^xsd:anyURI ; + d3f:kb-abstract """Container Images can contain unneeded, unsecured or insecure files. + By analyzing the container image, we can identify whether it respects + a specific set of predefined policies.""" ; + d3f:kb-author "National Security Agency" ; + d3f:kb-reference-of d3f:ContainerImageAnalysis ; + d3f:kb-reference-title "Kubernetes Hardening Guide" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Content extractor and analysis system - Bit 9 Inc, Carbon Black Inc" ; + d3f:has-link "https://patents.google.com/patent/US20070028110A1"^^xsd:anyURI ; + d3f:kb-abstract "A security system provides a defense from known and unknown viruses, worms, spyware, hackers, and unwanted software. The system can implement centralized policies that allow an administrator to approve, block, quarantine, and log file activities. The system can extract content of interest from a file container, repackage the content of interest as another valid file type, perform hashes on the content of interest, associate the hash of the container with the hash of the repackaged content, transfer the repackaged content, and store the hash with other security-related information." ; + d3f:kb-author "Todd Brennan" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Bit 9 Inc, Carbon Black Inc" ; + d3f:kb-reference-of d3f:ExecutableDenylisting ; + d3f:kb-reference-title "Content extractor and analysis system" . + + a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Continuous authentication by analysis of keyboard typing characteristics - Bradford Univ., UK" ; + d3f:has-link "https://ieeexplore.ieee.org/document/491588?reload=true&arnumber=491588"^^xsd:anyURI ; + d3f:kb-abstract """This paper describes a simple, software based keyboard monitoring system for the IBM PC for the continuous analysis of the typing characteristics of the user for the purpose of continuous authentication. By exploiting the electrical characteristics of the PC keyboard interface together with modifications to the internal system timer, very accurate measurements can be made of keystroke interval and duration, including measurements of rollover. Rollover patterns, particularly when typing common diphthongs, can be highly characteristic of individual users and provide quite an accurate indication of the users identity. +Published in: European Convention on Security and Detection, 1995.""" ; + d3f:kb-author "S.J. Shepherd" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Bradford Univ., UK" ; + d3f:kb-reference-of d3f:InputDeviceAnalysis ; + d3f:kb-reference-title "Continuous authentication by analysis of keyboard typing characteristics" . + +d3f:Reference-CredentialDumpingViaMimikatz_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2019-04-004: Credential Dumping via Mimikatz - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2019-04-004/"^^xsd:anyURI ; + d3f:kb-abstract "Credential dumpers like Mimikatz can be loaded into memory and from there read data from another processes. This analytic looks for instances where processes are requesting specific permissions to read parts of the LSASS process in order to detect when credential dumping is occurring. One weakness is that all current implementations are \"overtuned\" to look for common access patterns used by Mimikatz." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2019-04-004: Credential Dumping via Mimikatz" . + +d3f:Reference-CredentialDumpingViaWindowsTaskManager_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2019-08-001: Credential Dumping via Windows Task Manager - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2019-08-001/"^^xsd:anyURI ; + d3f:kb-abstract """The Windows Task Manager may be used to dump the memory space of lsass.exe to disk for processing with a credential access tool such as Mimikatz. This is performed by launching Task Manager as a privileged user, selecting lsass.exe, and clicking "Create dump file". This saves a dump file to disk with a deterministic name that includes the name of the process being dumped. + +This requires filesystem data to determine whether files have been created.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemCallAnalysis ; + d3f:kb-reference-title "CAR-2019-08-001: Credential Dumping via Windows Task Manager" . + +d3f:Reference-CyberCommandSystemCYCS a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Cyber Command System (CYCS)" ; + d3f:has-link "https://www.mitre.org/research/technology-transfer/technology-licensing/cyber-command-system-cycs"^^xsd:anyURI ; + d3f:kb-abstract "MITRE’s Cyber Command System (CyCS) tool addresses the objective of improved mission assurance in cyberspace by enabling the mapping of mission operations to the network operations that support those missions. This tool provides mission-impact assessment through situational awareness and impact analysis. CyCS addresses mission-assurance challenges for highly distributed enterprise systems of systems through vulnerability, threat, and consequence management." ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:OperationalDependencyMapping ; + d3f:kb-reference-title "Cyber Command System (CYCS)" . + +d3f:Reference-CyberVaccineAndPredictiveMalwareDefensiveMethodsAndSystems a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Cyber vaccine and predictive-malware-defense methods and systems" ; + d3f:has-link "https://patents.google.com/patent/US10848519B2/"^^xsd:anyURI ; + d3f:kb-abstract "Methods and systems for Predictive Malware Defense (PMD) are described. The systems and methods can utilize advanced machine-learning (ML) techniques to generate malware defenses preemptively. Embodiments of PMD can utilize models, which are trained on features extracted from malware families, to predict possible courses of malware evolution. PMD captures these predicted future evolutions in signatures of as yet unseen malware variants to function as a malware vaccine. These signatures of predicted future malware “evolutions” can be added to the training set of a machine-learning (ML) based malware detection and/or mitigation system so that it can detect these new variants as they arrive." ; + d3f:kb-author "Michael Howard, Avi Pfeifer, Mukesh Dalal, Michael Reposa" ; + d3f:kb-organization "Charles River Analytics Inc." ; + d3f:kb-reference-of d3f:FileContentAnalysis ; + d3f:kb-reference-title "Cyber vaccine and predictive-malware-defense methods and systems" . + +d3f:Reference-DLLInjectionViaLoadLibrary_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-10-002: DLL Injection via Load Library - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-10-002/"^^xsd:anyURI ; + d3f:kb-abstract """Microsoft Windows allows for processes to remotely create threads within other processes of the same privilege level. This functionality is provided via the Windows API CreateRemoteThread. Both Windows and third-party software use this ability for legitimate purposes. For example, the Windows process csrss.exe creates threads in programs to send signals to registered callback routines. Both adversaries and host-based security software use this functionality to inject DLLs, but for very different purposes. An adversary is likely to inject into a program to evade defenses or bypass User Account Control, but a security program might do this to gain increased monitoring of API calls. One of the most common methods of DLL Injection is through the Windows API LoadLibrary. + +Allocate memory in the target program with VirtualAllocEx +Write the name of the DLL to inject into this program with WriteProcessMemory +Create a new thread and set its entry point to LoadLibrary using the API CreateRemoteThread. +This behavior can be detected by looking for thread creations across processes, and resolving the entry point to determine the function name. If the function is LoadLibraryA or LoadLibraryW, then the intent of the remote thread is clearly to inject a DLL. When this is the case, the source process must be examined so that it can be ignored when it is both expected and a trusted process.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemCallAnalysis ; + d3f:kb-reference-title "CAR-2013-10-002: DLL Injection via Load Library" . + +d3f:Reference-DNSWhitelist-DNSWL-EmailAuthenticationMethodExtension a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - DNS Whitelist (DNSWL) Email Authentication Method Extension" ; + d3f:has-link "https://datatracker.ietf.org/doc/html/rfc8904"^^xsd:anyURI ; + d3f:kb-reference-of d3f:DNSAllowlisting ; + d3f:kb-reference-title "DNS Whitelist (DNSWL) Email Authentication Method Extension" . + +d3f:Reference-DYNAMICBASE_UseAddressSpaceLayoutRandomization_MicrosoftDocs a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - /DYNAMICBASE (Use address space layout randomization) - Microsoft Docs" ; + d3f:has-link "https://docs.microsoft.com/en-us/cpp/build/reference/dynamicbase-use-address-space-layout-randomization?view=vs-2019"^^xsd:anyURI ; + d3f:kb-author "Microsoft" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:SegmentAddressOffsetRandomization ; + d3f:kb-reference-title "/DYNAMICBASE (Use address space layout randomization)" . + +d3f:Reference-DaggerFactSheet a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Dagger Fact Sheet" ; + d3f:has-link "https://www.jhuapl.edu/dagger/documents/DaggerFactSheet.pdf"^^xsd:anyURI ; + d3f:kb-abstract "Dagger is a modeling and visualization tool suite that shows how system failures impact mission status. Updated with manual or real-time status, Dagger is used for mission/system planning, situational awareness during mission execution, and course-of-action analysis." ; + d3f:kb-author "Jackie Soenneker" ; + d3f:kb-organization "JHU APL" ; + d3f:kb-reference-of d3f:OperationalDependencyMapping ; + d3f:kb-reference-title "Dagger Fact Sheet" . + +d3f:Reference-DaggerModelingAndVisualizationForMissionImpactSituationalAwareness a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Dagger: Modeling and visualization for mission impact situational awareness" ; + d3f:has-link "https://ieeexplore.ieee.org/document/7795296"^^xsd:anyURI ; + d3f:kb-abstract "Dagger is a modeling and visualization framework that addresses the challenge of representing knowledge and information for decision-makers, enabling them to better comprehend the operational context of network security data. It allows users to answer critical questions such as “Given that I care about mission X, is there any reason I should be worried about what is going on in cyberspace?” or “If this system fails, will I still be able to accomplish my mission?”." ; + d3f:kb-author "Elisha Peterson" ; + d3f:kb-organization "JHU APL" ; + d3f:kb-reference-of d3f:OperationalDependencyMapping ; + d3f:kb-reference-title "Dagger: Modeling and visualization for mission impact situational awareness" . + +d3f:Reference-DataExecutionPrevention_Microsoft a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Mitigate threats by using Windows 10 security features: Data Execution Prevention - Microsoft" ; + d3f:has-link "https://docs.microsoft.com/en-us/windows/security/threat-protection/overview-of-threat-mitigations-in-windows-10#data-execution-prevention"^^xsd:anyURI ; + d3f:kb-abstract """Malware depends on its ability to insert a malicious payload into memory with the hope that it will be executed later. Wouldn't it be great if you could prevent malware from running if it wrote to an area that has been allocated solely for the storage of information? + +Data Execution Prevention (DEP) does exactly that, by substantially reducing the range of memory that malicious code can use for its benefit. DEP uses the No eXecute bit on modern CPUs to mark blocks of memory as read-only so that those blocks can't be used to execute malicious code that may be inserted by means of a vulnerability exploit.""" ; + d3f:kb-author "Nick Schonning, Daniel Simpson, Marty Hernandez Avedon, Trond B. Krokli, jreeds, jcaparas, Andres Mariano Gorzelany, Tina Burden, Thomas Raya, Justin Hall, justanotheranonymoususer, Liza Poggemeyer, Dani Halfin, imba-tjd (Authors for entire page)" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:ProcessSegmentExecutionPrevention ; + d3f:kb-reference-title "Mitigate threats by using Windows 10 security features: Data Execution Prevention" . + +d3f:Reference-DataProcessingAndScanningSystemsForGeneratingAndPopulatingADataInventory a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Data processing and scanning systems for generating and populating a data inventory" ; + d3f:has-link "https://patents.google.com/patent/US11240273B2/"^^xsd:anyURI ; + d3f:kb-abstract "In particular embodiments, a data processing data inventory generation system is configured to: (1) generate a data model (e.g., a data inventory) for one or more data assets utilized by a particular organization; (2) generate a respective data inventory for each of the one or more data assets; and (3) map one or more relationships between one or more aspects of the data inventory, the one or more data assets, etc. within the data model. In particular embodiments, a data asset (e.g., data system, software application, etc.) may include, for example, any entity that collects, processes, contains, and/or transfers personal data (e.g., such as a software application, “internet of things” computerized device, database, website, data-center, server, etc.). The system may be configured to identify particular data assets and/or personal data in data repositories using any suitable intelligent identity scanning technique." ; + d3f:kb-author "Kabir A. Barday, Mihir S. Karanjkar, Steven W. Finch, Ken A. Browne, Nathan W. Heard, Aakash H. Patel, Jason L. Sabourin, Richard L. Daniel, Dylan D. Patton-Kuhl, Jonathan Blake Brannon" ; + d3f:kb-organization "OneTrust LLC" ; + d3f:kb-reference-of d3f:DataInventory ; + d3f:kb-reference-title "Data processing and scanning systems for generating and populating a data inventory" . + +d3f:Reference-DeadCodeElimination a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Dead code elimination" ; + d3f:has-link "https://nebelwelt.net/files/15LangSec.pdf"^^xsd:anyURI ; + d3f:kb-abstract "There is a significant body of work devoted to testing, verifying, and certifying the correctness of optimizing compilers. The focus of such work is to determine if source code and optimized code have the same functional semantics. In this paper, we introduce the correctness-security gap, which arises when a compiler optimization preserves the functionality of but violates a security guarantee made by source code. We show with concrete code examples that several standard optimizations, which have been formally proved correct, inhabit this correctness-security gap. We analyze this gap and conclude that it arises due to techniques that model the state of the program but not the state of the underlying machine. We propose a broad research program whose goal is to identify, understand, and mitigate the impact of security errors introduced by compiler optimizations. Our proposal includes research in testing, program analysis, theorem proving, and the development of new, accurate machine models for reasoning about the impact of compiler optimizations on security." ; + d3f:kb-author "Vijay D'Silva, Mathias Payer, Dawn Song" ; + d3f:kb-organization "Google Inc, Purdue University, UC Berkeley" ; + d3f:kb-reference-of d3f:DeadCodeElimination ; + d3f:kb-reference-title "The Correctness-Security Gap in Compiler Optimization" . + +d3f:Reference-DebuggersForAccessibilityApplications_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-11-003: Debuggers for Accessibility Applications - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-11-006/"^^xsd:anyURI ; + d3f:kb-abstract """The Windows Registry location HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options allows for parameters to be set for applications during execution. One feature used by malicious actors is the "Debugger" option. When a key has this value enabled, a Debugging command line can be specified. Windows will launch the Debugging command line, and pass the original command line in as an argument. Adversaries can set a Debugger for Accessibility Applications. The analytic looks for the original command line as an argument to the Debugger. When the strings "sethc.exe", "utilman.exe", "osk.exe", "narrator.exe", and "Magnify.exe" are detected in the arguments, but not as the main executable, it is very likely that a Debugger is set. + +This analytic could depend on the possibility of the known strings used as arguments for other applications used in the day-to-day environment. Although the chance of the string "sethc.exe" being used as an argument for another application is unlikely, it still is a possibility.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2014-11-003: Debuggers for Accessibility Applications" . + +d3f:Reference-Deception-BasedResponsesToSecurityAttacks_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Deception-Based Responses to Security Attacks - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US20140250524A1/en?oq=US-2014250524-A1"^^xsd:anyURI ; + d3f:kb-abstract "Deception-based techniques for responding to security attacks are described herein. The techniques include transitioning a security attack to a monitored computing device posing as a computing device impacted by the security attack and enabling the adversary to obtain deceptive information from the monitored computing device. Also, the adversary may obtain a document configured to report identifying information of an entity opening the document, thereby identifying the adversary associated with the attack. Further, the techniques include determining that a domain specified in a domain name request is associated with malicious activity and responding to the request with a network address of a monitored computing device to cause the requesting process to communicate with the monitored computing device in place of an adversary server. Additionally, a service may monitor dormant domains names associated with malicious activity and, in response to a change, respond with an alert or a configuration update." ; + d3f:kb-author "Adam S. Meyers; Dmitri Alperovitch; George Robert Kurtz; David F. Diehl; Sven Krasser" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:DecoyNetworkResource ; + d3f:kb-reference-title "Deception-Based Responses to Security Attacks" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Decoy and deceptive data object technology - Cymmetria, Inc." ; + d3f:has-link "https://patents.google.com/patent/US20170134423A1"^^xsd:anyURI ; + d3f:kb-abstract """A computer implemented method of detecting unauthorized access to a protected network by monitoring a dynamically updated deception environment, comprising launching, on one or more decoy endpoints, one or more decoy operating system (OS) managing one or more of a plurality of deception applications mapping a plurality of applications executed in a protected network, updating dynamically a usage indication for a plurality of deception data objects deployed in the protected network to emulate usage of the plurality of deception data objects for accessing the deception application(s) wherein the plurality of deception data objects are configured to trigger an interaction with the deception application(s) when used, detecting usage of data contained in the deception data object(s) by monitoring the interaction and identifying one or more potential unauthorized operations based on analysis of the detection. + +In order to convince the potential attacker that the deception environment is the real (valid) processing environment and/or part thereof, the campaign manager may construct the false identity according to the public information of the certain user that may typically be available to the potential attacker. By exposing the real (public) information of the certain user to the potential attacker, the false identity may seem consistent and legitimate to the potential attacker. For example, the campaign manager may create a false account, for example, a Facebook account of the certain user that includes the same public information that is publicly available to other Facebook users from the real (genuine) Facebook account of the certain user. The fake company account may include information specific to the role and/or job title of certain user within the company, for example, a programmer, an accountant, an IT person and/or the like.""" ; + d3f:kb-author "Dean Sysman, Gadi Evron, Imri Goldberg, Itamar Sher, Shmuel Ur" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Cymmetria, Inc." ; + d3f:kb-reference-of d3f:DecoyPersona ; + d3f:kb-reference-title "Decoy and deceptive data object technology" . + +d3f:Reference-DecoyNetwork-BasedServiceForDeceivingAttackers-AmazonTechnologies a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Decoy Network-Based Service for Deceiving Attackers - Amazon Technologies" ; + d3f:has-link "https://patents.google.com/patent/US10873601B1"^^xsd:anyURI ; + d3f:kb-abstract "A decoy network-based service uses a decoy credential to lure an attacker to access the decoy network-based service, and monitors the attacker's activity with respect to the decoy network-based service to determine the attacker's motivation. In various examples, a decoy credential is published on an Internet-accessible site, and a system that provides a network-based service (e.g., a service provider network) subsequently receives an access request from a computing device that includes the decoy credential. Based on the decoy credential, the computing device may be provided access to a decoy network-based service, and application programming interface (API) calls made by the computing device may be routed through a decoy control plane. The data relating to the API calls may be stored and analyzed to determine a motivation of the attacker, which may be used in various downstream applications to improve security for customers of the network-based service." ; + d3f:kb-author "Thomas Stickle" ; + d3f:kb-mitre-analysis "MITRE analysis was not found." ; + d3f:kb-organization "Amazon Technologies" ; + d3f:kb-reference-of d3f:DecoyUserCredential ; + d3f:kb-reference-title "Decoy network-based service for deceiving attackers" . + +d3f:Reference-DecoyPersonasForSafeguardingOnlineIdentityUsingDeception_ a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Decoy Personas for Safeguarding Online Identity Using Deception - MITRE" ; + d3f:has-link "https://web.archive.org/web/20180407204216/https://isc.sans.edu/diary/Decoy+Personas+for+Safeguarding+Online+Identity+Using+Deception/16159"^^xsd:anyURI ; + d3f:kb-abstract """What if online scammers weren't sure whether the user account they are targeting is really yours, or whether the information they compiled about you is real? It's worth considering whether decoy online personas might help in the quest to safeguard our digital identities and data. + +I believe deception tactics, such as selective and careful use of honeypots, holds promise for defending enterprise IT resources. Some forms of deception could also protect individuals against online scammers and other attackers. This approach might not be quite practical today for most people, but in the future we might find it both necessary and achievable. + +Human attackers and malicious software pursue user accounts and data on-line through harvesting, phishing, password-guessing, software vulnerabilities, and various other means. How might we use decoys to confuse, misdirect, slow down and detect adversaries engaged in such activities? + +... + +The wealth of personal details available on social networking sites allows attackers to target individuals using social engineering, secret question-guessing and other techniques. For some examples of such approaches, see The Use of Fake or Fraudulent LinkedIn Profiles and Data Mining Resumes for Computer Attack Reconnaissance. + +Setting up one or more fake social network profiles (e.g., on Facebook) that use the person's real name can help the individual deflect the attack or can act as an early warning of an impending attack. A decoy profile could purposefully expose some inaccurate information, while the person's real profile would be more carefully concealed using the site's privacy settings. Decoy profiles would be associated with spamtrap email addresses. + +Similarly, the person could expose decoy profiles on other sites, for instance those reveal shopping habits (e.g., Amazon), musings (e.g., Twitter), skills (e.g., GitHub), travel (e.g., TripIt), affections (e.g., Pinterest), music taste (e.g., Pandora) and so on. The person's decoy identities could also have fake resumes available on sites such as Indeed and Monster.com.""" ; + d3f:kb-author "Lenny Zeltser" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "SANS" ; + d3f:kb-reference-of d3f:DecoyPersona ; + d3f:kb-reference-title "Decoy Personas for Safeguarding Online Identity Using Deception" . + +d3f:Reference-DetectingDDoSAttackUsingSnort a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Detecting DDoS Attack Using Snort" ; + d3f:has-link "https://www.researchgate.net/publication/338660054_DETECTING_DDoS_ATTACK_USING_Snort"^^xsd:anyURI ; + d3f:kb-abstract "A DDoS (Distributed Denial-of-Service) attack is very common and easy toexecute and does not require any sophisticated tools. It can happen to anyone. In this project we deploy snort in our home network as a NIDS (Network Intrusion Detection System) to detect a DDoS attack and prevent it." ; + d3f:kb-author "Manas Gogoi, Sourav Mishra" ; + d3f:kb-organization "Indian Institute of Information Technology Allahabad" ; + d3f:kb-reference-of d3f:InboundSessionVolumeAnalysis ; + d3f:kb-reference-title "DETECTING DDoS ATTACK USING Snort" . + +d3f:Reference-DetectingNetworkReconnaissanceByTrackingIntranetDark-netCommunications_VECTRANETWORKSInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Detecting network reconnaissance by tracking intranet dark-net communications - VECTRA NETWORKS Inc" ; + d3f:has-link "https://patents.google.com/patent/US20150264078A1"^^xsd:anyURI ; + d3f:kb-abstract "A method and system for detecting network reconnaissance is disclosed wherein network traffic can be parsed into unidirectional flows that correspond to sessions. A learning module may categorize computing entities inside the network into assets and generate asset data to monitor the computing entities. If one or more computing entities address a flow to an address of a host that no longer exists, ghost asset data may be recorded and updated in the asset data. When a computing entity inside the network contacts an object in the dark-net, the computing entity may be recorded a potential mapper. When the computing entity tries to contact a number of objects in the dark-net, such that a computed threshold is exceeded, the computing entity is identified a malicious entity performing network reconnaissance." ; + d3f:kb-author "Nicolas BEAUCHESNE; Sungwook Yoon" ; + d3f:kb-mitre-analysis "This patent describes detecting an attacker performing internal reconnaissance within an organization's network to gather intelligence about the configuration of the network or identify the next target. Network packets are collected (ex. tapped from a network switch) and processed to create flows that are used to map out the network to identify network assets as well as ghost assets (addresses not assigned to a device or an existing device that is temporarily disabled). Once this mapping is complete it is used to monitor the network to determine if an attacker is attempting to connect to a ghost asset. If an attacker attempts to connect to a ghost asset over a threshold (ex. contacting four ghost assets in less than seven minutes), an alert is generated." ; + d3f:kb-organization "VECTRA NETWORKS Inc" ; + d3f:kb-reference-of d3f:ConnectionAttemptAnalysis ; + d3f:kb-reference-title "Detecting network reconnaissance by tracking intranet dark-net communications" . + +d3f:Reference-DetectionOfMaliciousIDNHomoglyphDomains a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Detection of Malicious IDNHomoglyph Domains" ; + d3f:has-link "http://essay.utwente.nl/79263/1/Yazdani_MA_EEMCS.pdf"^^xsd:anyURI ; + d3f:kb-abstract "At early stages of Internet development, users were only able to register or access domains with ASCII characters. The introduction of IDN (Internationalized Domain Name) which uses the larger Unicode character set, made it possible for regional users to deal with domain names using their local language alphabet. Beside the advantages provided by IDN, a new type of network threats has also emerged. The reason behind this is that there are many similar-looking characters in Unicode system, called homoglyphs. These characters could be used by an attacker to lure users by replacing one or more characters of a benign domain." ; + d3f:kb-author "Ramin Yazdani" ; + d3f:kb-organization "University of Twente" ; + d3f:kb-reference-of d3f:HomoglyphDenylisting ; + d3f:kb-reference-title "Detection of Malicious IDN Homoglyph Domains Using Active DNS Measurements" . + +d3f:Reference-DeterministicMethodForDetectingAndBlockingOfExploitsOnInterpretedCode_K2CyberSecurityInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Deterministic method for detecting and blocking of exploits on interpreted code - K2 Cyber Security Inc" ; + d3f:has-link "https://patents.google.com/patent/US20190180036A1/en?oq=US-2019180036-A1"^^xsd:anyURI ; + d3f:kb-abstract "In one aspect, a method useful for preventing exploitation of a vulnerability in an interpreted code by monitoring and validating an execution of the interpreted code in a script file by an application server, includes the step of generating a mapping for an incoming network connection to a specified script file to be executed by an application server. The computerized method includes the step of inserting a hook for monitoring an application programming interface (API) call or a privileged instruction executed by the application server. The computerized method includes the step of inserting a validation code configured to validate the API call or the privileged instruction executed by the interpreted code in a script." ; + d3f:kb-author "Jayant Shukla" ; + d3f:kb-mitre-analysis "This patent describes a technique for monitoring API calls. During execution of interpreted code the observed API calls are validated against a whitelist of API calls for that interpreted code file. Action is taken if the observed API call is not in accordance with the list." ; + d3f:kb-organization "K2 Cyber Security Inc" ; + d3f:kb-reference-of d3f:SystemCallAnalysis ; + d3f:kb-reference-title "Deterministic method for detecting and blocking of exploits on interpreted code" . + +d3f:Reference-DistributedMeta-informationQueryInANetwork_Bit9Inc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Distributed meta-information query in a network - Bit 9 Inc" ; + d3f:has-link "https://patents.google.com/patent/US20070028302A1/en?oq=US-2007028302-A1"^^xsd:anyURI ; + d3f:kb-abstract "A security system provides a defense from known and unknown viruses, worms, spyware, hackers, and social engineering attacks. The system can implement centralized policies that allow an administrator to approve, block, quarantine, and log file activities. A server associated with a number of hosts can provide a query for host computers to access security-related meta-information in local host stores. The query is pulled from the server by the hosts. The results of the distributed host query are stored and merged on the server, and exported for display, reports, or security response." ; + d3f:kb-author "Todd Brennan; John Hanratty" ; + d3f:kb-mitre-analysis """Provides a mechanism to detect, monitor, locate, and control files installed on host computers. Each host has a host agent that analyzes file system activity and takes action based on policies configured on a server. The policies identify whether to block, log, allow, or quarantine actions such as file accesses and execution of executables. Examples of policies include: + +* Block/log execution of new executables and detached scripts (e.g., .exe or .bat) +* Block/log reading/execution of new embedded content (e.g., macros in .doc) +* Block/log installation/modification of Web content (alteration of content in .html or .cgi files) +* Block/log execution of new files in an administratively defined 'class'; e.g., an administrator might want to block screen savers .scr, but not the entire class of executables .exe, .dll, .sys, etc . . .""" ; + d3f:kb-organization "Bit 9 Inc" ; + d3f:kb-reference-of d3f:FileContentRules ; + d3f:kb-reference-title "Distributed meta-information query in a network" . + +d3f:Reference-DomainAgeRegistrationAlert_IncRapid7IncRAPID7Inc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Domain age registration alert - Inc Rapid7 Inc RAPID7 Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170026400A1/"^^xsd:anyURI ; + d3f:kb-abstract "Systems and methods of identifying a security risk by monitoring and generating alerts based on attempts to access web domains that have been registered within a short period of time and are therefore identified as \"high-risk,\" including identifying an attempt to access a domain; receiving a registration date of the domain; and detecting a security risk based on the registration date of the domain." ; + d3f:kb-author "Samuel Adams; H D. Moore" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Rapid7 Inc." ; + d3f:kb-reference-of d3f:DNSTrafficAnalysis ; + d3f:kb-reference-title "Domain age registration alert" . + +d3f:Reference-End-to-endCertificatePinning a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - End-to-end certificate pinning" ; + d3f:has-link "https://patents.google.com/patent/US9847992B2/en?q=certificate+pinning&oq=certificate+pinning"^^xsd:anyURI ; + d3f:kb-abstract "Some embodiments implement end-to-end certificate pinning for content intake from various content providers and for content distribution to various end users. To ensure secure retrieval of content provider content, the content distributor pins the content provider to one or more certificate authorities." ; + d3f:kb-author "Tin Zaw, Reed Morrison, Robert J. Peters" ; + d3f:kb-organization "Verizon Digital Media Services Inc" ; + d3f:kb-reference-of d3f:CertificatePinning ; + d3f:kb-reference-title "End-to-end Certificate Pinning" . + +d3f:Reference-EnhancingNetworkSecurityByPreventingUser-InitiatedMalwareExecution_ a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Enhancing Network Security By Preventing User-Initiated Malware Execution - MITRE" ; + d3f:has-link "https://ieeexplore.ieee.org/document/1425209"^^xsd:anyURI ; + d3f:kb-abstract "In this paper, we describe characteristics of the most widely used defense techniques for the blocking of user-initiated malware and why these techniques are insufficient. We then introduce a module verification strategy that will eliminate, or at least severely reduce, this problem by extending the classic \"defense in depth\" network security strategy. We then describe how the augmentation of a standard operating system loader to include references to a database of cryptographic hashes of module executables can be used to implement this strategy. Finally, we describe our efforts towards the creation of a prototype system that implements the module verification strategy." ; + d3f:kb-author "John V. Harrison" ; + d3f:kb-mitre-analysis "This paper describes application whitelisting. New software executable code is compared to a database of allowed software to determine if the new executable code should be loaded and executed. A database of cryptographic hashes is first created for all allowed software executables. Prior to loading any new executable code, a hash is computed and compared against the hash database. If the hash for the new code does not appear in the database, the executable is not loaded and executed." ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:ExecutableAllowlisting ; + d3f:kb-reference-title "Enhancing Network Security By Preventing User-Initiated Malware Execution" . + +d3f:Reference-Entrust-What-Is-Token-Based-Authentication a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Identity Providers: What is Token Based Authentication" ; + d3f:has-link "https://www.entrust.com/resources/learn/what-is-token-based-authentication"^^xsd:anyURI ; + d3f:kb-abstract "Token-based authentication is an authentication protocol where users verify their identity in exchange for a unique access token. Users can then access the website, application, or resource for the life of the token without having to re-enter their credentials." ; + d3f:kb-organization "Entrust" ; + d3f:kb-reference-of d3f:Token-basedAuthentication ; + d3f:kb-reference-title "Identity Providers: What is Token Based Authentication" . + +d3f:Reference-ExecutionWithAT_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-05-004: Execution with AT - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-05-004/"^^xsd:anyURI ; + d3f:kb-abstract "In order to gain persistence, privilege escalation, or remote execution, an adversary may use the Windows built-in command AT (at.exe) to schedule a command to be run at a specified time, date, and even host. This method has been used by adversaries and administrators alike. Its use may lead to detection of compromised hosts and compromised users if it is used to move laterally. The built-in Windows tool schtasks.exe (CAR-2013-08-001) offers greater flexibility when creating, modifying, and enumerating tasks. For these reasons, schtasks.exe is more commonly used by administrators, tools/scripts, and power users." ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:ScheduledJobAnalysis ; + d3f:kb-reference-title "CAR-2013-05-004: Execution with AT" . + +d3f:Reference-ExecutionWithSchtasks_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-08-001: Execution with schtasks - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-08-001/"^^xsd:anyURI ; + d3f:kb-abstract "The Windows built-in tool schtasks.exe provides the creation, modification, and running of scheduled tasks on a local or remote computer. It is provided as a more flexible alternative to at.exe, described in CAR-2013-05-004. Although used by adversaries, the tool is also legitimately used by administrators, scripts, and software configurations. The scheduled tasks tool can be used to gain Persistence and can be used in combination with a Lateral Movement technique to remotely gain execution. Additionally, the command has parameters to specify the user and password responsible for creating the task, as well as the user and password combination that the task will run as. The /s flag will cause a task to run as the SYSTEM user, usually indicating privilege escalation." ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:ScheduledJobAnalysis ; + d3f:kb-reference-title "CAR-2013-08-001: Execution with schtasks" . + +d3f:Reference-FederalPublicKeyInfrastructure101 a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Federal Public Key Infrastructrure 101" ; + d3f:has-link "https://www.idmanagement.gov/university/fpki/"^^xsd:anyURI ; + d3f:kb-author "Identity, Credential, and Access Management Subcommittee (ICAMSC)" ; + d3f:kb-reference-of d3f:Certificate-basedAuthentication ; + d3f:kb-reference-title "Federal Public Key Infrastructure 101" . + +d3f:Reference-File-modifyingMalwareDetection_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - File-modifying malware detection - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US20180121650A1/en?oq=US-2018121650-A1"^^xsd:anyURI ; + d3f:kb-abstract "A security agent implemented on a computing device is described herein. The security agent is configured to detect file-modifying malware by detecting that a process is traversing a directory of the memory of the computing device and detecting that the process is accessing files in the memory according to specified file access patterns. The security agent can also be configured to correlate actions of multiple processes that correspond to a specified file access pattern and detect that one or more of the multiple processes are malware by correlating their behavior." ; + d3f:kb-author "Daniel W. Brown" ; + d3f:kb-mitre-analysis """This patent describes a technique for detecting file modifying malware such as wipers and ransomware that overwrite portions of files and encrypt portions of a computer's memory, respectively. Processes that are traversing a directory are identified along with file access patterns. Processes executing on a computing device that are traversing a directory include: + +* changing a directory of a process (e.g., iteratively, systematically, repeatedly) +* detecting that a process is conducting an "open directory" operation repeatedly +* the same process traversing through a directory and recording the locations of data files encountered in each sub - directory + +In addition to identifying processes traversing a directory, particular file access patterns are also detected that may be indicative of malicious behavior including: +* multiple file types being accessed +* accessing a large number of files +* files located in multiple locations in the directory being accessed + +If a process is conducting a traversal of the directory and accessing files according to a defined access pattern associated with malicious behavior, a preventative action is performed.""" ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:FileAccessPatternAnalysis ; + d3f:kb-reference-title "File-modifying malware detection" . + +d3f:Reference-FileIntegrityMonitoringinMicrosoftDefenderforCloud-Microsoft a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - File Integrity Monitoring in Microsoft Defender for Cloud - Microsoft" ; + d3f:has-link "https://learn.microsoft.com/en-us/azure/defender-for-cloud/file-integrity-monitoring-overview"^^xsd:anyURI ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:FileIntegrityMonitoring ; + d3f:kb-reference-title "File Integrity Monitoring in Microsoft Defender for Cloud" . + +d3f:Reference-FirmwareBehaviorAnalysisConFirm a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firmware Behavior Analysis ConFirm" ; + d3f:has-link "http://sites.nyuad.nyu.edu/moma/pdfs/pubs/C22.pdf"^^xsd:anyURI ; + d3f:kb-abstract """The modernization of various critical infrastructure components has dictated the use of microprocessor-based +embedded control systems in critical applications. It is often +infeasible, however, to employ the same level of security measures used in general purpose computing systems, due to the stringent +performance and resource constraints of embedded devices. Furthermore, as software relies on the firmware for proper operation, +no software-level technique can detect malicious behavior of +the firmware. In this work, we propose ConFirm, a low-cost +technique to detect malicious modifications in the firmware +of embedded systems by measuring the number of low-level hardware events that occur during the execution of the firmware.""" ; + d3f:kb-author "Xueyang Wang, Charalambos Konstantinou, Michail Maniatakos, Ramesh Karri" ; + d3f:kb-organization "Department of Electrical and Computer Engineering, Polytechnic School of Engineering, New York University and Department of Electrical and Computer Engineering, New York University Abu Dhabi" ; + d3f:kb-reference-of d3f:FirmwareBehaviorAnalysis ; + d3f:kb-reference-title """ConFirm: Detecting Firmware Modifications in Embedded Systems +using Hardware Performance Counters""" . + +d3f:Reference-FirmwareBehaviorAnalysisVIPER a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firmware Behavior Analysis VIPER" ; + d3f:has-link "https://dl.acm.org/doi/pdf/10.1145/2046707.2046711"^^xsd:anyURI ; + d3f:kb-abstract "Recent research demonstrates that malware can infect peripherals' firmware in a typical x86 computer system, e.g., by exploiting vulnerabilities in the firmware itself or in the firmware update tools. Verifying the integrity of peripherals' firmware is thus an important challenge. We propose software-only attestation protocols to verify the integrity of peripherals' firmware, and show that they can detect all known software-based attacks." ; + d3f:kb-author "Yanlin Li, Jonathan M. McCune, Adrian Perrig" ; + d3f:kb-organization "CyLab, Carnegie Mellon University" ; + d3f:kb-reference-of d3f:FirmwareBehaviorAnalysis ; + d3f:kb-reference-title "VIPER: Verifying the Integrity of PERipherals' Firmware" . + +d3f:Reference-FirmwareEmbeddedMonitoringCodeRedBalloon a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firmware Embedded Monitoring Code Red Balloon" ; + d3f:has-link "https://patents.google.com/patent/US10657262B1/en"^^xsd:anyURI ; + d3f:kb-abstract "Systems and methods for securing embedded devices via both online and offline defensive strategies. One or more security software components may be injected into firmware binary to create a modified firmware binary, which is functionally- and size-equivalent to the original firmware binary. The security software components may retrieve live forensic information related to embedded devices for use in live hardening of the modified firmware binary while the embedded device is online, dynamically patching the firmware" ; + d3f:kb-author "Ang Cui, Salvatore J. Stolfo" ; + d3f:kb-organization "Red Balloon Security, Inc" ; + d3f:kb-reference-of d3f:FirmwareEmbeddedMonitoringCode ; + d3f:kb-reference-title "Method and apparatus for securing embedded device firmware" . + +d3f:Reference-FirmwareEmbeddedMonitoringCodeSymbiotes a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firmware Embedded Monitoring Code Symbiotes" ; + d3f:has-link "http://nsl.cs.columbia.edu/projects/minestrone/papers/Symbiotes.pdf"^^xsd:anyURI ; + d3f:kb-abstract """A large number of embedded devices on the internet, such as +routers and VOIP phones, are typically ripe for exploitation. Little to no defensive technology, such as AV scanners or IDS's, are available to protect these devices. We propose a host-based defense mechanism, which we call Symbiotic Embedded Machines (SEM), that is specifically designed +to inject intrusion detection functionality into the firmware of the device.""" ; + d3f:kb-author "Ang Cui, Salvatore J. Stolfo" ; + d3f:kb-organization "Department of Computer Science Columbia University" ; + d3f:kb-reference-of d3f:FirmwareEmbeddedMonitoringCode ; + d3f:kb-reference-title "Defending Embedded Systems with Software Symbiotes" . + +d3f:Reference-FrameworkForNotifyingADirectoryServiceOfAuthenticationEventsProcessedOutsideTheDirectoryService_OracleInternationalCorp a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Framework for notifying a directory service of authentication events processed outside the directory service - Oracle International Corp" ; + d3f:has-link "https://patents.google.com/patent/US20090077645A1"^^xsd:anyURI ; + d3f:kb-abstract "Methods, systems and machine-readable media for authenticating an end user for a client application are disclosed. According to one embodiment of the invention, a method of authenticating an end user for a client application using a directory service having an authentication control policy that tracks failed authentication attempts and allows lock out of an account after a predetermined number of failures comprises receiving end user identity information and security information at the client application; sending a search request to the directory service for an entry associated with the end user identity information and, if a match is found, receiving a authentication token from the directory service associated with the end user identity information; comparing the received authentication token with the security information; if the authentication token matches the security information, sending a request to update the directory service to indicate that successful authentication of the end user has occurred; and if the authentication token does not match the security information, sending a request to update the directory service to indicate that a failed attempt at authentication of the end user has occurred." ; + d3f:kb-author "Buddhika Nandana Kottahachchi" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Oracle International Corp" ; + d3f:kb-reference-of d3f:AccountLocking ; + d3f:kb-reference-title "Framework for notifying a directory service of authentication events processed outside the directory service" . + +d3f:Reference-GS_BufferSecurityCheck_MicrosoftDocs a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - /GS (Buffer Security Check) - Microsoft Docs" ; + d3f:has-link "https://docs.microsoft.com/en-us/cpp/build/reference/gs-buffer-security-check?view=vs-2019"^^xsd:anyURI ; + d3f:kb-abstract "" ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Microsoft Docs" ; + d3f:kb-reference-of d3f:StackFrameCanaryValidation ; + d3f:kb-reference-title "/GS (Buffer Security Check)" . + +d3f:Reference-GenericRegsvr32_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2019-04-002: Generic Regsvr32 - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2019-04-002/"^^xsd:anyURI ; + d3f:kb-abstract "Regsvr32 can be used to execute arbitrary code in the context of a Windows signed binary, which can be used to bypass application whitelisting. This analytic looks for suspicious usage of the tool. It's not likely that you'll get millions of hits, but it does occur during normal activity so some form of baselining would be necessary for this to be an alerting analytic. Alternatively, it can be used for hunt by looking for new or anomalous DLLs manually." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2019-04-002: Generic Regsvr32" . + +d3f:Reference-GuardsForApplicationInSoftwareTamperproofing_PurdueResearchFoundation a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Guards for application in software tamperproofing - Purdue Research Foundation" ; + d3f:has-link "https://patents.google.com/patent/US7287166B1/en?oq=US-7287166-B1"^^xsd:anyURI ; + d3f:kb-abstract "A method of protecting a software program from unauthorized modification, and a system for practicing the method. The method utilizes self-protecting software code. Armed internally with self-defensive mechanisms, a self-protecting software program is tamper-resistant. Whenever its integrity is compromised, a self-protecting software program may become unusable due to software program crashes or other errors, or may generate subtle errors that do not immediately result render the program unusable but still result in incorrect software program execution. A self-protecting software program also may be able to repair itself to restore the integrity of its damaged code. The system comprises a computer program for automatically adding self-protection features to a software program." ; + d3f:kb-author "Hoi Chang; Mikhail J. Atallah; John R. Rice" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Purdue Research Foundation" ; + d3f:kb-reference-of d3f:ProcessCodeSegmentVerification ; + d3f:kb-reference-title "Guards for application in software tamperproofing" . + +d3f:Reference-Hardware-assistedSystemAndMethodForDetectingAndAnalyzingSystemCallsMadeToAnOpertingSystemKernel_EndgameInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Hardware-assisted system and method for detecting and analyzing system calls made to an operting system kernel - Endgame Inc" ; + d3f:has-link "https://patents.google.com/patent/US20180032728A1/en?oq=US20180032728-A1"^^xsd:anyURI ; + d3f:kb-abstract "The present disclosure relates to a system and method for monitoring system calls to an operating system kernel. A performance monitoring unit is used to monitor system calls and to gather information about each system call. The information is gathered upon interrupting the system call and can include system call type, parameters, and information about the calling thread/process, in order to determine whether the system call was generated by malicious software code. Potentially malicious software code is nullified by a malicious code counter-attack module." ; + d3f:kb-author "Matthew D. Spisak" ; + d3f:kb-mitre-analysis """This patent describes a technique for monitoring system calls to detect malicious software code. A system call monitoring module operates at the kernel level and traps system calls. +Monitoring data includes: + +* information about the path to the file to be accessed by a system call. +* the memory address or range of addresses to be accessed by a system call. +* the context for the thread within operating system that will be interrupted by a system call. +* the type of system call information about the socket that is being used by system call in order to send or receive data. +* the history of system calls in order to monitor for specific sequences of system calls. +* the frequency or periodicity of a particular system call or set of systems calls. + +Captured system call data is analyzed using data analysis algorithms such as machine learning algorithms, artificial intelligence algorithms, pattern recognition algorithms, or other known data analysis techniques. An alert is generated if it is likely that the system call was generated by malicious software code.""" ; + d3f:kb-organization "Endgame Inc" ; + d3f:kb-reference-of d3f:SystemCallAnalysis ; + d3f:kb-reference-title "Hardware-assisted system and method for detecting and analyzing system calls made to an operting system kernel" . + +d3f:Reference-HeuristicBotnetDetection_PaloAltoNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Heuristic botnet detection - Palo Alto Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US20160156644A1"^^xsd:anyURI ; + d3f:kb-abstract "In some embodiments, heuristic botnet detection is provided. In some embodiments, heuristic botnet detection includes monitoring network traffic to identify suspicious network traffic; and detecting a bot based on a heuristic analysis of the suspicious network traffic behavior using a processor, in which the suspicious network traffic behavior includes command and control traffic associated with a bot master. In some embodiments, heuristic botnet detection further includes assigning a score to the monitored network traffic, in which the score corresponds to a botnet risk characterization of the monitored network traffic (e.g., based on one or more heuristic botnet detection techniques); increasing the score based on a correlation of additional suspicious behaviors associated with the monitored network traffic (e.g., based on one or more heuristic botnet detection techniques); and determining the suspicious behavior is associated with a botnet based on the score." ; + d3f:kb-author "Xinran Wang; Huagang Xie" ; + d3f:kb-mitre-analysis """This patent describes detecting botnets using heuristic analysis techniques on collected network flows. The heuristic techniques include: + +* Identifying suspicious traffic patterns to detect command and control traffic ex. periodically visiting a known malware URL, a host visiting a malware domain twice every 5 hour and 14 minutes (this is a specific pattern for a variant of Swizzor botnets). +* Identifying non-standard behaviors such as connecting to a non-standard HTTP port for HTTP traffic, visiting a non-existent domain, downloading executable files with non-standard executable file extensions, communicating using HTTP header with a shorter than common length +* Analyzing visited domain information to identify the following: visiting a domain with a domain name that is longer than a common domain name length, visiting a dynamic DNS domain, visiting a fast-flux domain, and visiting a recently created domain. + +A score is determined based on these factors and if the score is over a threshold, a responsive action is performed.""" ; + d3f:kb-organization "Palo Alto Networks Inc" ; + d3f:kb-reference-of d3f:DNSTrafficAnalysis ; + d3f:kb-reference-title "Heuristic botnet detection" . + +d3f:Reference-HostDiscoveryCommands_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2016-03-001: Host Discovery Commands - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2016-03-001/"^^xsd:anyURI ; + d3f:kb-abstract """When entering on a host for the first time, an adversary may try to discover information about the host. There are several built-in Windows commands that can be used to learn about the software configurations, active users, administrators, and networking configuration. These commands should be monitored to identify when an adversary is learning information about the system and environment. The information returned may impact choices an adversary can make when establishing persistence, escalating privileges, or moving laterally. + +Because these commands are built in, they may be run frequently by power users or even by normal users. Thus, an analytic looking at this information should have well-defined white- or blacklists, and should consider looking at an anomaly detection approach, so that this information can be learned dynamically.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2016-03-001: Host Discovery Commands" . + +d3f:Reference-HowASLRProtectsLinuxSystemsFromBufferOverflowAttacks_NetworkWorld a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - How ASLR protects Linux systems from buffer overflow attacks - Network World" ; + d3f:has-link "https://www.networkworld.com/article/3331199/what-does-aslr-do-for-linux.html"^^xsd:anyURI ; + d3f:kb-abstract "ASLR (Address Space Layout Randomization) is a memory exploitation mitigation technique used on both Linux and Windows systems. Learn how to tell if it's running, enable/disable it, and get a view of how it works." ; + d3f:kb-author "Sandra Henry-Stocker" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Network World" ; + d3f:kb-reference-of d3f:SegmentAddressOffsetRandomization ; + d3f:kb-reference-title "How ASLR protects Linux systems from buffer overflow attacks" . + +d3f:Reference-HowDoesAntivirusQuarantineWork-SafetyDetectives a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - How Does Antivirus Quarantine Work? - Safety Detectives" ; + d3f:has-link "https://www.safetydetectives.com/blog/how-does-antivirus-quarantine-work/"^^xsd:anyURI ; + d3f:kb-abstract "Your antivirus has just finished a regular scan and it’s asking whether you want to quarantine the virus it’s found. You click ‘yes’ without putting much thought into what’s actually happening. But what does quarantining actually mean, what does it do and is it safe for your computer? It’s important to understand the details so that you know what’s happening when you send infected files into quarantine." ; + d3f:kb-author "Katarina Glamoslija" ; + d3f:kb-reference-title "How Does Antivirus Quarantine Work?" . + +d3f:Reference-HowToChangeRegistryValuesOrPermissionsFromACommandLineOrAScript a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - How to change registry values or permissions from a command line or a script" ; + d3f:has-link "https://docs.microsoft.com/en-us/troubleshoot/windows-client/application-management/change-registry-values-permissions"^^xsd:anyURI ; + d3f:kb-abstract """This article describes how to change registry values or permissions from a command line or a script. + +Applies to: Windows 10 - all editions, Windows Server 2012 R2 +Original KB number: 264584""" ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-title "How to change registry values or permissions from a command line or a script" . + +d3f:Reference-HowTrustRelationshipsWorkForResourceForestsInAzureActiveDirectoryDomainServices a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - How trust relationships work for resource forests in Azure Active Directory Domain Services" ; + d3f:has-link "https://docs.microsoft.com/en-us/azure/active-directory-domain-services/concepts-forest-trust"^^xsd:anyURI ; + d3f:kb-abstract "Active Directory Domain Services (AD DS) provides security across multiple domains or forests through domain and forest trust relationships. Before authentication can occur across trusts, Windows must first check if the domain being requested by a user, computer, or service has a trust relationship with the domain of the requesting account." ; + d3f:kb-author "Microsoft" ; + d3f:kb-reference-of d3f:DomainTrustPolicy ; + d3f:kb-reference-title "How trust relationships work for resource forests in Azure Active Directory Domain Services" . + +d3f:Reference-IEEE-802_1AB-2016 a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - IEEE Standard for Local and Metropolitan Area Networks - Station and Media Access Control Connectivity Discovery" ; + d3f:has-link "https://standards.ieee.org/ieee/802.1AB/6047/"^^xsd:anyURI ; + d3f:kb-organization "IEEE" ; + d3f:kb-reference-of d3f:HardwareComponentInventory ; + d3f:kb-reference-title "IEEE Standard for Local and Metropolitan Area Networks - Station and Media Access Control Connectivity Discovery" . + +d3f:Reference-IdentificationAndExtractionOfKeyForensicsIndicatorsOfCompromiseUsingSubject-specificFilesystemViews a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Identification and extraction of key forensics indicators of compromise using subject-specific filesystem views" ; + d3f:has-link "https://patents.google.com/patent/US20200004962A1/en"^^xsd:anyURI ; + d3f:kb-abstract "A stackable filesystem that transparently tracks process file writes for forensic analysis. The filesystem comprises a base filesystem, and an overlay filesystem. Processes see the union of the upper and lower filesystems, but process writes are only reflected in the overlay. By providing per-process views of the filesystem using this stackable approach, a forensic analyzer can record a process's file-based activity-i.e., file creation, deletion, modification. These activities are then analyzed to identify indicators of compromise (IoCs). These indicators are then fed into a forensics analysis engine, which then quickly decides whether a subject (e.g., process, user) is malicious. If so, the system takes some proactive action to alert a proper authority, to quarantine the potential attack, or to provide other remediation. The approach enables forensic analysis without requiring file access mediation, or conducting system event-level collection and analysis, making it a lightweight, and non-intrusive solution." ; + d3f:kb-author "Frederico Araujo; Anne E. Kohlbrenner; Marc Philippe Stoecklin; Teryl Paul Taylor" ; + d3f:kb-reference-title "Identification and extraction of key forensics indicators of compromise using subject-specific filesystem views" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Identifying a denial-of-service attack in a cloud-based proxy service - Cloudfare Inc." ; + d3f:has-link "https://patents.google.com/patent/US8613089B1"^^xsd:anyURI ; + d3f:kb-abstract "A cloud-based proxy service identifies a denial-of-service (DoS) attack including determining that there is a potential DoS attack being directed to an IP address of the cloud-based proxy service; and responsive to determining that there are a plurality of domains that resolve to that IP address, identifying the one of the plurality of domains that is the target of the DoS attack. The domain that is under attack is identified by scattering the plurality of domains to resolve to different IP addresses, where a result of the scattering is that each of those domains resolves to a different IP address, and identifying one of those plurality of domains as the target of the DoS attack by determining that there is an abnormally high amount of traffic being directed to the IP address in which that domain resolves." ; + d3f:kb-author "Lee Hahn Holloway, Srikanth N. Rao, Matthew Browning Prince, Matthieu Philippe Francois Tourne, Ian Gerald Pye, Ray Raymond Bejjani, Terry Paul Rodery, Jr." ; + d3f:kb-organization "Cloudfare Inc." ; + d3f:kb-reference-of d3f:InboundSessionVolumeAnalysis ; + d3f:kb-reference-title "Identifying a denial-of-service attack in a cloud-based proxy service" . + +d3f:Reference-IndirectBranchingCalls a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Indirect Branching Calls" ; + d3f:has-link "https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.1048.1241&rep=rep1&type=pdf"^^xsd:anyURI ; + d3f:kb-abstract """Return-oriented programming (ROP) has become the +primary exploitation technique for system compromise +in the presence of non-executable page protections. ROP +exploits are facilitated mainly by the lack of complete +address space randomization coverage or the presence +of memory disclosure vulnerabilities, necessitating additional ROP-specific mitigations. +In this paper we present a practical runtime ROP exploit prevention technique for the protection of thirdparty applications. Our approach is based on the detection of abnormal control transfers that take place during +ROP code execution. This is achieved using hardware +features of commodity processors, which incur negligible runtime overhead and allow for completely transparent operation without requiring any modifications to +the protected applications. Our implementation for Windows 7, named kBouncer, can be selectively enabled for +installed programs in the same fashion as user-friendly +mitigation toolkits like Microsoft's EMET. The results of +our evaluation demonstrate that kBouncer has low runtime overhead of up to 4%, when stressed with specially +crafted workloads that continuously trigger its core detection component, while it has negligible overhead for +actual user applications. In our experiments with in-thewild ROP exploits, kBouncer successfully protected all +tested applications, including Internet Explorer, Adobe +Flash Player, and Adobe Reader.""" ; + d3f:kb-author """Vasilis Pappas, Michalis Polychronakis, Angelos D. Keromytis +Columbia University""" ; + d3f:kb-organization "Columbia University" ; + d3f:kb-reference-of d3f:IndirectBranchCallAnalysis ; + d3f:kb-reference-title "Transparent ROP Exploit Mitigation using Indirect Branch Tracing" . + +d3f:Reference-InferentialExploitAttemptDetection_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Inferential exploit attempt detection - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US10216934B2/en?oq=US-10216934-B2"^^xsd:anyURI ; + d3f:kb-abstract """A security agent implemented on a monitored computing device is described herein. The security agent is configured to detect an action of interest (AoI) that may be probative of a security exploit and to determine a context in which that AoI occurred. Based on that context, the security agent is further configured to decide whether the AoI is a security exploit and can take preventative action to prevent the exploit from being completed. + +Determining that the AoI includes the security exploit is based at least in part on one or more of: determining that the return address is outside memory previously allocated for an object; determining that the object identifier is associated with a vulnerable object; determining that permissions of the memory region include two or more of read, write, and execute; or determining that the memory region is one page in length. + +Determining that the return address is outside memory previously allocated for an object and the method further including treating code that the return address points to as malicious code.""" ; + d3f:kb-author "Daniel W. Brown; Ion-Alexandru Ionescu; Loren C. Robinson" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:MemoryBoundaryTracking ; + d3f:kb-reference-title "Inferential exploit attempt detection" . + +d3f:Reference-InstantProcessTerminationToolToRecoverControlOfAnInformationHandlingSystem_DellProductsLP a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Instant process termination tool to recover control of an information handling system - Dell Products LP" ; + d3f:has-link "https://patents.google.com/patent/US20060236108A1/en"^^xsd:anyURI ; + d3f:kb-abstract "A method and system for automatic termination of unauthorized malevolent processes operating on an information handling system. A list of authenticated and essential process list is stored on the information handling system. Unauthorized processes not contained on the list can be automatically terminated by the user by invoking the present invention with a single click of a mouse or pointer device on an icon residing on the display screen of the information handling system. The offending processes are immediately terminated without generating a user prompt, which would ordinarily provide sufficient time for the malware to spawn additional offending processes. The present invention also provides significant means to recover control of a malware-infected information handling system in order to use repair tools and utilities. The present invention can be deployed at the time of manufacture of an information handling system or independently installed by a user." ; + d3f:kb-author "Carlton Andrews" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Dell Products LP" ; + d3f:kb-reference-of d3f:ProcessTermination ; + d3f:kb-reference-title "Instant process termination tool to recover control of an information handling system" . + +d3f:Reference-IntegerRangeValidation_SEI a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Integer Range Validation" ; + d3f:has-link "https://resources.sei.cmu.edu/downloads/secure-coding/assets/sei-cert-c-coding-standard-2016-v01.pdf"^^xsd:anyURI ; + d3f:kb-organization "Software Engineering Institute" ; + d3f:kb-reference-of d3f:IntegerRangeValidation ; + d3f:kb-reference-title "SEI CERT C Coding Standard" . + +d3f:Reference-IntegrityAssuranceThroughEarlyLoadingInTheBootPhase_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Integrity assurance through early loading in the boot phase - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170061127A1"^^xsd:anyURI ; + d3f:kb-abstract "Techniques utilizing library and pre-boot components to ensure that a driver associated with a kernel-mode component is initialized before other drivers during a boot phase are described herein. The library component is processed during a boot phase; the pre-boot component, which may be an alternative to the library component, is processed during a pre-boot phase. By ensuring that the driver is the first driver initialized, the components enable the driver to launch the kernel-mode component before other drivers are initialized. The library component may also determine whether another driver is to be initialized before the kernel-mode component driver, may ensure that kernel-mode component driver is initialized first, and may alert the kernel-mode component. Also, the library component may retrieve information that is to be deleted by the operating system before initialization of drivers and may provide that information to the kernel-mode component." ; + d3f:kb-author "Ion-Alexandru Ionescu" ; + d3f:kb-mitre-analysis """To compromise software or to gain control of a host device, a security exploit can modify driver initialization order used by an operating system and place a driver associated with the security exploit first in a list of drivers initialized by the operating system. + +This patent describes ensuring that a driver associated with the agent is initialized first. To ensure the driver is initialized first, a dependent DLL associated with the driver is configured to be processed before other dependent DLLs. The dependent DLL can be configured to be processed first by various methods, for example if processing is done in alphabetical order, changing its name to be processed first. The dependent DLL, once processed, executes a number of operations to ensure the driver associated with the agent is initialized first. Furthermore, if the initialization order is modified, an alert is provided to the kernel-mode component that notifies the kernel-mode component it was not first and the order had to be altered. It can then take additional actions such as additional monitoring or remediation.""" ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:DriverLoadIntegrityChecking ; + d3f:kb-reference-title "Integrity assurance through early loading in the boot phase" . + +d3f:Reference-IntrusionDetectionUsingAHeartbeat_SophosLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Intrusion detection using a heartbeat - Sophos Ltd" ; + d3f:has-link "https://patents.google.com/patent/US20180191752A1"^^xsd:anyURI ; + d3f:kb-abstract "A variety of techniques are disclosed for detection of advanced persistent threats and similar malware. In one aspect, the detection of certain network traffic at a gateway is used to trigger a query of an originating endpoint, which can use internal logs to identify a local process that is sourcing the network traffic. In another aspect, an endpoint is configured to periodically generate and transmit a secure heartbeat, so that an interruption of the heartbeat can be used to signal the possible presence of malware. In another aspect, other information such as local and global reputation information is used to provide context for more accurate malware detection." ; + d3f:kb-author "Kenneth D. Ray" ; + d3f:kb-mitre-analysis """This patent describes a health monitor deployed on an endpoint that uses a heartbeat to periodically communicate status to a gateway's remote health monitor. The endpoint health monitor issues a heartbeat for satisfactory status of the endpoint using factors such as: + +* checking the status of individual software items executing on the endpoint +* checking that antivirus and other security software is up to date (e. g., with current virus definition files) and running correctly +* checking the integrity of cryptographic key stores +* checking other hardware or software components of the endpoint as necessary or helpful for health monitoring + +A disappearance of the heartbeat from the endpoint may indicate that the endpoint has been compromised.""" ; + d3f:kb-organization "Sophos Ltd" ; + d3f:kb-reference-of d3f:EndpointHealthBeacon ; + d3f:kb-reference-title "Intrusion detection using a heartbeat" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Isolation of applications within a virtual machine - Bromium, Inc." ; + d3f:has-link "https://patents.google.com/patent/US9921860B1"^^xsd:anyURI ; + d3f:kb-abstract "Approaches for launching an application within a virtual machine. In response to receiving a request to launch an application, a device instantiates, without human intervention and based on a policy, a virtual machine in which the application is to be launched. The policy determines which resources of a device, such as a mobile device or computer system, are accessible to the virtual machine. The policy may, but need not, determine whether the virtual machine has access to a type of resource which obligates the user of the device to make a monetary payment for the user of the resource." ; + d3f:kb-author "Gaurav Banga, Sergei Vorobiev, Deepak Khajuria, Vikram Kapoor, Ian Pratt, Simon Crosby, Adrian Taylor" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Bromium, Inc." ; + d3f:kb-reference-of d3f:Hardware-basedProcessIsolation ; + d3f:kb-reference-title "Isolation of applications within a virtual machine" . + +d3f:Reference-LUKS1On-DiskFormatSpecificationVersion1.2.3 a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - LUKS1 On-Disk Format SpecificationVersion 1.2.3" ; + d3f:has-link "https://mirrors.edge.kernel.org/pub/linux/utils/cryptsetup/LUKS_docs/on-disk-format.pdf"^^xsd:anyURI ; + d3f:kb-abstract "LUKS is short for \"Linux Unified Key Setup\". It has initially been developed to remedy the unpleasantness a user experienced that arise from deriving the encryption setup from changing user space, and forgotten command line arguments. The result of this changes are an unaccessible encryption storage. The reason for this to happen was, a unstandardised way to read, process and set up encryption keys, and if the user was unlucky, he upgraded to an incompatible version of user space tools that needed a good deal of knowledge to use with old encryption volumes." ; + d3f:kb-author "Clemens Fruhwirth" ; + d3f:kb-reference-of d3f:DiskEncryption ; + d3f:kb-reference-title "LUKS1 On-Disk Format SpecificationVersion 1.2.3" . + +d3f:Reference-LeverageSecurityFrameworksLibraries_OWASP a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Leverage Security Frameworks and Libraries - OWASP" ; + d3f:has-link "https://top10proactive.owasp.org/archive/2018/c2-leverage-security-frameworks-libraries/"^^xsd:anyURI ; + d3f:kb-organization "OWASP" ; + d3f:kb-reference-of d3f:TrustedLibrary ; + d3f:kb-reference-title "Leverage Security Frameworks and Libraries" . + +d3f:Reference-MGT516ManagingSecurityVulnerabilitiesEnterpriseAndCloud a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - MGT516: Managing Security Vulnerabilities: Enterprise and Cloud" ; + d3f:has-link "https://www.sans.org/cyber-security-courses/managing-enterprise-cloud-security-vulnerabilities/"^^xsd:anyURI ; + d3f:kb-abstract "Vulnerability, patch, and configuration management are not new security topics. In fact, they are some of the oldest security functions. Yet, we still struggle to manage these capabilities effectively. The quantity of outstanding vulnerabilities for most large organizations is overwhelming, and all organizations struggle to keep up with the never-ending onslaught of new vulnerabilities in their infrastructure and applications. When you add in the cloud and the increasing speed with which all organizations must deliver systems, applications, and features to both their internal and external customers, security may seem unachievable. This course will show you the most effective ways to mature your vulnerability management program and move from identifying vulnerabilities to successfully treating them. 16 Cyber42 and lab exercises" ; + d3f:kb-author "Jonathan Risto and David Hazar" ; + d3f:kb-organization "SANS" ; + d3f:kb-reference-of d3f:OperationalRiskAssessment ; + d3f:kb-reference-title "MGT516: Managing Security Vulnerabilities: Enterprise and Cloud" . + +d3f:Reference-MaliciousRelayDetectionOnNetworks_VECTRANETWORKSInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Malicious relay detection on networks - VECTRA NETWORKS Inc" ; + d3f:has-link "https://patents.google.com/patent/US20150264083A1"^^xsd:anyURI ; + d3f:kb-abstract "A system and method for detecting malicious relay communications is disclosed. Network communications can be received and analyzed using such network components as a network switch. The received traffic can be parsed into sessions. Relay metadata can be extracted from the sessions and further be used to categorize the sessions into one or more types of relay metadata behaviors. Once a significant amount of sessions are detected an alarm may be triggered and/or alarm data may be generated for analysis by network security administrators." ; + d3f:kb-author "Ryan James PRENGER; Nicolas BEAUCHESNE; Karl Matthew LYNN" ; + d3f:kb-mitre-analysis "This patent describes a technique for detecting relay networks, i.e. an attacker outside of the organization's network takes control of an internal host to be used as a source of attacks against other internal targets or exfiltrate data out of the organization. In this defensive technique, metadata from collected network packet captures is extracted to categorize network sessions using known relay behaviors. Information such as the number of bytes sent to and from a potential internal relay host, time of session initiation, packet contents, packet size, flow direction, and packet arrival time statistics are used to categorize the sessions and identify relay behavior. This technique assumes that relay network connections' inter-packet arrival times exhibit a high degree of variance in comparison to standard client-to-server connections. If enough evidence of relay behavior is gathered about a given internal host, the host is identified as suspicious and an alert is generated." ; + d3f:kb-organization "VECTRA NETWORKS Inc" ; + d3f:kb-reference-of d3f:RelayPatternAnalysis ; + d3f:kb-reference-title "Malicious relay detection on networks" . + +d3f:Reference-MalwareAnalysisSystem_PaloAltoNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Malware analysis system - Palo Alto Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US20150319136A1"^^xsd:anyURI ; + d3f:kb-abstract "In some embodiments, a malware analysis system includes receiving a potential malware sample from a firewall; analyzing the potential malware sample using a virtual machine to determine if the potential malware sample is malware; and automatically generating a signature if the potential malware sample is determined to be malware. In some embodiments, the potential malware sample does not match a preexisting signature, and the malware is a zero-day attack." ; + d3f:kb-author "Huagang Xie; Xinran Wang; Jiangxia Liu" ; + d3f:kb-mitre-analysis "This patent describes a VM sandbox environment that uses heuristic based analysis techniques performed in real-time during a file transfer to determine if the file is malicious. A new signature can then be generated and distributed to automatically block future file transfer requests to download the malicious file." ; + d3f:kb-organization "Palo Alto Networks Inc" ; + d3f:kb-reference-of d3f:DynamicAnalysis ; + d3f:kb-reference-title "Malware analysis system" . + +d3f:Reference-MalwareDetectionInEventLoops_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Malware detection in event loops - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US20190205530A1"^^xsd:anyURI ; + d3f:kb-abstract "Example techniques locate or identify malware based on events from or at monitored computing devices. A control unit can detect a sequence of events of various types. The control unit can locate a loop within the sequence of events based at least in part on relative frequencies of the event types. The control unit can determine a distribution of event types of the events within the loop, and determining that software running the sequence is associated with malware based at least in part on the distribution of event types within the loop. In some examples, the control unit can locate a point of commonality among a plurality of stack traces associated with respective events within the loop. The control unit can determine a malware module comprising the point of commonality." ; + d3f:kb-author "Daniel W. Brown" ; + d3f:kb-mitre-analysis "The patent describes determining if a sequence of events associated with a process are associated with malware. Based on the relative frequency of events, a loop within a sequence of events is located and a distribution of the events within the loop is determined. The distribution of events is then compared against a catalog of distributions to determine if it is associated with malware." ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:SystemCallAnalysis ; + d3f:kb-reference-title "Malware detection in event loops" . + +d3f:Reference-MethodAndApparatusForDetectingMaliciousWebsites_EndgameInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and Apparatus for Detecting Malicious Websites - Endgame Inc" ; + d3f:has-link "https://patents.google.com/patent/US20140331319A1"^^xsd:anyURI ; + d3f:kb-abstract "A method and apparatus for detecting malicious websites is disclosed." ; + d3f:kb-author "John Burnet MUNRO, IV; Jason Aaron Trost; Zachary Daniel HANIF" ; + d3f:kb-mitre-analysis """This patent describes a domain classification engine on the host computer that analyzes URLs clicked by a user or entered into a web browser to visit a website. URL analysis is done by using a combination of techniques: + +* Feature extraction: A URL is analyzed against features associated with suspicious URLs such as % of longest consecutive digits in a subdomain, % of longest repeated characters in a subdomain, % of vowels in a high level domain. + +* Markov analysis: The probability of a digit occurring in normal language given the preceding two digits is determined. For example, if the received URL is google.com, the probability of a 'g' occurring at the beginning of a word, the probability of an 'o' occurring after a "g, the probability of an "o' occurring after a 'g' and "o, and so forth will be determined. The probability of each digit is then multiplied to get a probability for the whole domain name. Probabilities are determined based on a database of existing usage, such as a dictionary, or a list of known good domain names + +* Domain names are compared against an existing dataset of known unauthorized domain names. + +A rating is developed based on the results of these techniques, and if the rating is over a set threshold, an action is taken such as blocking access or generating an alert.""" ; + d3f:kb-organization "Endgame Inc" ; + d3f:kb-reference-of d3f:URLAnalysis ; + d3f:kb-reference-title "Method and Apparatus for Detecting Malicious Websites" . + +d3f:Reference-MethodAndApparatusForIncreasingTheSpeedAtWhichComputerVirusesAreDetected_McAfeeLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and apparatus for increasing the speed at which computer viruses are detected - McAfee LLC" ; + d3f:has-link "https://patents.google.com/patent/US5502815A"^^xsd:anyURI ; + d3f:kb-abstract "The method and apparatus for increasing the speed at which computer viruses are detected stores initial state information concerning the file or volume which is being examined for a virus. This information is stored in a cache in a non-volatile storage medium and when files are subsequently scanned for viruses, the current state information is compared to the initial state information stored in the cache. If the initial state information differs from the current state information then the file or volume is scanned for viruses which change the state information of the file or volume. If the initial state information and current state information is the same then the file or volume is scanned for a subset of viruses which do not change the state information." ; + d3f:kb-author "Paul D. Cozza" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "McAfee LLC" ; + d3f:kb-reference-of d3f:ExecutableDenylisting ; + d3f:kb-reference-title "Method and apparatus for increasing the speed at which computer viruses are detected" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and apparatus for utilizing a token for resource access - Rsa Security Inc." ; + d3f:has-link "https://patents.google.com/patent/US5657388A/en"^^xsd:anyURI ; + d3f:kb-abstract "A method and apparatus for utilizing a token which is preferably a \"dumb token\" to provide secure access by authorized users to a selected resource. The token stores a secret user code in machine readable form, which code is read by a token processor. The token processor also receives a time-varying value and an algorithm, both of which may be stored or generated at either the token or the token processor and preferably a secret personal identification code which may be inputted at the token, but is preferably inputted at the token processor. The secret user code, time-varying value and secret personal identification code are then algorithmically combined by the algorithm, preferably in the token processor, to generate a one-time nonpredictable code which is transmitted to a host processor. The host processor utilizes the received one-time nonpredictable code to determine if the user is authorized access to the resource and grants access to the resource if the user is determined to be authorized. The system may be modified to operate in query/response mode. The token processor may be any of a variety of available portable remote processors or may be a device such as a telephone which is equipped with card or other token reader and with processing capability." ; + d3f:kb-author "Kenneth P. Weiss" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Rsa Security Inc." ; + d3f:kb-reference-of d3f:Multi-factorAuthentication ; + d3f:kb-reference-title "Method and apparatus for utilizing a token for resource access" . + +d3f:Reference-MethodAndSystemForControllingCommunicationPorts a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for controlling communication ports" ; + d3f:has-link "https://patents.google.com/patent/US8566924"^^xsd:anyURI ; + d3f:kb-abstract "A method for limiting devices and controlling the applications executed from USB ports on personal computers (PCs)." ; + d3f:kb-author "Steven V Bacastow" ; + d3f:kb-organization "OL Security LLC" ; + d3f:kb-reference-of d3f:IOPortRestriction ; + d3f:kb-reference-title "Method and system for controlling communication ports" . + +d3f:Reference-MethodAndSystemForDetectingAlgorithm-generatedDomains_VECTRANETWORKSInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for detecting algorithm-generated domains - VECTRA NETWORKS Inc" ; + d3f:has-link "https://patents.google.com/patent/US20150264070A1"^^xsd:anyURI ; + d3f:kb-abstract "A method and system for detecting algorithm-generated domains (AGDs) is disclosed wherein domain names requested by an internal host are categorized or classified using curated data sets, active services (e.g. Internet services), and certainty scores to match domain names to domain names or IP addresses used by command and control servers." ; + d3f:kb-author "James Patrick HARLACHER; Aditya Sood; Oskar Ibatullin" ; + d3f:kb-mitre-analysis """This patent describes detecting algorithm generated domains (AGD). DNS requests and responses are analyzed by first checking whether the domain matches existing data sets that specify different types of AGDs with known characteristics, such as Evil Twin Domains, Sinkholed domains, sleeper cells, ghost domains, parked domains, and/or bulk-registered domains. In addition to comparing domains against known data sets, the following information is collected to perform analysis: + +* IP Information: checks for information known about the IP addresses returned in the DNS response, including the number of IP addresses returned, the registered owners of the IP addresses, or different IP addresses returned for the same domain (IP fluxing) +* Domain Registration: examines the domain registration date, domain update date, domain expiration date, registrant identity, and authorized name servers associated with a specific domain name. +* Domain Popularity: provides information on the popularity of a domain name. + +Based on analysis of these factors a score is developed; if the score is above a certain threshold, an alert is generated.""" ; + d3f:kb-organization "VECTRA NETWORKS Inc" ; + d3f:kb-reference-of d3f:DNSTrafficAnalysis ; + d3f:kb-reference-title "Method and system for detecting algorithm-generated domains" . + +d3f:Reference-MethodAndSystemForDetectingExternalControlOfCompromisedHosts_VECTRANETWORKSInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for detecting external control of compromised hosts - VECTRA NETWORKS Inc" ; + d3f:has-link "https://patents.google.com/patent/US9407647B2/en?oq=US-9407647-B2"^^xsd:anyURI ; + d3f:kb-abstract "A detection engine may be implemented by receiving network traffic and processing the traffic into one or more session datasets. Sessions not initiated by an internal host may be discarded. The frequency between the communication packets from the internal host to external host may be grouped or processed into rapid-exchange instances. The number of rapid-exchange instances, the time intervals between them, and/or the rhythm and directions of the initiation of the instances may be analyzed to determine that a human actor is manually controlling the external host. In some embodiments, when it is determined that only one human actor is involved, alarm data may be generated that indicates that a network intrusion involving manual remote control has occurred or is underway." ; + d3f:kb-author "Nicolas BEAUCHESNE; Ryan James PRENGER" ; + d3f:kb-mitre-analysis "This patent describes detecting an external attacker taking remote control of an internal host. Detection includes identifying sessions where the external host controls the internal host in the opposite direction the session was initiated. The number of rapid-exchange communication instances (i.e, communications that occur between the two hosts with little silence gap), the time intervals between them, and/or the rhythm and direction of the instances, are analyzed to determine if an external human actor is manually controlling the internal host." ; + d3f:kb-organization "VECTRA NETWORKS Inc" ; + d3f:kb-reference-of d3f:RemoteTerminalSessionDetection ; + d3f:kb-reference-title "Method and system for detecting external control of compromised hosts" . + +d3f:Reference-MethodAndSystemForDetectingMaliciousPayloads_VectraNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for detecting malicious payloads - Vectra Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/EP3293937A1/en?oq=EP-3293937-A1"^^xsd:anyURI ; + d3f:kb-abstract """Disclosed is an improved method, system, and computer program product for identifying malicious payloads. The disclosed approach identifies potentially malicious payload exchanges which may be associated with payload injection or root-kit magic key usage. + +Some examples of data inputs: + Information for clients and servers, such as IP address and host information + Payloads for both clients and servers + Amount of data being transferred + Duration of communications + Length of time delay between client request and server response""" ; + d3f:kb-author "Nicolas Beauchesne; John Steven Mancini" ; + d3f:kb-mitre-analysis "Extraction of network flow data and using unsupervised machine learning to create a standard baseline. During the monitoring phase, abnormal network metadata will result in an alert." ; + d3f:kb-organization "Vectra Networks Inc" ; + d3f:kb-reference-of d3f:Client-serverPayloadProfiling ; + d3f:kb-reference-title "Method and system for detecting malicious payloads" . + +d3f:Reference-MethodAndSystemForDetectingRestrictedContentAssociatedWithRetrievedContent_SophosLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for detecting restricted content associated with retrieved content - Sophos Ltd" ; + d3f:has-link "https://patents.google.com/patent/US20160359883A1"^^xsd:anyURI ; + d3f:kb-abstract "In embodiments of the present invention improved capabilities are described for detecting restricted content associated with retrieved content. The method and system may include receiving a client request for content, saving contextual information from the client request, presenting retrieved content in response to the client request, and presenting the contextual information from the client request, and retrieved content, to a scanning facility. The scanning facility may utilize the contextual information from the client request to aid in the detection of restricted content associated with retrieved content." ; + d3f:kb-author "Fraser Howard; Paul Baccas; Vanja Svajcer; Benjamin John Godwood; William James McCourt" ; + d3f:kb-mitre-analysis "This patent describes analyzing contextual information of a Uniform Resource Identifier (URI), such as source or origin of the request URI, patterns in the way the URI is delivered, and the locale of the URI. The contextual information is sent to a scanning facility which uses that information along with a blacklist of known malicious domain names, locations, patterns, etc. to block retrieved content associated with the request URI." ; + d3f:kb-organization "Sophos Ltd" ; + d3f:kb-reference-of d3f:URLAnalysis ; + d3f:kb-reference-title "Method and system for detecting restricted content associated with retrieved content" . + +d3f:Reference-MethodAndSystemForDetectingSuspiciousAdministrativeActivity_VectraNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for detecting suspicious administrative activity - Vectra Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US20180077186A1"^^xsd:anyURI ; + d3f:kb-abstract "Disclosed is an improved approach for identifying suspicious administrative host activity within a network. Network traffic is examined to learn the behavior of hosts within a network. This provides an effective way of determining whether or not a host is performing suspicious activity over an administrative protocol." ; + d3f:kb-author "Nicolas Beauchesne; Kevin Song-Kai Ni" ; + d3f:kb-mitre-analysis "Collect network traffic metadata directed at administrative services over a period of time to establish a baseline. This baseline is then used to determine suspicious activity that falls outside of the established baseline." ; + d3f:kb-organization "Vectra Networks Inc" ; + d3f:kb-reference-of d3f:AdministrativeNetworkActivityAnalysis ; + d3f:kb-reference-title "Method and system for detecting suspicious administrative activity" . + +d3f:Reference-MethodAndSystemForDetectingThreatsUsingMetadataVectors_VECTRANETWORKSInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for detecting threats using metadata vectors - VECTRA NETWORKS Inc" ; + d3f:has-link "https://patents.google.com/patent/US20160191551A1"^^xsd:anyURI ; + d3f:kb-abstract "An approach for detecting network attacks using metadata vectors may initially involve receiving network communications or packets, extracting metadata items from the packets. The metadata items describe the communications without requiring deep content inspection of the data payload or contents. The communications may be clustered into groups using the metadata items. If a cluster exceeds a threshold, an alarm may be generated." ; + d3f:kb-author "Nicolas BEAUCHESNE; David Lopes Pegna; Karl Lynn" ; + d3f:kb-mitre-analysis "This patent describes detecting network threats by first passively collecting network traffic and storing it for processing. Metadata from network traffic such as packet header information or information about a session (ex. time between request/responses) is extracted. After the metadata is extracted, the data is grouped into cluster maps of matching events to track how many instances of a network communication have occurred, such as five requests sent and five responses received. Threshold limits are set on the clusters to monitor them and if a cluster grows too large (ex. ten instances of requests and responses) this can correspond to unauthorized behavior. This method might detect, for example, a network attack using malicious payloads with automated scripts, in which a bot sends replicated malicious payloads to the same destination port." ; + d3f:kb-organization "VECTRA NETWORKS Inc" ; + d3f:kb-reference-of d3f:ProtocolMetadataAnomalyDetection ; + d3f:kb-reference-title "Method and system for detecting threats using metadata vectors" . + +d3f:Reference-MethodAndSystemForDetectingThreatsUsingPassiveClusterMapping_VectraNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for detecting threats using passive cluster mapping - Vectra Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US20160149936A1"^^xsd:anyURI ; + d3f:kb-abstract "An approach for detecting network threats is disclosed, that may involve receiving network traffic, plotting the network traffic in a n-dimensional feature space to form a network map, generating a client signature at least by placing new client points in the map, setting a threshold, and generating an alarm if one or more client activity points exceed the threshold. In some embodiments, the network map and the client signature are updated using sliding windows and distance calculations." ; + d3f:kb-author "David Lopes PEGNA; Nicolas Beauchesne" ; + d3f:kb-mitre-analysis "This patent describes detecting network threats by first passively collecting network traffic and storing it for processing. The stored network traffic data is used to map network events to create a cluster map. Events are network activity associated with clients, servers, or control modules such as a Kerberos Domain Controller (KDC); account information; services accessed by the client; or the number of times a service is accessed. Events that exceed a threshold from a center of gravity point of a cluster are identified as suspicious activity and an alert is generated." ; + d3f:kb-organization "Vectra Networks Inc" ; + d3f:kb-reference-of d3f:ProtocolMetadataAnomalyDetection ; + d3f:kb-reference-title "Method and system for detecting threats using passive cluster mapping" . + +d3f:Reference-MethodAndSystemForProvidingSoftwareUpdatesToLocalMachines a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for providing software updates to local machines" ; + d3f:has-link "https://patents.google.com/patent/US10474448B2/en"^^xsd:anyURI ; + d3f:kb-author "John Melton Reynolds" ; + d3f:kb-organization "Sophos Ltd" ; + d3f:kb-reference-title "Method and system for providing software updates to local machines" . + +d3f:Reference-MethodAndSystemForUDPFloodAttackDetection-RioreyLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and system for UDP flood attack detection - Riorey LLC" ; + d3f:has-link "https://patents.google.com/patent/US8307430B1"^^xsd:anyURI ; + d3f:kb-abstract "A system and method is provided to identify UDP attacks. A processor determines a spectral density of packet timing intervals, a natural distance between the spectral density and a uniform distribution, and a non-linear amplifier applying a non-linear amplification to the natural distance to detect a denial-of-service attack. It uses the concept of traffic statistics analysis, i.e., spectral densities of arrived-packet timing intervals, calculates the KL-distance measurement and makes decision based on the output of a non-linear Gaussian amplifier, with which one can easily adjust the amplifier via selecting different parameters of mean and variance to satisfy system requirements of false-positive and false-negative UDP attack detections." ; + d3f:kb-author "Hongda Chen, Lijin Lu" ; + d3f:kb-reference-of d3f:InboundSessionVolumeAnalysis ; + d3f:kb-reference-title "Method and system for UDP flood attack detection" . + +d3f:Reference-MethodForFileEncryption a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method for file encryption" ; + d3f:has-link "https://patents.google.com/patent/US9521123B2/en"^^xsd:anyURI ; + d3f:kb-abstract "A method for encryption and sealing of a plaintext file by hashing the plaintext file to produce a plaintext hash, encrypting the plaintext file to produce ciphertext, hashing the ciphertext to produce a ciphertext hash, hashing the plaintext hash and the ciphertext hash to produce a result hash, and sealing the ciphertext together with the result hash." ; + d3f:kb-author "Robert R. Jueneman, Duane J. LINSENBARDT, John N. Young, William Reid Carlisle, Burton George Tregub" ; + d3f:kb-organization "New Kailung Gear Co Ltd" ; + d3f:kb-reference-of d3f:FileEncryption ; + d3f:kb-reference-title "Method for file encryption" . + +d3f:Reference-MethodUsingKernelModeAssistanceForTheDetectionAndRemovalOfThreatsWhichAreActivelyPreventingDetectionAndRemovalFromARunningSystem_SymantecCorporation a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method using kernel mode assistance for the detection and removal of threats which are actively preventing detection and removal from a running system - Symantec Corporation" ; + d3f:has-link "https://patents.google.com/patent/US8239947B1"^^xsd:anyURI ; + d3f:kb-abstract "A user mode application component invokes the assistance of a kernel mode driver component to detect and/or remediate malicious code on a computer system. The user mode application may include code that detects, for example, spyware and computer viruses, from user mode and when appropriate takes protective action when malicious code is detected. In one aspect, when the user mode application is unable to perform a selected operation in attempting to detect and/or take protective action, the user mode application invokes a kernel mode driver for assistance. The kernel mode driver assists user mode application in detecting malicious code and/or taking protective action by enabling or otherwise performing a selected operation for the user mode application." ; + d3f:kb-author "Adam Glick, Patrick Gardner, Pieter Viljoen" ; + d3f:kb-mitre-analysis "This patent describes detecting registry changes using a prohibited change heuristic or a database of prohibited functions/function parameters." ; + d3f:kb-organization "Symantec Corporation" ; + d3f:kb-reference-of d3f:SystemDaemonMonitoring ; + d3f:kb-reference-title "Method using kernel mode assistance for the detection and removal of threats which are actively preventing detection and removal from a running system" . + +d3f:Reference-MissionDependencyModelingForCyberSituationalAwareness a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Mission Dependency Modeling for Cyber Situational Awareness" ; + d3f:has-link "https://csis.gmu.edu/noel/pubs/2016_NATO_IST_148.pdf"^^xsd:anyURI ; + d3f:kb-abstract "This paper describes a hierarchical graph-based model that captures mission dependencies at various levels of abstraction, showing interdependencies among mission objectives, tasks, information, and cyber assets. For this work, we employ established tools within a structured methodology for cyber resiliency analysis. Our model is focused on a strategic-level military scenario defined in a formal Request for Information (RFI) to industry and research partners by the NATO Multinational Cyber Defense Capability Development (MN CD2) Work Package 2 (WP2). We enhance this scenario with additional mission and operational context, and then build a mission dependency model for the enhanced scenario. It is anticipated that our mission dependency model will be part of an upcoming demonstration of cyber defense situational awareness capabilities in a NATO Communications and Information (NCI) Agency test environment, integrated with data sources that represent the operational military environment." ; + d3f:kb-author "William Heinbockel, Steven Noel, James Curbo" ; + d3f:kb-organization "JHU APL" ; + d3f:kb-reference-of d3f:OperationalDependencyMapping ; + d3f:kb-reference-title "Mission Dependency Modeling for Cyber Situational Awareness" . + +d3f:Reference-MockAttackCybersecurityTrainingSystemAndMethods_WOMBATSECURITYTECHNOLOGIESInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Mock attack cybersecurity training system and methods - WOMBAT SECURITY TECHNOLOGIES Inc" ; + d3f:has-link "https://patents.google.com/patent/US9558677B2/"^^xsd:anyURI ; + d3f:kb-abstract "A training system senses a user action that may expose the user to a threat, such as a cybersecurity threat. The user action may be in response to a mock attack delivered via a messaging service, a wireless communication service, a fake malware application or another device, service, system or mechanism. The system selects a training action from a collection of available training actions and causes the training action to be delivered to the user." ; + d3f:kb-author "Norman Sadeh-Koniecpol, Kurt Wescoe, Jason Brubaker, Jason Hong" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "WOMBAT SECURITY TECHNOLOGIES Inc" ; + d3f:kb-reference-of d3f:DecoyPublicRelease ; + d3f:kb-reference-title "Mock attack cybersecurity training system and methods" . + +d3f:Reference-ModelingUserAccessToComputerResources_DaedalusGroupLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Modeling user access to computer resources - Daedalus Group LLC (formerly IBM)" ; + d3f:has-link "https://patents.google.com/patent/US8214364B2"^^xsd:anyURI ; + d3f:kb-abstract "Embodiments of the invention provide a method for detecting changes in behavior of authorized users of computer resources and reporting the detected changes to the relevant individuals. The method includes evaluating actions performed by each user against user behavioral models and business rules. As a result of the analysis, a subset of users may be identified and reported as having unusual or suspicious behavior. In response, the management may provide feedback indicating that the user behavior is due to the normal expected business needs or that the behavior warrants further review. The management feedback is available for use by machine learning algorithms to improve the analysis of user actions over time. Consequently, investigation of user actions regarding computer resources is facilitated and data loss is prevented more efficiently relative to the prior art approaches with only minimal disruption to the ongoing business processes." ; + d3f:kb-author "Joseph P. Bigus, Leon Gong, Christoph Lingenfelder" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Daedalus Group LLC (formerly IBM)" ; + d3f:kb-reference-of d3f:ResourceAccessPatternAnalysis ; + d3f:kb-reference-title "Modeling user access to computer resources" . + +d3f:Reference-ModificationOfAServerToMimicADeceptionMechanism_AcalvioTechnologiesInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Modification of a Server to Mimic a Deception Mechanism - Acalvio Technologies Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170149825A1"^^xsd:anyURI ; + d3f:kb-abstract "Provided are devices, computer-program products, and methods (e.g., methods implemented by a production system or security agent program or process) for providing services on a production system to mimic a deception mechanism. For example, a method can include determining a deception characteristic of a deception mechanism and determining a production characteristic of the production system. The method can further include determining an additional service or a modification of an existing service of the production system using the deception characteristic and the production characteristic. In some cases, the additional service and/or the modification can be a deterrent to potential attackers of the production system. The method can further include modifying the production system to mimic the deception mechanism, including adding the additional service to the production system or modifying the existing service using the modification." ; + d3f:kb-author "Sreenivas Gukal, Rammohan Varadarajan" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Acalvio Technologies Inc" ; + d3f:kb-reference-of d3f:ConnectedHoneynet ; + d3f:kb-reference-title "Modification of a Server to Mimic a Deception Mechanism" . + +d3f:Reference-Munin a d3f:SourceCodeReference, + owl:NamedIndividual ; + rdfs:label "Reference - Munin" ; + d3f:has-link "https://github.com/Neo23x0/munin"^^xsd:anyURI ; + d3f:kb-author "Florian Roth" ; + d3f:kb-reference-title "Online Hash Checker for Virustotal and Other Services" . + +d3f:Reference-NIST-RMF-Quick-Start-Guide-Assess-Step-FAQ a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - NIST RMF Quick Start Guide - Assess Step - Frequently Asked Questions (FAQ)" ; + d3f:has-link "https://csrc.nist.gov/CSRC/media/Projects/risk-management/documents/05-Assess%20Step/NIST%20RMF%20Assess%20Step-FAQs.pdf"^^xsd:anyURI ; + d3f:kb-abstract "Once security and privacy controls are implemented, they need to be evaluated for correctness and effectiveness. After the initial assessment is completed and the system enters the operations/maintenance phase of the system development life cycle, the controls are assessed on an ongoing basis according to the organization and system’s continuous monitoring plans. The ongoing assessment supports the authorizing official’s decision to continue or discontinue the system’s authorization to operate. Control effectiveness assessments are performed by an independent third-party assessor or assessment team if the system categorization is moderate or high." ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:OperationalRiskAssessment ; + d3f:kb-reference-title "NIST RMF Quick Start Guide - Assess Step - Frequently Asked Questions (FAQ)" . + +d3f:Reference-NIST-Special-Publication-800-160-Volume-1 a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - NIST Special Publication 800-160 Volume 1 - System Security Engineering" ; + d3f:has-link "https://doi.org/10.6028/NIST.SP.800-160v1"^^xsd:anyURI ; + d3f:kb-abstract "With the continuing frequency, intensity, and adverse consequences of cyber-attacks, disruptions, hazards, and other threats to federal, state, and local governments, the military, businesses, and the critical infrastructure, the need for trustworthy secure systems has never been more important to the long-term economic and national security interests of the United States. Engineering-based solutions are essential to managing the growing complexity, dynamicity, and interconnectedness of today’s systems, as exemplified by cyber-physical systems and systems-of-systems, including the Internet of Things. This publication addresses the engineering-driven perspective and actions necessary to develop more defensible and survivable systems, inclusive of the machine, physical, and human components that compose the systems and the capabilities and services delivered by those systems. It starts with and builds upon a set of well-established International Standards for systems and software engineering published by the International Organization for Standardization (ISO), the International Electrotechnical Commission (IEC), and the Institute of Electrical and Electronics Engineers (IEEE) and infuses systems security engineering methods, practices, and techniques into those systems and software engineering activities. The objective is to address security issues from a stakeholder protection needs, concerns, and requirements perspective and to use established engineering processes to ensure that such needs, concerns, and requirements are addressed with appropriate fidelity and rigor, early and in a sustainable manner throughout the life cycle of the system." ; + d3f:kb-author "Ron Ross, Michael McEvilley, and Janet Carrier Oren" ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:OperationalRiskAssessment ; + d3f:kb-reference-title "NIST Special Publication 800-160 Volume 1 - Systems Security Engineering" . + +d3f:Reference-NIST-Special-Publication-800-37-Revision-2 a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - NIST Special Publication 800-37 Revision 2 - Risk Management Framework for Information Systems and Organizations" ; + d3f:has-link "https://doi.org/10.6028/NIST.SP.800-37r2"^^xsd:anyURI ; + d3f:kb-abstract "This publication describes the Risk Management Framework (RMF) and provides guidelines for applying the RMF to information systems and organizations. The RMF provides a disciplined, structured, and flexible process for managing security and privacy risk that includes information security categorization; control selection, implementation, and assessment; system and common control authorizations; and continuous monitoring. The RMF includes activities to prepare organizations to execute the framework at appropriate risk management levels. The RMF also promotes near real-time risk management and ongoing information system and common control authorization through the implementation of continuous monitoring processes; provides senior leaders and executives with the necessary information to make efficient, cost-effective, risk management decisions about the systems supporting their missions and business functions; and incorporates security and privacy into the system development life cycle. Executing the RMF tasks links essential risk management processes at the system level to risk management processes at the organization level. In addition, it establishes responsibility and accountability for the controls implemented within an organization’s information systems and inherited by those systems." ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:OperationalRiskAssessment ; + d3f:kb-reference-title "NIST Special Publication 800-37 Revision 2 - Risk Management Framework for Information Systems and Organizations" . + +d3f:Reference-NISTIR-8011-Volume-1 a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - NISTIR 8011 Volume 1 - Automation Support for Security Control Assessments" ; + d3f:has-link "https://doi.org/10.6028/NIST.IR.8011-1"^^xsd:anyURI ; + d3f:kb-abstract "This volume introduces concepts to support automated assessment of most of the security controls in NIST Special Publication (SP) 800-53. Referencing SP 800-53A, the controls are divided into more granular parts (determination statements) to be assessed. The parts of the control assessed by each determination statement are called control items. The control items are then grouped into the appropriate security capabilities. As suggested by SP 800-53 Revision 4, security capabilities are groups of controls that support a common purpose. For effective automated assessment, testable defect checks are defined that bridge the determination statements to the broader security capabilities to be achieved and to the SP 800-53 security control items themselves. The defect checks correspond to security sub-capabilities-called sub-capabilities because each is part of a larger capability. Capabilities and sub-capabilities are both designed with the purpose of addressing a series of attack steps. Automated assessments (in the form of defect checks) are performed using the test assessment method defined in SP 800-53A by comparing a desired and actual state (or behavior)." ; + d3f:kb-author "Kelley Dempsey, Paul Eavy, and George Moore" ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:OperationalRiskAssessment ; + d3f:kb-reference-title "NIST Interagency Report 8011 Volume 1 - Automation Support for Security Control Assessments" . + +d3f:Reference-Network-BasedBufferOverflowDetectionByExploitCodeAnalysis_InformationSecurityResearchCentre a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Network-Based Buffer Overflow Detection by Exploit Code Analysis - Information Security Research Centre" ; + d3f:has-link "https://eprints.qut.edu.au/21172/1/21172.pdf"^^xsd:anyURI ; + d3f:kb-abstract """Buffer overflow attacks continue to be a major security problem and detecting attacks of this nature +is therefore crucial to network security. Signature based network based intrusion detection systems (NIDS) +compare network traffic to signatures modelling suspicious or attack traffic to detect network attacks. Since +detection is based on pattern matching, a signature modelling the attack must exist for the NIDS to detect it, and +it is therefore only capable of detecting known attacks. This paper proposes a method to detect buffer overflow +attacks by parsing the payload of network packets in search of shellcode which is the remotely executable +component of a buffer overflow attack. By analysing the shellcode it is possible to determine which system +calls the exploit uses, and hence the operation of the exploit. Current NIDS-based buffer overflow detection +techniques mainly rely upon specific signatures for each new attack. Our approach is able to detect previously +unseen buffer overflow attacks, in addition to existing ones, without the need for specific signatures for each +new attack. The method has been implemented and tested for buffer overflow attacks on Linux on the Intel x86 +architecture using the Snort NIDS.""" ; + d3f:kb-author "Stig Andersson, Andrew Clark, and George Mohay" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Information Security Research Centre" ; + d3f:kb-reference-of d3f:ByteSequenceEmulation ; + d3f:kb-reference-title "Network-Based Buffer Overflow Detection by Exploit Code Analysis" . + +d3f:Reference-NetworkMapping a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Network Mapping" ; + d3f:has-link "https://en.wikipedia.org/wiki/Network_mapping"^^xsd:anyURI ; + d3f:kb-author "https://en.wikipedia.org/" ; + d3f:kb-reference-title "Network Mapping" . + +d3f:Reference-NullPointerChecking_SEI a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Null Pointer Checking - SEI" ; + d3f:has-link "https://wiki.sei.cmu.edu/confluence/display/c/EXP34-C.+Do+not+dereference+null+pointers"^^xsd:anyURI ; + d3f:kb-organization "Software Engineering Institute" ; + d3f:kb-reference-of d3f:NullPointerChecking ; + d3f:kb-reference-title "SEI CERT C Coding Standard" . + +d3f:Reference-NullPointerDereference_CWE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - Null Pointer Dereferencing - CWE-476" ; + d3f:has-link "https://cwe.mitre.org/data/definitions/476.html"^^xsd:anyURI ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:NullPointerChecking ; + d3f:kb-reference-title "CWE-476: NULL Pointer Dereference" . + +d3f:Reference-OSQueryWindowsUserCollectionCode a d3f:SourceCodeReference, + owl:NamedIndividual ; + rdfs:label "Reference - OS Query Windows User Collection Code" ; + d3f:has-link "https://github.com/osquery/osquery/blob/d2be385d71f401c85872f00d479df8f499164c5a/osquery/tables/system/windows/users.cpp"^^xsd:anyURI ; + d3f:kb-reference-title "OS Query Windows User Collection Code" . + +d3f:Reference-OpenSourceIntelligenceDeceptions_IllusiveNetworksLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Open source intelligence deceptions - Illusive Networks Ltd" ; + d3f:has-link "https://patents.google.com/patent/US10333976B1/en?assignee=Illusive+Networks+Ltd&oq=Illusive+Networks+Ltd+"^^xsd:anyURI ; + d3f:kb-abstract "A system to detect attackers who attempt to breach an enterprise network and attackers who have already breached the enterprise network, including an open source intelligence (OSINT) discoverer scanning the Internet to discover data related to an enterprise that is available online, an OSINT replacer generating deceptive files by replacing placeholders within template files with deceptive information, based on the data discovered by the OSINT discoverer, an OSINT distributor planting the deceptive files generated by the OSINT replacer within designated OSINT resources, and a deception management server that alerts an administrator in response to an attacker attempting to make a connection within the network using information in a deceptive file planted by the OSINT distributor." ; + d3f:kb-author "Hadar Yudovich; Nimrod Lavi; Sharon Bittan; Tom Kahana; Tom Sela" ; + d3f:kb-mitre-analysis "Seems to focus on configuration oriented files to put in decoy hostnames etc. to publish on internet sites, then monitor the decoy \"objects\"." ; + d3f:kb-organization "Illusive Networks Ltd" ; + d3f:kb-reference-of d3f:DecoyFile ; + d3f:kb-reference-title "Open source intelligence deceptions" . + +d3f:Reference-OrganizationalManagementInSAPERPHCM a d3f:BookReference, + owl:NamedIndividual ; + rdfs:label "Reference - Organizational Management in SAP ERP HCM" ; + d3f:has-link "https://www.sap-press.com/organizational-management-in-sap-erp-hcm_3996/"^^xsd:anyURI ; + d3f:kb-author "Soham Ray" ; + d3f:kb-organization "SAP Press" ; + d3f:kb-reference-of d3f:OrganizationMapping ; + d3f:kb-reference-title "Organization Mapping in SAP ERP HCM" . + +d3f:Reference-OutlierParentsOfCmd_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-11-002: Outlier Parents of Cmd - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-11-002/"^^xsd:anyURI ; + d3f:kb-abstract """Many programs create command prompts as part of their normal operation including malware used by attackers. This analytic attempts to identify suspicious programs spawning cmd.exe by looking for programs that do not normally create cmd.exe. + +While this analytic does not take the user into account, doing so could generate further interesting results. It is very common for some programs to spawn cmd.exe as a subprocess, for example to run batch files or windows commands. However many process don't routinely launch a command prompt - for example Microsoft Outlook. A command prompt being launched from a process that normally doesn't launch command prompts could be the result of malicious code being injected into that process, or of an attacker replacing a legitimate program with a malicious one.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2014-11-002: Outlier Parents of Cmd" . + +d3f:Reference-PointerAuthenticationOnARMv8.3 a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Pointer Authentication on ARMv8.3" ; + d3f:has-link "https://www.qualcomm.com/media/documents/files/whitepaper-pointer-authentication-on-armv8-3.pdf"^^xsd:anyURI ; + d3f:kb-abstract "The pointer authentication scheme introduced by ARM is a software security primitive that makes it much harder for an attacker to modify protected pointers in memory without being detected. In this document, we will provide more details about the Pointer Authentication mechanism, provide a security analysis, and discuss the implementation of certain software security countermeasures, such as stack protection and control flow integrity, using the Pointer Authentication primitives." ; + d3f:kb-author "Qualcomm Technologies, Inc" ; + d3f:kb-organization "Qualcomm Technologies, Inc" ; + d3f:kb-reference-of d3f:PointerAuthentication ; + d3f:kb-reference-title "Pointer Authentication on ARMv8.3" . + +d3f:Reference-PointerAuthenticationProjectZero a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Pointer Authentication Project Zero" ; + d3f:has-link "https://googleprojectzero.blogspot.com/2019/02/examining-pointer-authentication-on.html"^^xsd:anyURI ; + d3f:kb-abstract "In this post I examine Apple's implementation of Pointer Authentication on the A12 SoC used in the iPhone XS, with a focus on how Apple has improved over the ARM standard. I then demonstrate a way to use an arbitrary kernel read/write primitive to forge kernel PAC signatures for the A keys, which is sufficient to execute arbitrary code in the kernel using JOP. The technique I discovered was (mostly) fixed in iOS 12.1.3. In fact, this fix first appeared in the 16D5032a beta while my research was still ongoing." ; + d3f:kb-author "Brandon Azad" ; + d3f:kb-organization "Project Zero, Google, Inc" ; + d3f:kb-reference-of d3f:PointerAuthentication ; + d3f:kb-reference-title "Examining Pointer Authentication on the iPhone XS" . + +d3f:Reference-PostSandboxMethodsAndSystemsForDetectingAndBlockingZero-dayExploitsViaApiCallValidation_K2CyberSecurityInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Post sandbox methods and systems for detecting and blocking zero-day exploits via api call validation - K2 Cyber Security Inc" ; + d3f:has-link "https://patents.google.com/patent/US20190138715A1/"^^xsd:anyURI ; + d3f:kb-abstract "In one aspect, a method useful for monitoring and validating execution of executable binary code, includes the step of disassembling an executable binary code of an application. The method includes the step of detecting and obtaining location and type of an application programming interface (API) call, system call, and privileged instruction that is executed by the executable binary code. The method includes the step of detecting and obtaining return address from an Al call and system call. The method includes the step of validating location of the API call system call, and privileged instruction. The method includes the step of validating return from the API call and system call." ; + d3f:kb-author "Jayant Shukla" ; + d3f:kb-mitre-analysis """The patent describes a technique for monitoring API calls. Executable binary code of an application is first disassembled and scanned for API calls. Based on the recorded API calls, a rule list is generated. Software hooks are placed in the code for monitoring API calls during program execution and then each API call is validated using the generated rule list to permit or deny execution of API calls. + +Rules are created that specify the type and location of the API call. For example, data collected for an application can show an API call to libc at address 0x43e0 and an API call by libc at address 0xlfb47. Accordingly, two rules are generated. The first rule specifies the location type and target of the API call at address 0x43e0, as well as the return address. The second rule is for the API call to the kernel and states the target address, return address, instruction, and target type.""" ; + d3f:kb-organization "K2 Cyber Security Inc" ; + d3f:kb-reference-of d3f:SystemCallAnalysis ; + d3f:kb-reference-title "Post sandbox methods and systems for detecting and blocking zero-day exploits via api call validation" . + +d3f:Reference-PowershellExecution_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-04-003: Powershell Execution - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-04-003/"^^xsd:anyURI ; + d3f:kb-abstract """PowerShell is a scripting environment included with Windows that is used by both attackers and administrators. Execution of PowerShell scripts in most Windows versions is opaque and not typically secured by antivirus which makes using PowerShell an easy way to circumvent security measures. This analytic detects execution of PowerShell scripts. + +Powershell can be used to hide monitored command line execution such as: + +* net use +* sc start""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2014-04-003: Powershell Execution" . + +d3f:Reference-PredictingDomainGenerationAlgorithmsWithLongShort-TermMemoryNetworks_ a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Predicting Domain Generation Algorithms with Long Short-Term Memory Networks" ; + d3f:has-link "https://arxiv.org/abs/1611.007911"^^xsd:anyURI ; + d3f:kb-abstract "Various families of malware use domain generation algorithms (DGAs) to generate a large number of pseudo-random domain names to connect to a command and control (C&C) server. In order to block DGA C&C traffic, security organizations must first discover the algorithm by reverse engineering malware samples, then generating a list of domains for a given seed. The domains are then either preregistered or published in a DNS blacklist. This process is not only tedious, but can be readily circumvented by malware authors using a large number of seeds in algorithms with multivariate recurrence properties (e.g., banjori) or by using a dynamic list of seeds (e.g., bedep). Another technique to stop malware from using DGAs is to intercept DNS queries on a network and predict whether domains are DGA generated. Such a technique will alert network administrators to the presence of malware on their networks. In addition, if the predictor can also accurately predict the family of DGAs, then network administrators can also be alerted to the type of malware that is on their networks. This paper presents a DGA classifier that leverages long short-term memory (LSTM) networks to predict DGAs and their respective families without the need for a priori feature extraction. Results are significantly better than state-of-the-art techniques, providing 0.9993 area under the receiver operating characteristic curve for binary classification and a micro-averaged F1 score of 0.9906. In other terms, the LSTM technique can provide a 90% detection rate with a 1:10000 false positive (FP) rate---a twenty times FP improvement over comparable methods. Experiments in this paper are run on open datasets and code snippets are provided to reproduce the results." ; + d3f:kb-author "Jonathan Woodbridge, Hyrum S. Anderson, Anjum Ahuja, Daniel Grant" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:DNSTrafficAnalysis ; + d3f:kb-reference-title "Predicting Domain Generation Algorithms with Long Short-Term Memory Networks" . + +d3f:Reference-PreventingExecutionOfTaskScheduledMalware_McAfeeLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Preventing execution of task scheduled malware - McAfee LLC" ; + d3f:has-link "https://patents.google.com/patent/US20160105450A1"^^xsd:anyURI ; + d3f:kb-abstract "A method for preventing malware attacks includes the steps of detecting an attempt on an electronic device to access a task scheduler, determining an entity associated with the attempt to access the task scheduler, determining a malware status of the entity, and, based on the malware status of the entity, allowing or denying the attempted access to the task scheduler. The task scheduler is configured to launch one or more applications at a specified time or interval." ; + d3f:kb-author "Anil Ramabhatta, Harinath Vishwanath Ramachetty, Nandi Dharma Kishore" ; + d3f:kb-mitre-analysis "Access to a job scheduler is intercepted using hooking or file filters to identify and analyze the source files, processes, destination files, or destination servers associated with a scheduled job. The identified servers or files associated with a job are compared against an anti-malware signature database or reputation server to determine if it there is a match. If so, execution is denied and an alert is generated." ; + d3f:kb-organization "McAfee LLC" ; + d3f:kb-reference-of d3f:ScheduledJobAnalysis ; + d3f:kb-reference-title "Preventing execution of task scheduled malware" . + +d3f:Reference-PrivacyAndSecuritySystemsAndMethodsOfUse a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Privacy and security systems and methods of use" ; + d3f:has-link "https://patents.google.com/patent/US10128890B2/en"^^xsd:anyURI ; + d3f:kb-author "Teddy David Thomas" ; + d3f:kb-reference-title "Privacy and security systems and methods of use" . + +d3f:Reference-PrivateApplicationAccessWithBrowserIsolation a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Private application access with browser isolation" ; + d3f:has-link "https://patents.google.com/patent/US20210250333A1"^^xsd:anyURI ; + d3f:kb-reference-of d3f:Application-basedProcessIsolation ; + d3f:kb-reference-title "Private application access with browser isolation" . + +d3f:Reference-PrivateVirtualLocalAreaNetworkIsolation_CiscoTechnologyInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Private virtual local area network isolation - Cisco Technology Inc" ; + d3f:has-link "https://patents.google.com/patent/US20120331142A1"^^xsd:anyURI ; + d3f:kb-abstract "In one embodiment, a method includes obtaining addresses of end hosts at a switch, the switch configured with a primary virtual local area network and a secondary virtual local area network, creating a private virtual local area network access list comprising the addresses of end hosts permitted to communicate on the secondary virtual local area network, and applying the private virtual local area network access list to interfaces connected to the end hosts permitted to communicate on the secondary virtual local area network. An apparatus is also disclosed." ; + d3f:kb-author "Anuraag Mittal, Huei-Ping Chen" ; + d3f:kb-organization "Cisco Technology Inc" ; + d3f:kb-reference-of d3f:BroadcastDomainIsolation ; + d3f:kb-reference-title "Private virtual local area network isolation" . + +d3f:Reference-ProcessesSpawningCmd.exe_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-02-003: Processes Spawning cmd.exe - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-02-003/"^^xsd:anyURI ; + d3f:kb-abstract "The Windows Command Prompt (cmd.exe) is a utility that provides a command line interface to Windows operating systems. It provides the ability to run additional programs and also has several built-in commands such as dir, copy, mkdir, and type, as well as batch scripts (.bat). Typically, when a user runs a command prompt, the parent process is explorer.exe or another instance of the prompt. There may be automated programs, logon scripts, or administrative tools that launch instances of the command prompt in order to run scripts or other built-in commands. Spawning the process cmd.exe from certain parents may be more indicative of malice. For example, if Adobe Reader or Outlook launches a command shell, this may suggest that a malicious document has been loaded and should be investigated. Thus, by looking for abnormal parent processes of cmd.exe, it may be possible to detect adversaries." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2013-02-003: Processes Spawning cmd.exe" . + +d3f:Reference-ProtectedComputingEnvironment_MicrosoftTechnologyLicensingLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Protected computing environment - Microsoft Technology Licensing LLC" ; + d3f:has-link "https://patents.google.com/patent/US20060242406A1"^^xsd:anyURI ; + d3f:kb-abstract "A method of establishing a protected environment within a computing device including validating a kernel component loaded into a kernel of the computing device, establishing a security state for the kernel based on the validation, creating a secure process and loading a software component into the secure process, periodically checking the security state of the kernel, and notifying the secure process when the security state of the kernel has changed." ; + d3f:kb-author "Sumedh Barde, Jonathan Schwartz, Reid Kuhn, Alexandre Grigorovitch, Kirt Debique, Chadd Knowlton, James Alkove, Geoffrey Dunbar, Michael Grier, Ming Ma, Chaitanya Upadhyay, Adil Sherwani, Arun Kishan" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Microsoft Technology Licensing LLC" ; + d3f:kb-reference-of d3f:DriverLoadIntegrityChecking ; + d3f:kb-reference-title "Protected computing environment" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Protecting against distributed denial of service attacks - Cisco Technology Inc." ; + d3f:has-link "https://patents.google.com/patent/US7171683B2"^^xsd:anyURI ; + d3f:kb-abstract "A method for authenticating packet communication traffic includes receiving a data packet sent over a network from a source address to a destination address and reading from the packet a value of a field that is indicative of a number of hops traversed by the packet since having been sent from the source address. The authenticity of the source address is assessed responsive to the value." ; + d3f:kb-author "Guy Pazi, Anat Bremler-Bar, Rami Rivlin, Dan Touitou" ; + d3f:kb-organization "Cisco Technologies Inc." ; + d3f:kb-reference-of d3f:InboundSessionVolumeAnalysis ; + d3f:kb-reference-title "Protecting against distributed denial of service attacks" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Protecting against distributed network flood attacks - Juniper Networks Inc." ; + d3f:has-link "https://patents.google.com/patent/US8789173B2"^^xsd:anyURI ; + d3f:kb-abstract "A network security device performs a three-stage analysis of traffic to identify malicious clients. In one example, a device includes an attack detection module to, during a first stage, monitor network connections to a protected network device, during a second stage, to monitor a plurality of types of transactions for the plurality of network sessions when a parameter for the connections exceeds a connection threshold, and during a third stage, to monitor communications associated with network addresses from which transactions of the at least one of type of transactions originate when a parameter associated with the at least one type of transactions exceeds a transaction-type threshold. The device executes a programmed action with respect to at least one of the network addresses when the transactions of the at least one of the plurality of types of transactions originating from the at least one network address exceeds a client-transaction threshold." ; + d3f:kb-author "Krishna Narayanaswamy, Bryan Burns, Venkata Rama Raju Manthena" ; + d3f:kb-organization "Juniper Networks Inc." ; + d3f:kb-reference-of d3f:InboundSessionVolumeAnalysis ; + d3f:kb-reference-title "Protecting against distributed network flood attacks" . + +d3f:Reference-ProtectingWebApplicationsFromUntrustedEndpointsUsingRemoteBrowserIsolation a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Protecting web applications from untrusted endpoints using remote browser isolation" ; + d3f:has-link "https://patents.google.com/patent/US11477248B2/"^^xsd:anyURI ; + d3f:kb-reference-of d3f:Application-basedProcessIsolation ; + d3f:kb-reference-title "Protecting web applications from untrusted endpoints using remote browser isolation" . + +d3f:Reference-PsSuspend a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - PsSuspend - Microsoft" ; + d3f:has-link "https://learn.microsoft.com/en-us/sysinternals/downloads/pssuspend"^^xsd:anyURI ; + d3f:kb-author "Mark Russinovich" ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:ProcessSuspension ; + d3f:kb-reference-title "PsSuspend" . + +d3f:Reference-PublicKeyPinningExtensionForHTTP a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Public Key Pinning Extension for HTTP" ; + d3f:has-link "https://datatracker.ietf.org/doc/html/rfc7469"^^xsd:anyURI ; + d3f:kb-abstract "RFC 7469 describes an HTTP extension that allows web host operators to instruct user agents to remember ('pin') the hosts' cryptographic identities over a period of time. This decreases the risk of MITM attacks due to compromised Certificate Authorities." ; + d3f:kb-author "C. Evans, C. Palmer, R. Sleevi" ; + d3f:kb-organization "Internet Engineering Task Force (IETF)" ; + d3f:kb-reference-of d3f:CertificatePinning ; + d3f:kb-reference-title "Public Key Pinning Extension for HTTP" . + +d3f:Reference-QualysNetworkPassiveSensorGettingStartedGuide a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Qualys Network Passive Sensor Getting Started Guide" ; + d3f:has-link "https://www.qualys.com/passive-scanning-sensor/"^^xsd:anyURI ; + d3f:kb-abstract "Qualys Passive Scanning Sensor (PS) continuously monitors all network traffic and flags any asset activity. It identifies and profiles devices the moment they connect to the network, including those difficult to scan, corporate owned, brought by employees, and rogue IT. The data is sent immediately to the Qualys Cloud Platform for centralized analysis." ; + d3f:kb-organization "Qualys" ; + d3f:kb-reference-of d3f:HardwareComponentInventory, + d3f:NetworkNodeInventory ; + d3f:kb-reference-title "Qualys Network Passive Sensor Getting Started Guide" . + +d3f:Reference-QuickExecutionOfASeriesOfSuspiciousCommands_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-04-002: Quick execution of a series of suspicious commands - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-04-002/"^^xsd:anyURI ; + d3f:kb-abstract "Certain commands are frequently used by malicious actors and infrequently used by normal users. By looking for execution of these commands in short periods of time, we can not only see when a malicious user was on the system but also get an idea of what they were doing." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2013-04-002: Quick execution of a series of suspicious commands" . + +d3f:Reference-RDPConnectionDetection_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-07-002: RDP Connection Detection - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-07-002"^^xsd:anyURI ; + d3f:kb-abstract "The Remote Desktop Protocol (RDP), built in to Microsoft operating systems, allows a user to remotely log in to the desktop of another host. It allows for interactive access of the running windows, and forwards key presses, mouse clicks, etc. Network administrators, power users, and end-users may use RDP for day-to-day operations. From an adversary's perspective, RDP provides a means to laterally move to a new host. Determining which RDP connections correspond to adversary activity can be a difficult problem in highly dynamic environments, but will be useful in identifying the scope of a compromise." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:RemoteTerminalSessionDetection ; + d3f:kb-reference-title "CAR-2013-07-002: RDP Connection Detection" . + +d3f:Reference-RFC2289-AOne-TimePasswordSystem a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - RFC 2289 - A One-Time Password System" ; + d3f:has-link "https://tools.ietf.org/html/rfc2289"^^xsd:anyURI ; + d3f:kb-organization "Internet Engineering Task Force (IETF)" ; + d3f:kb-reference-of d3f:One-timePassword ; + d3f:kb-reference-title "A One-Time Password System" . + +d3f:Reference-RFC3411-AnArchitectureForDescribingSimpleNetworkManagementProtocolSNMPManagementFrameworks a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks" ; + d3f:has-link "https://https//datatracker.ietf.org/doc/html/rfc3411"^^xsd:anyURI ; + d3f:kb-author "D. Harrington, R. Presuhn, B. Wijnen" ; + d3f:kb-organization "Internet Engineering Task Force (IETF)" ; + d3f:kb-reference-of d3f:HardwareComponentInventory ; + d3f:kb-reference-title "An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks" . + +d3f:Reference-RFC7208-SenderPolicyFramework-SPF-ForAuthorizingUseOfDomainsInEmail-IETF a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - RFC 7208: Sender Policy Framework (SPF) for Authorizing Use of Domains in Email - IETF" ; + d3f:has-link "https://tools.ietf.org/html/rfc7208"^^xsd:anyURI ; + d3f:kb-abstract "Email on the Internet can be forged in a number of ways. In particular, existing protocols place no restriction on what a sending host can use as the \"MAIL FROM\" of a message or the domain given on the SMTP HELO/EHLO commands. This document describes version 1 of the Sender Policy Framework (SPF) protocol, whereby Administrative Management Domains (ADMDs) can explicitly authorize the hosts that are allowed to use their domain names, and a receiving host can check such authorization." ; + d3f:kb-author "S. Kitterman" ; + d3f:kb-organization "Internet Engineering Task Force (IETF)" ; + d3f:kb-reference-of d3f:TransferAgentAuthentication ; + d3f:kb-reference-title "RFC 7208: Sender Policy Framework (SPF) for Authorizing Use of Domains in Email" . + +d3f:Reference-RFC7489-Domain-basedMessageAuthentication-Reporting-AndConformance-DMARC a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - RFC 7489: Domain-based Message Authentication, Reporting, and Conformance (DMARC) - IETF" ; + d3f:has-link "https://tools.ietf.org/html/rfc7489"^^xsd:anyURI ; + d3f:kb-abstract """Domain-based Message Authentication, Reporting, and Conformance(DMARC) is a scalable mechanism by which a mail-originating organization can express domain-level policies and preferences for message validation, disposition, and reporting, that a mail-receiving organization can use to improve mail handling. + +Originators of Internet Mail need to be able to associate reliable and authenticated domain identifiers with messages, communicate policies about messages that use those identifiers, and report about mail using those identifiers. These abilities have several benefits: Receivers can provide feedback to Domain Owners about the use of their domains; this feedback can provide valuable insight about the management of internal operations and the presence of external domain name abuse. + +DMARC does not produce or encourage elevated delivery privilege of authenticated email. DMARC is a mechanism for policy distribution that enables increasingly strict handling of messages that fail authentication checks, ranging from no action, through altered +delivery, up to message rejection.""" ; + d3f:kb-author "M. Kucherawy, E. Zwicky" ; + d3f:kb-organization "Internet Engineering Task Force (IETF)" ; + d3f:kb-reference-of d3f:TransferAgentAuthentication ; + d3f:kb-reference-title "RFC 7489: Domain-based Message Authentication, Reporting, and Conformance (DMARC)" . + +d3f:Reference-RFC7642SystemForCrossDomainIdentityManagementDefinitionsOverviewConceptsAndRequirements a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - RFC 7642: System for Cross-domain Identity Management: Definitions, Overview, Concepts, and Requirements" ; + d3f:has-link "https://datatracker.ietf.org/doc/html/rfc7642"^^xsd:anyURI ; + d3f:kb-abstract "The System for Cross-domain Identity Management (SCIM) specification is designed to manage user identity in cloud-based applications and services in a standardized way to enable interoperability, security, and scalability. The specification suite seeks to build upon experience with existing schemas and deployments, placing specific emphasis on simplicity of development and integration, while applying existing authentication, authorization, and privacy models. The intent of the SCIM specification is to reduce the cost and complexity of user management operations by providing a common user schema and extension model, as well as binding documents to provide patterns for exchanging this schema using standard protocols. In essence, make it fast, cheap, and easy to move users in to, out of, and around the cloud." ; + d3f:kb-author "K. LI, B. Khasnabish, A. Nadalin, Z. Zeltsan" ; + d3f:kb-organization "IETF" ; + d3f:kb-reference-of d3f:AccessModeling ; + d3f:kb-reference-title "RFC7642: System for Cross-domain Identity Management: Definitions, Overview, Concepts, and Requirements" . + +d3f:Reference-RFC8471TheTokenBindingProtocolVersion1.0 a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - The Token Binding Protocol Version 1.0" ; + d3f:has-link "https://datatracker.ietf.org/doc/html/rfc8471"^^xsd:anyURI ; + d3f:kb-abstract "This document specifies version 1.0 of the Token Binding protocol. The Token Binding protocol allows client/server applications to create long-lived, uniquely identifiable TLS bindings spanning multiple TLS sessions and connections. Applications are then enabled to cryptographically bind security tokens to the TLS layer, preventing token export and replay attacks. To protect privacy, the Token Binding identifiers are only conveyed over TLS and can be reset by the user at any time." ; + d3f:kb-author "A. Popov, M. Nystroem, Microsoft Corp., D. Balfanz, Google Inc., J Hodges, Kings Mountain Systems" ; + d3f:kb-organization "IETF" ; + d3f:kb-reference-of d3f:TokenBinding ; + d3f:kb-reference-title "RFC8471: The Token Binding Protocol Version 1.0" . + +d3f:Reference-RPCCallInterception_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - RPC call interception - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US20150163109"^^xsd:anyURI ; + d3f:kb-abstract "A service proxy is described herein. The service proxy is configured to act as an intermediary between a client and a service. The service proxy may observe communications, modify communications, log communications, or the like, particularly so as to enhance the security and reliability of the host device. In some implementations, the service proxy may cooperate with an operating system to take over a named port object. In some implementations, the service proxy may receive messages as an intermediary between the client and the server. In some implementations, the service proxy may attach to a shared memory to intercept communications. In some implementations, the service proxy may be injected into a client process to appear to be the client itself." ; + d3f:kb-author "Ion-Alexandru Ionescu" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:RPCTrafficAnalysis ; + d3f:kb-reference-title "RPC call interception" . + +d3f:Reference-RedHatEnterpriseLinux8SecurityTechnicalImplementationGuide a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Red Hat Enterprise Linux 8 Security Technical Implementation Guide" ; + d3f:has-link "https://www.stigviewer.com/stig/red_hat_enterprise_linux_8/"^^xsd:anyURI ; + d3f:kb-abstract "Red Hat Enterprise Linux 8 Security Guidelines" ; + d3f:kb-reference-of d3f:ApplicationConfigurationHardening ; + d3f:kb-reference-title "Red Hat Enterprise Linux 8 Security Technical Implementation Guide" . + +d3f:Reference-ReferenceNullification_SecureSoftwareInc a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - Reference Nullification" ; + d3f:has-link "https://cwe.mitre.org/documents/sources/TheCLASPApplicationSecurityProcess.pdf"^^xsd:anyURI ; + d3f:kb-organization "Secure Software, Inc." ; + d3f:kb-reference-of d3f:ReferenceNullification ; + d3f:kb-reference-title "The CLASP Application Security Process" . + +d3f:Reference-Reg.exeCalledFromCommandShell_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-03-001: Reg.exe called from Command Shell - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-03-001/"^^xsd:anyURI ; + d3f:kb-abstract "Registry modifications are often essential in establishing persistence via known Windows mechanisms. Many legitimate modifications are done graphically via regedit.exe or by using the corresponding channels, or even calling the Registry APIs directly. The built-in utility reg.exe provides a command-line interface to the registry, so that queries and modifications can be performed from a shell, such as cmd.exe. When a user is responsible for these actions, the parent of cmd.exe will likely be explorer.exe. Occasionally, power users and administrators write scripts that do this behavior as well, but likely from a different process tree. These background scripts must be learned so they can be tuned out accordingly." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis, + d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2013-03-001: Reg.exe called from Command Shell" . + +d3f:Reference-RegistryKeySecurityAndAccessRights a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Registry Key Security and Access Rights" ; + d3f:has-link "https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-key-security-and-access-rights"^^xsd:anyURI ; + d3f:kb-abstract "The Windows security model enables you to control access to registry keys. For more information about security, see Access-Control Model." ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:UserSessionInitConfigAnalysis ; + d3f:kb-reference-title "Registry Key Security and Access Rights" . + +d3f:Reference-RemoteDesktopLogon_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2016-04-005: Remote Desktop Logon - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2016-04-005/"^^xsd:anyURI ; + d3f:kb-abstract "A remote desktop logon, through RDP, may be typical of a system administrator or IT support, but only from select workstations. Monitoring remote desktop logons and comparing to known/approved originating systems can detect lateral movement of an adversary." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:RemoteTerminalSessionDetection ; + d3f:kb-reference-title "CAR-2016-04-005: Remote Desktop Logon" . + +d3f:Reference-RemoteRegistry_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-11-005: Remote Registry - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-11-005/"^^xsd:anyURI ; + d3f:kb-abstract """An adversary can remotely manipulate the registry of another machine if the RemoteRegistry service is enabled and valid credentials are obtained. While the registry is remotely accessed, it can be used to prepare a Lateral Movement technique, discover the configuration of a host, achieve Persistence, or anything that aids an adversary in achieving the mission. Like most ATT&CK techniques, this behavior can be used legitimately, and the reliability of an analytic depends on the proper identification of the pre-existing legitimate behaviors. Although this behavior is disabled in many Windows configurations, it is possible to remotely enable the RemoteRegistry service, which can be detected with CAR-2014-03-005. + +Remote access to the registry can be achieved via + +* Windows API function RegConnectRegistry +* command line via reg.exe +* graphically via regedit.exe + +All of these behaviors call into the Windows API, which uses the NamedPipe WINREG over SMB to handle the protocol information. This network can be decoded with wireshark or a similar sensor, and can also be detected by hooking the API function.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:AdministrativeNetworkActivityAnalysis ; + d3f:kb-reference-title "CAR-2014-11-005: Remote Registry" . + +d3f:Reference-RemotelyLaunchedExecutablesViaServices_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-03-005: Remotely Launched Executables via Services - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-03-005/"^^xsd:anyURI ; + d3f:kb-abstract """There are several ways to cause code to execute on a remote host. One of the most common methods is via the Windows Service Control Manager (SCM), which allows authorized users to remotely create and modify services. Several tools, such as PsExec, use this functionality. + +When a client remotely communicates with the Service Control Manager, there are two observable behaviors. First, the client connects to the RPC Endpoint Mapper over 135/tcp. This handles authentication, and tells the client what port the endpoint--in this case the SCM--is listening on. Then, the client connects directly to the listening port on services.exe. If the request is to start an existing service with a known command line, the the SCM process will run the corresponding command. + +This compound behavior can be detected by looking for services.exe receiving a network connection and immediately spawning a child process.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:RPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2014-03-005: Remotely Launched Executables via Services" . + +d3f:Reference-RemotelyScheduledTasksViaSchtasks_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2015-04-002: Remotely Scheduled Tasks via Schtasks - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2015-04-002/"^^xsd:anyURI ; + d3f:kb-abstract """An adversary can move laterally using the schtasks command to remotely schedule tasks. Although these events can be detected with command line analytics CAR-2013-08-001, it is possible for an adversary to use the API directly, via the Task Scheduler GUI or with a scripting language such as PowerShell. In this cases, an additional source of data becomes necessary to detect adversarial behavior. When scheduled tasks are created remotely, Windows uses RPC (135/tcp) to communicate with the Task Scheduler on the remote machine. Once an RPC connection is established (CAR-2014-05-001), the client communicates with the Scheduled Tasks endpoint, which runs within the service group netsvcs. With packet capture and the right packet decoders or byte-stream based signatures, remote invocations of these functions can be identified. + +Certain strings can be identifiers of the schtasks, by looking up the interface UUID of ITaskSchedulerService in different formats + +* UUID 86d35949-83c9-4044-b424-db363231fd0c (decoded) +* Hex 49 59 d3 86 c9 83 44 40 b4 24 db 36 32 31 fd 0c (raw) +* ASCII IYD@$621 (printable bytes only) + +This identifier is present three times during the RPC request phase. Any sensor that has access to the byte code as raw, decoded, or ASCII could implement this analytic.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:RPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2015-04-002: Remotely Scheduled Tasks via Schtasks" . + +d3f:Reference-Reputation_of_an_entity_associated_with_a_content_item a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Reputation of an entity associated with a content item" ; + d3f:has-link "https://patents.google.com/patent/US20060253584A1"^^xsd:anyURI ; + d3f:kb-author "Christopher Dixon, Thomas Pinckney" ; + d3f:kb-reference-of d3f:FileHashReputationAnalysis ; + d3f:kb-reference-title "Reputation of an entity associated with a content item" . + +d3f:Reference-RevokingaPreviouslyIssuedVerifiableCredential-Microsoft a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Revoke a previously issued verifiable credential - Microsoft" ; + d3f:has-link "https://learn.microsoft.com/en-us/azure/active-directory/verifiable-credentials/how-to-issuer-revoke"^^xsd:anyURI ; + d3f:kb-author "Barclay Neira, Christer Ljung, Juan Camilo Ruiz, John Flores" ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:CredentialRevocation ; + d3f:kb-reference-title "Revoke a previously issued verifiable credential" . + +d3f:Reference-RunDLL32.exeMonitoring_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-03-006: RunDLL32.exe monitoring - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-03-006/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may find it necessary to use Dyanamic-link Libraries (DLLs) to evade defenses. One way these DLLs can be \"executed\" is through the use of the built-in Windows utility RunDLL32, which allows a user to execute code in a DLL, providing the name and optional arguments to an exported entry point. Windows uses RunDll32 legitimately in its normal operation, but with a proper baseline and understanding of the environment, monitoring its usage could be fruitful." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2014-03-006: RunDLL32.exe monitoring" . + +d3f:Reference-SAFESEH_ImageHasSafeExceptionHandlers_MicrosoftDocs a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - /SAFESEH (Image has Safe Exception Handlers) - Microsoft Docs" ; + d3f:has-link "https://docs.microsoft.com/en-us/cpp/build/reference/safeseh-image-has-safe-exception-handlers?view=msvc-160"^^xsd:anyURI ; + d3f:kb-abstract "When /SAFESEH is specified, the linker will only produce an image if it can also produce a table of the image's safe exception handlers. This table specifies for the operating system which exception handlers are valid for the image." ; + d3f:kb-author "Mike Blome, Saisang Cai, Colin Robertson, Mike Jones, NextTurn, Gordon Hogenson" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:ExceptionHandlerPointerValidation ; + d3f:kb-reference-title "/SAFESEH (Image has Safe Exception Handlers)" . + +d3f:Reference-SMBCopyAndExecution_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-05-005: SMB Copy and Execution - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-05-005/"^^xsd:anyURI ; + d3f:kb-abstract """An adversary needs to gain access to other hosts to move throughout an environment. In many cases, this is a twofold process. First, a file is remotely written to a host via an SMB share (detected by CAR-2013-05-003). Then, a variety of Execution techniques can be used to remotely establish execution of the file or script. To detect this behavior, look for files that are written to a host over SMB and then later run directly as a process or in the command line arguments. SMB File Writes and Remote Execution may happen normally in an environment, but the combination of the two behaviors is less frequent and more likely to indicate adversarial activity. + +This can possibly extend to more copy protocols in order to widen its reach, or it could be tuned more finely to focus on specific program run locations (e.g. %SYSTEMROOT%\\system32) to gain a higher detection rate.""" ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:IPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2013-05-005: SMB Copy and Execution" . + +d3f:Reference-SMBEventsMonitoring_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-01-003: SMB Events Monitoring - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-01-003/"^^xsd:anyURI ; + d3f:kb-abstract """Server Message Block (SMB) is used by Windows to allow for file, pipe, and printer sharing over port 445/tcp. It allows for enumerating, and reading from and writing to file shares for a remote computer. Although it is heavily used by Windows servers for legitimate purposes and by users for file and printer sharing, many adversaries also use SMB to achieve Lateral Movement. Looking at this activity more closely to obtain an adequate sense of situational awareness may make it possible to detect adversaries moving between hosts in a way that deviates from normal activity. Because SMB traffic is heavy in many environments, this analytic may be difficult to turn into something that can be used to quickly detect an APT. In some cases, it may make more sense to run this analytic in a forensic fashion. Looking through and filtering its output after an intrusion has been discovered may be helpful in identifying the scope of compromise. + +Output Description: +The source, destination, content, and time of each event.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:IPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2013-01-003: SMB Events Monitoring" . + +d3f:Reference-SMBWriteRequest_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-05-003: SMB Write Request - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-05-003/"^^xsd:anyURI ; + d3f:kb-abstract "As described in CAR-2013-01-003, SMB provides a means of remotely managing a file system. Adversaries often use SMB to move laterally to a host. SMB is commonly used to upload files. It may be used for staging in Exfiltration or as a Lateral Movement technique. Unlike SMB Reads, SMB Write requests typically require an additional level of access, resulting in less activity. Focusing on SMB Write activity narrows the field to find techniques that actively change remote hosts, instead of passively reading files." ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:IPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2013-05-003: SMB Write Request" . + +d3f:Reference-SNMPNetworkAutoDiscovery a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - SNMP - Network Auto-Discovery" ; + d3f:has-link "https://docs.device42.com/auto-discovery/network-auto-discovery/"^^xsd:anyURI ; + d3f:kb-abstract "SNMP, or Simple Network Management Protocol, is a protocol and a standard that is supported by just about any managed network-connected hardware. There are three widely deployed versions: SNMP v1, v2c (most commonly used), and v3. SNMP is typically utilized read-only, but supports read/write, and by default utilized port 161. SNMP exposes management data in the form of ‘variables’, which are organized in what is known as a MIB, or “Management Information Base”. A MIB essentially describes the variables available on a given system, each of which can be remotely queried via SNMP." ; + d3f:kb-organization "Device 42" ; + d3f:kb-reference-of d3f:ActiveLogicalLinkMapping ; + d3f:kb-reference-title "SNMP - Network Auto Discovery" . + +d3f:Reference-SecretsManagementCheatSheet-OWASP a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Secrets Management Cheat Sheet" ; + d3f:has-link "https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html"^^xsd:anyURI ; + d3f:kb-abstract "The OWASP Secrets Management Cheat Sheet provides clear directives for securely managing sensitive data like API keys and credentials. It emphasizes centralized control for storage, provisioning, and auditing to prevent unauthorized access. Adopting strong rotation and management protocols is essential for maintaining security and integrity in DevOps environments." ; + d3f:kb-author "OWASP" ; + d3f:kb-reference-of d3f:CredentialScrubbing ; + d3f:kb-reference-title "Secrets Management Cheat Sheet" . + +d3f:Reference-SecureCachingOfServerCredentials_DellProductsLP a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Secure caching of server credentials - Dell Products LP" ; + d3f:has-link "https://patents.google.com/patent/US20100107241A1"^^xsd:anyURI ; + d3f:kb-abstract "A credential caching system includes receiving a set of authentication credentials, storing the set of authentication credentials in a credential cache memory, wherein the credential cache memory is coupled with a management controller, and supplying the set of authentication credentials for automatic authentication during a reset or reboot. In the event of a security breach, the credential caching system clears the set of authentication credentials from the credential cache memory so that the set of authentication credentials may no longer be used for a reset or reboot." ; + d3f:kb-author "Muhammed K. JaberMukund P. KhatriKevin T. MarksDon Charles McCall" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Dell Products LP" ; + d3f:kb-reference-of d3f:AuthenticationCacheInvalidation ; + d3f:kb-reference-title "Secure caching of server credentials" . + +d3f:Reference-SecurityArchitectureForTheInternetProtocol a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Security Architecture for the Internet Protocol" ; + d3f:has-link "https://datatracker.ietf.org/doc/html/rfc1825"^^xsd:anyURI ; + d3f:kb-abstract """This memo describes the security mechanisms for IP version 4 (IPv4) + and IP version 6 (IPv6) and the services that they provide. Each + security mechanism is specified in a separate document. This + document also describes key management requirements for systems + implementing those security mechanisms. This document is not an + overall Security Architecture for the Internet and is instead focused + on IP-layer security.""" ; + d3f:kb-author "Randall Atkinson" ; + d3f:kb-reference-of d3f:EncryptedTunnels ; + d3f:kb-reference-title "Security Architecture for the Internet Protocol" . + +d3f:Reference-SecuritySystemWithMethodologyForInterprocessCommunicationControl_CheckPointSoftwareTechInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Security System with Methodology for Interprocess Communication Control - Check Point Software Tech Inc" ; + d3f:has-link "https://patents.google.com/patent/US20040199763"^^xsd:anyURI ; + d3f:kb-abstract "A security system with methodology for interprocess communication control is described. In one embodiment, a method for controlling interprocess communication is provided that includes steps of: defining rules indicating which system services a given application can invoke; trapping an attempt by a particular application to invoke a particular system service; identifying the particular application that is attempting to invoke the particular system service; and based on identity of the particular application and on the rules indicating which system services a given application can invoke, blocking the attempt when the rules indicate that the particular application cannot invoke the particular system service." ; + d3f:kb-author "Gregor Freund" ; + d3f:kb-mitre-analysis "This patent describes a technique for monitoring interprocess communications to prevent malicious applications from requesting system services. API calls are monitored to detect malicious applications attempting to open a communication channel (port) to access system services or sending messages to other applications using user32 API functions. These requests are examined against an external rules engine or whitelist, matches deny or block access and produce an error message such as connection refused or service not available." ; + d3f:kb-organization "Check Point Software Tech Inc" ; + d3f:kb-reference-of d3f:IPCTrafficAnalysis ; + d3f:kb-reference-title "Security System with Methodology for Interprocess Communication Control" . + +d3f:Reference-SecurityVulnerabilityInformationAggregation a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Security vulnerability information aggregation" ; + d3f:has-link "https://patents.google.com/patent/US8544098B2"^^xsd:anyURI ; + d3f:kb-abstract "Security vulnerability information aggregation techniques are disclosed. Vulnerability information associated with one or more security vulnerabilities is obtained from multiple sources and aggregated into respective unified vulnerability definitions for the one or more security vulnerabilities. Aggregation may involve format conversion, content aggregation, or both in some embodiments. Unified vulnerability definitions may be distributed to vulnerability information consumers in accordance with consumer-specific policies. Storage of vulnerability information received from the sources may allow the aggregation process to be performed on existing vulnerability information “retro-actively”. Related data structures and Graphical User Interfaces (GUIs) are also disclosed." ; + d3f:kb-author "Christophe Gustave, Stanley Taihai Chow, Douglas Wiemer" ; + d3f:kb-organization "Nokia Technologies Oy" ; + d3f:kb-reference-of d3f:AssetVulnerabilityEnumeration ; + d3f:kb-reference-title "Security vulnerability information aggregation" . + +d3f:Reference-ServiceBinaryModifications_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-02-001: Service Binary Modifications - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-02-001/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may modify the binary file for an existing service to achieve Persistence while potentially evading defenses. If a newly created or modified runs as a service, it may indicate APT activity. However, services are frequently installed by legitimate software. A well-tuned baseline is essential to differentiating between benign and malicious service modifications." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ServiceBinaryVerification ; + d3f:kb-reference-title "CAR-2014-02-001: Service Binary Modifications" . + +d3f:Reference-ServiceOutlierExecutables_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-09-005: Service Outlier Executables - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-09-005/"^^xsd:anyURI ; + d3f:kb-abstract "New executables that are started as a service are suspicious. This analytic looks for anomalous service executables." ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2013-09-005: Service Outlier Executables" . + +d3f:Reference-ServiceSearchPathInterception_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-07-001: Service Search Path Interception - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-07-001/"^^xsd:anyURI ; + d3f:kb-abstract "According to ATT&CK, an adversary may escalate privileges by intercepting the search path for legitimately installed services. As a result, Windows will launch the target executable instead of the desired binary and command line. This can be done when there are spaces in the binary path and the path is unquoted. Search path interception should never happen legitimately and will likely be the result of an adversary abusing a system misconfiguration. With a few regular expressions, it is possible to identify the execution of services with intercepted search paths." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2014-07-001: Service Search Path Interception" . + +d3f:Reference-ServicesLaunchingCmd_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-05-002: Services launching Cmd - MITRE" ; + d3f:has-link ""^^xsd:anyURI ; + d3f:kb-abstract """Windows runs the Service Control Manager (SCM) within the process services.exe. Windows launches services as independent processes or DLL loads within a svchost.exe group. To be a legitimate service, a process (or DLL) must have the appropriate service entry point SvcMain. If an application does not have the entry point, then it will timeout (default is 30 seconds) and the process will be killed. + +To survive the timeout, adversaries and red teams can create services that direct to cmd.exe with the flag /c, followed by the desired command. The /c flag causes the command shell to run a command and immediately exit. As a result, the desired program will remain running and it will report an error starting the service. This analytic will catch that command prompt instance that is used to launch the actual malicious executable. Additionally, the children and descendants of services.exe will run as a SYSTEM user by default. Thus, services are a convenient way for an adversary to gain Persistence and Privilege Escalation.""" ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2014-05-002: Services launching Cmd" . + +d3f:Reference-SimultaneousLoginsOnAHost_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-02-008: Simultaneous Logins on a Host - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-02-008/"^^xsd:anyURI ; + d3f:kb-abstract """Multiple users logged into a single machine at the same time, or even within the same hour, do not typically occur in networks we have observed. + +Logon events are Windows Event Code 4624 for Windows Vista and above, 518 for pre-Vista. Logoff events are 4634 for Windows Vista and above, 538 for pre-Vista. Logon types 2, 3, 9 and 10 are of interest. For more details see the Logon Types table on Microsoft's Audit Logon Events page.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-reference-of d3f:AuthenticationEventThresholding ; + d3f:kb-reference-title "CAR-2013-02-008: Simultaneous Logins on a Host" . + +d3f:Reference-SinkholingBadNetworkDomainsByRegisteringTheBadNetworkDomainsOnTheInternet_PaloAltoNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Sinkholing bad network domains by registering the bad network domains on the internet - Palo Alto Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US20160381065A1"^^xsd:anyURI ; + d3f:kb-abstract "Techniques for sinkholing bad network domains by registering the bad network domains on the Internet are provided. In some embodiments, sinkholing bad network domains by registering the bad network domains on the Internet includes determining a network domain is a bad network domain, in which the bad network domain is determined to be associated with an identified malware (e.g., malware that has been identified and has been determined to be associated with the bad domain), and the bad network domain is sinkholed by registering the bad network domain with a sinkholed IP address; and identifying a host that is infected with the identified malware based on an attempt by the host to connect to the sinkholed IP address." ; + d3f:kb-author "Huagang Xie; Wei Xu; Nir Zuk" ; + d3f:kb-mitre-analysis "This patent describes a technique to identify bad domains that are associated with malware and sinkhole the bad domain. Bad domains are identified by receiving malware samples and executing the malware sample in a virtual execution environment to identify network domains that the malware sample attempts to connect to during execution. Network domains that are identified during malware execution are then generated into signatures to identity bad domains for other hosts. Once identified, the bad domains are sinkholed by translating the domain to a valid IP address that is associated with a device controlled by a cloud security provider." ; + d3f:kb-organization "Palo Alto Networks Inc" ; + d3f:kb-reference-of d3f:DNSTrafficAnalysis ; + d3f:kb-reference-title "Sinkholing bad network domains by registering the bad network domains on the internet" . + +d3f:Reference-SiteIsolationDesignDocument a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Site Isolation Design Document" ; + d3f:has-link "https://www.chromium.org/developers/design-documents/site-isolation/"^^xsd:anyURI ; + d3f:kb-abstract "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "The Chromium Projects" ; + d3f:kb-reference-of d3f:Application-basedProcessIsolation ; + d3f:kb-reference-title "Site Isolation Design Document" . + +d3f:Reference-Squiblydoo_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2019-04-003: Squiblydoo - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2019-04-003/"^^xsd:anyURI ; + d3f:kb-abstract "Squiblydoo is a specific usage of regsvr32.dll to load a COM scriptlet directly from the internet and execute it in a way that bypasses application whitelisting. It can be seen by looking for regsvr32.exe executions that load the scrobj.dll (which execute the COM scriptlet) or, if that is too noisy, those that also load content directly via HTTP or HTTPS." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2019-04-003: Squiblydoo" . + +d3f:Reference-StackSmashingProtection_StackGuard_RedHat a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Security Technologies: Stack Smashing Protection (StackGuard) - Red Hat" ; + d3f:has-link "https://access.redhat.com/blogs/766093/posts/3548631"^^xsd:anyURI ; + d3f:kb-abstract "In our previous blog, we saw how arbitrary code execution resulting from stack-buffer overflows can be partly mitigated by marking segments of memory as non-executable, a technology known as Execshield. However stack-buffer overflow exploits can still effectively overwrite the function return address, which leads to several interesting exploitation techniques like ret2libc, ret2gets, and ret2plt. With all of these methods, the function return address is overwritten and attacker controlled code is executed when the program control transfers to overwritten address on the stack." ; + d3f:kb-author "Huzaifa Sidhpurwala" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Red Hat" ; + d3f:kb-reference-of d3f:StackFrameCanaryValidation ; + d3f:kb-reference-title "Security Technologies: Stack Smashing Protection (StackGuard)" . + +d3f:Reference-StreamingPhish a d3f:TechniqueReference, + owl:NamedIndividual ; + rdfs:label "Reference - StreamingPhish" ; + d3f:has-link "https://github.com/wesleyraptor/streamingphish"^^xsd:anyURI ; + d3f:kb-abstract "This is a utility that uses supervised machine learning to detect phishing domains from the Certificate Transparency log network." ; + d3f:kb-author "Wes Connell" ; + d3f:kb-organization "Uber" ; + d3f:kb-reference-of d3f:PassiveCertificateAnalysis ; + d3f:kb-reference-title "StreamingPhish" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Supply chain cyber-deception - Cymmetria, Inc." ; + d3f:has-link "https://patents.google.com/patent/WO2017187379A1"^^xsd:anyURI ; + d3f:kb-abstract "A computer implemented method of detecting unauthorized access to a protected network from external endpoints, comprising monitoring, at a protected network, communication with one or more external endpoints using one or more access clients to access one or more of a plurality of resources of the protected networked, where one or more deception resources created in the protected network map one or more of the plurality of resources, detecting usage of data contained in one or more of a plurality of deception data objects deployed in the one or more access clients by monitoring an interaction triggered by one or more of the deception data objects with the one or more deception resources when used and identifying one or more potential unauthorized operations based on analysis of the detection." ; + d3f:kb-author "Gadi EVRON; Dean SYSMAN; Imri Goldberg; Shmuel Ur" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Cymmetria, Inc." ; + d3f:kb-reference-of d3f:DecoyFile ; + d3f:kb-reference-title "Supply chain cyber-deception" . + +d3f:Reference-SuspiciousArguments_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-07-001: Suspicious Arguments - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-07-001/"^^xsd:anyURI ; + d3f:kb-abstract "Malicious actors may rename built-in commands or external tools, such as those provided by SysInternals, to better blend in with the environment. In those cases, the file path name is arbitrary and may blend in well with the background. If the arguments are closely inspected, it may be possible to infer what tools are running and understand what an adversary is doing. When any legitimate software shares the same command lines, it must be whitelisted according to the expected parameters." ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2013-07-001: Suspicious Arguments" . + +d3f:Reference-SuspiciousRunLocations_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-05-002: Suspicious Run Locations - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-05-002/"^^xsd:anyURI ; + d3f:kb-abstract "In Windows, files should never execute out of certain directory locations. Any of these locations may exist for a variety of reasons, and executables may be present in the directory but should not execute. As a result, some defenders make the mistake of ignoring these directories and assuming that a process will never run from one. There are known TTPs that have taken advantage of this fact to go undetected. This fact should inform defenders to monitor these directories more closely, knowing that they should never contain running processes." ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2013-05-002: Suspicious Run Locations" . + +d3f:Reference-SynchronizingAHoneyNetworkConfigurationToReflectATargetNetworkEnvironment_PaloAltoNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Synchronizing a honey network configuration to reflect a target network environment - Palo Alto Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170019425A1"^^xsd:anyURI ; + d3f:kb-abstract "Techniques for synchronizing a honey network configuration to reflect a target network environment are disclosed. In some embodiments, a system for synchronizing a honey network configuration to reflect a target network environment includes a device profile data store that includes a plurality of attributes of each of a plurality of devices in the target network environment; a virtual machine (VM) image library that includes one or more VM images; and a virtual clone manager executed on a processor that instantiates a virtual clone of one or more devices in the target enterprise network using a VM image selected from the VM image library that is customized based on one or more attributes for a target device in the device profile data store." ; + d3f:kb-author "Taylor Ettema, Huagang Xie" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Palo Alto Networks Inc" ; + d3f:kb-reference-of d3f:IntegratedHoneynet ; + d3f:kb-reference-title "Synchronizing a honey network configuration to reflect a target network environment" . + +d3f:Reference-SystemAndAMethodForIdentifyingThePresenceOfMalwareAndRansomwareUsingMini-trapsSetAtNetworkEndpoints_FidelisCybersecuritySolutionsInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and a method for identifying the presence of malware and ransomware using mini-traps set at network endpoints - Fidelis Cybersecurity Solutions Inc" ; + d3f:has-link "https://patents.google.com/patent/US9807115B2/en?oq=US-9807115-B2"^^xsd:anyURI ; + d3f:kb-abstract "A system for identifying the presence of ransomware on a network, including a plurality of resources, interconnected to form a network and at least one decoy drive.The decoy drive includes a plurality of decoy files to be encrypted by the ransomware, and wherein the decoy drive continuously provides the decoy files thereby continuously occupying the ransomware." ; + d3f:kb-author "Doron Kolton; Rami Mizrahi; Omer Zohar; Benny Ben-Rabi; Alex Barbalat; Shlomi Gabai" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Fidelis Cybersecurity Solutions Inc" ; + d3f:kb-reference-of d3f:DecoyFile ; + d3f:kb-reference-title "System and a method for identifying the presence of malware and ransomware using mini-traps set at network endpoints" . + +d3f:Reference-SystemAndMethodForDetectingHomoglyphAttacksWithASiameseConvolutionalNeuralNetwork_EndgameInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for detecting homoglyph attacks with a siamese convolutional neural network - Endgame Inc" ; + d3f:has-link "https://patents.google.com/patent/US20190019058A1/"^^xsd:anyURI ; + d3f:kb-abstract "The present invention utilizes computer vision technologies to identify potentially malicious URLs and executable files in a computing device. In one embodiment, a Siamese convolutional neural network is trained to identify the relative similarity between image versions of two strings of text. After the training process, a list of strings that are likely to be utilized in malicious attacks are provided (e.g., legitimate URLs for popular websites). When a new string is received, it is converted to an image and then compared against the image of list of strings. The relative similarity is determined, and if the similarity rating falls below a predetermined threshold, an alert is generated indicating that the string is potentially malicious." ; + d3f:kb-author "Jonathan Woodbridge; Anjum Ahuja; Daniel Grant" ; + d3f:kb-mitre-analysis "This patent describes a mechanism to detect homoglyph strings that involves training a Siamese convolutional neural network to compare images of strings. Strings of legitimate URLs for websites along with known suspicious stings are converted to images during the training process to create an index. New strings are converted to images and then compared to the index for similarity, if the string deviates beyond a threshold an alert is triggered." ; + d3f:kb-organization "Endgame Inc" ; + d3f:kb-reference-of d3f:HomoglyphDetection ; + d3f:kb-reference-title "System and method for detecting homoglyph attacks with a siamese convolutional neural network" . + +d3f:Reference-SystemAndMethodForDetectingMalwareInjectedIntoMemoryOfAComputingDevice_EndgameInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for detecting malware injected into memory of a computing device - Endgame Inc" ; + d3f:has-link "https://patents.google.com/patent/US20190018958A1/en?oq=US20190018958-A1"^^xsd:anyURI ; + d3f:kb-abstract "In the embodiments described herein, a malicious code detection module identifies potentially malicious instructions in memory of a computing device. The malicious code detection module examines the call stack for each thread running within the operating system of the computing device. Within each call stack, the malicious code detection module identifies the originating module for each stack frame and determines whether the originating module is backed by an image on disk. If an originating module is not backed by an image on disk, the thread containing that originating module is flagged as potentially malicious, execution of the thread optionally is suspended, and an alert is generated for the user or administrator." ; + d3f:kb-author "Joseph W. Desimone" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Endgame Inc" ; + d3f:kb-reference-of d3f:ProcessCodeSegmentVerification ; + d3f:kb-reference-title "System and method for detecting malware injected into memory of a computing device" . + +d3f:Reference-SystemAndMethodForDetectionOfAChangeInBehaviorInTheUseOfAWebsiteThroughVectorVelocityAnalysis_SilverTailSystems a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and Method for Detection of a Change in Behavior in the Use of a Website Through Vector Velocity Analysis - Silver Tail Systems" ; + d3f:has-link "https://patents.google.com/patent/US20100235909A1/en?oq=US+20100235909+A1"^^xsd:anyURI ; + d3f:kb-abstract "A system and software for identifying the change of user behavior on a website includes analyzing the actions of users on a website comprising a plurality of fields or input parameters that identify the actions performed on a website including fields related to previous actions by that user or other users of the website. The fields or input parameters are represented in a vector format where vectors represent different sessions of activity on the website, pages of the website, users of the website, or other attributes of the use of a website. Analysis is performed to determine if new sessions are similar or dissimilar to previously known sessions and if a session is converging or diverging from known sessions based on the velocity and direction of the velocity of the vectors in the vector space." ; + d3f:kb-author "Mike Eynon; Laura Mather; Erik Westland; Jim Lloyd" ; + d3f:kb-mitre-analysis "This patent describes a technique for detecting fraudulent behavior on a website. Website behavior is mapped to build a multidimensional representation of user actions on a website that is updated as additional actions are recorded. Example actions on a website that are recorded include clicks by a user on the website and entering data into forms. Current behavior is compared against baseline recorded behavior and if current behavior deviates above a threshold, an alert is issued." ; + d3f:kb-organization "Silver Tail Systems" ; + d3f:kb-reference-of d3f:WebSessionActivityAnalysis ; + d3f:kb-reference-title "System and Method for Detection of a Change in Behavior in the Use of a Website Through Vector Velocity Analysis" . + +d3f:Reference-SystemAndMethodForInternetSecurity_CylanceInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for internet security - Cylance Inc" ; + d3f:has-link "https://patents.google.com/patent/US20120117644A1"^^xsd:anyURI ; + d3f:kb-abstract "A computer implemented method for preventing SQL injection attacks comprises intercepting a web request associated with a web service at a first software hook in a first web service execution context, persisting at least a portion of the intercepted web request in a storage location associated with the first software hook and accessible to at least one additional execution context, intercepting a database query generated by at least one web service processing operation at a second software hook associated with the execution of the query, wherein the query is generated in response to the intercepted web request and the second hook retrieves the persisted portion of the intercepted web request, comparing a portion of the persisted portion of the intercepted web request with at least a portion of the intercepted database query, and determining, prior to the query being executed, whether the query corresponds to a potential SQL injection attack." ; + d3f:kb-author "Derek A. Soeder" ; + d3f:kb-mitre-analysis "This patent describes a technique for detecting SQL injection attacks. Software hooks are installed in a web service or application to intercept function calls, events, or messages that are passed between software components. Intercepted database queries associated with a web request are analyzed character by character and if it contains a character that would modify the syntax the query is rejected or sanitized. Security rules and policies may also determine rejection. For example, an administrator or developer may implement a rule that rejects any database query that is excessively long or that contains a particular string, such as \"Xp cmdshell\"." ; + d3f:kb-organization "Cylance Inc" ; + d3f:kb-reference-of d3f:DatabaseQueryStringAnalysis ; + d3f:kb-reference-title "System and method for internet security" . + +d3f:Reference-SystemAndMethodForNetworkSecurityIncludingDetectionOfAttacksThroughPartnerWebsites_EMCIPHoldingCoLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and Method for Network Security Including Detection of Attacks Through Partner Websites - EMC IP Holding Co LLC" ; + d3f:has-link "https://patents.google.com/patent/US20110302653A1/en?oq=US+20110302653+A1"^^xsd:anyURI ; + d3f:kb-abstract "A computer readable storage medium has instructions for execution on a computer. The instructions monitor transactions between a server and a set of clients. An evaluation of session indicators associated with the transactions is performed. Individual sessions between the server and individual clients of the plurality of clients are isolated in response to the evaluation." ; + d3f:kb-author "Matt Frantz; Andreas Wittenstein; Mike Eynon; Laura Mather; Jim Lloyd; James Schumacher; Duane Murphy" ; + d3f:kb-mitre-analysis "This patent describes a technique for detecting man-in-the-browser attacks. Current user session data is compared with the average user session that is based on collected data representing average values across all user sessions over a data-collection period. User session data includes average time between clicks and the order in which website pages are viewed. The comparisons are combined to generate a score that indicates the likelihood that the current session is a man-in-the-browser attack." ; + d3f:kb-organization "EMC IP Holding Co LLC" ; + d3f:kb-reference-of d3f:WebSessionActivityAnalysis ; + d3f:kb-reference-title "System and Method for Network Security Including Detection of Attacks Through Partner Websites" . + +d3f:Reference-SystemAndMethodForProcessHollowingDetection_CarbonBlackInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and Method for Process Hollowing Detection - Carbon Black Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170272462A1"^^xsd:anyURI ; + d3f:kb-abstract "A method and system for remediating a process hollowing intrusion on a user device comprising detecting a process starting on the user device, preparing the process to monitor Application Programming Interface (API) calls between the process and an operating system of the user device, determining whether the process is associated with a process hollowing intrusion based on information associated with the process and/or the API calls, and executing security policies against the process associated with the process hollowing intrusion. In examples, it is determined whether the child process is associated with a process hollowing intrusion in response to determining whether one or more API calls associated with known process hollowing intrusions modify executable memory of and/or modify an entry point address of the child process." ; + d3f:kb-author "Jeffrey Albin Kraemer, Paul Matthew Drapeau" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Carbon Black Inc" ; + d3f:kb-reference-of d3f:ProcessSelf-ModificationDetection ; + d3f:kb-reference-title "System and Method for Process Hollowing Detection" . + +d3f:Reference-SystemAndMethodForProvidingAnActivelyInvalidatedClient-sideNetworkResourceCache_IMVU a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for providing an actively invalidated client-side network resource cache - IMVU" ; + d3f:has-link "https://patents.google.com/patent/US9578081B2/en"^^xsd:anyURI ; + d3f:kb-abstract "A system and method for providing an actively invalidated client-side network resource cache are disclosed. A particular embodiment includes: a client configured to request, for a client application, data associated with an identifier from a server; the server configured to provide the data associated with the identifier and to establish a queue associated with the identifier at a scalable message queuing system, the client being configured to subscribe to the queue at the scalable message queuing system to receive invalidation information associated with the data; the server being further configured to signal the queue of an invalidation event associated with the data; the scalable message queuing system being configured to convey information indicative of the invalidation event to the client; and the client being further configured to re-request the data associated with the identifier from the server upon receipt of the information indicative of the invalidation event." ; + d3f:kb-author "Jon Watte" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "IMVU" ; + d3f:kb-reference-of d3f:AuthenticationCacheInvalidation ; + d3f:kb-reference-title "System and method for providing an actively invalidated client-side network resource cache" . + +d3f:Reference-SystemAndMethodForProvidingAnonymousRemailingAndFilteringOfElectronicMail_Nokia a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for providing anonymous remailing and filtering of electronic mail - Nokia" ; + d3f:has-link "https://patents.google.com/patent/JPH11161574A"^^xsd:anyURI ; + d3f:kb-abstract "To make anonymous a sender name present on an actual transmission source address by including an alias transmission source address substitution unit and removing the actual transmission source address from an electronic mail message. SOLUTION: A hash value of the destination address of an electronic mail message is calculated (S330). Then, (n) blank bytes are added to a compressed actual transmission source address (S340). The true length of the actual transmission source address is hidden by adding blank bytes. Further, a 2nd bit field is added to a secret key saved locally in a remailer, and an extended secret key characteristic of the destination address is generated. Then, the compressed actual transmission source address is ciphered according to the data ciphering standards using the extended secret key characteristic of the destination address as a cipher key (S350). Further, the 2nd bit field is added to the ciphered and compressed actual transmission source address (S360)." ; + d3f:kb-author "Eran Gabber, Phillip B Gibbons, David Morris Kristol, Yossi Matias, Alain J Mayer" ; + d3f:kb-organization "Nokia of America Corp" ; + d3f:kb-reference-of d3f:EmailFiltering ; + d3f:kb-reference-title "System and method for providing anonymous remailing and filtering of electronic mail" . + +d3f:Reference-SystemAndMethodForScanningRemoteServicesToLocateStoredObjectsWithMalware a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for scanning remote services to locate stored objects with malware" ; + d3f:has-link "https://patents.google.com/patent/US11368475B1/"^^xsd:anyURI ; + d3f:kb-abstract "A system and method for retrieval and analysis of stored objects for malware is described. The method involves receiving a scan request message from a customer to conduct analytics on one or more objects stored within a third-party controlled service. In response to receipt of the scan request message, the system generates a redirect message. The redirect message redirects the customer to an authentication portal of the third-party controlled service operating as a logon page and configures receipt by the system of access credentials for the third-party controlled service upon verification of the customer. Using the access credentials, the system is able to retrieve the one or more objects using the access credentials and performing analytics on each object of the one or more objects to classify each object as malicious or benign." ; + d3f:kb-author "Sai Vashisht" ; + d3f:kb-organization "Mandiant Inc, FireEye Security Holdings US LLC" ; + d3f:kb-reference-of d3f:EmailRemoval ; + d3f:kb-reference-title "System and method for scanning remote services to locate stored objects with malware" . + +d3f:Reference-SystemAndMethodForValidatingIn-memoryIntegrityOfExecutableFilesToIdentifyMaliciousActivity_EndgameInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for validating in-memory integrity of executable files to identify malicious activity - Endgame Inc" ; + d3f:has-link "https://patents.google.com/patent/US20190018962A1/en?oq=15648887"^^xsd:anyURI ; + d3f:kb-abstract "In the embodiments described herein, a malicious code detection module identifies potentially malicious instructions in volatile memory of a computing device before the instructions are executed. The malicious code detection module identifies an executable file, such as an .exe file, in memory, validates one or more components of the executable file against the same file stored in non-volatile storage, and issues an alert if the validation fails." ; + d3f:kb-author "Joseph W. Desimone" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Endgame Inc" ; + d3f:kb-reference-of d3f:ProcessCodeSegmentVerification ; + d3f:kb-reference-title "System and method for validating in-memory integrity of executable files to identify malicious activity" . + +d3f:Reference-SystemAndMethodForVulnerabilityRiskAssessment a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for vulnerability risk analysis" ; + d3f:has-link "https://patents.google.com/patent/US9317692B2"^^xsd:anyURI ; + d3f:kb-abstract "Embodiments of the present invention are directed to a method and system for automated risk analysis. The method includes accessing host configuration information of a host and querying a vulnerability database based on the host configuration information. The method further includes receiving a list of vulnerabilities and accessing a plurality of vulnerability scores. The list of vulnerabilities corresponds to vulnerabilities of the host. Vulnerabilities can be removed from the list based on checking for installed fixes corresponding to vulnerability. A composite risk score can then be determined for the host a nd each software product of the host based on the plurality of vulnerability scores. An aggregate risk score can then be determined for the host and each software product of the host based on the plurality of vulnerability scores." ; + d3f:kb-author "Matthew Cruz Elder, Darrell Martin Kienzle, Pratyusa K. Manadhata, Ryan Kumar Persaud" ; + d3f:kb-organization "CA Inc" ; + d3f:kb-reference-of d3f:AssetVulnerabilityEnumeration ; + d3f:kb-reference-title "System and method for vulnerability risk analysis" . + +d3f:Reference-SystemAndMethodsThereofForCausalityIdentificationAndAttributionsDeterminationOfProcessesInANetwork_PaloAltoNetworksIncCyberSecdoLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and methods thereof for causality identification and attributions determination of processes in a network - Palo Alto Networks IncCyber Secdo Ltd" ; + d3f:has-link "https://patents.google.com/patent/US20170195350A1/en?oq=US-2017195350-A1"^^xsd:anyURI ; + d3f:kb-abstract "A system is used for detection of advanced persistent and non-persistent threats in a computerized environment. The system is connected to a plurality of user devices coupled to an enterprise's network. The system receives via an interface an electronic notification of at least one event in the operating system of the computer. The system then analyzes the at least one event. The system then generates a causality chain for the at least one event respective of the analysis. The causality chain comprises all the threads that attributed to the at least one event in a chronological order. The system then identifies a main thread that started the causality chain that led to the at least one event. Then, the system determines whether the main thread is associated with malicious software. Upon determination that the main thread is associated with malicious software, the causality chain is marked as infected." ; + d3f:kb-author "Gil BARAK" ; + d3f:kb-mitre-analysis "This patent describes detecting malicious processes on a host. Agents are deployed on hosts that monitor all initiated processes and determine whether a process was initiated at boot or initiated by another process. If not initiated at boot or by another process, the process is identified as suspicious and an alert is triggered." ; + d3f:kb-organization "Palo Alto Networks IncCyber Secdo Ltd" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "System and methods thereof for causality identification and attributions determination of processes in a network" . + +d3f:Reference-SystemAndMethodsThereofForIdentificationOfSuspiciousSystemProcesses_PaloAltoNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and methods thereof for identification of suspicious system processes - Palo Alto Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170286683A1/en?oq=US-2017286683-A1"^^xsd:anyURI ; + d3f:kb-abstract "A computerized method for identification of suspicious processes executing on an end-point device communicatively connected to network, the network communicatively connected to a server, the method comprising receiving, by the server, a record of at least one process, initiated by and executing on by the end-point device. One or more parameters associated with the at least one process are identified. A first time pointer is identified corresponding to the identified one or more parameters, a first time pointer. A second time pointer at which a user associated with the end-point device initiated a user dependent process is identified. Whether the second time pointer occurred before the first time pointer is identified. It is determined whether the at least one process was initiated by the user based on identification of user dependent processes and corresponding attribution. An action is performed based on the above determination." ; + d3f:kb-author "Gil BARAK" ; + d3f:kb-mitre-analysis "The patent describes detecting malicious processes by identifying the order of process initiation. The start of a user initiated process (user query, opening an application, etc.) is compared with the start of processes initiated by the device (ex. during boot). In addition, a determination is made on whether processes are not initiated by a user by examining process parameters such as type of process, its creator, source, etc. If it is determined that a user initiated process was started before a process initiated by the device and a process was not initiated by the user, the process is marked as suspicious." ; + d3f:kb-organization "Palo Alto Networks Inc" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "System and methods thereof for identification of suspicious system processes" . + +d3f:Reference-SystemAndMethodsThereofForLogicalIdentificationOfMaliciousThreatsAcrossAPluralityOfEnd-pointDevicesCommunicativelyConnectedByANetwork_PaloAltoNetworksIncCyberSecdoLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and methods thereof for logical identification of malicious threats across a plurality of end-point devices (epd) communicatively connected by a network - Palo Alto Networks IncCyber Secdo Ltd" ; + d3f:has-link "https://patents.google.com/patent/US20180373870A1/en?oq=US-2018373870-A1"^^xsd:anyURI ; + d3f:kb-abstract "A computerized method for logical identification of malicious threats across a plurality of end-point devices (EPD) communicatively connected by a network, comprising collecting over the network an identifier associated with each file of a plurality of files, wherein each file of the plurality of files is installed on at least one of the plurality of EPDs and wherein the identifier is the same for each like file of the plurality of file. Information associated with an identified subset of files is collected, wherein the information indicates at least a time at which the at least one file was installed on one or more of the plurality of EPDs and the way the at least one file spread within the network. The collected information is analyzed according to a set of predetermined computerized investigation rules. The analysis is used to determine whether at least a file of the identified subset files is a suspicious file." ; + d3f:kb-author "Gil BARAK" ; + d3f:kb-mitre-analysis "This patent describes detecting suspicious files using file metadata such as the prevalence of the file deployed on the network, file installation times, and how the file was spread within the network. The combination of these factors are used to determine a risk score of the file and if below a threshold, sends an alert." ; + d3f:kb-organization "Palo Alto Networks IncCyber Secdo Ltd" ; + d3f:kb-reference-of d3f:FileContentRules ; + d3f:kb-reference-title "System and methods thereof for logical identification of malicious threats across a plurality of end-point devices (epd) communicatively connected by a network" . + +d3f:Reference-SystemAndMethodsThereofForPreventingRansomwareFromEncryptingDataElementsStoredInAMemoryOfAComputer-basedSystem_PaloAltoNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and methods thereof for preventing ransomware from encrypting data elements stored in a memory of a computer-based system - Palo Alto Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170308711A1/en?oq=US-2017308711-A1"^^xsd:anyURI ; + d3f:kb-abstract "A computerized method for preventing ransomware from encrypting data elements stored in a memory of a computer-based system, the method comprising identifying at least one identifier for a data element, wherein the at least one identifier indicates at least a position of the data element within the memory. An optimal number of virtual traps is determined for the data element corresponding to the at least one identifier. An optimal position for each of the virtual traps is determined corresponding to the at least one identifier. The virtual traps are send to the determined optimal position within the memory." ; + d3f:kb-author "Gil BARAK" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Palo Alto Networks Inc" ; + d3f:kb-reference-of d3f:DecoyFile ; + d3f:kb-reference-title "System and methods thereof for preventing ransomware from encrypting data elements stored in a memory of a computer-based system" . + +d3f:Reference-SystemForDetectingThreatsUsingScenario-basedTrackingOfInternalAndExternalNetworkTraffic_VECTRANETWORKSInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System for detecting threats using scenario-based tracking of internal and external network traffic - VECTRA NETWORKS Inc" ; + d3f:has-link "https://patents.google.com/patent/US20160191563A1"^^xsd:anyURI ; + d3f:kb-abstract "Disclosed is an improved approach to implement a system and method for detecting insider threats, where models are constructed that is capable of defining what constitutes the normal behavior for any given hosts and quickly find anomalous behaviors that could constitute a potential threat to an organization. The disclosed approach provides a way to identify abnormal data transfers within and external to an organization without the need for individual monitoring software on each host, by leveraging metadata that describe the data exchange patterns observed in the network." ; + d3f:kb-author "Nicolas BEAUCHESNE; David Lopes Pegna" ; + d3f:kb-mitre-analysis """Determination of anomalous data transfers is performed over a given time period. For example, a check of a pull vs. push data ratio can be established over a specific time period, e.g., over a three-hour period, over a one day period, over a one week period, etc. + +The system can also establish a baseline behavior for data exchange for each host in terms of pull vs. push data ratio for each resource contacted by the host. + +Network packet capture data is collected and metadata is extracted. Aggregate data push/pull information from the metadata is then analyzed for a given host versus specific client to server relationships. This technique can potentially catch lateral data transfers, and may have filtering on alerting logic to only raise alarms when external hosts receive large data transfers.""" ; + d3f:kb-organization "VECTRA NETWORKS Inc" ; + d3f:kb-reference-of d3f:PerHostDownload-UploadRatioAnalysis ; + d3f:kb-reference-title "System for detecting threats using scenario-based tracking of internal and external network traffic" . + +d3f:Reference-SystemForImplementingThreatDetectionUsingThreatAndRiskAssessmentOfAsset-actorInteractions_VECTRANETWORKSInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System for implementing threat detection using threat and risk assessment of asset-actor interactions - VECTRA NETWORKS Inc" ; + d3f:has-link "https://patents.google.com/patent/US20160191559A1"^^xsd:anyURI ; + d3f:kb-abstract "Disclosed is an approach to detect insider threats, by tracking unusual access activity for a specific user or computer with regard to accessing key assets over time. In this way, malicious activity and the different preparation phases of attacks can be identified." ; + d3f:kb-author "Himanshu Mhatre; David Lopes Pegna; Oliver Brdiczka" ; + d3f:kb-mitre-analysis "The patent describes an insider threat detection system that analyzes packets sent within a network to identify and isolate malicious behavior. Current network traffic is collected and developed into a baseline that establishes the amount of data sent and received between a specific asset and a host. Current data transfer values are then compared with the baseline to identify anomalies." ; + d3f:kb-organization "VECTRA NETWORKS Inc" ; + d3f:kb-reference-of d3f:UserDataTransferAnalysis ; + d3f:kb-reference-title "System for implementing threat detection using threat and risk assessment of asset-actor interactions" . + +d3f:Reference-SystemsAndMethodsForDetectingCredentialTheft_SymantecCorp a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Systems and methods for detecting credential theft - Symantec Corp" ; + d3f:has-link "https://patents.google.com/patent/US10162962B1"^^xsd:anyURI ; + d3f:kb-abstract "The disclosed computer-implemented method for detecting credential theft may include (i) monitoring a secured computing system's credential store that may include at least one sensitive credential that may be used to facilitate authentication of a user that is attempting to access the secured computing system, (ii) gathering, while monitoring the credential store, primary evidence of an attempted theft of the sensitive credential from the credential store, (iii) gathering corroborating evidence of the attempted theft of the sensitive credential, and (iv) performing a security action in response to gathering the primary evidence and the corroborating evidence of the attempted theft. The primary evidence of the attempted theft of the sensitive credential may include evidence of any suspicious access of the sensitive credential from the credential store that occurs outside of a procedure of authenticating the user. Various other methods, systems, and computer-readable media are also disclosed." ; + d3f:kb-author "Adam Glick; Brian Schlatter; Feng Li; Akshata Krishnamoorthy Rao" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Symantec Corp" ; + d3f:kb-reference-of d3f:CredentialCompromiseScopeAnalysis ; + d3f:kb-reference-title "Systems and methods for detecting credential theft" . + +d3f:Reference-TCGTrustedAttestationProtocolUseCasesForTPMFamilies1.2And2.0AndDICE a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - TCG Trusted Attestation Protocol Use Cases for TPM Families 1.2 and 2.0 and DICE" ; + d3f:has-link "https://trustedcomputinggroup.org/wp-content/uploads/TCG_TNC_TAP_Use_Cases_v1r0p35_published.pdf"^^xsd:anyURI ; + d3f:kb-reference-title "TCG Trusted Attestation Protocol Use Cases for TPM Families 1.2 and 2.0 and DICE" . + + a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - TPM 2.0 Library Specification - Trusted Computing Group, Incorporated" ; + d3f:has-link "https://trustedcomputinggroup.org/resource/tpm-library-specification/"^^xsd:anyURI ; + d3f:kb-abstract """This specification defines the Trusted Platform Module (TPM) a device that enables trust in computing +platforms in general. It is broken into parts to make the role of each part clear. All parts are required in +order to constitute a complete standard. For a complete definition of all requirements necessary to build a TPM, the designer will need to use the appropriate platform-specific specification to understand all of the requirements for a TPM in a specific application or make appropriate choices as an implementer. Those wishing to create a TPM need to be aware that this specification does not provide a complete picture of the options and commands necessary to implement a TPM. To implement a TPM the designer needs to refer to the relevant platform-specific specification to understand the options and settings required for a TPM in a specific type of platform or make appropriate choices as an implementer.""" ; + d3f:kb-author "Trusted Computing Group" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Trusted Computing Group, Incorporated" ; + d3f:kb-reference-of d3f:TPMBootIntegrity ; + d3f:kb-reference-title "TPM 2.0 Library Specification" . + +d3f:Reference-TamperProofMutatingSoftware_ARXANTECHNOLOGIESInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Tamper proof mutating software - ARXAN TECHNOLOGIES Inc" ; + d3f:has-link "https://patents.google.com/patent/US9262600B2/en?oq=US9262600B2"^^xsd:anyURI ; + d3f:kb-abstract "System and method is disclosed for protecting client software running on a client computer from tampering using a secure server. Prior to or independent of executing the client software, the system integrates self-protection into the client software; removes functions from the client software for execution on the server; develops client software self-protection updates; and periodically distributes the updates. During execution of the client software, the system receives an initial request from the client computer for execution of the removed function; verifies the initial request; and cooperates with the client computer in execution of the client software if verification is successful. If verification is unsuccessful, the system can attempt to update the client software on the client computer; and require a new initial request. Client software can be updated on occurrence of a triggering event. Communications can be encrypted, and the encryption updated. Authenticating checksums can be used for verification." ; + d3f:kb-author "Kevin Dale Morgan" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "ARXAN TECHNOLOGIES Inc" ; + d3f:kb-reference-of d3f:ProcessCodeSegmentVerification ; + d3f:kb-reference-title "Tamper proof mutating software" . + +d3f:Reference-Technical_Specifications_for_Construction_and_Management_of_Sensitive_Compartmented_Information_Facilities a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Technical Specifications for Construction and Management of Sensitive Compartmented Information Facilities" ; + d3f:has-link "https://www.dni.gov/files/Governance/IC-Tech-Specs-for-Const-and-Mgmt-of-SCIFs-v15.pdf"^^xsd:anyURI ; + d3f:kb-author "National Counterintelligence and Security Center" ; + d3f:kb-reference-of d3f:RFShielding ; + d3f:kb-reference-title "Technical Specifications for Construction and Management of Sensitive Compartmented Information Facilities" . + +d3f:Reference-TenablePassiveNetworkMonitoring a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Tenable Passive Network Monitoring" ; + d3f:has-link "https://www.tenable.com/sites/default/files/solution-briefs/SB-Passive-Network-Monitoring.pdf"^^xsd:anyURI ; + d3f:kb-abstract "Tenable Nessus® Network Monitor (NNM), a passive monitoring sensor, continuously discovers active assets on the network and assesses them for vulnerabilities. NNM is based on patented network discovery and vulnerability analysis technology that continuously monitors and profiles non-intrusively. It monitors IPv4, IPv6 and mixed network traffic at the packet layer to determine topology, services and vulnerabilities." ; + d3f:kb-organization "Tenable" ; + d3f:kb-reference-of d3f:DirectPhysicalLinkMapping, + d3f:PassiveLogicalLinkMapping ; + d3f:kb-reference-title "Tenable Passive Network Monitoring" . + +d3f:Reference-Testing_Metrics_for_Password_Creation_Policies_by_Attacking_Large_Sets_of_Revealed_Passwords a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Testing Metrics for Password Creation Policies by Attacking Large Sets of Revealed Passwords" ; + d3f:has-link "https://www.cs.umd.edu/~jkatz/security/downloads/passwords_revealed-weir.pdf"^^xsd:anyURI ; + d3f:kb-author "Matt Weir, Sudhir Aggarwal, Michael Collins, Henry Stern" ; + d3f:kb-reference-of d3f:StrongPasswordPolicy ; + d3f:kb-reference-title "Testing Metrics for Password Creation Policies by Attacking Large Sets of Revealed Passwords" . + +d3f:Reference-ThePyramidOfPain-DavidBianco a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - The Pyramid of Pain - David Bianco" ; + d3f:has-link "http://detect-respond.blogspot.com/2013/03/the-pyramid-of-pain.html"^^xsd:anyURI ; + d3f:kb-abstract "This article identifies progressive levels of adversary difficulty encountered for various types of indicators." ; + d3f:kb-author "David Bianco" ; + d3f:kb-reference-of d3f:IdentifierActivityAnalysis ; + d3f:kb-reference-title "The Pyramid of Pain" . + +d3f:Reference-ThreatDetectionForReturnOrientedProgramming_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Threat detection for return oriented programming - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US20140075556A1"^^xsd:anyURI ; + d3f:kb-abstract "This disclosure describes, in part, techniques for detecting security exploits associated with return-oriented programming. The techniques include determining that a retrieved count is indicative of malicious activity, such as return oriented programming. The count may be retrieved from a processor performance counter of prediction mismatches, the prediction mismatches resulting from comparisons of a call stack of a computing device and of a shadow call stack maintained by a processor of the computing device. The techniques further include performing at least one security response action in response to determining that the count indicates malicious activity." ; + d3f:kb-author "Georg WICHERSKI" ; + d3f:kb-mitre-analysis "This patent describes a technique for detecting shellcode security exploits. A call stack of a computing device is compared with a shadow call stack maintained by a processor of the computing device since a return oriented program may only be able to control or spoof the call stack and not the shadow call stack. Mismatches between the two are counted and if the number of mismatches exceeds a certain threshold it is an indication of malicious activity and a security response action is performed." ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:ShadowStackComparisons ; + d3f:kb-reference-title "Threat detection for return oriented programming" . + +d3f:Reference-ThreatDetectionThroughTheAccumulatedDetectionOfThreatCharacteristics_SophosLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Threat detection through the accumulated detection of threat characteristics - Sophos Ltd" ; + d3f:has-link "https://patents.google.com/patent/US9104864B2/en?oq=US-9104864-B2"^^xsd:anyURI ; + d3f:kb-abstract "Embodiments of the present disclosure provide for improved capabilities in the detection of malware, where malware threats are detected through the accumulated identification of threat characteristics for targeted computer objects. Methods and systems include dynamic threat detection providing a first database that correlates a plurality of threat characteristics to a threat, wherein a presence of the plurality of the threat characteristics confirms a presence of the threat; detecting a change event in a computer run-time process; testing the change event for a presence of one or more of the plurality of characteristics upon detection of the change event; storing a detection of one of the plurality of characteristics in a second database that accumulates detected characteristics for the computer run-time process; and identifying the threat when each one of the plurality of characteristics appears in the second database." ; + d3f:kb-author "Clifford Penton; Irene Michlin" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Sophos Ltd" ; + d3f:kb-reference-of d3f:ProcessCodeSegmentVerification ; + d3f:kb-reference-title "Threat detection through the accumulated detection of threat characteristics" . + +d3f:Reference-TokenlessBiometricTransactionAuthorizationMethodAndSystem a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Tokenless biometric transaction authorization method and system" ; + d3f:has-link "https://patents.google.com/patent/US5870723A/"^^xsd:anyURI ; + d3f:kb-abstract "A method and system for tokenless authorization of commercial transactions between a buyer and a seller using a computer system. A transaction is proposed by a seller, and the buyer signals his acceptance by entering his personal authentication information comprising a PIN and at least one biometric sample, forming a commercial transaction message. The commercial transaction message is forwarded to the computer system, where the computer system compares the personal authentication information in the commercial transaction message with previously registered buyer biometric samples. If the computer system successfully identifies the buyer, a financial account of the buyer is debited and a financial account of the seller is credited, and the results of the transaction are presented to both buyer and seller. As a result of the invention, a buyer can conduct commercial transactions without having to use any tokens such as portable man-made memory devices such as smartcards or swipe cards. The invention allows buyers to quickly select one of a group of different financial accounts from which to transfer funds. The invention further indicates to the user that the authentic computer system was accessed by the use of a private code that is returned to the buyer after the identification is complete. The invention additionally permits an authorized buyer to alert authorities in the event of an emergency, such as when a transaction is coerced." ; + d3f:kb-organization "SmartTouch Inc" ; + d3f:kb-reference-of d3f:BiometricAuthentication ; + d3f:kb-reference-title "Tokenless biometric transaction authorization method and system" . + +d3f:Reference-Tripwire a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Tripwire" ; + d3f:has-link "https://linux.die.net/man/8/tripwire"^^xsd:anyURI ; + d3f:kb-reference-of d3f:FileIntegrityMonitoring ; + d3f:kb-reference-title "Reference - Tripwire" . + +d3f:Reference-TrustedAttestationProtocolUseCases a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Trusted Attestation Protocol Use Cases" ; + d3f:has-link "https://trustedcomputinggroup.org/wp-content/uploads/TCG_TNC_TAP_Use_Cases_v1r0p35_published.pdf"^^xsd:anyURI ; + d3f:kb-article """## Document Abstract +This specification defines the Trusted Platform Module (TPM) a device that enables trust in computing platforms in general. It is broken into parts to make the role of each part clear. All parts are required in order to constitute a complete standard. For a complete definition of all requirements necessary to build a TPM, the designer will need to use the appropriate platform-specific specification to understand all of the requirements for a TPM in a specific application or make appropriate choices as an implementer. Those wishing to create a TPM need to be aware that this specification does not provide a complete picture of the options and commands necessary to implement a TPM. To implement a TPM the designer needs to refer to the relevant platform-specific specification to understand the options and settings required for a TPM in a specific type of platform or make appropriate choices as an implementer.""" ; + d3f:kb-reference-title "Trusted Attestation Protocol Use Cases" . + +d3f:Reference-TypeSystems_Princeton a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - Type Systems" ; + d3f:has-link "https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node4.html"^^xsd:anyURI ; + d3f:kb-organization "Princeton University" ; + d3f:kb-reference-of d3f:VariableTypeValidation ; + d3f:kb-reference-title "Why type checking?" . + +d3f:Reference-UACBypass_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2019-04-001: UAC Bypass - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2019-04-001/"^^xsd:anyURI ; + d3f:kb-abstract "Bypassing user account control (UAC Bypass) is generally done by piggybacking on a system process that has auto-escalate privileges. This analytic looks to detect those cases as described by the open-source UACME tool." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis ; + d3f:kb-reference-title "CAR-2019-04-001: UAC Bypass" . + +d3f:Reference-UEFIPlatformInitialization-Specification a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - UEFI Platform Initialization (PI) Specification" ; + d3f:has-link "https://uefi.org/sites/default/files/resources/PI_Spec_1_7_A_final_May1.pdf"^^xsd:anyURI ; + d3f:kb-reference-of d3f:BootloaderAuthentication ; + d3f:kb-reference-title "UEFI Platform Initialization (PI) Specification" . + +d3f:Reference-USBFilterForHubMaliciousCodePreventionSystem a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - USB filter for hub malicious code prevention system" ; + d3f:has-link "https://patents.google.com/patent/US9990325B2/en"^^xsd:anyURI ; + d3f:kb-abstract "The present invention relates generally to computer systems, and more specifically, to a universal serial bus (USB) filter hub for a computer system." ; + d3f:kb-author "Steven R Hetzler, Daniel F Smith" ; + d3f:kb-organization "International Business Machines Corp" ; + d3f:kb-reference-of d3f:IOPortRestriction ; + d3f:kb-reference-title "Universal serial bus (USB) filter hub malicious code prevention system" . + +d3f:Reference-UnderstandingtheDomainRegistrationBehaviorofSpammers a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Understanding the Domain Registration Behavior of Spammers" ; + d3f:has-link "https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=bf4d34a6f9d0168bb07433e84c1567bbe1ba8188"^^xsd:anyURI ; + d3f:kb-abstract "Spammers register a tremendous number of domains to evade blacklisting and takedown efforts. Current techniques to detect such domains rely on crawling spam URLs or monitoring lookup traffic. Such detection techniques are only effective after the spammers have already launched their campaigns, and thus these countermeasures may only come into play after the spammer has already reaped significant benefits from the dissemination of large volumes of spam. In this paper we examine the registration process of such domains, with a particular eye towards features that might indicate that a given domain likely has a malicious purpose at registration time, before it is ever used for an attack. Our assessment includes exploring the characteristics of registrars, domain life cycles, registration bursts, and naming patterns. By investigating zone changes from the .com TLD over a 5-month period, we discover that spammers employ bulk registration, that they often re-use domains previously registered by others, and that they tend to register and host their domains over a small set of registrars. Our findings suggest steps that registries or registrars could use to frustrate the efforts of miscreants to acquire domains in bulk, ultimately reducing their agility for mounting large-scale attacks." ; + d3f:kb-author "Hao S, Thomas M, Paxson V, Feamster N, Kreibich C, Grier C, Hollenbeck S" ; + d3f:kb-reference-of d3f:DomainRegistrationTakedown ; + d3f:kb-reference-title "Understanding the Domain Registration Behavior of Spammers" . + +d3f:Reference-UseOfAnApplicationControllerToMonitorAndControlSoftwareFileAndApplicationEnvironments_SophosLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Use of an application controller to monitor and control software file and application environments - Sophos Ltd" ; + d3f:has-link "https://patents.google.com/patent/US20180032727A1"^^xsd:anyURI ; + d3f:kb-abstract "In embodiments of the present invention, a framework for an extensible, file-based security system is described for determining an appropriate application, application environment, and/or access or security control measure based at least in part on a file's reputation. In response to the selection of a file, an application controller may be used to select a software application from two or more software applications to open the selected file, based at least in part on the selected file's reputation. If launched, a software application may be configured to open the file in an environment, such as a virtual machine, quarantined environment, and the like, that is appropriate for the file based at least in part on the reputation information. A software application may be a secure software application configured to manage secure files, or an insecure software application configured to manage insecure files. The selected file, and communications relating to the selected software application, may be managed according to the selected software application's secure or insecure configuration. Further, the selected software application may associate reputation information with all files that are modified and/or created by the selected software application, including at least in part, reputation information matching that of the selected file." ; + d3f:kb-author "Andrew J. Thomas" ; + d3f:kb-mitre-analysis "This patent describes received files being open in an environment such as a virtual machine or quarantined environment to associate file reputation information that determines if a file is a threat." ; + d3f:kb-organization "Sophos Ltd" ; + d3f:kb-reference-of d3f:DynamicAnalysis ; + d3f:kb-reference-title "Use of an application controller to monitor and control software file and application environments" . + +d3f:Reference-UserActivityFromStoppingWindowsDefensiveServices_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2016-04-003: User Activity from Stopping Windows Defensive Services - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2016-04-003/"^^xsd:anyURI ; + d3f:kb-abstract "Spyware and malware remain a serious problem and Microsoft developed security services, Windows Defender and Windows Firewall, to combat this threat. In the event Windows Defender or Windows Firewall is turned off, administrators should correct the issue immediately to prevent the possibility of infection or further infection and investigate to determine if caused by crash or user manipulation." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemDaemonMonitoring ; + d3f:kb-reference-title "CAR-2016-04-003: User Activity from Stopping Windows Defensive Services" . + +d3f:Reference-UserLoginActivityMonitoring_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-10-001: User Login Activity Monitoring - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-10-001/"^^xsd:anyURI ; + d3f:kb-abstract """Monitoring logon and logoff events for hosts on the network is very important for situational awareness. This information can be used as an indicator of unusual activity as well as to corroborate activity seen elsewhere. + +Could be applied to a number of different types of monitoring depending on what information is desired. Some use cases include monitoring for all remote connections and building login timelines for users. Logon events are Windows Event Code 4624 for Windows Vista and above, 518 for pre-Vista. Logoff events are 4634 for Windows Vista and above, 538 for pre-Vista.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:AuthenticationEventThresholding ; + d3f:kb-reference-title "CAR-2013-10-001: User Login Activity Monitoring" . + +d3f:Reference-UsingSpanningTreeProtocolSTPToEnhanceLayer2NetworkTopologyMaps a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Using spanning tree protocol (STP) to enhance layer-2 topology maps" ; + d3f:has-link "https://patents.google.com/patent/US8045488B2"^^xsd:anyURI ; + d3f:kb-abstract "Spanning Tree Protocol (STP) data is obtained via network switch (SNMP) queries to enhance identification of switch-to-switch links in Layer-2 mapping. In particular, by analyzing the STP data, ambiguity in determining switch uplink ports may be reduced. Specifically, the STP data can be used in conjunction with other topography data to provide Layer-2 connectivity for nodes on a network topology. Layer-2 address mapping tables are collected from a topology mapping, and STP data is collected, along with address translation tables (ARP) tables. Using this information, switches are identified using Layer-2 address tables. The STP data can be correlated by comparing data in switches, identifying switch ports directly connected to other switch ports, and eliminating direct switch-to-switch port connections from consideration for further Layer-2 node mappings." ; + d3f:kb-author "Michael Jon Swan" ; + d3f:kb-organization "SolarWinds Worldwide LLC" ; + d3f:kb-reference-of d3f:ActivePhysicalLinkMapping ; + d3f:kb-reference-title "Using spanning tree protocol (STP) to enhance layer-2 topology maps" . + +d3f:Reference-VariableInitialization_CWE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - Variable Initialization - CWE-457" ; + d3f:has-link "https://cwe.mitre.org/data/definitions/457.html"^^xsd:anyURI ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:VariableInitialization ; + d3f:kb-reference-title "CWE-457: Use of Uninitialized Variable" . + +d3f:Reference-VirtualizedProcessIsolation_AdvancedMicroDevicesInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Virtualized process isolation - Advanced Micro Devices Inc" ; + d3f:has-link "https://patents.google.com/patent/US20180081829A1"^^xsd:anyURI ; + d3f:kb-abstract "Systems, apparatuses, and methods for implementing virtualized process isolation are disclosed. A system includes a kernel and multiple guest VMs executing on the system's processing hardware. Each guest VM includes a vShim layer for managing kernel accesses to user space and guest accesses to kernel space. The vShim layer also maintains a separate set of page tables from the kernel page tables. In one embodiment, data in the user space is encrypted and the kernel goes through the vShim layer to access user space data. When the kernel attempts to access a user space address, the kernel exits and the vShim layer is launched to process the request. If the kernel has permission to access the address, the vShim layer copies the data to a region in kernel space and then returns execution to the kernel." ; + d3f:kb-author "David A. Kaplan" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Advanced Micro Devices Inc" ; + d3f:kb-reference-of d3f:Hardware-basedProcessIsolation ; + d3f:kb-reference-title "Virtualized process isolation" . + +d3f:Reference-WebAuthentication_AnAPIForAccessingPublicKeyCredentials%0ALevel2 a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label """Reference - Web Authentication: An API for accessing Public Key Credentials +Level 2""" ; + d3f:has-link "https://www.w3.org/TR/webauthn-2/"^^xsd:anyURI ; + d3f:kb-abstract "This specification defines an API enabling the creation and use of strong, attested, scoped, public key-based credentials by web applications, for the purpose of strongly authenticating users. Conceptually, one or more public key credentials, each scoped to a given WebAuthn Relying Party, are created by and bound to authenticators as requested by the web application. The user agent mediates access to authenticators and their public key credentials in order to preserve user privacy. Authenticators are responsible for ensuring that no operation is performed without user consent. Authenticators provide cryptographic proof of their properties to Relying Parties via attestation. This specification also describes the functional model for WebAuthn conformant authenticators, including their signature and attestation functionality." ; + d3f:kb-author "W3C" ; + d3f:kb-reference-of d3f:CredentialTransmissionScoping ; + d3f:kb-reference-title """Web Authentication: An API for accessing Public Key Credentials +Level 2""" . + +d3f:Reference-WhatIsNX_XDFeature_RedHat a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - What is NX/XD feature?" ; + d3f:has-link "https://access.redhat.com/solutions/2936741"^^xsd:anyURI ; + d3f:kb-abstract """What is NX/XD feature ? +How to check whether NX/XD is enabled ? +How to enable or disable NX/XD? + +NX/XD is a hardware cpu feature which is provided in almost all the hardware. Some BIOS has advanced option of enabling or disabling it. +NX stands for No eXecute and XD stands for eXecute Disable. Both are same and is a technology used in processors to prevent execution of certain types of code.""" ; + d3f:kb-author "Red Hat" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Red Hat" ; + d3f:kb-reference-of d3f:ProcessSegmentExecutionPrevention ; + d3f:kb-reference-title "What is NX/XD feature?" . + +d3f:Reference-Windows10STIG a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Windows 10 STIG" ; + d3f:has-link "https://www.stigviewer.com/stig/windows_10/"^^xsd:anyURI ; + d3f:kb-abstract "Windows 10 STIG guidance." ; + d3f:kb-reference-of d3f:ApplicationConfigurationHardening ; + d3f:kb-reference-title "Windows 10 Security Technical Implementation Guide" . + +d3f:Reference-WindowsRemoteManagement_WinRM_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-11-006: Windows Remote Management (WinRM) - MITRE" ; + d3f:has-link ""^^xsd:anyURI ; + d3f:kb-abstract "" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:AdministrativeNetworkActivityAnalysis ; + d3f:kb-reference-title "CAR-2014-11-006: Windows Remote Management (WinRM)" . + +d3f:ReferenceNullification a owl:Class, + owl:NamedIndividual ; + rdfs:label "Reference Nullification" ; + d3f:d3fend-id "D3-RN" ; + d3f:definition "Invalidating all pointers that reference a specific memory block, ensuring that the block cannot be accessed or modified after deallocation." ; + d3f:hardens d3f:MemoryFreeFunction ; + d3f:kb-article """## How it Works +Nullifying references to memory blocks makes those blocks no longer accessible. This is critical to prevent use-after-free errors. + +## Considerations +* If a memory block is freed, all other references to that block should be nullified. +* This is particularly relevant when manually managing memory. +* Note: This resource should not be considered a definitive or exhaustive coding guideline.""" ; + d3f:kb-reference d3f:Reference-ReferenceNullification_SecureSoftwareInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:MemoryFreeFunction ], + d3f:SourceCodeHardening . + +d3f:ReissueCredential a d3f:ReissueCredential, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Reissue Credential" ; + d3f:d3fend-id "D3-RIC" ; + d3f:definition "Issue a new credential to a user which supercedes their old credential." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + d3f:restores d3f:Credential ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restores ; + owl:someValuesFrom d3f:Credential ], + d3f:RestoreAccess . + +d3f:RemoteResource a owl:Class ; + rdfs:label "Remote Resource" ; + d3f:definition "In computing, a remote resource is a computer resource made available from one host to other hosts on a computer network. It is a device or piece of information on a computer that can be remotely accessed from another computer, typically via a local area network or an enterprise intranet." ; + rdfs:seeAlso d3f:NetworkResource ; + rdfs:subClassOf d3f:Resource . + +d3f:Repository a owl:Class ; + rdfs:label "Repository" ; + d3f:definition "A centralized digital storage location where code, files, and related resources are systematically organized, managed, and maintained." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:RestoreConfiguration a d3f:RestoreConfiguration, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore Configuration" ; + d3f:d3fend-id "D3-RC" ; + d3f:definition "Restoring an software configuration." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + d3f:restores d3f:ConfigurationResource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restores ; + owl:someValuesFrom d3f:ConfigurationResource ], + d3f:RestoreObject . + +d3f:RestoreDatabase a d3f:RestoreDatabase, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore Database" ; + d3f:d3fend-id "D3-RD" ; + d3f:definition "Restoring the data in a database." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + d3f:restores d3f:Database ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restores ; + owl:someValuesFrom d3f:Database ], + d3f:RestoreObject . + +d3f:RestoreDiskImage a d3f:RestoreDiskImage, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore Disk Image" ; + d3f:d3fend-id "D3-RDI" ; + d3f:definition "Restoring a previously captured disk image a hard drive." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + rdfs:subClassOf d3f:RestoreObject . + +d3f:RestoreEmail a d3f:RestoreEmail, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore Email" ; + d3f:d3fend-id "D3-RE" ; + d3f:definition "Restoring an email for an entity to access." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + d3f:restores d3f:Email ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restores ; + owl:someValuesFrom d3f:Email ], + d3f:RestoreFile . + +d3f:RestoreNetworkAccess a d3f:RestoreNetworkAccess, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore Network Access" ; + d3f:d3fend-id "D3-RNA" ; + d3f:definition "Restoring a entity's access to a computer network." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + d3f:restores d3f:Host ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restores ; + owl:someValuesFrom d3f:Host ], + d3f:RestoreAccess . + +d3f:RestoreSoftware a d3f:RestoreSoftware, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore Software" ; + d3f:d3fend-id "D3-RS" ; + d3f:definition "Restoring software to a host." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + d3f:restores d3f:Software ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restores ; + owl:someValuesFrom d3f:Software ], + d3f:RestoreObject . + +d3f:ReverseResolutionIPDenylisting a d3f:ReverseResolutionIPDenylisting, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Reverse Resolution IP Denylisting" ; + d3f:blocks d3f:OutboundInternetDNSLookupTraffic ; + d3f:d3fend-id "D3-RRID" ; + d3f:definition "Blocking a reverse lookup based on the query's IP address value." ; + d3f:kb-article """## How it works +This technique prevents a client from learning domains deemed to be potentially malicious, which would have been delivered via reverse resolution responses over the DNS protocol. + +Queries for reverse resolution requests (that is, requests where IP(s) are sent and a domain is returned) are collected, and the IP address(es) included in the query are examined. If the IP address(es) are in a range included in the blacklist, then the query is dropped. + +## Considerations +- The blacklist will have to be maintained and will need to be kept up to date with identified maintenance cycles to ensure lists are not stale. +- DNS query traffic can be transmitted over many different protocols, which presents a challenge to implementing methods to extract all DNS query IP address value(s). + - DNS has historically used UDP port 53, with TCP port 53 instead used for responses over 512 bytes or after a lack of response over UDP. + - Usage of new protocols to provide confidentiality for DNS traffic, such as DoH (DNS over HTTPS) and DoT (DNS over TLS), complicates collection of the IP address(es) in DNS queries. These protocols have often been enabled in browser settings transparently after a browser update, with DNS queries proxied over one of these cryptographic protocols through a specified host.""" ; + d3f:kb-reference d3f:Reference-UseDNSPolicyForApplyingFiltersOnDNSQueries ; + d3f:synonym "Reverse Resolution IP Blacklisting" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:blocks ; + owl:someValuesFrom d3f:OutboundInternetDNSLookupTraffic ], + d3f:DNSDenylisting . + +d3f:Router a owl:Class ; + rdfs:label "Router" ; + d3f:definition "A router is a networking device that forwards data packets between computer networks. Routers perform the traffic directing functions on the Internet. Data sent through the internet, such as a web page or email, is in the form of data packets. A packet is typically forwarded from one router to another router through the networks that constitute an internetwork (e.g. the Internet) until it reaches its destination node." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ComputerNetworkNode . + +d3f:Semi-supervisedTransductiveLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Transductive Learning" ; + d3f:d3fend-id "D3A-SSTL" ; + d3f:definition """The goal of transductive learning is to infer the correct labels for the given unlabeled data +x_{l+1},... ,x_{l+u} only""" ; + d3f:kb-article """## References +Semi-Supervised Learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Semi-Supervised_Learning#Semi-supervised_learning). + +Zhou, D., & Li, M. (2005). Semi-supervised learning by higher order regularization. In Proceedings of the 43rd Annual Meeting of the Association for Computational Linguistics (ACL) (pp. 1-9). [Link](https://www.cs.sfu.ca/~anoop/papers/pdf/semisup_naacl.pdf).""" ; + rdfs:subClassOf d3f:Semi-SupervisedLearning . + +d3f:ServiceAccount a owl:Class ; + rdfs:label "Service Account" ; + d3f:definition "A service account is a type of account used by an application or service to interact with the operating system." ; + d3f:synonym "System Account" ; + rdfs:subClassOf d3f:UserAccount . + +d3f:ServiceProvider a owl:Class ; + rdfs:label "Service Provider" ; + rdfs:subClassOf d3f:Provider . + +d3f:SessionTermination a d3f:SessionTermination, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Session Termination" ; + d3f:d3fend-id "D3-ST" ; + d3f:definition "Forcefully end all active sessions associated with compromised accounts or devices." ; + d3f:deletes d3f:Session ; + d3f:kb-article "Defined in NIST 800-53 as AC-12." ; + d3f:kb-reference d3f:Reference-NIST-Special-Publication-800-53A-Revision-5 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:Session ], + d3f:ProcessEviction . + +d3f:ShortcutFile a owl:Class ; + rdfs:label "Shortcut File" ; + d3f:definition """A shortcut file, or shortcut, is a handle that allows the user to find a file or resource located in a different directory or folder from the place where the shortcut is located. + +Shortcuts, which are supported by the graphical file browsers of some operating systems, may resemble symbolic links but differ in a number of important ways. One difference is what type of software is able to follow them: + + - Symbolic links are automatically resolved by the file system. Any software program, upon accessing a symbolic link, will see the target instead, whether the program is aware of symbolic links or not. + + - Shortcuts are treated like ordinary files by the file system and by software programs that are not aware of them. Only software programs that understand shortcuts (such as the Windows shell and file browsers) treat them as references to other files. + +Another difference are the capabilities of the mechanism: + + - Microsoft Windows shortcuts normally refer to a destination by an absolute path (starting from the root directory), whereas POSIX symbolic links can refer to destinations via either an absolute or a relative path. The latter is useful if both the location and destination of the symbolic link share a common path prefix[clarification needed], but that prefix is not yet known when the symbolic link is created (e.g., in an archive file that can be unpacked anywhere). + +- Microsoft Windows application shortcuts contain additional metadata that can be associated with the destination, whereas POSIX symbolic links are just strings that will be interpreted as absolute or relative pathnames. + +- Unlike symbolic links, Windows shortcuts maintain their references to their targets even when the target is moved or renamed. Windows domain clients may subscribe to a Windows service called Distributed Link Tracking to track the changes in files and folders to which they are interested. The service maintains the integrity of shortcuts, even when files and folders are moved across the network.[14] Additionally, in Windows 9x and later, Windows shell tries to find the target of a broken shortcut before proposing to delete it.""" ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:File . + +d3f:Simulation a owl:Class ; + rdfs:label "Simulation" ; + rdfs:subClassOf d3f:Generation . + +d3f:Skewness a owl:Class, + owl:NamedIndividual ; + rdfs:label "Skewness" ; + d3f:d3fend-id "D3A-SKE" ; + d3f:definition "Skewness is a measure of the asymmetry of the probability distribution of a real-valued random variable about its mean. The standardized moment of a probability distribution function." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Skewness. [Link](https://en.wikipedia.org/wiki/Skewness)""" ; + rdfs:subClassOf d3f:DistributionProperties . + +d3f:StandardDeviation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Standard Deviation" ; + d3f:d3fend-id "D3A-SD" ; + d3f:definition "The standard deviation is a measure of the amount of variation or dispersion of a set of values." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Standard deviation. [Link](https://en.wikipedia.org/wiki/Standard_deviation)""" ; + d3f:synonym "SD" ; + rdfs:subClassOf d3f:Variability . + +d3f:StaticAnalysisTool a owl:Class ; + rdfs:label "Static Analysis Tool" ; + d3f:definition "A static [program] analysis tool performs an automated analysis of computer software without actually executing programs, in contrast with dynamic analysis, which is analysis performed on programs while they are executing. In most cases the analysis is performed on some version of the source code, and in the other cases, some form of the object code." ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:CodeAnalyzer ; + skos:altLabel "Static Program Analysis Tool" . + +d3f:StorageSnapshot a owl:Class ; + rdfs:label "Storage Snapshot" ; + d3f:definition "A storage snapshot is a copy of a storage medium or system environment at a point in time." ; + rdfs:subClassOf d3f:ComputingSnapshot . + +d3f:System a owl:Class ; + rdfs:label "System" ; + d3f:definition "An artifact (instrumentality) that combines interrelated interacting artifacts designed to work as a coherent entity. [Note that not all digital artifacts are systems nor are all systems digital artifacts.]" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Artifact . + +d3f:T1011 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration Over Other Network Medium" ; + d3f:attack-id "T1011" ; + d3f:definition "Adversaries may attempt to exfiltrate data over a different network medium than the command and control channel. If the command and control network is a wired Internet connection, the exfiltration may occur, for example, over a WiFi connection, modem, cellular data connection, Bluetooth, or another radio frequency (RF) channel." ; + d3f:produces d3f:InternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InternetNetworkTraffic ], + d3f:ExfiltrationTechnique . + +d3f:T1020 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Automated Exfiltration" ; + d3f:attack-id "T1020" ; + d3f:definition "Adversaries may exfiltrate data, such as sensitive documents, through the use of automated processing after being gathered during Collection.(Citation: ESET Gamaredon June 2020)" ; + d3f:produces d3f:InternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InternetNetworkTraffic ], + d3f:ExfiltrationTechnique . + +d3f:T1052 a owl:Class ; + rdfs:label "Exfiltration Over Physical Medium" ; + d3f:attack-id "T1052" ; + d3f:definition "Adversaries may attempt to exfiltrate data via a physical medium, such as a removable drive. In certain circumstances, such as an air-gapped network compromise, exfiltration could occur via a physical medium or device introduced by a user. Such media could be an external hard drive, USB drive, cellular phone, MP3 player, or other removable storage and processing device. The physical medium or device could be used as the final exfiltration point or to hop between otherwise disconnected systems." ; + rdfs:subClassOf d3f:ExfiltrationTechnique . + +d3f:T1134.001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Token Impersonation/Theft" ; + d3f:attack-id "T1134.001" ; + d3f:copies d3f:AccessToken ; + d3f:definition "Adversaries may duplicate then impersonate another user's existing token to escalate privileges and bypass access controls. For example, an adversary can duplicate an existing token using `DuplicateToken` or `DuplicateTokenEx`.(Citation: DuplicateToken function) The token can then be used with `ImpersonateLoggedOnUser` to allow the calling thread to impersonate a logged on user's security context, or with `SetThreadToken` to assign the impersonated token to a thread." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:copies ; + owl:someValuesFrom d3f:AccessToken ], + d3f:T1134 . + +d3f:T1485 a owl:Class ; + rdfs:label "Data Destruction" ; + d3f:attack-id "T1485" ; + d3f:definition "Adversaries may destroy data and files on specific systems or in large numbers on a network to interrupt availability to systems, services, and network resources. Data destruction is likely to render stored data irrecoverable by forensic techniques through overwriting files or data on local and remote drives.(Citation: Symantec Shamoon 2012)(Citation: FireEye Shamoon Nov 2016)(Citation: Palo Alto Shamoon Nov 2016)(Citation: Kaspersky StoneDrill 2017)(Citation: Unit 42 Shamoon3 2018)(Citation: Talos Olympic Destroyer 2018) Common operating system file deletion commands such as del and rm often only remove pointers to files without wiping the contents of the files themselves, making the files recoverable by proper forensic methodology. This behavior is distinct from [Disk Content Wipe](https://attack.mitre.org/techniques/T1561/001) and [Disk Structure Wipe](https://attack.mitre.org/techniques/T1561/002) because individual files are destroyed rather than sections of a storage disk or the disk's logical structure." ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1518 a owl:Class ; + rdfs:label "Software Discovery" ; + d3f:attack-id "T1518" ; + d3f:definition "Adversaries may attempt to get a listing of software and software versions that are installed on a system or in a cloud environment. Adversaries may use the information from [Software Discovery](https://attack.mitre.org/techniques/T1518) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions." ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1554 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Compromise Host Software Binary" ; + d3f:attack-id "T1554" ; + d3f:definition "Adversaries may modify host software binaries to establish persistent access to systems. Software binaries/executables provide a wide range of system commands or services, programs, and libraries. Common software binaries are SSH clients, FTP clients, email clients, web browsers, and many other user or server applications." ; + d3f:modifies d3f:ClientApplication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ClientApplication ], + d3f:PersistenceTechnique . + +d3f:T1599 a owl:Class ; + rdfs:label "Network Boundary Bridging" ; + d3f:attack-id "T1599" ; + d3f:definition "Adversaries may bridge network boundaries by compromising perimeter network devices or internal devices responsible for network segmentation. Breaching these devices may enable an adversary to bypass restrictions on traffic routing that otherwise separate trusted and untrusted networks." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1614 a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Location Discovery" ; + d3f:accesses d3f:ConfigurationResource ; + d3f:attack-id "T1614" ; + d3f:definition "" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:ConfigurationResource ], + d3f:DiscoveryTechnique . + +d3f:TargetAudience a owl:Class ; + rdfs:label "Target Audience" ; + rdfs:subClassOf d3f:AgentGroup . + +d3f:TemporalDifferenceLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Temporal Difference Learning" ; + d3f:d3fend-id "D3A-TDL" ; + d3f:definition "Temporal difference (TD) learning refers to a class of model-free reinforcement learning methods which learn by bootstrapping from the current estimate of the value function. These methods sample from the environment, like Monte Carlo methods, and perform updates based on current estimates, like dynamic programming methods" ; + d3f:kb-article """## References +Temporal difference learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Temporal_difference_learning).""" ; + rdfs:comment "Temporal difference (TD) learning refers to a class of model-free reinforcement learning methods which learn by bootstrapping from the current estimate of the value function." ; + rdfs:subClassOf d3f:Model-freeReinforcementLearning . + +d3f:ThinClientComputer a owl:Class ; + rdfs:label "Thin Client Computer" ; + d3f:definition "A thin client is a lightweight computer that has been optimized for establishing a remote connection with a server-based computing environment. The server does most of the work, which can include launching software programs, performing calculations, and storing data. This contrasts with a fat client or a conventional personal computer; the former is also intended for working in a client-server model but has significant local processing power, while the latter aims to perform its function mostly locally. Thin clients are shared computers as the thin client's computing resources are provided by a remote server." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:SharedComputer . + +d3f:TicketGrantingTicket a owl:Class ; + rdfs:label "Ticket Granting Ticket" ; + d3f:definition "In some computer security systems, a Ticket Granting Ticket or Ticket to Get Tickets (TGT) is a small, encrypted identification file with a limited validity period. After authentication, this file is granted to a user for data traffic protection by the key distribution center (KDC) subsystem of authentication services such as Kerberos. The TGT file contains the session key, its expiration date, and the user's IP address, which protects the user from man-in-the-middle attacks. The TGT is used to obtain a service ticket from Ticket Granting Service (TGS). User is granted access to network services only after this service ticket is provided." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:AccessToken ; + skos:altLabel "Golden Ticket" . + +d3f:TrimmedMean a owl:Class, + owl:NamedIndividual ; + rdfs:label "Trimmed Mean" ; + d3f:d3fend-id "D3A-TM" ; + d3f:definition "The arithmetic mean of data values after a certain number or proportion of the highest and lowest data values have been discarded." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Central tendency. [Link](https://en.wikipedia.org/wiki/Central_tendency)""" ; + d3f:synonym "Truncated mean" ; + rdfs:subClassOf d3f:CentralTendency . + +d3f:TrustStore a owl:Class ; + rdfs:label "Trust Store" ; + d3f:definition "Stores public information necessary to determine if another party can be trusted." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:TrustedLibrary a owl:Class, + owl:NamedIndividual ; + rdfs:label "Trusted Library" ; + d3f:d3fend-id "D3-TL" ; + d3f:definition "A trusted library is a collection of pre-verified and secure code modules or components that are used within software applications to perform specific functions. These libraries are considered reliable and have been vetted for security vulnerabilities, ensuring they do not introduce risks into the application." ; + d3f:hardens d3f:Subroutine ; + d3f:kb-article """## How it Works +Using a trusted library can reduce the chances of introducing errors compared to writing code from scratch. + + + +## Considerations + +Note: This resource should not be considered a definitive or exhaustive coding guideline.""" ; + d3f:kb-reference d3f:Reference-LeverageSecurityFrameworksLibraries_OWASP ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:Subroutine ], + d3f:SourceCodeHardening . + +d3f:UnlockAccount a d3f:UnlockAccount, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Unlock Account" ; + d3f:d3fend-id "D3-ULA" ; + d3f:definition "Restoring a user account's access to resources by unlocking a locked User Account." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + d3f:restores d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restores ; + owl:someValuesFrom d3f:UserAccount ], + d3f:RestoreUserAccountAccess . + +d3f:UtilitySoftware a owl:Class ; + rdfs:label "Utility Software" ; + d3f:definition "Utility applications are software applications designed to help to analyze, configure, optimize or maintain a computer. It is used to support the computer infrastructure - in contrast to application software, which is aimed at directly performing tasks that benefit ordinary users. However, utilities often form part of the application systems. For example, a batch job may run user-written code to update a database and may then include a step that runs a utility to back up the database, or a job may run a utility to compress a disk before copying files." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Software ; + skos:altLabel "Utility Application" . + +d3f:VMImage a owl:Class, + owl:NamedIndividual ; + rdfs:label "Virtual Machine Image" ; + d3f:contains d3f:SystemStateImage ; + d3f:definition "A Virtual Machine Image (VMI) is a file that encapsulates the entire state of a virtual machine at a given point in time. This includes the operating system, applications, data, and configurations. VMIs are used to create and replicate virtual machines, ensuring consistency and reliability across different environments." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:SystemStateImage ], + d3f:StorageImage ; + skos:altLabel "VM Image" . + +d3f:VariableTypeValidation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Variable Type Validation" ; + d3f:d3fend-id "D3-VTV" ; + d3f:definition "Ensuring that a variable has the correct type." ; + d3f:hardens d3f:PointerDereferencingFunction ; + d3f:kb-article """## How it Works +A developer should consider how the variable will be used throughout the program and choose the correct variable type. +A developer should programmatically check if a variable has the correct (expected) type before using that variable. + +## Considerations +* The result of an operation on an unexpected variable type will vary based on the language. +* Note: This resource should not be considered a definitive or exhaustive coding guideline.""" ; + d3f:kb-reference d3f:Reference-TypeSystems_Princeton ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:PointerDereferencingFunction ], + d3f:SourceCodeHardening . + +d3f:Variance a owl:Class, + owl:NamedIndividual ; + rdfs:label "Variance" ; + d3f:d3fend-id "D3A-VAR" ; + d3f:definition "Variance is a measure of dispersion, meaning it is a measure of how far a set of numbers is spread out from their average value." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Variance. [Link](https://en.wikipedia.org/wiki/Variance)""" ; + rdfs:subClassOf d3f:Variability . + +d3f:VirtualMemorySpace a owl:Class ; + rdfs:label "Virtual Memory Space" ; + d3f:definition "Virtual memory is a memory management technique where secondary memory can be used as if it were a part of the main memory. Virtual memory uses hardware and software to enable a computer to compensate for physical memory shortages" ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:MemoryAddressSpace . + +d3f:WebAuthentication a owl:Class ; + rdfs:label "Web Authentication" ; + d3f:definition "A request-response comprising a user credential presentation to a system and a verification response where the verifying party is a web server." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:SessionCookie ], + d3f:Authentication . + +d3f:WeightedMean a owl:Class, + owl:NamedIndividual ; + rdfs:label "Weighted Mean" ; + d3f:d3fend-id "D3A-WM" ; + d3f:definition "A mean that incorporates weighting to certain data elements." ; + d3f:kb-article """## Considerations +The arithmetic mean, geometric mean, and harmonic mean can all be weighted. + +## References +Wikipedia. (n.d.). Central tendency. [Link](https://en.wikipedia.org/wiki/Central_tendency)""" ; + rdfs:subClassOf d3f:CentralTendency . + +d3f:WirelessAccessPoint a owl:Class, + owl:NamedIndividual ; + rdfs:label "Wireless Access Point" ; + d3f:contains d3f:RFTransmitter ; + d3f:definition "In computer networking, a wireless access point (WAP), or more generally just access point (AP), is a networking hardware device that allows other Wi-Fi devices to connect to a wired network. The AP usually connects to a router (via a wired network) as a standalone device, but it can also be an integral component of the router itself. An AP is differentiated from a hotspot which is a physical location where Wi-Fi access is available." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:RFTransmitter ], + d3f:ComputerNetworkNode ; + skos:altLabel "WAP" . + +d3f:accessed-by a owl:ObjectProperty ; + rdfs:label "accessed-by" ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-be-accessed-by ; + owl:inverseOf d3f:accesses . + +d3f:addressed-by a owl:ObjectProperty ; + rdfs:label "addressed-by" ; + d3f:definition "x addressed-by y: Relates a resource x (e.g., network host, peripheral device, disk sector, a memory cell or other logical or physical entity) to a discrete address y in an address space that points to it." ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:addresses . + +d3f:attached-to a owl:ObjectProperty ; + rdfs:label "attached-to" ; + d3f:definition "x attached-to y: A subject x is joined in close association to an object y." ; + rdfs:isDefinedBy ; + rdfs:seeAlso d3f:connects ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:attack-kb-annotation a owl:AnnotationProperty ; + rdfs:label "attack-kb-annotation" ; + d3f:definition "x attack-kb-annotation y: The offensive technique x has the kb annotation of y." ; + rdfs:domain d3f:OffensiveTechnique ; + rdfs:subPropertyOf d3f:d3fend-annotation . + +d3f:authorizes a owl:ObjectProperty ; + rdfs:label "authorizes" ; + d3f:definition "x authorizes y: A subject x grants authorization or clearance for an agent y to use an object. This relation indicates an authorization event has occurred." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with, + d3f:hardens . + +d3f:causes a owl:ObjectProperty ; + rdfs:label "causes" ; + d3f:definition "x causes y: The event or action x brings about event or action y as a consequence." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:configures a owl:ObjectProperty ; + rdfs:label "configures" ; + rdfs:subPropertyOf d3f:associated-with, + d3f:hardens . + +d3f:control-name a owl:DatatypeProperty ; + rdfs:label "control-name" ; + d3f:definition "The control (or control enhancement) name." ; + rdfs:subPropertyOf d3f:d3fend-external-control-data-property . + +d3f:copy-of a owl:ObjectProperty ; + rdfs:label "copy-of" ; + d3f:definition "x copy-of y: The subject x is a duplicate of the object y" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:created-by a owl:ObjectProperty ; + rdfs:label "created-by" ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-be-created-by ; + owl:inverseOf d3f:creates . + +d3f:cwe-kb-annotation a owl:AnnotationProperty ; + rdfs:label "cwe-kb-annotation" ; + rdfs:subPropertyOf d3f:d3fend-annotation . + +d3f:d3fend-catalog-annotation-property a owl:AnnotationProperty ; + rdfs:label "d3fend-catalog-annotation-property" ; + rdfs:subPropertyOf d3f:d3fend-annotation ; + skos:altLabel "d3fend-vendor-registry-annotation-property" . + +d3f:d3fend-comment a owl:DatatypeProperty ; + rdfs:label "d3fend-comment" ; + d3f:definition "x d3fend-comment y: The entity x has an D3FEND team written a public note about entity y." ; + rdfs:subPropertyOf d3f:d3fend-kb-data-property . + +d3f:d3fend-general-object-property a owl:ObjectProperty ; + rdfs:label "d3fend-general-object-property" ; + rdfs:subPropertyOf d3f:d3fend-object-property . + +d3f:d3fend-id a owl:DatatypeProperty ; + rdfs:label "d3fend-id" ; + d3f:definition "Unique identifier for a D3FEND technique. D3-[Acronym]." ; + rdfs:subPropertyOf d3f:d3fend-kb-data-property . + +d3f:deceives-with a owl:ObjectProperty ; + rdfs:label "deceives-with" ; + rdfs:subPropertyOf d3f:d3fend-tactical-verb-property . + +d3f:dependent a owl:ObjectProperty ; + rdfs:label "dependent" ; + d3f:definition "x dependent y: A dependent y is an entity that requires the fulfillment of the requirements specified in dependency x." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:dependsOn a owl:ObjectProperty ; + rdfs:label "depends-on" ; + d3f:definition "x depends-on y: The entity x is contingent on y being available; x relies on y." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:has-dependent . + +d3f:employs a owl:ObjectProperty ; + rdfs:label "employs" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:end a owl:ObjectProperty ; + rdfs:label "end" ; + rdfs:subPropertyOf d3f:d3fend-process-object-property . + +d3f:erases a owl:ObjectProperty ; + rdfs:label "erases" ; + d3f:description "x erases y: A technique x removes recorded data from storage device y creating space for new data." ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:extends a owl:ObjectProperty ; + rdfs:label "extends" ; + d3f:definition "x extends y: The entity x extend the scope or range or area of entity y, especially in the sense of widen the range of applications." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:modifies . + +d3f:fork a owl:ObjectProperty ; + rdfs:label "fork" ; + rdfs:subPropertyOf d3f:d3fend-process-object-property . + +d3f:has-account a owl:ObjectProperty ; + rdfs:label "has-account" ; + d3f:definition "x has-account y: The subject x has ownership or possession of some account y." ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:owns . + +d3f:has-agent a owl:ObjectProperty ; + rdfs:label "has-agent" ; + rdfs:subPropertyOf d3f:has-participant . + +d3f:has-link a owl:DatatypeProperty ; + rdfs:label "has-link" ; + d3f:definition "x has-link y: The d3fend analysis x has the link y." ; + rdfs:range xsd:anyURI ; + rdfs:subPropertyOf d3f:d3fend-kb-data-property . + +d3f:has-location a owl:ObjectProperty ; + rdfs:label "has-location" ; + d3f:definition "x has-location y: The entity x is situated in a particular spot or position y." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with ; + skos:altLabel "located_in" . + +d3f:has-mediator a owl:ObjectProperty ; + rdfs:label "has-mediator" ; + rdfs:subPropertyOf d3f:has-participant . + +d3f:has-recipient a owl:ObjectProperty ; + rdfs:label "has-recipient" ; + d3f:definition "x has_recipient y: An agent y is the intended recipient and decoder of the information contained in communication x." ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:has-sender a owl:ObjectProperty ; + rdfs:label "has-sender" ; + d3f:definition "x has_sender y: An agent y is the sender and encoder of the information contained in communication x." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:hides a owl:ObjectProperty ; + rdfs:label "hides" ; + d3f:definition "x hides y: A technique or operation x conceals the digital artifact y." ; + rdfs:range d3f:DigitalArtifact ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:implemented-by a owl:ObjectProperty ; + rdfs:label "implemented-by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:implements . + +d3f:initiates a owl:ObjectProperty ; + rdfs:label "initiates" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:installs a owl:ObjectProperty ; + rdfs:label "installs" ; + d3f:definition "x installs y: An entity x sets up a digital artifact y for subsequent use. For example, an installation program can install application software." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:instructed-by a owl:ObjectProperty ; + rdfs:label "instructed-by" ; + d3f:definition "x instructed-by y: A subject x takes machine instructions from object y." ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:instructs a owl:ObjectProperty ; + rdfs:label "instructs" ; + d3f:definition "x instructs y: A subject x delivers machine instructions to object y." ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:kb-reference a owl:ObjectProperty ; + rdfs:label "kb-reference" ; + rdfs:subPropertyOf d3f:d3fend-kb-object-property ; + owl:inverseOf d3f:kb-reference-of ; + skos:altLabel "has-technique-reference" . + +d3f:kb-reference-title a owl:DatatypeProperty ; + rdfs:label "kb-reference-title" ; + d3f:definition "x kb-reference-title y: The d3fend knowledge base reference x has the reference title string y." ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-kb-data-property . + +d3f:limits a owl:ObjectProperty ; + rdfs:label "limits" ; + d3f:definition "x limits y: An entity x specifies a designated limit beyond which some entity y cannot function or must be terminated." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:restricts ; + skos:altLabel "cutoff" . + +d3f:may-be-contained-by a owl:ObjectProperty, + owl:TransitiveProperty ; + rdfs:label "may-be-contained-by" ; + rdfs:subPropertyOf d3f:may-be-associated-with ; + owl:inverseOf d3f:may-contain . + +d3f:may-be-created-by a owl:ObjectProperty ; + rdfs:label "may-be-created-by" ; + rdfs:subPropertyOf d3f:may-be-associated-with ; + owl:inverseOf d3f:may-create . + +d3f:may-be-invoked-by a owl:ObjectProperty ; + rdfs:label "may-be-invoked-by" ; + rdfs:subPropertyOf d3f:may-be-associated-with ; + owl:inverseOf d3f:may-invoke . + +d3f:may-be-modified-by a owl:ObjectProperty ; + rdfs:label "may-be-modified-by" ; + rdfs:subPropertyOf d3f:may-be-associated-with ; + owl:inverseOf d3f:may-modify . + +d3f:may-deceive a owl:ObjectProperty ; + rdfs:label "may-deceive" ; + d3f:pref-label "may deceive" ; + rdfs:subPropertyOf d3f:may-counter-attack . + +d3f:may-detect a owl:ObjectProperty ; + rdfs:label "may-detect" ; + d3f:pref-label "may detect" ; + rdfs:subPropertyOf d3f:may-counter-attack . + +d3f:may-disable a owl:ObjectProperty ; + rdfs:label "may-disable" ; + rdfs:subPropertyOf d3f:may-evict . + +d3f:may-evaluate a owl:ObjectProperty ; + rdfs:label "may-evaluate" ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:may-harden a owl:ObjectProperty ; + rdfs:label "may-harden" ; + d3f:pref-label "may harden" ; + rdfs:subPropertyOf d3f:may-counter-attack . + +d3f:may-isolate a owl:ObjectProperty ; + rdfs:label "may-isolate" ; + d3f:pref-label "may isolate" ; + rdfs:subPropertyOf d3f:may-counter-attack . + +d3f:name a owl:DatatypeProperty ; + rdfs:label "name"@en ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property . + +d3f:neutralizes a owl:ObjectProperty ; + rdfs:label "neutralizes" ; + d3f:definition "x neutralizes y: The technique x makes the execution of actions of y ineffective by preventing or counterbalancing the effect of y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:hardens . + +d3f:next a owl:ObjectProperty ; + rdfs:label "next" ; + rdfs:subPropertyOf d3f:d3fend-process-object-property . + +d3f:owns a owl:ObjectProperty ; + rdfs:label "owns" ; + d3f:definition "x owns y: The subject x has ownership or possession of some object y." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with ; + skos:altLabel "possesses" . + +d3f:participates-in a owl:ObjectProperty ; + rdfs:label "participates-in" ; + d3f:definition "x participates-in y: The object x takes part in the event y, signifying that x contributes to or is affected by the event’s occurrence in some way." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:powered-by a owl:ObjectProperty ; + rdfs:label "powered-by" ; + d3f:definition "x powered-by y: x obtains its essential energy or force from y to perform its function or remain active." ; + rdfs:subPropertyOf d3f:dependsOn ; + owl:inverseOf d3f:powers . + +d3f:powers a owl:ObjectProperty ; + rdfs:label "powers" ; + d3f:definition "x powers y: x furnishes y with the energy or force required for y's functionality or operation." ; + rdfs:subPropertyOf d3f:has-dependent . + +d3f:process-ancestor a owl:ObjectProperty, + owl:TransitiveProperty ; + rdfs:label "process-ancestor" ; + d3f:definition "x process-ancestor y: The process y is a process ancestor of process x, indicating one or more process creation events were conducted were started at process y and subsequently created process x." ; + rdfs:subPropertyOf d3f:process-property . + +d3f:process-command-line-arguments a owl:DatatypeProperty ; + rdfs:label "process-command-line-arguments" ; + d3f:definition "x process-command-line-arguments y: The process x has the process command line arguments data y." ; + rdfs:subPropertyOf d3f:process-data-property . + +d3f:process-environmental-variables a owl:DatatypeProperty ; + rdfs:label "process-environmental-variables" ; + d3f:definition "x process-environment-variables y: The process x has the process environmental variables data y." ; + rdfs:subPropertyOf d3f:process-data-property ; + skos:altLabel "process-environmental-variable" . + +d3f:process-identifier a owl:DatatypeProperty ; + rdfs:label "process-identifier" ; + d3f:definition "x process-identifier y: The process x has the process identifier y." ; + rdfs:subPropertyOf d3f:process-data-property . + +d3f:process-image-path a owl:ObjectProperty ; + rdfs:label "process-image-path" ; + d3f:definition "x process-image-path y: The filepath y is the process image path for the process x, indicating the path to the resource from which the process's image was loaded." ; + rdfs:subPropertyOf d3f:process-property ; + skos:altLabel "processImagePath" . + +d3f:process-security-context a owl:DatatypeProperty ; + rdfs:label "process-security-context" ; + d3f:definition "x process-security-context y: The process x has the process security context data y." ; + rdfs:domain d3f:Process ; + rdfs:subPropertyOf d3f:process-data-property . + +d3f:process-user a owl:ObjectProperty ; + rdfs:label "process-user" ; + d3f:definition "x process-user y: The process x has been executed by the user y." ; + rdfs:subPropertyOf d3f:process-property ; + skos:altLabel "processUser" . + +d3f:provider a owl:ObjectProperty ; + rdfs:label "provider" ; + d3f:definition "x provider y: A provider y is an entity that supplies a service, system, or data resources to a dependent entity x." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:published a owl:DatatypeProperty ; + rdfs:label "date published"@en ; + d3f:definition "Date of publication of the resource." ; + rdfs:range xsd:dateTime ; + rdfs:subPropertyOf d3f:date . + +d3f:signed-by a owl:ObjectProperty ; + d3f:definition "x signed-by y: The digital artifact x includes a signature generated by the entity y, certifying the authenticity and integrity of x. This relationship indicates that x has undergone a validation process by y, using cryptographic measures to ensure that x is trustworthy and unaltered since the signing by y." ; + rdfs:subPropertyOf d3f:validated-by ; + owl:inverseOf d3f:signs . + +d3f:signs a owl:ObjectProperty ; + d3f:definition "x signs y: The entity x applies a digital signature to the digital artifact y, thereby asserting its validity, integrity, and authenticity. Typically, this involves cryptographic techniques to securely bind the signature to y, ensuring that y's contents have not been altered and are authentic as endorsed by x." ; + rdfs:subPropertyOf d3f:validates . + +d3f:start a owl:ObjectProperty ; + rdfs:label "start" ; + rdfs:subPropertyOf d3f:d3fend-process-object-property . + +d3f:step-1 a owl:NamedIndividual ; + rdfs:label "Step 1 - Copy Token" ; + d3f:invokes d3f:CopyToken ; + d3f:next d3f:step-2 . + +d3f:step-2 a owl:NamedIndividual ; + rdfs:label "Step 2 - Impersonate User" ; + d3f:invokes d3f:ImpersonateUser . + +d3f:summarizes a owl:ObjectProperty ; + rdfs:label "summarizes" ; + d3f:definition "x summarizes y: The sensor x summarizes a set y of events concerning digital artifacts over time" ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:unmounts a owl:ObjectProperty ; + rdfs:label "unmounts" ; + d3f:definition "x unmounts y: An operation x removes the access via computer system's file system the availability of files and directories on a storage artifact y. Unmounts reverse or undo prior mount operations." ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:updates a owl:ObjectProperty ; + rdfs:label "updates" ; + d3f:definition "x updates y: The technique x updates the software for component y." ; + rdfs:subPropertyOf d3f:hardens, + d3f:modifies . + +d3f:use-limits a owl:ObjectProperty ; + rdfs:label "use-limits" ; + d3f:definition "x use-limits y: An entity x specifies a designated number of uses beyond which some entity y cannot function or must be terminated." ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:limits . + +d3f:validated-by a owl:ObjectProperty ; + rdfs:label "validated-by" ; + d3f:definition "x validated-by y: The digital artifact x has its authenticity and correctness confirmed or verified by the technique, operation, or agent y." ; + rdfs:subPropertyOf d3f:associated-with, + d3f:hardens . + +d3f:version a owl:DatatypeProperty, + owl:FunctionalProperty ; + rdfs:label "version"@en ; + d3f:definition "x version y: The product or service x has the version y." ; + rdfs:range [ a rdfs:Datatype ; + owl:unionOf ( xsd:integer xsd:string ) ] ; + rdfs:subPropertyOf d3f:d3fend-catalog-data-property, + d3f:d3fend-external-control-data-property . + +d3f:windows-registry-key a owl:DatatypeProperty ; + rdfs:label "windows-registry-key" ; + d3f:definition "x value y: The key-value pair x has the key y." ; + rdfs:subPropertyOf d3f:windows-registry-data-property ; + skos:altLabel "key" . + +d3f:windows-registry-value a owl:DatatypeProperty ; + rdfs:label "windows-registry-value" ; + d3f:definition "x value y: The key-value pair x has the data value y." ; + rdfs:subPropertyOf d3f:windows-registry-data-property ; + skos:altLabel "value" . + +rdfs:label a owl:AnnotationProperty . + +d3f:ATTACKThing a owl:Class ; + rdfs:label "ATTACK Thing" ; + d3f:definition "ATTACK things are concepts defined in the ATT&CK Framework." ; + rdfs:subClassOf d3f:ExternalThreatModelThing . + +d3f:Access a owl:Class ; + rdfs:label "Access" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-mediator ; + owl:someValuesFrom d3f:AccessMediator ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Resource ], + d3f:Event . + +d3f:AccessControlAdministrationEvent a owl:Class ; + rdfs:label "Access Control Administration Event" ; + d3f:definition "An event concerning the administrative actions of setting, modifying, or abolishing permissions, configuring access control settings, and managing user access rights to ensure alignment with access control policies." ; + rdfs:subClassOf d3f:AccessControlEvent ; + skos:altLabel "Permission Administration Event", + "Permission Provisioning Event" . + +d3f:AccessControlEvent a owl:Class ; + rdfs:label "Access Control Event" ; + d3f:definition "An event that captures the implementation or evaluation of access control measures, including the application of rules and policies to govern the accessibility of resources by agents within a digital system." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:AccessControlConfiguration ], + d3f:AuthorizationEvent . + +d3f:AccessMediationEvent a owl:Class ; + rdfs:label "Access Mediation Event" ; + d3f:definition "An event involving the intermediary control mechanism that evaluates access requests and enforces access control decisions, ensuring that subjects' resource interactions comply with the established access policies." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:AccessMediator ], + d3f:AccessControlEvent ; + skos:altLabel "Access Enforcement Event" . + +d3f:AccessMediator a owl:Class, + owl:NamedIndividual ; + rdfs:label "Access Mediator" ; + d3f:implements d3f:AccessControlConfiguration ; + d3f:mediates-access-to d3f:Resource ; + d3f:used-by d3f:Agent ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:mediates-access-to ; + owl:someValuesFrom d3f:Resource ], + [ a owl:Restriction ; + owl:onProperty d3f:implements ; + owl:someValuesFrom d3f:AccessControlConfiguration ], + [ a owl:Restriction ; + owl:onProperty d3f:used-by ; + owl:someValuesFrom d3f:Agent ], + d3f:D3FENDCore, + d3f:DigitalInformationBearer . + +d3f:AccessModeling a d3f:AccessModeling, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Access Modeling" ; + d3f:d3fend-id "D3-AM" ; + d3f:definition "Access modeling identifies and records the access permissions granted to administrators, users, groups, and systems." ; + d3f:kb-reference d3f:Reference-RFC7642SystemForCrossDomainIdentityManagementDefinitionsOverviewConceptsAndRequirements ; + d3f:maps d3f:AccessControlConfiguration, + d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:UserAccount ], + [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:AccessControlConfiguration ], + d3f:OperationalActivityMapping . + +d3f:AccessProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Access Process" ; + d3f:accesses d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Process ], + d3f:SystemCall . + +d3f:ActiveCertificateAnalysis a d3f:ActiveCertificateAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Active Certificate Analysis" ; + d3f:created "2020-08-05T00:00:00"^^xsd:dateTime ; + d3f:d3fend-id "D3-ACA" ; + d3f:definition "Actively collecting PKI certificates by connecting to the server and downloading its server certificates for analysis." ; + d3f:kb-article """## How it works +Analysis of server certificates using active methods to detect if certificates have been misconfigured or spoofed by using elements of the certificate, certificate authorities and signatures. + +### Certificate validity analysis +This can be accomplished by verifying the digital signature on certificate. + +### Certificate path analysis +The client's browser can perform path verification to ensure that the server's certificate contains a valid trust anchor. + +### Certificate configuration analysis +Some browsers can be configured to implement the key-usage extensions contained certificates. This can help to prevent a certificate from being misused. + +### Certificate revocation status analysis +Using either Certificate Revocation Lists (CRLs) or Online Certificate Status Protocol (OCSP) to determine the revocation status. OCSP Stapling, binding the status with the certificate, helps to mitigate potential delay in status verifications. + +## Considerations +* Management of the PKI across the enterprise typically requires automation to maintain scalability and flexibility +* If the certificate authority, issuing the certificate, is compromised then all of the certificates issued by the CA are suspect +* There may be delays associated with updates to certificates +* Revoked certificates give the appearance of valid certificates until they are published to a trusted revocation service (OCSP or CRL) +* The revocation service (OCSP or CRL) may be down during our connection and a browser will need to make a decision will need to be made about trusting the connection""" ; + d3f:kb-reference d3f:Reference-SecuringWebTransactions ; + rdfs:subClassOf d3f:CertificateAnalysis . + +d3f:ActiveLogicalLinkMapping a d3f:ActiveLogicalLinkMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Active Logical Link Mapping" ; + d3f:d3fend-id "D3-ALLM" ; + d3f:definition "Active logical link mapping sends and receives network traffic as a means to map the whole data link layer, where the links represent logical data flows rather than physical connection" ; + d3f:kb-article """## How it works + +Active logical link mapping establishes awareness of logical links in the network by sending data over the network to gather information about logical connections in the network. + +Typically this will be achieved through network telemetry coordinated for network management and monitoring and will use a link layer discovery protocol such as LLDP and the information gathered and aggregated a higher levels using an application protocol such as SNMP. The information may be polled by network management softare or configured once and then pushed from network sensors (or agents.) + +Another means of establishing network connectivity is by means of sendingn traffic through the use of a tool such as traceroute, to determine the logical paths through the network architecture. + +## Considerations + +* Best practice is to encrypte network monitoring data and require authentication for queries or admin/management functions. +* Push notifications reduce bandwidth necessary to capture and maintain information if reliable transport is used. +* Special consideration should be made before using of active scanning in OT networks and OT-safe options chosen where available.""" ; + d3f:kb-reference d3f:Reference-IdentificationOfTracerouteNodesAndAssociatedDevices, + d3f:Reference-SNMPNetworkAutoDiscovery ; + d3f:may-query d3f:CollectorAgent ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-query ; + owl:someValuesFrom d3f:CollectorAgent ], + d3f:LogicalLinkMapping . + +d3f:ActivePhysicalLinkMapping a d3f:ActivePhysicalLinkMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Active Physical Link Mapping" ; + d3f:d3fend-id "D3-APLM" ; + d3f:definition "Active physical link mapping sends and receives network traffic as a means to map the physical layer." ; + d3f:kb-reference d3f:Reference-IdentificationOfTracerouteNodesAndAssociatedDevices, + d3f:Reference-UsingSpanningTreeProtocolSTPToEnhanceLayer2NetworkTopologyMaps ; + d3f:may-query d3f:CollectorAgent ; + d3f:synonym "Active Physical Layer Mapping" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-query ; + owl:someValuesFrom d3f:CollectorAgent ], + d3f:PhysicalLinkMapping ; + owl:disjointWith d3f:DirectPhysicalLinkMapping . + +d3f:AgentGroup a owl:Class ; + rdfs:label "Agent Group" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Agent ], + d3f:Group . + +d3f:ApplicationConfigurationDatabaseRecord a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Configuration Database Record" ; + d3f:definition "A database record holding information used to configure the parameters and initial settings for an application." ; + rdfs:subClassOf d3f:ApplicationConfiguration, + d3f:ConfigurationDatabaseRecord . + +d3f:ApplicationInstaller a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Installer" ; + rdfs:subClassOf d3f:UserApplication . + +d3f:ArtifactServer a owl:Class ; + rdfs:label "Artifact Server" ; + d3f:definition "A digital artifact server provides access services to digital artifacts in a repository. It provides an associated set of data management, search and access methods allowing application-independent access to the content." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:WebServer . + +d3f:ArtificialNeuralNetClassification a owl:Class, + owl:NamedIndividual ; + rdfs:label "Artificial Neural Network Classification" ; + d3f:d3fend-annotation "Classification ANNs seek to classify an observation as belonging to some discrete class as a function of the inputs. The input features (independent variables) can be categorical or numeric types, however, we require a categorical feature as the dependent variable." ; + d3f:d3fend-id "D3A-ANNC" ; + d3f:kb-article """## References +ANN Classification. [Link](http://uc-r.github.io/ann_classification).""" ; + rdfs:subClassOf d3f:Classification . + +d3f:AsymmetricKey a owl:Class ; + rdfs:label "Asymmetric Key" ; + d3f:definition "Asymmetric keys are public and private keys, paired such that asymmetric (public-key) cryptography algorithms can be implemented using them. Public-key cryptography, or asymmetric cryptography, is any cryptographic system that uses pairs of keys: public keys that may be disseminated widely paired with private keys which are known only to the owner. There are two functions that can be achieved: using a public key to authenticate that a message originated with a holder of the paired private key; or encrypting a message with a public key to ensure that only the holder of the paired private key can decrypt it." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:CryptographicKey . + +d3f:AudioInputDevice a owl:Class, + owl:NamedIndividual ; + rdfs:label "Audio Input Device" ; + d3f:definition "Audio input devices allow a user to send audio info to a computer for processing, recording, or carrying out commands. Devices such as microphones allow users to speak to the computer in order to record a voice message or navigate software. Aside from recording, audio input devices are also used with speech recognition software." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:InputDevice . + +d3f:AuthorizationService a owl:Class ; + rdfs:label "Authorization Service" ; + d3f:definition "An authorization service ensures that the user is authorized to have access to a particular resource. Authorization can be done through role-based access control (RBAC) or list-based access control (LBAC)." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:NetworkService, + d3f:ServiceApplicationProcess . + +d3f:AverageAbsoluteDeviation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Average Absolute Deviation" ; + d3f:d3fend-id "D3A-AAD" ; + d3f:definition "The average absolute deviation (AAD) of a data set is the average of the absolute deviations from a central point." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Average absolute deviation. [Link](https://en.wikipedia.org/wiki/Average_absolute_deviation)""" ; + rdfs:subClassOf d3f:Variability . + +d3f:BayesianMethod a owl:Class, + owl:NamedIndividual ; + rdfs:label "Bayesian Method" ; + d3f:d3fend-id "D3A-BM" ; + d3f:definition "Bayesian analysis is a statistical procedure which endeavors to estimate parameters of an underlying distribution based on the observed distribution." ; + d3f:kb-article """## References +Wolfram MathWorld. (n.d.). Bayesian Analysis. [Link](https://mathworld.wolfram.com/BayesianAnalysis.html)""" ; + rdfs:subClassOf d3f:StatisticalMethod . + +d3f:BinarySegment a owl:Class ; + rdfs:label "Binary Segment" ; + d3f:definition "A binary segment is a partition of binary information within a larger binary object, which arranges a set of binary objects for its purpose. For example, code, data, heap, and stack segments are segments of the binary information used by a process. Code and data segments are also found in object files." ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:BlockDevice a owl:Class, + owl:NamedIndividual ; + rdfs:label "Block Device" ; + d3f:contains d3f:BootSector, + d3f:Partition, + d3f:PartitionTable ; + d3f:definition """A block device (or block special file) provides buffered access to hardware devices, and provides some abstraction from their specifics. + +IEEE Std 1003.1-2017: A file that refers to a device. A block special file is normally distinguished from a character special file by providing access to the device in a manner such that the hardware characteristics of the device are not visible.""" ; + d3f:may-contain d3f:Volume ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:BootSector ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Partition ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:Volume ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:PartitionTable ], + d3f:DigitalInformationBearer ; + skos:altLabel "Block Special File" . + +d3f:Browser a owl:Class, + owl:NamedIndividual ; + rdfs:label "Browser" ; + d3f:definition "A web browser (commonly referred to as a browser) is a software application for retrieving, presenting, and traversing information resources on the World Wide Web. An information resource is identified by a Uniform Resource Identifier (URI/URL) and may be a web page, image, video or other piece of content. Hyperlinks present in resources enable users easily to navigate their browsers to related resources. Although browsers are primarily intended to use the World Wide Web, they can also be used to access information provided by web servers in private networks or files in file systems." ; + d3f:may-contain d3f:BrowserExtension ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:BrowserExtension ], + d3f:UserApplication . + +d3f:BuildTool a owl:Class ; + rdfs:label "Build Tool" ; + d3f:definition "A tool that automates the process of creating a software build and the associated processes including: compiling computer source code into binary code, packaging binary code, and running automated tests." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DeveloperApplication ; + skos:altLabel "Build Automation Tool" . + +d3f:CWE-1025 a owl:Class ; + rdfs:label "Comparison Using Wrong Factors" ; + d3f:cwe-id "CWE-1025" ; + rdfs:subClassOf d3f:CWE-697 . + +d3f:CWE-1038 a owl:Class ; + rdfs:label "Insecure Automated Optimizations" ; + d3f:cwe-id "CWE-1038" ; + rdfs:subClassOf d3f:CWE-435, + d3f:CWE-758 . + +d3f:CWE-1071 a owl:Class ; + rdfs:label "Empty Code Block" ; + d3f:cwe-id "CWE-1071" ; + rdfs:subClassOf d3f:CWE-1164 . + +d3f:CWE-1177 a owl:Class ; + rdfs:label "Use of Prohibited Code" ; + d3f:cwe-id "CWE-1177" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1230 a owl:Class ; + rdfs:label "Exposure of Sensitive Information Through Metadata" ; + d3f:cwe-id "CWE-1230" ; + rdfs:subClassOf d3f:CWE-285 . + +d3f:CWE-125 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Out-of-bounds Read" ; + d3f:cwe-id "CWE-125" ; + d3f:weakness-of d3f:RawMemoryAccessFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:RawMemoryAccessFunction ], + d3f:CWE-119 . + +d3f:CWE-1250 a owl:Class ; + rdfs:label "Improper Preservation of Consistency Between Independent Representations of Shared State" ; + d3f:cwe-id "CWE-1250" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-1284 a owl:Class ; + rdfs:label "Improper Validation of Specified Quantity in Input" ; + d3f:cwe-id "CWE-1284" ; + rdfs:subClassOf d3f:CWE-20 . + +d3f:CWE-1285 a owl:Class ; + rdfs:label "Improper Validation of Specified Index, Position, or Offset in Input" ; + d3f:cwe-id "CWE-1285" ; + rdfs:subClassOf d3f:CWE-20 . + +d3f:CWE-1329 a owl:Class ; + rdfs:label "Reliance on Component That is Not Updateable" ; + d3f:cwe-id "CWE-1329" ; + rdfs:subClassOf d3f:CWE-1357, + d3f:CWE-664 . + +d3f:CWE-1357 a owl:Class ; + rdfs:label "Reliance on Insufficiently Trustworthy Component" ; + d3f:cwe-id "CWE-1357" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1392 a owl:Class ; + rdfs:label "Use of Default Credentials" ; + d3f:cwe-id "CWE-1392" ; + rdfs:subClassOf d3f:CWE-1391 . + +d3f:CWE-160 a owl:Class ; + rdfs:label "Improper Neutralization of Leading Special Elements" ; + d3f:cwe-id "CWE-160" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-163 a owl:Class ; + rdfs:label "Improper Neutralization of Multiple Trailing Special Elements" ; + d3f:cwe-id "CWE-163" ; + rdfs:subClassOf d3f:CWE-162 . + +d3f:CWE-165 a owl:Class ; + rdfs:label "Improper Neutralization of Multiple Internal Special Elements" ; + d3f:cwe-id "CWE-165" ; + rdfs:subClassOf d3f:CWE-164 . + +d3f:CWE-179 a owl:Class ; + rdfs:label "Incorrect Behavior Order: Early Validation" ; + d3f:cwe-id "CWE-179" ; + rdfs:subClassOf d3f:CWE-20, + d3f:CWE-696 . + +d3f:CWE-185 a owl:Class ; + rdfs:label "Incorrect Regular Expression" ; + d3f:cwe-id "CWE-185" ; + rdfs:subClassOf d3f:CWE-697 . + +d3f:CWE-205 a owl:Class ; + rdfs:label "Observable Behavioral Discrepancy" ; + d3f:cwe-id "CWE-205" ; + rdfs:subClassOf d3f:CWE-203 . + +d3f:CWE-212 a owl:Class ; + rdfs:label "Improper Removal of Sensitive Information Before Storage or Transfer" ; + d3f:cwe-id "CWE-212" ; + rdfs:subClassOf d3f:CWE-669 . + +d3f:CWE-22 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')" ; + d3f:cwe-id "CWE-22" ; + d3f:weakness-of d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-668, + d3f:CWE-706 . + +d3f:CWE-271 a owl:Class ; + rdfs:label "Privilege Dropping / Lowering Errors" ; + d3f:cwe-id "CWE-271" ; + rdfs:subClassOf d3f:CWE-269 . + +d3f:CWE-282 a owl:Class ; + rdfs:label "Improper Ownership Management" ; + d3f:cwe-id "CWE-282" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-288 a owl:Class ; + rdfs:label "Authentication Bypass Using an Alternate Path or Channel" ; + d3f:cwe-id "CWE-288" ; + rdfs:subClassOf d3f:CWE-306 . + +d3f:CWE-306 a owl:Class ; + rdfs:label "Missing Authentication for Critical Function" ; + d3f:cwe-id "CWE-306" ; + rdfs:subClassOf d3f:CWE-287 . + +d3f:CWE-311 a owl:Class ; + rdfs:label "Missing Encryption of Sensitive Data" ; + d3f:cwe-id "CWE-311" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-319 a owl:Class ; + rdfs:label "Cleartext Transmission of Sensitive Information" ; + d3f:cwe-id "CWE-319" ; + rdfs:subClassOf d3f:CWE-311 . + +d3f:CWE-331 a owl:Class ; + rdfs:label "Insufficient Entropy" ; + d3f:cwe-id "CWE-331" ; + rdfs:subClassOf d3f:CWE-330 . + +d3f:CWE-377 a owl:Class ; + rdfs:label "Insecure Temporary File" ; + d3f:cwe-id "CWE-377" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-402 a owl:Class ; + rdfs:label "Transmission of Private Resources into a New Sphere ('Resource Leak')" ; + d3f:cwe-id "CWE-402" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-441 a owl:Class ; + rdfs:label "Unintended Proxy or Intermediary ('Confused Deputy')" ; + d3f:cwe-id "CWE-441" ; + rdfs:subClassOf d3f:CWE-610 . + +d3f:CWE-451 a owl:Class ; + rdfs:label "User Interface (UI) Misrepresentation of Critical Information" ; + d3f:cwe-id "CWE-451" ; + rdfs:subClassOf d3f:CWE-221, + d3f:CWE-684 . + +d3f:CWE-497 a owl:Class ; + rdfs:label "Exposure of Sensitive System Information to an Unauthorized Control Sphere" ; + d3f:cwe-id "CWE-497" ; + rdfs:subClassOf d3f:CWE-200 . + +d3f:CWE-507 a owl:Class ; + rdfs:label "Trojan Horse" ; + d3f:cwe-id "CWE-507" ; + rdfs:subClassOf d3f:CWE-506 . + +d3f:CWE-514 a owl:Class ; + rdfs:label "Covert Channel" ; + d3f:cwe-id "CWE-514" ; + rdfs:subClassOf d3f:CWE-1229 . + +d3f:CWE-602 a owl:Class ; + rdfs:label "Client-Side Enforcement of Server-Side Security" ; + d3f:cwe-id "CWE-602" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-653 a owl:Class ; + rdfs:label "Improper Isolation or Compartmentalization" ; + d3f:cwe-id "CWE-653" ; + rdfs:subClassOf d3f:CWE-657, + d3f:CWE-693 . + +d3f:CWE-654 a owl:Class ; + rdfs:label "Reliance on a Single Factor in a Security Decision" ; + d3f:cwe-id "CWE-654" ; + rdfs:subClassOf d3f:CWE-657, + d3f:CWE-693 . + +d3f:CWE-663 a owl:Class ; + rdfs:label "Use of a Non-reentrant Function in a Concurrent Context" ; + d3f:cwe-id "CWE-663" ; + rdfs:subClassOf d3f:CWE-662 . + +d3f:CWE-671 a owl:Class ; + rdfs:label "Lack of Administrator Control over Security" ; + d3f:cwe-id "CWE-671" ; + rdfs:subClassOf d3f:CWE-657 . + +d3f:CWE-694 a owl:Class ; + rdfs:label "Use of Multiple Resources with Duplicate Identifier" ; + d3f:cwe-id "CWE-694" ; + rdfs:subClassOf d3f:CWE-573, + d3f:CWE-99 . + +d3f:CWE-749 a owl:Class ; + rdfs:label "Exposed Dangerous Method or Function" ; + d3f:cwe-id "CWE-749" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-756 a owl:Class ; + rdfs:label "Missing Custom Error Page" ; + d3f:cwe-id "CWE-756" ; + rdfs:subClassOf d3f:CWE-755 . + +d3f:CWE-763 a owl:Class ; + rdfs:label "Release of Invalid Pointer or Reference" ; + d3f:cwe-id "CWE-763" ; + rdfs:subClassOf d3f:CWE-404 . + +d3f:CWE-786 a owl:Class ; + rdfs:label "Access of Memory Location Before Start of Buffer" ; + d3f:cwe-id "CWE-786" ; + rdfs:subClassOf d3f:CWE-119 . + +d3f:CWE-791 a owl:Class ; + rdfs:label "Incomplete Filtering of Special Elements" ; + d3f:cwe-id "CWE-791" ; + rdfs:subClassOf d3f:CWE-790 . + +d3f:CWE-792 a owl:Class ; + rdfs:label "Incomplete Filtering of One or More Instances of Special Elements" ; + d3f:cwe-id "CWE-792" ; + rdfs:subClassOf d3f:CWE-791 . + +d3f:CWE-795 a owl:Class ; + rdfs:label "Only Filtering Special Elements at a Specified Location" ; + d3f:cwe-id "CWE-795" ; + rdfs:subClassOf d3f:CWE-791 . + +d3f:CWE-799 a owl:Class ; + rdfs:label "Improper Control of Interaction Frequency" ; + d3f:cwe-id "CWE-799" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-825 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Expired Pointer Dereference" ; + d3f:cwe-id "CWE-825" ; + d3f:weakness-of d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-119, + d3f:CWE-672 . + +d3f:CWE-909 a owl:Class ; + rdfs:label "Missing Initialization of Resource" ; + d3f:cwe-id "CWE-909" ; + rdfs:subClassOf d3f:CWE-665 . + +d3f:CWE-91 a owl:Class ; + rdfs:label "XML Injection (aka Blind XPath Injection)" ; + d3f:cwe-id "CWE-91" ; + rdfs:subClassOf d3f:CWE-74 . + +d3f:CWE-914 a owl:Class ; + rdfs:label "Improper Control of Dynamically-Identified Variables" ; + d3f:cwe-id "CWE-914" ; + rdfs:subClassOf d3f:CWE-913, + d3f:CWE-99 . + +d3f:CWE-916 a owl:Class ; + rdfs:label "Use of Password Hash With Insufficient Computational Effort" ; + d3f:cwe-id "CWE-916" ; + rdfs:subClassOf d3f:CWE-327 . + +d3f:CWE-922 a owl:Class ; + rdfs:label "Insecure Storage of Sensitive Information" ; + d3f:cwe-id "CWE-922" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CallStack a owl:Class, + owl:NamedIndividual ; + rdfs:label "Call Stack" ; + d3f:contains d3f:StackFrame ; + d3f:definition "In computer science, a call stack is a stack data structure that stores information about the active subroutines of a computer program. This kind of stack is also known as an execution stack, program stack, control stack, run-time stack, or machine stack, and is often shortened to just \"the stack\". Although maintenance of the call stack is important for the proper functioning of most software, the details are normally hidden and automatic in high-level programming languages. Many computer instruction sets provide special instructions for manipulating stacks." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:StackFrame ], + d3f:DigitalInformationBearer . + +d3f:CertificateRotation a d3f:CertificateRotation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Certificate Rotation" ; + d3f:d3fend-id "D3-CERO" ; + d3f:definition "Certificate rotation involves replacing digital certificates and their private keys to maintain cryptographic integrity and trust, mitigating key compromise risks and ensuring continuous secure communications." ; + d3f:kb-article d3f:Reference-PasswordandKeyRotation-SSH, + """## How it works + +Certificate rotation should be performed when: +- Any certificate expires. +- A new CA authority is substituted for the old, thus requiring a replacement root certificate. +- New or modified constraints need to be imposed on one or more certificates. +- A security breach has occurred. + +Considerations: +- Managing certificate rotation across an enterprise can be complex. Automated solutions, sold by multiple vendors, should be considered to manage this complexity.""" ; + d3f:regenerates d3f:Certificate ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:regenerates ; + owl:someValuesFrom d3f:Certificate ], + d3f:CredentialRotation . + +d3f:CertificateTrustStore a owl:Class, + owl:NamedIndividual ; + rdfs:label "Certificate Trust Store" ; + d3f:contains d3f:Certificate ; + d3f:definition "A certificate truststore is used to store public certificates used to authenticate clients by the server for an SSL connection." ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Certificate ], + d3f:TrustStore . + +d3f:Client-serverPayloadProfiling a d3f:Client-serverPayloadProfiling, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Client-server Payload Profiling" ; + d3f:analyzes d3f:NetworkTraffic ; + d3f:d3fend-id "D3-CSPP" ; + d3f:definition "Comparing client-server request and response payloads to a baseline profile to identify outliers." ; + d3f:kb-article """## How it works +Profiling request and response payloads across multiple clients to a single server to develop a baseline of their characteristics. May take into account request/response sizes, entropy, frequency, and rhythm. Finally, identify outliers as they may indicate a malicious payload delivery and subsequent server exploitation. + + +## Considerations +* Collecting metrics to establish a profile can be challenging since user behavior can change easily. +* Employees may work different hours or inconsistent schedules which will cause false positives. +* Collection of network activity to generate metrics is a computationally intensive process. +* Users may log into different workstations which may cause false positives.""" ; + d3f:kb-reference d3f:Reference-MethodAndSystemForDetectingMaliciousPayloads_VectraNetworksInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:ClientApplication a owl:Class, + owl:NamedIndividual ; + rdfs:label "Client Application" ; + d3f:definition "A client application is software that accesses a service made available by a server. The server is often (but not always) on another computer system, in which case the client accesses the service by way of a network. The term applies to the role that programs or devices play in the client-server model" ; + rdfs:isDefinedBy ; + rdfs:seeAlso d3f:T1554 ; + rdfs:subClassOf d3f:Application . + +d3f:Clipboard a owl:Class, + owl:NamedIndividual ; + rdfs:label "Clipboard" ; + d3f:definition "The clipboard is a buffer that some operating systems provide for short-term storage and transfer within and between application programs. The clipboard is usually temporary and unnamed, and its contents reside in the computer's RAM. The clipboard is sometimes called the paste buffer. Windows, Linux and macOS support a single clipboard transaction. Each cut or copy overwrites the previous contents. Normally, paste operations copy the contents, leaving the contents available in the clipboard for further pasting." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:CloudInstanceMetadata a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Instance Metadata" ; + d3f:definition "Cloud instance metadata is configuration information on the instance and users of the instance. This includes such information as security groups, public ip addresses, and private addresses, public keys configured, and event rotating security keys. User data can contain initialization scripts, variables, passwords, and more." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:CloudConfiguration . + +d3f:CloudServiceAuthentication a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Service Authentication" ; + d3f:definition "A request-response comprising a user credential presentation to a system and a verification response where the verifying party is a cloud service." ; + rdfs:subClassOf d3f:WebAuthentication . + +d3f:CloudServiceAuthorization a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Service Authorization" ; + d3f:definition "Cloud authorization is the function of specifying access rights to cloud resources." ; + rdfs:subClassOf d3f:Authorization . + +d3f:CodeRepository a owl:Class, + owl:NamedIndividual ; + rdfs:label "Code Repository" ; + d3f:definition "A code repository is a form of database where code, typically source code, is stored and managed. In revision control systems, a repository is a data structure that stores metadata for a set of files or directory structure. Depending on whether the version control system in use is distributed like (Git or Mercurial) or centralized like (Subversion, CVS, or Perforce), the whole set of information in the repository may be duplicated on every user's system or may be maintained on a single server." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Database ; + skos:altLabel "Repository", + "Version Control Repository" . + +d3f:CommandHistoryLogFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Command History Log File" ; + d3f:contains d3f:CommandHistoryLog ; + d3f:definition "A command history log file is a file containing a command history, which the history of commands run in an operating system shell." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:CommandHistoryLog ], + d3f:LogFile . + +d3f:CommonAttackPattern a owl:Class ; + rdfs:label "Common Attack Pattern" ; + d3f:definition "A common attack pattern that is in the CAPEC knowledge base." ; + rdfs:subClassOf d3f:CAPECThing . + +d3f:Compiler a owl:Class, + owl:NamedIndividual ; + rdfs:label "Compiler" ; + d3f:definition "In computing, a compiler is a computer program that translates computer code written in one programming language (the source language) into another language (the target language). The name \"compiler\" is primarily used for programs that translate source code from a high-level programming language to a lower level language (e.g., assembly language, object code, or machine code) to create an executable program." ; + d3f:reads d3f:CompilerConfigurationFile ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:CompilerConfigurationFile ], + d3f:BuildTool . + +d3f:ComputerPlatform a owl:Class, + owl:NamedIndividual ; + rdfs:label "Computer Platform" ; + d3f:contains d3f:Firmware, + d3f:HardwareDevice, + d3f:OperatingSystem ; + d3f:definition "Platform includes the hardware and OS. The term computing platform can refer to different abstraction levels, including a certain hardware architecture, an operating system (OS), and runtime libraries. In total it can be said to be the stage on which computer programs can run." ; + d3f:synonym "Computing Platform" ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:HardwareDevice ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:OperatingSystem ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Firmware ], + d3f:DigitalInformationBearer ; + skos:altLabel "Computer Platform" . + +d3f:ConfigurationDatabase a owl:Class, + owl:NamedIndividual ; + rdfs:label "Configuration Database" ; + d3f:contains d3f:ConfigurationDatabaseRecord ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ConfigurationDatabaseRecord ], + d3f:ConfigurationResource . + +d3f:ConnectSocket a owl:Class, + owl:NamedIndividual ; + rdfs:label "Connect Socket" ; + d3f:connects d3f:Pipe ; + d3f:definition "The connect socket system call connects the socket to a target address." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:connects ; + owl:someValuesFrom d3f:Pipe ], + d3f:SystemCall . + +d3f:ConnectedHoneynet a d3f:ConnectedHoneynet, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Connected Honeynet" ; + d3f:d3fend-id "D3-CHN" ; + d3f:definition "A decoy service, system, or environment, that is connected to the enterprise network, and simulates or emulates certain functionality to the network, without exposing full access to a production system." ; + d3f:kb-article """## How it works +Decoy honeypots are deployed within the enterprise environment that emulate certain services or portions of an OS to attract attackers. + +## Considerations +A connected honeynet provides a tradeoff between emulating certain functionality but not being as sophisticated as an integrated honeynet. The connected honeynet may not provide enough functionality to detect new attack patterns or zero day exploits but could provide enough functionality for specific known vulnerabilities.""" ; + d3f:kb-reference d3f:Reference-ModificationOfAServerToMimicADeceptionMechanism_AcalvioTechnologiesInc ; + d3f:spoofs d3f:LocalAreaNetwork ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:spoofs ; + owl:someValuesFrom d3f:LocalAreaNetwork ], + d3f:DecoyEnvironment . + +d3f:ConnectionAttemptAnalysis a d3f:ConnectionAttemptAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Connection Attempt Analysis" ; + d3f:analyzes d3f:IntranetNetworkTraffic ; + d3f:d3fend-id "D3-CAA" ; + d3f:definition "Analyzing failed connections in a network to detect unauthorized activity." ; + d3f:kb-article """## How it works +Connection Attempt Analysis in multiple ways. + +### Monitoring traffic to unallocated IP space +One approach looks for failed connection attempts against unallocated IP space. First, network traffic is captured to map out the network to identify network assets as well as unallocated IP space. The map is then used to determine if connection attempts are being made to the unallocated IP space. + +### Monitoring for sequentially transmitted traffic +Another approach passively inspects network traffic with application protocol analyzers observing network activity characteristics such as volume of packets sent/ received, TCP session attributes, and connection information between hosts (start time, source/destination host, services, etc.). Then using pattern matching to identify traffic which appears to be probing for network hosts. + +## Considerations + +* Implementations that rely on analysis of unallocated IP address space increase in their complexity with network size and decentralized network infrastructure. +* Inventory of unallocated IP space should should be continuously updated to mitigate the risk of false positives. +* IPv6 also introduces challenges including IPv6 traffic bypassing IPv4 specific protection systems (ex. firewalls and IDS) and complexity in managing both IPv6 and IPv4 addresses.""" ; + d3f:kb-reference d3f:Reference-DetectingNetworkReconnaissanceByTrackingIntranetDark-netCommunications_VECTRANETWORKSInc ; + d3f:synonym "Network Scan Detection" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:IntranetNetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:ContainerImageAnalysis a d3f:ContainerImageAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Container Image Analysis" ; + d3f:analyzes d3f:ContainerImage ; + d3f:d3fend-id "D3-CIA" ; + d3f:definition "Analyzing a Container Image with respect to a set of policies." ; + d3f:kb-article """## How it works + +Container images are standalone collections of the executable code and +content that are used to populate a container environment. +They are usually created by either building a container from scratch or by +building on top of an existing image pulled from a repository. + +Throughout the container build workflow, +images should be scanned to identify: + +- outdated libraries, +- known vulnerabilities, +- or misconfigurations, such as insecure ports or permissions. + +Scanning should also provide the flexibility to disregard false positives +for vulnerability detection where knowledgeable +cybersecurity professionals have deemed alerts to be inaccurate. + +One approach to implementing image scanning is to use an admission controller +to block deployments if the image does not comply with the organization's +security policies. + +An admission controller is a Container Orchestration feature that can intercept and +process requests to the Container Orchestration API prior to persistence of the object, +but after the request is authenticated and authorized. +A webhook can be implemented to scan any image before it is deployed in the orchestrator. +This admission controller + +## Considerations + +* Image scanning is key to ensuring deployed containers are secure. +* Using trusted repositories to build containers is a critical part of the container build workflow. +* This technique does not necessarly prevent the build process to add insecure or unsecured + files to the Image. +""" ; + d3f:kb-reference d3f:Reference-ContainerImageAnalysis ; + d3f:synonym "Container Image Scanning" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:ContainerImage ], + d3f:AssetVulnerabilityEnumeration . + +d3f:ContainerOrchestrationSoftware a owl:Class, + owl:NamedIndividual ; + rdfs:label "Container Orchestration Software" ; + d3f:definition "A d3f:Software which manages and coordinates running one or more d3f:ContainerProcess." ; + rdfs:subClassOf d3f:ServiceApplication . + +d3f:ControlCorrelationIdentifierCatalog a owl:Class ; + rdfs:label "Control Correlation Identifier Catalog" ; + d3f:definition "A control correlation identifier (CCI) catalog provides a catalog of CCIs for a given release date." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-member ; + owl:someValuesFrom d3f:CCIControl ], + d3f:ControlCatalog . + +d3f:ConvolutionalNeuralNetwork a owl:Class, + owl:NamedIndividual ; + rdfs:label "Convolutional Neural Network" ; + d3f:d3fend-id "D3A-CNN" ; + d3f:definition "A class of artificial neural network most commonly applied to analyze visual imagery.CNNs use a mathematical operation called convolution in place of general matrix multiplication in at least one of their layers." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Convolutional neural network. [Link](https://en.wikipedia.org/wiki/Convolutional_neural_network)""" ; + rdfs:subClassOf d3f:DeepNeuralNetClassification . + +d3f:CredentialManagementSystem a owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Management System" ; + d3f:definition "Credential Management, also referred to as a Credential Management System (CMS), is an established form of software that is used for issuing and managing credentials as part of public key infrastructure (PKI)." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ServiceApplication . + +d3f:CredentialRevocation a d3f:CredentialRevocation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Revocation" ; + d3f:d3fend-id "D3-CR" ; + d3f:definition "Deleting a set of credentials permanently to prevent them from being used to authenticate." ; + d3f:deletes d3f:Credential ; + d3f:kb-article """## How it works + +Management servers with enterprise policies for account management provide the ability remove permissions, accounts, or credentials. Compromised credentials should be revoked to prevent further malicious activity.""" ; + d3f:kb-reference d3f:Reference-RevokingaPreviouslyIssuedVerifiableCredential-Microsoft ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:Credential ], + d3f:CredentialEviction . + +d3f:CredentialScrubbing a d3f:CredentialScrubbing, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Scrubbing" ; + d3f:d3fend-id "D3-CS" ; + d3f:definition "The systematic removal of hard-coded credentials from source code to prevent accidental exposure and unauthorized access." ; + d3f:hardens d3f:Subroutine ; + d3f:kb-article """## How it Works +Credential Scrubbing involves identifying and eliminating hard-coded credentials such as usernames, passwords, API keys, and tokens from source code repositories. These credentials should be managed securely using environment variables, secret management tools, or secure vaults where they can be safely accessed when needed. + +## Considerations +* Developers should conduct regular audits of source code to ensure credentials are not hard-coded. +* Exposed credentials found in version control history must be disabled and replaced promptly. +* Adopt role-based access controls and credential rotation policies to minimize security risks.""" ; + d3f:kb-reference d3f:Reference-SecretsManagementCheatSheet-OWASP ; + rdfs:seeAlso d3f:CWE-798, + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:Subroutine ], + d3f:SourceCodeHardening . + +d3f:CredentialTransmissionScoping a d3f:CredentialTransmissionScoping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Transmission Scoping" ; + d3f:d3fend-id "D3-CTS" ; + d3f:definition "Limiting the transmission of a credential to a scoped set of relying parties." ; + d3f:isolates d3f:Credential ; + d3f:kb-reference d3f:Reference-WebAuthentication_AnAPIForAccessingPublicKeyCredentials%0ALevel2 ; + d3f:synonym "Phishing Resistant Authentication" ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:Credential ], + d3f:AccessMediation . + +d3f:CustomArchiveFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Custom Archive File" ; + d3f:definition "A custom archive file is an archive file conforming to a custom format; that is, an archive file that does not conform to a common standard." ; + rdfs:subClassOf d3f:ArchiveFile . + +d3f:CyberAction a owl:Class ; + rdfs:label "Cyber Action" ; + rdfs:subClassOf d3f:Action . + +d3f:DNSCacheEviction a d3f:DNSCacheEviction, + owl:Class, + owl:NamedIndividual ; + rdfs:label "DNS Cache Eviction" ; + d3f:d3fend-id "D3-DNSCE" ; + d3f:definition "Flushing DNS to clear any IP addresses or other DNS records from the cache." ; + d3f:deletes d3f:DNSRecord ; + d3f:kb-article """# How it works + +Flushing the DNS Cache will clear the IP addresses of websites you have visited recently. This can help remediate DNS Cache Poisoning attacks, which is a type of cyber attack where corrupted DNS data is inserted into the cache, causing redirects to malicious websites. + +On windows, the DNS cache can be wiped by issuing the command `ipconfig /flushdns`.""" ; + d3f:kb-reference ; + d3f:synonym "Flush DNS Cache" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:DNSRecord ], + d3f:ObjectEviction . + +d3f:DNSEvent a owl:Class ; + rdfs:label "DNS Event" ; + d3f:definition "An event involving the Domain Name System (DNS), which translates domain names to IP addresses and operates over UDP and TCP." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:DNSNetworkTraffic ], + [ a owl:Class ; + owl:unionOf ( d3f:TCPEvent d3f:UDPEvent ) ], + d3f:ApplicationLayerEvent . + +d3f:DNSRecord a owl:Class, + owl:NamedIndividual ; + rdfs:label "DNS Record" ; + d3f:definition "A Domain Name System (DNS) record is a record of information returned to clients seeking to find computers, services, and other resources connected to the Internet or a private network. Record information is stored on a domain name server so it can respond to DNS queries from clients.There are a variety of record types, depending on the client's information needs. Common types include Start of Authority, IP addresses, SMTP mail exchangers, name servers, reverse DNS lookup pointers, etc." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:Record . + +d3f:DataDependency a owl:Class, + owl:NamedIndividual ; + rdfs:label "Data Dependency" ; + d3f:synonym "Transactional Dependency" ; + rdfs:subClassOf d3f:Dependency . + +d3f:DataInventory a d3f:DataInventory, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Data Inventory" ; + d3f:d3fend-id "D3-DI" ; + d3f:definition "Data inventorying identifies and records the schemas, formats, volumes, and locations of data stored and used on the organization's architecture." ; + d3f:inventories d3f:Database, + d3f:DocumentFile ; + d3f:kb-reference d3f:Reference-DataProcessingAndScanningSystemsForGeneratingAndPopulatingADataInventory ; + d3f:synonym "Data Discovery", + "Data Inventorying" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:inventories ; + owl:someValuesFrom d3f:Database ], + [ a owl:Restriction ; + owl:onProperty d3f:inventories ; + owl:someValuesFrom d3f:DocumentFile ], + d3f:AssetInventory . + +d3f:DecoyPublicRelease a d3f:DecoyPublicRelease, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Decoy Public Release" ; + d3f:d3fend-id "D3-DPR" ; + d3f:definition "Issuing publicly released media to deceive adversaries." ; + d3f:kb-article """## How it works +Publicly released media includes press release, videos, or other marketing collateral. The media may include URLs, points of contact, or other identifiers to entice interaction from adversaries. + +## Considerations +* Information used in decoy public released media must contain enough realism to deceive and provide interaction from adversaries. +* Continuous development, creation, and distribution of media and identifiers are needed to ensure adversary interaction continues over time. +* Decoy public releases could be placed on platforms with different degrees of ownership, including entirely enterprise-owned infrastructure, IaaS, and SaaS (including social applications). Platforms that are not entirely enterprise-owned may be more likely to gather information""" ; + d3f:kb-reference d3f:Reference-MockAttackCybersecurityTrainingSystemAndMethods_WOMBATSECURITYTECHNOLOGIESInc ; + rdfs:subClassOf d3f:DecoyObject . + +d3f:DecoySessionToken a d3f:DecoySessionToken, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Decoy Session Token" ; + d3f:d3fend-id "D3-DST" ; + d3f:definition "An authentication token created for the purposes of deceiving an adversary." ; + d3f:kb-article """## How it works +Usage of decoy session tokens may be monitored to track attacker behavior or otherwise control the beliefs of the attacker. + +## Considerations +* Interaction and activity with the decoy session token must be constantly monitored and analyzed to detect unauthorized activity. +* Session tokens are typically short-lived and therefore the decoy must be continuously updated to provide the appearance of it being used in the production environment. +* Automated tools can assist with maintenance and updates by automatically adjusting the decoy session token and environment to mimic the production environment.""" ; + d3f:kb-reference d3f:Reference-DecoyAndDeceptiveDataObjectTechnology_CymmetriaInc ; + d3f:spoofs d3f:SessionToken ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:spoofs ; + owl:someValuesFrom d3f:SessionToken ], + d3f:DecoyObject . + +d3f:DeepNeuralNetClassification a owl:Class, + owl:NamedIndividual ; + rdfs:label "Deep Neural Network Classification" ; + d3f:d3fend-id "D3A-DNNC" ; + d3f:definition "A deep neural network (DNN) is an artificial neural network (ANN) with multiple layers between the input and output layers. There are different types of neural networks but they always consist of the same components: neurons, synapses, weights, biases, and functions. These components as a whole function similarly to a human brain, and can be trained like any other ML algorithm" ; + d3f:kb-article """## References +Deep learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Deep_learning).""" ; + rdfs:subClassOf d3f:ArtificialNeuralNetClassification . + +d3f:DefaultUserAccount a owl:Class, + owl:NamedIndividual ; + rdfs:label "Default User Account" ; + d3f:definition "Default accounts are those that are built-into an OS, such as the Guest or Administrator accounts on Windows systems or default factory/provider set accounts on other types of systems, software, or devices." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:UserAccount . + +d3f:DeleteFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Delete File" ; + d3f:definition "Remove a file from a machine." ; + d3f:deletes d3f:File ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:File ], + d3f:SystemCall . + +d3f:DeserializationFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Deserialization Function" ; + d3f:definition "Function with an input of serialized data which deserializes that data, usually with data parsing methods." ; + rdfs:subClassOf d3f:Subroutine . + +d3f:DigitalEventRecord a owl:Class, + owl:NamedIndividual ; + rdfs:label "Digital Event Record" ; + d3f:definition "A digital event record is a structured representation of a digital event, encapsulating all relevant details about the occurrence for storage, analysis, and response. These records serve as the primary artifacts for cybersecurity operations, enabling threat detection, forensic investigations, and compliance reporting. Digital event records include metadata such as timestamps, origin, context, and associated resources, ensuring traceability and actionable intelligence in digital ecosystems." ; + d3f:records d3f:DigitalEvent ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:records ; + owl:someValuesFrom d3f:DigitalEvent ], + d3f:Record . + +d3f:DigitalIdentity a owl:Class, + owl:NamedIndividual ; + rdfs:label "Digital Identity" ; + d3f:definition "The unique representation of a subject engaged in an online transaction. A digital identity is always unique in the context of a digital service, but does not necessarily need to uniquely identify the subject in all contexts. In other words, accessing a digital service may not mean that the subject's real-life identity is known. Note: There is no single, widely accepted definition for this term and context is important. This definition is specific to online transactions." ; + d3f:identified-by d3f:Identifier ; + d3f:kb-reference d3f:Reference-CNNSI-4009 ; + rdfs:comment "Variously describes or designates. Designation is not compete or definite without context. The representation generally can be identified by a unique identifier, though this may be private information." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identified-by ; + owl:someValuesFrom d3f:Identifier ], + d3f:DigitalInformation . + +d3f:DiskErasure a d3f:DiskErasure, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Disk Erasure" ; + d3f:d3fend-id "D3-DKE" ; + d3f:definition "Disk Erasure is the process of securely deleting all data on a disk to ensure that it cannot be recovered by any means." ; + d3f:erases d3f:SecondaryStorage ; + d3f:kb-article """### How it works + +Disk Erasure involves overwriting the existing data with random or specific patterns multiple times. Disk erasure is crucial for data sanitization, ensuring that sensitive information is completely removed from storage devices before they are repurposed, disposed of, or transferred to another party.""" ; + d3f:kb-reference ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:erases ; + owl:someValuesFrom d3f:SecondaryStorage ], + d3f:DiskFormatting . + +d3f:DiskPartitioning a d3f:DiskPartitioning, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Disk Partitioning" ; + d3f:creates d3f:PartitionTable ; + d3f:d3fend-id "D3-DKP" ; + d3f:definition "Disk Partitioning is the process of dividing a disk into multiple distinct sections, known as partitions." ; + d3f:kb-article """### How it works + +Each partition can be managed separately and can have its own file system. Disk partitioning can be used to segregate sensitive data from less critical data, improve system performance, and enhance data management and recovery processes. It can also help in isolating different operating systems or environments on the same physical disk.""" ; + d3f:kb-reference ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:PartitionTable ], + d3f:DiskFormatting . + +d3f:DisplayAdapter a owl:Class, + owl:NamedIndividual ; + rdfs:label "Display Adapter" ; + d3f:definition "A graphics card (also called a display card, video card, display adapter, or graphics adapter) is an expansion card which generates a feed of output images to a display device (such as a computer monitor). Frequently, these are advertised as discrete or dedicated graphics cards, emphasizing the distinction between these and integrated graphics. At the core of both is the graphics processing unit (GPU), which is the main part that does the actual computations, but should not be confused with the video card as a whole, although \"GPU\" is often used to refer to video cards." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:OutputDevice ; + skos:altLabel "Display Card", + "Graphics Adapter", + "Video Card" . + +d3f:DisplayServer a owl:Class, + owl:NamedIndividual ; + rdfs:label "Display Server" ; + d3f:definition "A display server or window server is a program whose primary task is to coordinate the input and output of its clients to and from the rest of the operating system, the hardware, and each other. The display server communicates with its clients over the display server protocol, a communications protocol, which can be network-transparent or simply network-capable. The display server is a key component in any graphical user interface, specifically the windowing system." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "Window Server" . + +d3f:DomainRegistrationTakedown a d3f:DomainRegistrationTakedown, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Registration Takedown" ; + d3f:d3fend-id "D3-DRT" ; + d3f:definition "The process of performing a takedown of the attacker's domain registration infrastructure." ; + d3f:deletes d3f:DomainRegistration ; + d3f:kb-article """## How it works + +Most nameserver hosts and domain name registrars comply with internationally recognised standards and supply their services based on terms and conditions that provide users and organisations protection from abuse and trademark infringement. Performing a WHOIS query on the attacker's domain will provide a contact that can be notified in the case of abuse. Formal takedown processes should be initiated to suspend or disable the normal function of the domain name. + +## Considerations + +- Takedown notifications should clearly demonstrate (with evidence) that the nameserver or registrars Terms and Conditions have been breached. +- Takedown processes are notoriously slow and sometimes unsuccessful. +- Many government organisations will have takedown processes that should also be followed. They may use this for intelligence to assist other organisations suffering an attack. +- Top level domain registrars will have takedown processes that can be followed, as an escalation path, when the nameserver host and/or registrar have not responded or complied timeously or inline with the TLD expectations. + +## Examples of Domain Registration Abuse + +Attackers will create infrastructure from which to carry out their operations and this may include registering domain names to be used in the various attacks. Known misuse cases include: + +- Registering domain names that are similar to the victim's. This is known as typosquatting or URL hijacking. Legitimate looking mails or URLs could be sent using this domain in phishing campaigns. +- Registring domain names that are used in C2 beacons.""" ; + d3f:kb-reference d3f:Reference-UnderstandingtheDomainRegistrationBehaviorofSpammers ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:DomainRegistration ], + d3f:ObjectEviction . + +d3f:EmailFiltering a d3f:EmailFiltering, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Email Filtering" ; + d3f:d3fend-id "D3-EF" ; + d3f:definition "Filtering incoming email traffic based on specific criteria." ; + d3f:filters d3f:Email ; + d3f:kb-article """## How it works + +Mail filters can be implemented to scan inbound email messages at the initial SMTP connection stage to detect and reject email containing spam and malware. + +This technique is distinct from d3f:EmailDeletion because it prevents an email from reaching an user's inbox. This technique can also be used for outbound email traffic. + +## Considerations +* The effectiveness of mail filters depend on the completeness of the filter policies""" ; + d3f:kb-reference d3f:Reference-SystemAndMethodForProvidingAnonymousRemailingAndFilteringOfElectronicMail_Nokia ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:Email ], + d3f:InboundTrafficFiltering . + +d3f:EmailRemoval a d3f:EmailRemoval, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Email Removal" ; + d3f:d3fend-id "D3-ER" ; + d3f:definition "The email removal technique deletes email files from system storage." ; + d3f:deletes d3f:Email ; + d3f:kb-article """## How it works + +Email removal is a technique that can be used to prevent a user from executing malware or responding to phishing attempts. Security software or users themselves may detect malicious or suspicious email in a local or remote mail folder email and then employ this technique. + +## Considerations + +For email that needs to be removed, an infosec organization may choose to take additional follow-up actions (such as blocking the sources or notifying providers), rather than only relying on email deletion. + +For the case where users detect likely suspicious email files, the organization should consider implementing a means for reporting these emails to their infosec organization. + +Email files may propagate through many storage systems across the an organization's systems over time, so early detection and blocking helps avoid residual, latent stores of malicous email content in the enterprise.""" ; + d3f:kb-reference d3f:Reference-SystemAndMethodForScanningRemoteServicesToLocateStoredObjectsWithMalware ; + d3f:may-access d3f:MailServer ; + d3f:synonym "Email Deletion" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:MailServer ], + [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:Email ], + d3f:FileEviction . + +d3f:EquivalenceMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Equivalence Matching" ; + d3f:d3fend-id "D3A-EM" ; + d3f:definition "Equivalence matching is matching two values, which may be bound to variables, to see if they are equivalent." ; + d3f:kb-article """## How it works +Equality is a relationship between two quantities or, more generally two mathematical expressions, asserting that the quantities have the same value, or that the expressions represent the same mathematical object. + +Programming languages can have multiple senses of equality that may include, but are not limited to: + +- Identity: The objects are identical; often indicated by having values indicating the same logical address. +- Equality: The values of the expessions and properties are equivalent when evaluated; they do not need to have the same logical address. + +## References +1. Equality (mathematics). (2023, May 31). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Equality_(mathematics)] +2. Types of Equality. (2007, March 2). In _WikiWikiWeb_. [Link](https://wiki.c2.com/?TypesOfEquality)""" ; + rdfs:subClassOf d3f:LogicalRules . + +d3f:Estimation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Estimation" ; + d3f:d3fend-id "D3A-EST" ; + d3f:definition "Estimation represents ways or a process of learning and determining the population parameter based on the model fitted to the data." ; + d3f:kb-article """## References +Pennsylvania State University. (n.d.). Statistical Inference and Estimation. [Link](https://online.stat.psu.edu/stat504/lesson/statistical-inference-and-estimation)""" ; + rdfs:subClassOf d3f:InferentialStatistics . + +d3f:Exec a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exec" ; + d3f:executes d3f:ExecutableBinary ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:ExecutableBinary ], + d3f:SystemCall . + +d3f:ExternalContentInclusionFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "External Content Inclusion Function" ; + d3f:definition "External content, strings or data, are inserted into a local document (e.g. xml document) as if it were a native part of that document." ; + rdfs:subClassOf d3f:Subroutine . + +d3f:ExternalControlThing a owl:Class ; + rdfs:label "External Control Thing" ; + rdfs:subClassOf d3f:ExternalThing . + +d3f:FileCarving a d3f:FileCarving, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Carving" ; + d3f:analyzes d3f:FileTransferNetworkTraffic ; + d3f:d3fend-id "D3-FC" ; + d3f:definition "Identifying and extracting files from network application protocols through the use of network stream reassembly software." ; + d3f:kb-article """## How it works +Protocol stream reassembly software recreates a directional byte stream by analyzing captured network packets. Once the stream is reassembled pattern matching is applied to determine if it contains a file of interest. Files of interest range from executable, archive, or document file formats. Once the file is captured, it is then processed with standard File Analysis Techniques. Example network protocols include HTTP, SMTP, FTP, HTTP/2, and TLS/HTTP/Dropbox. + +## Considerations +- This is an error prone process due to the intricacies of network protocols and network packet capture. For example reassembly may be done in real-time or streaming fashion, or packets may be written to disk, then bulk processed. The packets may arrive out of order, with fragmentation, duplicates, or re-transmissions. The reassembly software must compensate for the imperfect packet stream in order to recreate the well formed file which was transmitted. +- File type identification can be a difficult process which can be exploited by adversaries.""" ; + d3f:kb-reference d3f:Reference-ComputerWormDefenseSystemAndMethod_FireEyeInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:FileTransferNetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:FileCreationAnalysis a d3f:FileCreationAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Creation Analysis" ; + d3f:analyzes d3f:CreateFile ; + d3f:d3fend-id "D3-FCA" ; + d3f:definition "Analyzing the properties of file create system call invocations." ; + d3f:kb-reference d3f:Reference-CAR-2020-09-001%3AScheduledTask-FileAccess_MITRE, + d3f:Reference-LsassProcessDumpViaProcdump_MITRE ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:CreateFile ], + d3f:SystemCallAnalysis . + +d3f:FileEviction a d3f:FileEviction, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Eviction" ; + d3f:d3fend-id "D3-FEV" ; + d3f:definition "File eviction techniques delete files from system storage." ; + d3f:deletes d3f:File ; + d3f:kb-article """## How it works + +Adversaries may place files or programs into a computer's file system to perform malicious actions. As part of the eviction process, these files and programs should be removed to prevent further compromise or reinfection. Examples of malicious types of files are malware which is directly harmful and content files with the intent to deceive users (e.g., phishing.) + +On Windows systems, antivirus (AV) software should be used to safely and permanently remove malicious files. AV software may first quarantine a suspected malicious file, which is the process of moving a file from its original location to a new location and makes changes so that it cannot be executed. Users can then verify that the file is not benign and then permanently delete it. + +## Considerations + +When it is determined that a file should be removed for security purposes, the organization--or systems implementing an organization's policies--may determine that the file should not simply be deleted from the enterprise's mission systems, but be quarantined to a secure system by an approved mechanism, so as to allow follow-up investigation by security staff. + +On Windows systems, deleting a file in File Explorer does not permanently delete a file - it sends it to the Recycle Bin instead. The Recycle Bin must be emptied, or alternative steps must be performed to remove files completely. Even then, in some cases the data may persist in disk, so data shredder tools may be needed to completely wipe a file. Thus, AV tools are recommended.""" ; + d3f:kb-reference d3f:Reference-HowDoesAntivirusQuarantineWork-SafetyDetectives ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:File ], + d3f:ObjectEviction . + +d3f:FileHashReputationAnalysis a d3f:FileHashReputationAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Hash Reputation Analysis" ; + d3f:analyzes d3f:FileHash ; + d3f:d3fend-id "D3-FHRA" ; + d3f:definition "Analyzing the reputation of a file hash." ; + d3f:kb-reference d3f:Reference-Reputation_of_an_entity_associated_with_a_content_item ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:FileHash ], + d3f:IdentifierReputationAnalysis . + +d3f:FileSystem a owl:Class, + owl:NamedIndividual ; + rdfs:label "File System" ; + d3f:contains d3f:Directory, + d3f:File, + d3f:FileSystemLink, + d3f:FileSystemMetadata ; + d3f:definition "In computing, a file system or filesystem is used to control how data is stored and retrieved. Without a file system, information placed in a storage medium would be one large body of data with no way to tell where one piece of information stops and the next begins. By separating the data into pieces and giving each piece a name, the information is easily isolated and identified. Taking its name from the way paper-based information systems are named, each group of data is called a \"file\". The structure and logic rules used to manage the groups of information and their names is called a \"file system\"." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:FileSystemMetadata ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:FileSystemLink ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Directory ], + d3f:DigitalInformationBearer . + +d3f:Firewall a owl:Class, + owl:NamedIndividual ; + rdfs:label "Firewall" ; + d3f:definition "In computing, a firewall is a network security system that monitors and controls incoming and outgoing network traffic based on predetermined security rules. A firewall typically establishes a barrier between a trusted internal network and untrusted external network, such as the Internet. Firewalls are often categorized as either network firewalls or host-based firewalls. Network firewalls filter traffic between two or more networks and run on network hardware. Host-based firewalls run on host computers and control network traffic in and out of those machines. This definition refers to network firewalls." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ComputerNetworkNode ; + skos:altLabel "Network Firewall" . + +d3f:Forecasting a owl:Class ; + rdfs:label "Forecasting" ; + rdfs:subClassOf d3f:AnalyticalPurpose . + +d3f:GetOpenSockets a owl:Class, + owl:NamedIndividual ; + rdfs:label "Get Open Sockets" ; + d3f:enumerates d3f:Pipe ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enumerates ; + owl:someValuesFrom d3f:Pipe ], + d3f:SystemCall . + +d3f:GetScreenCapture a owl:Class, + owl:NamedIndividual ; + rdfs:label "Get Screen Capture" ; + rdfs:subClassOf d3f:SystemCall . + +d3f:GetSystemNetworkConfigValue a owl:Class, + owl:NamedIndividual ; + rdfs:label "Get System Network Config Value" ; + rdfs:subClassOf d3f:GetSystemConfigValue . + +d3f:GetThreadContext a owl:Class, + owl:NamedIndividual ; + rdfs:label "Get Thread Context" ; + d3f:queries d3f:Thread ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:queries ; + owl:someValuesFrom d3f:Thread ], + d3f:SystemCall . + +d3f:GlobalUserAccount a owl:Class, + owl:NamedIndividual ; + rdfs:label "Global User Account" ; + d3f:definition "A type of user account in Microsoft Windows (NT) that has a domain-wide scope.defines that user's access to a logical group of network objects (computers, users, devices) that share the same Active Directory databases; that is, a user's access to the domain." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DomainUserAccount . + +d3f:Graph-basedClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Graph-based Clustering" ; + d3f:d3fend-id "D3A-GBC" ; + d3f:definition "Graph-based Clustering is a form of clustering where data is represented with graphs to identify clusters. We include Connection-based Clustering in this class." ; + d3f:kb-article """## References +1. Jagota, A. (13 Dec 2020). Density-based and Graph-based Clustering. towardsdatascience.com. [Link](https://towardsdatascience.com/density-based-and-graph-based-clustering-a1f0d45ff5fb) + +1. Connectivity-Based Clustering. Sarang, P. (2023) in Thinking Data Science. The Springer Series in Applied Machine Learning. Springer, Cham. [Link](https://doi.org/10.1007/978-3-031-02363-7_10).""" ; + d3f:synonym "Connection-based Clustering" ; + rdfs:subClassOf d3f:ClusterAnalysis . + +d3f:GraphicalUserInterface a owl:Class, + owl:NamedIndividual ; + rdfs:label "Graphical User Interface" ; + d3f:definition "A graphical user interface (GUI) is a type of user interface that allows users to interact with electronic devices through graphical icons and visual indicators such as secondary notation, instead of text-based user interfaces, typed command labels or text navigation. GUIs were introduced in reaction to the perceived steep learning curve of command-line interfaces (CLIs), which require commands to be typed on a computer keyboard." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:UserInterface ; + skos:altLabel "GUI" . + +d3f:HTTPEvent a owl:Class ; + rdfs:label "HTTP Event" ; + d3f:definition "An event involving the Hypertext Transfer Protocol (HTTP), which operates over TCP to transmit hypermedia documents." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:WebNetworkTraffic ], + d3f:ApplicationLayerEvent, + d3f:TCPEvent . + +d3f:HardLink a owl:Class ; + rdfs:label "Hard Link" ; + d3f:definition "In computing, a hard link is a directory entry that associates a name with a file on a file system. All directory-based file systems must have at least one hard link giving the original name for each file. The term \"hard link\" is usually only used in file systems that allow more than one hard link for the same file. Multiple hard links -- that is, multiple directory entries to the same file -- are supported by POSIX-compliant and partially POSIX-compliant operating systems, such as Linux, Android, macOS, and also Windows NT4 and later Windows NT operating systems." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:FileSystemLink . + +d3f:HeterogeneousTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Heterogeneous Transfer Learning" ; + d3f:d3fend-id "D3A-HTL" ; + d3f:definition "Heterogeneous transfer learning is characterized by the source and target domains having differing feature spaces, but may also be combined with other issues such as differing data distributions and label spaces." ; + d3f:kb-article """## References +Wang, Q., Mao, K. Z., Wang, B., & Guan, J. (2017). Big data clustering by hybrid optimization algorithm. Journal of Big Data, 4(1), 25. [Link](https://journalofbigdata.springeropen.com/articles/10.1186/s40537-017-0089-0).""" ; + rdfs:subClassOf d3f:TransferLearning . + +d3f:HierarchicalClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hierarchical Clustering" ; + d3f:d3fend-id "D3A-HC" ; + d3f:definition "Hierarchical clustering (also called hierarchical cluster analysis or HCA) is a method of cluster analysis that seeks to build a hierarchy of clusters." ; + d3f:kb-article """## References +Wikipedia. (2021, August 10). Hierarchical clustering. [Link](https://en.wikipedia.org/wiki/Hierarchical_clustering) +html)""" ; + rdfs:subClassOf d3f:ClusterAnalysis . + +d3f:HierarchicalDomainDenylisting a d3f:HierarchicalDomainDenylisting, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Hierarchical Domain Denylisting" ; + d3f:d3fend-id "D3-HDDL" ; + d3f:definition "Blocking the resolution of any subdomain of a specified domain name." ; + d3f:kb-article """## How it works +This technique is used to block DNS queries from related domains and subdomains that are unauthorized. + +Hierarchical domain blacklisting considers the blacklisting of second level domains and additional sub-domains and specific hosts for a given query value. A denylist is maintained that contains DNS names and corresponding subdomains, including wildcards, that should be blocked for a given lookup. + +## Considerations +* The denylist of domain names will have to be maintained and will need to be kept up to date +* Other domains that resolve to the domain of interest for blocking (CNAME, etc). +* Denylists should have identified maintenance cycles to ensure lists are not stale.""" ; + d3f:kb-reference d3f:Reference-UseDNSPolicyForApplyingFiltersOnDNSQueries ; + d3f:synonym "Hierarchical Domain Blacklisting" ; + rdfs:subClassOf d3f:ForwardResolutionDomainDenylisting . + +d3f:HomoglyphDenylisting a d3f:HomoglyphDenylisting, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Homoglyph Denylisting" ; + d3f:d3fend-id "D3-HDL" ; + d3f:definition "Blocking DNS queries that are deceptively similar to legitimate domain names." ; + d3f:kb-article """## How it works + +Homoglyph domain blacklisting considers the domain and subdomain structure of a lookup and compares the named components to blacklisted named components. The blacklisted named components are typically crafted modifications of known good domains, e.g., gooogle.com versus google.com. The blacklisted domains typically resemble trusted domains, but have been altered slightly to deceive users. + +The blacklisted named components also include consideration for fonts or Unicode characters that can make certain characters appear very similar (zero vs capital O and the letter l vs the number one). The blacklisted domains under certain fonts will appear to be a trusted domain. + +## Considerations +* Maintaining the currency of the list can be a challenge especially with newly registered domain entries. +* Blacklists should have identified maintenance cycles to ensure lists are not stale.""" ; + d3f:kb-reference d3f:Reference-DetectionOfMaliciousIDNHomoglyphDomains ; + d3f:synonym "Homoglyph Blacklisting" ; + rdfs:subClassOf d3f:ForwardResolutionDomainDenylisting . + +d3f:Host-basedFirewall a owl:Class, + owl:NamedIndividual ; + rdfs:label "Host-based Firewall" ; + d3f:definition "A software firewall which controls network inbound and outbound network traffic to the host computer." ; + rdfs:subClassOf d3f:SystemSoftware . + +d3f:HypothesisTesting a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hypothesis Testing" ; + d3f:d3fend-id "D3A-HT" ; + d3f:definition "A statistical hypothesis test is a method of statistical inference used to decide whether the data at hand sufficiently support a particular hypothesis. Hypothesis testing allows us to make probabilistic statements about population parameters." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Statistical hypothesis testing. [Link](https://en.wikipedia.org/wiki/Statistical_hypothesis_testing)""" ; + rdfs:subClassOf d3f:InferentialStatistics . + +d3f:IdentifierActivityAnalysis a d3f:IdentifierActivityAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Identifier Activity Analysis" ; + d3f:analyzes d3f:Identifier ; + d3f:d3fend-id "D3-IAA" ; + d3f:definition "Taking known malicious identifiers and determining if they are present in a system." ; + d3f:kb-article """## How it works + +Identifier activity analysis is the process of taking identifiers--typically known malicious identifiers--and determining the artifacts that have interacted with those identifiers. + +There are many open and closed source repositories of identifiers that represent indicators of compromise. For example, VirusTotal contains hash signatures of malware and IP Addresses used by threat actors. Defenders can search for these indicators of compromise their own systems to gain context on activity around an identifier. + +## Considerations + +Indicator activity analysis is a good way to gain high precision analysis, but adversaries can modify their own signatures such as hashes quickly to evade detection. This is related to David Bianco’s Pyramid of Pain - Indicators on the lower level (hash values, IP addresses domain names) are easy for adversaries to change. + +Identifier activity data of interest for analysis with the identifier might include, but is not limited to: + +* network traffic activity where the identifier was used to identify communicating entities or referred to in the communication +* process activity referencing the identifier, especially for resource access +* file activity referencing the identifier +* registry settings referencing the identifier""" ; + d3f:kb-reference d3f:Reference-ThePyramidOfPain-DavidBianco ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Identifier ], + d3f:IdentifierAnalysis . + +d3f:Image-to-ImageTranslationGAN a owl:Class, + owl:NamedIndividual ; + rdfs:label "Image-to-Image Translation GAN" ; + d3f:d3fend-id "D3A-ITITG" ; + d3f:definition "Image-to-image translation is the task of transferring styles and characteristics from one image domain to another." ; + d3f:kb-article """## References +MathWorks. (n.d.). Get Started with GANs for Image-to-Image Translation. [Link](https://www.mathworks.com/help/images/get-started-with-gans-for-image-to-image-translation.html)""" ; + rdfs:subClassOf d3f:GenerativeAdversarialNetwork . + +d3f:ImageScannerInputDevice a owl:Class ; + rdfs:label "Image Scanner Input Device" ; + d3f:definition "An image scanner -- often abbreviated to just scanner, is a device that optically scans images, printed text, handwriting or an object and converts it to a digital image. Commonly used in offices are variations of the desktop flatbed scanner where the document is placed on a glass window for scanning. Hand-held scanners, where the device is moved by hand, have evolved from text scanning \"wands\" to 3D scanners used for industrial design, reverse engineering, test and measurement, orthotics, gaming and other applications. Mechanically driven scanners that move the document are typically used for large-format documents, where a flatbed design would be impractical." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:VideoInputDevice ; + skos:altLabel "Scanner" . + +d3f:ImageSegment a owl:Class ; + rdfs:label "Image Segment" ; + d3f:definition "Image segments are distinct partitions of an object file. Both data and code segments are examples of image segments." ; + rdfs:seeAlso d3f:ObjectFile, + ; + rdfs:subClassOf d3f:BinarySegment, + d3f:FileSection . + +d3f:InboundInternetDNSResponseTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Inbound Internet DNS Response Traffic" ; + d3f:definition "Inbound internet DNS response traffic is DNS response traffic from a host outside a given network initiated on an incoming connection to a host inside that network." ; + rdfs:subClassOf d3f:InboundInternetNetworkTraffic . + +d3f:IndirectBranchCallAnalysis a d3f:IndirectBranchCallAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Indirect Branch Call Analysis" ; + d3f:d3fend-id "D3-IBCA" ; + d3f:definition "Analyzing vendor specific branch call recording in order to detect ROP style attacks." ; + d3f:kb-article """## How it works + +This technique is used to detect an attacker attempting to exploit and execute code on a target system's call stack using return-oriented programming (ROP). Modern processors that have the ability to maintain a list of the branching calls, e.g., Intel's Last Branch Recording (LBR), can be used to track and analyze indirect branching calls that are indicative of malicious activity. + +In order to reduce the number of indirect branch calls to analyze to a manageable set it is assumed that malicious ROP activity will involve the use of system calls. The technique observes indirect branch calls that are part of paths that lead to system calls, all others are ignored. Branching calls chained together is often referred to as gadgets and gadgets are often used in ROP attacks. Indirect branch calls that involve a transfer from user-space to kernel-space are of interest for this technique. + +Identification of potential ROP exploit execution includes: + +- Inspecting the LBR when a system function call is made + + - The LBR is configured to return only instruction of interest (ret, indirect jmp, indirect calls) + + +- Behavior is analyzed for + - Ret instructions that appear to target areas not preceded by the call sites + - Sequences of small code fragments that appear to be chained through the indirect branching calls (gadgets) + + +- Of interest are returns that appear to not render control back after calls + - Typical ret-call are paired + - gadgets will appear to have ret followed by instruction of next instruction of the following gadget + + +## Considerations + +* May be operating system dependent since specific system calls are used to scope branching behavoir +* Processors need to support access to a Last Branch Recording list feature +* The size of the LBR stack can limit the expected size of the analyzed execution stack +* If processor does not support LBR then overhead costs for the analysis can be significant""" ; + d3f:kb-reference d3f:Reference-IndirectBranchingCalls ; + rdfs:subClassOf d3f:ProcessAnalysis . + +d3f:InferentialStatistics a owl:Class, + owl:NamedIndividual ; + rdfs:label "Inferential Statistics" ; + d3f:d3fend-id "D3A-IS" ; + d3f:definition "Statistical inference is the process of using data analysis to infer properties of an underlying distribution of probability." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Statistical inference. [Link](https://en.wikipedia.org/wiki/Statistical_inference)""" ; + rdfs:subClassOf d3f:StatisticalMethod . + +d3f:InitScript a owl:Class ; + rdfs:label "Init Script" ; + d3f:definition "An init script (or initialization script) is an executable script that initializes the an application, a process, or a service's state. Examples include scripts run at boot by Unix or Windows, or those run to initialize a shell." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:ExecutableScript ; + skos:altLabel "Initialization Script" . + +d3f:IntegratedHoneynet a d3f:IntegratedHoneynet, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Integrated Honeynet" ; + d3f:d3fend-id "D3-IHN" ; + d3f:definition "The practice of setting decoys in a production environment to entice interaction from attackers." ; + d3f:kb-article """## How it works +Integrated honeynets use full production environments connected to the enterprise network, that utilize computing resources or software that attract attackers, and allow full interaction and access that provides a complete view of an attack. + +## Considerations +An attacker with control of a system on an Integrated Honeynet could: +* try to attack other connected hosts on the network, its IP range of internal hosts not properly configured to react to connections from machines on the integrated honeynet, or position behind the firewall. +* exploit its position by eavesdropping on network traffic +If an attacker manages to stop the processes used to log an attack without setting off any alarms. [1] + +1. Honeypots for Windows, Roger Grimes, 2005""" ; + d3f:kb-reference d3f:Reference-SynchronizingAHoneyNetworkConfigurationToReflectATargetNetworkEnvironment_PaloAltoNetworksInc ; + d3f:spoofs d3f:IntranetNetwork ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:spoofs ; + owl:someValuesFrom d3f:IntranetNetwork ], + d3f:DecoyEnvironment . + +d3f:InterprocessCommunication a owl:Class, + owl:NamedIndividual ; + rdfs:label "Interprocess Communication" ; + d3f:definition "In computer science, inter-process communication or inter-process communication (IPC) refers specifically to the mechanisms an operating system provides to allow processes it manages to share data. Typically, applications can use IPC categorized as clients and servers, where the client requests data and the server responds to client requests. Many applications are both clients and servers, as commonly seen in distributed computing. Methods for achieving IPC are divided into categories which vary based on software requirements, such as performance and modularity requirements, and system circumstances, such as network bandwidth and latency." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:IntranetFileTransferTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Intranet File Transfer Traffic" ; + d3f:definition "Intranet file transfer traffic is file transfer traffic that does not cross a given network's boundaries and uses a standard file transfer protocol." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:FileTransferNetworkTraffic, + d3f:IntranetNetworkTraffic . + +d3f:IntranetMulticastNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Intranet Multicast Network Traffic" ; + d3f:definition "Intranet IPC network traffic is multicast network traffic that does not cross a given network's boundaries." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:IntranetNetworkTraffic . + +d3f:IntranetWebNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Intranet Web Network Traffic" ; + d3f:definition "Intranet web network traffic is network traffic that does not cross a given network's boundaries and uses a standard web protocol." ; + d3f:may-contain d3f:File ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:File ], + d3f:IntranetNetworkTraffic, + d3f:WebNetworkTraffic . + +d3f:JavaScriptBlob a owl:Class, + owl:NamedIndividual ; + rdfs:label "JavaScript Blob" ; + d3f:definition "A JavaScript Blob is a Blob that was created by a JavaScript Blob() constructor call or equivalent function." ; + rdfs:subClassOf d3f:BinaryLargeObject . + +d3f:KernelEvent a owl:Class ; + rdfs:label "Kernel Event" ; + d3f:definition "An event involving operations at the kernel level of an operating system, encompassing interactions with core system resources such as drivers, modules, system calls, and other privileged processes. Kernel events are critical for understanding low-level system behavior and ensuring the integrity of the operating environment." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Kernel ], + d3f:DigitalEvent . + +d3f:KernelModuleEvent a owl:Class ; + rdfs:label "Kernel Module Event" ; + d3f:definition "An event involving the management of kernel modules, such as the loading or unloading of device drivers, extensions, or other dynamically linked components essential for kernel functionality." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:KernelModule ], + [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:HardwareDriver ], + d3f:KernelEvent . + +d3f:KeyboardInputDevice a owl:Class, + owl:NamedIndividual ; + rdfs:label "Keyboard Input Device" ; + d3f:definition "A computer keyboard is a typewriter-style device which uses an arrangement of buttons or keys to act as mechanical levers or electronic switches. Following the decline of punch cards and paper tape, interaction via teleprinter-style keyboards became the main input method for computers. A keyboard is also used to give commands to the operating system of a computer, such as Windows' Control-Alt-Delete combination. Although on Pre-Windows 95 Microsoft operating systems this forced a re-boot, now it brings up a system security options screen." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:InputDevice ; + skos:altLabel "Computer Keyboard", + "Keyboard" . + +d3f:LANAccessMediation a d3f:LANAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "LAN Access Mediation" ; + d3f:d3fend-id "D3-LAMED" ; + d3f:definition "LAN access mediation encompasses the application of strict access control policies, systematic verification of devices, and authentication mechanisms to govern connectivity to a Local Area Network." ; + d3f:isolates d3f:LocalAreaNetwork ; + d3f:kb-article """## How it works + +LAN Access Mediation is a network security approach that manages and controls access to a Local Area Network by using key components such as Access Control Lists (ACLs) to specify which devices are allowed or denied access, Port Security to restrict device connections to specific switch ports, RADIUS for determining the level of access or specific resources available to users or devices, and 802.1X for enforcing device authentication before granting network access. This comprehensive strategy ensures that only authorized devices and users can connect to the network, enhancing overall security.""" ; + d3f:kb-reference d3f:Reference-WhatIsNetworkAccessControl ; + rdfs:comment "Layer 2 Enforcement" ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:LocalAreaNetwork ], + d3f:NetworkAccessMediation . + +d3f:LegacySystem a owl:Class, + owl:NamedIndividual ; + rdfs:label "Legacy System" ; + d3f:definition "In computing, a legacy system is an old method, technology, computer system, or application program, \"of, relating to, or being a previous or outdated computer system,\" yet still in use. Often referencing a system as \"legacy\" means that it paved the way for the standards that would follow it. This can also imply that the system is out of date or in need of replacement." ; + d3f:synonym "Legacy Digital System" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalSystem . + +d3f:Link a owl:Class ; + rdfs:label "Link" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:D3FENDCore, + d3f:DigitalInformationBearer . + +d3f:LoadModule a owl:Class, + owl:NamedIndividual ; + rdfs:label "Load Module" ; + d3f:definition "A system call that loads a driver or extension into the kernel." ; + d3f:loads d3f:HardwareDriver, + d3f:KernelModule ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:loads ; + owl:someValuesFrom d3f:HardwareDriver ], + [ a owl:Restriction ; + owl:onProperty d3f:loads ; + owl:someValuesFrom d3f:KernelModule ], + d3f:SystemCall . + +d3f:LocalAreaNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Area Network Traffic" ; + d3f:definition "Intranet local area network (LAN) traffic is network traffic that does not cross a given network's boundaries; where that network is defined as a LAN." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:IntranetNetworkTraffic . + +d3f:LocalResourceAccess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Resource Access" ; + d3f:accesses d3f:LocalResource ; + d3f:definition "Ephemeral digital artifact comprising a request of a local resource and any response from that resource." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:LocalResource ], + d3f:ResourceAccess ; + skos:altLabel "Endpoint Resource Access" . + +d3f:LogFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Log File" ; + d3f:contains d3f:Log ; + d3f:definition """A log file is a file that records either events that occur in an operating system or other software runs, or messages between different users of a communication software. Logging is the act of keeping a log. In the simplest case, messages are written to a single log file. + +A transaction log is a file (i.e., log) of the communications between a system and the users of that system, or a data collection method that automatically captures the type, content, or time of transactions made by a person from a terminal with that system. For Web searching, a transaction log is an electronic record of interactions that have occurred during a searching episode between a Web search engine and users searching for information on that Web search engine. + +Many operating systems, software frameworks and programs include a logging system. A widely used logging standard is syslog, defined in Internet Engineering Task Force (IETF) RFC 5424). The syslog standard enables a dedicated, standardized subsystem to generate, filter, record, and analyze log messages. This relieves software developers of having to design and code their own ad hoc logging systems.""" ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Log ], + d3f:File . + +d3f:MacOSKeychain a owl:Class, + owl:NamedIndividual ; + rdfs:label "MacOS Keychain" ; + d3f:definition "Keychain is the password management system in macOS, developed by Apple. It was introduced with Mac OS 8.6, and has been included in all subsequent versions of the operating system, now known as macOS. A Keychain can contain various types of data: passwords (for websites, FTP servers, SSH accounts, network shares, wireless networks, groupware applications, encrypted disk images), private keys, certificates, and secure notes." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:PasswordStore ; + skos:altLabel "Keychain" . + +d3f:MailNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Mail Network Traffic" ; + d3f:contains d3f:Email ; + d3f:definition "Mail traffic is network traffic that uses a standard mail transfer protocol." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Email ], + d3f:NetworkTraffic . + +d3f:MemoryBoundaryTracking a d3f:MemoryBoundaryTracking, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Boundary Tracking" ; + d3f:analyzes d3f:ProcessCodeSegment ; + d3f:d3fend-id "D3-MBT" ; + d3f:definition "Analyzing a call stack for return addresses which point to unexpected memory locations." ; + d3f:kb-article """## How it works +This technique monitors for indicators of whether a return address is outside memory previously allocated for an object (i.e. function, module, process, or thread). If so, code that the return address points to is treated as malicious code. + +## Considerations +Kernel malware can manipulate memory contents, for example modifying pointers to hide processes, and thereby impact the accuracy of memory allocation information used to perform the analysis.""" ; + d3f:kb-reference d3f:Reference-InferentialExploitAttemptDetection_CrowdstrikeInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:ProcessCodeSegment ], + d3f:OperatingSystemMonitoring . + +d3f:MemoryManagementUnit a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Management Unit" ; + d3f:contains d3f:TranslationLookasideBuffer ; + d3f:creates d3f:VirtualAddress ; + d3f:definition "A computer’s memory management unit (MMU) is the physical hardware that handles its virtual memory and caching operations. The MMU is usually located within the computer’s central processing unit (CPU), but sometimes operates in a separate integrated chip (IC)." ; + d3f:manages d3f:PageTable, + d3f:Storage ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:manages ; + owl:someValuesFrom d3f:PageTable ], + [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:VirtualAddress ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:TranslationLookasideBuffer ], + [ a owl:Restriction ; + owl:onProperty d3f:manages ; + owl:someValuesFrom d3f:Storage ], + d3f:ProcessorComponent . + +d3f:MemoryProtectionUnit a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Protection Unit" ; + rdfs:subClassOf d3f:ProcessorComponent . + +d3f:MessageEncryption a d3f:MessageEncryption, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Message Encryption" ; + d3f:d3fend-id "D3-MENCR" ; + d3f:definition "Encrypting a message body using a cryptographic key." ; + d3f:encrypts d3f:UserToUserMessage ; + d3f:kb-article """## How it works + +### Asymmetric Cryptography +Asymmetric encryption is typically accomplished using public and private key certificates based on the X.509 standard. The sender encrypts messages using the recipient's public key and the receipt decrypts the message using their private key. Standards that can be used to implement message encryption include S/MIME (Secure/Multipurpose Internet Mail Extensions) and PGP. +### Symmetric Cryptography +Symmetric encryption uses the same cryptographic key by both the sender and receiver to encrypt and decrypt a message. Asymmetric key exchange protocols such as Diffie-Hellman can be used to share the cryptographic key with the recipient. + +## Considerations +- Separate configuration settings to enable message encryption are often needed for each messenger client (e.g. webmail, desktop client, mobile). +- Continuous monitoring to ensure private keys are not compromised and the certificate authority (CA) is trusted. +- Secure transfer of private keys between multiple devices.""" ; + d3f:kb-reference d3f:Reference-SecureMultipurposeInternetMailExtensionsMIME-Version3.1 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:encrypts ; + owl:someValuesFrom d3f:UserToUserMessage ], + d3f:MessageHardening . + +d3f:MicrosoftHTMLApplication a owl:Class, + owl:NamedIndividual ; + rdfs:label "Microsoft HTML Application" ; + d3f:may-contain d3f:ExecutableScript ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:ExecutableScript ], + d3f:HTMLFile . + +d3f:MultivariateAnalysis a owl:Class, + owl:NamedIndividual ; + rdfs:label "Multivariate Analysis" ; + d3f:d3fend-id "D3A-MA" ; + d3f:definition "Multivariate statistics encompassed the simultaneous observation and analysis of more than one outcome variable, i.e., multivariate random variables." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Multivariate statistics. [Link](https://en.wikipedia.org/wiki/Multivariate_statistics)""" ; + rdfs:subClassOf d3f:StatisticalMethod . + +d3f:NetworkFileResource a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network File Resource" ; + d3f:contains d3f:File ; + d3f:definition "A computer file resource made available from one host to other hosts on a computer network." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:File ], + d3f:NetworkFileShareResource . + +d3f:NetworkFlow a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Flow" ; + d3f:definition "A summarization of network transactions between a client and server. It often summarizes bytes sent, bytes received, and protocol flags." ; + d3f:summarizes d3f:NetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:summarizes ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:DigitalInformation . + +d3f:NetworkInitScriptFileResource a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Init Script File Resource" ; + d3f:definition "A computer file resource made available from one host to other hosts on a computer network that is also an initialization script." ; + rdfs:subClassOf d3f:InitScript, + d3f:NetworkFileResource . + +d3f:NetworkInterfaceCard a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Interface Card" ; + d3f:definition "A network interface card (NIC, also known as a network interface controller, network adapter, LAN adapter or physical network interface, and by similar terms) is a computer hardware component that connects a computer to a computer network." ; + d3f:synonym "Network Interface Controller" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:HardwareDevice . + +d3f:NetworkPackets a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Packet" ; + d3f:definition "A network packet is a formatted unit of data carried by a packet-switched network. Computer communications links that do not support packets, such as traditional point-to-point telecommunications links, simply transmit data as a bit stream. When data is formatted into packets, packet switching is possible and the bandwidth of the communication medium can be better shared among users than with circuit switching." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:NetworkSensor a owl:Class ; + rdfs:label "Network Sensor" ; + rdfs:subClassOf d3f:CyberSensor . + +d3f:NetworkTrafficCommunityDeviation a d3f:NetworkTrafficCommunityDeviation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Traffic Community Deviation" ; + d3f:analyzes d3f:NetworkTraffic ; + d3f:d3fend-id "D3-NTCD" ; + d3f:definition "Establishing baseline communities of network hosts and identifying statistically divergent inter-community communication." ; + d3f:kb-article """## How it works +Hosts/users within a computer network are analyzed to identify communities of hosts which frequently communicate. Future communications between communities that don't usually communicate can then be detected. For example, if a community of hosts that communicate in support of a company's finance division suddenly starts to access the code server usually accessed only by engineers, this may indicate unauthorized activity. + +## Considerations +* Potential for false positives in very dynamic network environments. +* Attackers that move low and slow may not differentiate their behavior enough to trigger an alert.""" ; + d3f:kb-reference d3f:Reference-SystemForImplementingThreatDetectionUsingDailyNetworkTrafficCommunityOutliers_VECTRANETWORKSInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:NetworkTrafficPolicyMapping a d3f:NetworkTrafficPolicyMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Traffic Policy Mapping" ; + d3f:d3fend-id "D3-NTPM" ; + d3f:definition "Network traffic policy mapping identifies and models the allowed pathways of data at the network, tranport, and/or application levels." ; + d3f:kb-reference d3f:Reference-CiscoASR9000AccessListCommands ; + d3f:maps d3f:AccessControlConfiguration ; + d3f:queries d3f:CollectorAgent ; + d3f:synonym "DLP Policy Mapping", + "Firewall Mapping", + "IPS Policy Mapping", + "Web Security Gateway Policy Mapping" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:AccessControlConfiguration ], + [ a owl:Restriction ; + owl:onProperty d3f:queries ; + owl:someValuesFrom d3f:CollectorAgent ], + d3f:NetworkMapping . + +d3f:NetworkTrafficSignatureAnalysis a d3f:NetworkTrafficSignatureAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Traffic Signature Analysis" ; + d3f:analyzes d3f:NetworkTraffic ; + d3f:d3fend-id "D3-NTSA" ; + d3f:definition "Analyzing network traffic and compares it to known signatures" ; + d3f:kb-article """## How it works + +Network signature analysis relies on predefined patterns, or signatures, to identify malicious network activity. These signatures typically match against specific byte sequences, packet header information, or protocol anomalies indicative of known threats. + +The process works as follows: + +* Packet Capture: Network traffic is captured on an interface or port, resulting in a stream of raw packets. +* Preprocessing: The captured packets are preprocessed, cleaning and normalizing the data for efficient analysis. +* Signature Matching: Each packet is compared against a database of signatures using dedicated engines. + +## Considerations + +### False Negatives + +Network signature analysis is susceptible to generating false negatives. These occur when malicious activity evades detection due to limitations in the signature-based approach. Here are some common causes: + +* Evolving threats: Attackers frequently modify their tactics, rendering existing signatures ineffective against new variants. +* Obfuscation: Attackers may disguise malicious content using encryption, encoding, or other techniques to bypass signature detection. +* Limited visibility: Signatures rely on specific patterns. If crucial information is encrypted or hidden, the signature might miss the threat. +* Zero-day attacks: By definition, new and unknown attacks lack corresponding signatures, allowing them to pass undetected. + +### False Positives + +Network signature analysis is susceptible to generating false positives. These occur when the signature analysis triggers an alert for benign traffic. Common causes include: + +* Overly broad signatures: Rules designed to be too general might match harmless activities, generating false alarms. +* Network misconfigurations: Improperly configured devices or legitimate network activity can mimic malicious patterns, triggering false positives. +* Data errors: Corrupted or incomplete network data can lead to misinterpretations and false alerts. + +""" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:NetworkVulnerabilityAssessment a d3f:NetworkVulnerabilityAssessment, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Vulnerability Assessment" ; + d3f:d3fend-id "D3-NVA" ; + d3f:definition "Network vulnerability assessment relates all the vulnerabilities of a network's components in the context of their configuration and interdependencies and can also include assessing risk emerging from the network's design as a whole, not just the sum of individual network node or network segment vulnerabilities." ; + d3f:evaluates d3f:Network ; + d3f:identifies d3f:Vulnerability ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:Vulnerability ], + [ a owl:Restriction ; + owl:onProperty d3f:evaluates ; + owl:someValuesFrom d3f:Network ], + d3f:NetworkMapping . + +d3f:NumericPatternMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Numeric Pattern Matching" ; + d3f:d3fend-id "D3A-NPM" ; + d3f:definition "Numeric pattern matching uses a pattern specification and sees if the numeric value matches that pattern--simple forms include exact matching and range matching." ; + rdfs:subClassOf d3f:PatternMatching . + +d3f:OSAPIConnectSocket a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Connect Socket" ; + d3f:invokes d3f:ConnectSocket ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:ConnectSocket ], + d3f:OSAPISystemFunction . + +d3f:OSAPICopyToken a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Copy Token" ; + d3f:invokes d3f:CopyToken ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CopyToken ], + d3f:OSAPISystemFunction . + +d3f:OSAPICreateSocket a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Create Socket" ; + d3f:invokes d3f:CreateSocket ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateSocket ], + d3f:OSAPISystemFunction . + +d3f:OSAPIExec a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Exec" ; + d3f:invokes d3f:Exec ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:Exec ], + d3f:OSAPISystemFunction . + +d3f:OSAPIGetThreadContext a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Get Thread Context" ; + d3f:invokes d3f:GetThreadContext ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:GetThreadContext ], + d3f:OSAPISystemFunction . + +d3f:OSAPIResumeProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Resume Process" ; + d3f:invokes d3f:ResumeProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:ResumeProcess ], + d3f:OSAPISystemFunction . + +d3f:OSAPIResumeThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Resume Thread" ; + d3f:invokes d3f:ResumeThread ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:ResumeThread ], + d3f:OSAPISystemFunction . + +d3f:OSAPISetThreadContext a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Set Thread Context" ; + d3f:invokes d3f:SetThreadContext ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SetThreadContext ], + d3f:OSAPISystemFunction . + +d3f:OSAPITraceThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Trace Thread" ; + d3f:invokes d3f:TraceThread ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:TraceThread ], + d3f:OSAPISystemFunction . + +d3f:OTIOModule a owl:Class, + owl:NamedIndividual ; + rdfs:label "OT I/O Module" ; + d3f:communicates-with d3f:OTActuator, + d3f:OTSensor ; + d3f:definition "An OT I/O Module is an industrial-grade interface designed for harsh Operational Technology (OT) environments. It reliably connects sensors and actuators to industrial control systems, ensuring precise, real-time data exchange in applications such as SCADA or ICS. Engineered for ruggedness and consistent performance, it can manage analog, digital, or other specialized signal types while enduring demanding conditions." ; + rdfs:comment "There are many types of I/O modules, including: analog input, analog output, HART input, HART output, digital input, digital output, mV input, pulse input, universal I/O, vibration input, and many other types of input or output modules. The functionality of the I/O Module can be embedded in the controller or as a separate module connected via chassis or I/O link." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:communicates-with ; + owl:someValuesFrom d3f:OTSensor ], + [ a owl:Restriction ; + owl:onProperty d3f:communicates-with ; + owl:someValuesFrom d3f:OTActuator ], + d3f:IOModule ; + skos:example "Rockwell Compact 5000 IO Module" . + +d3f:OTPowerSupply a owl:Class, + owl:NamedIndividual ; + rdfs:label "OT Power Supply" ; + d3f:definition "An OT power supply is a power supply whose control amplifier is optimized for signal-processing tasks rather than supplying mere steady-state power to a load. It is a self-contained combination of operational amplifiers, power amplifiers, and integral power circuits designed for higher-level operations in industrial or OT contexts." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:PowerSupply ; + skos:example "Phoenix Contact QUINT, Eaton PSG, and many controller-branded power supplies." . + +d3f:OperatingSystemExecutableFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System Executable File" ; + d3f:definition "An operating system executable is a critical executable that is part of the operating system, and without which, the operating system may not operate correctly." ; + rdfs:subClassOf d3f:OperatingSystemFile . + +d3f:OperatingSystemLogFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System Log File" ; + d3f:definition "An operating system log file records events that occur in an operating system" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:LogFile, + d3f:OperatingSystemFile . + +d3f:OperatingSystemSharedLibraryFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System Shared Library File" ; + d3f:definition "An operating system shared library file is a shared library file that is part of the operating system and that incorporates common operating system code for use by any application or to provide operating system services." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OperatingSystemFile, + d3f:SharedLibraryFile . + +d3f:OrchestrationServer a owl:Class ; + rdfs:label "Orchestration Server" ; + d3f:definition "A d3f:Server which is involved with the orchestration of workloads or the execution of orchestrated workloads." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Server . + +d3f:OutboundInternetEncryptedRemoteTerminalTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Internet Encrypted Remote Terminal Traffic" ; + d3f:definition "Outbound internet encrypted remote terminal traffic is encrypted network traffic for a standard remote terminal protocol on an outgoing connection initiated from a host within a network to a host outside the network." ; + rdfs:subClassOf d3f:OutboundInternetEncryptedTraffic ; + skos:altLabel "Outbound Internet Encrypted RDP Traffic", + "Outbound Internet Encrypted SSH Traffic" . + +d3f:OutboundInternetFileTransferTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Internet File Transfer Traffic" ; + d3f:contains d3f:File ; + d3f:definition "Outbound internet file transfer traffic is file transfer traffic that is: (a) on an outgoing connection initiated from a host within a network to a host outside the network, and (b) using a standard file transfer protocol." ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:File ], + d3f:FileTransferNetworkTraffic, + d3f:OutboundInternetNetworkTraffic, + d3f:OutboundNetworkTraffic . + +d3f:OutboundInternetMailTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Internet Mail Traffic" ; + d3f:definition "Outbound internet DNS lookup traffic is network traffic using a standard email protocol on an outgoing connection initiated from a host within a network to a host outside the network." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OutboundInternetNetworkTraffic ; + skos:altLabel "Outbound Internet Email Traffic" . + +d3f:PageFrame a owl:Class, + owl:NamedIndividual ; + rdfs:label "Page Frame" ; + d3f:contained-by d3f:PrimaryStorage ; + d3f:definition "A page frame is the smallest fixed-length contiguous block of physical memory into which memory pages are mapped by the operating system." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contained-by ; + owl:someValuesFrom d3f:PrimaryStorage ], + d3f:MemoryBlock . + +d3f:PageTable a owl:Class, + owl:NamedIndividual ; + rdfs:label "Page Table" ; + d3f:contains d3f:PhysicalAddress, + d3f:VirtualAddress ; + d3f:definition "A page table is the data structure used by the MMU in a virtual memory computer system to store the mapping between virtual addresses (virtual pages) and physical addresses (page frames)." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:VirtualAddress ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:PhysicalAddress ], + d3f:DigitalInformationBearer . + +d3f:PassiveLogicalLinkMapping a d3f:PassiveLogicalLinkMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Passive Logical Link Mapping" ; + d3f:d3fend-id "D3-PLLM" ; + d3f:definition "Passive logical link mapping only listens to network traffic as a means to map the the whole data link layer, where the links represent logical data flows rather than physical connections." ; + d3f:kb-reference d3f:Reference-TenablePassiveNetworkMonitoring ; + d3f:synonym "Passive Logical Layer Mapping" ; + rdfs:subClassOf d3f:LogicalLinkMapping . + +d3f:PasswordAuthentication a d3f:PasswordAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Password Authentication" ; + d3f:d3fend-id "D3-PWA" ; + d3f:definition "Password authentication is a security mechanism used to verify the identity of a user or entity attempting to access a system or resource by requiring the input of a secret string of characters, known as a password, that is associated with the user or entity." ; + d3f:kb-reference d3f:Reference-NIST-Special-Publication-800-53-Revision-5 ; + d3f:uses d3f:Password ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:Password ], + d3f:AgentAuthentication . + +d3f:PatternMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pattern Matching" ; + d3f:d3fend-id "D3A-PM" ; + d3f:definition "Pattern matching is the act of checking a given sequence of tokens for the presence of the constituents of some pattern." ; + d3f:kb-article """## References +1. Pattern matching. (2023, May 20). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Pattern_matching)""" ; + rdfs:subClassOf d3f:LogicalRules . + +d3f:PerHostDownload-UploadRatioAnalysis a d3f:PerHostDownload-UploadRatioAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Per Host Download-Upload Ratio Analysis" ; + d3f:analyzes d3f:NetworkTraffic ; + d3f:d3fend-id "D3-PHDURA" ; + d3f:definition "Detecting anomalies that indicate malicious activity by comparing the amount of data downloaded versus data uploaded by a host." ; + d3f:kb-article """## How it works +Aggregate pull vs. push ratios from metadata are used to develop a baseline for a given host over a specific time period, e.g., over a three-hour period, one day, one week, etc. Anomalies identified over a threshold produce an alert. + +## Considerations +Collection and analysis of large network packet captures requires large storage and intensive computing power. The time windows used to calculate the ratio may vary in implementations, this consideration should take into account a threat model and likely effects (impacts) delivered by an adversary.""" ; + d3f:kb-reference d3f:Reference-SystemForDetectingThreatsUsingScenario-basedTrackingOfInternalAndExternalNetworkTraffic_VECTRANETWORKSInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:PhysicalAccessMediation a d3f:PhysicalAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Physical Access Mediation" ; + d3f:d3fend-id "D3-PAM" ; + d3f:definition "Physical access mediation is the process of granting or denying specific requests to enter specific physical facilities (e.g., Federal buildings, military establishments, border crossing entrances.)" ; + d3f:isolates d3f:PhysicalArtifact ; + d3f:kb-reference d3f:Reference-CNNSI-4009 ; + d3f:synonym "Physical Access Control" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:PhysicalArtifact ], + d3f:AccessMediation . + +d3f:PhysicalAddress a owl:Class, + owl:NamedIndividual ; + rdfs:label "Physical Address" ; + d3f:definition "In a computer supporting virtual memory, the term physical address is used mostly to differentiate from a virtual address. In particular, in computers utilizing a memory management unit(MMU) to translate memory addresses, the virtual and physical addresses refer to an address before and after translation performed by the MMU, respectively." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:MemoryAddress . + +d3f:PhysicalLink a owl:Class, + owl:NamedIndividual ; + rdfs:label "Physical Link" ; + d3f:definition """A physical link is a dedicated connection for communication that uses some physical media (electrical, electromagnetic, optical, to include clear spaces or vacuums.) A physical link represents only a single hop (link) in any larger communcations path, circuit, or network. + +NOTE: not synonymous with data link as a data link can be over a telecommunications circuit, which may be a virtual circuit composed of multiple phyical links.""" ; + d3f:synonym "Layer-1 Link" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Link . + +d3f:PowerShellProfileScript a owl:Class, + owl:NamedIndividual ; + rdfs:label "PowerShell Profile Script" ; + d3f:definition "A PowerShell profile script is a script that runs when PowerShell starts and can be used as a logon script to customize user environments." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:UserInitScript . + +d3f:PredicateLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Predicate Logic" ; + d3f:d3fend-id "D3A-PL" ; + d3f:definition "Predicate logic is is collection of formal systems used in mathematics, philosophy, linguistics, and computer science. First-order logic and Higher-order logic both incorporate predicate logic." ; + d3f:kb-article """## References +1. First-order logic. (2023, May 26). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/First-order_logic) +2. Higher-order logic. (2023, May 13) +[Link](https://en.wikipedia.org/wiki/Higher-order_logic)""" ; + rdfs:subClassOf d3f:SymbolicAI . + +d3f:PrivateKey a owl:Class, + owl:NamedIndividual ; + rdfs:label "Private Key" ; + d3f:definition "A private key can be used to decrypt messages encrypted using the corresponding public key, or used to sign a message that can be authenticated with the corresponding public key." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:AsymmetricKey . + +d3f:ProcessEnvironmentVariable a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Environment Variable" ; + d3f:definition "An environment variable is a dynamic-named value that can affect the way running processes will behave on a computer. They are part of the environment in which a process runs." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ApplicationConfiguration ; + skos:altLabel "Environment Variable" . + +d3f:ProcessSelf-ModificationDetection a d3f:ProcessSelf-ModificationDetection, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Self-Modification Detection" ; + d3f:analyzes d3f:Process ; + d3f:d3fend-id "D3-PSMD" ; + d3f:definition "Detects processes that modify, change, or replace their own code at runtime." ; + d3f:kb-article """## How it Works +A security agent installed on the host machine intercepts API calls between a process and operating system. Intercepted API calls are then compared against attack signatures/patterns to identify API calls that modify executable memory or modify the entry point address of a suspended child process. Attack patterns include: + +* Executable code of a suspended child process removed from memory by one or more API calls. +* New executable code injected and / or loaded into memory of a suspended child process by one or more API calls. +* Executable code modified by one or more API calls. +* Next instruction pointer value in memory modified by one or more API calls. + +## Considerations +Comparing loaded code segments of processes with what is expected to have been loaded from a file can result in false positives, due to legitimate uses of self-modification for decrypting or uncompressing code segments.""" ; + d3f:kb-reference d3f:Reference-SystemAndMethodForProcessHollowingDetection_CarbonBlackInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Process ], + d3f:ProcessAnalysis . + +d3f:ProcessStartFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Start Function" ; + d3f:definition "A function creates a new computer process, usually by invoking a create process system call." ; + d3f:invokes d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:Subroutine . + +d3f:ProcessSuspension a d3f:ProcessSuspension, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Suspension" ; + d3f:d3fend-id "D3-PS" ; + d3f:definition "Suspending a running process on a computer system." ; + d3f:kb-article """## How it works + +A running process might be suspended to mitigate its immediate effects if it is exhibiting anomalous, unauthorized, or malicious behavior. Defenders may choose to suspend rather than terminate to analyze the process first and resume the process if deemed benign. + +### System-provided functions + +#### Windows tools +In Windows, the `PsSuspend` command line utility from the SysInternals Suite provides functionality to suspend processes on a local or remote system.""" ; + d3f:kb-reference d3f:Reference-PsSuspend ; + d3f:suspends d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:suspends ; + owl:someValuesFrom d3f:Process ], + d3f:ProcessEviction . + +d3f:ProcessTree a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Tree" ; + d3f:contains d3f:Process ; + d3f:definition "A process tree is a tree structure representation of parent-child relationships established via process spawn operations." ; + rdfs:seeAlso d3f:ProcessSpawnAnalysis, + , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Process ], + d3f:DigitalInformationBearer . + +d3f:ProcessorComponent a owl:Class ; + rdfs:label "Processor Component" ; + rdfs:subClassOf d3f:HardwareDevice . + +d3f:ProxyServer a owl:Class ; + rdfs:label "Proxy Server" ; + d3f:definition "In computer networking, a proxy server is a server application or appliance that acts as an intermediary for requests from clients seeking resources from servers that provide those resources. A proxy server thus functions on behalf of the client when requesting service, potentially masking the true origin of the request to the resource server." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ComputerNetworkNode, + d3f:Server . + +d3f:RFTransmitter a owl:Class, + owl:NamedIndividual ; + rdfs:label "RF Transmitter" ; + rdfs:subClassOf d3f:RFNode . + +d3f:ReadMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Read Memory" ; + d3f:reads d3f:MemoryBlock ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:MemoryBlock ], + d3f:SystemCall . + +d3f:RecurrentNeuralNetwork a owl:Class, + owl:NamedIndividual ; + rdfs:label "Recurrent Neural Network" ; + d3f:d3fend-id "D3A-RNN" ; + d3f:definition "Recurrent Nerual Networks (RNN) are a class of artificial neural networks where connections between nodes can create a cycle, allowing output from some nodes to affect subsequent input to the same nodes. This allows it to exhibit temporal dynamic behavior." ; + d3f:kb-article """## References +Wikipedia. (2021, September 7). Recurrent Neural Network. [Link](https://en.wikipedia.org/wiki/Recurrent_neural_network)""" ; + rdfs:subClassOf d3f:DeepNeuralNetClassification . + +d3f:Reference-AccountMonitoring_ForescoutTechnologies a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Account monitoring - Forescout Technologies" ; + d3f:has-link "https://patents.google.com/patent/US20190205511A1"^^xsd:anyURI ; + d3f:kb-abstract "Systems, methods, and related technologies for account access monitoring are described. In certain aspects, a login request associated with a device can be analyzed and a score determined. The score and a threshold can be used to determine whether to initiate an action." ; + d3f:kb-author "Chunhui Zhan, Siying Yang" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Forescout Technologies" ; + d3f:kb-reference-of d3f:AccountLocking ; + d3f:kb-reference-title "Account monitoring" . + +d3f:Reference-ActiveFirewallSystemAndMethodology_McAfeeLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Active firewall system and methodology - McAfee LLC" ; + d3f:has-link "https://patents.google.com/patent/US6550012B1"^^xsd:anyURI ; + d3f:kb-abstract "System and methodology providing automated or \"proactive\" network security (\"active\" firewall) are described. The system implements methodology for verifying or authenticating communications, especially between network security components thereby allowing those components to share information. In one embodiment, a system implementing an active firewall is provided which includes methodology for verifying or authenticating communications between network components (e.g., sensor(s), arbiter, and actor(s)), using cryptographic keys or digital certificates. Certificates may be used to digitally sign a message or file and, in a complementary manner, to verify a digital signature. At the outset, particular software components that may participate in authenticated communication are specified, including creating a digital certificate for each such software component. Upon detection by a sensor that an event of interest that has occurred in the computer network system, the system may initiate authenticated communication between the sensor component and a central arbiter (e.g., \"event orchestrator\") component, so that the sensor may report the event to the arbiter or \"brain.\" Thereafter, the arbiter (if it chooses to act on that information) initiates authenticated communication between itself and a third software component, an \"actor\" component (e.g., \"firewall\"). The arbiter may indicate to the actor how it should handle the event. The actor or firewall, upon receiving the information, may now undertake appropriate action, such as dynamically creating or modifying rules for appropriately handling the event, or it may choose to simply ignore the information." ; + d3f:kb-author "Emilio Villa, Adrian Zidaritz, Michael David Varga, Gerhard Eschelbeck, Michael Kevin Jones, Mark James McArdle" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "McAfee LLC" ; + d3f:kb-reference-of d3f:InboundTrafficFiltering ; + d3f:kb-reference-title "Active firewall system and methodology" . + +d3f:Reference-AuditUserAccountManagement a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Audit User Account Management" ; + d3f:has-link "https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/audit-user-account-management"^^xsd:anyURI ; + d3f:kb-abstract "Audit User Account Management determines whether the operating system generates audit events when specific user account management tasks are performed." ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:DomainAccountMonitoring, + d3f:LocalAccountMonitoring ; + d3f:kb-reference-title "Audit User Account Management" . + +d3f:Reference-AutorunDifferences_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-01-002: Autorun Differences - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-01-002/"^^xsd:anyURI ; + d3f:kb-abstract """The Sysinternals tool Autoruns checks the registry and file system for known identify persistence mechanisms. It will output any tools identified, including built-in or added-on Microsoft functionality and third party software. Many of these locations are known by adversaries and used to obtain Persistence. Running Autoruns periodically in an environment makes it possible to collect and monitor its output for differences, which may include the removal or addition of persistent tools. Depending on the persistence mechanism and location, legitimate software may be more likely to make changes than an adversary tool. Thus, this analytic may result in significant noise in a highly dynamic environment. While Autoruns is a convenient method to scan for programs using persistence mechanisms its scanning nature does not conform well to streaming based analytics. This analytic could be replaced with one that draws from sensors that collect registry and file information if streaming analytics are desired. + +Utilizes the Sysinternals autoruns tool (ignoring validated Microsoft entries). Primarily not a detection analytic by itself but through analysis of results by an analyst can be used for such. Building another analytic on top of this one identifying unusual entries would likely be a beneficial alternative.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemFileAnalysis ; + d3f:kb-reference-title "CAR-2013-01-002: Autorun Differences" . + +d3f:Reference-CAR-2020-11-001%3ABootOrLogonInitializationScripts_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2020-11-001: Boot or Logon Initialization Scripts - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2020-11-001/"^^xsd:anyURI ; + d3f:kb-abstract "Adversaries may schedule software to run whenever a user logs into the system; this is done to establish persistence and sometimes for lateral movement. This trigger is established through the registry key HKEY_CURRENT_USER\\EnvironmentUserInitMprLogonScript. This signature looks edits to existing keys or creation of new keys in that path. Users purposefully adding benign scripts to this path will result in false positives; that case is rare, however. There are other ways of running a script at startup or login that are not covered in this signature. Note that this signature overlaps with the Windows Sysinternals Autoruns tool, which would also show changes to this registry path." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemInitConfigAnalysis ; + d3f:kb-reference-title "CAR-2020-11-001: Boot or Logon Initialization Scripts" . + +d3f:Reference-CAR-2021-05-003%3ABCDEditFailureRecoveryModification_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2021-05-003: BCDEdit Failure Recovery Modification - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2021-05-003/"^^xsd:anyURI ; + d3f:kb-abstract "This search looks for flags passed to bcdedit.exe modifications to the built-in Windows error recovery boot configurations. This is typically used by ransomware to prevent recovery." ; + d3f:kb-author "MITRE" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2021-05-003: BCDEdit Failure Recovery Modification" . + +d3f:Reference-CreateRemoteProcessViaWMIC_MITRE_Other a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2016-03-002: Create Remote Process via WMIC - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2016-03-002/"^^xsd:anyURI ; + d3f:kb-abstract """Adversaries may use Windows Management Instrumentation (WMI) to move laterally, by launching executables remotely.The analytic CAR-2014-12-001 describes how to detect these processes with network traffic monitoring and process monitoring on the target host. However, if the command line utility wmic.exe is used on the source host, then it can additionally be detected on an analytic. The command line on the source host is constructed into something like wmic.exe /node:"\\" process call create "\\". It is possible to also connect via IP address, in which case the string "\\" would instead look like IP Address. + +Although this analytic was created after CAR-2014-12-001, it is a much simpler (although more limited) approach. Processes can be created remotely via WMI in a few other ways, such as more direct API access or the built-in utility PowerShell.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis, + d3f:RPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2016-03-002: Create Remote Process via WMIC" . + +d3f:Reference-Database_for_receiving_storing_and_compiling_information_about_email_messages a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Database for receiving, storing and compiling information about email messages" ; + d3f:has-link "https://patents.google.com/patent/US20050091319A1/"^^xsd:anyURI ; + d3f:kb-author "Steven Kirsch" ; + d3f:kb-reference-of d3f:DomainNameReputationAnalysis, + d3f:IPReputationAnalysis ; + d3f:kb-reference-title "Database for receiving, storing and compiling information about email messages" . + +d3f:Reference-DecoyAndDeceptiveDataObjectTechnology_CymmetriaInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Decoy and deceptive data object technology - Cymmetria Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170134423A1"^^xsd:anyURI ; + d3f:kb-abstract "A computer implemented method of detecting unauthorized access to a protected network by monitoring a dynamically updated deception environment, comprising launching, on one or more decoy endpoints, one or more decoy operating system (OS) managing one or more of a plurality of deception applications mapping a plurality of applications executed in a protected network, updating dynamically a usage indication for a plurality of deception data objects deployed in the protected network to emulate usage of the plurality of deception data objects for accessing the deception application(s) wherein the plurality of deception data objects are configured to trigger an interaction with the deception application(s) when used, detecting usage of data contained in the deception data object(s) by monitoring the interaction and identifying one or more potential unauthorized operations based on analysis of the detection." ; + d3f:kb-author "Dean Sysman; Gadi Evron; Imri Goldberg; Itamar Sher; Shmuel Ur" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Cymmetria Inc" ; + d3f:kb-reference-of d3f:DecoySessionToken, + d3f:DecoyUserCredential ; + d3f:kb-reference-title "Decoy and deceptive data object technology" . + +d3f:Reference-DetectingScript-basedMalware_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Detecting script-based malware - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US20190188384A1"^^xsd:anyURI ; + d3f:kb-abstract "Described herein are systems, techniques, and computer program products for preventing execution, by a scripting engine, of harmful commands that may be introduced by computer malware or other mechanisms. The system identifies certain host processes that may attempt to utilize a hosted scripting engine. An unmanaged interface module is injected into an identified host process. The unmanaged interface module is configured to detect certain conditions indicating the likelihood that a scripting engine will be instantiated, and in response to inject a managed interface module into the host process. The managed interface module hooks into certain methods of the scripting engine to intercept commands before they are executed by the scripting engine. The managed and unmanaged interface components then communicate with a kernel-mode threat detection component to determine whether any commands should be blocked." ; + d3f:kb-author "Ion-Alexandru IONESCU; Satoshi Tanda" ; + d3f:kb-mitre-analysis """The patent describes techniques that can be implemented to detect and block malicious commands and command scripts from being executed by scripting engines. + +### Script Execution Monitoring explanation +This patent describes software installed on the host system that hooks into methods of a scripting engine to intercept commands before they are executed and block commands if they are determined to be harmful. For example regular expression checking may be used to identify commands having malicious patterns. Expression checking may be used for script files as well as interactively - typed commands. + +### File Content Signatures explanation +This patent includes File Content Signatures because in the case of a script file, a hash of the file is compared against hashes of known malicious script files to determine whether the script file is malicious.""" ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:FileContentRules, + d3f:ScriptExecutionAnalysis ; + d3f:kb-reference-title "Detecting script-based malware" . + +d3f:Reference-DigitalIdentityGuidelines800-63-3 a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Digital Identity Guidelines 800-63-3" ; + d3f:has-link "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-63-3.pdf"^^xsd:anyURI ; + d3f:kb-author "NIST" ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:One-timePassword, + d3f:StrongPasswordPolicy ; + d3f:kb-reference-title "Digital Identity Guidelines" . + +d3f:Reference-DomainKeysIdentifiedMail-Signatures-IETF a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - RFC 6376: DomainKeys Identified Mail (DKIM) Signatures - IETF" ; + d3f:has-link "https://tools.ietf.org/html/rfc6376"^^xsd:anyURI ; + d3f:kb-abstract """DomainKeys Identified Mail (DKIM) permits a person, role, or organization that owns the signing domain to claim some responsibility for a message by associating the domain with the message. This can be an author's organization, an operational relay, or one of their agents. DKIM separates the question of the identity of the Signer of the message from the purported author of the message. Assertion of responsibility is validated through a +cryptographic signature and by querying the Signer's domain directly +to retrieve the appropriate public key. Message transit from author to recipient is through relays that typically make no substantive change to the message content and thus preserve the DKIM signature.""" ; + d3f:kb-author "D. Crocker, T. Hansen, M. Kucherawy" ; + d3f:kb-organization "Internet Engineering Task Force (IETF)" ; + d3f:kb-reference-of d3f:TransferAgentAuthentication ; + d3f:kb-reference-title "RFC 6376: DomainKeys Identified Mail (DKIM) Signatures" . + +d3f:Reference-DynamicSelectionAndGenerationOfAVirtualCloneForDetonationOfSuspiciousContentWithinAHoneyNetwork_PaloAltoNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Dynamic selection and generation of a virtual clone for detonation of suspicious content within a honey network - Palo Alto Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US9882929B1/en?oq=US-9882929-B1"^^xsd:anyURI ; + d3f:kb-abstract "Techniques for dynamic selection and generation of detonation location of suspicious content with a honey network are disclosed. In some embodiments, a system for dynamic selection and generation of detonation location of suspicious content with a honey network includes a virtual machine (VM) instance manager that manages a plurality of virtual clones executed in an instrumented VM environment, in which the plurality of virtual clones executed in the instrumented VM environment correspond to the honey network that emulates a plurality of devices in an enterprise network; and an intelligent malware detonator that detonates a malware sample in at least one of the plurality of virtual clones executed in the instrumented VM environment." ; + d3f:kb-author "Taylor Ettema; Huagang Xie" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Palo Alto Networks Inc" ; + d3f:kb-reference-of d3f:DecoyNetworkResource, + d3f:StandaloneHoneynet ; + d3f:kb-reference-title "Dynamic selection and generation of a virtual clone for detonation of suspicious content within a honey network" . + + a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Eviction Guidance for Networks Affected by the SolarWinds and Active Directory/M365 Compromise - CISA" ; + d3f:has-link "https://www.cisa.gov/news-events/analysis-reports/ar21-134a"^^xsd:anyURI ; + d3f:kb-organization "CISA" ; + d3f:kb-reference-of d3f:CredentialRotation, + d3f:DNSCacheEviction ; + d3f:kb-reference-title "Eviction Guidance for Networks Affected by the SolarWinds and Active Directory/M365 Compromise" . + +d3f:Reference-FWTK-FirewallToolkit_ a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - FWTK - Firewall Toolkit" ; + d3f:has-link "https://blogs.gartner.com/john_pescatore/2008/10/02/this-week-in-network-security-history-the-firewall-toolkit/"^^xsd:anyURI ; + d3f:kb-abstract "delivered to DARPA in ~1993" ; + d3f:kb-author "" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "" ; + d3f:kb-reference-title "FWTK - Firewall Toolkit" . + +d3f:Reference-FileAndFolderPermissions a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - File and Folder Permissions" ; + d3f:has-link "https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/bb727008(v=technet.10)?redirectedfrom=MSDN"^^xsd:anyURI ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:LocalFilePermissions ; + d3f:kb-reference-title "File and Folder Permissions" . + +d3f:Reference-FirewallForInterentAccess_SecureComputingLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firewall for interent access - Secure Computing LLC" ; + d3f:has-link "https://patents.google.com/patent/GB2317539A"^^xsd:anyURI ; + d3f:kb-abstract "Regulating the flow of internetwork connections through a firewall (10) having a network protocol stack (14,16,18) which includes an Internet Protocol (IP) layer (16). A determination is made of the parameters characteristic of a connection request, including a netelement parameter characteristic of where the connection request came from. A query is generated and a determination is made whether there is a rule corresponding to that query. If there is a rule corresponding to the query, a determination is made whether authentication is required by the rule. If authentication is required by the rule, an authentication protocol is activated and the connection is activated if the authentication protocol is completed successfully." ; + d3f:kb-author "Edward B Stockwell, Alan E Klietz" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Secure Computing LLC" ; + d3f:kb-reference-of d3f:InboundTrafficFiltering ; + d3f:kb-reference-title "Firewall for interent access" . + +d3f:Reference-FirewallForProcessingAConnectionlessNetworkPacket_NationalSecurityAgency a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firewall for processing a connectionless network packet - National Security Agency" ; + d3f:has-link "https://patents.google.com/patent/US7073196B1"^^xsd:anyURI ; + d3f:kb-abstract "The present invention is a device for and method of accessing a network by initializing a database, an approved list, and a disapproved list; receiving an connectionless network packet; computing a flow tag based on the connectionless network packet; discarding the connectionless network packet and returning to the second step if the flow tag is on the disapproved list; allowing access to the network and returning to the second step if the flow tag is on the approved list; comparing the flow tag to the database if the flow tag is not on the approved list or the disapproved list; discarding the connectionless network packet, adding the flow tag to the disapproved list, and returning to the second step if the database rejects the flow tag; and allowing access to the network, adding the flow tag to the approved list, and returning to the second step if the database accepts the flow tag." ; + d3f:kb-author "Patrick W. Dowd, John T. McHenry" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "National Security Agency" ; + d3f:kb-reference-of d3f:InboundTrafficFiltering ; + d3f:kb-reference-title "Firewall for processing a connectionless network packet" . + +d3f:Reference-FirewallForProcessingConnection-orientedAndConnectionlessDatagramsOverAConnection-orientedNetwork_NationalSecurityAgency a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firewall for processing connection-oriented and connectionless datagrams over a connection-oriented network - National Security Agency" ; + d3f:has-link "https://patents.google.com/patent/US6615358B1"^^xsd:anyURI ; + d3f:kb-abstract "The present invention is a device for and method of accessing an information network by initializing a database, an ATM approved list, an IP approved list, and an IP disapproved list; receiving a datagram; discarding the datagram if it is not on the ATM approved list; determining the datagram's type; allowing access to the network and comparing the connection request, if any, to the database if the datagram is ATM signaling; discarding the datagram if the datagram is ATM signaling and the database denies the request; adding the request to the ATM approved list if the datagram is ATM signaling and the database allows the request; allowing access to the network if the datagram is ATM data that excludes IP data and the request is on the ATM approved list; computing a flow tag if the datagram is ATM data that includes IP data; discarding the datagram if the flow tag is on the IP disapproved list; allowing access to the network if the flow tag is on the IP approved list; comparing the flow tag to the database if the flow tag is neither on the IP approved list nor on the IP disapproved list; discarding the datagram and adding the flow tag to the IP disapproved list if the database rejects the flow tag; and allowing access to the network and adding the flow tag to the corresponding approved list if the database accepts the flow tag; and performing these steps on the next datagram" ; + d3f:kb-author "Patrick W. Dowd, John T. McHenry" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "National Security Agency" ; + d3f:kb-reference-of d3f:InboundTrafficFiltering ; + d3f:kb-reference-title "Firewall for processing connection-oriented and connectionless datagrams over a connection-oriented network" . + +d3f:Reference-FirewallsThatFilterBasedUponProtocolCommands_IntelCorp a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firewalls that filter based upon protocol commands - Intel Corp" ; + d3f:has-link "https://patents.google.com/patent/US6832256B1"^^xsd:anyURI ; + d3f:kb-abstract "Data transfer is controlled between a first network and a second network of computers by a firewall-proxy combination. Active interpretation of protocol commands exchanged between the first network and the second network is performed to determine specific actions concerning completion of the protocol request. This active firewall-proxy combination may exist on either the first or second network of computers. This method of control provides centralized control and administration for all potentially reachable resources within a network." ; + d3f:kb-author "James E. Toga" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Intel Corp" ; + d3f:kb-reference-of d3f:InboundTrafficFiltering ; + d3f:kb-reference-title "Firewalls that filter based upon protocol commands" . + +d3f:Reference-FirmwareVerificationTrapezoid a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firmware Verification Trapezoid" ; + d3f:has-link "https://patents.google.com/patent/US9674183B2/en"^^xsd:anyURI ; + d3f:kb-abstract "A trust control management method for security, operable on a computer system generates a unique Trust ID value by combining user-defined values with hardware-specific values associated with the user's computer system and storing the Trust ID value in a memory register physically associated with the hardware of the computer system." ; + d3f:kb-author "Michael J. Dyer, Jose E. Gonzalez, Albert Caballero" ; + d3f:kb-organization "Trapezoid, Inc" ; + d3f:kb-reference-of d3f:FirmwareVerification ; + d3f:kb-reference-title "System and method for hardware-based trust control management" . + +d3f:Reference-IdentificationOfTracerouteNodesAndAssociatedDevices a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Identification of traceroute nodes and associated devices" ; + d3f:has-link "https://patents.google.com/patent/US10079749B2/en"^^xsd:anyURI ; + d3f:kb-abstract "Various embodiments pertain to communication network systems. In particular, various embodiments relate to multi-path probing in communication network systems that can be used to estimate the complete topology of the network. A method includes receiving data at a source node from a tracerouting probe in a network. The data includes information about at least one network node. The method also includes determining an identification for the at least one network node based on information. In addition, the method includes using the identification of the at least one network node to determine an identification of at least one device." ; + d3f:kb-author "Tomas KUBIK, Lan Li, Tomas RYBKA, Karlo ZATYLNY, Chris O'Brien" ; + d3f:kb-organization "SolarWinds Worldwide LLC" ; + d3f:kb-reference-title "Identification of traceroute nodes and associated devices" . + +d3f:Reference-LibreNMSDocsNetworkMapExtension a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Libre NMS - Network Map Extension" ; + d3f:has-link "https://docs.librenms.org/Extensions/Network-Map/"^^xsd:anyURI ; + d3f:kb-abstract """LibreNMS has the ability to show you a network map based on: +* xDP Discovery +* MAC addresses""" ; + d3f:kb-organization "LibreNMS.org" ; + d3f:kb-reference-of d3f:NetworkMapping ; + d3f:kb-reference-title "Libre NMS - Network Map Extension" . + +d3f:Reference-LsassProcessDumpViaProcdump_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2019-07-002: Lsass Process Dump via Procdump - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2019-07-002/"^^xsd:anyURI ; + d3f:kb-abstract """ProcDump is a sysinternal command-line utility whose primary purpose is monitoring an application for CPU spikes and generating crash dumps during a spike that an administrator or developer can use to determine the cause of the spike. + +ProcDump may be used to dump the memory space of lsass.exe to disk for processing with a credential access tool such as Mimikatz. This is performed by launching procdump.exe as a privileged user with command line options indicating that lsass.exe should be dumped to a file with an arbitrary name.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessSpawnAnalysis ; + d3f:kb-reference-title "CAR-2019-07-002: Lsass Process Dump via Procdump" . + +d3f:Reference-MalwareDetectionUsingLocalComputationalModels_CrowdstrikeInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Malware detection using local computational models - Crowdstrike Inc" ; + d3f:has-link "https://patents.google.com/patent/US20190026466A1"^^xsd:anyURI ; + d3f:kb-abstract "Example techniques herein determine that a trial data stream is associated with malware (\"dirty\") using a local computational model (CM). The data stream can be represented by a feature vector. A control unit can receive a first, dirty feature vector (e.g., a false miss) and determine the local CM based on the first feature vector. The control unit can receive a trial feature vector representing the trial data stream. The control unit can determine that the trial data stream is dirty if a broad CM or the local CM determines that the trial feature vector is dirty. In some examples, the local CM can define a dirty region in a feature space. The control unit can determine the local CM based on the first feature vector and other clean or dirty feature vectors, e.g., a clean feature vector nearest to the first feature vector." ; + d3f:kb-author "Sven Krasser,David Elkind, Patrick Crenshaw, Kirby James Koster" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Crowdstrike Inc" ; + d3f:kb-reference-of d3f:ProcessTermination ; + d3f:kb-reference-title "Malware detection using local computational models" . + +d3f:Reference-MethodForControllingComputerNetworkSecurity_CheckpointSoftwareTechnologiesLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method for controlling computer network security - Checkpoint Software Technologies Ltd" ; + d3f:has-link "https://patents.google.com/patent/EP0658837B1/"^^xsd:anyURI ; + d3f:kb-abstract "A method of operating a security system for a computer network in which data is passed in said network as data packets, said system controlling the passage of said data packets in the network according to a security rule, where each aspect of said network controlled by said security rule has been defined, said security rule has been defined in terms of said aspects and converted into a set of filter language instructions." ; + d3f:kb-author "Gil Shwed" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Checkpoint Software Technologies Ltd" ; + d3f:kb-reference-of d3f:InboundTrafficFiltering ; + d3f:kb-reference-title "Method for controlling computer network security" . + +d3f:Reference-NIST-Special-Publication-800-53A-Revision-5 a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - NIST Special Publication 800-53A Revision 5 - Assessing Security and Privacy Controls in Information Systems and Organizations" ; + d3f:has-link "https://doi.org/10.6028/NIST.SP.800-53Ar5"^^xsd:anyURI ; + d3f:kb-abstract "This publication provides a methodology and set of procedures for conducting assessments of security and privacy controls employed within systems and organizations within an effective risk management framework. The assessment procedures, executed at various phases of the system development life cycle, are consistent with the security and privacy controls in NIST Special Publication 800-53, Revision 5. The procedures are customizable and can be easily tailored to provide organizations with the needed flexibility to conduct security and privacy control assessments that support organizational risk management processes and are aligned with the stated risk tolerance of the organization. Information on building effective security and privacy assessment plans is also provided with guidance on analyzing assessment results." ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:OperationalRiskAssessment ; + d3f:kb-reference-title "NIST Special Publication 800-53A Revision 5 - Assessing Security and Privacy Controls in Information Systems and Organizations" . + +d3f:Reference-NearMemoryInMemoryDetectionofFilelessMalware a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Near-Memory & In-Memory Detection of Fileless Malware" ; + d3f:has-link "https://web.inf.ufpr.br/mazalves/wp-content/uploads/sites/13/2021/03/memsys2020.pdf"^^xsd:anyURI ; + d3f:kb-abstract "Fileless malware are recent threats to computer systems that load directly into memory, and whose aim is to prevent anti-viruses (AVs) from successfully matching byte patterns against suspicious files written on disk. Their detection requires that software-based AVs continuously scan memory, which is expensive due to repeated locks and polls. However, research advances introduced near-memory and in-memory processing, which allow memory controllers to trigger basic computations without moving data to the CPU. In this paper, we address AVs performance overhead by moving them to the hardware, i.e., we propose instrumenting processors’ memory controller or smart memories (near- and in-memory malware detection, respectively) to accelerate memory scanning procedures. To do so, we present MINI-ME, the Malware Identification based on Near- and In-Memory Evaluation mechanism, a hardware-based AV accelerator that interrupts the program’s execution if malicious patterns are discovered in their memory. We prototyped MINI-ME in a simulator and tested it with a set of 21 thousand in-the-wild malware samples, which resulted in multiple signatures matching with less than 1% of performance overhead and rates of 100% detection, and zero false-positives and false-negatives." ; + d3f:kb-author "Marcus Botacin, André Grégio, Marco Antonio Zanata Alves" ; + d3f:kb-reference-of d3f:HostShutdown ; + d3f:kb-reference-title "Near-Memory & In-Memory Detection of Fileless Malware" . + +d3f:Reference-Network-levelPolymorphicShellcodeDetectionUsingEmulation a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Network-level polymorphic shellcode detection using emulation" ; + d3f:has-link "https://www.cs.unc.edu/~fabian/course_papers/polymorphic-detect.pdf"^^xsd:anyURI ; + d3f:kb-author "Michalis Polychronakis" ; + d3f:kb-reference-of d3f:ByteSequenceEmulation ; + d3f:kb-reference-title "Network-level polymorphic shellcode detection using emulation" . + +d3f:Reference-NetworkFirewallWithProxy_SecureComputingLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Network firewall with proxy - Secure Computing LLC" ; + d3f:has-link "https://patents.google.com/patent/GB2318031A"^^xsd:anyURI ; + d3f:kb-abstract "A proxy which is part of a firewall controls exchanges of information between two application entities. The proxy interrogates attempts to establish a communication session by requesting entities with a server entity in lower layers in accordance with defined authentication procedures. The Proxy interfaces with networking software to direct a communication stack to monitor connection requests to any address on specific ports. The requestor's address, and the server's address are checked against a access control list. If either address is invalid, the proxy closes the connection. If both are valid, a new connection is setup such that both the requestor and server are transparently connected to the proxy with variable higher levels being connected in a relay mode. Protocol data units are interrogated for conformance to a protocol session, and optionally further decoded to add additional application specific filtering. In one embodiment, an OSI architecture comprises the levels." ; + d3f:kb-author "Michael W Green, Ricky Ronald Kruse" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Secure Computing LLC" ; + d3f:kb-reference-of d3f:InboundTrafficFiltering ; + d3f:kb-reference-title "Network firewall with proxy" . + +d3f:Reference-OverviewOfTheSeccompSandbox a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Overview of the seccomp sandbox" ; + d3f:has-link "https://code.google.com/archive/p/seccompsandbox/wikis/overview.wiki"^^xsd:anyURI ; + d3f:kb-reference-of d3f:SystemCallFiltering ; + d3f:kb-reference-title "Overview of the seccomp sandbox" . + +d3f:Reference-PlatformFirmwareResiliencyGuidelines_NIST a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Platform Firmware Resiliency Guidelines - NIST" ; + d3f:has-link "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-193.pdf"^^xsd:anyURI ; + d3f:kb-abstract "This document provides technical guidelines and recommendations supporting resiliency of platform firmware and data against potentially destructive attacks. The platform is a collection of fundamental hardware and firmware components needed to boot and operate a system. A successful attack on platform firmware could render a system inoperable, perhaps permanently, or requiring reprogramming by the original manufacturer, resulting in significant disruptions to users. The technical guidelines in this document promote resiliency in the platform by describing security mechanisms for protecting the platform against unauthorized changes, detecting unauthorized changes that occur, and recovering from attacks rapidly and securely. Implementers, including Original Equipment Manufacturers (OEMs) and component/device suppliers, can use these guidelines to build stronger security mechanisms into platforms. System administrators, security professionals, and users can use this document to guide procurement strategies and priorities for future systems." ; + d3f:kb-author "NIST" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:FirmwareVerification ; + d3f:kb-reference-title "Platform Firmware Resiliency Guidelines" . + +d3f:Reference-PointerValidationFunction_SEI a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Pointer Validation Function - SEI" ; + d3f:has-link "https://wiki.sei.cmu.edu/confluence/display/c/MEM10-C.+Define+and+use+a+pointer+validation+function"^^xsd:anyURI ; + d3f:kb-organization "Software Engineering Institute" ; + d3f:kb-reference-of d3f:NullPointerChecking, + d3f:PointerValidation ; + d3f:kb-reference-title "SEI CERT C Coding Standard" . + +d3f:Reference-RemotelyLaunchedExecutablesViaWMI_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-12-001: Remotely Launched Executables via WMI - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-12-001/"^^xsd:anyURI ; + d3f:kb-abstract """Adversaries can use Windows Management Instrumentation (WMI) to move laterally by launching executables remotely. For adversaries to achieve this, they must open a WMI connection to a remote host. This RPC activity is currently detected by CAR-2014-11-007. After the WMI connection has been initialized, a process can be remotely launched using the command: wmic /node:"" process call create "", which is detected via CAR-2016-03-002. + +This leaves artifacts at both a network (RPC) and process (command line) level. When wmic.exe (or the schtasks API) is used to remotely create processes, Windows uses RPC (135/tcp) to communicate with the the remote machine. + +After RPC authenticates, the RPC endpoint mapper opens a high port connection, through which the schtasks Remote Procedure Call is actually implemented. With the right packet decoders, or by looking for certain byte streams in raw data, these functions can be identified. + +When the command line is executed, it has the parent process of C:\\windows\\system32\\wbem\\WmiPrvSE.exe. This analytic looks for these two events happening in sequence, so that the network connection and target process are output.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:ProcessLineageAnalysis, + d3f:RPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2014-12-001: Remotely Launched Executables via WMI" . + +d3f:Reference-SMBSessionSetups_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-09-003: SMB Session Setups - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-09-003/"^^xsd:anyURI ; + d3f:kb-abstract """Account usage within SMB can be used to identify compromised credentials, and the hosts accessed with them. + +This analytic monitors SMB activity that deals with user activity rather than file activity.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:AuthorizationEventThresholding, + d3f:IPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2013-09-003: SMB Session Setups" . + +d3f:Reference-SMBWriteRequest-NamedPipes_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2014-03-001: SMB Write Request - NamedPipes - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2014-03-001/"^^xsd:anyURI ; + d3f:kb-abstract """An SMB write can be an indicator of lateral movement, especially when combined with other information such as execution of that written file. Named pipes are a subset of SMB write requests. Named pipes such as msftewds may not be alarming; however others, such as lsarpc, may. + +Monitoring SMB write requests still creates some noise, particularly with named pipes. As a result, SMB is now split between writing named pipes and writing other files.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:IPCTrafficAnalysis, + d3f:RPCTrafficAnalysis ; + d3f:kb-reference-title "CAR-2014-03-001: SMB Write Request - NamedPipes" . + +d3f:Reference-SecureMultipurposeInternetMailExtensionsMIME-Version3.1 a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Secure/Multipurpose Internet Mail Extensions (S/MIME) Version 3.1" ; + d3f:has-link "https://tools.ietf.org/html/rfc3851"^^xsd:anyURI ; + d3f:kb-organization "Internet Engineering Task Force (IETF)" ; + d3f:kb-reference-title "Secure/Multipurpose Internet Mail Extensions (S/MIME) Version 3.1 Message Specification" . + +d3f:Reference-SecuringWebTransactions a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Securing Web Transactions" ; + d3f:has-link "https://www.nccoe.nist.gov/sites/default/files/library/sp1800/tls-serv-cert-mgt-nist-sp1800-16b-final.pdf"^^xsd:anyURI ; + d3f:kb-abstract """Organizations risk losing revenue, customers, and reputation, and exposing internal or customer data to +attackers if they do not properly manage Transport Layer Security (TLS) server certificates. TLS is the +most widely used security protocol to secure web transactions and other communications on the +internet and internal networks. TLS server certificates are central to the security and operation of +internet-facing and internal web services. Improper TLS server certificate management results in +significant outages to web applications and services-such as government services, online banking, flight operations, and mission-critical services within an organization-and increased risk of security breaches.""" ; + d3f:kb-author "William Haag, Murugiah Souppaya, Paul Turner, William C. Barker, Brett Pleasant, Susan Symington" ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:ActiveCertificateAnalysis ; + d3f:kb-reference-title "Securing Web Transactions" . + +d3f:Reference-SoftwareVulnerabilityGraphDatabase a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Software vulnerability graph database" ; + d3f:has-link "https://patents.google.com/patent/WO2020028535A1"^^xsd:anyURI ; + d3f:kb-abstract "To analyze open-source code at a large scale, a security domain graph language (\"GL\") has been created that functions as a vulnerability description language and facilitates program analysis queries. The SGL facilitates building and maintaining a graph database to catalogue vulnerabilities found in open-source components. This graphical database can be accessed via a database interface directly or accessed by an agent that interacts with the database interface. To build the graph database, a database interface processes an open-source component and creates graph structures which represent relationships present in the open-source component. The database interface transforms a vulnerability description into a canonical form based on a schema for the graph database and updates the database based on a determination of whether the vulnerability is a duplicate. This ensures quality and consistency of the vulnerability dataset maintained in the graph database." ; + d3f:kb-author "Darius Tsien Wei FOO, Ming Yi ANG, Asankhaya Sharma, Jie Shun YEO" ; + d3f:kb-organization "Veracode, Inc." ; + d3f:kb-reference-of d3f:AssetVulnerabilityEnumeration, + d3f:SystemDependencyMapping, + d3f:SystemVulnerabilityAssessment ; + d3f:kb-reference-title "Software vulnerability graph database" . + +d3f:Reference-SystemAndMethodForIdentifyingThePresenceOfMalwareUsingMini-trapsSetAtNetworkEndpoints_FidelisCybersecuritySolutionsInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method for identifying the presence of malware using mini-traps set at network endpoints - Fidelis Cybersecurity Solutions Inc" ; + d3f:has-link "https://patents.google.com/patent/US9807114B2/en?oq=US-9807114-B2"^^xsd:anyURI ; + d3f:kb-abstract "A system for identifying the presence of advanced persistent threats on a network including a plurality of resources, interconnected to form a network, at least one decoy resource, at least one mini-trap installed on at least one of the plurality of resources and functionally associated with at one of the at least one decoy resource, the at least one mini-trap comprising deceptive information directing malware accessing the at least one mini-trap to the decoy resource associated therewith, and a manager node forming part of the network, locally or remotely, and configured to manage placement of the at least one mini-trap on the at least one of the plurality of resources and association between the at least one mini-trap and the decoy resource associated therewith." ; + d3f:kb-author "Doron Kolton; Rami Mizrahi; Omer Zohar; Benny Ben-Rabi; Alex Barbalat; Shlomi Gabai" ; + d3f:kb-mitre-analysis """Questionable or all files (as determined by the enterprise) are forwarded to the decoy network. Using a manager node user interface, you can setup fake information (ex. IP address of a decoy FTP server) +and deploy decoy physical or virtual endpoints.""" ; + d3f:kb-organization "Fidelis Cybersecurity Solutions Inc" ; + d3f:kb-reference-of d3f:DecoyNetworkResource, + d3f:DecoyUserCredential ; + d3f:kb-reference-title "System and method for identifying the presence of malware using mini-traps set at network endpoints" . + +d3f:Reference-SystemForImplementingThreatDetectionUsingDailyNetworkTrafficCommunityOutliers_VECTRANETWORKSInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System for implementing threat detection using daily network traffic community outliers - VECTRA NETWORKS Inc" ; + d3f:has-link "https://patents.google.com/patent/US20160191560A1"^^xsd:anyURI ; + d3f:kb-abstract "A method and system for identifying insider threats within an organization is provided. The approach constructs an internal connectivity graph to identify communities of hosts/users, and checks for abnormal behavior relative to past behaviors." ; + d3f:kb-author "David Lopes Pegna; Himanshu Mhatre; Oliver Brdiczka" ; + d3f:kb-mitre-analysis "This patent describes techniques for detecting insider attacks. Network packet capture data is collected and stored for processing. Metadata is extracted for each communication session on the organization's network and includes information on source and destination host destination port, number of connection attempts, size of data exchanged, duration and time of the communication. The metadata is used to build a connectivity graph of the network and identify groups of similar hosts that exhibit similar behavior. For each group of similar behavior identified, a baseline behavior pattern profile is developed. Network activity for a host within a group that deviates over a threshold from the baseline behavior patterns is identified as suspicious and an alert is generated." ; + d3f:kb-organization "VECTRA NETWORKS Inc" ; + d3f:kb-reference-of d3f:NetworkTrafficCommunityDeviation, + d3f:ProtocolMetadataAnomalyDetection ; + d3f:kb-reference-title "System for implementing threat detection using daily network traffic community outliers" . + +d3f:Reference-SystemsAndMethodsForDetectingAnd_orHandlingTargetedAttacksInTheEmailChannel_GraphusInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Systems and methods for detecting and/or handling targeted attacks in the email channel - Graphus Inc" ; + d3f:has-link "https://patents.google.com/patent/US20170324767A1"^^xsd:anyURI ; + d3f:kb-abstract "Techniques for detecting and/or handling target attacks in an enterprise's email channel are provided. The techniques include receiving aspects of an incoming email message addressed to a first email account holder, selecting a recipient interaction profile and/or a sender profile from a plurality of predetermined profiles stored in a memory based upon the received properties, determining a message trust rating associated with the incoming email message based upon the incoming email message and the selected recipient interaction profile and/or the sender profile; and generating an alert identifying the incoming email message as including a security risk based upon the determined message trust rating. The recipient interaction profile includes information associating the first email account holder and a plurality of email senders from whom email messages have previously been received for the first email account holder, and the sender profile includes information associating a sender of the incoming email message with characteristics determined from a plurality of email messages previously received from the sender." ; + d3f:kb-author "Manoj Kumar Srivastava" ; + d3f:kb-mitre-analysis """The patent describes using sender trust rating and sender MTA trust rating as an indicator of level of email security risk. + +### Sender Reputation explanation +This patent includes Sender Reputation because it describes sender trust rating being used as an indicator of the level of security risk and/or trust level associated with an email sender. The sender trust rating may be determined based on one or more of: + +* length of time sender has known the enterprise +* number of recipients in the enterprise the sender interacts with +* sender vs. enterprise originated message ratio +* sender messages open vs. not-open ratio +* number of emails received from this sender +* number of emails replied for this sender +* number of emails from this sender not opened +* number of emails from this sender not opened that contain an attachment +* number of emails from this sender not opened that contain a URL +* number of emails sent to this sender +* number of email replies received from this sender + +Based on the trust rating an alert is generated identifying the incoming email message as a security risk. + +### Sender MTA Reputation explanation +This patent includes Sender MTA Reputation because it describes sender MTA trust rating as an indicator of the level of security risk and/or trust level associated with a sender MTA. The trust rating may be determined based on one or more of: + +* length of time MTA has interacted with the enterprise +* number of sender domains sending emails from the MTA +* number of recipients in the enterprise the MTA sends emails to +* number of emails received from this MTA +* number of email replies received from this MTA + +Based on the trust rating an alert is generated identifying the incoming email message as a security risk.""" ; + d3f:kb-organization "Graphus Inc" ; + d3f:kb-reference-of d3f:SenderMTAReputationAnalysis, + d3f:SenderReputationAnalysis ; + d3f:kb-reference-title "Systems and methods for detecting and/or handling targeted attacks in the email channel" . + +d3f:Reference-UserActivityFromClearingEventLogs_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2016-04-002: User Activity from Clearing Event Logs - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2016-04-002/"^^xsd:anyURI ; + d3f:kb-abstract "It is unlikely that event log data would be cleared during normal operations, and it is likely that malicious attackers may try to cover their tracks by clearing an event log. When an event log gets cleared, it is suspicious. Alerting when a \"Clear Event Log\" is generated could point to this intruder technique. Centrally collecting events has the added benefit of making it much harder for attackers to cover their tracks. Event Forwarding permits sources to forward multiple copies of a collected event to multiple collectors, thus enabling redundant event collection. Using a redundant event collection model can minimize the single point of failure risk." ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:SystemFileAnalysis ; + d3f:kb-reference-title "CAR-2016-04-002: User Activity from Clearing Event Logs" . + +d3f:Reference-UserLoggedInToMultipleHosts_MITRE a d3f:ExternalKnowledgeBase, + owl:NamedIndividual ; + rdfs:label "Reference - CAR-2013-02-012: User Logged in to Multiple Hosts - MITRE" ; + d3f:has-link "https://car.mitre.org/analytics/CAR-2013-02-012/"^^xsd:anyURI ; + d3f:kb-abstract """Most users use only one or two machines during the normal course of business. User accounts that log in to multiple machines, especially over a short period of time, may be compromised. Remote logins among multiple machines may be an indicator of Lateral Movement. + +Certain users will likely appear as being logged into several machines and may need to be "whitelisted." Such users would include network admins or user names that are common to many hosts.""" ; + d3f:kb-author "MITRE" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "MITRE" ; + d3f:kb-reference-of d3f:AuthenticationEventThresholding, + d3f:AuthorizationEventThresholding ; + d3f:kb-reference-title "CAR-2013-02-012: User Logged in to Multiple Hosts" . + +d3f:Reference-www.biometric-solutions.com_keystroke-dynamics a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - http://www.biometric-solutions.com/keystroke-dynamics.html - biometric-solutions.com" ; + d3f:has-link "http://www.biometric-solutions.com/keystroke-dynamics.html"^^xsd:anyURI ; + d3f:kb-abstract """Keystroke dynamics or typing dynamics refers to the automated method of identifying or confirming the identity of an individual based on the manner and the rhythm of typing on a keyboard. Keystroke dynamics is a behavioral biometric, this means that the biometric factor is 'something you do'. + +Already during the second world war a technique known as The Fist of the Sender was used by military intelligence to distinguish based on the rhythm whether a morse code message was send by ally or enemy. These days each household has at least one computer keyboard, making keystroke dynamics the easiest biometric solution to implement in terms of hardware. + +With keystroke dynamics the biometric template used to identify an individual is based on the typing pattern, the rhythm and the speed of typing on a keyboard. The raw measurements used for keystroke dynamics are dwell time and flight time.""" ; + d3f:kb-author "Biometric Solutions" ; + d3f:kb-organization "Biometric Solutions" ; + d3f:kb-reference-of d3f:InputDeviceAnalysis ; + d3f:kb-reference-title "Keystroke Dynamics" . + +d3f:RegistryKeyDeletion a d3f:RegistryKeyDeletion, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Registry Key Deletion" ; + d3f:d3fend-id "D3-RKD" ; + d3f:definition "Delete a registry key." ; + d3f:deletes d3f:WindowsRegistryKey ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:WindowsRegistryKey ], + d3f:ObjectEviction . + +d3f:ReinforcementLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Reinforcement Learning" ; + d3f:d3fend-id "D3A-RL" ; + d3f:definition "Reinforcement Learning is a subjugate technique of machine learning that uses feedback to reinforce good or valid rules and lessen the reliance of bad or ineffective rules" ; + d3f:kb-article """## References +Reinforcement learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Reinforcement_learning).""" ; + rdfs:subClassOf d3f:MachineLearning . + +d3f:RelayPatternAnalysis a d3f:RelayPatternAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Relay Pattern Analysis" ; + d3f:analyzes d3f:OutboundInternetNetworkTraffic ; + d3f:d3fend-id "D3-RPA" ; + d3f:definition "The detection of an internal host relaying traffic between the internal network and the external network." ; + d3f:kb-article """## How it works +A relay may use a variety of proxying, forwarding, or routing technologies to bridge a protected network with an external network. A defensive analytic to detect a relay network may compare the network sessions among multiple hosts. Hosts which have nearly similar network statistics may be part of a relay network. The statistics may include number of bytes sent to and from, time of session initiation, packet size, or packet arrival time data. + +## Considerations + +Complex intranet VPNs or routing encapsulation may affect the detection analytics. In addition, unwanted packets might not be forwarded, and additional packets may be added at the relay, further complicating detection.""" ; + d3f:kb-reference d3f:Reference-MaliciousRelayDetectionOnNetworks_VECTRANETWORKSInc ; + d3f:synonym "Relay Network Detection" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:RemoteCommand a owl:Class ; + rdfs:label "Remote Command" ; + d3f:definition "A remote command is a command sent from one computer to another to be executed on the remote computer. One example of this, is through a command-line interface (CLI) like using Invoke-Command from PowerShell or a command sent through an ssh session. This class generalizes to all means of sending a command through an established protocol to control capabilities on a remote computer." ; + rdfs:subClassOf d3f:Command . + +d3f:RemoteFileAccessMediation a d3f:RemoteFileAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote File Access Mediation" ; + d3f:d3fend-id "D3-RFAM" ; + d3f:definition "Remote file access mediation is the process of managing and securing access to file systems over a network to ensure that only authorized users or processes can interact with remote files." ; + d3f:isolates d3f:File ; + d3f:kb-article """## How it works + +Remote File Access Mediation focuses on controlling how users or processes access file systems from remote locations. This involves ensuring secure connections, often through protocols like SFTP or SMB, and enforcing permissions to prevent unauthorized access or data breaches. Examples of enforcement areas include accessing shared drives or cloud storage from remote offices or home networks.""" ; + d3f:kb-reference d3f:Reference-NIST-Special-Publication-800-53-Revision-5 ; + d3f:synonym "File Share Access Mediation" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:File ], + d3f:NetworkResourceAccessMediation . + +d3f:RestoreFile a d3f:RestoreFile, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore File" ; + d3f:d3fend-id "D3-RF" ; + d3f:definition "Restoring a file for an entity to access." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + d3f:restores d3f:File ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restores ; + owl:someValuesFrom d3f:File ], + d3f:RestoreObject . + +d3f:RestoreUserAccountAccess a d3f:RestoreUserAccountAccess, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore User Account Access" ; + d3f:d3fend-id "D3-RUAA" ; + d3f:definition "Restoring a user account's access to resources." ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + d3f:restores d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restores ; + owl:someValuesFrom d3f:UserAccount ], + d3f:RestoreAccess . + +d3f:ResumeProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Resume Process" ; + d3f:resumes d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:resumes ; + owl:someValuesFrom d3f:Process ], + d3f:SystemCall . + +d3f:ResumeThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Resume Thread" ; + d3f:resumes d3f:Thread ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:resumes ; + owl:someValuesFrom d3f:Thread ], + d3f:SystemCall . + +d3f:RoutingAccessMediation a d3f:RoutingAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Routing Access Mediation" ; + d3f:d3fend-id "D3-RAM" ; + d3f:definition "Routing access mediation is a network security approach that manages and controls access at the network layer using VPNs, tunneling protocols, firewall rules, and traffic inspection to ensure secure and efficient data routing." ; + d3f:isolates d3f:Network ; + d3f:kb-article """## How it works + +Routing Access Mediation is a network security strategy focused on managing and controlling access at the network layer. It includes the use of VPNs for secure remote access, tunneling protocols for encapsulating data, firewall rules for filtering traffic, and advanced inspection techniques like Cisco's Context-Based Access Control (CBAC) to monitor and regulate data flow. This approach ensures secure and efficient routing of data across networks, protecting against unauthorized access and enhancing overall network security.""" ; + d3f:kb-reference d3f:Reference-WhatIsNetworkAccessControl ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:Network ], + d3f:NetworkAccessMediation . + +d3f:SaveRegister a owl:Class, + owl:NamedIndividual ; + rdfs:label "Save Registers" ; + d3f:copies d3f:ProcessorRegister ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:copies ; + owl:someValuesFrom d3f:ProcessorRegister ], + d3f:SystemCall . + +d3f:ScriptApplicationProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Script Application Process" ; + d3f:definition "A script application process is an application process interpreting an executable script." ; + d3f:interprets d3f:ExecutableScript ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:interprets ; + owl:someValuesFrom d3f:ExecutableScript ], + d3f:ApplicationProcess ; + skos:altLabel "Script Process" . + +d3f:SecurityToken a owl:Class, + owl:NamedIndividual ; + rdfs:label "Security Token" ; + d3f:contains d3f:AccessToken ; + d3f:definition "Security tokens are peripheral devices used to prove one's identity electronically (as in the case of a customer trying to access their bank account). The token is used in addition to or in place of a password to prove that the customer is who they claim to be. The token acts like an electronic key to access something." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:AccessToken ], + d3f:HardwareDevice . + +d3f:ServiceDependency a owl:Class, + owl:NamedIndividual ; + rdfs:label "Service Dependency" ; + d3f:definition "A service dependency indicates a service has an activity, agent, or another service which relies on it in order to be functional." ; + rdfs:subClassOf d3f:Dependency . + +d3f:SetRegisters a owl:Class, + owl:NamedIndividual ; + rdfs:label "Set Registers" ; + d3f:modifies d3f:ProcessorRegister ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ProcessorRegister ], + d3f:SystemCall . + +d3f:SetThreadContext a owl:Class, + owl:NamedIndividual ; + rdfs:label "Set Thread Context" ; + d3f:modifies d3f:Thread ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:Thread ], + d3f:SystemCall . + +d3f:SharedResourceAccessFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Shared Resource Access Function" ; + d3f:accesses d3f:Resource ; + d3f:definition "A function which access a shared resource." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Resource ], + d3f:Subroutine . + +d3f:ShimDatabase a owl:Class, + owl:NamedIndividual ; + rdfs:label "Shim Database" ; + d3f:definition "A application configuration database that contains or points to software shims (e.g., for backward compatibility, patches, etc.)" ; + rdfs:subClassOf d3f:ApplicationConfigurationDatabase . + +d3f:SlowSymbolicLink a owl:Class ; + rdfs:label "Slow Symbolic Link" ; + d3f:definition "A slow symbolic link is any symbolic link on a Unix filesystem that is not a fast symbolic link; slow symlink is thus retroactively termed from fast symlink. Slow symbolic links stored the symbolic link information as data in regular files." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:SymbolicLink, + d3f:UnixLink ; + skos:altLabel "Slow Symlink" . + +d3f:SoftwareDeploymentTool a owl:Class, + owl:NamedIndividual ; + rdfs:label "Software Deployment Tool" ; + d3f:definition "Software that coordinates the deployment process of software to systems, typically remotely." ; + rdfs:subClassOf d3f:ServiceApplication . + +d3f:SoftwareLibraryFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Software Library File" ; + d3f:contains d3f:Subroutine ; + d3f:definition "A software library is a collection of software components that are used to build a software product." ; + d3f:may-contain d3f:ExecutableBinary, + d3f:ExecutableScript ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Subroutine ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:ExecutableScript ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:ExecutableBinary ], + d3f:File . + +d3f:SoftwarePackagingTool a owl:Class ; + rdfs:label "Software Packaging Tool" ; + d3f:definition "A tool that automates the process of packaging either or both binary code and source code for use on one or more target platforms." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:BuildTool . + +d3f:SourceCodeReference a owl:Class ; + rdfs:label "Source Code Reference" ; + d3f:pref-label "Source Code" ; + rdfs:subClassOf d3f:TechniqueReference . + +d3f:StackFrameCanary a owl:Class, + owl:NamedIndividual ; + rdfs:label "Stack Frame Canary" ; + d3f:definition "Stack canaries, named for their analogy to a canary in a coal mine, are used to detect a stack buffer overflow before execution of malicious code can occur. This method works by placing a small integer, the value of which is randomly chosen at program start, in memory just before the stack return pointer. Most buffer overflows overwrite memory from lower to higher memory addresses, so in order to overwrite the return pointer (and thus take control of the process) the canary value must also be overwritten. This value is checked to make sure it has not changed before a routine uses the return pointer on the stack. This technique can greatly increase the difficulty of exploiting a stack buffer overflow because it forces the attacker to gain control of the instruction pointer by some non-traditional means such as corrupting other important variables on the stack." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:StackComponent ; + skos:altLabel "Stack Canary" . + +d3f:StandaloneHoneynet a d3f:StandaloneHoneynet, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Standalone Honeynet" ; + d3f:d3fend-id "D3-SHN" ; + d3f:definition "An environment created for the purpose of attracting attackers and eliciting their behaviors that is not connected to any production enterprise systems." ; + d3f:kb-article """## How it works +A standalone honeynet does not directly interact with the real enterprise environment. It may be located near or in some portion of the enterprise address space, but it does not interact with enterprise resources. + +## Considerations +A standalone honeynet is a lower risk to deploy compared to connected or integrated honeynets due to its isolation from the enterprise network. However, this comes at cost in loss of fidelity and realism. Significant extra effort must be made in order to make the environment look realistic.""" ; + d3f:kb-reference d3f:Reference-DynamicSelectionAndGenerationOfAVirtualCloneForDetonationOfSuspiciousContentWithinAHoneyNetwork_PaloAltoNetworksInc ; + d3f:spoofs d3f:IntranetNetwork ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:spoofs ; + owl:someValuesFrom d3f:IntranetNetwork ], + d3f:DecoyEnvironment . + +d3f:StoredProcedure a owl:Class, + owl:NamedIndividual ; + rdfs:label "Stored Procedure" ; + d3f:definition "A stored procedure (also termed proc, storp, sproc, StoPro, StoredProc, StoreProc, sp, or SP) is a subroutine available to applications that access a relational database management system (RDBMS). Such procedures are stored in the database data dictionary." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Subroutine . + +d3f:StringPatternMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "String Pattern Matching" ; + d3f:d3fend-id "D3A-SPM" ; + d3f:definition "String pattern-matching algorithms, also known as string-matching algorithms, are an important class of string algorithms that try to find a place where one or several strings (also called patterns) are found within a larger string or text" ; + d3f:kb-article """## How it works +A basic example of string searching is when the pattern and the searched text are arrays of elements of an alphabet (finite set) Σ. Σ may be a human language alphabet, for example, the letters A through Z and other applications may use a binary alphabet (Σ = {0,1}) or a DNA alphabet (Σ = {A,C,G,T}) in bioinformatics. + +In practice, the method of feasible string-search algorithm may be affected by the string encoding. In particular, if a variable-width encoding is in use, then it may be slower to find the Nth character, perhaps requiring time proportional to N. This may significantly slow some search algorithms. One of many possible solutions is to search for the sequence of code units instead, but doing so may produce false matches unless the encoding is specifically designed to avoid it. + +## References +1. String-searching algorithm. (2023, April 8). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/String-searching_algorithm)""" ; + rdfs:subClassOf d3f:PatternMatching . + +d3f:SupervisedLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Supervised Learning" ; + d3f:d3fend-id "D3A-SL" ; + d3f:definition "Supervised learning establishes a relationship between the known input and output variables to conduct a predictive analysis." ; + d3f:kb-article """## References +Supervised learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Supervised_learning).""" ; + rdfs:subClassOf d3f:MachineLearning . + +d3f:SuspendProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Suspend Process" ; + d3f:suspends d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:suspends ; + owl:someValuesFrom d3f:Process ], + d3f:SystemCall . + +d3f:SuspendThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Suspend Thread" ; + d3f:definition "Suspending a thread causes the thread to stop executing user-mode code." ; + d3f:suspends d3f:Thread ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:suspends ; + owl:someValuesFrom d3f:Thread ], + d3f:SystemCall . + +d3f:SymbolicLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Symbolic Logic" ; + d3f:d3fend-id "D3A-SL" ; + d3f:definition "Symbolic Logic, also known as formal logic, is a branch of mathematics that uses symbolic representations for logical expressions and relationships. It provides a systematic method for examining the structure of arguments and reasoning, focusing on the relationships between propositions rather than the content of those propositions." ; + d3f:kb-article """## How it Works + +## References +1. Symbolic Logic. (2023, June 6). In _Wolfram Mathworld_. [Link](https://mathworld.wolfram.com/SymbolicLogic.html) +2. Hughes, G. and Schagrin, M. (2023, Apr 19). Formal Logic. _Encyclopedia Brittanica_. [Link](https://www.britannica.com/topic/formal-logic) +3. Carnap, R. (1953). Introduction to Symbolic Logic and Its Applications. Dover Publications. [Link](https://archive.org/details/rudolf-carnap-introduction-to-symbolic-logic-and-its-applications/page/3/mode/2up)""" ; + rdfs:subClassOf d3f:AnalyticTechnique . + +d3f:SystemConfigSystemCall a owl:Class ; + rdfs:label "System Config System Call" ; + rdfs:subClassOf d3f:SystemCall . + +d3f:SystemDependency a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Dependency" ; + d3f:definition "A system dependency indicates a system has an activity, agent, or another system which relies on it in order to be functional." ; + rdfs:seeAlso , + , + ; + rdfs:subClassOf d3f:Dependency . + +d3f:SystemInitScript a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Init Script" ; + d3f:definition "A script used to initialize and configure elements of the system's environment, applications, services, or its operating system." ; + rdfs:subClassOf d3f:ExecutableScript, + d3f:SystemConfigurationInitResource, + d3f:SystemInitConfiguration . + +d3f:SystemSoftware a owl:Class ; + rdfs:label "System Software" ; + d3f:definition "Computer software which enables operating system or platform functionality." ; + rdfs:subClassOf d3f:Software . + +d3f:SystemStartupDirectory a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Startup Directory" ; + d3f:definition "A system startup directory is a directory containing executable files or links to executable files which are run when the system starts." ; + rdfs:subClassOf d3f:Directory, + d3f:SystemConfigurationInitResource, + d3f:SystemInitConfiguration . + +d3f:SystemStateImage a owl:Class, + owl:NamedIndividual ; + rdfs:label "System State Image" ; + d3f:definition "In computing, a system image is a serialized copy of the entire state of a computer system stored in some non-volatile form, such as a binary executable file." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:StorageImage ; + skos:altLabel "System Image" . + +d3f:SystemTimeApplication a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Time Application" ; + d3f:definition "A system time utility is utility software that can get the system time, such as the Unix date command or Windows' Net utility." ; + rdfs:subClassOf d3f:UtilitySoftware . + +d3f:SystemVulnerabilityAssessment a d3f:SystemVulnerabilityAssessment, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System Vulnerability Assessment" ; + d3f:d3fend-id "D3-SYSVA" ; + d3f:definition "System vulnerability assessment relates all the vulnerabilities of a system's components in the context of their configuration and internal dependencies and can also include assessing risk emerging from the system's design as a whole, not just the sum of individual component vulnerabilities." ; + d3f:evaluates d3f:DigitalSystem ; + d3f:identifies d3f:Vulnerability ; + d3f:kb-reference d3f:Reference-SoftwareVulnerabilityGraphDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:Vulnerability ], + [ a owl:Restriction ; + owl:onProperty d3f:evaluates ; + owl:someValuesFrom d3f:DigitalSystem ], + d3f:SystemMapping . + +d3f:T1016 a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Network Configuration Discovery" ; + d3f:attack-id "T1016" ; + d3f:definition "Adversaries may look for details about the network configuration and settings, such as IP and/or MAC addresses, of systems they access or through information discovery of remote systems. Several operating system administration utilities exist that can be used to gather this information. Examples include [Arp](https://attack.mitre.org/software/S0099), [ipconfig](https://attack.mitre.org/software/S0100)/[ifconfig](https://attack.mitre.org/software/S0101), [nbtstat](https://attack.mitre.org/software/S0102), and [route](https://attack.mitre.org/software/S0103)." ; + d3f:may-execute d3f:ExecutableScript ; + d3f:may-invoke d3f:CreateProcess, + d3f:GetSystemNetworkConfigValue ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:GetSystemNetworkConfigValue ], + [ a owl:Restriction ; + owl:onProperty d3f:may-execute ; + owl:someValuesFrom d3f:ExecutableScript ], + d3f:DiscoveryTechnique . + +d3f:T1074 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Data Staged" ; + d3f:attack-id "T1074" ; + d3f:definition "Adversaries may stage collected data in a central location or directory prior to Exfiltration. Data may be kept in separate files or combined into one file through techniques such as [Archive Collected Data](https://attack.mitre.org/techniques/T1560). Interactive command shells may be used, and common functionality within [cmd](https://attack.mitre.org/software/S0106) and bash may be used to copy data into a staging location.(Citation: PWC Cloud Hopper April 2017)" ; + d3f:reads d3f:Resource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:Resource ], + d3f:CollectionTechnique . + +d3f:T1087.002 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Account" ; + d3f:attack-id "T1087.002" ; + d3f:definition "Adversaries may attempt to get a listing of domain accounts. This information can help adversaries determine which domain accounts exist to aid in follow-on behavior such as targeting specific accounts which possess particular privileges." ; + d3f:enumerates d3f:DomainUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enumerates ; + owl:someValuesFrom d3f:DomainUserAccount ], + d3f:T1087 . + +d3f:T1127 a owl:Class ; + rdfs:label "Trusted Developer Utilities Proxy Execution" ; + d3f:attack-id "T1127" ; + d3f:definition "Adversaries may take advantage of trusted developer utilities to proxy execution of malicious payloads. There are many utilities used for software development related tasks that can be used to execute code in various forms to assist in development, debugging, and reverse engineering.(Citation: engima0x3 DNX Bypass)(Citation: engima0x3 RCSI Bypass)(Citation: Exploit Monday WinDbg)(Citation: LOLBAS Tracker) These utilities may often be signed with legitimate certificates that allow them to execute on a system and proxy execution of malicious code through a trusted process that effectively bypasses application control solutions." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1132 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Data Encoding" ; + d3f:attack-id "T1132" ; + d3f:definition "Adversaries may encode data to make the content of command and control traffic more difficult to detect. Command and control (C2) information can be encoded using a standard data encoding system. Use of data encoding may adhere to existing protocol specifications and includes use of ASCII, Unicode, Base64, MIME, or other binary-to-text and character encoding systems.(Citation: Wikipedia Binary-to-text Encoding) (Citation: Wikipedia Character Encoding) Some data encoding systems may also result in data compression, such as gzip." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1205 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Traffic Signaling" ; + d3f:attack-id "T1205" ; + d3f:definition "Adversaries use traffic signaling techniques, such as sending specific network sequences or magic packets, to covertly trigger actions like opening ports, activating backdoors, or installing filters, facilitating command and control, persistence, and defense evasion." ; + d3f:produces d3f:NetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:CommandAndControlTechnique, + d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique . + +d3f:T1216 a owl:Class ; + rdfs:label "System Script Proxy Execution" ; + d3f:attack-id "T1216" ; + d3f:definition "Adversaries may use trusted scripts, often signed with certificates, to proxy the execution of malicious files. Several Microsoft signed scripts that have been downloaded from Microsoft or are default on Windows installations can be used to proxy execution of other files.(Citation: LOLBAS Project) This behavior may be abused by adversaries to execute malicious files that could bypass application control and signature validation on systems.(Citation: GitHub Ultimate AppLocker Bypass List)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique . + +d3f:T1222 a owl:Class, + owl:NamedIndividual ; + rdfs:label "File and Directory Permissions Modification" ; + d3f:attack-id "T1222" ; + d3f:definition "Adversaries may modify file or directory permissions/attributes to evade access control lists (ACLs) and access protected files.(Citation: Hybrid Analysis Icacls1 June 2018)(Citation: Hybrid Analysis Icacls2 May 2018) File and directory permissions are commonly managed by ACLs configured by the file or directory owner, or users with the appropriate permissions. File and directory ACL implementations vary by platform, but generally explicitly designate which users or groups can perform which actions (read, write, execute, etc.)." ; + d3f:modifies d3f:AccessControlConfiguration ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:AccessControlConfiguration ], + d3f:DefenseEvasionTechnique . + +d3f:T1480 a owl:Class ; + rdfs:label "Execution Guardrails" ; + d3f:attack-id "T1480" ; + d3f:definition "Adversaries may use execution guardrails to constrain execution or actions based on adversary supplied and environment specific conditions that are expected to be present on the target. Guardrails ensure that a payload only executes against an intended target and reduces collateral damage from an adversary’s campaign.(Citation: FireEye Kevin Mandia Guardrails) Values an adversary can provide about a target system or environment to use as guardrails may include specific network share names, attached physical devices, files, joined Active Directory (AD) domains, and local/external IP addresses.(Citation: FireEye Outlook Dec 2019)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1484 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain or Tenant Policy Modification" ; + d3f:attack-id "T1484" ; + d3f:definition "Adversaries may modify the configuration settings of a domain or identity tenant to evade defenses and/or escalate privileges in centrally managed environments. Such services provide a centralized means of managing identity resources such as devices and accounts, and often include configuration settings that may apply between domains or tenants such as trust relationships, identity syncing, or identity federation." ; + d3f:modifies d3f:GroupPolicy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:GroupPolicy ], + d3f:DefenseEvasionTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:T1491 a owl:Class ; + rdfs:label "Defacement" ; + d3f:attack-id "T1491" ; + d3f:definition "Adversaries may modify visual content available internally or externally to an enterprise network, thus affecting the integrity of the original content. Reasons for [Defacement](https://attack.mitre.org/techniques/T1491) include delivering messaging, intimidation, or claiming (possibly false) credit for an intrusion. Disturbing or offensive images may be used as a part of [Defacement](https://attack.mitre.org/techniques/T1491) in order to cause user discomfort, or to pressure compliance with accompanying messages." ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1561 a owl:Class ; + rdfs:label "Disk Wipe" ; + d3f:attack-id "T1561" ; + d3f:definition "Adversaries may wipe or corrupt raw disk data on specific systems or in large numbers in a network to interrupt availability to system and network resources. With direct write access to a disk, adversaries may attempt to overwrite portions of disk data. Adversaries may opt to wipe arbitrary portions of disk data and/or wipe disk structures like the master boot record (MBR). A complete wipe of all disk sectors may be attempted." ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1563 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote Service Session Hijacking" ; + d3f:accesses d3f:RemoteSession ; + d3f:attack-id "T1563" ; + d3f:definition "Adversaries may take control of preexisting sessions with remote services to move laterally in an environment. Users may use valid credentials to log into a service specifically designed to accept remote connections, such as telnet, SSH, and RDP. When a user logs into a service, a session will be established that will allow them to maintain a continuous interaction with that service." ; + d3f:produces d3f:AdministrativeNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:AdministrativeNetworkTraffic ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:RemoteSession ], + d3f:LateralMovementTechnique . + +d3f:T1569 a owl:Class ; + rdfs:label "System Services" ; + d3f:attack-id "T1569" ; + d3f:definition "This technique has been deprecated." ; + rdfs:subClassOf d3f:ExecutionTechnique . + +d3f:T1573 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Encrypted Channel" ; + d3f:attack-id "T1573" ; + d3f:definition "Adversaries may employ an encryption algorithm to conceal command and control traffic rather than relying on any inherent protections provided by a communication protocol. Despite the use of a secure algorithm, these implementations may be vulnerable to reverse engineering if secret keys are encoded and/or generated within malware samples/configuration files." ; + d3f:produces d3f:OutboundInternetEncryptedTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetEncryptedTraffic ], + d3f:CommandAndControlTechnique ; + skos:altLabel "Custom Command and Control Protocol", + "Custom Cryptographic Protocol", + "Multilayer Encryption" . + +d3f:T1597 a owl:Class ; + rdfs:label "Search Closed Sources" ; + d3f:attack-id "T1597" ; + d3f:definition "Adversaries may search and gather information about victims from closed sources that can be used during targeting. Information about victims may be available for purchase from reputable private sources and databases, such as paid subscriptions to feeds of technical/threat intelligence data.(Citation: D3Secutrity CTI Feeds) Adversaries may also purchase information from less-reputable sources such as dark web or cybercrime blackmarkets.(Citation: ZDNET Selling Data)" ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:T1600 a owl:Class ; + rdfs:label "Weaken Encryption" ; + d3f:attack-id "T1600" ; + d3f:definition "Adversaries may compromise a network device’s encryption capability in order to bypass encryption that would otherwise protect data communications. (Citation: Cisco Synful Knock Evolution)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1601 a owl:Class ; + rdfs:label "Modify System Image" ; + d3f:attack-id "T1601" ; + d3f:definition "Adversaries may make changes to the operating system of embedded network devices to weaken defenses and provide new capabilities for themselves. On such devices, the operating systems are typically monolithic and most of the device functionality and capabilities are contained within a single file." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1602 a owl:Class ; + rdfs:label "Data from Configuration Repository" ; + d3f:attack-id "T1602" ; + d3f:definition "Adversaries may collect data related to managed devices from configuration repositories. Configuration repositories are used by management systems in order to configure, manage, and control data on remote systems. Configuration repositories may also facilitate remote access and administration of devices." ; + rdfs:subClassOf d3f:CollectionTechnique . + +d3f:T1606 a owl:Class ; + rdfs:label "Forge Web Credentials" ; + d3f:attack-id "T1606" ; + d3f:definition "Adversaries may forge credential materials that can be used to gain access to web applications or Internet services. Web applications and services (hosted in cloud SaaS environments or on-premise servers) often use session cookies, tokens, or other materials to authenticate and authorize user access." ; + rdfs:subClassOf d3f:CredentialAccessTechnique . + +d3f:TA0001 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Initial Access" ; + d3f:display-order 1 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0002 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Execution" ; + d3f:display-order 2 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0003 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Persistence" ; + d3f:display-order 3 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0006 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Access" ; + d3f:display-order 6 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0007 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Discovery" ; + d3f:display-order 7 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0008 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Lateral Movement" ; + d3f:display-order 8 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0009 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Collection" ; + d3f:display-order 9 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0010 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration" ; + d3f:display-order 11 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0011 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Command And Control" ; + d3f:display-order 10 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0040 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Impact" ; + d3f:display-order 12 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0042 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Resource Development" ; + d3f:display-order 0 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0043 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Reconnaissance" ; + d3f:display-order -1 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TFTPNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "TFTP Network Traffic" ; + d3f:definition "TFTP Network Traffic is network traffic typically used to automatically transfer configuration or boot files between machines." ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:TerminateProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Terminate Process" ; + d3f:definition "On many computer operating systems, a computer process terminates its execution by making an exit system call. More generally, an exit in a multithreading environment means that a thread of execution has stopped running. For resource management, the operating system reclaims resources (memory, files, etc.) that were used by the process. The process is said to be a dead process after it terminates." ; + d3f:terminates d3f:Process ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:terminates ; + owl:someValuesFrom d3f:Process ], + d3f:SystemCall . + +d3f:TestExecutionTool a owl:Class ; + rdfs:label "Test Execution Tool" ; + d3f:definition "A test execution tool is a type of software used to test software, hardware or complete systems. Synonyms of test execution tool include test execution engine, test executive, test manager, test sequencer. Two common forms in which a test execution engine may appear are as a: (a) module of a test software suite (test bench) or an integrated development environment, or (b) stand-alone application software." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DeveloperApplication ; + skos:altLabel "Test Execution Engine", + "Test Executive", + "Test Manager" . + +d3f:Token-basedAuthentication a d3f:Token-basedAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Token-based Authentication" ; + d3f:d3fend-id "D3-TBA" ; + d3f:definition "Token-based authentication is an authentication protocol where users verify their identity in exchange for a unique access token. Users can then access the website, application, or resource for the life of the token without having to re-enter their credentials." ; + d3f:kb-article """## How it works + +Token-based authentication starts with a user logging into a system, device or application, typically using a password or a security question. An authorization server validates that initial authentication and then issues an access token, which is a small piece of data that lets a client application make a secure call or signal to an API server. Once this initial token-based authentication protocol is completed, the token works like a stamped ticket: The user can continue to seamlessly access the relevant resources, without re-authenticating, for the duration of the token lifecycle. That lifecycle ends when the user logs out or quits an app — and can also be triggered by a set time-out protocol. + +## Considerations: + +While token-based authentication is undoubtedly a major step above traditional password-based authentication, the token is still considered a “bearer token” — that is, access is granted to whomever holds the token.""" ; + d3f:kb-reference d3f:Reference-Entrust-What-Is-Token-Based-Authentication ; + d3f:uses d3f:AccessToken ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:AccessToken ], + d3f:AgentAuthentication . + +d3f:TokenBinding a d3f:TokenBinding, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Token Binding" ; + d3f:d3fend-id "D3-TB" ; + d3f:definition "Token binding is a security mechanism used to enhance the protection of tokens, such as cookies or OAuth tokens, by binding them to a specific connection." ; + d3f:kb-article d3f:Reference-RFC8471TheTokenBindingProtocolVersion1.0, + """## How it works + +When issuing a security token to a client that supports Token Binding, a server includes the client's Token Binding ID (or its cryptographic hash) in the token. Later on, when a client presents a security token containing a Token Binding ID, the server verifies that the ID in the token matches the ID of the Token Binding established with the client. In the case of a mismatch, the server rejects the token. + +## Considerations + +- While industry participation in the standards process is widespread, browser support remains limited. +- In practice, token-binding implementations are tied to Transport Security Layer (TLS).""" ; + d3f:strengthens d3f:AccessToken ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:strengthens ; + owl:someValuesFrom d3f:AccessToken ], + d3f:CredentialHardening . + +d3f:TraceProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Trace Process" ; + d3f:definition "A trace system call provides a means by which one process (the \"tracer\") may observe and control the execution of another process (the \"tracee\"), and examine and change the tracee's memory and registers. It is primarily used to implement breakpoint debugging and system call tracing." ; + d3f:monitors d3f:Process ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:Process ], + d3f:SystemCall ; + skos:altLabel "Open Process" . + +d3f:TraceThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Trace Thread" ; + rdfs:subClassOf d3f:SystemCall . + +d3f:TransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Transfer Learning" ; + d3f:d3fend-id "D3A-TL" ; + d3f:definition "Transfer learning (TL) is a research problem in machine learning (ML) that focuses on storing knowledge gained while solving one problem and applying it to a different but related problem." ; + d3f:kb-article """## References +Transfer learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Transfer_learning).""" ; + rdfs:seeAlso , + , + ; + rdfs:subClassOf d3f:MachineLearning . + +d3f:TranslationLookasideBuffer a owl:Class, + owl:NamedIndividual ; + rdfs:label "Translation Lookaside Buffer" ; + d3f:definition "A translation lookaside buffer (TLB) is a memory cache that is used to reduce the time taken to access a user memory location. It is a part of the chip's memory-management unit (MMU)." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:MemoryManagementUnitComponent . + +d3f:TransportLayerEvent a owl:Class ; + rdfs:label "Transport Layer Event" ; + d3f:definition "An event occurring at the transport layer, responsible for end-to-end communication and data transfer management." ; + rdfs:subClassOf d3f:NetworkEvent . + +d3f:URLReputationAnalysis a d3f:URLReputationAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "URL Reputation Analysis" ; + d3f:analyzes d3f:URL ; + d3f:d3fend-id "D3-URA" ; + d3f:definition "Analyzing the reputation of a URL." ; + d3f:kb-reference d3f:Reference-Finding_phishing_sites ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:URL ], + d3f:IdentifierReputationAnalysis . + +d3f:UnloadModule a owl:Class, + owl:NamedIndividual ; + rdfs:label "Unload Module" ; + d3f:definition "A system call that unloads a driver or extension from the kernel." ; + d3f:unloads d3f:HardwareDriver, + d3f:KernelModule ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:unloads ; + owl:someValuesFrom d3f:KernelModule ], + [ a owl:Restriction ; + owl:onProperty d3f:unloads ; + owl:someValuesFrom d3f:HardwareDriver ], + d3f:SystemCall . + +d3f:UserInterface a owl:Class ; + rdfs:label "User Interface" ; + d3f:definition "The user interface (UI), in the industrial design field of human-machine interaction, is the space where interactions between humans and machines occur. The goal of this interaction is to allow effective operation and control of the machine from the human end, whilst the machine simultaneously feeds back information that aids the operators' decision-making process. Examples of this broad concept of user interfaces include the interactive aspects of computer operating systems, hand tools, heavy machinery operator controls, and process controls. The design considerations applicable when creating user interfaces are related to or involve such disciplines as ergonomics and psychology." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "UI" . + +d3f:VariableInitialization a owl:Class, + owl:NamedIndividual ; + rdfs:label "Variable Initialization" ; + d3f:d3fend-id "D3-VI" ; + d3f:definition "Setting variables to a known value before use." ; + d3f:hardens d3f:Subroutine ; + d3f:kb-article """## How it Works +Initializing variables upon declaration ensures that the variable has a known quantity before use. + +## Considerations +* Default behavior when declaring variables varies by language. +* This is particularly important in programming languages that do not initialize variables to a default value upon declaration. In these instances, the value that a variable will contain after declaration is indeterminate which can cause issues. In fact, that value could be different each time the program is ran. +* Note: This resource should not be considered a definitive or exhaustive coding guideline.""" ; + d3f:kb-reference d3f:Reference-CManualIntegerInitialization_GNU, + d3f:Reference-VariableInitialization_CWE ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:Subroutine ], + d3f:SourceCodeHardening . + +d3f:VolumeBootRecord a owl:Class, + owl:NamedIndividual ; + rdfs:label "Volume Boot Record" ; + d3f:definition "A volume boot record (VBR) (also known as a volume boot sector, a partition boot record or a partition boot sector) is a type of boot sector introduced by the IBM Personal Computer. It may be found on a partitioned data storage device, such as a hard disk, or an unpartitioned device, such as a floppy disk, and contains machine code for bootstrapping programs (usually, but not necessarily, operating systems) stored in other parts of the device. On non-partitioned storage devices, it is the first sector of the device. On partitioned devices, it is the first sector of an individual partition on the device, with the first sector of the entire device being a Master Boot Record (MBR) containing the partition table." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:BootRecord . + +d3f:WebResource a owl:Class ; + rdfs:label "Web Resource" ; + d3f:definition "A web resource is a resource identified by a Uniform Resource Identifier (URI) and made available from one host to another host via a web protocol and across a network or networks." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:NetworkResource . + +d3f:WebResourceAccess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Resource Access" ; + d3f:definition "Ephemeral digital artifact comprising a request of a network resource and any response from that network resource using a standard web protocol." ; + rdfs:subClassOf d3f:NetworkResourceAccess . + +d3f:WebScriptFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Script File" ; + d3f:definition "A file containing a script in a web-scripting programming language. Web scripts may be present and run on the client or on the server side." ; + rdfs:subClassOf d3f:ExecutableScript ; + skos:altLabel "Web Script" . + +d3f:WebServerApplication a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Server Application" ; + d3f:definition "A web server application (or web app) is an application software that runs on a web server, unlike computer-based software programs that are stored locally on the Operating System (OS) of the device. Web applications are accessed by the user through a web browser with an active internet connection. These applications are programmed using a client-server modeled structure-the user (\"client\") is provided services through an off-site server that is hosted by a third-party. Examples of commonly-used, web applications, include: web-mail, online retail sales, online banking, and online auctions." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ServiceApplication ; + skos:altLabel "Web App", + "Web Application" . + +d3f:WindowsNTGetThreadContext a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtGetThreadContext" ; + rdfs:subClassOf d3f:OSAPIGetThreadContext . + +d3f:WindowsNtCreateFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtCreateFile" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPICreateFile . + +d3f:WindowsNtCreateMailslotFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtCreateMailslotFile" ; + d3f:definition "Creates a special File Object called Mailslot." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPICreateFile . + +d3f:WindowsNtCreateNamedPipeFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtCreateNamedPipeFile" ; + d3f:definition "Creates Named Pipe File Object." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPICreateFile . + +d3f:WindowsNtCreatePagingFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtCreatePagingFile" ; + d3f:definition "Typically used by Control Panel's \"System\" applet for creating new paged files." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPICreateFile . + +d3f:WindowsNtCreateProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtCreateProcess" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPICreateProcess . + +d3f:WindowsNtCreateProcessEx a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtCreateProcessEx" ; + rdfs:subClassOf d3f:OSAPICreateProcess . + +d3f:WindowsNtCreateThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtCreateThread" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPICreateThread . + +d3f:WindowsNtDeleteFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtDeleteFile" ; + d3f:definition "Deletes the specified file." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIDeleteFile . + +d3f:WindowsNtDuplicateToken a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtDuplicateToken" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPICopyToken . + +d3f:WindowsNtFlushInstructionCache a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtFlushInstructionCache" ; + rdfs:subClassOf d3f:OSAPIWriteMemory . + +d3f:WindowsNtFreeVirtualMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtFreeVirtualMemory" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIFreeMemory . + +d3f:WindowsNtOpenFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtOpenFile" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIOpenFile . + +d3f:WindowsNtOpenProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtOpenProcess" ; + d3f:definition "Opens a handle to process obj and sets the access rights to this object." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPITraceProcess . + +d3f:WindowsNtOpenThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtOpenThread" ; + d3f:definition "Opens a handle to a thread object with the access specified." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPITraceThread . + +d3f:WindowsNtQuerySystemTime a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtQuerySystemTime" ; + d3f:definition "Returns current time in Coordinated Universal Time (UTC) 8-bytes format." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIGetSystemTime . + +d3f:WindowsNtReadFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtReadFile" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIReadFile . + +d3f:WindowsNtReadFileScatter a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtReadFileScatter" ; + d3f:definition "Reads specified block from file into multiple buffers. Each buffer must have one page length." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIReadFile . + +d3f:WindowsNtResumeThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtResumeThread" ; + rdfs:subClassOf d3f:OSAPIResumeThread . + +d3f:WindowsNtSetThreadContext a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtSetThreadContext" ; + rdfs:subClassOf d3f:OSAPISetThreadContext . + +d3f:WindowsNtSuspendThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtSuspendThread" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPISuspendThread . + +d3f:WindowsNtTerminateProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtTerminateProcess" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPITerminateProcess . + +d3f:WindowsNtWriteFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtWriteFile" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIWriteFile . + +d3f:WindowsNtWriteFileGather a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtWriteFileGather" ; + d3f:definition "Writes specified block of file with data from memory pages." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIWriteFile . + +d3f:WindowsNtWriteVirtualMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtWriteVirtualMemory" ; + rdfs:subClassOf d3f:OSAPIWriteMemory . + +d3f:WindowsRegistryEvent a owl:Class ; + rdfs:label "Windows Registry Event" ; + d3f:definition "Events involving interactions with the Windows Registry, including keys, values, and associated security configurations." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:WindowsRegistry ], + d3f:DigitalEvent . + +d3f:WindowsShortcutFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows Shortcut File" ; + d3f:definition "A Microsoft Windows shortcut file." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:ShortcutFile ; + skos:altLabel "Shell Link" . + +d3f:WriteFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Write File" ; + d3f:definition "The write is one of the most basic routines provided by a Unix-like operating system kernel. It writes data from a buffer declared by the user to a given device, such as a file. This is the primary way to output data from a program by directly using a system call. The destination is identified by a numeric code. The data to be written, for instance a piece of text, is defined by a pointer and a size, given in number of bytes. write thus takes three arguments." ; + d3f:modifies d3f:File ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:File ], + d3f:SystemCall . + +d3f:WriteMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Write Memory" ; + d3f:modifies d3f:MemoryBlock ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:MemoryBlock ], + d3f:SystemCall . + +d3f:controls a owl:ObjectProperty ; + rdfs:label "controls" ; + d3f:definition "x controls y: x directs or regulates y's operational state, behavior, or function." ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:d3fend-artifact-data-property a owl:DatatypeProperty ; + rdfs:label "d3fend-artifact-data-property" ; + d3f:definition "x d3fend-artifact-data-property y: The artifact x has the data property y." ; + rdfs:domain d3f:DigitalArtifact ; + rdfs:subPropertyOf d3f:d3fend-data-property . + +d3f:detects a owl:ObjectProperty ; + rdfs:label "detects" ; + rdfs:subPropertyOf d3f:counters, + d3f:d3fend-tactical-verb-property . + +d3f:drives a owl:ObjectProperty ; + rdfs:label "drives" ; + d3f:definition "x drives y: The device driver x causes a system component y to function by controlling it." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:enabled-by a owl:ObjectProperty ; + rdfs:label "enabled-by" ; + d3f:definition "x enabled-by y: A top level technique y enables a tactic x, that is, the property indicates that a technique y is used to put a particular tactic x into action. In other words, y renders x capable or able for some task. Inverse of enables." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:enables . + +d3f:has-dependent a owl:ObjectProperty ; + rdfs:label "has-dependent" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:identified-by a owl:ObjectProperty ; + rdfs:label "identified-by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:identifies . + +d3f:injects a owl:ObjectProperty ; + rdfs:label "injects" ; + d3f:definition "x injects y: The subject x takes the action of exploiting a security flaw by introducing (injecting) y, which is code or data that will change the course of execution or state of a computing process to an alternate course or state. Typically code injection is associated with adversaries intending the alternate course to facilitate a malevolent purpose; however, code injection can be unintentional or the intentions behind it may be good or benign." ; + rdfs:seeAlso , + ; + rdfs:subPropertyOf d3f:executes . + +d3f:kb-reference-of a owl:ObjectProperty ; + rdfs:label "kb-reference-of" ; + d3f:definition "x kb-is-example-of y: The reference x is an example of technique y." ; + rdfs:range d3f:CyberTechnique ; + rdfs:subPropertyOf d3f:d3fend-kb-object-property ; + skos:altLabel "kb-is-example-of" . + +d3f:may-be-accessed-by a owl:ObjectProperty ; + rdfs:label "may-be-accessed-by" ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:may-be-tactically-associated-with a owl:ObjectProperty ; + rdfs:label "may-be-tactically-associated-with" ; + d3f:definition "x may-be-tactically-associated-with y: the defensive action x may be a tactic that counters offensive action y." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:may-counter a owl:ObjectProperty ; + rdfs:label "may-counter" ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:may-have-weakness a owl:ObjectProperty ; + rdfs:label "may-have-weakness" ; + rdfs:domain d3f:Artifact ; + rdfs:range d3f:Weakness ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:may-interpret a owl:ObjectProperty ; + rdfs:label "may-interpret" ; + d3f:definition "x may-interpret y: They entity x may interpret the thing y; that is, 'x interprets y' may be true." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:may-map a owl:ObjectProperty ; + rdfs:label "may-map" ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:may-run a owl:ObjectProperty ; + rdfs:label "may-run" ; + d3f:definition "x may-run y: They entity x may run the thing y; that is, 'x runs y' may be true." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:mediates-access-to a owl:ObjectProperty ; + rdfs:label "mediates-access-to" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:modified-by a owl:ObjectProperty ; + rdfs:label "modified-by" ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-be-modified-by ; + owl:inverseOf d3f:modifies . + +d3f:obfuscates a owl:ObjectProperty ; + rdfs:label "obfuscates" ; + d3f:definition "x obfuscates y: The technique x makes the digital artifact y unclear or obscure. Typically obfuscation is a way to hide a digital artifact from discovery, use, or both." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:evicts, + d3f:modifies . + +d3f:originates-from a owl:ObjectProperty ; + rdfs:label "originates-from" ; + d3f:definition "x originates-from y: The digital event or artifact x began its network transit from a physical location y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:preceded-by a owl:ObjectProperty ; + rdfs:label "preceded-by" ; + d3f:definition "x preceded-by y: The event or action x occurs after event or action y in time." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:precedes . + +d3f:precedes a owl:ObjectProperty ; + rdfs:label "precedes" ; + d3f:definition "x precedes y: The event or action x occurs before event or action y in time." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:restricted-by a owl:ObjectProperty ; + rdfs:label "restricted-by" ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:restricts . + +d3f:resumes a owl:ObjectProperty ; + rdfs:label "resumes" ; + d3f:definition "The agent or technique x continues a previous action on entity y. Usually occurs after suspension on y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:unloads a owl:ObjectProperty ; + rdfs:label "unloads" ; + d3f:definition "x unloads y: The technique or artifact performs the action of unloading some artifact (applications, kernel modules, or hardware drivers, etc.) from a computer's memory." ; + rdfs:subPropertyOf d3f:evicts . + +d3f:used-by a owl:ObjectProperty ; + rdfs:label "used-by" ; + d3f:definition "x used-by y: is inverse of y uses x." ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:uses . + +d3f:windows-registry-data-property a owl:DatatypeProperty ; + rdfs:label "windows-registry-data-property" ; + d3f:definition "x windows-registry-data-property y: The windows registry entry x has the property y." ; + rdfs:subPropertyOf d3f:d3fend-artifact-data-property . + +d3f:ANN-basedClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "ANN-based Clustering" ; + d3f:d3fend-id "D3A-ABC" ; + d3f:definition "Combines the principles of Artificial Neural Networks (ANN) and clustering methods." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Artificial neural network. [Link](https://en.wikipedia.org/wiki/Artificial_neural_network)""" ; + rdfs:subClassOf d3f:ClusterAnalysis . + +d3f:AccessControlGroup a owl:Class, + owl:NamedIndividual ; + rdfs:label "Access Control Group" ; + d3f:definition "A collection of objects that can have access controls placed on them." ; + d3f:restricted-by d3f:AccessControlList ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restricted-by ; + owl:someValuesFrom d3f:AccessControlList ], + d3f:AccessControlConfiguration . + +d3f:Action a owl:Class, + owl:NamedIndividual ; + rdfs:label "Action" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-agent ; + owl:someValuesFrom d3f:Agent ], + d3f:Event . + +d3f:AnalyticTechnique a owl:Class ; + rdfs:label "Analytic Technique" ; + d3f:definition "A process in which a computer examines information using mathematical methods in order to find useful patterns." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Technique . + +d3f:ApplicationProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Process" ; + d3f:definition "An application process is an instance of an application computer program that is being executed." ; + d3f:runs d3f:Application ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:runs ; + owl:someValuesFrom d3f:Application ], + d3f:UserProcess . + +d3f:AuthenticationEvent a owl:Class ; + rdfs:label "Authentication Event" ; + d3f:definition "An event capturing the systematic process of verifying an agent's identity within a system, involving credential validation and identity confirmation." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Credential ], + [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Agent ], + [ a owl:Restriction ; + owl:onProperty d3f:caused-by ; + owl:someValuesFrom d3f:Authentication ], + d3f:DigitalEvent ; + skos:altLabel "Agent Authentication Event" . + +d3f:ByteSequenceEmulation a d3f:ByteSequenceEmulation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Byte Sequence Emulation" ; + d3f:d3fend-id "D3-BSE" ; + d3f:definition "Analyzing sequences of bytes and determining if they likely represent malicious shellcode." ; + d3f:kb-article """## How it works + +Bytes are analyzed as if they are machine code instructions, and such instructions that are a common component of known shellcode are noted, such as stack pivots, reads from a Memory Address Table, and system calls for functions that disable protections or execute code. For example, the x86 instruction `b0 0b: mov $11, %ax`, with no further alterations to the `%ax` register, followed by `cd 80: syscall` executes the system call `execve()` in the Linux kernel, which replaces the current process with another one specified -- this is a common action in shellcode, so this sequence would be flagged. + +This technique detects shellcode despite whether or not it would cause a buffer overflow in the target binary. + +If the sequence of bytes contains a sequence similar to that used in malicious shellcode, the entire byte sequence is flagged and a follow-on technique may be invoked. + +## Considerations + +### False Negatives +If the shellcode instructions are far apart, simple implementations might not detect the shellcode. + +Due to the nature of assembly instructions not having a defined start or end, implementations which do not process all start sequences (for example, when they a find byte sequence of interest, continue scanning forwards from the end of it) might not detect the shellcode. + +This technique might not detect more complex or obfuscated instructions. For that purpose, Dynamic Analysis or Emulated File Analysis could assist by analyzing the actual instruction function. + +This technique may not detect self-modifying code. To make it harder for a process to modify itself, Process Segment Execution Prevention should be used, while noting its considerations. + +This technique might not detect malicious shellcode which reuses instructions in the target binary for malicious effect, as memory references in the presumed assembly code are not dereferenced. Dynamic Analysis and Emulated File Analysis, when set up properly to fork from the running target binary, might detect this. Process Segment Execution Prevention combined with Segment Address Offset Randomization frequently makes introduction of shellcode through overwriting a saved return pointer more difficult. Call stack depth analysis might detect excessive reuse of instructions in the target binary. Shadow Stack Frames might detect that a stack frame's return address has changed and Stack Frame Canary Verification might detect that the stack frame's return address was overwritten. Other heuristic methods might detect jump-oriented programming shellcode. + +With inserting code directly, that it is not a buffer overflow, and just some place where code is executed either to a file or a write-what-where, the buffer overflow mitigations do not help. Behavioral analysis could detect this, or proper access control could mitigate this. + +### False Positives + +Byte sequences containing code that is never used as machine code are still analyzed and flagged for anomalies, and [eventually](http://mathforum.org/library/drmath/view/55871.html), it is likely that an attack sequence will arise from the sheer volume of bytes transmitted.""" ; + d3f:kb-reference d3f:Reference-Network-BasedBufferOverflowDetectionByExploitCodeAnalysis_InformationSecurityResearchCentre, + d3f:Reference-Network-levelPolymorphicShellcodeDetectionUsingEmulation ; + d3f:synonym "Shellcode Transmission Detection" ; + rdfs:subClassOf d3f:NetworkTrafficAnalysis . + +d3f:CWE-116 a owl:Class ; + rdfs:label "Improper Encoding or Escaping of Output" ; + d3f:cwe-id "CWE-116" ; + rdfs:subClassOf d3f:CWE-707 . + +d3f:CWE-1391 a owl:Class ; + rdfs:label "Use of Weak Credentials" ; + d3f:cwe-id "CWE-1391" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-159 a owl:Class ; + rdfs:label "Improper Handling of Invalid Use of Special Elements" ; + d3f:cwe-id "CWE-159" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-209 a owl:Class ; + rdfs:label "Generation of Error Message Containing Sensitive Information" ; + d3f:cwe-id "CWE-209" ; + rdfs:subClassOf d3f:CWE-200, + d3f:CWE-755 . + +d3f:CWE-211 a owl:Class ; + rdfs:label "Externally-Generated Error Message Containing Sensitive Information" ; + d3f:cwe-id "CWE-211" ; + rdfs:subClassOf d3f:CWE-209 . + +d3f:CWE-229 a owl:Class ; + rdfs:label "Improper Handling of Values" ; + d3f:cwe-id "CWE-229" ; + rdfs:subClassOf d3f:CWE-228 . + +d3f:CWE-233 a owl:Class ; + rdfs:label "Improper Handling of Parameters" ; + d3f:cwe-id "CWE-233" ; + rdfs:subClassOf d3f:CWE-228 . + +d3f:CWE-237 a owl:Class ; + rdfs:label "Improper Handling of Structural Elements" ; + d3f:cwe-id "CWE-237" ; + rdfs:subClassOf d3f:CWE-228 . + +d3f:CWE-260 a owl:Class ; + rdfs:label "Password in Configuration File" ; + d3f:cwe-id "CWE-260" ; + rdfs:subClassOf d3f:CWE-522 . + +d3f:CWE-290 a owl:Class ; + rdfs:label "Authentication Bypass by Spoofing" ; + d3f:cwe-id "CWE-290" ; + rdfs:subClassOf d3f:CWE-1390 . + +d3f:CWE-335 a owl:Class ; + rdfs:label "Incorrect Usage of Seeds in Pseudo-Random Number Generator (PRNG)" ; + d3f:cwe-id "CWE-335" ; + rdfs:subClassOf d3f:CWE-330 . + +d3f:CWE-340 a owl:Class ; + rdfs:label "Generation of Predictable Numbers or Identifiers" ; + d3f:cwe-id "CWE-340" ; + rdfs:subClassOf d3f:CWE-330 . + +d3f:CWE-344 a owl:Class ; + rdfs:label "Use of Invariant Value in Dynamically Changing Context" ; + d3f:cwe-id "CWE-344" ; + rdfs:subClassOf d3f:CWE-330 . + +d3f:CWE-364 a owl:Class ; + rdfs:label "Signal Handler Race Condition" ; + d3f:cwe-id "CWE-364" ; + rdfs:subClassOf d3f:CWE-362 . + +d3f:CWE-420 a owl:Class ; + rdfs:label "Unprotected Alternate Channel" ; + d3f:cwe-id "CWE-420" ; + rdfs:subClassOf d3f:CWE-923 . + +d3f:CWE-446 a owl:Class ; + rdfs:label "UI Discrepancy for Security Feature" ; + d3f:cwe-id "CWE-446" ; + rdfs:subClassOf d3f:CWE-684 . + +d3f:CWE-459 a owl:Class ; + rdfs:label "Incomplete Cleanup" ; + d3f:cwe-id "CWE-459" ; + rdfs:subClassOf d3f:CWE-404 . + +d3f:CWE-480 a owl:Class ; + rdfs:label "Use of Incorrect Operator" ; + d3f:cwe-id "CWE-480" ; + rdfs:subClassOf d3f:CWE-670 . + +d3f:CWE-538 a owl:Class ; + rdfs:label "Insertion of Sensitive Information into Externally-Accessible File or Directory" ; + d3f:cwe-id "CWE-538" ; + rdfs:subClassOf d3f:CWE-200 . + +d3f:CWE-540 a owl:Class ; + rdfs:label "Inclusion of Sensitive Information in Source Code" ; + d3f:cwe-id "CWE-540" ; + rdfs:subClassOf d3f:CWE-538 . + +d3f:CWE-66 a owl:Class ; + rdfs:label "Improper Handling of File Names that Identify Virtual Resources" ; + d3f:cwe-id "CWE-66" ; + rdfs:subClassOf d3f:CWE-706 . + +d3f:CWE-770 a owl:Class ; + rdfs:label "Allocation of Resources Without Limits or Throttling" ; + d3f:cwe-id "CWE-770" ; + rdfs:subClassOf d3f:CWE-400, + d3f:CWE-665 . + +d3f:CWE-772 a owl:Class ; + rdfs:label "Missing Release of Resource after Effective Lifetime" ; + d3f:cwe-id "CWE-772" ; + rdfs:subClassOf d3f:CWE-404 . + +d3f:CWE-788 a owl:Class ; + rdfs:label "Access of Memory Location After End of Buffer" ; + d3f:cwe-id "CWE-788" ; + rdfs:subClassOf d3f:CWE-119 . + +d3f:CWE-798 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Use of Hard-coded Credentials" ; + d3f:cwe-id "CWE-798" ; + d3f:weakness-of d3f:AuthenticationFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:AuthenticationFunction ], + d3f:CWE-1391, + d3f:CWE-344, + d3f:CWE-671 . + +d3f:CWE-807 a owl:Class ; + rdfs:label "Reliance on Untrusted Inputs in a Security Decision" ; + d3f:cwe-id "CWE-807" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-820 a owl:Class ; + rdfs:label "Missing Synchronization" ; + d3f:cwe-id "CWE-820" ; + rdfs:subClassOf d3f:CWE-662 . + +d3f:CWE-829 a owl:Class ; + rdfs:label "Inclusion of Functionality from Untrusted Control Sphere" ; + d3f:cwe-id "CWE-829" ; + rdfs:subClassOf d3f:CWE-669 . + +d3f:CWE-834 a owl:Class ; + rdfs:label "Excessive Iteration" ; + d3f:cwe-id "CWE-834" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-94 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Control of Generation of Code ('Code Injection')" ; + d3f:cwe-id "CWE-94" ; + d3f:may-be-weakness-of d3f:EvalFunction, + d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-be-weakness-of ; + owl:someValuesFrom d3f:EvalFunction ], + [ a owl:Restriction ; + owl:onProperty d3f:may-be-weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-74, + d3f:CWE-913 . + +d3f:CWE-99 a owl:Class ; + rdfs:label "Improper Control of Resource Identifiers ('Resource Injection')" ; + d3f:cwe-id "CWE-99" ; + rdfs:subClassOf d3f:CWE-74 . + +d3f:CertificateAnalysis a d3f:CertificateAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Certificate Analysis" ; + d3f:analyzes d3f:CertificateFile ; + d3f:d3fend-id "D3-CA" ; + d3f:definition "Analyzing Public Key Infrastructure certificates to detect if they have been misconfigured or spoofed using both network traffic, certificate fields and third-party logs." ; + d3f:kb-article """## How it works +Certificate Analysis ensures that the data elements of the certificate are current and anchored in a known trust model. Certificate authorities, revocation lists, and third-party secure logs are used in the analysis. Analysis includes detection of server impersonation, phishing domains, and forged certificates. + +TLS certificates are designed to expire to ensure that the cryptographic keys are forced to be changed on a regular basis. The certificates in the trust path also expire and can cause a break in the trust chain. This means that even if a server certificate is updated correctly, intermediate certificates can expire and the trust chain is not maintained. This can cause services to become unavailable.""" ; + d3f:kb-reference d3f:Reference-SecuringWebTransactions ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:CertificateFile ], + d3f:NetworkTrafficAnalysis . + +d3f:Classifying a owl:Class ; + rdfs:label "Classifying" ; + rdfs:subClassOf d3f:AnalyticalPurpose . + +d3f:ClientComputer a owl:Class ; + rdfs:label "Client Computer" ; + d3f:definition "A client computer is a host that accesses a service made available by a server. The server is often (but not always) on another computer system, in which case the client accesses the service by way of a network." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Host . + +d3f:CloudStorage a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Storage" ; + d3f:definition "Cloud storage is storage held within a computing cloud." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:SecondaryStorage . + +d3f:CodeAnalyzer a owl:Class, + owl:NamedIndividual ; + rdfs:label "Code Analyzer" ; + d3f:definition "Code analyzers automatically analyze the composition or behavior of computer programs regarding a property such as correctness, robustness, security, and safety. Program analysis can be performed without executing the program (static program analysis), during runtime (dynamic program analysis) or in a combination of both." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DeveloperApplication ; + skos:altLabel "Program Analysis Tool" . + +d3f:CollaborativeSoftware a owl:Class ; + rdfs:label "Collaborative Software" ; + d3f:definition "Collaborative software or groupware is application software designed to help people working on a common task to attain their goals. One of the earliest definitions of groupware is \"intentional group processes plus software to support them\". Collaborative software is a broad concept that overlaps considerably with computer-supported cooperative work (CSCW). According to Carstensen and Schmidt (1999) groupware is part of CSCW. The authors claim that CSCW, and thereby groupware, addresses \"how collaborative activities and their coordination can be supported by means of computer systems.\"" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:UserApplication . + +d3f:ComputingImage a owl:Class ; + rdfs:label "Computing Image" ; + d3f:definition "A computing image captures the full state or contents of a computing entity, such as a process or volume." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:ControlCatalog a owl:Class ; + rdfs:label "Control Catalog" ; + d3f:definition "A control catalog is a complete list of protective measures for systems, organizations, or individuals for subject domains (e.g., security and privacy.)" ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:version ; + owl:someValuesFrom [ a rdfs:Datatype ; + owl:unionOf ( xsd:integer xsd:string ) ] ], + [ a owl:Restriction ; + owl:onProperty d3f:has-member ; + owl:someValuesFrom d3f:ExternalControl ], + d3f:ExternalControlThing . + +d3f:CredentialCompromiseScopeAnalysis a d3f:CredentialCompromiseScopeAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Compromise Scope Analysis" ; + d3f:analyzes d3f:Credential ; + d3f:d3fend-id "D3-CCSA" ; + d3f:definition "Determining which credentials may have been compromised by analyzing the user logon history of a particular system." ; + d3f:kb-article """## How it works + +#### Memory +Credentials may be stored in memory for a variety of reasons; on Windows, they may be stored in lsass.exe. Once a credential dumper like mimikatz runs and dumps the memory of lsass.exe, the credentials of every account logged on since boot are potentially compromised. +When such an event occurs, this analytic will give the forensic context to identify compromised users. Those users could potentially be used in later events for additional logons. + + +#### Hard disk +Operating System may cache a certain number of credentials onto the hard disk to use as a source of truth if it cannot contact the credential server. In many versions of Microsoft Windows, the 10 most recent are cached by default; this setting can be changed in the Microsoft Management Console's Local Security Policy: ```Computer Configuration -> Windows Settings -> Local Policy -> Security Options -> Interactive Logon: Number of previous logons to cache -> 0``` Here we are not concerned with the alteration of the credentials but the fact that they might be read. If the attacker has physical access to the machine they are unlikely to be stopped from reading files on the filesystem. +"In the event that the domain controller is unavailable Windows will check the last password hashes that has been cached in order to authenticate the user with the system. These password hashes are cached in the following registry setting: +HKEY_LOCAL_MACHINE\\SECURITY\\Cache +Mimikatz can retrieve these hashes if the following command is executed: +lsadump::cache" [1] + +The Registry Hive, HKEY_LOCAL_MACHINE\\SAM, which is stored in the supporting files %systemroot%\\System32\\Config\\{Sam,sam.log,sam.sav}, contains the SAM file. + +DC: This is stored in %systemroot%\\ntds\\ntds.dit. (https://www.ultimatewindowssecurity.com/blog/default.aspx?d=10/2017) + +Sometimes memory, which contains credentials, could get on the hard disk. Like with hiberfil.sys in Windows. Equivalent on Linux + + +In Linux, an attacker could read the /etc/shadow file. + +Reading from /proc directory: mimipenguin, many others. + +## Considerations +Effective implementation requires identifying any location that could end up containing credentials, and detecting an method of potential access to a source of credential data. + +1. https://medium.com/blue-team/preventing-mimikatz-attacks-ed283e7ebdd5""" ; + d3f:kb-reference d3f:Reference-AllLoginsSinceLastBoot_MITRE, + d3f:Reference-SystemsAndMethodsForDetectingCredentialTheft_SymantecCorp ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Credential ], + d3f:UserBehaviorAnalysis . + +d3f:CyberTechnique a owl:Class ; + rdfs:label "Cyber Technique" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:implemented-by ; + owl:someValuesFrom d3f:Procedure ], + d3f:Technique . + +d3f:DHCPNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "DHCP Network Traffic" ; + d3f:definition "DHCP Network Traffic is network traffic related to the DHCP protocol, used by network nodes to negotiate and configure either IPv4 or IPv6 addresses." ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:DNSAllowlisting a d3f:DNSAllowlisting, + owl:Class, + owl:NamedIndividual ; + rdfs:label "DNS Allowlisting" ; + d3f:blocks d3f:OutboundInternetDNSLookupTraffic ; + d3f:d3fend-id "D3-DNSAL" ; + d3f:definition "Permitting only approved domains and their subdomains to be resolved." ; + d3f:kb-reference d3f:Reference-DNSWhitelist-DNSWL-EmailAuthenticationMethodExtension ; + d3f:synonym "DNS Whitelisting" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:blocks ; + owl:someValuesFrom d3f:OutboundInternetDNSLookupTraffic ], + d3f:NetworkIsolation . + +d3f:DeadCodeElimination a d3f:DeadCodeElimination, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Dead Code Elimination" ; + d3f:d3fend-id "D3-DCE" ; + d3f:definition "Removing unreachable or \"dead code\" from compiled source code." ; + d3f:kb-article """## How it works + +Dead code is code that is considered unreachable by normal program execution. Dead code can be created by adding code under a condition that never evaluates to true. Dead code should be removed since this type of code can produce unexpected results, if accidentally or maliciously forced to execute. + +Dead code identification is typically performed by algorithms that implement program flows analysis looking for unreachable code. The dead code is eliminated by instructing compilers to remove the code through compiler flags, i.e., '-fdce' is used for Dead Code Elimination. + +## Considerations + +Code can also be deemed unreachable for certain run-time conditions. Different deployed systems and environments may contain some code that is unreachable for the given environment. This technique does not consider run-time conditions for unreachable code.""" ; + d3f:kb-reference d3f:Reference-DeadCodeElimination ; + rdfs:subClassOf d3f:ApplicationHardening . + +d3f:DecoyPersona a d3f:DecoyPersona, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Decoy Persona" ; + d3f:d3fend-id "D3-DP" ; + d3f:definition "Establishing a fake online identity to misdirect, deceive, and or interact with adversaries." ; + d3f:kb-article """## How it works +A false online identity is created for the purposes of interacting with adversaries in a direct or indirect manner. This includes the associated email addresses, social media accounts, and other online communication profiles. + +## Considerations +* Include phone numbers and online social profiles as well as automatically or manually responding to contact made to the persona to improve realism. +* Continuous updating and managing the decoy personas and online activity streams to ensure personas do not become stale and outdated.""" ; + d3f:kb-reference , + d3f:Reference-DecoyPersonasForSafeguardingOnlineIdentityUsingDeception_ ; + d3f:spoofs d3f:User ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:spoofs ; + owl:someValuesFrom d3f:User ], + d3f:DecoyObject . + +d3f:DefensiveAction a owl:Class ; + rdfs:label "Defensive Action" ; + rdfs:subClassOf d3f:CyberAction . + +d3f:DigitalSystem a owl:Class, + owl:NamedIndividual ; + rdfs:label "Digital System" ; + d3f:definition "A digital system is a group of interacting or interrelated digital artifacts that act according to a set of rules to form a unified whole. A digital system, surrounded and influenced by its environment, is described by its boundaries, structure and purpose and expressed in its functioning. Systems are the subjects of study of systems theory." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer, + d3f:System . + +d3f:DimensionReduction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Dimension Reduction" ; + d3f:d3fend-id "D3A-DR" ; + d3f:definition "Dimensionality reduction is a key technique within unsupervised learning. It compresses the data by finding a smaller, different set of variables that capture what matters most in the original features, while minimizing the loss of information." ; + d3f:kb-article """## References +O'Reilly Media. (n.d.). Chapter 7. Machine Learning and Security: Protecting Systems with Data and Algorithms. [Link](https://www.oreilly.com/library/view/machine-learning-and/9781492073048/ch07.html)""" ; + rdfs:subClassOf d3f:UnsupervisedLearning . + +d3f:DirectPhysicalLinkMapping a d3f:DirectPhysicalLinkMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Direct Physical Link Mapping" ; + d3f:d3fend-id "D3-DPLM" ; + d3f:definition "Direct physical link mapping creates a physical link map by direct observation and recording of the physical network links." ; + d3f:kb-article """## How it works + +Direct Physical Link Mapping involves a manual process where a network engineer or administrator physically observes and documents the physical connections within the network infrastructure. + +## Considerations + +* Constructing and maintaining physical topologies for extensive networks can be challenging and time-consuming using manual methods. Therefore, where feasible, automated methods like active physical link mapping should be considered as a partial or complete solution for physical link mapping processes. + +* In scenarios where active physical link mapping is not an option, physical inspection of networks is necessary to accomplish physical link mapping. This is due to the lack of reliable techniques to accurately map physical links solely through passive network traffic monitoring.""" ; + d3f:kb-reference d3f:Reference-NetworkMapping ; + d3f:synonym "Manual Physical Link Mapping" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:PhysicalLinkMapping . + +d3f:DistributionProperties a owl:Class, + owl:NamedIndividual ; + rdfs:label "Distribution Properties" ; + d3f:d3fend-id "D3A-DP" ; + d3f:definition "The properties derived from a probability distribution." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Probability distribution. [Link](https://en.wikipedia.org/wiki/Probability_distribution)""" ; + rdfs:subClassOf d3f:DescriptiveStatistics . + +d3f:DomainNameReputationAnalysis a d3f:DomainNameReputationAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Name Reputation Analysis" ; + d3f:analyzes d3f:DomainName ; + d3f:d3fend-id "D3-DNRA" ; + d3f:definition "Analyzing the reputation of a domain name." ; + d3f:kb-reference d3f:Reference-Database_for_receiving_storing_and_compiling_information_about_email_messages, + d3f:Reference-Finding_phishing_sites ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:DomainName ], + d3f:IdentifierReputationAnalysis . + +d3f:DomainRegistration a owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Registration" ; + d3f:definition "A domain registration, or domain name registration data, is the relevant registration data from Internet resources such as domain names, IP addresses, and autonomous system numbers. Registration data is typically retrieved by means of either the Registration Data Access Protocol (RDAP) or its predecessor, the WHOIS protocol." ; + d3f:may-contain d3f:DomainName ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:DomainName ], + d3f:DigitalInformation ; + skos:altLabel "Domain Name Registration Data" . + +d3f:EmailEvent a owl:Class ; + rdfs:label "Email Event" ; + d3f:definition "An event involving email communication, including sending, receiving, and processing emails. Email events encapsulate activities essential to the transmission and analysis of email messages in a networked environment." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:MailNetworkTraffic ], + d3f:ApplicationLayerEvent, + d3f:TCPEvent . + +d3f:EndpointBasedWebServerAccessMediation a d3f:EndpointBasedWebServerAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Endpoint-based Web Server Access Mediation" ; + d3f:d3fend-id "D3-EBWSAM" ; + d3f:definition "Endpoint-based web server access mediation regulates web server access directly from user endpoints by implementing mechanisms such as client-side certificates and endpoint security software to authenticate devices and ensure compliant access." ; + d3f:kb-article """## How it works + +Endpoint-based Web Server Access Mediation focuses on managing access to web servers directly from user devices. This involves implementing security measures like client certificates or endpoint security software to ensure that only authorized devices can initiate sessions with web servers. Examples include direct access to internal web applications from company laptops. +""" ; + d3f:kb-reference d3f:Reference-NIST-Special-Publication-800-41-Revision-1 ; + rdfs:subClassOf d3f:WebSessionAccessMediation . + +d3f:Event a owl:Class ; + rdfs:label "Event" ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:ExceptionHandlerPointerValidation a d3f:ExceptionHandlerPointerValidation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Exception Handler Pointer Validation" ; + d3f:d3fend-id "D3-EHPV" ; + d3f:definition "Validates that a referenced exception handler pointer is a valid exception handler." ; + d3f:kb-article """## How It Works +When a process encounters an exception, it calls an exception handler to deal with the exception. The method by which this exception handler is determined varies by the operating system. The exception handler is called, even if it is the default exception handler to terminate the program and display a message that the program stopped working. In the case that no valid exception handler is found, the program would fail to proceed as normal and could be programmed to terminate. + +In Windows, the address of the exception registration record is stored at the very start of the the Thread Information Block; the GS register points to this structure. + +The exception registration record contains two pointers: a pointer to the next exception registration record should this handler fail to handle the exception, and a pointer to the handler. + +A buffer overflow can overwrite the saved return pointer with an invalid location to execute memory; this often triggers the exception handler chain, which could also be corrupted by the buffer overflow. Although Process Exception Handler Validation does not make sure that the exception handler pointer or the code at the exception handler was unaltered, or that the exception handler code is secure, this technique does ensure that the pointer is at least an exception handler that could be called by the program. + +With Process Exception Handler Validation, before the handler is called, it checks the exception handler against a source of valid exception handlers. If the requested handler is not in this list, other techniques such as those in Process Eviction might be invoked, such as Process Termination to end the current process, or Executable Blacklisting to blacklist the potentially vulnerable or malfunctioning executable. + +### Runtime valid exception handler source generation +The source of valid exception handlers could be generated at runtime, with the risk of the information that is used to determine the validity of exception handlers being compromised. + +### Compile-time +The source of valid exception handlers could also be generated at compile time or as a binary patch. Given the source code, it would be rather straightforward to find the exceptions, as they are pointed in the catch statement of a try-catch clause and the compiler must already generate the code to call exceptions from this. + +## Considerations +If the program file can be altered by the attacker, then the security could be bypassed by replacing it with any desired program, without even bypassing SEH. + +If the attacker was already able to overwrite the code for a valid exception handler via other functionality in the program, this defense would not prevent arbitrary code execution. +If an exception handler recognized as valid is vulnerable, it would be executed anyway. + +SafeSEH might be applied only to some executable files or modules, allowing an attacker to call any piece of code as an exception handler in the unprotected modules.""" ; + d3f:kb-reference d3f:Reference-SAFESEH_ImageHasSafeExceptionHandlers_MicrosoftDocs ; + d3f:synonym "Exception Handler Validation" ; + d3f:validates d3f:Pointer ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:validates ; + owl:someValuesFrom d3f:Pointer ], + d3f:ApplicationHardening . + +d3f:ExternalControl a owl:Class ; + rdfs:label "External Control" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:semantic-relation ; + owl:someValuesFrom d3f:DefensiveTechnique ], + [ a owl:Restriction ; + owl:onProperty d3f:member-of ; + owl:someValuesFrom d3f:ControlCatalog ], + d3f:ExternalControlThing . + +d3f:ExternalThing a owl:Class ; + rdfs:label "External Thing" . + +d3f:ExternalThreatModelThing a owl:Class ; + rdfs:label "External Threat Model Thing" ; + rdfs:subClassOf d3f:ExternalThing . + +d3f:FileAccessPatternAnalysis a d3f:FileAccessPatternAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Access Pattern Analysis" ; + d3f:analyzes d3f:LocalResourceAccess ; + d3f:d3fend-id "D3-FAPA" ; + d3f:definition "Analyzing the files accessed by a process to identify unauthorized activity." ; + d3f:kb-article """## How it works +File modifying malware such as wipers and ransomware are detected by identifying file access patterns that are associated with a malicious process. Examples of file access patterns include accessing a large number of files, accessing multiple file types, files being accessed located in multiple locations in a directory, and copying a file and encrypting the contents of that file into a copy. + +## Considerations +Certain file access actions may not be statistically different from authorized activity.""" ; + d3f:kb-reference d3f:Reference-File-modifyingMalwareDetection_CrowdstrikeInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:LocalResourceAccess ], + d3f:ProcessAnalysis . + +d3f:FileContentAnalysis a d3f:FileContentAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Content Analysis" ; + d3f:d3fend-id "D3-FCOA" ; + d3f:definition "Employing a pattern matching algorithm to statically analyze the content of files." ; + d3f:kb-article """## How it works +Analyzing a piece of code without it being executed in a sandbox, virtual machine, or simulator. Patterns or signatures in the file can indicate whati kind of software it is, including whether it is malware.""" ; + d3f:kb-reference d3f:Reference-CyberVaccineAndPredictiveMalwareDefensiveMethodsAndSystems ; + rdfs:subClassOf d3f:FileAnalysis . + +d3f:FileHash a owl:Class, + owl:NamedIndividual ; + rdfs:label "File Hash" ; + d3f:identifies d3f:File ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:File ], + d3f:DigitalFingerprint . + +d3f:FileIntegrityMonitoring a d3f:FileIntegrityMonitoring, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Integrity Monitoring" ; + d3f:analyzes d3f:File ; + d3f:d3fend-id "D3-FIM" ; + d3f:definition "Detecting any suspicious changes to files in a computer system." ; + d3f:kb-article """## How it Works +There are a number of tools in Windows and Unix that can monitor specific files in a system and generate alerts if any artifacts have been created, modified, or removed. They accomplish this by comparing the current artifacts to a previous snapshot. + +Unix - Unix systems have a file integrity checker tool called tripwire. Tripwire first initializes a database that serves as a basis for comparison and can then scan the system to compare the state of the current file system against the initial baseline database. Additionally, users can define policies that specify potential violations. + +Windows - In Microsoft Azure, file integrity monitoring can be enabled which can track file and registry key creation, removals, and modifications of specific files. + +## Considerations +Files can change constantly due to the non-static nature of a computer system. File Integrity Monitoring works best when pointed at a narrow scope of critical files to limit the number of unneccessary files that may be modified over the course of normal use. The accuracy and precision of defined policies also affect the efficacy of this technique.""" ; + d3f:kb-reference d3f:Reference-FileIntegrityMonitoringinMicrosoftDefenderforCloud-Microsoft, + d3f:Reference-Tripwire ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:File ], + d3f:PlatformMonitoring . + +d3f:FirmwareBehaviorAnalysis a d3f:FirmwareBehaviorAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Firmware Behavior Analysis" ; + d3f:analyzes d3f:Firmware ; + d3f:d3fend-id "D3-FBA" ; + d3f:definition "Analyzing the behavior of embedded code in firmware and looking for anomalous behavior and suspicious activity." ; + d3f:kb-article """## How it works +Firmware behavior analysis provides protections by ensuring that installed firmware has not been tampered with or modified. Firmware analysis applies to mutable firmware and immutable read-only memory (ROMs). + +Firmware in deployed network devices is typically not analyzed and monitored for vulnerabilities and thus is subject to potential attacks. This technique makes use of known and measured behavioral attributes, including timing attributes, of analyzed firmware on deployed devices. + +A behavioral method that employs known timing measurements may use the timing results from a challenge and response protocol to detect the presence of malware in embedded firmware. Firmware device timing measurements are made, specific to the installed device, and are used in the verifying function. + +The original firmware image is modified by injecting a monitoring software component into the embedded firmware code. The injected software components will allow for a software root of trust, the challenge and response protocol, to be implement in the firmware. + +A challenge-response is issued and includes a nonce so that replays are not allowed. The firmware will calculate a checksum over all of memory, including the nonce, and return the result. The verification system will compare the computed checksum and the time it took for the computation of the checksum to determine if the firmware has been modified. + +## Considerations +* The firmware code will need to be modified to include the behavioral monitoring functionality. +* This technique is sensitive to the device the embedded firmware is hosted on and it is expected that the devices and firmware will need to be profiled and analyzed to determine timing estimation. +* This technique is not expected to be one hundred percent correct as you would expect in a hardware root of trust solution and may require some tuning.""" ; + d3f:kb-reference d3f:Reference-FirmwareBehaviorAnalysisConFirm, + d3f:Reference-FirmwareBehaviorAnalysisVIPER ; + d3f:synonym "Firmware Timing Analysis" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Firmware ], + d3f:PlatformMonitoring . + +d3f:FirmwareEmbeddedMonitoringCode a d3f:FirmwareEmbeddedMonitoringCode, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Firmware Embedded Monitoring Code" ; + d3f:analyzes d3f:Firmware ; + d3f:d3fend-id "D3-FEMC" ; + d3f:definition "Monitoring code is injected into firmware for integrity monitoring of firmware and firmware data." ; + d3f:kb-article """## How it works +Firmware in deployed network devices is typically not monitored for malicious changes. This technique provides a method to embed a software security component into the deployed firmware which provides a near real-time monitoring hook. The exception handling code, in the firmware, is typically used to expose any detected vulnerabilities. + +The injected software components provide a feature similar to intrusion detection systems for the firmware by detecting unauthorized modifications of the embedded firmware. The integrity of static code and firmware data are monitored continuously in the hosted devices. Comparisons are made to monitored elements like firmware memory addresses and data segments. Memory pages are scanned and if a modification is detected the software component may lock the page. This will protect subsequent attempted modifications to the firmware. The software component may utilize the exception handling code and thus be able to disclose the exact address of the modified memory. + +The injected software components are inserted during the firmware imaging process. The injected software is assumed to have knowledge of both the embedded code and the current execution state of the host program. The injected software will monitor and alert, in near real-time, on potential suspicious activity. The injected code is run alongside of the embedded code in the host. The injected software operates as an independent entity and is not dependent on the host software. + +Finally, this technique may implement other countermeasure techniques as part of their analytical processes. These should be identified by referencing other countermeasure techniques directly as necessary. + +## Considerations +* The firmware code will need to be modified and re-hosted on the device. +* Exposing monitoring hooks to the injected code may introduce additional risk.""" ; + d3f:kb-reference d3f:Reference-FirmwareEmbeddedMonitoringCodeRedBalloon, + d3f:Reference-FirmwareEmbeddedMonitoringCodeSymbiotes ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Firmware ], + d3f:PlatformMonitoring . + +d3f:ForwardResolutionDomainDenylisting a d3f:ForwardResolutionDomainDenylisting, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Forward Resolution Domain Denylisting" ; + d3f:blocks d3f:OutboundInternetDNSLookupTraffic ; + d3f:d3fend-id "D3-FRDDL" ; + d3f:definition "Blocking a lookup based on the query's domain name value." ; + d3f:kb-article """## How it works + +Policies are created that filter DNS queries using fully qualified domain name (FQDN) of record in the query. A DNS policy can be created for blocking DNS queries from FQDNs that have been identified as unauthorized. + +## Considerations + +Continuous maintenance of unauthorized domain lists is needed to keep up to date as updates occur.""" ; + d3f:kb-reference d3f:Reference-UseDNSPolicyForApplyingFiltersOnDNSQueries ; + d3f:synonym "Forward Resolution Domain Blacklisting" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:blocks ; + owl:someValuesFrom d3f:OutboundInternetDNSLookupTraffic ], + d3f:DNSDenylisting . + +d3f:Generation a owl:Class ; + rdfs:label "Media Generation" ; + rdfs:subClassOf d3f:AnalyticalPurpose . + +d3f:GenerativeAdversarialNetwork a owl:Class, + owl:NamedIndividual ; + rdfs:label "Generative Adversarial Network" ; + d3f:d3fend-id "D3A-GAN" ; + d3f:definition "Generative Adversarial Networks (GAN) are an approach to generative modeling using deep learning methods, such as convolutional neural networks." ; + d3f:kb-article """## References +Brownlee, J. (2019). What Are Generative Adversarial Networks (GANs)? Machine Learning Mastery. [Link](https://machinelearningmastery.com/what-are-generative-adversarial-networks-gans/)""" ; + d3f:synonym "GAN" ; + rdfs:subClassOf d3f:UnsupervisedLearning . + +d3f:GetOpenWindows a owl:Class, + owl:NamedIndividual ; + rdfs:label "Get Open Windows" ; + rdfs:subClassOf d3f:SystemCall . + +d3f:HostShutdown a d3f:HostShutdown, + d3f:ProcessTermination, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Host Shutdown" ; + d3f:d3fend-id "D3-HS" ; + d3f:definition "Initiating a host's shutdown sequence to terminate all running processes." ; + d3f:kb-article """## How It Works + +Host shutdown can either be initiated in the physical presence of the device using the power functions or remotely using the provided user interface or an installed EDR agent (with the available function). This process may allow for the removal of specific types of malware, such as fileless malware, and can also prevent further damage, for example, if the system is part of a botnet. + +## Considerations + +- If the attacker has achieved persistence techniques, this technique may not be effective +- Compromised systems may not respond to remote commands to shutdown or reboot, requiring physical intervention. +- Shutting down a system will usually result in the memory losing its state which can be useful in forensic activities so this should be considered when deciding to shutdown. +- Shutting down systems may disrupt access to computer resources for legitimate users.""" ; + d3f:kb-reference d3f:Reference-NearMemoryInMemoryDetectionofFilelessMalware ; + d3f:terminates d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:terminates ; + owl:someValuesFrom d3f:Process ], + d3f:ProcessEviction . + +d3f:IPReputationAnalysis a d3f:IPReputationAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "IP Reputation Analysis" ; + d3f:analyzes d3f:IPAddress ; + d3f:d3fend-id "D3-IPRA" ; + d3f:definition "Analyzing the reputation of an IP address." ; + d3f:kb-reference d3f:Reference-Database_for_receiving_storing_and_compiling_information_about_email_messages, + d3f:Reference-Finding_phishing_sites ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:IPAddress ], + d3f:IdentifierReputationAnalysis . + +d3f:ImageDataSegment a owl:Class, + owl:NamedIndividual ; + rdfs:label "Image Data Segment" ; + d3f:definition "An image data segment (often denoted .data) is a portion of an object file that contains initialized static variables, that is, global variables and static local variables. The size of this segment is determined by the size of the values in the program's source code, and does not change at run time. This segmenting of the memory space into discrete blocks with specific tasks carried over into the programming languages of the day and the concept is still widely in use within modern programming languages." ; + rdfs:seeAlso d3f:ProcessDataSegment, + ; + rdfs:subClassOf d3f:ImageSegment . + +d3f:ImageSynthesisGAN a owl:Class, + owl:NamedIndividual ; + rdfs:label "Image Synthesis GAN" ; + d3f:d3fend-id "D3A-ISG" ; + d3f:definition "Image synthesis thorugh the application of Generative Adversarial Networks." ; + d3f:kb-article """## References + +Zhang, Q., Wang, H., Lu, H., Won, D., & Yoon, S. W. (2018). Medical Image Synthesis with Generative Adversarial Networks for Tissue Recognition. 2018 IEEE International Conference on Healthcare Informatics (ICHI), 199-207. doi: 10.1109/ICHI.2018.00030. [Link](https://ieeexplore.ieee.org/document/8419363)""" ; + rdfs:subClassOf d3f:GenerativeAdversarialNetwork . + +d3f:LogicalLinkMapping a d3f:LogicalLinkMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Logical Link Mapping" ; + d3f:d3fend-id "D3-LLM" ; + d3f:definition "Logical link mapping creates a model of existing or previous node-to-node connections using network-layer data or metadata." ; + d3f:kb-reference d3f:Reference-LibreNMSDocsNetworkMapExtension ; + d3f:maps d3f:LogicalLink, + d3f:Network, + d3f:NetworkNode ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:LogicalLink ], + [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:NetworkNode ], + [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:Network ], + d3f:NetworkMapping . + +d3f:LogicalRules a owl:Class, + owl:NamedIndividual ; + rdfs:label "Logical Rules" ; + d3f:d3fend-id "D3A-LR" ; + d3f:definition "A logical rule matches event data or set of values to a conditional expression and results in the determination of a truth value, which may be used to determine the next action or step to take." ; + d3f:kb-article """## How it works + +Logic rules define a set of patterns that in some patterns must match input data. If the the conditions are met, then the rule will "fire" and some action will be taken, usually notifying a person or another system that the event being monitored needs further processing or attention. + +## Key Test Considerations + +- **Performance (Accuracy)** Identify instances in data where rule is expected to be triggered. Implement traceability and metrics for individual rule performance. Traceability of cases could be implemented as unit tests or as part of a fine-grained classification performance platform. For simple rule-based matching systems with many rules, individual rules may be unused or may create unusually high false positives (or false negatives relative to expectation. + +- **Performance (Computational)** Generate model performance measures (see Classification Performance Measures), esp. a confusion matrix for each rule and identify outliers and relative contribution of rule to overall performance. + +## References +1. Event condition action. (2019, Nov 21). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Event_condition_action). +2. Business rule. (2023, April 10). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Business_rule). +3. YARA. (2023, June 5). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/YARA).""" ; + rdfs:subClassOf d3f:SymbolicLogic . + +d3f:Model-basedReinforcementLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Model-based Reinforcement Learning" ; + d3f:d3fend-id "D3A-MBRL" ; + d3f:definition "Model-based Reinforcement Learning refers to learning optimal behavior indirectly by learning a model of the environment by taking actions and observing the outcomes that include the next state and the immediate reward. The models predict the outcomes of actions and are used in lieu of or in addition to interaction with the environment to learn optimal policies." ; + d3f:kb-article """## References +Model-Based Reinforcement Learning. In *Encyclopedia of Machine Learning*, pp. 642-644. Springer, 2010. [Link](https://link.springer.com/referenceworkentry/10.1007/978-0-387-30164-8_556#:~:text=Model%2Dbased%20Reinforcement%20Learning%20refers,state%20and%20the%20immediate%20reward).""" ; + rdfs:subClassOf d3f:ReinforcementLearning . + +d3f:Modem a owl:Class ; + rdfs:label "Modem" ; + d3f:definition "A modem -- a portmanteau of \"modulator-demodulator\" -- is a hardware device that converts data into a format suitable for a transmission medium so that it can be transmitted from one computer to another (historically along telephone wires). A modem modulates one or more carrier wave signals to encode digital information for transmission and demodulates signals to decode the transmitted information. The goal is to produce a signal that can be transmitted easily and decoded reliably to reproduce the original digital data. Modems can be used with almost any means of transmitting analog signals from light-emitting diodes to radio. A common type of modem is one that turns the digital data of a computer into modulated electrical signal for transmission over telephone lines and demodulated by another modem at the receiver side to recover the digital data." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ComputerNetworkNode . + +d3f:NTFSLink a owl:Class ; + rdfs:label "NTFS Link" ; + d3f:definition "The NTFS filesystem defines various ways to link files, i.e. to make a file point to another file or its contents. The object being pointed to is called the target. There are three classes of NTFS links: (a) Hard links, which have files share the same MFT entry (inode), in the same filesystem; (b) Symbolic links, which record the path of another file that the links contents should show and can accept relative paths; and (c) Junction points, which are similar to symlinks but defined only for directories and only accepts local absolute paths" ; + rdfs:subClassOf d3f:File, + d3f:FileSystemLink . + +d3f:NetworkResourceAccess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Resource Access" ; + d3f:accesses d3f:NetworkResource, + d3f:Resource ; + d3f:definition "Ephemeral digital artifact comprising a request of a network resource and any response from that network resource." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:NetworkResource ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Resource ], + d3f:ResourceAccess . + +d3f:NullPointerChecking a owl:Class, + owl:NamedIndividual ; + rdfs:label "Null Pointer Checking" ; + d3f:d3fend-id "D3-NPC" ; + d3f:definition "Checking if a pointer is NULL." ; + d3f:hardens d3f:MemoryFreeFunction, + d3f:PointerDereferencingFunction ; + d3f:kb-article """ +## How it Works +Programmatically checking if a pointer is NULL before use. + +## Considerations +* Pointers should be checked prior to use after they have, or may have been modified. +* Note that it may vary by circumstance whether the caller, or callee is responsible for checking if a pointer is NULL. +* Note: This resource should not be considered a definitive or exhaustive coding guideline.""" ; + d3f:kb-reference d3f:Reference-NullPointerChecking_SEI, + d3f:Reference-NullPointerDereference_CWE, + d3f:Reference-PointerValidationFunction_SEI ; + d3f:synonym "Nil Pointer Checking" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:MemoryFreeFunction ], + [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:PointerDereferencingFunction ], + d3f:PointerValidation . + +d3f:OSAPIFreeMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Free Memory" ; + d3f:invokes d3f:FreeMemory ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:FreeMemory ], + d3f:OSAPISystemFunction . + +d3f:OSAPIGetSystemTime a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Get System Time" ; + d3f:invokes d3f:GetSystemTime ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:GetSystemTime ], + d3f:OSAPISystemFunction . + +d3f:OSAPIMoveFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Move File" ; + d3f:invokes d3f:MoveFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:MoveFile ], + d3f:OSAPISystemFunction . + +d3f:OSAPISuspendProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Suspend Process" ; + d3f:invokes d3f:SuspendProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SuspendProcess ], + d3f:OSAPISystemFunction . + +d3f:OSAPISuspendThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Suspend Thread" ; + d3f:invokes d3f:SuspendThread ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:SuspendThread ], + d3f:OSAPISystemFunction . + +d3f:OSAPITraceProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Trace Process" ; + d3f:invokes d3f:TraceProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:TraceProcess ], + d3f:OSAPISystemFunction . + +d3f:OfficeApplication a owl:Class, + owl:NamedIndividual ; + rdfs:label "Office Application" ; + d3f:definition "An office application is one that is part of an application suite (e.g., Microsoft Office, Open Office)." ; + rdfs:subClassOf d3f:UserApplication . + +d3f:OperatingSystem a owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System" ; + d3f:contains d3f:Kernel, + d3f:SystemServiceSoftware ; + d3f:definition "An operating system (OS) is system software that manages computer hardware and software resources and provides common services for computer programs. All computer programs, excluding firmware, require an operating system to function. Time-sharing operating systems schedule tasks for efficient use of the system and may also include accounting software for cost allocation of processor time, mass storage, printing, and other resources." ; + d3f:may-contain d3f:OperatingSystemConfigurationComponent ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:SystemServiceSoftware ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:OperatingSystemConfigurationComponent ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Kernel ], + d3f:DigitalInformationBearer . + +d3f:OperatingSystemConfiguration a owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System Configuration" ; + d3f:definition "Information used to configure the services, parameters, and initial settings for an operating system." ; + rdfs:subClassOf d3f:ConfigurationResource . + +d3f:OutputDevice a owl:Class ; + rdfs:label "Output Device" ; + d3f:definition "An output device is any piece of computer hardware equipment which converts information into human-readable form. It can be text, graphics, tactile, audio, and video. Some of the output devices are Visual Display Units (VDU) i.e. a Monitor, Printer, Graphic Output devices, Plotters, Speakers etc. A new type of Output device is been developed these days, known as Speech synthesizer, a mechanism attached to the computer which produces verbal output sounding almost like human speeches." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:HardwareDevice . + +d3f:PasswordDatabase a owl:Class ; + rdfs:label "Password Database" ; + d3f:definition "A password database is a database that holds passwords for user accounts and is usually encrypted (i.e.., the passwords are hashed). Password databases are found supporting system services (such as SAM) or part of user applications such as password managers." ; + rdfs:subClassOf d3f:Database . + +d3f:PasswordRotation a d3f:PasswordRotation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Password Rotation" ; + d3f:d3fend-id "D3-PR" ; + d3f:definition "Password rotation is a security policy that mandates the periodic change of user account passwords to mitigate the risk of unauthorized access due to compromised credentials." ; + d3f:kb-article """## How it works + +Users may be requested to change their passwords on a regular schedule. Management servers with enterprise policies for account management provide the ability to change or reset passwords for accounts. + +## Considerations + +Requiring users to change their passwords frequently can result in insecure password practices by the user. The latest update of NIST SP 800-63B, Digital Identity Guidelines, recommends requiring password reset only when a known compromise has occurred, or every 365 days, rather than every 60 or 90 days.""" ; + d3f:kb-reference d3f:Reference-PasswordandKeyRotation-SSH ; + d3f:regenerates d3f:Password ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:regenerates ; + owl:someValuesFrom d3f:Password ], + d3f:CredentialRotation . + +d3f:PeripheralFirmwareVerification a d3f:PeripheralFirmwareVerification, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Peripheral Firmware Verification" ; + d3f:d3fend-id "D3-PFV" ; + d3f:definition "Cryptographically verifying peripheral firmware integrity." ; + d3f:kb-article """# How it works +Peripherial firmware is collected and analyzed on a host either periodically or on demand. This information may be collected for future comparisons. + +Changes in firmware hash values may indicate that the firmware has been tampered with or that firmware images are not maintained to current baselined versions, or even known vulnerable versions are deployed. + +## Considerations +* Trust baselines will need to be generated for specific devices +* Changes to trusted configurations will need to be managed across the enterprise""" ; + d3f:kb-reference d3f:Reference-FirmwareVerificationEclypsium, + d3f:Reference-FirmwareVerificationTrapezoid ; + d3f:verifies d3f:PeripheralFirmware ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:verifies ; + owl:someValuesFrom d3f:PeripheralFirmware ], + d3f:FirmwareVerification . + +d3f:PhysicalLinkMapping a d3f:PhysicalLinkMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Physical Link Mapping" ; + d3f:d3fend-id "D3-PLM" ; + d3f:definition "Physical link mapping identifies and models the link connectivity of the network devices within a physical network." ; + d3f:kb-reference d3f:Reference-LibreNMSDocsNetworkMapExtension ; + d3f:maps d3f:NetworkNode, + d3f:PhysicalLink ; + d3f:synonym "Layer 1 Mapping" ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:NetworkNode ], + [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:PhysicalLink ], + d3f:NetworkMapping . + +d3f:PointerValidation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pointer Validation" ; + d3f:d3fend-id "D3-PV" ; + d3f:definition "Ensuring that a pointer variable has the required properties for use." ; + d3f:kb-reference d3f:Reference-PointerValidationFunction_SEI ; + rdfs:subClassOf d3f:SourceCodeHardening . + +d3f:Procedure a owl:Class ; + rdfs:label "Procedure" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:allValuesFrom d3f:Step ; + owl:onProperty d3f:start ], + [ a owl:Restriction ; + owl:onProperty d3f:implements ; + owl:someValuesFrom d3f:Technique ], + d3f:Plan . + +d3f:Processor a owl:Class ; + rdfs:label "Processor" ; + d3f:synonym "Computer Processor" ; + rdfs:subClassOf d3f:HardwareDevice . + +d3f:Provider a owl:Class ; + rdfs:label "Provider" ; + rdfs:subClassOf d3f:Organization . + +d3f:ProxyBasedWebServerAccessMediation a d3f:ProxyBasedWebServerAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Proxy-based Web Server Access Mediation" ; + d3f:d3fend-id "D3-PBWSAM" ; + d3f:definition "Proxy-based web server access mediation focuses on the regulation of web server access through intermediary proxy servers." ; + d3f:kb-article """## How it works + +Proxy-based Web Server Access Mediation involves controlling access to web servers via proxy servers, which act as intermediaries between users and web resources. This approach can enhance security by anonymizing user requests, filtering content, and enforcing access policies. Examples include using corporate proxies to access external websites or services.""" ; + d3f:kb-reference d3f:Reference-NIST-Special-Publication-800-41-Revision-1 ; + rdfs:subClassOf d3f:WebSessionAccessMediation . + +d3f:RFNode a owl:Class ; + rdfs:label "RF Node" ; + rdfs:subClassOf d3f:NetworkNode . + +d3f:RFShielding a d3f:RFShielding, + owl:Class, + owl:NamedIndividual ; + rdfs:label "RF Shielding" ; + d3f:d3fend-id "D3-RFS" ; + d3f:definition "Adding physical barriers to a platform to prevent undesired radio interference." ; + d3f:kb-reference d3f:Reference-PrivacyAndSecuritySystemsAndMethodsOfUse, + d3f:Reference-Technical_Specifications_for_Construction_and_Management_of_Sensitive_Compartmented_Information_Facilities ; + rdfs:subClassOf d3f:PlatformHardening . + +d3f:Reference-AutomaticallyGeneratingRulesForConnectionSecurity_Microsoft a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Automatically generating rules for connection security - Microsoft" ; + d3f:has-link "https://patents.google.com/patent/US20120054825"^^xsd:anyURI ; + d3f:kb-abstract "A method and system for creating security policies for firewall and connection policies in an integrated manner is provided. The security system provides a user interface through which a user can define a security rule that specifies both a firewall policy and a connection policy. After the security rule is specified, the security system automatically generates a firewall rule and a connection rule to implement the security rule. The security system provides the firewall rule to a firewall engine that is responsible for enforcing the firewall rules and provides the connection rule to an IPsec engine that is responsible for enforcing the connection rules" ; + d3f:kb-author "Charles D. Bassett; Eran Yariv; Ian M. Carbaugh; Lokesh Srinivas Koppolu; Maksim Noy; Sarah A. Wahlert; Pradeep Bahl" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:InboundTrafficFiltering, + d3f:OutboundTrafficFiltering ; + d3f:kb-reference-title "Automatically generating rules for connection security" . + +d3f:Reference-FirmwareVerificationEclypsium a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Firmware Verification Eclypsium" ; + d3f:has-link "https://patents.google.com/patent/US20200074086A1/en"^^xsd:anyURI ; + d3f:kb-abstract "Systems and methods are provided herein for monitoring and identifying potential security vulnerabilities in hardware and / or firmware of host devices ." ; + d3f:kb-author "Yuriy Bulygin, Oleksandr Bazhaniuk" ; + d3f:kb-organization "ECLYPSIUM , Inc" ; + d3f:kb-reference-of d3f:FirmwareVerification ; + d3f:kb-reference-title "Methods and systems for hardware and firmware security monitoring" . + +d3f:Reference-NIST-Special-Publication-800-41-Revision-1 a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Special Publication 800-41 Revision 1 Guidelines on Firewalls and Firewall Policy" ; + d3f:has-link "https://doi.org/10.6028/NIST.SP.800-41r1"^^xsd:anyURI ; + d3f:kb-abstract "Firewalls are devices or programs that control the flow of network traffic between networks or hosts employing differing security postures. This publication provides an overview of several types of firewall technologies and discusses their security capabilities and their relative advantages and disadvantages in detail. It also makes recommendations for establishing firewall policies and for selecting, configuring, testing, deploying, and managing firewall solutions." ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:EndpointBasedWebServerAccessMediation, + d3f:ProxyBasedWebServerAccessMediation, + d3f:WebSessionAccessMediation ; + d3f:kb-reference-title "Special Publication 800-41 Revision 1 Guidelines on Firewalls and Firewall Policy" . + +d3f:Reference-PasswordandKeyRotation-SSH a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Password and Key Rotation - SSH" ; + d3f:has-link "https://www.ssh.com/academy/iam/password-key-rotation"^^xsd:anyURI ; + d3f:kb-organization "SSH" ; + d3f:kb-reference-of d3f:CertificateRotation, + d3f:CredentialRotation, + d3f:PasswordRotation ; + d3f:kb-reference-title "Password and Key Rotation" . + + a d3f:AcademicPaperReference, + owl:NamedIndividual ; + rdfs:label "Reference - Remembrance of data passed: A study of disk sanitization practices" ; + d3f:has-link "https://www.researchgate.net/profile/Simson-Garfinkel/publication/3437324_Remembrance_of_data_passed_A_study_of_disk_sanitization_practices/links/550de6d40cf2128741677d9f/Remembrance-of-data-passed-A-study-of-disk-sanitization-practices.pdf"^^xsd:anyURI ; + d3f:kb-author "Simson L Garfinkel, Abhi Shelat" ; + d3f:kb-reference-of d3f:DiskErasure, + d3f:DiskFormatting, + d3f:DiskPartitioning ; + d3f:kb-reference-title "Remembrance of Data Passed: A Study of Disk Sanitization Practices" . + +d3f:Reference-SystemAndMethodThereofForIdentifyingAndRespondingToSecurityIncidentsBasedOnPreemptiveForensics_PaloAltoNetworksInc a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System and method thereof for identifying and responding to security incidents based on preemptive forensics - Palo Alto Networks Inc" ; + d3f:has-link "https://patents.google.com/patent/US20160142424A1"^^xsd:anyURI ; + d3f:kb-abstract "A system is connected to a plurality of user devices coupled to an enterprise's network. The system continuously collects, stores, and analyzes forensic data related to the enterprise's network. Based on the analysis, the system is able to determine normal behavior of the network and portions thereof and thereby identify abnormal behaviors within the network. Upon identification of an abnormal behavior, the system determines whether the abnormal behavior relates to a security incident. Upon determining a security incident in any portion of the enterprise's network, the system extracts forensic data respective of the security incident and enables further assessment of the security incident as well as identification of the source of the security incident. The system provides real-time damage assessment respective of the security incident as well as the security incident's attributions." ; + d3f:kb-author "Gil BARAK; Shai MORAG" ; + d3f:kb-mitre-analysis """This patent describes detecting abnormal behavior related to a security incident by collecting and analyzing forensic data in real time. Forensic data may include: + +* URLs visited +* data downloaded or streamed +* messages received and sent +* amount of memory used for processing + +The data is then analyzed according to a set of dynamically created rules to determine normal behavior patterns associated with the network or user devices. Anomalies between current behavior and normal behavior patterns trigger an alert.""" ; + d3f:kb-organization "Palo Alto Networks Inc" ; + d3f:kb-reference-of d3f:ResourceAccessPatternAnalysis, + d3f:UserDataTransferAnalysis, + d3f:WebSessionActivityAnalysis ; + d3f:kb-reference-title "System and method thereof for identifying and responding to security incidents based on preemptive forensics" . + +d3f:Reference-TivoliApplicationDependencyDiscoverManager7_3_0DependenciesBetweenResources a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Tivoli Application Dependency Discovery Manager 7.3.0 - Dependencies between resources" ; + d3f:has-link "https://www.ibm.com/docs/en/taddm/7.3.0?topic=model-dependencies-between-resources"^^xsd:anyURI ; + d3f:kb-organization "IBM" ; + d3f:kb-reference-of d3f:DataExchangeMapping, + d3f:ServiceDependencyMapping, + d3f:SystemDependencyMapping ; + d3f:kb-reference-title "Tivoli Application Dependency Discovery Manager 7.3.0 - Dependencies between resources" . + +d3f:Reference-Web-BasedEnterpriseManagement a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Web-Based Enterprise Management" ; + d3f:has-link "https://www.dmtf.org/standards/wbem"^^xsd:anyURI ; + d3f:kb-organization "Distributed Management Task Force (DMTF)" ; + d3f:kb-reference-of d3f:ConfigurationInventory, + d3f:HardwareComponentInventory, + d3f:NetworkNodeInventory, + d3f:SoftwareInventory ; + d3f:kb-reference-title "Web-Based Enterprise Management" . + +d3f:Reference-WhatIsNetworkAccessControl a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - What is Network Access Control?" ; + d3f:has-link "https://www.fortinet.com/resources/cyberglossary/what-is-network-access-control"^^xsd:anyURI ; + d3f:kb-abstract "Network access control (NAC), also known as network admission control, is the process of restricting unauthorized users and devices from gaining access to a corporate or private network. NAC ensures that only users who are authenticated and devices that are authorized and compliant with security policies can enter the network." ; + d3f:kb-organization "Fortinet" ; + d3f:kb-reference-of d3f:LANAccessMediation, + d3f:NetworkAccessMediation, + d3f:RoutingAccessMediation ; + d3f:kb-reference-title "What is Network Access Control?" . + +d3f:Reference-Windows-Management-Infrastructure a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Windows Management Infrastructure (MI)" ; + d3f:has-link "https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wmi_v2/windows-management-infrastructure"^^xsd:anyURI ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:ConfigurationInventory, + d3f:HardwareComponentInventory, + d3f:NetworkNodeInventory, + d3f:SoftwareInventory ; + d3f:kb-reference-title "Windows Management Infrastructure" . + +d3f:Reference-Windows-Management-Instrumentation a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Windows Management Instrumentation (WMI)" ; + d3f:has-link "https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-start-page"^^xsd:anyURI ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-of d3f:ConfigurationInventory, + d3f:HardwareComponentInventory, + d3f:NetworkNodeInventory, + d3f:SoftwareInventory ; + d3f:kb-reference-title "Windows Management Instrumentation" . + +d3f:ResamplingEnsemble a owl:Class, + owl:NamedIndividual ; + rdfs:label "Resampling Ensemble" ; + d3f:d3fend-id "D3A-RE" ; + d3f:definition "In the method, the small classes are oversampled and large classes are undersampled. The resampling scale is determined by the ratio of the min class number and max class number. And multiple machine learning methods are selected to construct the ensemble" ; + d3f:kb-article """## References +Ensemble learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Ensemble_learning). + +Torgo, L. (2014). A resampling ensemble algorithm for improved accuracy. *Neurocomputing*, 134, 55-66. [Link](https://www.sciencedirect.com/science/article/pii/S0925231214007644#:~:text=A%20resampling%20ensemble%20algorithm%20is,and%20undersampling%20are%20empirically%20analyzed).""" ; + rdfs:subClassOf d3f:EnsembleLearning . + +d3f:Semi-supervisedWrapperMethod a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-supervised Wrapper Method" ; + d3f:d3fend-id "D3A-SSWM" ; + d3f:definition "The principle behind wrapper methods is that we train a model with labeled data and then generate pseudo-labels for the unlabeled data using the trained model iteratively." ; + d3f:kb-article """## References +Jashish, M. (n.d.). Beginner's Guide to Semi-Supervised Learning. Jashish Blog. [Link](http://jashish.com.np/blog/posts/beginners-guide-to-semi-supervised-learning/).""" ; + rdfs:subClassOf d3f:Semi-SupervisedLearning . + +d3f:ServiceBinaryVerification a d3f:ServiceBinaryVerification, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Service Binary Verification" ; + d3f:d3fend-id "D3-SBV" ; + d3f:definition "Analyzing changes in service binary files by comparing to a source of truth." ; + d3f:kb-article """## How it works +System service applications may originate from the operating system installation or third-party applications installed with administrative privileges. These services have an entry point of some executable file-- a binary or a script. Attackers sometimes modify these executables to launch their own code. Analyzing changes in these files may uncover unauthorized activity. + +## Considerations +* These files change for legitimate reasons when the system or software updates. +* The source of truth must not be corrupted in order for this method to work.""" ; + d3f:kb-reference d3f:Reference-ServiceBinaryModifications_MITRE ; + d3f:verifies d3f:ServiceApplication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:verifies ; + owl:someValuesFrom d3f:ServiceApplication ], + d3f:SystemFileAnalysis . + +d3f:SessionToken a owl:Class, + owl:NamedIndividual ; + rdfs:label "Session Token" ; + d3f:definition "In computer science, a session identifier, session ID or session token is a piece of data that is used in network communications (often over HTTPS) to identify a session, a series of related message exchanges." ; + d3f:kb-article """## How it works + +Session identifiers become necessary in cases where the communications infrastructure uses a stateless protocol such as HTTP. For example, a buyer who visits a seller's website wants to collect a number of articles in a virtual shopping cart and then finalize the shopping by going to the site's checkout page. This typically involves an ongoing communication where several webpages are requested by the client and sent back to them by the server. In such a situation, it is vital to keep track of the current state of the shopper's cart, and a session ID is one way to achieve that goal.""" ; + d3f:synonym "Session ID", + "Session Identifier", + "Session Token" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:AccessToken . + +d3f:ShadowStackComparisons a d3f:ShadowStackComparisons, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Shadow Stack Comparisons" ; + d3f:analyzes d3f:StackFrame ; + d3f:d3fend-id "D3-SSC" ; + d3f:definition "Comparing a call stack in system memory with a shadow call stack maintained by the processor to determine unauthorized shellcode activity." ; + d3f:kb-article """## How it works +This technique compares the call stack stored in system memory with the shadow call stack maintained in the cache memory of the processor. Mismatches between the two are compared since a return oriented programming attack may only be able to control or spoof the call stack and not the shadow call stack. Mismatches are counted and if the number of mismatches exceeds a certain threshold it is an indication of unauthorized activity and a security response action is performed. + +## Considerations +If the threshold for detecting a stack anomaly is low, it may not detect a return-oriented attack with just one gadget, such as a return-to-libc or return-to-plt attack. Additionally, this technique may not detect JOP (Jump-oriented programming), as the return instruction is not executed.""" ; + d3f:kb-reference d3f:Reference-ThreatDetectionForReturnOrientedProgramming_CrowdstrikeInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:StackFrame ], + d3f:ProcessAnalysis . + +d3f:StackComponent a owl:Class ; + rdfs:label "Stack Component" ; + d3f:definition "A stack component is any component of a call stack used for stack-based memory allocation in a running process. Examples include saved instruction pointers, stack frames, and stack frame canaries." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:StorageImage a owl:Class ; + rdfs:label "Storage Image" ; + d3f:definition "A storage image is a complete, encapsulated representation of a storage medium or system environment. It contains all the data, files, and configurations necessary to replicate or deploy a specific system state or software setup." ; + rdfs:subClassOf d3f:ComputingImage, + d3f:File . + +d3f:SystemConfigurationInitResource a owl:Class ; + rdfs:label "System Configuration Init Resource" ; + d3f:definition "A system configuration initialization resource has information for initializing (booting) a system." ; + rdfs:subClassOf d3f:LocalResource ; + skos:altLabel "System Init Resource" . + +d3f:SystemFirmwareVerification a d3f:SystemFirmwareVerification, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System Firmware Verification" ; + d3f:d3fend-id "D3-SFV" ; + d3f:definition "Cryptographically verifying installed system firmware integrity." ; + d3f:kb-article """## How it works +Cryptographic hash values are computed for system firmware. The hash values are compared against precomputed firmware hash values to determine if the firmware has been tampered with. + +When system firmware verification fails a set of predefined responses is typically invoked. The responses may direct the system to disable some devices or operations. + +## Considerations +* Requires the use of system provided security modules +* Secure hash values will need to be computed for firmware""" ; + d3f:kb-reference d3f:Reference-FirmwareVerificationEclypsium, + d3f:Reference-PlatformFirmwareResiliencyGuidelines_NIST ; + d3f:verifies d3f:SystemFirmware ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:verifies ; + owl:someValuesFrom d3f:SystemFirmware ], + d3f:FirmwareVerification . + +d3f:SystemInitConfigAnalysis a d3f:SystemInitConfigAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System Init Config Analysis" ; + d3f:analyzes d3f:SystemInitConfiguration ; + d3f:d3fend-id "D3-SICA" ; + d3f:definition "Analysis of any system process startup configuration." ; + d3f:kb-reference d3f:Reference-AutorunDifferences_MITRE, + d3f:Reference-CAR-2020-09-005%3AAppInitDLLs_MITRE, + d3f:Reference-CAR-2020-11-001%3ABootOrLogonInitializationScripts_MITRE ; + d3f:synonym "Autorun Analysis", + "Startup Analysis" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:SystemInitConfiguration ], + d3f:OperatingSystemMonitoring ; + skos:altLabel "System Initialization Configuration Analysis" . + +d3f:T1001 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Data Obfuscation" ; + d3f:attack-id "T1001" ; + d3f:definition "Adversaries may obfuscate command and control traffic to make it more difficult to detect.(Citation: Bitdefender FunnyDream Campaign November 2020) Command and control (C2) communications are hidden (but not necessarily encrypted) in an attempt to make the content more difficult to discover or decipher and to make the communication less conspicuous and hide commands from being seen. This encompasses many methods, such as adding junk data to protocol traffic, using steganography, or impersonating legitimate protocols." ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1048 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration Over Alternative Protocol" ; + d3f:attack-id "T1048" ; + d3f:definition "Adversaries may steal data by exfiltrating it over a different protocol than that of the existing command and control channel. The data may also be sent to an alternate network location from the main command and control server." ; + d3f:produces d3f:InternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:InternetNetworkTraffic ], + d3f:ExfiltrationTechnique . + +d3f:T1069 a owl:Class ; + rdfs:label "Permission Groups Discovery" ; + d3f:attack-id "T1069" ; + d3f:definition "Adversaries may attempt to discover group and permission settings. This information can help adversaries determine which user accounts and groups are available, the membership of users in particular groups, and which users and groups have elevated permissions." ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1102 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Service" ; + d3f:attack-id "T1102" ; + d3f:definition "Adversaries may use an existing, legitimate external Web service as a means for relaying data to/from a compromised system. Popular websites and social media acting as a mechanism for C2 may give a significant amount of cover due to the likelihood that hosts within a network are already communicating with them prior to a compromise. Using common services, such as those offered by Google or Twitter, makes it easier for adversaries to hide in expected noise. Web service providers commonly use SSL/TLS encryption, giving adversaries an added level of protection." ; + d3f:produces d3f:OutboundInternetWebTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetWebTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1114 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Email Collection" ; + d3f:accesses d3f:Resource ; + d3f:attack-id "T1114" ; + d3f:definition "Adversaries may target user email to collect sensitive information. Emails may contain sensitive data, including trade secrets or personal information, that can prove valuable to adversaries. Adversaries can collect or forward email from mail servers or clients." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Resource ], + d3f:CollectionTechnique . + +d3f:T1195 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Supply Chain Compromise" ; + d3f:attack-id "T1195" ; + d3f:definition "Adversaries may manipulate products or product delivery mechanisms prior to receipt by a final consumer for the purpose of data or system compromise." ; + d3f:modifies d3f:DigitalArtifact ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:DigitalArtifact ], + d3f:InitialAccessTechnique . + +d3f:T1204 a owl:Class ; + rdfs:label "User Execution" ; + d3f:attack-id "T1204" ; + d3f:definition "An adversary may rely upon specific actions by a user in order to gain execution. Users may be subjected to social engineering to get them to execute malicious code by, for example, opening a malicious document file or link. These user actions will typically be observed as follow-on behavior from forms of [Phishing](https://attack.mitre.org/techniques/T1566)." ; + rdfs:subClassOf d3f:ExecutionTechnique . + +d3f:T1497 a owl:Class ; + rdfs:label "Virtualization/Sandbox Evasion" ; + d3f:attack-id "T1497" ; + d3f:definition "Adversaries may employ various means to detect and avoid virtualization and analysis environments. This may include changing behaviors based on the results of checks for the presence of artifacts indicative of a virtual machine environment (VME) or sandbox. If the adversary detects a VME, they may alter their malware to disengage from the victim or conceal the core functions of the implant. They may also search for VME artifacts before dropping secondary or additional payloads. Adversaries may use the information learned from [Virtualization/Sandbox Evasion](https://attack.mitre.org/techniques/T1497) during automated discovery to shape follow-on behaviors.(Citation: Deloitte Environment Awareness)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1498 a owl:Class ; + rdfs:label "Network Denial of Service" ; + d3f:attack-id "T1498" ; + d3f:definition "Adversaries may perform Network Denial of Service (DoS) attacks to degrade or block the availability of targeted resources to users. Network DoS can be performed by exhausting the network bandwidth services rely on. Example resources include specific websites, email services, DNS, and web-based applications. Adversaries have been observed conducting network DoS attacks for political purposes(Citation: FireEye OpPoisonedHandover February 2016) and to support other malicious activities, including distraction(Citation: FSISAC FraudNetDoS September 2012), hacktivism, and extortion.(Citation: Symantec DDoS October 2014)" ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1499 a owl:Class ; + rdfs:label "Endpoint Denial of Service" ; + d3f:attack-id "T1499" ; + d3f:definition "Adversaries may perform Endpoint Denial of Service (DoS) attacks to degrade or block the availability of services to users. Endpoint DoS can be performed by exhausting the system resources those services are hosted on or exploiting the system to cause a persistent crash condition. Example services include websites, email services, DNS, and web-based applications. Adversaries have been observed conducting DoS attacks for political purposes(Citation: FireEye OpPoisonedHandover February 2016) and to support other malicious activities, including distraction(Citation: FSISAC FraudNetDoS September 2012), hacktivism, and extortion.(Citation: Symantec DDoS October 2014)" ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1559 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Inter-Process Communication" ; + d3f:attack-id "T1559" ; + d3f:definition "Adversaries may abuse inter-process communication (IPC) mechanisms for local code or command execution. IPC is typically used by processes to share data, communicate with each other, or synchronize execution. IPC is also commonly used to avoid situations such as deadlocks, which occurs when processes are stuck in a cyclic waiting pattern." ; + d3f:injects d3f:InterprocessCommunication ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:injects ; + owl:someValuesFrom d3f:InterprocessCommunication ], + d3f:ExecutionTechnique . + +d3f:T1560 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Archive Collected Data" ; + d3f:attack-id "T1560" ; + d3f:creates d3f:ArchiveFile ; + d3f:definition "An adversary may compress and/or encrypt data that is collected prior to exfiltration. Compressing the data can help to obfuscate the collected data and minimize the amount of data sent over the network.(Citation: DOJ GRU Indictment Jul 2018) Encryption can be used to hide information that is being exfiltrated from detection or make exfiltration less conspicuous upon inspection by a defender." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ArchiveFile ], + d3f:CollectionTechnique . + +d3f:T1565 a owl:Class ; + rdfs:label "Data Manipulation" ; + d3f:attack-id "T1565" ; + d3f:definition "Adversaries may insert, delete, or manipulate data in order to influence external outcomes or hide activity, thus threatening the integrity of the data.(Citation: Sygnia Elephant Beetle Jan 2022) By manipulating data, adversaries may attempt to affect a business process, organizational understanding, or decision making." ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1568 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Dynamic Resolution" ; + d3f:attack-id "T1568" ; + d3f:definition "Adversaries may dynamically establish connections to command and control infrastructure to evade common detections and remediations. This may be achieved by using malware that shares a common algorithm with the infrastructure the adversary uses to receive the malware's communications. These calculations can be used to dynamically adjust parameters such as the domain name, IP address, or port number the malware uses for command and control." ; + d3f:produces d3f:OutboundInternetDNSLookupTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetDNSLookupTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1585 a owl:Class ; + rdfs:label "Establish Accounts" ; + d3f:attack-id "T1585" ; + d3f:definition "Adversaries may create and cultivate accounts with services that can be used during targeting. Adversaries can create accounts that can be used to build a persona to further operations. Persona development consists of the development of public information, presence, history and appropriate affiliations. This development could be applied to social media, website, or other publicly available information that could be referenced and scrutinized for legitimacy over the course of an operation using that persona or identity.(Citation: NEWSCASTER2014)(Citation: BlackHatRobinSage)" ; + rdfs:subClassOf d3f:ResourceDevelopmentTechnique . + +d3f:T1586 a owl:Class ; + rdfs:label "Compromise Accounts" ; + d3f:attack-id "T1586" ; + d3f:definition "Adversaries may compromise accounts with services that can be used during targeting. For operations incorporating social engineering, the utilization of an online persona may be important. Rather than creating and cultivating accounts (i.e. [Establish Accounts](https://attack.mitre.org/techniques/T1585)), adversaries may compromise existing accounts. Utilizing an existing persona may engender a level of trust in a potential victim if they have a relationship, or knowledge of, the compromised persona." ; + rdfs:subClassOf d3f:ResourceDevelopmentTechnique . + +d3f:T1589 a owl:Class ; + rdfs:label "Gather Victim Identity Information" ; + d3f:attack-id "T1589" ; + d3f:definition "Adversaries may gather information about the victim's identity that can be used during targeting. Information about identities may include a variety of details, including personal data (ex: employee names, email addresses, security question responses, etc.) as well as sensitive details such as credentials or multi-factor authentication (MFA) configurations." ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:T1593 a owl:Class ; + rdfs:label "Search Open Websites/Domains" ; + d3f:attack-id "T1593" ; + d3f:definition "Adversaries may search freely available websites and/or domains for information about victims that can be used during targeting. Information about victims may be available in various online sites, such as social media, new sites, or those hosting information about business operations such as hiring or requested/rewarded contracts.(Citation: Cyware Social Media)(Citation: SecurityTrails Google Hacking)(Citation: ExploitDB GoogleHacking)" ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:T1595 a owl:Class ; + rdfs:label "Active Scanning" ; + d3f:attack-id "T1595" ; + d3f:definition "Adversaries may execute active reconnaissance scans to gather information that can be used during targeting. Active scans are those where the adversary probes victim infrastructure via network traffic, as opposed to other forms of reconnaissance that do not involve direct interaction." ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:Transformer-basedLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Transformer-based Learning" ; + d3f:d3fend-id "D3A-TBL" ; + d3f:definition "A transformer is a deep learning model. It is distinguished by its adoption of self-attention, differentially weighting the significance of each part of the input (which includes the recursive output) data." ; + d3f:kb-article """## References +"Transformer (machine learning model)." Wikipedia. [Link](https://en.wikipedia.org/wiki/Transformer_(machine_learning_model)).""" ; + rdfs:subClassOf d3f:MachineLearning . + +d3f:TunnelEvent a owl:Class ; + rdfs:label "Tunnel Event" ; + d3f:definition "An event involving the establishment, usage, or termination of a network tunnel. Tunnels provide encapsulated communication pathways across various layers, enabling secure, isolated, or virtualized transport of data." ; + rdfs:subClassOf d3f:NetworkEvent . + +d3f:UnsupervisedPreprocessing a owl:Class, + owl:NamedIndividual ; + rdfs:label "Unsupervised Preprocessing" ; + d3f:d3fend-id "D3A-UP" ; + d3f:definition "When performing unsupervised learning, the machine is presented with unlabeled data. (Unlabeled data has no target.) Unsupervised learning algorithms seek to discover intrinsic patterns that underlie the data, such as a clustering parameter or a redundant parameter (dimension) that can be reduced." ; + d3f:kb-article """## References +SAS Institute Inc. (n.d.). Decision Trees. In SAS® Visual Data Mining and Machine Learning.[Link](https://documentation.sas.com/doc/en/vdmmlcdc/8.4/vdmmladvug/n1e4spzcnv1f0fn1vsxhbzgdp1bb.htm).""" ; + rdfs:subClassOf d3f:Semi-SupervisedLearning . + +d3f:UserAction a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Action" ; + d3f:definition "An action performed by a user. Executing commands, granting permissions, and accessing resources are examples of user actions." ; + d3f:records d3f:Action ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:records ; + owl:someValuesFrom d3f:Action ], + d3f:DigitalInformationBearer . + +d3f:UserGroup a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Group" ; + d3f:contains d3f:User ; + d3f:definition "User groups are a way to collect user accounts and/or computer accounts into manageable units. Administrators can assign permissions, roles, or access to resources, as well as modify group membership, depending on the operating system." ; + d3f:synonym "Security Group" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:User ], + d3f:AccessControlGroup . + +d3f:UserProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Process" ; + d3f:definition "A user process is a process running to perform functions in the name of on particular user and user account, such as run an application or application service serving any number users. This is in contrast to a system process, which executes software to fulfill operating system functions." ; + rdfs:subClassOf d3f:Process . + +d3f:VideoInputDevice a owl:Class, + owl:NamedIndividual ; + rdfs:label "Video Input Device" ; + d3f:definition "Video input devices are used to digitize images or video from the outside world into the computer. The information can be stored in a multitude of formats depending on the user's requirement." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:InputDevice . + +d3f:VolumeSnapshot a owl:Class, + owl:NamedIndividual ; + rdfs:label "Volume Snapshot" ; + d3f:definition "A volume snapshot is a point-in-time copy of a storage volume." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:StorageSnapshot . + +d3f:WindowsRegistry a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows Registry" ; + d3f:contains d3f:WindowsRegistryKey ; + d3f:definition "The Windows Registry is a hierarchical database that stores low-level settings for the Microsoft Windows operating system and for applications that opt to use the registry. The kernel, device drivers, services, Security Accounts Manager, and user interface can all use the registry. The registry also allows access to counters for profiling system performance." ; + rdfs:isDefinedBy , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:WindowsRegistryKey ], + d3f:SystemConfigurationDatabase . + +d3f:WindowsRegistryValue a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows Registry Value" ; + d3f:contained-by d3f:WindowsRegistryKey ; + d3f:definition "A Windows Registry Value is a data structure consisting of a name, type, data (as a pointer), and the length. Windows Registry Values are always associated with a Windows Registry Key. They store the actual configuration data for the operating system and the programs that run on the system." ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contained-by ; + owl:someValuesFrom d3f:WindowsRegistryKey ], + [ a owl:Restriction ; + owl:onProperty d3f:windows-registry-value ; + owl:someValuesFrom xsd:string ], + d3f:SystemConfigurationDatabaseRecord . + +d3f:caused-by a owl:ObjectProperty ; + rdfs:label "caused-by" ; + d3f:definition "x caused-by y: The event or action x occurs as a consequence of event or action y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:causes . + +d3f:communicates-with a owl:ObjectProperty, + owl:SymmetricProperty ; + rdfs:label "communicates-with" ; + d3f:definition "x communicates-with y: x and y exchange signals or data bidirectionally, enabling mutual awareness, coordination, or interaction." ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:connects a owl:ObjectProperty ; + rdfs:label "connects" ; + d3f:definition "x connects y: The subject x joins system y by means of communication equipment (to some other system, typically the adversary-targeted host)." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:d3fend-display-annotation a owl:AnnotationProperty ; + rdfs:label "d3fend-display-annotation" ; + rdfs:subPropertyOf d3f:d3fend-annotation . + +d3f:d3fend-external-control-data-property a owl:DatatypeProperty ; + rdfs:label "d3fend-external-control-data-property" ; + rdfs:subPropertyOf d3f:d3fend-data-property . + +d3f:d3fend-kb-annotation-property a owl:AnnotationProperty ; + rdfs:label "d3fend-kb-annotation-property" ; + d3f:definition "x d3fend-kb-annotation-property y: The entity x had the d3fend kb annotation y." ; + rdfs:subPropertyOf d3f:d3fend-annotation . + +d3f:d3fend-kb-reference-annotation a owl:AnnotationProperty ; + rdfs:label "d3fend-kb-reference-annotation" ; + d3f:definition "x d3fend-kb-data-property y: The reference x has the data property y." ; + rdfs:domain d3f:TechniqueReference ; + rdfs:range xsd:string ; + rdfs:subPropertyOf d3f:d3fend-kb-annotation-property . + +d3f:d3fend-use-case-object-property a owl:ObjectProperty ; + rdfs:subPropertyOf d3f:d3fend-object-property . + +d3f:encrypts a owl:ObjectProperty ; + rdfs:label "encrypts" ; + d3f:definition "x encrypts y: The entity x converts the ordinary representation of a digital artifact y into a secret code." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:hardens . + +d3f:forges a owl:ObjectProperty ; + rdfs:label "forges" ; + d3f:definition "x forges y: An technique or agent x counterfeits a digital artifact y, such as a fake credential, with the intent to deceive." ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:creates . + +d3f:interprets a owl:ObjectProperty ; + rdfs:label "interprets" ; + d3f:definition "x interprets y: The subject x interprets the executable script y. The sense of interprets is here 'Parse the source code and perform its behavior directly.'" ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:executes, + d3f:may-interpret . + +d3f:may-evict a owl:ObjectProperty ; + rdfs:label "may-evict" ; + d3f:pref-label "may evict" ; + rdfs:subPropertyOf d3f:may-counter, + d3f:may-counter-attack . + +d3f:may-execute a owl:ObjectProperty ; + rdfs:label "may-execute" ; + d3f:definition "x may execute y: The subject x might take the action of carrying out (executing) y, which is a single software module, function, or instruction." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:may-query a owl:ObjectProperty ; + rdfs:label "may-query" ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:process-property a owl:ObjectProperty ; + rdfs:label "process-property" ; + d3f:definition "x process-property y: Process x has the a process-property y. This is generalization for specific process object properties." ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:queries a owl:ObjectProperty ; + rdfs:label "queries" ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-query . + +d3f:regenerates a owl:ObjectProperty ; + rdfs:label "regenerates" ; + d3f:definition "x regenerates y: The entity x discards the current digital artifact y and creates a new version that serves the same function." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:hardens . + +d3f:strengthens a owl:ObjectProperty ; + rdfs:label "strengthens" ; + d3f:definition "x strengthens y: The technique x make digital artifact y resistant (to harm or misuse.)" ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:hardens . + +d3f:suspends a owl:ObjectProperty ; + rdfs:label "suspends" ; + d3f:definition "x suspends y: The agent or technique x pauses entity y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:evicts . + +d3f:validates a owl:ObjectProperty ; + rdfs:label "validates" ; + d3f:definition "x validates y: The technique x proves the digital artifact y is valid; that is, x shows or confirms the validity of y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:hardens . + +d3f:ATTACKEnterpriseThing a owl:Class ; + rdfs:label "ATTACK Enterprise Thing" ; + rdfs:subClassOf d3f:ATTACKThing . + +d3f:AccessControlList a owl:Class, + owl:NamedIndividual ; + rdfs:label "Access Control List" ; + d3f:definition "A list of permissions attached to an object." ; + d3f:restricts d3f:UserGroup ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restricts ; + owl:someValuesFrom d3f:UserGroup ], + d3f:AccessControlConfiguration . + +d3f:AdministrativeNetworkActivityAnalysis a d3f:AdministrativeNetworkActivityAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Administrative Network Activity Analysis" ; + d3f:analyzes d3f:IntranetAdministrativeNetworkTraffic ; + d3f:created "2020-08-05T00:00:00"^^xsd:dateTime ; + d3f:d3fend-id "D3-ANAA" ; + d3f:definition "Detection of unauthorized use of administrative network protocols by analyzing network activity against a baseline." ; + d3f:kb-article """## How it works +Network protocols such as RDP, IPMI, SSH, SNMP, VNC, MOSH, NX, TeamViewer, SPICE, PCoIP, and others are used by system administrators to remotely manage servers. Defenders monitor administrative network activity to determine if the use of remote protocols is malicious. Attackers can abuse administrative protocols and leverage them for initial access to various endpoints. For example, an attacker with valid credentials will remotely SSH or RDP into a server and attempt to blend in with existing traffic from system administrators. By monitoring the traffic activity, it is possible to detect when the protocols are behaving differently from a known baseline of system administration activity. + +## Considerations +* Administrative traffic can be encrypted, making network protocol analysis a challenge +* False alarms can be mitigated by integration with inventory management systems""" ; + d3f:kb-reference d3f:Reference-MethodAndSystemForDetectingSuspiciousAdministrativeActivity_VectraNetworksInc, + d3f:Reference-RemoteRegistry_MITRE, + d3f:Reference-WindowsRemoteManagement_WinRM_MITRE ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:IntranetAdministrativeNetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:AllocateMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Allocate Memory" ; + d3f:creates d3f:MemoryBlock ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:MemoryBlock ], + d3f:SystemCall . + +d3f:AuthenticationFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Authentication Function" ; + d3f:authenticates d3f:UserAccount ; + d3f:definition "Authenticates a user account by verifying a presented credential." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:UserAccount ], + d3f:Subroutine . + +d3f:BootRecord a owl:Class, + owl:NamedIndividual ; + rdfs:label "Boot Record" ; + d3f:definition "A d3f:Record which is an essential component of the early boot (system initialization) process." ; + rdfs:subClassOf d3f:Record . + +d3f:BootloaderAuthentication a d3f:BootloaderAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Bootloader Authentication" ; + d3f:authenticates d3f:BootLoader ; + d3f:d3fend-id "D3-BA" ; + d3f:definition "Cryptographically authenticating the bootloader software before system boot." ; + d3f:kb-reference d3f:Reference-UEFIPlatformInitialization-Specification ; + d3f:synonym "Secure Boot" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:BootLoader ], + d3f:PlatformHardening . + +d3f:BrowserExtension a owl:Class, + owl:NamedIndividual ; + rdfs:label "Browser Extension" ; + d3f:definition "A browser extension is a plug-in that extends the functionality of a web browser in some way. Some extensions are authored using web technologies such as HTML, JavaScript, and CSS. Browser extensions can change the user interface of the web browser without directly affecting viewable content of a web page; for example, by adding a \"toolbar.\"" ; + d3f:extends d3f:Browser ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:extends ; + owl:someValuesFrom d3f:Browser ], + d3f:UserApplication . + +d3f:CWE-1023 a owl:Class ; + rdfs:label "Incomplete Comparison with Missing Factors" ; + d3f:cwe-id "CWE-1023" ; + rdfs:subClassOf d3f:CWE-697 . + +d3f:CWE-1093 a owl:Class ; + rdfs:label "Excessively Complex Data Representation" ; + d3f:cwe-id "CWE-1093" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1384 a owl:Class ; + rdfs:label "Improper Handling of Physical or Environmental Conditions" ; + d3f:cwe-id "CWE-1384" ; + rdfs:subClassOf d3f:CWE-703 . + +d3f:CWE-228 a owl:Class ; + rdfs:label "Improper Handling of Syntactically Invalid Structure" ; + d3f:cwe-id "CWE-228" ; + rdfs:subClassOf d3f:CWE-703, + d3f:CWE-707 . + +d3f:CWE-266 a owl:Class ; + rdfs:label "Incorrect Privilege Assignment" ; + d3f:cwe-id "CWE-266" ; + rdfs:subClassOf d3f:CWE-269 . + +d3f:CWE-287 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Authentication" ; + d3f:cwe-id "CWE-287" ; + d3f:weakness-of d3f:AuthenticationFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:AuthenticationFunction ], + d3f:CWE-284 . + +d3f:CWE-327 a owl:Class ; + rdfs:label "Use of a Broken or Risky Cryptographic Algorithm" ; + d3f:cwe-id "CWE-327" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-36 a owl:Class ; + rdfs:label "Absolute Path Traversal" ; + d3f:cwe-id "CWE-36" ; + rdfs:subClassOf d3f:CWE-22 . + +d3f:CWE-435 a owl:Class ; + rdfs:label "Improper Interaction Between Multiple Correctly-Behaving Entities" ; + d3f:cwe-id "CWE-435" ; + rdfs:subClassOf d3f:Weakness . + +d3f:CWE-471 a owl:Class ; + rdfs:label "Modification of Assumed-Immutable Data (MAID)" ; + d3f:cwe-id "CWE-471" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-506 a owl:Class ; + rdfs:label "Embedded Malicious Code" ; + d3f:cwe-id "CWE-506" ; + rdfs:subClassOf d3f:CWE-912 . + +d3f:CWE-704 a owl:Class ; + rdfs:label "Incorrect Type Conversion or Cast" ; + d3f:cwe-id "CWE-704" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-77 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Neutralization of Special Elements used in a Command ('Command Injection')" ; + d3f:cwe-id "CWE-77" ; + d3f:weakness-of d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-74 . + +d3f:CWE-787 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Out-of-bounds Write" ; + d3f:cwe-id "CWE-787" ; + d3f:weakness-of d3f:RawMemoryAccessFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:RawMemoryAccessFunction ], + d3f:CWE-119 . + +d3f:CWE-821 a owl:Class ; + rdfs:label "Incorrect Synchronization" ; + d3f:cwe-id "CWE-821" ; + rdfs:subClassOf d3f:CWE-662 . + +d3f:CWE-862 a owl:Class ; + rdfs:label "Missing Authorization" ; + d3f:cwe-id "CWE-862" ; + rdfs:comment "Broad and could apply to all resource accesses." ; + rdfs:subClassOf d3f:CWE-285 . + +d3f:CWE-943 a owl:Class ; + rdfs:label "Improper Neutralization of Special Elements in Data Query Logic" ; + d3f:cwe-id "CWE-943" ; + rdfs:subClassOf d3f:CWE-74 . + +d3f:CacheMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Processor Cache Memory" ; + d3f:accessed-by d3f:CentralProcessingUnit ; + d3f:definition "Cache memory is temporary storage that is more readily available to the processor than the computer's main memory source, located between the main memory and the processor. It is typically either integrated directly into the CPU chip (level 1 cache) or placed on a separate chip with a bus interconnect with the CPU (level 2 cache)." ; + d3f:may-contain d3f:ProcessSegment ; + d3f:modifies d3f:CacheMemory ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:ProcessSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:CacheMemory ], + [ a owl:Restriction ; + owl:onProperty d3f:accessed-by ; + owl:someValuesFrom d3f:CentralProcessingUnit ], + d3f:PrimaryStorage . + +d3f:CentralProcessingUnit a owl:Class, + owl:NamedIndividual ; + rdfs:label "Central Processing Unit" ; + d3f:contains d3f:ProcessorRegister ; + d3f:definition "A central processing unit (CPU), also called a central processor, main processor or just processor, is the electronic circuitry that executes instructions comprising a computer program. The CPU performs basic arithmetic, logic, controlling, and input/output (I/O) operations specified by the instructions in the program. This contrasts with external components such as main memory and I/O circuitry, and specialized processors such as graphics" ; + d3f:may-contain d3f:CacheMemory, + d3f:MemoryManagementUnit, + d3f:MemoryProtectionUnit ; + d3f:synonym "CPU", + "Central Processor", + "Main Processor" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:MemoryProtectionUnit ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ProcessorRegister ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:CacheMemory ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:MemoryManagementUnit ], + d3f:Processor . + +d3f:CommandHistoryLog a owl:Class, + owl:NamedIndividual ; + rdfs:label "Command History Log" ; + d3f:definition "A log of commands run in an operating system shell." ; + rdfs:seeAlso d3f:CommandLineInterface, + ; + rdfs:subClassOf d3f:EventLog . + +d3f:CompilerConfigurationFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Compiler Configuration File" ; + d3f:definition "A file containing Information used to configure the parameters and initial settings for a compiler." ; + rdfs:subClassOf d3f:ApplicationConfigurationFile . + +d3f:ConfigurationDatabaseRecord a owl:Class, + owl:NamedIndividual ; + rdfs:label "Configuration Database Record" ; + d3f:synonym "Configuration Record" ; + rdfs:subClassOf d3f:ConfigurationResource, + d3f:Record . + +d3f:ConfigurationInventory a d3f:ConfigurationInventory, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Configuration Inventory" ; + d3f:d3fend-id "D3-CI" ; + d3f:definition "Configuration inventory identifies and records the configuration of software and hardware and their components throughout the organization." ; + d3f:inventories d3f:ConfigurationResource ; + d3f:kb-article """## How it works + +The organization retrieves configuration information through means of SNMP (MIB records), WBEM (CIM records), other protocols, or custom scripts and captures that information in a repository, typically known as a Configuration Management Database (CMDB).\"""" ; + d3f:kb-reference d3f:Reference-Web-BasedEnterpriseManagement, + d3f:Reference-Windows-Management-Infrastructure, + d3f:Reference-Windows-Management-Instrumentation ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:inventories ; + owl:someValuesFrom d3f:ConfigurationResource ], + d3f:AssetInventory . + +d3f:CreateSocket a owl:Class, + owl:NamedIndividual ; + rdfs:label "Create Socket" ; + d3f:creates d3f:Pipe ; + d3f:definition "A create socket system call creates an endpoint for communication and returns a file descriptor that refers to that endpoint." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:Pipe ], + d3f:SystemCall . + +d3f:CreateThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Create Thread" ; + d3f:creates d3f:Thread ; + d3f:definition "Threads are an execution model that exists independently from a language, as well as a parallel execution model. They enable a program to control multiple different flows of work that overlap in time." ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:Thread ], + d3f:SystemCall . + +d3f:CryptographicKey a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cryptographic Key" ; + d3f:definition "In cryptography, a key is a piece of information (a parameter) that determines the functional output of a cryptographic algorithm. For encryption algorithms, a key specifies the transformation of plaintext into ciphertext, and vice versa for decryption algorithms. Keys also specify transformations in other cryptographic algorithms, such as digital signature schemes and message authentication codes." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformation . + +d3f:CyberSensor a owl:Class ; + rdfs:label "Cyber Sensor" ; + rdfs:subClassOf d3f:Sensor . + +d3f:DNSNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "DNS Network Traffic" ; + d3f:definition "DNS network traffic is network traffic related to queries and responses involving the Domain Name System. DNS traffic can involve clients, servers such as relays or resolvers. This includes only network traffic conforming to standard DNS protocol; not custom protocols." ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:DataExchangeMapping a d3f:DataExchangeMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Data Exchange Mapping" ; + d3f:d3fend-id "D3-DEM" ; + d3f:definition "Data exchange mapping identifies and models the organization's intended design for the flows of the data types, formats, and volumes between systems at the application layer." ; + d3f:kb-reference d3f:Reference-CatiaUAFPlugin, + d3f:Reference-TivoliApplicationDependencyDiscoverManager7_3_0DependenciesBetweenResources, + d3f:Reference-UnifiedArchitectureFrameworkUAF ; + d3f:maps d3f:DataDependency ; + d3f:synonym "Data Flow Mapping", + "Information Exchange Mapping" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:DataDependency ], + d3f:SystemMapping . + +d3f:DatabaseFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Database File" ; + rdfs:subClassOf d3f:File . + +d3f:Deceive a d3f:DefensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Deceive" ; + d3f:definition "The deceive tactic is used to advertise, entice, and allow potential attackers access to an observed or controlled environment." ; + d3f:display-order 3 ; + d3f:display-priority 0 ; + rdfs:subClassOf d3f:DefensiveTactic . + +d3f:DecisionTree a owl:Class, + owl:NamedIndividual ; + rdfs:label "Decision Tree" ; + d3f:d3fend-id "D3A-DT" ; + d3f:definition "Decision tree learning is a supervised learning approach used in statistics, data mining, and machine learning. In this formalism, a classification or regression decision tree is used as a predictive model to draw conclusions about a set of observations." ; + d3f:kb-article """## How it works + +A decision tree starts with a root node, which does not have any incoming branches. The outgoing branches from the root node then feed into the internal nodes, also known as decision nodes. Based on the available features, both node types conduct evaluations to form homogenous subsets, which are denoted by leaf nodes, or terminal nodes. The leaf nodes represent all the possible outcomes within the dataset. + +## Considerations + +While the basic underlying model is that of a decision tree, the decision tree node criteria, and the method for identifying splits varies significantly depending on the learning algorithm selected (e.g., CART, ID3, C4.5, C5.0, CHAID, MARS.) Extensions like linear and logistic trees can add additional expressiveness as well. + +## Key Test Considerations + +- **Machine Learning**: + + - **Verify the dataset quality**: Check the data to make sure it is + free of errors. Quantify the degree of missing values, + outliers, and noise in the data collection. If the data quality + is low, it may be difficult or impossible to create models and + systems with the desired performance. + + - **Verify development datasets are representative**: of expected + operational environment and data collection means. Compare + distributions of dataset features and labels with exploratory + data analysis and assess the difference in tests on training + data and tests on evaluation data (where the evaluation data + must be drawn from a representative dataset.) + + - **Use a variety of data sets**: where available and applicable, to + reflect different operating and environment conditions that are + likley to be be encountered. + + - **Use software libraries**: and tools built for ML where possible, so + that the underlying code is verified by prior use.** + + - **Diagnose model errors with domain SMEs**: Have problem domain + SMEs investigate model errors for conditions for which the model + may underperform and suggest refinements. + +- **Classification**: + + - **Use Standard Classification Performance Measures**: Not all of + the following may be necessary, but should be considered for + both verification (developmental test) and operational test + stages use: + + - **Accuracy**: The fraction of predictions that were corret. + + - **Precision**: The proportion of positive identifications that were correct. + + - **Recall**: The proportion of actual positive cases identified correctly. + + - **F-Measure**: Combines the preicion and recall into a single + score. It is the harmonic mean of the precision and recall. + + - **Receiver Operating Characteristic (ROC) Curve**: A ROC curve + shows the performance of a classification model at all + classification thresholds. It graphs the True Positive Rate + over the False Positive Rate. + + - **Area Under the ROC Curve (AUC)**: This measures the + two-dimensional area under the ROC Curve. AUC is + scale-invariant and classification-threshold invariant. + + - **ROC TP vs FP points**: In addition to a specific AUC score, + the performance at points + + - **Confusion Matrix**: A confusion matrix is a table layout that + allows the visualization of the performance of an + algorithm. Each row of the matrix represents the instances in + an actual class while each column represents the instances in + a predicted class, or vice versa. It is a special kind of + contingency table, with two dimensions ("actual" and + "predicted"), and identical sets of "classes" in both + dimensions (each combination of dimension and class is a + variable in the contingency table.) + + - **Prediction Bias**: The difference between the average of the + predicted labels and the average of the labels in the data + set. One should check for prediction bias when evaluating the + classifier's results. Causes of bias can include: + + - **Noisy data set**: Errors in original data can as the + collection method may have an underlying bias. + + - **Processing bug**: Errors in the data pipeline can + introduce bias. + + - **Biased training sample (unbalanced samples)**: Model + parameters may be skewed towards majority classes. + + - **Overly strong regularization**: Model may be underfitting + model and too simple. + + - **Proxy variables**: Model features may be highly + correlated. + +- **Supervised Learning**: + + - **Overfitting and Underfitting**: Overfitting occurs when the the + model built corresponds too closely or exactly to a particular + set of data, and thus may fail to fit to predict additional data + reliably. An overfitted model is a mathematical model that + contains more parameters than can be justified by the data. + Underfitting occurs when the model built does adequately capture + the patterns in the data. As an example, a linear model will + underfit a non-linear dataset. + + - **Sensitivity**: Perform N-fold Cross validation to indicate how + much sensitivity the algorithm has to data variation and to avoid + overfitting operational models. + +- **Decision Tree Learning**: + + - **Sensitive to unbalanced classes**: Examine and determine target + class balance; decision tree learning algorithms are especially + sensitive to unbalanced target classes. + + - **Consider decision boundaries**: Perform exploratory data + analysis to determine if decision boundaries lie alongaxes of + features. _Decision trees are ideal when decision boundaries can + be found that lie along axes of features._ + + - **Decision tree overfitting** may require tuning algorithm hyperparameters such as tree depth, max features used, max leaf nodes, etc. + + - **Pruning** may result in a more robust model in real-word applications. + + - **Missing values**: Inspect the data set to determine if there + are missing values and select a means to address them, either by + choosing an algorithm that works well or a way to impute the + value or eliminate the missing values in the data sensors or + pipeline. + +## Platforms, Tools, or Libraries + +- **scikit-learn**: includes tree algorithms for ID3, C4.5, C5.0, and CART. + +- **Weka**: includes J48 (C4.5), SimpleCart (CART), Logistic Model Trees, Naive Bayes Trees, and more. + +### Validation Approach +- Use operationally relevant data across the range of application's operating environment. +- Incorporate some kind of continuous validation to address concept drift and the need to retrain the model and/or check data quality. + +## References +1. Decision tree learning. (2023, May 30). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Decision_tree_learning). +2. Decision Trees. (n.d.). In _scikit-learn User Guide 1.2.2_. [Link](https://scikit-learn.org/stable/modules/tree.html). +3. Concept drift. (2023, April 17). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Concept_drift). +4. 8 Concept Drift Detection Methods. (n.d.). In _Aporia Learning Center_. [Link](https://www.aporia.com/learn/data-drift/concept-drift-detection-methods/).""" ; + rdfs:subClassOf d3f:Classification . + +d3f:DecoyArtifact a owl:Class, + owl:NamedIndividual ; + rdfs:label "Decoy Artifact" ; + d3f:definition "A decoy is an imitation digital artifact in any sense of a digital artifact, object, or phenomenon that is intended to deceive a cyber attacker's surveillance devices or mislead their evaluation. Examples include fake files, accounts, hosts (honeypots), and network segments (honeynets)." ; + d3f:may-contain d3f:DigitalArtifact ; + rdfs:seeAlso , + , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:DigitalArtifact ], + d3f:DigitalInformationBearer ; + skos:altLabel "Decoy", + "Decoy Object", + "Lure", + "Trap" . + +d3f:DecoyUserCredential a d3f:DecoyUserCredential, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Decoy User Credential" ; + d3f:d3fend-id "D3-DUC" ; + d3f:definition "A Credential created for the purpose of deceiving an adversary." ; + d3f:kb-article """## How it works +A detection analytic is developed to determine when a user uses decoy credentials. Subsequent actions by that user may be monitored or controlled by the defender. + +A credential may be: + * Domain username and password + * Local system username and password + +## Considerations +* Decoy credentials should be integrated with a larger decoy environment to ensure that when decoy credentials are compromised, the credentials are used to interact with a decoy asset that is being monitored. +* Continuous maintenance and updates are needed to ensure the legitimacy of the larger decoy environment and specifically the assets that utilize the decoy credentials.""" ; + d3f:kb-reference d3f:Reference-DecoyAndDeceptiveDataObjectTechnology_CymmetriaInc, + d3f:Reference-DecoyNetwork-BasedServiceForDeceivingAttackers-AmazonTechnologies, + d3f:Reference-SystemAndMethodForIdentifyingThePresenceOfMalwareUsingMini-trapsSetAtNetworkEndpoints_FidelisCybersecuritySolutionsInc ; + d3f:spoofs d3f:Credential ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:spoofs ; + owl:someValuesFrom d3f:Credential ], + d3f:DecoyObject . + +d3f:DescriptiveStatistics a owl:Class, + owl:NamedIndividual ; + rdfs:label "Descriptive Statistics" ; + d3f:d3fend-id "D3A-DS" ; + d3f:definition "Descriptive statistics provide simple summaries about the sample and about the observations that have been made." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Descriptive statistics. [Link](https://en.wikipedia.org/wiki/Descriptive_statistics)""" ; + rdfs:subClassOf d3f:StatisticalMethod . + +d3f:DirectoryService a owl:Class, + owl:NamedIndividual ; + rdfs:label "Directory Service" ; + d3f:definition "In computing, directory service or name service maps the names of network resources to their respective network addresses. It is a shared information infrastructure for locating, managing, administering and organizing everyday items and network resources, which can include volumes, folders, files, printers, users, groups, devices, telephone numbers and other objects. A directory service is a critical component of a network operating system. A directory server or name server is a server which provides such a service. Each resource on the network is considered an object by the directory server. Information about a particular resource is stored as a collection of attributes associated with that resource or object." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:NetworkService . + +d3f:DiskFormatting a d3f:DiskFormatting, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Disk Formatting" ; + d3f:d3fend-id "D3-DKF" ; + d3f:definition "Disk Formatting is the process of preparing a data storage device, such as a hard drive, solid-state drive, or USB flash drive, for initial use." ; + d3f:kb-article """### How it works + +This process involves setting up an empty file system on the disk, which includes creating a directory structure and initializing metadata structures. In cybersecurity, disk formatting can be used to remove all existing data on a disk, making it a clean slate for new data storage or to prevent unauthorized access to previously stored data.""" ; + d3f:kb-reference ; + d3f:modifies d3f:SecondaryStorage ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SecondaryStorage ], + d3f:ObjectEviction . + +d3f:EmailRule a owl:Class, + owl:NamedIndividual ; + rdfs:label "Email Rule" ; + d3f:definition "A configuration of an email application which is used to apply logical or data processing functions to data processed by the email application." ; + rdfs:subClassOf d3f:ApplicationRule . + +d3f:EmulatedFileAnalysis a d3f:EmulatedFileAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Emulated File Analysis" ; + d3f:analyzes d3f:DocumentFile, + d3f:ExecutableFile ; + d3f:d3fend-id "D3-EFA" ; + d3f:definition "Emulating instructions in a file looking for specific patterns." ; + d3f:kb-reference d3f:Reference-Network-levelPolymorphicShellcodeDetectionUsingEmulation ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:ExecutableFile ], + [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:DocumentFile ], + d3f:FileAnalysis . + +d3f:EndpointHealthBeacon a d3f:EndpointHealthBeacon, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Endpoint Health Beacon" ; + d3f:d3fend-id "D3-EHB" ; + d3f:definition "Monitoring the security status of an endpoint by sending periodic messages with health status, where absence of a response may indicate that the endpoint has been compromised." ; + d3f:kb-article """## How it works +Endpoints are configured to periodically generate and transmit a secure heartbeat that is delivered on a configured schedule and provides endpoint status information. Status information can include software details (version, configuration, etc), endpoint identification (MAC, IP address, machine ID) or other hardware/software configuration information. Interruption of the heartbeat can signal that the endpoint has been compromised. + +## Considerations +* Security of heartbeat messages to ensure message integrity +* Disappearance of the heartbeat could simply mean that the endpoint is powered off or intentionally disconnected from the network. Therefore other criteria may need to be used to accurately detect endpoint compromise. +* Attacker presence on the machine may leave the heartbeat intact. +* An attacker may determine the format of the heartbeat and continue to send it even after the machine is compromised.""" ; + d3f:kb-reference d3f:Reference-IntrusionDetectionUsingAHeartbeat_SophosLtd ; + d3f:monitors d3f:NetworkNode ; + d3f:synonym "Endpoint Health Telemetry" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:NetworkNode ], + d3f:OperatingSystemMonitoring . + +d3f:EvalFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Eval Function" ; + d3f:definition "Takes inputs of strings and evaluations them as expressions." ; + d3f:invokes d3f:Subroutine ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:Subroutine ], + d3f:Subroutine . + +d3f:FileSection a owl:Class, + owl:NamedIndividual ; + rdfs:label "File Section" ; + d3f:definition "A file section is one of the portions of a file in which the file is regarded as divided and where together the file sections constitute the whole file." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "File Part" . + +d3f:FreeMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Free Memory" ; + d3f:deletes d3f:MemoryBlock ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:MemoryBlock ], + d3f:SystemCall . + +d3f:Goal a owl:Class ; + rdfs:label "Goal" ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:High-dimensionClustering a owl:Class, + owl:NamedIndividual ; + rdfs:label "High-dimension Clustering" ; + d3f:d3fend-id "D3A-HDC" ; + d3f:definition "The cluster analysis of data with anywhere from a few dozen to many thousands of dimensions." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Clustering high-dimensional data. [Link](https://en.wikipedia.org/wiki/Clustering_high-dimensional_data)""" ; + rdfs:subClassOf d3f:ClusterAnalysis . + +d3f:HomoglyphDetection a d3f:HomoglyphDetection, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Homoglyph Detection" ; + d3f:analyzes d3f:Email, + d3f:URL ; + d3f:d3fend-id "D3-HD" ; + d3f:definition "Comparing strings using a variety of techniques to determine if a deceptive or malicious string is being presented to a user." ; + d3f:kb-article """## How it works +A homoglyph, in this context, is a deceptive string or word which looks like a trusted word, but is composed of different characters, for example: goooogle.com versus google.com. This is commonly found in phishing and typo squatting attacks where a human exploiting through a social engineering campaign. + +## Considerations +* In very large environments processing DNS queries can be computationally expensive due to the amount of traffic that is generated +* Legitimate companies and products use non-dictionary words in their names that could result in many false positives""" ; + d3f:kb-reference d3f:Reference-Computer-implementedMethodsAndSystemsForIdentifyingVisuallySimilarTextCharacterStrings_GreathornInc, + d3f:Reference-SystemAndMethodForDetectingHomoglyphAttacksWithASiameseConvolutionalNeuralNetwork_EndgameInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Email ], + [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:URL ], + d3f:IdentifierAnalysis . + +d3f:IPAddress a owl:Class, + owl:NamedIndividual ; + rdfs:label "IP Address" ; + d3f:definition "An Internet Protocol address (IP address) is a numerical label assigned to each device connected to a computer network that uses the Internet Protocol for communication.An IP address serves two main functions: host or network interface identification and location addressing. Internet Protocol version 4 (IPv4) defines an IP address as a 32-bit number. However, because of the growth of the Internet and the depletion of available IPv4 addresses, a new version of IP (IPv6), using 128 bits for the IP address, was standardized in 1998. IPv6 deployment has been ongoing since the mid-2000s." ; + d3f:identifies d3f:NetworkNode ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:NetworkNode ], + d3f:Identifier . + +d3f:In-memoryPasswordStore a owl:Class, + owl:NamedIndividual ; + rdfs:label "In-memory Password Store" ; + d3f:definition "A password store held in memory." ; + rdfs:subClassOf d3f:PasswordStore . + +d3f:InboundInternetMailTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Inbound Internet Mail Traffic" ; + d3f:definition "Inbound internet mail traffic is network traffic that is: (a) coming from a host outside a given network via an incoming connection to a host inside that same network, and (b) using a standard protocol for email." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:InboundInternetNetworkTraffic, + d3f:InboundNetworkTraffic, + d3f:MailNetworkTraffic . + +d3f:InboundNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Inbound Network Traffic" ; + d3f:definition "Inbound traffic is network traffic originating from another host (client), to the host of interest (server)." ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:InputDeviceAnalysis a d3f:InputDeviceAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Input Device Analysis" ; + d3f:analyzes d3f:InputDevice ; + d3f:d3fend-id "D3-IDA" ; + d3f:definition "Operating system level mechanisms to prevent abusive input device exploitation." ; + d3f:kb-article """## How it works + +Input Device Hardening techniques filter certain commands, or disable related operating system functionality. + +### Analytics + +All of these values can be analyzed and compared to a baseline: + +* Amount of input +* Duration of a single input +* Durations between inputs +* Value of input + +Context can also include: + +* User which is logged in, to include attributes such as physical location of the user +* Date and time +* System which is processing the input +* Source device of input, to include its properties (eg. manufacturer), configuration (eg. keyboard layout) and behavioral attributes of this device (eg. first use) +* Source system of input (local or remote system) +* Other hardware devices attached to the system + + +### Actions + +Actions can include: + +* Disabling the source device +* Sending an alert +* Locking the current session (eg. system screen lock, or returning to an authentication screen in a web app) and requiring one or more methods of authentication to continue +* Administratively disabling credentials for the account or the entire account -- the technique *Account Locking* + + +### Examples +A malicious input device sends many keystrokes with approximately the same delay between each. This does not match the normal cadence of input, and the device is disabled. + +Input to type the session user's name takes abnormally longer for each keystroke. The system is locked to the password prompt screen. + +A system receives key press events from two different devices -- one device sends keystrokes after the other has been idle for a long time. + +A system receives physical input in a user session, while that user has sent input from a device located out of the country in the past hour. + +Network traffic is suddenly routed through a new external device, and nearly the same volume of network traffic is subsequently sent out the previously existing interface. The new external device is disabled, and an alert is raised to investigate the network configuration for a potential compromise. + + +## Considerations + +Given some example of legitimate behavioral input patterns, attackers could mimic those input patterns, a technique which has been used in popular culture in the creation of Deepfake videos and [This Person Does Not Exist](https://thispersondoesnotexist.com).""" ; + d3f:kb-reference , + d3f:Reference-www.biometric-solutions.com_keystroke-dynamics ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:InputDevice ], + d3f:OperatingSystemMonitoring . + +d3f:IntranetIPCNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Intranet IPC Network Traffic" ; + d3f:definition "Intranet IPC network traffic is network traffic that does not cross a given network's boundaries and uses a standard inter-process communication (IPC) networking protocol." ; + d3f:may-contain d3f:File ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:File ], + d3f:IPCNetworkTraffic, + d3f:IntranetNetworkTraffic . + +d3f:IntrinsicallySemi-supervisedLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Intrinsically Semi-supervised Learning" ; + d3f:d3fend-id "D3A-ISSL" ; + d3f:definition "These methods directly optimize an objective function with components for labeled and unlabeled samples and do not rely on any intermediate steps or supervised base learners. Basically, these methods are extension of existing supervised methods to include the effect of unlabeled data samples in the objective function." ; + d3f:kb-article """## References +Beginner's Guide to Semi-Supervised Learning. Jashish Blog. [Link](http://jashish.com.np/blog/posts/beginners-guide-to-semi-supervised-learning/).""" ; + rdfs:subClassOf d3f:Semi-SupervisedLearning . + +d3f:JobFunctionAccessPatternAnalysis a d3f:JobFunctionAccessPatternAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Job Function Access Pattern Analysis" ; + d3f:analyzes d3f:Authorization ; + d3f:d3fend-id "D3-JFAPA" ; + d3f:definition "Detecting anomalies in user access patterns by comparing user access activity to behavioral profiles that categorize users by role such as job title, function, department." ; + d3f:kb-article """## How it works +Peer group analysis identifies functionally similar groups of actors (users or resources) based on categorizations such as job title, organizational hierarchy, or other attribute that indicates similarity of job function. Current user access activity is then compared to the appropriate peer group behavior profile to identify anomalies. + +## Considerations +Potential for false positives from anomalies that are not associated with malicious activity.""" ; + d3f:kb-reference d3f:Reference-AnomalyDetectionUsingAdaptiveBehavioralProfiles_SecuronixInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Authorization ], + d3f:UserBehaviorAnalysis . + +d3f:KerberosTicketGrantingTicket a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kerberos Ticket Granting Ticket" ; + d3f:definition "A ticket granting ticket issued by a Kerberos system; that is, a ticket that grants a user domain admin access." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:KerberosTicket, + d3f:TicketGrantingTicket . + +d3f:KernelProcessTable a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kernel Process Table" ; + d3f:definition "A data structure in the kernel which is a table containing all of the information that must be saved when the CPU switches from running one process to another in a multitasking system. It allows the operating system to track all the process's execution status, and contains the For every process managed by the kernel, there is a process control block (PCB) in the process table." ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:LogicProgramming a owl:Class, + owl:NamedIndividual ; + rdfs:label "Logic Programming" ; + d3f:d3fend-id "D3A-LP" ; + d3f:definition "Logic programming is a programming paradigm which is largely based on formal logic." ; + d3f:kb-article """## How it works +Any program written in a logic programming language is a set of sentences in logical form, expressing facts and rules about some problem domain. Major logic programming language families include Prolog, answer set programming (ASP) and Datalog. In all of these languages, rules are written in the form of clauses: + +H :- B_1, ..., B_n. + +## References +1. Logic programming. (2023, May 29). In _Wikipedia_. [Link]( https://en.wikipedia.org/wiki/Logic_programming)""" ; + rdfs:subClassOf d3f:SymbolicAI . + +d3f:MathematicalFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Mathematical Function" ; + d3f:definition "Computes mathematical expressions." ; + rdfs:subClassOf d3f:Subroutine . + +d3f:MemoryExtent a owl:Class ; + rdfs:label "Memory Extent" ; + rdfs:subClassOf d3f:DigitalInformation . + +d3f:MemoryWord a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Word" ; + d3f:definition "A memory word is the natural unit of data used by a particular computer processor design; a fixed-size piece of data handled as a unit by the instruction set or the hardware of the processor." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:MemoryExtent . + +d3f:MessageAuthentication a d3f:MessageAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Message Authentication" ; + d3f:authenticates d3f:UserToUserMessage ; + d3f:d3fend-id "D3-MAN" ; + d3f:definition "Authenticating the sender of a message and ensuring message integrity." ; + d3f:kb-article """## How it works + +### Digital Signature +Digital signatures are used to verifying a message is from the expected sender. In email, Secure/Multipurpose Internet Mail Extensions (S/MIME) protocol is typically used to digitally sign messages. A hash value of the sender's message is created and encrypted with the sender's private key to create a digital signature. The message and the digital signature are sent to the recipient where the sender's public key is used to decrypt the digital signature and compute the hash of the message. The computed hash is compared with the hash from the received message, and any difference in the hash values signify the message did not originate from the sender and has been alerted in transit. + +### Message Authentication Code (MAC) +MAC is a fixed size string that is appended to a message to provide message authentication and integrity. The sender MAC signing algorithm takes as input a secret symmetric key shared between sender and recipient and the message to calculate a short tag that is appended to the message. The recipient receives the message with the appended tag, and a MAC verification algorithm is run using the symmetric key to verify the message came from the stated sender and ensure the message has not been tampered with. + +## Considerations +- Public keys associated with digital signatures should be verified by a Certification Authority (CA) to prevent impersonation. The CA verifies the owner of a public key and puts the sender's identity and public key into a certificate that is signed by the CA. +- Digital signatures provide non-repudiation where a third party can verify the authenticity of the message using the sender's digital certificate signed by the CA. +- Symmetric keys must be exchanged securely via a private channel and management of new symmetric keys are needed for each pair of participants wishing to exchange messages.""" ; + d3f:kb-reference d3f:Reference-DomainKeysIdentifiedMail-Signatures-IETF, + d3f:Reference-SecureMultipurposeInternetMailExtensionsMIME-Version3.1 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:UserToUserMessage ], + d3f:MessageHardening . + +d3f:MessageHardening a d3f:MessageHardening, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Message Hardening" ; + d3f:d3fend-id "D3-MH" ; + d3f:definition "Email or Messaging Hardening includes measures taken to ensure the confidentiality and integrity of user to user computer messages." ; + d3f:enables d3f:Harden ; + d3f:synonym "Email Or Messaging Hardening" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Harden ], + d3f:DefensiveTechnique . + +d3f:MessageTransferAgent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Message Transfer Agent" ; + d3f:definition "A message transfer agent or mail transfer agent (MTA) or mail relay is software that transfers electronic mail messages from one computer to another using a client-server application architecture. An MTA implements both the client (sending) and server (receiving) portions of the Simple Mail Transfer Protocol." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:MailService ; + skos:altLabel "MTA", + "Mail Transfer Agent" . + +d3f:ModalLogic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Modal Logic" ; + d3f:d3fend-id "D3A-ML" ; + d3f:definition "Modal logic is a collection of formal systems developed to represent statements about necessity and possibility. It plays a major role in philosophy of language, epistemology, metaphysics, and natural language semantics." ; + d3f:kb-article """## References +1. Modal logic. (2023, June 4). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Modal_logic)""" ; + rdfs:subClassOf d3f:SymbolicAI . + +d3f:Model-freeReinforcementLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Model-free Reinforcement Learning" ; + d3f:d3fend-id "D3A-MFRL" ; + d3f:definition "In reinforcement learning (RL), a model-free algorithm (as opposed to a model-based one) is an algorithm which does not use the transition probability distribution (and the reward function) associated with the Markov decision process (MDP),which, in RL, represents the problem to be solved. The transition probability distribution (or transition model) and the reward function are often collectively called the \"model\" of the environment (or MDP), hence the name \"model-free\". A model-free RL algorithm can be thought of as an \"explicit\" trial-and-error algorithm. An example of a model-free algorithm is Q-learning." ; + d3f:kb-article """## References +Model-free (reinforcement learning). Wikipedia. [Link](https://en.wikipedia.org/wiki/Model-free_(reinforcement_learning)).)""" ; + rdfs:subClassOf d3f:ReinforcementLearning . + +d3f:MoveFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Move File" ; + d3f:definition "A system call to rename or move a file. Linux's rename() is an example of this kind of system call. Another way of handling it is to call a copy file system call followed by a delete file system call." ; + d3f:modifies d3f:FileSystemMetadata ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:FileSystemMetadata ], + d3f:SystemCall ; + skos:altLabel "Rename File" . + +d3f:NISTSP800-53ControlCatalog a owl:Class ; + rdfs:label "NIST SP 800-53 Control Catalog" ; + d3f:definition "A NIST SP 800-53 control catalog provides the entire set of security and privacy controls for a version of NIST SP 800-53." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-member ; + owl:someValuesFrom d3f:NISTControl ], + d3f:ControlCatalog . + +d3f:NetworkAccessMediation a d3f:NetworkAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Access Mediation" ; + d3f:d3fend-id "D3-NAM" ; + d3f:definition "Network access mediation is the control method for authorizing access to a system by a user (or a process acting on behalf of a user) communicating through a network, including a local area network, a wide area network, and the Internet." ; + d3f:isolates d3f:Network ; + d3f:kb-article """## How it works + +Network Access Mediation is a crucial process in telecommunications and IT networks that involves controlling access to network resources. It acts as an intermediary layer between network access requests and the actual network resources, ensuring that only authorized users and devices can access the network.""" ; + d3f:kb-reference d3f:Reference-WhatIsNetworkAccessControl ; + d3f:synonym "Network Access Control" ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:Network ], + d3f:AccessMediation . + +d3f:NetworkEvent a owl:Class ; + rdfs:label "Network Event" ; + d3f:definition "An event involving network communications within or between digital systems." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:DigitalEvent . + +d3f:NetworkResourceAccessMediation a d3f:NetworkResourceAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Resource Access Mediation" ; + d3f:d3fend-id "D3-NRAM" ; + d3f:definition "Control of access to organizational systems and services by users or processes over a network." ; + d3f:isolates d3f:NetworkResource ; + d3f:kb-article """## How it works + +Network Resource Access Control involves managing and regulating access to resources within an organization's network. This includes ensuring that only authorized users or processes can access specific systems or data, often through authentication and authorization mechanisms. Examples include accessing internal databases, file servers, or application services.""" ; + d3f:kb-reference d3f:Reference-NIST-Special-Publication-800-53-Revision-5 ; + d3f:synonym "Remote Access Control" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:NetworkResource ], + d3f:AccessMediation . + +d3f:OSAPITerminateProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Terminate Process" ; + d3f:invokes d3f:TerminateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:TerminateProcess ], + d3f:OSAPISystemFunction . + +d3f:OSAPIWriteMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Write Memory" ; + d3f:invokes d3f:WriteMemory ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WriteMemory ], + d3f:OSAPISystemFunction . + +d3f:OTActuator a owl:Class, + owl:NamedIndividual ; + rdfs:label "OT Actuator" ; + d3f:definition "An OT actuator is an industrial-grade actuator optimized for operational technology (OT) environments, such as SCADA or process-control systems. It tolerates harsher conditions, meets stricter safety and reliability standards, and integrates seamlessly with ICS protocols to enable real-time mechanical motion or adjustments in production lines and critical infrastructure." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Actuator . + +d3f:OTSensor a owl:Class, + owl:NamedIndividual ; + rdfs:label "OT Sensor" ; + d3f:definition "An OT Sensor is an industrial-grade sensing device engineered for operational technology (OT) environments (e.g. SCADA, ICS). It measures physical variables—such as pressure, temperature, or flow—under demanding conditions, converting them into reliable signals for real-time monitoring and process control loops." ; + rdfs:comment "Components of the sensor include a sensing element and may include a power source, display, housing, communication interface or signal processor." ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + , + , + ; + rdfs:subClassOf d3f:Sensor ; + skos:example "Level sensors, pressure sensors, temperature sensors, and flow measurement devices." . + +d3f:OfficeApplicationFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Office Application File" ; + d3f:definition "A document file in a format associated with an d3f:OfficeApplication." ; + rdfs:seeAlso d3f:OfficeApplication ; + rdfs:subClassOf d3f:DocumentFile . + +d3f:OrganizationMapping a d3f:OrganizationMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Organization Mapping" ; + d3f:d3fend-id "D3-OM" ; + d3f:definition "Organization mapping identifies and models the people, roles, and groups with an organization and the relations between them." ; + d3f:display-order 4 ; + d3f:kb-reference d3f:Reference-CatiaUAFPlugin, + d3f:Reference-OrganizationalManagementInSAPERPHCM, + d3f:Reference-UnifiedArchitectureFrameworkUAF ; + d3f:maps d3f:Dependency, + d3f:Organization, + d3f:Person ; + d3f:may-map d3f:OrganizationalActivity ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:Dependency ], + [ a owl:Restriction ; + owl:onProperty d3f:may-map ; + owl:someValuesFrom d3f:OrganizationalActivity ], + [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:Organization ], + [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:Person ], + d3f:OperationalActivityMapping . + +d3f:OrganizationalActivity a owl:Class, + owl:NamedIndividual ; + rdfs:label "Organizational Activity" ; + d3f:definition "An activity is a specific behavior representing a set of actions that may be accomplished by an agent." ; + d3f:synonym "Business Process", + "Mission Function" ; + rdfs:seeAlso , + , + , + , + "Mission Critical Function" ; + rdfs:subClassOf d3f:Plan . + +d3f:PartialMatching a owl:Class, + owl:NamedIndividual ; + rdfs:label "Partial Matching" ; + d3f:d3fend-id "D3A-PM" ; + d3f:definition "Partial string pattern matching is a special case of string pattern matching where one seeks to find a pattern within a larger string (text). It allows for the detection of patterns that occur as substrings or partial segments within the full string, rather than requiring an exact match across the entire string." ; + d3f:kb-article """## References +1. String-searching algorithm. (2023, April 8). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/String-searching_algorithm)""", + "Numeric pattern matching is a method of matching some defined pattern specification against a numeric value." ; + rdfs:subClassOf d3f:StringPatternMatching . + +d3f:PassiveCertificateAnalysis a d3f:PassiveCertificateAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Passive Certificate Analysis" ; + d3f:d3fend-id "D3-PCA" ; + d3f:definition "Collecting host certificates from network traffic or other passive sources like a certificate transparency log and analyzing them for unauthorized activity." ; + d3f:kb-article """## How it works +Certificates are analyzed outside of a TLS server connection using third-party secure update logs, domain name analysis and analytics. + +### Secure update certificate logs +* Certificate Logs +The key enabling feature is a secure service that maintains record logs of certificate activities. The logs allow users to only append certificates and never to delete or modify the log entries. The logs use Merkle Tree Hashes to ensure they have not been tampered with. The logging service also allows for public auditing by any user. + +The logging service, upon receipt of a certificate to log, will respond with a signed certificate timestamp (SCT). The SCT guarantees the certificate will be added to the log within the time specified. The SCT must be present with the certificate during a TLS handshake. + +* Certificate Monitoring +Certificate monitoring, of the logs, is typically done by the CA and they watch for suspicious certificate logging and unusual certificates or extensions or permissions. Monitors are also responsible for verifying the logs are accurate and public. + +* Certificate Auditors +Log integrity is verified by log auditors. Auditors make use of log proofs are used to validate the cryptographic hashes (Merkle Trees) that the log employs are consistent. In order to ensure consistency throughout multiple monitors and auditors, sharing a common logging service, gossip protocol is employed. + +### Phishing domain name analysis +* A curated corpus of known benign domains and phishing domain names is used as training text for machine learning. Through the use of feature set extraction, vectors labels are created with scoring to indicated if they are considered benign or phishing domains. + +* A stream of new or updated SSL certificates with fully qualified domain names (FQDN) is analyzed against the feature vectors and a predictive model determines a score for the domains. The scoring considers distance measures such as Levenshtein distance to help in determining the final label score. Supervised learning is also employed using the curated domains of benign and phishing domains. + +* Subdomain phishing analysis, prepending a trusted domain to a phishing domain, and regular expression comparisons are also used in the label scoring model. A tunable measure is used to determine the threshold for alerting. This measure helps to balance between precision and recall measures. + +## Considerations +* Some entity will need to run the logging service and a trusted entity is preferred. +* Certificate Authorities will likely need to monitor the logging service for consistency. +* Certificate revocation is unchanged and remains outside of Certificate Transparency, but certificates needing to be revoked are visible. +* Technique dependent of reliable feed of new and updated certificates +* Some certificate authorities allow for certificates to be registered with wildcards in the FQDN and thus will fail some of the subdomain scoring +* Phishing HTTP domains will not be discovered""" ; + d3f:kb-reference d3f:Reference-CertificateTransparency, + d3f:Reference-StreamingPhish ; + rdfs:subClassOf d3f:CertificateAnalysis . + +d3f:PasswordStore a owl:Class, + owl:NamedIndividual ; + rdfs:label "Password Store" ; + d3f:definition "A user repository of account passwords, often accessed via a password manager." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:PasswordDatabase . + +d3f:PhysicalLocation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Physical Location" ; + d3f:definition "The terms location [here, a physical location] and place in geography are used to identify a point or an area on the Earth's surface or elsewhere. The term location generally implies a higher degree of certainty than place, which often indicates an entity with an ambiguous boundary, relying more on human or social attributes of place identity and sense of place than on geometry. The distinction between space and place is considered a central concern of geography, and has been addressed by scholars such as Yi-Fu Tuan and John Agnew." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:Plan a owl:Class ; + rdfs:label "Plan" ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:ProcessImage a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Image" ; + d3f:contains d3f:ProcessSegment ; + d3f:definition "A process image is a copy of a given process's state at a given point in time. It is often used to create persistence within an otherwise volatile system." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ProcessSegment ], + d3f:ComputingImage . + +d3f:ProtocolMetadataAnomalyDetection a d3f:ProtocolMetadataAnomalyDetection, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Protocol Metadata Anomaly Detection" ; + d3f:analyzes d3f:NetworkTraffic ; + d3f:d3fend-id "D3-PMAD" ; + d3f:definition "Collecting network communication protocol metadata and identifying statistical outliers." ; + d3f:kb-article """## How it works +Network protocol metadata is first collected and processed in real-time or post-facto. Metadata may include packet header information or information about a session (ex. time between requests/responses). Metadata is then grouped based on shared characteristics and those groups are compared to each other. If particular metadata differs significantly from other data, an alert is generated, identifying the network event as anomalous. Anomalous activity may indicate unauthorized activity. + +## Considerations +Metadata collection on enterprises can yield large data sets. Storage, indexing, querying, and aging should be considered prior to implementation.""" ; + d3f:kb-reference d3f:Reference-MethodAndSystemForDetectingThreatsUsingMetadataVectors_VECTRANETWORKSInc, + d3f:Reference-MethodAndSystemForDetectingThreatsUsingPassiveClusterMapping_VectraNetworksInc, + d3f:Reference-SystemForImplementingThreatDetectionUsingDailyNetworkTrafficCommunityOutliers_VECTRANETWORKSInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:PublicKey a owl:Class, + owl:NamedIndividual ; + rdfs:label "Public Key" ; + d3f:definition "A public key can be disseminated widely as part of an asymmetric cryptography framework and be used to encrypt messages to send to the public key's owner or to authenticate signed messages from that sender." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:AsymmetricKey . + +d3f:RankCorrelationCoefficient a owl:Class, + owl:NamedIndividual ; + rdfs:label "Rank Correlation" ; + d3f:d3fend-id "D3A-RC" ; + d3f:definition "A rank correlation is any of several statistics that measure an ordinal association-the relationship between rankings of different ordinal variables or different rankings of the same variable, where a \"ranking\" is the assignment of the ordering labels \"first\", \"second\", \"third\", etc. to different observations of a particular variable." ; + d3f:kb-article "Wikipedia. (n.d.). Rank correlation. [Link](https://en.wikipedia.org/wiki/Rank_correlation)" ; + rdfs:subClassOf d3f:Correlation . + +d3f:ReadFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Read File" ; + d3f:definition "A program that needs to access data from a file stored in a file system uses the read system call. The file is identified by a file descriptor that is normally obtained from a previous call to open. This system call reads in data in bytes, the number of which is specified by the caller, from the file and stores then into a buffer supplied by the calling process." ; + d3f:reads d3f:File ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:File ], + d3f:SystemCall . + +d3f:Reference-CNNSI-4009 a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Committee on National Security Systems (CNSS) Glossary" ; + d3f:has-link "https://rmf.org/wp-content/uploads/2017/10/CNSSI-4009.pdf"^^xsd:anyURI ; + d3f:kb-abstract "[The CNSS Glossary is a jointly curated glossary of terms for National Security Systems by DoD, IC, and Civil Agencies (e.g., NIST)" ; + d3f:kb-organization "Committee on National Security Systems (CNSS)" ; + d3f:kb-reference-of d3f:PhysicalAccessMediation ; + d3f:kb-reference-title "Committee on National Security Systems (CNSS) Glossary" . + +d3f:Reference-Finding_phishing_sites a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Finding phishing sites" ; + d3f:has-link "https://patents.google.com/patent/US8839418B2/"^^xsd:anyURI ; + d3f:kb-author "Geoffrey John Hulten, Paul Stephen Rehfuss, Robert Rounthwaite, Joshua Theodore Goodman, Gopalakrishnan Seshadrinathan, Anthony P. Penta, Manav Mishra, Roderic C. Deyo, Elliott Jeb Haber, David Aaron Ward Snelling" ; + d3f:kb-reference-of d3f:DomainNameReputationAnalysis, + d3f:IPReputationAnalysis, + d3f:URLReputationAnalysis ; + d3f:kb-reference-title "Finding phishing sites" . + +d3f:Reference-HostIntrusionPreventionSystemUsingSoftwareAndUserBehaviorAnalysis_SophosLtd a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Host intrusion prevention system using software and user behavior analysis - Sophos Ltd" ; + d3f:has-link "https://patents.google.com/patent/US20110023115A1"^^xsd:anyURI ; + d3f:kb-abstract "In embodiments of the present invention improved capabilities are described for threat detection using a behavioral-based host-intrusion prevention method and system for monitoring a user interaction with a computer, software application, operating system, graphic user interface, or some other component or client of a computer network, and performing an action to protect the computer network based at least in part on the user interaction and a computer code process executing during or in association with a computer usage session." ; + d3f:kb-author "Clifford C. Wright" ; + d3f:kb-mitre-analysis """The patent describes a technique for performing behavior based threat detection. User and code behavior data is collected and stored to create baseline user and code behavior profiles. User behavior data collected over a user session or over multiple sessions can include a user: + +* clicking on a link +* scrolling down a page +* opening or closing a window +* downloading a file +* saving a file +* running a file +* typing a keyword + +Code behavior monitored includes code: + +* copying itself to a system folder +* setting a run key to itself in the registry +* setting a second runkey to itself in the registry in +a different location +* disabling OS tools in the registry +* opening a hidden file + +The user interaction and the code process executed during the user session are monitored and compared with predetermined malicious behavior profiles that are typically present in a malicious user session. The predetermined collection of malicious behaviors are created based on analysis of families of malware in run time in a threat research facility. If a match is made an action is taken that can include isolating the computer on which the user interaction occurs and limiting network access to or from the computer.""" ; + d3f:kb-organization "Sophos Ltd" ; + d3f:kb-reference-of d3f:ResourceAccessPatternAnalysis, + d3f:SystemDaemonMonitoring, + d3f:WebSessionActivityAnalysis ; + d3f:kb-reference-title "Host intrusion prevention system using software and user behavior analysis" . + +d3f:Reference-NIST-Special-Publication-800-53-Revision-5 a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - NIST Special Publication 800-53 Revision 5 - Security and Privacy Controls for Information Systems and Organizations" ; + d3f:has-link "https://doi.org/10.6028/NIST.SP.800-53r5"^^xsd:anyURI ; + d3f:kb-abstract "This publication provides a catalog of security and privacy controls for information systems and organizations to protect organizational operations and assets, individuals, other organizations, and the Nation from a diverse set of threats and risks, including hostile attacks, human errors, natural disasters, structural failures, foreign intelligence entities, and privacy risks. The controls are flexible and customizable and implemented as part of an organization-wide process to manage risk. The controls address diverse requirements derived from mission and business needs, laws, executive orders, directives, regulations, policies, standards, and guidelines. Finally, the consolidated control catalog addresses security and privacy from a functionality perspective (i.e., the strength of functions and mechanisms provided by the controls) and from an assurance perspective (i.e., the measure of confidence in the security or privacy capability provided by the controls). Addressing functionality and assurance helps to ensure that information technology products and the systems that rely on those products are sufficiently trustworthy." ; + d3f:kb-organization "NIST" ; + d3f:kb-reference-of d3f:AccessPolicyAdministration, + d3f:EndpointBasedWebServerAccessMediation, + d3f:NetworkResourceAccessMediation, + d3f:PasswordAuthentication, + d3f:ProxyBasedWebServerAccessMediation, + d3f:RemoteFileAccessMediation, + d3f:WebSessionAccessMediation ; + d3f:kb-reference-title "NIST Special Publication 800-53 Revision 5 - Security and Privacy Controls for Information Systems and Organizations" . + +d3f:RemoteSession a owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote Session" ; + d3f:definition "A remote login session is a login session where a client has logged in from their local host machine to a server via a network." ; + rdfs:subClassOf d3f:NetworkSession . + +d3f:ResourceAccess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Resource Access" ; + d3f:definition "Ephemeral digital artifact comprising a request of a resource and any response from that resource." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:UserAction . + +d3f:ResourceFork a owl:Class, + owl:NamedIndividual ; + rdfs:label "Resource Fork" ; + d3f:definition "The resource fork is a fork or section of a file on Apple's classic Mac OS operating system, which was also carried over to the modern macOS for compatibility, used to store structured data along with the unstructured data stored within the data fork." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:FileSection . + +d3f:RestoreAccess a d3f:RestoreAccess, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore Access" ; + d3f:d3fend-id "D3-RA" ; + d3f:definition "Restoring an entity's access to resources." ; + d3f:enables d3f:Restore ; + d3f:kb-reference d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Restore ], + d3f:DefensiveTechnique . + +d3f:ScheduledJobAnalysis a d3f:ScheduledJobAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Scheduled Job Analysis" ; + d3f:analyzes d3f:JobSchedule ; + d3f:d3fend-id "D3-SJA" ; + d3f:definition "Analysis of source files, processes, destination files, or destination servers associated with a scheduled job to detect unauthorized use of job scheduling." ; + d3f:kb-article """## How it works +Scheduled job execution can be utilized by adversaries for the purpose of persistence, conducting remote execution, or gaining privileges. Details of a scheduled job such as associated source files, processes, destination files, or destination servers are first identified and analyzed and then compared against an anti-malware signature database, whitelist, or reputation server. For example, a file associated with a scheduled job to be executed at a specified time or a remote server that is accessed as part of a scheduled task is compared against an anti-malware signature database, whitelist, or reputation server, and if a match is found, execution is denied and an alert is generated. + +In addition to traditional scheduled jobs, triggers can be set to execute a specific command after detecting a specific event in the system, such as with WMI Event Subscriptions in Windows. + +## Considerations +Jobs can be scheduled in many different and sometimes creative ways through operating system capabilities.""" ; + d3f:kb-reference d3f:Reference-ExecutionWithAT_MITRE, + d3f:Reference-ExecutionWithSchtasks_MITRE, + d3f:Reference-PreventingExecutionOfTaskScheduledMalware_McAfeeLLC ; + d3f:synonym "Scheduled Job Execution" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:JobSchedule ], + d3f:OperatingSystemMonitoring . + +d3f:ScriptExecutionAnalysis a d3f:ScriptExecutionAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Script Execution Analysis" ; + d3f:analyzes d3f:ScriptApplicationProcess ; + d3f:d3fend-id "D3-SEA" ; + d3f:definition "Analyzing the execution of a script to detect unauthorized user activity." ; + d3f:kb-article """## How it works +Software installed on the host system hooks into a scripting engine to intercept commands before they are executed and block commands if they are determined to be harmful. Pattern matching is used to identify unauthorized commands or in the case of script files, a hash of the file is compared against hashes of known unauthorized script files. + +## Considerations +List of known unauthorized script files or regular expression patterns must be kept up to date to ensure detection of new threats.""" ; + d3f:kb-reference d3f:Reference-DetectingScript-basedMalware_CrowdstrikeInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:ScriptApplicationProcess ], + d3f:ProcessAnalysis . + +d3f:SegmentAddressOffsetRandomization a d3f:SegmentAddressOffsetRandomization, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Segment Address Offset Randomization" ; + d3f:d3fend-id "D3-SAOR" ; + d3f:definition "Randomizing the base (start) address of one or more segments of memory during the initialization of a process." ; + d3f:kb-article """## How it works + +Many application exploits rely on an attacker specifying a location in memory, which points to data or code used by the attacker. If the addresses are changed each time the program is run, then it becomes more difficult for the attacker to determine the location that will contain the code they wish to run. + +Imported modules may be similarly realigned if their default memory addresses conflict with other modules, in a process known as "rebasing." Just as not all code is built for participation in ASLR, not all modules can be rebased; instead, modules must indicate whether they implement support for rebasing. Such information to relocate the executable is typically stored in the ".reloc" segment -- each of the addresses pointed to in this segment has its address increased by the amount of the offset. +(An alternative method for relocation would be to add an amount to a global variable each time -- leading to less overhead in the module load, but more for each access. Still another implementation could instead contain code to deference each changeable memory location on the fly, so that each of the references do not need to be updated. + + +## Considerations + +As the offset for each segment is constant, it is possible to guess at the value of the address given the address of another variable. Alternatively, memory pointers may be kept around, which contain the address of another variable. +Another bypass technique is known as an "egg hunt," whereby the attacker searches for a rather unique piece of the data or code in memory to determine its likely address. + +The program needs to store these addresses for the functions somewhere. In Linux, the PLT contains a "trampoline" to these addresses. If an attacker desires to jump to the start of an existing function, they can jump directly to the trampoline anyway, and may have the opportunity to provide their own stack frame to the function with a write to the stack. If they overwrite a saved stack pointer which is loaded back into memory, or execute a function, that changes the address of a stack pointer. + +If an attacker wants to inject some data into the program, for example as a parameter to a known function that is not under ASLR or a pointer to a trampoline function in the PLT, then they can repeat the data until they exceed the range of ASLR coverage, which on 32-bit systems is accomplishable in a few seconds with a heap spray. Microsoft's EMET and Windows 10 Exploit Guard can pre-allocate particular addresses that are commonly used in heap sprays. However, in many products, there does not seem to be nearly a complete coverage of such addresses, which only need to be executable and in the range of the heap; 0x0c0c0c0c is such an address that is commonly used for the x86 processor architecture, as when executed it only performs a numeric operation to a register four times.""" ; + d3f:kb-reference d3f:Reference-DYNAMICBASE_UseAddressSpaceLayoutRandomization_MicrosoftDocs, + d3f:Reference-HowASLRProtectsLinuxSystemsFromBufferOverflowAttacks_NetworkWorld ; + d3f:obfuscates d3f:ProcessSegment ; + d3f:synonym "ASLR", + "Address Space Layout Randomization" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:obfuscates ; + owl:someValuesFrom d3f:ProcessSegment ], + d3f:ApplicationHardening . + +d3f:Sensor a owl:Class ; + rdfs:label "Sensor" ; + d3f:definition "In the broadest definition, a sensor is a device, module, machine, or subsystem that detects events or changes in its environment and sends the information to other electronics, frequently a computer." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:D3FENDCore, + d3f:DigitalInformationBearer . + +d3f:ServiceDependencyMapping a d3f:ServiceDependencyMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Service Dependency Mapping" ; + d3f:d3fend-id "D3-SVCDM" ; + d3f:definition "Service dependency mapping determines the services on which each given service relies." ; + d3f:kb-article """## How it works +The organization collects and models architectural information about the services and consumers of services and maps the dependencies between the services. + +## Considerations +* Architectural design artifacts and SMEs may need to be consulted to determine if dependencies are intended or otherwise essential. +* Service dependencies for critical systems--those supporting critical organizational activities--should be prioritized for supply chain risk analysis. +* Service dependencies in cloud or microservice architectures may be discovered using distributed tracing capabilities""" ; + d3f:kb-reference d3f:Reference-CatiaUAFPlugin, + d3f:Reference-TivoliApplicationDependencyDiscoverManager7_3_0DependenciesBetweenResources, + d3f:Reference-UnifiedArchitectureFrameworkUAF ; + d3f:maps d3f:ServiceDependency ; + d3f:synonym "Distributed Tracing" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:ServiceDependency ], + d3f:SystemMapping . + +d3f:SharedComputer a owl:Class ; + rdfs:label "Shared Computer" ; + d3f:definition "A computer whose resources are intended to be shared widely." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ClientComputer . + +d3f:Shim a owl:Class, + owl:NamedIndividual ; + rdfs:label "Shim" ; + d3f:definition "In computer programming, a shim is a small library that transparently intercepts API calls and changes the arguments passed, handles the operation itself, or redirects the operation elsewhere. Shims can be used to support an old API in a newer environment, or a new API in an older environment. Shims can also be used for running programs on different software platforms than those for which they were developed." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Software . + +d3f:SoftwareInventory a d3f:SoftwareInventory, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Software Inventory" ; + d3f:d3fend-id "D3-SWI" ; + d3f:definition "Software inventorying identifies and records the software items in the organization's architecture." ; + d3f:inventories d3f:Software ; + d3f:kb-article """## How it works +Administrators collect information on software items in their architecture using a variety of administrative and management tools that query network nodes for information. In limited cases, where such queries are not supported or provide specific information of interest, an administrator may also collect this information through network enumeration methods to determine services responding on network nodes. + +## Considerations +* Scanning and probing techniques using mapping tools can result in side effects to information technology (IT) and operational technology (OT) systems. +* An adversary conducting network enumeration may engage in activities that parallel normal software inventorying activities, but would require escalating to admin privileges for most of the operations requiting administrative tools. + +## Examples + +Application-layer discovery: + +* Simple Network Management Protocol (SNMP) collects MIB information +* Web-based Enterprise Management (WBEM) collects CIM information + * Windows Management Instrumentation (WMI) + * Windows Management Infrastructure (MI)""" ; + d3f:kb-reference d3f:Reference-Web-BasedEnterpriseManagement, + d3f:Reference-Windows-Management-Infrastructure, + d3f:Reference-Windows-Management-Instrumentation ; + d3f:synonym "Software Discovery", + "Software Inventorying" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:inventories ; + owl:someValuesFrom d3f:Software ], + d3f:AssetInventory . + +d3f:StackFrameCanaryValidation a d3f:StackFrameCanaryValidation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Stack Frame Canary Validation" ; + d3f:d3fend-id "D3-SFCV" ; + d3f:definition "Comparing a value stored in a stack frame with a known good value in order to prevent or detect a memory segment overwrite." ; + d3f:kb-article """## How it works + +This defense must be applied at compile-time, or via a patch to the program binary. Stack Frame Canary Verification inserts instructions at the prologue and epilogue of desired functions. In the prologue, a canary value, typically with the same size as the register size, is stored in the system of record and on the stack. Typically, the canary is loaded to where it has a memory address just below that of the saved instruction pointer and base pointer. In the epilogue, the canary value stored on the stack and, is compared to the canary value in the system of record. If the values are different, other techniques such as those in Process Eviction might be invoked, such as Process Termination to end the current process, or Executable Blacklisting to blacklist the potentially vulnerable or malfunctioning executable. + +Stack Frame Canary Verification is commonly used to detect potential tampering of a saved register value on the stack before it has been restored. Examples of registers with values commonly saved to the stack include the instruction pointer and the base pointer. + +The canary should be stored between where the start of a buffer overrun is likely, and the data to protect, in cases where the buffer size increases it will overwrite the data to be protected. + +On most processor architectures, including x86, x64, and ARM, a "push" operation to store data to the stack grows the stack towards a lower memory address. As in these architectures, saved register values are stored to the stack at a point in time just before space is made for the local function variables, the saved register values have a higher address than that of the local function variables. Values at increasing indexes of a buffer are written to increasing memory addresses; therefore, an overwrite in the local variable buffer could overwrite saved register values, and a stack canary between these two would be useful in detecting an overwrite. + +On some other processor architectures such as the B5000, the stack grows towards increasing memory addresses, and some architectures, such as System Z and RCA1802A, stack direction can be chosen. If the stack grows towards increasing memory addresses, while this architecture inherently provides more protection against a saved register being overwritten, other data including local function variables might be overwritten. + + +## Considerations + +There are several ways that the protection provided by a canary could be rendered ineffective. + +### Performing a malicious action before the canary is checked + +If the attacker alters the memory in such a way that it performs a malicious action before the epilogue is called, then this protection will not be effective. This includes altering the logic of the program by altering the values of local variables stored on the function stack, or by causing an exception and exploiting the exception mechanism such as the SEH (Structured Exception Handling) mechanism on Windows. + +### Determining the canary value + +Determining the canary value is possible through reading memory either for the code used to check the canary, or from the stored canary value itself in a stack frame. + +### Changing the canary value + +A vulnerability such as a write-what-where condition that allows one to write data after the canary in the stack, would allow control of the value of the saved instruction pointer without needing to know the canary value.""" ; + d3f:kb-reference d3f:Reference-GS_BufferSecurityCheck_MicrosoftDocs, + d3f:Reference-StackSmashingProtection_StackGuard_RedHat ; + d3f:validates d3f:StackFrame ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:validates ; + owl:someValuesFrom d3f:StackFrame ], + d3f:ApplicationHardening . + +d3f:Summarizing a owl:Class ; + rdfs:label "Summarizing" ; + rdfs:subClassOf d3f:AnalyticalPurpose . + +d3f:SystemFirewallConfiguration a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Firewall Configuration" ; + d3f:configures d3f:Host-basedFirewall ; + d3f:definition "The configuration for a individual host operating system's firewall." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:configures ; + owl:someValuesFrom d3f:Host-basedFirewall ], + d3f:OperatingSystemConfigurationComponent . + +d3f:SystemPasswordDatabase a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Password Database" ; + d3f:definition "A password database used by a system service or process to authenticate users (e.g., Security Account Manager)" ; + rdfs:subClassOf d3f:PasswordDatabase . + +d3f:T1056 a owl:Class ; + rdfs:label "Input Capture" ; + d3f:attack-id "T1056" ; + d3f:definition "Adversaries may use methods of capturing user input to obtain credentials or collect information. During normal system usage, users often provide credentials to various different locations, such as login pages/portals or system dialog boxes. Input capture mechanisms may be transparent to the user (e.g. [Credential API Hooking](https://attack.mitre.org/techniques/T1056/004)) or rely on deceiving the user into providing input into what they believe to be a genuine service (e.g. [Web Portal Capture](https://attack.mitre.org/techniques/T1056/003))." ; + rdfs:subClassOf d3f:CollectionTechnique, + d3f:CredentialAccessTechnique . + +d3f:T1078 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Valid Accounts" ; + d3f:attack-id "T1078" ; + d3f:definition "Adversaries may obtain and abuse credentials of existing accounts as a means of gaining Initial Access, Persistence, Privilege Escalation, or Defense Evasion. Compromised credentials may be used to bypass access controls placed on various resources on systems within the network and may even be used for persistent access to remote systems and externally available services, such as VPNs, Outlook Web Access, network devices, and remote desktop.(Citation: volexity_0day_sophos_FW) Compromised credentials may also grant an adversary increased privilege to specific systems or access to restricted areas of the network. Adversaries may choose not to use malware or tools in conjunction with the legitimate access those credentials provide to make it harder to detect their presence." ; + d3f:produces d3f:Authentication, + d3f:Authorization ; + d3f:uses d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:UserAccount ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Authentication ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:Authorization ], + d3f:DefenseEvasionTechnique, + d3f:InitialAccessTechnique, + d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:T1087 a owl:Class ; + rdfs:label "Account Discovery" ; + d3f:attack-id "T1087" ; + d3f:definition "Adversaries may attempt to get a listing of valid accounts, usernames, or email addresses on a system or within a compromised environment. This information can help adversaries determine which accounts exist, which can aid in follow-on behavior such as brute-forcing, spear-phishing attacks, or account takeovers (e.g., [Valid Accounts](https://attack.mitre.org/techniques/T1078))." ; + rdfs:seeAlso d3f:T1136 ; + rdfs:subClassOf d3f:DiscoveryTechnique . + +d3f:T1090 a owl:Class ; + rdfs:label "Proxy" ; + d3f:attack-id "T1090" ; + d3f:definition "Adversaries may use a connection proxy to direct network traffic between systems or act as an intermediary for network communications to a command and control server to avoid direct connections to their infrastructure. Many tools exist that enable traffic redirection through proxies or port redirection, including [HTRAN](https://attack.mitre.org/software/S0040), ZXProxy, and ZXPortMap. (Citation: Trend Micro APT Attack Tools) Adversaries use these types of proxies to manage command and control communications, reduce the number of simultaneous outbound network connections, provide resiliency in the face of connection loss, or to ride over existing trusted communications paths between victims to avoid suspicion. Adversaries may chain together multiple proxies to further disguise the source of malicious traffic." ; + rdfs:subClassOf d3f:CommandAndControlTechnique . + +d3f:T1110 a owl:Class ; + rdfs:label "Brute Force" ; + d3f:attack-id "T1110" ; + d3f:definition "Adversaries may use brute force techniques to gain access to accounts when passwords are unknown or when password hashes are obtained.(Citation: TrendMicro Pawn Storm Dec 2020) Without knowledge of the password for an account or set of accounts, an adversary may systematically guess the password using a repetitive or iterative mechanism.(Citation: Dragos Crashoverride 2018) Brute forcing passwords can take place via interaction with a service that will check the validity of those credentials or offline against previously acquired credential data, such as password hashes." ; + rdfs:subClassOf d3f:CredentialAccessTechnique . + +d3f:T1136 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Create Account" ; + d3f:attack-id "T1136" ; + d3f:creates d3f:UserAccount ; + d3f:definition "Adversaries may create an account to maintain access to victim systems.(Citation: Symantec WastedLocker June 2020) With a sufficient level of access, creating such accounts may be used to establish secondary credentialed access that do not require persistent remote access tools to be deployed on the system." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:UserAccount ], + d3f:PersistenceTechnique . + +d3f:T1496 a owl:Class ; + rdfs:label "Resource Hijacking" ; + d3f:attack-id "T1496" ; + d3f:definition "Adversaries may leverage the resources of co-opted systems to complete resource-intensive tasks, which may impact system and/or hosted service availability." ; + rdfs:subClassOf d3f:ImpactTechnique . + +d3f:T1550 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Use Alternate Authentication Material" ; + d3f:accesses d3f:AuthenticationService ; + d3f:attack-id "T1550" ; + d3f:definition "Adversaries may use alternate authentication material, such as password hashes, Kerberos tickets, and application access tokens, in order to move laterally within an environment and bypass normal system access controls." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:AuthenticationService ], + d3f:DefenseEvasionTechnique, + d3f:LateralMovementTechnique . + +d3f:T1557 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Adversary-in-the-Middle" ; + d3f:attack-id "T1557" ; + d3f:definition "Adversaries may attempt to position themselves between two or more networked devices using an adversary-in-the-middle (AiTM) technique to support follow-on behaviors such as [Network Sniffing](https://attack.mitre.org/techniques/T1040), [Transmitted Data Manipulation](https://attack.mitre.org/techniques/T1565/002), or replay attacks ([Exploitation for Credential Access](https://attack.mitre.org/techniques/T1212)). By abusing features of common networking protocols that can determine the flow of network traffic (e.g. ARP, DNS, LLMNR, etc.), adversaries may force a device to communicate through an adversary controlled system so they can collect information or perform additional actions.(Citation: Rapid7 MiTM Basics)" ; + d3f:produces d3f:NetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:CollectionTechnique, + d3f:CredentialAccessTechnique . + +d3f:T1566 a owl:Class ; + rdfs:label "Phishing" ; + d3f:attack-id "T1566" ; + d3f:definition "Adversaries may send phishing messages to gain access to victim systems. All forms of phishing are electronically delivered social engineering. Phishing can be targeted, known as spearphishing. In spearphishing, a specific individual, company, or industry will be targeted by the adversary. More generally, adversaries can conduct non-targeted phishing, such as in mass malware spam campaigns." ; + rdfs:subClassOf d3f:InitialAccessTechnique . + +d3f:T1567 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration Over Web Service" ; + d3f:attack-id "T1567" ; + d3f:definition "Adversaries may use an existing, legitimate external Web service to exfiltrate data rather than their primary command and control channel. Popular Web services acting as an exfiltration mechanism may give a significant amount of cover due to the likelihood that hosts within a network are already communicating with them prior to compromise. Firewall rules may also already exist to permit traffic to these services." ; + d3f:produces d3f:OutboundInternetWebTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetWebTraffic ], + d3f:ExfiltrationTechnique . + +d3f:T1587 a owl:Class ; + rdfs:label "Develop Capabilities" ; + d3f:attack-id "T1587" ; + d3f:definition "Adversaries may build capabilities that can be used during targeting. Rather than purchasing, freely downloading, or stealing capabilities, adversaries may develop their own capabilities in-house. This is the process of identifying development requirements and building solutions such as malware, exploits, and self-signed certificates. Adversaries may develop capabilities to support their operations throughout numerous phases of the adversary lifecycle.(Citation: Mandiant APT1)(Citation: Kaspersky Sofacy)(Citation: Bitdefender StrongPity June 2020)(Citation: Talos Promethium June 2020)" ; + rdfs:subClassOf d3f:ResourceDevelopmentTechnique . + +d3f:T1591 a owl:Class ; + rdfs:label "Gather Victim Org Information" ; + d3f:attack-id "T1591" ; + d3f:definition "Adversaries may gather information about the victim's organization that can be used during targeting. Information about an organization may include a variety of details, including the names of divisions/departments, specifics of business operations, as well as the roles and responsibilities of key employees." ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:T1592 a owl:Class ; + rdfs:label "Gather Victim Host Information" ; + d3f:attack-id "T1592" ; + d3f:definition "Adversaries may gather information about the victim's hosts that can be used during targeting. Information about hosts may include a variety of details, including administrative data (ex: name, assigned IP, functionality, etc.) as well as specifics regarding its configuration (ex: operating system, language, etc.)." ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:T1598 a owl:Class ; + rdfs:label "Phishing for Information" ; + d3f:attack-id "T1598" ; + d3f:definition "Adversaries may send phishing messages to elicit sensitive information that can be used during targeting. Phishing for information is an attempt to trick targets into divulging information, frequently credentials or other actionable information. Phishing for information is different from [Phishing](https://attack.mitre.org/techniques/T1566) in that the objective is gathering data from the victim rather than executing malicious code." ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:TA0004 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Privilege Escalation" ; + d3f:display-order 4 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:TA0005 a d3f:OffensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Defense Evasion" ; + d3f:display-order 5 ; + rdfs:subClassOf d3f:ATTACKEnterpriseTactic, + d3f:OffensiveTactic . + +d3f:Technique a owl:Class ; + rdfs:label "Technique" ; + rdfs:subClassOf d3f:Plan . + +d3f:UDPEvent a owl:Class ; + rdfs:label "UDP Event" ; + d3f:definition "An event involving the User Datagram Protocol (UDP), providing a connectionless datagram service with minimal protocol mechanisms." ; + rdfs:subClassOf d3f:TransportLayerEvent . + +d3f:URLAnalysis a d3f:URLAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "URL Analysis" ; + d3f:analyzes d3f:URL ; + d3f:d3fend-id "D3-UA" ; + d3f:definition "Determining if a URL is benign or malicious by analyzing the URL or its components." ; + d3f:kb-article """## How it works + +URLs may contain components, for example: + + * scheme + * userinfo + * host name + * port + * path + * query + * fragment + +These components are used as features in analysis algorithms. + +Contextual information about a URL such as where it is embedded (ex. emails, files, network protocols), header, path, location, and origin information, as well as information about the content returned from the URL request, may be incorporated into an analytic for URL analysis. For example, if a URL indicates a .pdf file but an executable is actually returned, the combination of these two pieces of information indicates suspicious activity. + +Additional techniques include: + +* Extracting features of a URL such as domain name length, ratio of consecutive consonants, percentage of digits in a domain, and number of vowels. Values for each feature are combined to develop a score for the URL. +* Determining the probability of a character occurring in the URL given the preceding two characters. For example, for google.com, the probability of a 'g' occurring at the beginning of a word, the probability of an 'o' occurring after a "g, the probability of an o" occurring after a 'g' and "o, and so forth. A dictionary or a list of known good domains is used to determine probability. Probabilities are multiplied to develop a score for the URL. + +URL analysis may trigger follow-on analytics such as **File Analysis** + +## Considerations + +* Volume of URLs being analyzed, combined with the speed at which they are analyzed +* Fidelity of analysis technique at detecting brand new URLs versus analyzing URLs of established domains""" ; + d3f:kb-reference d3f:Reference-MethodAndApparatusForDetectingMaliciousWebsites_EndgameInc, + d3f:Reference-MethodAndSystemForDetectingRestrictedContentAssociatedWithRetrievedContent_SophosLtd ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:URL ], + d3f:IdentifierAnalysis . + +d3f:UnixLink a owl:Class ; + rdfs:label "Unix Link" ; + d3f:definition "A Unix link is a file link in a Unix file system." ; + rdfs:subClassOf d3f:FileSystemLink . + +d3f:UnsupervisedLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Unsupervised Learning" ; + d3f:d3fend-id "D3A-UL" ; + d3f:definition "Unsupervised learning creates relationships with unlabeled data without the input of a human or other outside actor. Uses only input data. " ; + d3f:kb-abstract """## References +Unsupervised learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Unsupervised_learning).""" ; + rdfs:subClassOf d3f:MachineLearning . + +d3f:UserGeolocationLogonPatternAnalysis a d3f:UserGeolocationLogonPatternAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "User Geolocation Logon Pattern Analysis" ; + d3f:analyzes d3f:NetworkTraffic ; + d3f:d3fend-id "D3-UGLPA" ; + d3f:definition "Monitoring geolocation data of user logon attempts and comparing it to a baseline user behavior profile to identify anomalies in logon location." ; + d3f:kb-article """## How it works +Geolocation data for each user logon attempt is collected and used to create a baseline user behavior profile. Current geolocation logon data is then compared against the user behavior profile. Logon activity that deviates from normal patterns and can help in identifying situations that may be indicative of a remote attacker using stolen credentials. For example: + +* logons from locations that are different from where a user usually logs in +* logons from a location in which an enterprise has no users located +* logon that is not physically possible given the elapsed time since a logon from another location. + +## Considerations +* Potential for false positives from logon anomalies that are not associated with malicious activity. +* Attackers may not differentiate their logon behavior enough to trigger an alert.""" ; + d3f:kb-reference d3f:Reference-MethodAndApparatusForNetworkFraudDetectionAndRemediationThroughAnalytics_IdaptiveLLC, + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:UserBehaviorAnalysis . + +d3f:UserSessionInitConfigAnalysis a d3f:UserSessionInitConfigAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "User Session Init Config Analysis" ; + d3f:analyzes d3f:UserInitConfigurationFile ; + d3f:d3fend-id "D3-USICA" ; + d3f:definition "Analyzing modifications to user session config files such as .bashrc or .bash_profile." ; + d3f:kb-reference d3f:Reference-CAR-2020-09-002%3AComponentObjectModelHijacking_MITRE, + d3f:Reference-CAR-2020-11-011%3ARegistryEditFromScreensaver, + d3f:Reference-IdentificationAndExtractionOfKeyForensicsIndicatorsOfCompromiseUsingSubject-specificFilesystemViews, + d3f:Reference-RegistryKeySecurityAndAccessRights ; + d3f:synonym "User Startup Config Analysis" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:UserInitConfigurationFile ], + d3f:OperatingSystemMonitoring . + +d3f:UserToUserMessage a owl:Class, + owl:NamedIndividual ; + rdfs:label "User to User Message" ; + d3f:definition "Personal message, private message (PM), direct message (DM), or personal chat (PC) is a private form of messaging between different members on a given platform. It is only seen and accessible by the users participating in the message." ; + d3f:has-recipient d3f:UserAccount ; + d3f:has-sender d3f:UserAccount ; + d3f:may-contain d3f:Email ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:Email ], + [ a owl:Restriction ; + owl:onProperty d3f:has-recipient ; + owl:someValuesFrom d3f:UserAccount ], + [ a owl:Restriction ; + owl:onProperty d3f:has-sender ; + owl:someValuesFrom d3f:UserAccount ], + d3f:DigitalInformationBearer ; + skos:altLabel "Personal Message", + "Private Message" . + +d3f:VirtualAddress a owl:Class, + owl:NamedIndividual ; + rdfs:label "Virtual Address" ; + d3f:definition "A virtual address in memory is a pointer or marker for a memory space that an operating system allows a process to use. The virtual address points to a location in primary storage that a process can use independently of other processes." ; + d3f:synonym "Logical Address" ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:MemoryAddress . + +d3f:VirtualizationSoftware a owl:Class, + owl:NamedIndividual ; + rdfs:label "Virtualization Software" ; + d3f:definition "Virtualization software allows a single host computer to create and run one or more virtual environments. Virtualization software is most often used to emulate a complete computer system in order to allow a guest operating system to be run, for example allowing Linux to run as a guest on top of a PC that is natively running a Microsoft Windows operating system (or the inverse, running Windows as a guest on Linux)." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ServiceApplication . + +d3f:WebFileResource a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web File Resource" ; + d3f:addressed-by d3f:URL ; + d3f:definition "A web file resource is a file resource identified by a Uniform Resource Identifier (URI) and made available from one host to another host via a web protocol and across a network or networks." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:addressed-by ; + owl:someValuesFrom d3f:URL ], + d3f:NetworkFileResource, + d3f:WebResource . + +d3f:WebServer a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Server" ; + d3f:definition "A web server is server software, or hardware dedicated to running this software, that can satisfy client requests on the World Wide Web. A web server can, in general, contain one or more websites. A web server processes incoming network requests over HTTP and several other related protocols. While the major function is to serve content, a full implementation of HTTP also includes ways of receiving content from clients. This feature is used for submitting web forms, including uploading of files." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Server . + +d3f:WindowsNtAllocateVirtualMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtAllocateVirtualMemory" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIAllocateMemory . + +d3f:WindowsNtCreateThreadEx a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtCreateThreadEx" ; + rdfs:subClassOf d3f:OSAPICreateThread . + +d3f:WindowsRegistryValueEvent a owl:Class ; + rdfs:label "Windows Registry Value Event" ; + d3f:definition "Events representing actions performed on Windows Registry values, which store configuration data within registry keys." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:WindowsRegistryValue ], + d3f:WindowsRegistryEvent . + +d3f:contained-by a owl:ObjectProperty, + owl:TransitiveProperty ; + rdfs:label "contained-by" ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-be-contained-by ; + owl:inverseOf d3f:contains . + +d3f:disables a owl:ObjectProperty ; + rdfs:label "disables" ; + d3f:definition "x disables y: The technique or agent x makes an entity y unable to perform its actions or capabilities." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:evicts, + d3f:may-disable, + d3f:modifies . + +d3f:has-member a owl:ObjectProperty ; + rdfs:label "has-member" ; + rdfs:subPropertyOf d3f:d3fend-kb-object-property ; + owl:inverseOf d3f:member-of . + +d3f:implements a owl:ObjectProperty ; + rdfs:label "implements" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:member-of a owl:ObjectProperty ; + rdfs:label "member-of" ; + rdfs:subPropertyOf d3f:d3fend-kb-object-property . + +d3f:process-data-property a owl:DatatypeProperty ; + rdfs:label "process-data-property" ; + d3f:definition "x process-data-property y: The process x has the data property y." ; + rdfs:subPropertyOf d3f:d3fend-artifact-data-property . + +d3f:terminates a owl:ObjectProperty ; + rdfs:label "terminates" ; + d3f:definition "x terminates y: The technique x brings to an end or halt to some activity y." ; + d3f:synonym "aborts" ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with, + d3f:evicts . + +d3f:AccessPolicyAdministration a d3f:AccessPolicyAdministration, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Access Policy Administration" ; + d3f:d3fend-id "D3-APA" ; + d3f:definition "Access policy administration is the systematic process of defining, implementing, and managing access control policies that dictate user permissions to resources." ; + d3f:enables d3f:Isolate ; + d3f:synonym "Access Control Administration" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Isolate ], + d3f:DefensiveTechnique . + +d3f:Application-basedProcessIsolation a d3f:Application-basedProcessIsolation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Application-based Process Isolation" ; + d3f:d3fend-id "D3-ABPI" ; + d3f:definition "Application code which prevents its own subroutines from accessing intra-process / internal memory space." ; + d3f:isolates d3f:Process ; + d3f:kb-article """## How it works +Some applications implement logic to permit or deny a particular subroutine access to other data within the same applicaition process. This is intended to prevent critical application process data from being tampered with. + +### Application-based Process Isolation in web browsers. + +Isolation in browsers usually is designed with the following architectural mindset: +* Sandboxes and web resources should not be allowed to access each other because compromise of one should not effect the other. +* The principle of least-privilege should be followed when browsing. +The following aspects help make browser-based process isolation possible: +* Same Origin Policy +* Separate tabs and iframes use their own DOMs (cross-site document object models always run as a different process) +* CORS ensures cross-site data is not delivered to a process unless the server allows it +* Cookie and local data storage is separated by domain/site +* Separate execution environments (threads) + +## Considerations +- Using isolation in browsers does mitigate and protect by default some types of attacks (e.g. renderer attacks and access to the filesystem) but it depends on correct configuration of CORS, use of valid/appropriate certificates. +- Application-based Process Isolation may increase memory footprint. +- Application-based Process Isolation may decrease application performance.""" ; + d3f:kb-reference d3f:Reference-PrivateApplicationAccessWithBrowserIsolation, + d3f:Reference-ProtectingWebApplicationsFromUntrustedEndpointsUsingRemoteBrowserIsolation, + d3f:Reference-SiteIsolationDesignDocument ; + d3f:restricts d3f:Subroutine ; + d3f:synonym "Browser-based Process Isolation", + "Remote Browser Isolation", + "Sandbox" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:Process ], + [ a owl:Restriction ; + owl:onProperty d3f:restricts ; + owl:someValuesFrom d3f:Subroutine ], + d3f:ExecutionIsolation . + +d3f:ApplicationConfigurationDatabase a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Configuration Database" ; + d3f:contains d3f:ApplicationConfigurationDatabaseRecord ; + d3f:definition "A database used to hold application configuration data." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ApplicationConfigurationDatabaseRecord ], + d3f:ConfigurationDatabase . + +d3f:ApplicationConfigurationFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Configuration File" ; + d3f:contains d3f:ApplicationConfiguration ; + d3f:definition "A file containing Information used to configure the parameters and initial settings for an application.. A plist file is an example of this type of file for macOS. Usually text-based." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ApplicationConfiguration ], + d3f:ConfigurationFile . + +d3f:BroadcastDomainIsolation a d3f:BroadcastDomainIsolation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Broadcast Domain Isolation" ; + d3f:d3fend-id "D3-BDI" ; + d3f:definition "Broadcast isolation restricts the number of computers a host can contact on their LAN." ; + d3f:filters d3f:LocalAreaNetworkTraffic ; + d3f:kb-article """## How it works +Software Defined Networking, or other network encapsulation technologies intercept host broadcast traffic then route it to a specified destination per a configured policy. + +This can be implemented within hypervisors, networking hardware (WAPs, switches, routers), or virutal hardware. + +## Considerations +This technique is highly dependent on network infrastructure and networking requirements.""" ; + d3f:kb-reference d3f:Reference-BroadcastIsolationAndLevel3NetworkSwitch_HewlettPackardEnterpriseDevelopmentLP, + d3f:Reference-PrivateVirtualLocalAreaNetworkIsolation_CiscoTechnologyInc ; + d3f:synonym "Network Segmentation" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:LocalAreaNetworkTraffic ], + d3f:NetworkIsolation . + +d3f:CWE-1059 a owl:Class ; + rdfs:label "Insufficient Technical Documentation" ; + d3f:cwe-id "CWE-1059" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1164 a owl:Class ; + rdfs:label "Irrelevant Code" ; + d3f:cwe-id "CWE-1164" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-1176 a owl:Class ; + rdfs:label "Inefficient CPU Computation" ; + d3f:cwe-id "CWE-1176" ; + rdfs:subClassOf d3f:CWE-405 . + +d3f:CWE-162 a owl:Class ; + rdfs:label "Improper Neutralization of Trailing Special Elements" ; + d3f:cwe-id "CWE-162" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-172 a owl:Class ; + rdfs:label "Encoding Error" ; + d3f:cwe-id "CWE-172" ; + rdfs:subClassOf d3f:CWE-707 . + +d3f:CWE-203 a owl:Class ; + rdfs:label "Observable Discrepancy" ; + d3f:cwe-id "CWE-203" ; + rdfs:subClassOf d3f:CWE-200 . + +d3f:CWE-226 a owl:Class ; + rdfs:label "Sensitive Information in Resource Not Removed Before Reuse" ; + d3f:cwe-id "CWE-226" ; + rdfs:subClassOf d3f:CWE-212, + d3f:CWE-459 . + +d3f:CWE-295 a owl:Class ; + rdfs:label "Improper Certificate Validation" ; + d3f:cwe-id "CWE-295" ; + rdfs:subClassOf d3f:CWE-287 . + +d3f:CWE-404 a owl:Class ; + rdfs:label "Improper Resource Shutdown or Release" ; + d3f:cwe-id "CWE-404" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-59 a owl:Class ; + rdfs:label "Improper Link Resolution Before File Access ('Link Following')" ; + d3f:cwe-id "CWE-59" ; + rdfs:subClassOf d3f:CWE-706 . + +d3f:CWE-628 a owl:Class ; + rdfs:label "Function Call with Incorrectly Specified Arguments" ; + d3f:cwe-id "CWE-628" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-642 a owl:Class ; + rdfs:label "External Control of Critical State Data" ; + d3f:cwe-id "CWE-642" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-662 a owl:Class ; + rdfs:label "Improper Synchronization" ; + d3f:cwe-id "CWE-662" ; + rdfs:subClassOf d3f:CWE-664, + d3f:CWE-691 . + +d3f:CWE-666 a owl:Class ; + rdfs:label "Operation on Resource in Wrong Phase of Lifetime" ; + d3f:cwe-id "CWE-666" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-669 a owl:Class ; + rdfs:label "Incorrect Resource Transfer Between Spheres" ; + d3f:cwe-id "CWE-669" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-672 a owl:Class ; + rdfs:label "Operation on a Resource after Expiration or Release" ; + d3f:cwe-id "CWE-672" ; + rdfs:subClassOf d3f:CWE-666 . + +d3f:CWE-675 a owl:Class ; + rdfs:label "Multiple Operations on Resource in Single-Operation Context" ; + d3f:cwe-id "CWE-675" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-681 a owl:Class ; + rdfs:label "Incorrect Conversion between Numeric Types" ; + d3f:cwe-id "CWE-681" ; + rdfs:subClassOf d3f:CWE-704 . + +d3f:CWE-863 a owl:Class ; + rdfs:label "Incorrect Authorization" ; + d3f:cwe-id "CWE-863" ; + rdfs:subClassOf d3f:CWE-285 . + +d3f:CWE-913 a owl:Class ; + rdfs:label "Improper Control of Dynamically-Managed Code Resources" ; + d3f:cwe-id "CWE-913" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CloudConfiguration a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud Configuration" ; + d3f:definition "Information used to configure the services, parameters, and initial settings for a virtual server instance running in a cloud service." ; + rdfs:subClassOf d3f:ConfigurationResource ; + skos:altLabel "Cloud Configuration Information" . + +d3f:ConfigurationFile a owl:Class ; + rdfs:label "Configuration File" ; + d3f:definition "A file containing Information used to configure the parameters and initial settings for some computer programs. They are used for user applications, server processes and operating system settings." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:File ; + skos:altLabel "Settings File" . + +d3f:CopyToken a d3f:SystemCall, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Copy Token" ; + d3f:copies d3f:AccessToken ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:copies ; + owl:someValuesFrom d3f:AccessToken ], + d3f:SystemCall . + +d3f:Correlation a owl:Class, + owl:NamedIndividual ; + rdfs:label "Correlation" ; + d3f:d3fend-id "D3A-COR" ; + d3f:definition "Correlation is the degree to which two or more quantities are linearly associated." ; + d3f:kb-article "Wolfram MathWorld. (n.d.). Correlation. [Link](https://mathworld.wolfram.com/Correlation.html)" ; + rdfs:subClassOf d3f:DescriptiveStatistics . + +d3f:CredentialEviction a d3f:CredentialEviction, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Eviction" ; + d3f:d3fend-id "D3-CE" ; + d3f:definition "Credential Eviction techniques disable or remove compromised credentials from a computer network." ; + d3f:enables d3f:Evict ; + d3f:kb-reference d3f:Reference-AccountMonitoring_ForescoutTechnologies ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Evict ], + d3f:DefensiveTechnique . + +d3f:CredentialRotation a d3f:CredentialRotation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Rotation" ; + d3f:d3fend-id "D3-CRO" ; + d3f:definition "Credential rotation is a security procedure in which authentication credentials, such as passwords, API keys, or certificates, are regularly changed or replaced to minimize the risk of unauthorized access." ; + d3f:kb-article """## How it works + +Credentials can be systematically changed at predetermined intervals or based on specific events. Credentials such as user passwords may be rotated manually, but it is increasingly common to use an automated system to manage rotation of enterprise passwords, certificates and keys. + +## Considerations + +- Rotation of credentials must be managed carefully to avoid inadvertent service interruption +- Management servers with enterprise policies for account management provide the ability to change or reset passwords for accounts. Some organizations rotate credentials periodically to limit the risk of stolen credentials. +- When responding to an incident, severity of compromise should be considered to determine what credentials to what accounts should be regenerated +- If proactively rotating credentials periodically, several factors should be considered to determine the frequency. Also introduces some risk including promoting the creation of weak passwords and poor storage practices for employees and presents challenges in proper tracking.""" ; + d3f:kb-reference , + d3f:Reference-PasswordandKeyRotation-SSH ; + d3f:regenerates d3f:Credential ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:regenerates ; + owl:someValuesFrom d3f:Credential ], + d3f:CredentialHardening . + +d3f:DNSDenylisting a d3f:DNSDenylisting, + owl:Class, + owl:NamedIndividual ; + rdfs:label "DNS Denylisting" ; + d3f:blocks d3f:DNSNetworkTraffic ; + d3f:d3fend-id "D3-DNSDL" ; + d3f:definition "Blocking DNS Network Traffic based on criteria such as IP address, domain name, or DNS query type." ; + d3f:kb-article """## How it works +Rules are implemented that filter DNS queries using criteria such as: +- Client subnet +- Type of network protocol used in query +- Fully qualified domain name (FQDN) of record in the query +- DNS Server IP address that received the DNS request +- Type of DNS record being queried +- Time of day the query is received +- Size of the response + +For example, a DNS policy can be created for blocking DNS queries for FQDNs that have been identified as unauthorized. + +## Considerations +- Implementation considerations for DNS filtering policies to avoid over-blocking or under-blocking domains. +- Continuous maintenance of unauthorized domain lists is needed to keep up to date with possible site content changes. +- File sharing or content delivery networks may require other filtering techniques that are more fine-grained (URL blocking). +- Access to malicious websites or other network resources directly by IP instead of by DNS record, or after alteration of local DNS hosts file, may not result in DNS network traffic.""" ; + d3f:kb-reference d3f:Reference-UseDNSPolicyForApplyingFiltersOnDNSQueries ; + d3f:synonym "DNS Blacklisting" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:blocks ; + owl:someValuesFrom d3f:DNSNetworkTraffic ], + d3f:NetworkIsolation . + +d3f:DatabaseQuery a owl:Class, + owl:NamedIndividual ; + rdfs:label "Database Query" ; + d3f:definition "A specific query expressed in SQL, SPARQL, or similar language against a database." ; + rdfs:subClassOf d3f:Command . + +d3f:DecoyFile a d3f:DecoyFile, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Decoy File" ; + d3f:d3fend-id "D3-DF" ; + d3f:definition "A file created for the purposes of deceiving an adversary." ; + d3f:kb-article """## How it works +The decoy file is made available as a local or network resource. Accesses to the file may be monitored. The files may be configurations, documents, executables, or other file types. + + +## Considerations +Properties of the file such as cryptographic checksums, file creation date, file modified date, file size, file owner etc may be modified to improve the credibility of the file. + +## Example +* A CSV file with decoy user credentials is placed on a system. The system or network is then monitored to detect any accesses to the decoy files.""" ; + d3f:kb-reference d3f:Reference-OpenSourceIntelligenceDeceptions_IllusiveNetworksLtd, + , + d3f:Reference-SystemAndAMethodForIdentifyingThePresenceOfMalwareAndRansomwareUsingMini-trapsSetAtNetworkEndpoints_FidelisCybersecuritySolutionsInc, + d3f:Reference-SystemAndMethodsThereofForPreventingRansomwareFromEncryptingDataElementsStoredInAMemoryOfAComputer-basedSystem_PaloAltoNetworksInc ; + d3f:spoofs d3f:File ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:spoofs ; + owl:someValuesFrom d3f:File ], + d3f:DecoyObject . + +d3f:DeveloperApplication a owl:Class ; + rdfs:label "Developer Application" ; + d3f:definition "An application used to develop computer software including applications used for software construction, analysis, testing, packaging, or management." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:UserApplication . + +d3f:IdentifierReputationAnalysis a d3f:IdentifierReputationAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Identifier Reputation Analysis" ; + d3f:d3fend-id "D3-IRA" ; + d3f:definition "Analyzing the reputation of an identifier." ; + d3f:kb-reference d3f:Reference-Finding_phishing_sites ; + rdfs:subClassOf d3f:IdentifierAnalysis . + +d3f:Kernel a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kernel" ; + d3f:contains d3f:KernelProcessTable ; + d3f:definition "The kernel is a computer program that constitutes the central core of a computer's operating system. It has complete control over everything that occurs in the system. As such, it is the first program loaded on startup, and then manages the remainder of the startup, as well as input/output requests from software, translating them into data processing instructions for the central processing unit. It is also responsible for managing memory, and for managing and communicating with computing peripherals, like printers, speakers, etc. The kernel is a fundamental part of a modern computer's operating system." ; + d3f:loads d3f:Application ; + d3f:manages d3f:OperatingSystemProcess, + d3f:UserProcess ; + d3f:may-contain d3f:HardwareDriver, + d3f:KernelModule ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:HardwareDriver ], + [ a owl:Restriction ; + owl:onProperty d3f:manages ; + owl:someValuesFrom d3f:OperatingSystemProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:KernelProcessTable ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:KernelModule ], + [ a owl:Restriction ; + owl:onProperty d3f:manages ; + owl:someValuesFrom d3f:UserProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:loads ; + owl:someValuesFrom d3f:Application ], + d3f:SystemSoftware . + +d3f:LoginSession a owl:Class, + owl:NamedIndividual ; + rdfs:label "Login Session" ; + d3f:definition "In computing, a login session is the period of activity between a user logging in and logging out of a (multi-user) system. This includes local login sessions, where a user has direct physical access to a computer, as well as domain login sessions, where a user logs into a computer that is part of a network domain." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Session ; + skos:altLabel "Logon Session" . + +d3f:MemoryAddress a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Address" ; + d3f:addresses d3f:MemoryWord ; + d3f:definition "In computing, a memory address is a reference to a specific memory location used at various levels by software and hardware." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:addresses ; + owl:someValuesFrom d3f:MemoryWord ], + d3f:DigitalInformation . + +d3f:MessageAnalysis a d3f:MessageAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Message Analysis" ; + d3f:d3fend-id "D3-MA" ; + d3f:definition "Analyzing email or instant message content to detect unauthorized activity." ; + d3f:enables d3f:Detect ; + d3f:kb-article """## Technique Overview + +Email and messaging are frequently used to deliver malicious content to targets. These enterprise capabilities are used to deliver software exploits or social engineering tricks. If the recipient of a message trusts the sender, attackers can avoid escalating suspicion. + +Emails and messages are also complex data structures. They contain files and links, and complex data encodings which vary region to region. Thus the defensive techniques used to analyze emails and messages are highly varied ranging from deep content analysis and execution to social network graph-style analytics to analyze trust or risk.""" ; + d3f:synonym "Electronic Message Analysis", + "Email Or Messaging Analysis" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Detect ], + d3f:DefensiveTechnique . + +d3f:NetworkNodeInventory a d3f:NetworkNodeInventory, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Node Inventory" ; + d3f:d3fend-id "D3-NNI" ; + d3f:definition "Network node inventorying identifies and records all the network nodes (hosts, routers, switches, firewalls, etc.) in the organization's architecture." ; + d3f:inventories d3f:NetworkNode ; + d3f:kb-article """## How it works +Administrators collect information on network nodes in their architecture using a variety of administrative and management tools that query network devices and nodes for information. In some cases, where such queries are not supported or provide specific information of interest, an administrator may also collect this information through network enumeration methods to include host discovery and scanning for active ports and services. + +## Considerations +* Scanning and probing techniques using mapping tools can result in side effects to information technology (IT) and operational technology (OT) systems. +* An adversary conducting network enumeration may engage in activities that parallel normal network node inventorying activities, but would require escalating to admin privileges for most of the operations requiting administrative tools + +## Examples +* Link-layer discovery + * Link-layer Discovery Protocol (LLDP) + * Cisco Discovery Protocol (CDP) +* Application-layer discovery + * Simple Network Management Protocol (SNMP) collects MIB information + * Web-based Enterprise Management (WBEM) collects CIM information + * Windows Management Instrumentation (WMI) + * Windows Management Infrastructure (MI)""" ; + d3f:kb-reference d3f:Reference-IEEE-802_1AB-2016, + d3f:Reference-QualysNetworkPassiveSensorGettingStartedGuide, + d3f:Reference-RFC3411-AnArchitectureForDescribingSimpleNetworkManagementProtocolSNMPManagementFrameworks, + d3f:Reference-Web-BasedEnterpriseManagement, + d3f:Reference-Windows-Management-Infrastructure, + d3f:Reference-Windows-Management-Instrumentation ; + d3f:synonym "System Discovery", + "System Inventorying" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:inventories ; + owl:someValuesFrom d3f:NetworkNode ], + d3f:AssetInventory . + +d3f:NetworkService a owl:Class ; + rdfs:label "Network Service" ; + d3f:definition "In computer networking, a network service is an application running at the network application layer and above, that provides data storage, manipulation, presentation, communication or other capability which is often implemented using a client-server or peer-to-peer architecture based on application layer network protocols. Clients and servers will often have a user interface, and sometimes other hardware associated with it." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ServiceApplicationProcess . + +d3f:NetworkTrafficFiltering a d3f:NetworkTrafficFiltering, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Traffic Filtering" ; + d3f:d3fend-id "D3-NTF" ; + d3f:definition "Restricting network traffic originating from any location." ; + d3f:filters d3f:NetworkTraffic ; + d3f:kb-reference d3f:Reference-ActiveFirewallSystemAndMethodology_McAfeeLLC, + d3f:Reference-AutomaticallyGeneratingRulesForConnectionSecurity_Microsoft, + d3f:Reference-FWTK-FirewallToolkit_, + d3f:Reference-FirewallForInterentAccess_SecureComputingLLC, + d3f:Reference-FirewallForProcessingAConnectionlessNetworkPacket_NationalSecurityAgency, + d3f:Reference-FirewallForProcessingConnection-orientedAndConnectionlessDatagramsOverAConnection-orientedNetwork_NationalSecurityAgency, + d3f:Reference-FirewallsThatFilterBasedUponProtocolCommands_IntelCorp, + d3f:Reference-MethodForControllingComputerNetworkSecurity_CheckpointSoftwareTechnologiesLtd, + d3f:Reference-NetworkFirewallWithProxy_SecureComputingLLC ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:NetworkIsolation . + +d3f:OSAPIDeleteFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Delete File" ; + d3f:invokes d3f:DeleteFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:DeleteFile ], + d3f:OSAPISystemFunction . + +d3f:OSAPIReadFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Read File" ; + d3f:invokes d3f:ReadFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:ReadFile ], + d3f:OSAPISystemFunction . + +d3f:OSAPIWriteFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Write File" ; + d3f:invokes d3f:WriteFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:WriteFile ], + d3f:OSAPISystemFunction . + +d3f:ObjectFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Object File" ; + d3f:definition "An object file is a file that contains relocatable machine code." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:File . + +d3f:Person a owl:Class, + owl:NamedIndividual ; + rdfs:label "Person" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:name ; + owl:someValuesFrom xsd:string ], + d3f:Agent . + +d3f:PersonalComputer a owl:Class ; + rdfs:label "Personal Computer" ; + d3f:definition "A personal computer (PC) is a multi-purpose computer whose size, capabilities, and price make it feasible for individual use. Personal computers are intended to be operated directly by an end user, rather than by a computer expert or technician. Unlike large, costly minicomputers and mainframes, time-sharing by many people at the same time is not used with personal computers. PCs have in practice become powerful enough that they may be shared by multiple users at any given time, though this is not common practice nor the primary purpose of a PC." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ClientComputer . + +d3f:PhysicalArtifact a owl:Class, + owl:NamedIndividual ; + rdfs:label "Physical Artifact" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-location ; + owl:someValuesFrom d3f:PhysicalLocation ], + d3f:Artifact ; + skos:altLabel "Physical Object" . + +d3f:RDPEvent a owl:Class ; + rdfs:label "RDP Event" ; + d3f:definition "An event involving the Remote Desktop Protocol (RDP), a communication protocol developed by Microsoft that facilitates secure remote access to graphical interfaces on desktops or applications hosted on remote servers. RDP supports multi-channel communication for transferring input, output, and management commands." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:RDPSession ], + [ a owl:Class ; + owl:unionOf ( d3f:TCPEvent d3f:UDPEvent ) ], + d3f:ApplicationLayerEvent . + +d3f:RDPSession a owl:Class, + owl:NamedIndividual ; + rdfs:label "RDP Session" ; + d3f:definition "A Remote Desktop Protocol (RDP) session is a session established using the RDP protocol to access Remove Desktop Services (RDS)." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:RemoteSession ; + skos:altLabel "Remote Desktop Session", + "Terminal Services" . + +d3f:Reference-MethodAndApparatusForNetworkFraudDetectionAndRemediationThroughAnalytics_IdaptiveLLC a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - Method and Apparatus for Network Fraud Detection and Remediation Through Analytics - Idaptive LLC" ; + d3f:has-link "https://patents.google.com/patent/US20190081968A1/en"^^xsd:anyURI ; + d3f:kb-abstract "A system and method for assessing the identity fraud risk of an entity's (a user's, computer process's, or device's) behavior within a computer network and then to take appropriate action. The system uses real-time machine learning for its assessment. It records the entity's log-in behavior (conditions at log-in) and behavior once logged in to create an entity profile that helps identify behavior patterns. The system compares new entity behavior with the entity profile to determine a risk score and a confidence level for the behavior. If the risk score and confidence level indicate a credible identity fraud risk at log-in, the system can require more factors of authentication before log-in succeeds. If the system detects risky behavior after log-in, it can take remedial action such as ending the entity's session, curtailing the entity's privileges, or notifying a human administrator." ; + d3f:kb-author "Yanlin Wang; Weizhi Li" ; + d3f:kb-mitre-analysis """This patent describes determining a confidence score to detect anomalies in user activity based on comparing a user's behavior profile with current user activity events. The following types of events are used to develop a user entity profile: + +* logon and logoff times and locations +* starting or ending applications +* reading or writing files +* changing an entity 's authorization +* monitoring network traffic + +User events that deviate from the entity profile over a certain threshold trigger a remedial action.""" ; + d3f:kb-organization "Idaptive LLC" ; + d3f:kb-reference-of d3f:AuthenticationEventThresholding, + d3f:AuthorizationEventThresholding, + d3f:ResourceAccessPatternAnalysis, + d3f:SessionDurationAnalysis, + d3f:UserGeolocationLogonPatternAnalysis ; + d3f:kb-reference-title "Method and Apparatus for Network Fraud Detection and Remediation Through Analytics" . + + a d3f:PatentReference, + owl:NamedIndividual ; + rdfs:label "Reference - System, method, and computer program product for detecting and assessing security risks in a network - Exabeam Inc" ; + d3f:has-link "https://patents.google.com/patent/US20190034641A1"^^xsd:anyURI ; + d3f:kb-abstract "The present disclosure is directed to a system, method, and computer program for detecting and assessing security risks in an enterprise's computer network. A behavior model is built for a user in the network based on the user's interactions with the network, wherein a behavior model for a user indicates client device(s), server(s), and resources used by the user. The user's behavior during a period of time is compared to the user's behavior model. A risk assessment is calculated for the period of time based at least in part on the comparison between the user's behavior and the user's behavior model, wherein any one of certain anomalies between the user's behavior and the user's behavior model increase the risk assessment." ; + d3f:kb-author "Sylvain Gil; Domingo Mihovilovic; Nir Polak; Magnus Stensmo; Sing Yip" ; + d3f:kb-mitre-analysis """This patent describes calculating a risk score to detect anomalies in user activity based on comparing a user's current session with a user behavior model. The user behavior model is comprised of a number of histograms including: + +* client devices from which the user logs in +* servers accessed +* data accessed +* applications accessed +* session duration +* logon time of day +* logon day of week +* geo - location of logon origination + +The system has an initial training period with x number of days (e. g., 90 days) in which session data is recorded in behavior models before behavior analysis begins.The histograms are then used to determine anomalies between current session activity and a user's behavior model. Values for a histogram category are along one axis and the number of times the value is received for the category is along another axis. If a data point value associated with the current user session is over an anomaly threshold, an alert is generated.""" ; + d3f:kb-organization "Exabeam Inc" ; + d3f:kb-reference-of d3f:AuthenticationEventThresholding, + d3f:AuthorizationEventThresholding, + d3f:ResourceAccessPatternAnalysis, + d3f:SessionDurationAnalysis, + d3f:UserGeolocationLogonPatternAnalysis ; + d3f:kb-reference-title "System, method, and computer program product for detecting and assessing security risks in a network" . + +d3f:Reference-UnifiedArchitectureFrameworkUAF a d3f:SpecificationReference, + owl:NamedIndividual ; + rdfs:label "Reference - Unified Architecture Framework (UAF)" ; + d3f:has-link "https://www.omg.org/spec/UAF/"^^xsd:anyURI ; + d3f:kb-abstract "UAF is an OMG standard that assists in development of architectural descriptions in commercial industry firms, federal government agencies and defense organizations. UAF has a variety of use cases from Enterprise and Mission architecting, to System of Systems (SoS) and Cyber-physical Systems engineering, as well as being an enabler for Digital Transformation efforts and for Department of Defense Architecture Framework (DoDAF) and NATO Architecture Framework (NAF) modeling. Architectural Descriptions in UAF are aligned with ISO/IEC/IEEE 42010:2011, Systems and software engineering -- Architecture description." ; + d3f:kb-organization "OMG" ; + d3f:kb-reference-of d3f:DataExchangeMapping, + d3f:OperationalActivityMapping, + d3f:OperationalDependencyMapping, + d3f:OrganizationMapping, + d3f:ServiceDependencyMapping, + d3f:SystemDependencyMapping ; + d3f:kb-reference-title "Unified Architecture Framework (UAF)" . + +d3f:Reference-UseDNSPolicyForApplyingFiltersOnDNSQueries a d3f:UserManualReference, + owl:NamedIndividual ; + rdfs:label "Reference - Use DNS Policy for Applying Filters on DNS Queries" ; + d3f:has-link "https://docs.microsoft.com/en-us/windows-server/networking/dns/deploy/apply-filters-on-dns-queries"^^xsd:anyURI ; + d3f:kb-organization "Microsoft" ; + d3f:kb-reference-title "Use DNS Policy for Applying Filters on DNS Queries" . + +d3f:RegressionAnalysis a owl:Class, + owl:NamedIndividual ; + rdfs:label "Regression Analysis" ; + d3f:d3fend-id "D3A-RA" ; + d3f:definition "Regression analysis is a set of statistical processes for estimating the relationships between a dependent variable (often called the 'outcome' or 'response' variable, or a 'label' in machine learning parlance) and one or more independent variables (often called 'predictors', 'covariates', 'explanatory variables' or 'features')." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Regression analysis. [Link](https://en.wikipedia.org/wiki/Regression_analysis)""" ; + rdfs:subClassOf d3f:StatisticalMethod . + +d3f:Restore a d3f:DefensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore" ; + d3f:definition "The restore tactic is used to return the system to a better state." ; + d3f:display-order 5 ; + d3f:display-priority 0 ; + rdfs:subClassOf d3f:DefensiveTactic . + +d3f:SSHSession a owl:Class, + owl:NamedIndividual ; + rdfs:label "SSH Session" ; + d3f:definition "A Secure Shell Protocol (SSH) session is a session over a secure channel established using SSH to connect a client to a server and establish the remote session." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:RemoteSession . + +d3f:SecurityEvent a owl:Class ; + rdfs:label "Security Event" ; + d3f:definition "An event describing occurrences related to cybersecurity, including detection, remediation, or enforcement actions. Security events provide critical insights into the state, behavior, and resilience of digital systems." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:caused-by ; + owl:someValuesFrom d3f:DefensiveAction ], + d3f:DigitalEvent . + +d3f:Semi-SupervisedLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Semi-Supervised Learning" ; + d3f:d3fend-id "D3A-SSL" ; + d3f:definition "Semi-supervised learning is a branch of machine learning that combines a small amount of labeled data with a large amount of unlabeled data during training." ; + d3f:kb-article """## References +Semi-Supervised Learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Semi-Supervised_Learning).""" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:MachineLearning . + +d3f:SenderMTAReputationAnalysis a d3f:SenderMTAReputationAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Sender MTA Reputation Analysis" ; + d3f:analyzes d3f:Email ; + d3f:d3fend-id "D3-SMRA" ; + d3f:definition "Characterizing the reputation of mail transfer agents (MTA) to determine the security risk in emails." ; + d3f:kb-article """## How it works +The sender message transfer agent (MTA) trust rating can be considered an indicator of the level of security risk and/or a trust level associated with sender MTAs in an email header. + +The features considered in determining the trust rating may include: + +* Length of time MTA has interacted with the enterprise +* Number of sender domains sending emails from the MTA +* Number of recipients in the enterprise the MTA sends emails to +* Number of emails received from this MTA +* Number of email replies received from this MTA + +For example, higher values for the length of time an MTA has interacted with the enterprise, or number of emails received from an MTA can result in a higher trust rating. The trust rating categorizes the sender MTA as unrated, neutral, trusted, suspicious, or malicious. + +## Considerations +Legitimate emails from a sender MTA may receive a lower trust rating over time if the sender's domain gets spoofed and is used to send unauthorized emails.""" ; + d3f:kb-reference d3f:Reference-SystemsAndMethodsForDetectingAnd_orHandlingTargetedAttacksInTheEmailChannel_GraphusInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Email ], + d3f:MessageAnalysis . + +d3f:SenderReputationAnalysis a d3f:SenderReputationAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Sender Reputation Analysis" ; + d3f:analyzes d3f:Email ; + d3f:d3fend-id "D3-SRA" ; + d3f:definition "Ascertaining sender reputation based on information associated with a message (e.g. email/instant messaging)." ; + d3f:kb-article """## How it works + +Sender trust rating can be considered an indicator of the level of security risk and/or a trust level associated with a sender. The features considered in determining the trust rating include: + +* Length of time sender has sent emails to the enterprise +* Number of recipients in the enterprise the sender interacts with +* Sender vs. enterprise originated message ratio +* Sender messages opened vs. not-opened ratio +* Number of emails received from this sender +* Number of emails replied to this sender +* Number of emails from this sender not opened +* Number of emails from this sender not opened that contain an attachment +* Number of emails from this sender not opened that contain a URL +* Number of emails sent to this sender +* Number of email replies received from this sender. + +Higher values for the number of recipients the sender has interacted with or the number of emails received from the sender, for example, results in a higher trust rating. The trust rating can categorize the sender as unrated, neutral, trusted, suspicious, or malicious. + +## Considerations +Legitimate emails from a sender may receive a lower trust rating over time if the sender's domain gets spoofed and is used to send unauthorized emails.""" ; + d3f:kb-reference d3f:Reference-SystemsAndMethodsForDetectingAnd_orHandlingTargetedAttacksInTheEmailChannel_GraphusInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Email ], + d3f:MessageAnalysis . + +d3f:SessionCookie a owl:Class, + owl:NamedIndividual ; + rdfs:label "Session Cookie" ; + d3f:definition "A session cookie, also known as an in-memory cookie, transient cookie or non-persistent cookie, exists only in temporary memory while the user navigates the website. Web browsers normally delete session cookies when the user closes the browser. Unlike other cookies, session cookies do not have an expiration date assigned to them, which is how the browser knows to treat them as session cookies." ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:Credential ; + skos:altLabel "In-memory Cookie", + "Non-persistent Cookie", + "Transient Cookie", + "Web Session Cookie" . + +d3f:SessionDurationAnalysis a d3f:SessionDurationAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Session Duration Analysis" ; + d3f:analyzes d3f:Authentication, + d3f:Authorization ; + d3f:d3fend-id "D3-SDA" ; + d3f:definition "Analyzing the duration of user sessions in order to detect unauthorized activity." ; + d3f:kb-article """## How it works +Detecting unauthorized user sessions by comparing the duration of a user logon session with a baseline behavior model. The behavior model comprises historical user session duration times. Abnormalities between session duration and the behavior model may indicate suspicious activity. + +## Considerations +* Potential for false positives from anomalies that are not associated with malicious activity. +* Attackers may not differentiate their session duration enough to trigger an alert.""" ; + d3f:kb-reference d3f:Reference-MethodAndApparatusForNetworkFraudDetectionAndRemediationThroughAnalytics_IdaptiveLLC, + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Authorization ], + [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Authentication ], + d3f:UserBehaviorAnalysis . + +d3f:SoftwarePackage a owl:Class, + owl:NamedIndividual ; + rdfs:label "Software Package" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:Step a owl:Class ; + rdfs:label "Step" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:next ; + owl:someValuesFrom d3f:Step ], + [ a owl:Restriction ; + owl:onProperty d3f:fork ; + owl:someValuesFrom d3f:Step ], + [ a owl:Restriction ; + owl:onProperty d3f:end ; + owl:someValuesFrom d3f:Step ], + [ a owl:Restriction ; + owl:onProperty d3f:may-be-associated-with ; + owl:someValuesFrom d3f:Artifact ], + d3f:Plan . + +d3f:SystemDependencyMapping a d3f:SystemDependencyMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System Dependency Mapping" ; + d3f:d3fend-id "D3-SYSDM" ; + d3f:definition "System dependency mapping identifies and models the dependencies of system components on each other to carry out their function." ; + d3f:kb-article """## How it works +The organization collects and models architectural information about the software, hardware, and products and maps the dependencies between systems, including each system's internal components and dependencies. + +## Considerations +* Data exchanges identified in the network mapping efforts usually indicate such dependencies, but may not be part of the intended design. +* Architectural design artifacts and SMEs may need to be consulted to determine if dependencies are intended or otherwise essential. +* System depedency mapping can identify internal dependencies of standard and pre-built systems that should be incorporated into a complete system dependency model. +* System dependencies for critical systems--those supporting critical organizational activities--should be prioritized for supply chain risk analysis. +* System dependencies should identify the integral components of a given named system and their structure to form a system. +* System dependencies with a given system may be fixed by a particular product's configuration, and leveraging external knowledge bases about dependencies available (e.g., from package managers) is essential.""" ; + d3f:kb-reference d3f:Reference-CatiaUAFPlugin, + d3f:Reference-SoftwareVulnerabilityGraphDatabase, + d3f:Reference-TivoliApplicationDependencyDiscoverManager7_3_0DependenciesBetweenResources, + d3f:Reference-UnifiedArchitectureFrameworkUAF ; + d3f:maps d3f:SystemDependency ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:SystemDependency ], + d3f:SystemMapping . + +d3f:SystemInitConfiguration a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Init Configuration" ; + d3f:definition "System initialization configuration information is configuration information used to configure the services, parameters, and initial settings for an operating system at startup." ; + rdfs:subClassOf d3f:OperatingSystemConfigurationComponent ; + skos:altLabel "Autoruns" . + +d3f:SystemMapping a d3f:SystemMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System Mapping" ; + d3f:d3fend-id "D3-SYSM" ; + d3f:definition "System mapping encompasses the techniques to identify the organization's systems, how they are configured and decomposed into subsystems and components, how they are dependent on one another, and where they are physically located." ; + d3f:display-order 2 ; + d3f:enables d3f:Model ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Model ], + d3f:DefensiveTechnique . + +d3f:T1037 a owl:Class ; + rdfs:label "Boot or Logon Initialization Scripts" ; + d3f:attack-id "T1037" ; + d3f:definition "Adversaries may use scripts automatically executed at boot or logon initialization to establish persistence.(Citation: Mandiant APT29 Eye Spy Email Nov 22)(Citation: Anomali Rocke March 2019) Initialization scripts can be used to perform administrative functions, which may often execute other programs or send information to an internal logging server. These scripts can vary based on operating system and whether applied locally or remotely." ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:T1071 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Layer Protocol" ; + d3f:attack-id "T1071" ; + d3f:definition "Adversaries may communicate using OSI application layer protocols to avoid detection/network filtering by blending in with existing traffic. Commands to the remote system, and often the results of those commands, will be embedded within the protocol traffic between the client and server." ; + d3f:may-transfer d3f:CertificateFile ; + d3f:pref-label "Application Layer Protocol C2" ; + d3f:produces d3f:OutboundInternetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-transfer ; + owl:someValuesFrom d3f:CertificateFile ], + [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:OutboundInternetNetworkTraffic ], + d3f:CommandAndControlTechnique . + +d3f:T1134 a owl:Class ; + rdfs:label "Access Token Manipulation" ; + d3f:attack-id "T1134" ; + d3f:definition "Adversaries may modify access tokens to operate under a different user or system security context to perform actions and bypass access controls. Windows uses access tokens to determine the ownership of a running process. A user can manipulate access tokens to make a running process appear as though it is the child of a different process or belongs to someone other than the user that started the process. When this occurs, the process also takes on the security context associated with the new token." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:T1213 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Data from Information Repositories" ; + d3f:accesses d3f:Resource ; + d3f:attack-id "T1213" ; + d3f:definition "Adversaries may leverage information repositories to mine valuable information. Information repositories are tools that allow for storage of information, typically to facilitate collaboration or information sharing between users, and can store a wide variety of data that may aid adversaries in further objectives, or direct access to the target information. Adversaries may also abuse external sharing features to share sensitive documents with recipients outside of the organization." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Resource ], + d3f:CollectionTechnique, + d3f:DiscoveryTechnique . + +d3f:T1505 a owl:Class ; + rdfs:label "Server Software Component" ; + d3f:attack-id "T1505" ; + d3f:definition "Adversaries may abuse legitimate extensible development features of servers to establish persistent access to systems. Enterprise server applications may include features that allow developers to write and install software or scripts to extend the functionality of the main application. Adversaries may install malicious components to extend and abuse server applications.(Citation: volexity_0day_sophos_FW)" ; + rdfs:subClassOf d3f:PersistenceTechnique . + +d3f:T1542 a owl:Class ; + rdfs:label "Pre-OS Boot" ; + d3f:attack-id "T1542" ; + d3f:definition "Adversaries may abuse Pre-OS Boot mechanisms as a way to establish persistence on a system. During the booting process of a computer, firmware and various startup services are loaded before the operating system. These programs control flow of execution before the operating system takes control.(Citation: Wikipedia Booting)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique . + +d3f:T1543 a owl:Class ; + rdfs:label "Create or Modify System Process" ; + d3f:attack-id "T1543" ; + d3f:definition "Adversaries may create or modify system-level processes to repeatedly execute malicious payloads as part of persistence. When operating systems boot up, they can start processes that perform background system functions. On Windows and Linux, these system processes are referred to as services.(Citation: TechNet Services) On macOS, launchd processes known as [Launch Daemon](https://attack.mitre.org/techniques/T1543/004) and [Launch Agent](https://attack.mitre.org/techniques/T1543/001) are run to finish system initialization and load user specific parameters.(Citation: AppleDocs Launch Agent Daemons)" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:T1558 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Steal or Forge Kerberos Tickets" ; + d3f:attack-id "T1558" ; + d3f:definition "Adversaries may attempt to subvert Kerberos authentication by stealing or forging Kerberos tickets to enable [Pass the Ticket](https://attack.mitre.org/techniques/T1550/003). Kerberos is an authentication protocol widely used in modern Windows domain environments. In Kerberos environments, referred to as “realms”, there are three basic participants: client, service, and Key Distribution Center (KDC).(Citation: ADSecurity Kerberos Ring Decoder) Clients request access to a service and through the exchange of Kerberos tickets, originating from KDC, they are granted access after having successfully authenticated. The KDC is responsible for both authentication and ticket granting. Adversaries may attempt to abuse Kerberos by stealing tickets or forging tickets to enable unauthorized access." ; + d3f:may-access d3f:KerberosTicket ; + d3f:may-create d3f:KerberosTicket ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:KerberosTicket ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:KerberosTicket ], + d3f:CredentialAccessTechnique . + +d3f:T1578 a owl:Class ; + rdfs:label "Modify Cloud Compute Infrastructure" ; + d3f:attack-id "T1578" ; + d3f:definition "An adversary may attempt to modify a cloud account's compute service infrastructure to evade defenses. A modification to the compute service infrastructure can include the creation, deletion, or modification of one or more components such as compute instances, virtual machines, and snapshots." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1596 a owl:Class ; + rdfs:label "Search Open Technical Databases" ; + d3f:attack-id "T1596" ; + d3f:definition "Adversaries may search freely available technical databases for information about victims that can be used during targeting. Information about victims may be available in online databases and repositories, such as registrations of domains/certificates as well as public collections of network data/artifacts gathered from traffic and/or scans.(Citation: WHOIS)(Citation: DNS Dumpster)(Citation: Circl Passive DNS)(Citation: Medium SSL Cert)(Citation: SSLShopper Lookup)(Citation: DigitalShadows CDN)(Citation: Shodan)" ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:TimeSeriesAnalysis a owl:Class, + owl:NamedIndividual ; + rdfs:label "Time Series Analysis" ; + d3f:d3fend-id "D3A-TSA" ; + d3f:definition "Time series analysis comprises methods for analyzing time series data in order to extract meaningful statistics and other characteristics of the data." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Time series. [Link](https://en.wikipedia.org/wiki/Time_series)""" ; + rdfs:subClassOf d3f:StatisticalMethod . + +d3f:User a owl:Class, + owl:NamedIndividual ; + rdfs:label "User" ; + d3f:definition "A user is a person [or agent] who uses a computer or network service. Users generally use a system or a software product without the technical expertise required to fully understand it. Power users use advanced features of programs, though they are not necessarily capable of computer programming and system administration. A user often has a user account and is identified to the system by a username (or user name). Other terms for username include login name, screenname (or screen name), nickname (or nick) and handle, which is derived from the identical Citizen's Band radio term. Some software products provide services to other systems and have no direct end users." ; + d3f:has-account d3f:UserAccount ; + d3f:restricted-by d3f:AccessControlList ; + rdfs:isDefinedBy ; + rdfs:seeAlso d3f:UserAccount, + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restricted-by ; + owl:someValuesFrom d3f:AccessControlList ], + [ a owl:Restriction ; + owl:onProperty d3f:has-account ; + owl:someValuesFrom d3f:UserAccount ], + d3f:Agent, + d3f:DigitalInformationBearer . + +d3f:WebSessionAccessMediation a d3f:WebSessionAccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Session Access Mediation" ; + d3f:d3fend-id "D3-WSAM" ; + d3f:definition "Web session access mediation secures user sessions in web applications by employing robust authentication and integrity validation, along with adaptive threat mitigation techniques, to ensure that access to web resources is authorized and protected from session-related attacks." ; + d3f:isolates d3f:ServiceApplicationProcess ; + d3f:kb-article """## How it works + +Web Session Access Mediation involves managing user access to web applications and services, ensuring secure and authorized sessions. This includes authenticating users, maintaining session integrity, and protecting against threats like session hijacking. Examples include accessing corporate intranets, SaaS applications, or online portals.""" ; + d3f:kb-reference d3f:Reference-NIST-Special-Publication-800-41-Revision-1 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:ServiceApplicationProcess ], + d3f:NetworkResourceAccessMediation . + +d3f:attack-may-be-countered-by a owl:ObjectProperty ; + rdfs:label "attack-may-be-countered-by" ; + rdfs:subPropertyOf d3f:may-be-tactically-associated-with . + +d3f:counters a owl:ObjectProperty ; + rdfs:label "counters" ; + rdfs:subPropertyOf d3f:may-counter . + +d3f:d3fend-kb-data-property a owl:DatatypeProperty ; + rdfs:label "d3fend-kb-data-property" ; + d3f:definition "x d3fend-kb-data-property y: The d3fend knowledge base object x has a data property y; e.g., a string capturing a particular aspect or section of a knowledge base article." ; + rdfs:subPropertyOf d3f:d3fend-data-property . + +d3f:d3fend-process-object-property a owl:ObjectProperty ; + rdfs:label "d3fend-process-object-property" ; + rdfs:subPropertyOf d3f:d3fend-object-property . + +d3f:d3fend-tactical-verb-property a owl:ObjectProperty ; + rdfs:label "d3fend-tactical-verb-property" ; + rdfs:subPropertyOf d3f:d3fend-object-property . + +d3f:enumerates a owl:ObjectProperty ; + rdfs:label "enumerates" ; + d3f:definition "x enumerates y: The subject x takes the action of reading from a digital source y to acquire data and create a list of its contents." ; + rdfs:subPropertyOf d3f:reads . + +d3f:may-counter-attack a owl:ObjectProperty ; + rdfs:label "may-counter-attack" ; + rdfs:subPropertyOf d3f:may-be-tactically-associated-with . + +d3f:may-transfer a owl:ObjectProperty ; + rdfs:label "may-transfer" ; + d3f:definition "x may-transfer y: They entity x might send the thing y; that is, 'x transfers y' may be true." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:records a owl:ObjectProperty ; + rdfs:label "records" ; + d3f:definition "x records y: The digital artifact x makes a record of events y; set down in permanent form." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:verifies a owl:ObjectProperty ; + rdfs:label "verifies" ; + d3f:definition "x verifies y: A technique x confirms the truth of a digital artifact y." ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + , + ; + rdfs:subPropertyOf d3f:analyzes, + d3f:associated-with . + +d3f:ActiveLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Active Learning" ; + d3f:d3fend-id "D3A-AL" ; + d3f:definition "Active learning aims to improve learning efficiency by allowing the learning algorithm to select which data to learn from." ; + d3f:kb-article """## How it works +Traditional supervised learning often requires a large number of labeled instances, which can be costly or time-consuming to obtain. Active learning addresses this labeling bottleneck by asking an oracle (e.g., a human annotator) to label selected unlabeled instances. The goal is to achieve high accuracy with minimal labeling effort. + +## Considerations +Active learning is particularly useful in scenarios where data is abundant but labeled instances are scarce or expensive. Examples include speech recognition, information extraction, and document classification. + +## References +- Wikipedia article on Active Learning (machine learning) [Link](https://en.wikipedia.org/wiki/Active_learning_(machine_learning)) +- Settles, B. (2009). Active Learning Literature Survey. [Link](https://burrsettles.com/pub/settles.activelearning.pdf)""" ; + rdfs:subClassOf d3f:MachineLearning . + +d3f:AgentAuthentication a d3f:AgentAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Agent Authentication" ; + d3f:authenticates d3f:Agent ; + d3f:d3fend-id "D3-AA" ; + d3f:definition "Agent authentication is the process of verifying the identities of agents to ensure they are authorized and trustworthy participants within a system." ; + d3f:enables d3f:Harden ; + d3f:kb-reference d3f:Reference-NIST-Special-Publication-800-53-Revision-5 ; + d3f:strengthens d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:strengthens ; + owl:someValuesFrom d3f:UserAccount ], + [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Harden ], + [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:Agent ], + d3f:DefensiveTechnique . + +d3f:AnalyticalPurpose a owl:Class ; + rdfs:label "Analytical Purpose" ; + rdfs:subClassOf d3f:Goal . + +d3f:AssetVulnerabilityEnumeration a d3f:AssetVulnerabilityEnumeration, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Asset Vulnerability Enumeration" ; + d3f:d3fend-id "D3-AVE" ; + d3f:definition "Asset vulnerability enumeration enriches inventory items with knowledge identifying their vulnerabilities." ; + d3f:evaluates d3f:PhysicalArtifact, + d3f:Software ; + d3f:identifies d3f:Vulnerability ; + d3f:kb-reference d3f:Reference-AutomatedComputerVulnerabilityResolutionSystem, + d3f:Reference-SecurityVulnerabilityInformationAggregation, + d3f:Reference-SystemAndMethodForVulnerabilityRiskAssessment ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:evaluates ; + owl:someValuesFrom d3f:Software ], + [ a owl:Restriction ; + owl:onProperty d3f:evaluates ; + owl:someValuesFrom d3f:PhysicalArtifact ], + [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:Vulnerability ], + d3f:AssetInventory . + +d3f:AuthenticationCacheInvalidation a d3f:AuthenticationCacheInvalidation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Authentication Cache Invalidation" ; + d3f:d3fend-id "D3-ANCI" ; + d3f:definition "Removing tokens or credentials from an authentication cache to prevent further user associated account accesses." ; + d3f:deletes d3f:Credential ; + d3f:kb-article """## How it works +Applications can locally cache user authentication credentials for certain server connections. An application may attempt to use the cached credential for a connection. If the cached credentials exist then the user will not be typically prompted for new credentials. + + +## Considerations +Are these cached credentials only on the local host? Can they be persisted to the remote server? + +## Examples +Windows Credential Management API""" ; + d3f:kb-reference d3f:Reference-SecureCachingOfServerCredentials_DellProductsLP, + d3f:Reference-SystemAndMethodForProvidingAnActivelyInvalidatedClient-sideNetworkResourceCache_IMVU ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:deletes ; + owl:someValuesFrom d3f:Credential ], + d3f:CredentialEviction . + +d3f:BootLoader a owl:Class, + owl:NamedIndividual ; + rdfs:label "Boot Loader" ; + d3f:definition "A bootloader is software that is responsible for booting a computer. When a computer is turned off, its software‍-‌including operating systems, application code, and data‍-‌remains stored on non-volatile memory. When the computer is powered on, it typically does not have an operating system or its loader in random-access memory (RAM). The computer first executes a relatively small program stored in read-only memory (ROM, and later EEPROM, NOR flash) along with some needed data, to initialize RAM (especially on x86 systems) to access the nonvolatile device (usually block device, eg NAND flash) or devices from which the operating system programs and data can be loaded into RAM." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Software ; + skos:altLabel "Bootloader" . + +d3f:CWE-140 a owl:Class ; + rdfs:label "Improper Neutralization of Delimiters" ; + d3f:cwe-id "CWE-140" ; + rdfs:subClassOf d3f:CWE-138 . + +d3f:CWE-400 a owl:Class ; + rdfs:label "Uncontrolled Resource Consumption" ; + d3f:cwe-id "CWE-400" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-522 a owl:Class ; + rdfs:label "Insufficiently Protected Credentials" ; + d3f:cwe-id "CWE-522" ; + rdfs:subClassOf d3f:CWE-1390, + d3f:CWE-668 . + +d3f:CWE-670 a owl:Class ; + rdfs:label "Always-Incorrect Control Flow Implementation" ; + d3f:cwe-id "CWE-670" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-696 a owl:Class ; + rdfs:label "Incorrect Behavior Order" ; + d3f:cwe-id "CWE-696" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-732 a owl:Class ; + rdfs:label "Incorrect Permission Assignment for Critical Resource" ; + d3f:cwe-id "CWE-732" ; + rdfs:subClassOf d3f:CWE-285, + d3f:CWE-668 . + +d3f:CertificatePinning a d3f:CertificatePinning, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Certificate Pinning" ; + d3f:authenticates d3f:PublicKey ; + d3f:d3fend-id "D3-CP" ; + d3f:definition "Persisting either a server's X.509 certificate or their public key and comparing that to server's presented identity to allow for greater client confidence in the remote server's identity for SSL connections." ; + d3f:hardens d3f:Certificate ; + d3f:kb-article """## How it works +Pinning allows for a trusted copy of a certificate or public key to be associated with a server and thus reducing the likelihood of frequently visited sites being subjected to man-in-the-middle attacks. Certificates or public keys can be pinned after a trusted connection has been established or the pinning can be preloaded in an application, which is the preferred method for mobile applications. + +Pinning can take the form of certificate pinning or public key pinning. + +## Forms of Pinning +* Certificate Pinning (CP) allows for the client to verify the X.509 certificate with a preloaded certificate. Typically, this is involves storing a hash of the certificate and using the stored hash for comparison to the hash of the certificate submitted during the SSL handshake. + +* Public Key Pinning (PKP) requires the extraction of a public key from server's certificate. The stored public key is compared to the server's presented public key. A public key is expected to rotate less frequently than an X.509 certificate and is generally favored over certificate pinning. + +An extension of PKP is Subject Public Key Information Pinning (SPKI) includes public key pinning plus additional information for SSL connections. The additional information can include preferred algorithms. + +## Considerations + +* With pinned certificates whenever a server updates its certificate, the pinned certificates will also need to be updated +* With pinned public keys the extracted key may be subject to key refresh policies but much less frequently +* Servers can become unavailable if pinned objects are set and not updated with the rotated identities. This may require a pinning strategy to be developed. +* The application of this technique within web browser applications has been [deprecated](https://developer.mozilla.org/en-US/docs/Web/HTTP/Public_Key_Pinning) by popular web browser developers. They now favor certificate analysis via public certificate transparency logs, and the EXPECT-CT HTTP header.""" ; + d3f:kb-reference d3f:Reference-CertificateAndPublicKeyPinning, + d3f:Reference-End-to-endCertificatePinning, + d3f:Reference-PublicKeyPinningExtensionForHTTP ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:PublicKey ], + [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:Certificate ], + d3f:CredentialHardening . + +d3f:Classification a owl:Class, + owl:NamedIndividual ; + rdfs:label "Classification" ; + d3f:d3fend-id "D3A-CLA" ; + d3f:definition "Classification uses an algorithm to accurately assign test data into specific categories." ; + d3f:kb-article """## How it works +Classification recognizes specific entities within the dataset and attempts to draw some conclusions on how those entities should be labeled or defined. Common classification algorithms are linear classifiers, support vector machines (SVM), decision trees, k-nearest neighbor, and random forest, which are described in more detail below. + +## Considerations: + +There are many different types of classification algorithms for modeling classification predictive modeling problems. + +There is no single theory on how to map algorithms onto problem types; instead, it is generally recommended that a practitioner use controlled experiments and discover which algorithm and algorithm configuration results in the best performance for a given classification task. + +## Key Test Considerations + +- **Machine Learning**: + + - **Verify the dataset quality**: Check the data to make sure it is + free of errors. Quantify the degree of missing values, + outliers, and noise in the data collection. If the data quality + is low, it may be difficult or impossible to create models and + systems with the desired performance. + + - **Verify development datasets are representative** of expected + operational environment and data collection means. Compare + distributions of dataset features and labels with exploratory + data analysis and assess the difference in tests on training + data and tests on evaluation data (where the evaluation data + must be drawn from a representative dataset.) + + - **Use software libraries**: and tools built for ML where possible, so + that the underlying code is verified by prior use.** + + - **Diagnose model errors with domain SMEs**: Have problem domain + SMEs investigate model errors for conditions for which the model + may underperform and suggest refinements. + +- **Classification**: + + - **Use Standard Classification Performance Measures**: Not all of + the following may be necessary, but should be considered for + both verification (developmental test) and operational test + stages use: + + - **Accuracy**: The fraction of predictions that were corret. + + - **Precision**: The proportion of positive identifications that were correct. + + - **Recall**: The proportion of actual positive cases identified correctly. + + - **F-Measure**: Combines the preicion and recall into a single + score. It is the harmonic mean of the precision and recall. + + - **Receiver Operating Characteristic (ROC) Curve**: A ROC curve + shows the performance of a classification model at all + classification thresholds. It graphs the True Positive Rate + over the False Positive Rate. + + - **Area Under the ROC Curve (AUC)**: This measures the + two-dimensional area under the ROC Curve. AUC is + scale-invariant and classification-threshold invariant. + + - **ROC TP vs FP points**: In addition to a specific AUC score, + the performance at points + + - **Confusion Matrix**: A confusion matrix is a table layout that + allows the visualization of the performance of an + algorithm. Each row of the matrix represents the instances in + an actual class while each column represents the instances in + a predicted class, or vice versa. It is a special kind of + contingency table, with two dimensions ("actual" and + "predicted"), and identical sets of "classes" in both + dimensions (each combination of dimension and class is a + variable in the contingency table.) + + - **Prediction Bias**: The difference between the average of the + predicted labels and the average of the labels in the data + set. One should check for prediction bias when evaluating the + classifier's results. Causes of bias can include: + + - **Noisy data set**: Errors in original data can as the + collection method may have an underlying bias. + + - **Processing bug**: Errors in the data pipeline can + introduce bias. + + - **Biased training sample (unbalanced samples)**: Model + parameters may be skewed towards majority classes. + + - **Overly strong regularization**: Model may be underfitting + model and too simple. + + - **Proxy variables**: Model features may be highly + correlated. + + - **Overfitting and Underfitting**: Overfitting occurs when the the + model built corresponds too closely or exactly to a particular + set of data, and thus may fail to fit to predict additional data + reliably. An overfitted model is a mathematical model that + contains more parameters than can be justified by the data. + Underfitting occurs when the model built does adequately capture + the patterns in the data. As an example, a linear model will + underfit a non-linear dataset. + +## Platforms, Tools, or Libraries: + +- **Python**: + + - **scikit-learn**: Is a free software machine learning library for + Python and includes features for classification. + + - **TensorFlow**: is an end-to-end source machine learning + platform. + + - **Keras**: is an open-source library that provides a Python API + designed to enable fast experimentation with deep neural networks. + + - **PyTorch**: Is a machine learning framework based on the Torch + library. + +- **R**: + + - **caret**: Classification And REgression Training package contains + functions to streamline model training for complex regression + and classification problems. + + - **randomForest**: Implementation of classification and regression + based on forest of trees. + +## References + +1. Supervised Learning. IBM. +[Link](https://www.ibm.com/topics/supervised-learning). + +1. Types of Classification in Machine Learning. Machine Learning Mastery. +[Link](https://machinelearningmastery.com/types-of-classification-in-machine-learning/). + +1. Google. (18 July 2022). Classification: Precision and Recall. +[Link](https://developers.google.com/machine-learning/crash-course/classification/precision-and-recall). + +1. Wikipedia. (18 Aug 2023). Overfitting. +[Link](https://en.wikipedia.org/wiki/Overfitting). + +1. Wikipedia. (19 Aug 2023). Confusion matrix. +[Link](https://en.wikipedia.org/wiki/Confusion_matrix).""" ; + rdfs:subClassOf d3f:SupervisedLearning . + +d3f:CloudUserAccount a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cloud User Account" ; + d3f:definition "A user account on a given host is a local user account for a given cloud and specified resources within that cloud." ; + rdfs:subClassOf d3f:UserAccount . + +d3f:Command a owl:Class, + owl:NamedIndividual ; + rdfs:label "Command" ; + d3f:definition "In computing, a command is a directive to a computer program acting as an interpreter of some kind, in order to perform a specific task. Most commonly a command is either a directive to some kind of command-line interface, such as a shell, or an event in a graphical user interface triggered by the user selecting an option in a menu." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformation . + +d3f:ContainerImage a owl:Class, + owl:NamedIndividual ; + rdfs:label "Container Image" ; + d3f:definition """A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings. + +:S + +Container images become containers at runtime and in the case of Docker containers - images become containers when they run on Docker Engine. Available for both Linux and Windows-based applications, containerized software will always run the same, regardless of the infrastructure. Containers isolate software from its environment and ensure that it works uniformly despite differences for instance between development and staging.""" ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ComputingImage, + d3f:SoftwarePackage . + +d3f:DecoyNetworkResource a d3f:DecoyNetworkResource, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Decoy Network Resource" ; + d3f:d3fend-id "D3-DNR" ; + d3f:definition "Deploying a network resource for the purposes of deceiving an adversary." ; + d3f:kb-article """## How it works +Decoy network resources are deployed to web application servers, network file shares, or other network based sharing services. + +A "honeypot" may serve a variety of decoy network resources. + +## Considerations + +* Developing a deployment and placement strategy for the decoy network resource. +* Personnel responsible for creation of decoy networks should consider the potential for resource exhaustion through denial of service attacks. + +## Examples +* Honeypots are typically used to mimic a known system with fake vulnerabilities. This may attract attackers to the honeypot. +* Decoy accounts are also used to scan for attempted logins. The decoy accounts can provide security analysts with the attacker's potential intents and strategies. +* Tarpits are used to monitor unallocated IP space for unauthorized network activity.""" ; + d3f:kb-reference d3f:Reference-AutomaticallyGeneratingNetworkResourceGroupsAndAssigningCustomizedDecoyPoliciesThereto_IllusiveNetworksLtd, + d3f:Reference-Deception-BasedResponsesToSecurityAttacks_CrowdstrikeInc, + d3f:Reference-DynamicSelectionAndGenerationOfAVirtualCloneForDetonationOfSuspiciousContentWithinAHoneyNetwork_PaloAltoNetworksInc, + d3f:Reference-SystemAndMethodForIdentifyingThePresenceOfMalwareUsingMini-trapsSetAtNetworkEndpoints_FidelisCybersecuritySolutionsInc ; + d3f:spoofs d3f:NetworkResource ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:spoofs ; + owl:someValuesFrom d3f:NetworkResource ], + d3f:DecoyObject . + +d3f:FTPEvent a owl:Class ; + rdfs:label "FTP Event" ; + d3f:definition "An event involving the File Transfer Protocol (FTP), a standard network protocol used to transfer files between a client and server over a TCP/IP network. FTP facilitates operations such as file uploads, downloads, directory listing, and remote file management." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:FileTransferNetworkTraffic ], + d3f:ApplicationLayerEvent, + d3f:TCPEvent . + +d3f:FileSystemLink a owl:Class, + owl:NamedIndividual ; + rdfs:label "File System Link" ; + d3f:definition "A file system link associates a name with a file on a file system. Most generally, this may be a direct reference (a hard link) or an indirect one (a soft link)." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:GetRunningProcesses a owl:Class, + owl:NamedIndividual ; + rdfs:label "Get Running Processes" ; + d3f:enumerates d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enumerates ; + owl:someValuesFrom d3f:Process ], + d3f:SystemCall . + +d3f:GetSystemTime a owl:Class, + owl:NamedIndividual ; + rdfs:label "Get System Time" ; + d3f:definition "A system call that gets the system time. For POSIX.1 systems, time() invokes a call to get the system time." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:SystemCall . + +d3f:GroupManagementEvent a owl:Class ; + rdfs:label "Group Management Event" ; + d3f:definition "An event involving the creation, modification, or deletion of a group, or changes to its membership and privileges. Group management events facilitate the enforcement of role-based access control by organizing users and permissions into logical units for streamlined administration and policy enforcement." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:AccessControlGroup ], + d3f:DigitalEvent . + +d3f:GroupPolicy a owl:Class, + owl:NamedIndividual ; + rdfs:label "Group Policy" ; + d3f:definition "Group Policy is a feature of the Microsoft Windows NT family of operating systems that controls the working environment of user accounts and computer accounts. Group Policy provides the centralized management and configuration of operating systems, applications, and users' settings in an Active Directory environment. A version of Group Policy called Local Group Policy (\"LGPO\" or \"LocalGPO\") also allows Group Policy Object management on standalone and non-domain computers." ; + rdfs:subClassOf d3f:AccessControlConfiguration . + +d3f:HomogenousTransferLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Homogenous Transfer Learning" ; + d3f:d3fend-id "D3A-HTL" ; + d3f:definition "In homogeneous transfer learning, the feature spaces of the source and target domains is of the same dimension (Ds = Dt) while the data of both domains is represented by the same attributes (Xs = Xt) and labels (Ys = Yt). Thus, homogeneous transfer learning aims to bridge the gap in the data distributions experienced during cross-domain transfer." ; + d3f:kb-article """## References +Khalil, K., Asgher, U., & Ayaz, Y. (2022). Novel fNIRS study on homogeneous symmetric feature-based transfer learning for brain-computer interface. Scientific Reports, 12, 3198. [Link](https://www.nature.com/articles/s41598-022-06805-4).""" ; + rdfs:subClassOf d3f:TransferLearning . + +d3f:IntranetNetwork a owl:Class, + owl:NamedIndividual ; + rdfs:label "Intranet Network" ; + d3f:definition "An intranet is a private network accessible only to an organization's staff or delegates. Generally a wide range of information and services from the organization's internal IT systems are available that would not be available to the public from the Internet. A company-wide intranet can constitute an important focal point of internal communication and collaboration, and provide a single starting point to access internal and external resources. In its simplest form an intranet is established with the technologies for local area networks (LANs) and wide area networks (WANs)." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Network . + +d3f:JobSchedulerSoftware a owl:Class, + owl:NamedIndividual ; + rdfs:label "Job Scheduler Software" ; + d3f:creates d3f:ScheduledJob ; + d3f:definition "A job scheduler software is operating system software that when run executes scheduled tasks (time-scheduling in the sense of wall clock time; not operating system scheduling of processes for multitasking). Processes running such software are task scheduler processes. In Windows, Scheduled Tasks are created and managed by the Task Scheduler. In Unix-like OSes, the `cron` utitility serves a similar role." ; + d3f:modifies d3f:JobSchedule, + d3f:ScheduledJob ; + d3f:synonym "Task Scheduler Software" ; + rdfs:seeAlso d3f:ScheduledJob, + , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:ScheduledJob ], + [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:ScheduledJob ], + [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:JobSchedule ], + d3f:SystemServiceSoftware . + +d3f:KerberosTicket a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kerberos Ticket" ; + d3f:definition "An access ticket/token issued by a Kerberos system." ; + rdfs:subClassOf d3f:AccessToken . + +d3f:Kernel-basedProcessIsolation a d3f:Kernel-basedProcessIsolation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Kernel-based Process Isolation" ; + d3f:d3fend-id "D3-KBPI" ; + d3f:definition "Using kernel-level capabilities to isolate processes." ; + d3f:isolates d3f:Process ; + d3f:kb-reference d3f:Reference-OverviewOfTheSeccompSandbox ; + rdfs:comment "e.g. KVM" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:Process ], + d3f:ExecutionIsolation . + +d3f:LocalAreaNetwork a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Area Network" ; + d3f:definition "A local area network (LAN) is a computer network that interconnects computers within a limited area such as a residence, school, laboratory, university campus or office building and has its network equipment and interconnects locally managed. Ethernet and Wi-Fi are the two most common transmission technologies in use for local area networks. Historical technologies include ARCNET, Token ring, and AppleTalk." ; + d3f:may-contain d3f:Host ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:Host ], + d3f:Network ; + skos:altLabel "LAN" . + +d3f:LogicalLink a owl:Class, + owl:NamedIndividual ; + rdfs:label "Logical Link" ; + rdfs:subClassOf d3f:Link . + +d3f:MailServer a owl:Class, + owl:NamedIndividual ; + rdfs:label "Mail Server" ; + d3f:definition "Within the Internet email system, a message transfer agent or mail transfer agent (MTA) or mail relay is software that transfers electronic mail messages from one computer to another using SMTP. The terms mail server, mail exchanger, and MX host are also used in some contexts. Messages exchanged across networks are passed between mail servers, including any attached data files (such as images, multimedia or documents). These servers also often keep mailboxes for email. Access to this email by end users is typically either via webmail or an email client." ; + d3f:runs d3f:MessageTransferAgent ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:runs ; + owl:someValuesFrom d3f:MessageTransferAgent ], + d3f:Server ; + skos:altLabel "Email Server Resource", + "MTA", + "MX Host", + "Mail Exchanger", + "Mail transfer agent", + "Message transfer agent" . + +d3f:MemoryEvent a owl:Class ; + rdfs:label "Memory Event" ; + d3f:definition "An event capturing operations on the memory resources of a system, encompassing allocation, modification, access, protection, or deallocation." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:MemoryAddress ], + [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:MemoryExtent ], + d3f:DigitalEvent . + +d3f:NTPEvent a owl:Class ; + rdfs:label "NTP Event" ; + d3f:definition "An event involving the Network Time Protocol (NTP), a protocol designed to synchronize the clocks of computer systems over packet-switched, variable-latency data networks, UDP as its transport protocol." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:NetworkTimeServer ], + d3f:ApplicationLayerEvent, + d3f:UDPEvent . + +d3f:NetworkConnectionEvent a owl:Class ; + rdfs:label "Network Connection Event" ; + d3f:definition "An event related to the establishment, maintenance, or termination of a network connection." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:NetworkSession ], + d3f:NetworkEvent . + +d3f:NetworkFileShareResource a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network File Share Resource" ; + d3f:definition "A shared file resource, or network file share, is a computer file made available from one host to other hosts on a computer network. Network sharing is made possible by inter-process communication over the network. It includes both files and directories." ; + rdfs:subClassOf d3f:NetworkResource . + +d3f:NetworkMapping a d3f:NetworkMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Mapping" ; + d3f:d3fend-id "D3-NM" ; + d3f:definition "Network mapping encompasses the techniques to identify and model the physical layer, network layer, and data exchange layers of the organization's network and their physical location, and determine allowed pathways through that network." ; + d3f:display-order 3 ; + d3f:enables d3f:Model ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Model ], + d3f:DefensiveTechnique . + +d3f:OSAPICreateThread a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Create Thread" ; + d3f:invokes d3f:CreateThread ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateThread ], + d3f:OSAPISystemFunction . + +d3f:OSAPIOpenFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Open File" ; + d3f:invokes d3f:OpenFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:OpenFile ], + d3f:OSAPISystemFunction . + +d3f:ObjectEviction a d3f:ObjectEviction, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Object Eviction" ; + d3f:d3fend-id "D3-OE" ; + d3f:definition "Terminate or remove an object from a host machine. This is the broadest class for object eviction." ; + d3f:enables d3f:Evict ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Evict ], + d3f:DefensiveTechnique . + +d3f:OpenFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Open File" ; + d3f:accesses d3f:File ; + d3f:definition "For most file systems, a program initializes access to a file in a file system using the open system call. This allocates resources associated to the file (the file descriptor), and returns a handle that the process will use to refer to that file. In some cases the open is performed by the first access. During the open, the filesystem may allocate memory for buffers, or it may wait until the first operation. Various other errors which may occur during the open include directory update failures, un-permitted multiple connections, media failures, communication link failures and device failures." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:File ], + d3f:SystemCall . + +d3f:Organization a owl:Class, + owl:NamedIndividual ; + rdfs:label "Organization" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-member ; + owl:someValuesFrom d3f:Person ], + d3f:AgentGroup, + d3f:Non-PersonEntity . + +d3f:OutboundInternetEncryptedWebTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Internet Encrypted Web Traffic" ; + d3f:definition "Outbound internet encrypted web traffic is network traffic using a standard web protocol on an outgoing connection initiated from a host within a network to a host outside the network." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OutboundInternetEncryptedTraffic, + d3f:OutboundInternetWebTraffic . + +d3f:OutboundNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Network Traffic" ; + d3f:definition "Outbound traffic is network traffic originating from a host of interest (client), to another host (server)." ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:Partition a owl:Class, + owl:NamedIndividual ; + rdfs:label "Partition" ; + d3f:definition "A partition is a region on secondary storage device created so that the region can be managed by itself; separate from any other regions (partitions) on that secondary storage device. Creating partitions is typically the first step of preparing a newly installed storage device, before any file system is created. The device stores the information about the partitions' locations and sizes in an area known as the partition table that the operating system reads before any other part of the disk. Each partition then appears to the operating system as a distinct \"logical\" storage device that uses part of the actual device. System administrators use a program called a partition editor to create, resize, delete, and manipulate the partitions. Partitioning allows the use of different filesystems to be installed for different kinds of files. Separating user data from system data can prevent the system partition from becoming full and rendering the system unusable. Partitioning can also make backing up easier. [Definition adapted as generalization from definition of disk partitioning and distinct from in-memory partitions.]" ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "Disk Partition", + "Disk Slice" . + +d3f:PasswordFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Password File" ; + d3f:definition "Simple form of password database held in a single file (e.g., /etc/password)" ; + rdfs:subClassOf d3f:File, + d3f:PasswordDatabase . + +d3f:ProcessEvent a owl:Class ; + rdfs:label "Process Event" ; + d3f:definition "An event capturing lifecycle transitions, interactions, or activities of computer processes, including their creation, termination, and inter-process communication." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Process ], + d3f:DigitalEvent . + +d3f:ProcessEviction a d3f:ProcessEviction, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Eviction" ; + d3f:d3fend-id "D3-PE" ; + d3f:definition "Process eviction techniques terminate or remove running process." ; + d3f:enables d3f:Evict ; + d3f:kb-reference d3f:Reference-MalwareDetectionUsingLocalComputationalModels_CrowdstrikeInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Evict ], + d3f:DefensiveTechnique . + +d3f:ProcessSegmentExecutionPrevention a d3f:ProcessSegmentExecutionPrevention, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Segment Execution Prevention" ; + d3f:d3fend-id "D3-PSEP" ; + d3f:definition "Preventing execution of any address in a memory region other than the code segment." ; + d3f:kb-article """## How it works + +During execution of a process, the instruction pointer register should only point to addresses in a code segment (also called the .text segment), as this is the sole segment which should contain program code. + +When this technique detects an attempt to execute something that has been designated as non-executable, other techniques such as those in **Process Eviction** might be invoked, such as **Process Termination** to end the current process, or **Executable Blacklisting** to blacklist the potentially vulnerable or malfunctioning executable. + +### Software-based implementations +The software-based implementation in Windows XP SP2 might not check that every time the instruction pointer is changed, and does not check on each jump or return. Before calling an exception handler, Windows XP SP2 software-enforced DEP checks whether the exception handler is located in a memory region marked as executable. If the program was also built with SafeSEH, this implementation also checks before changing control to the exception handler whether it is a registered exception handler in the program's file on disk. + +### Hardware-based implementations +The NX (No Execute) or XD (Execute Disable) bit on the processor specifies whether a certain part of memory is executable. Early implementations set this bit by the memory segment, while modern implementations which are built on the flat memory model often store this bit in each entry of the page table, to control execution by the page. + + +## Considerations + +Non-hardware process data segment execution prevention is more susceptible to being able to be turned off for a page of memory. + +Different implementations of this defense have been in place since the 1980s, but implementation stalled when larger 16-bit programs began stuffing code in the segments usually reserved for data. Many modern programs follow the best practice of separation of code and data, are able to run under this defense. + +ROP or ret2libc/return-to-function attacks could bypass this defense, as although they may pass attacker-controlled data or stack frames to a function, they abuse functions that are legitimately located in the .text segment (code segment) of the program. For those, more advanced defenses such as a table of valid jump addresses, function call analysis, or return depth analysis could be used.""" ; + d3f:kb-reference d3f:Reference-DataExecutionPrevention_Microsoft, + d3f:Reference-WhatIsNX_XDFeature_RedHat ; + d3f:neutralizes d3f:ProcessSegment ; + d3f:synonym "Execute Disable", + "No Execute" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:neutralizes ; + owl:someValuesFrom d3f:ProcessSegment ], + d3f:ApplicationHardening . + +d3f:ProcessorRegister a owl:Class, + owl:NamedIndividual ; + rdfs:label "Processor Register" ; + d3f:contained-by d3f:CentralProcessingUnit ; + d3f:definition "A processor register is a quickly accessible location available to a computer's processor. Registers usually consist of a small amount of fast storage, although some registers have specific hardware functions, and may be read-only or write-only." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contained-by ; + owl:someValuesFrom d3f:CentralProcessingUnit ], + d3f:PrimaryStorage . + +d3f:RPCNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "RPC Network Traffic" ; + d3f:definition "RPC network traffic is network traffic related to remote procedure calls between network nodes..This includes only network traffic conforming to a standard RPC protocol; not custom protocols." ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:RawMemoryAccessFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Raw Memory Access Function" ; + d3f:accesses d3f:MemoryBlock ; + d3f:definition "A function which accesses raw memory, usually using memory addresses." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:MemoryBlock ], + d3f:Subroutine . + +d3f:Reference-CatiaUAFPlugin a d3f:InternetArticleReference, + owl:NamedIndividual ; + rdfs:label "Reference - Catia UAF Plugin" ; + d3f:has-link "https://www.3ds.com/products-services/catia/products/no-magic/addons/uaf-plugin/"^^xsd:anyURI ; + d3f:kb-abstract "MagicDraw offers the most robust standards compliant [Unified Architecture Framework (UAF)], DoDAF 2.0, MODAF 1.2, NAF 3, and NAF 4 via a UAF standardized solution. And what's more, No Magic fully supports all architectural framework products ensuring you achieve project results. No Magic also leads the industry in usability and interoprability, ensuring that you avoid unnecessary cost, schedule and performance risk." ; + d3f:kb-organization "Dassault Systemes" ; + d3f:kb-reference-of d3f:DataExchangeMapping, + d3f:OperationalActivityMapping, + d3f:OperationalDependencyMapping, + d3f:OrganizationMapping, + d3f:ServiceDependencyMapping, + d3f:SystemDependencyMapping ; + d3f:kb-reference-title "Catia UAF Plugin" . + +d3f:RegressionAnalysisLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Regression Analysis Learning" ; + d3f:d3fend-id "D3A-RAL" ; + d3f:definition "Regression is used to understand the relationship between dependent and independent variables which is then used to make projections, such as for sales revenue for a given business." ; + d3f:kb-article """## References +Supervised Learning. IBM. [Link](https://www.ibm.com/topics/supervised-learning).""" ; + rdfs:subClassOf d3f:SupervisedLearning . + +d3f:RestoreObject a d3f:RestoreObject, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Restore Object" ; + d3f:d3fend-id "D3-RO" ; + d3f:definition "Restoring an object for an entity to access. This is the broadest class for object restoral." ; + d3f:enables d3f:Restore ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Restore ], + d3f:DefensiveTechnique . + +d3f:SMBEvent a owl:Class ; + rdfs:label "SMB Event" ; + d3f:definition "An event involving the Server Message Block (SMB) protocol, a network file sharing protocol that allows client-server communication for accessing files, printers, and other shared network resources. SMB supports both transactional file operations and communication over reliable transport layers." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:FileTransferNetworkTraffic ], + d3f:ApplicationLayerEvent, + d3f:TCPEvent . + +d3f:SSHEvent a owl:Class ; + rdfs:label "SSH Event" ; + d3f:definition "An event involving the Secure Shell (SSH) protocol, a cryptographic network protocol designed to provide secure remote login, command execution, and data transfer. SSH facilitates encrypted communication between clients and servers, ensuring confidentiality, integrity, and authenticity." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:SSHSession ], + d3f:ApplicationLayerEvent, + d3f:TCPEvent . + +d3f:ScheduledJobEvent a owl:Class ; + rdfs:label "Scheduled Job Event" ; + d3f:definition "An event capturing the lifecycle or management of scheduled tasks within a system, including creation, modification, execution, or removal." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:ScheduledJob ], + d3f:DigitalEvent . + +d3f:Session a owl:Class, + owl:NamedIndividual ; + rdfs:label "Session" ; + d3f:definition "In computer science, in particular networking, a session is a semi-permanent interactive information interchange, also known as a dialogue, a conversation or a meeting, between two or more communicating devices, or between a computer and user (see Login session). A session is set up or established at a certain point in time, and then torn down at some later point. An established communication session may involve more than one message in each direction. A session is typically, but not always, stateful, meaning that at least one of the communicating parts needs to save information about the session history in order to be able to communicate, as opposed to stateless communication, where the communication consists of independent requests with responses." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:SetSystemConfigValue a owl:Class, + owl:NamedIndividual ; + rdfs:label "Set System Config Value" ; + d3f:modifies d3f:SystemConfigurationDatabaseRecord ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:SystemConfigSystemCall . + +d3f:StatisticalMethod a owl:Class, + owl:NamedIndividual ; + rdfs:label "Statistical Method" ; + d3f:d3fend-id "D3A-SM" ; + d3f:definition "Building methods using the mathematical study of the likelihood and probability of events occurring based on known information and inferred by taking a limited number of samples." ; + d3f:kb-article """## References +Wolfram MathWorld. (n.d.). Statistics. [Link](https://mathworld.wolfram.com/Statistics.html)""" ; + rdfs:subClassOf d3f:AnalyticTechnique . + +d3f:SystemConfigurationInitDatabaseRecord a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Configuration Init Database Record" ; + d3f:definition "A database record holding information used to configure the services, parameters, and initial settings for an operating system at startup." ; + rdfs:subClassOf d3f:SystemConfigurationDatabaseRecord, + d3f:SystemConfigurationInitResource, + d3f:SystemInitConfiguration ; + skos:altLabel "System Configuration Startup Database Record" . + +d3f:SystemFirmware a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Firmware" ; + d3f:definition "Firmware that is installed on a computer's main board which manages the initial boot process. It can also continue to run or function after the operating system boots." ; + rdfs:subClassOf d3f:Firmware ; + skos:altLabel "BIOS Firmware", + "UEFI Firmware" . + +d3f:T1137 a owl:Class ; + rdfs:label "Office Application Startup" ; + d3f:attack-id "T1137" ; + d3f:definition "Adversaries may leverage Microsoft Office-based applications for persistence between startups. Microsoft Office is a fairly common application suite on Windows-based operating systems within an enterprise network. There are multiple mechanisms that can be used with Office for persistence when an Office-based application is started; this can include the use of Office Template Macros and add-ins." ; + rdfs:subClassOf d3f:PersistenceTechnique . + +d3f:T1548 a owl:Class ; + rdfs:label "Abuse Elevation Control Mechanism" ; + d3f:attack-id "T1548" ; + d3f:definition "Adversaries may circumvent mechanisms designed to control elevate privileges to gain higher-level permissions. Most modern systems contain native elevation control mechanisms that are intended to limit privileges that a user can perform on a machine. Authorization has to be granted to specific users in order to perform tasks that can be considered of higher risk.(Citation: TechNet How UAC Works)(Citation: sudo man page 2018) An adversary can perform several methods to take advantage of built-in control mechanisms in order to escalate privileges on a system.(Citation: OSX Keydnap malware)(Citation: Fortinet Fareit)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:T1553 a owl:Class ; + rdfs:label "Subvert Trust Controls" ; + d3f:attack-id "T1553" ; + d3f:definition "Adversaries may undermine security controls that will either warn users of untrusted activity or prevent execution of untrusted programs. Operating systems and security products may contain mechanisms to identify programs or websites as possessing some level of trust. Examples of such features would include a program being allowed to run because it is signed by a valid code signing certificate, a program prompting the user with a warning because it has an attribute set from being downloaded from the Internet, or getting an indication that you are about to connect to an untrusted site." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1555 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Credentials from Password Stores" ; + d3f:accesses d3f:PasswordStore ; + d3f:attack-id "T1555" ; + d3f:definition "Adversaries may search for common password storage locations to obtain user credentials.(Citation: F-Secure The Dukes) Passwords are stored in several places on a system, depending on the operating system or application holding the credentials. There are also specific applications and services that store passwords to make them easier for users to manage and maintain, such as password managers and cloud secrets vaults. Once credentials are obtained, they can be used to perform lateral movement and access restricted information." ; + d3f:may-access d3f:DatabaseFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:DatabaseFile ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:PasswordStore ], + d3f:CredentialAccessTechnique . + +d3f:T1590 a owl:Class ; + rdfs:label "Gather Victim Network Information" ; + d3f:attack-id "T1590" ; + d3f:definition "Adversaries may gather information about the victim's networks that can be used during targeting. Information about networks may include a variety of details, including administrative data (ex: IP ranges, domain names, etc.) as well as specifics regarding its topology and operations." ; + rdfs:subClassOf d3f:ReconnaissanceTechnique . + +d3f:T1608 a owl:Class ; + rdfs:label "Stage Capabilities" ; + d3f:attack-id "T1608" ; + d3f:definition "Adversaries may upload, install, or otherwise set up capabilities that can be used during targeting. To support their operations, an adversary may need to take capabilities they developed ([Develop Capabilities](https://attack.mitre.org/techniques/T1587)) or obtained ([Obtain Capabilities](https://attack.mitre.org/techniques/T1588)) and stage them on infrastructure under their control. These capabilities may be staged on infrastructure that was previously purchased/rented by the adversary ([Acquire Infrastructure](https://attack.mitre.org/techniques/T1583)) or was otherwise compromised by them ([Compromise Infrastructure](https://attack.mitre.org/techniques/T1584)). Capabilities may also be staged on web services, such as GitHub or Pastebin, or on Platform-as-a-Service (PaaS) offerings that enable users to easily provision applications.(Citation: Volexity Ocean Lotus November 2020)(Citation: Dragos Heroku Watering Hole)(Citation: Malwarebytes Heroku Skimmers)(Citation: Netskope GCP Redirection)(Citation: Netskope Cloud Phishing)" ; + rdfs:subClassOf d3f:ResourceDevelopmentTechnique . + +d3f:TransferAgentAuthentication a d3f:TransferAgentAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Transfer Agent Authentication" ; + d3f:d3fend-id "D3-TAAN" ; + d3f:definition "Validating that server components of a messaging infrastructure are authorized to send a particular message." ; + d3f:kb-article """## How it works +Transfer Agent Authentication can be accomplished in different ways for depending on the protocol. In Email, Sender Policy Framework (SPF), Domain Key Identified Email (DKIM) or Domain-based Message Authentication Reporting and Conformance (DMARC) are used to validate sender domain ownership. + +### SPF +SPF protocol allows for mail domain owners to specify the mail servers they use when sending email. SPF requires the use of SPF records published in the Domain Name System (DNS). The records record the authorized IPs for email senders. SPF uses the return-path address for domain IP identification. Email that is forwarded may cause the return-path validation problems. +### DKIM +DKIM also uses a record entry in DNS for authentication but does not rely on the simple return-path for validation. A signature header is added to email and encryption is used for security. This adds an additional layer of complexity and requires that DKIM servers be configured identified cryptographic signatures. The additional complexity results in a validation process that can survive complex routing of emails. + +### DMARC +DMARC is an email policy and authentication protocol that seeks to ensure that the "From" field of emails is not spoofed. DMARC makes use of both SPF records and DKIM published key validation. DMARC also has a decision policy framework, contained in a DMARC record, for handling of rejected email. The DMARC framework also updates DMARC domains with authentication statues for allowed senders of that domain. + +## Considerations +- Additional work is required to ensure that all SPF, DKIM and DMARC records are current and up to date. +- Maintenance of DKIM signing keys is needed. +- Using SPF without DKIM and DMARC verifies the Return-Path domain however does not prevent spoofing of the displayed From: address. +- Parts of an email that are not signed or verified by email authentication methods, such as the message body or the header To: and Subject: fields, can be altered or modified. +- Email message authentication does not replace the need to do email content analysis since executables, attachments, or links or other parts of the email beyond the sender domain are not verified.""" ; + d3f:kb-reference d3f:Reference-DomainKeysIdentifiedMail-Signatures-IETF, + d3f:Reference-RFC7208-SenderPolicyFramework-SPF-ForAuthorizingUseOfDomainsInEmail-IETF, + d3f:Reference-RFC7489-Domain-basedMessageAuthentication-Reporting-AndConformance-DMARC ; + rdfs:subClassOf d3f:MessageHardening . + +d3f:UserApplication a owl:Class ; + rdfs:label "User Application" ; + d3f:definition "A user application is executed for that an individual user on a user's personal computer or remotely by means of virtualization. This is in contrast to service applications or enterprise software." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Application . + +d3f:UserDataTransferAnalysis a d3f:UserDataTransferAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "User Data Transfer Analysis" ; + d3f:analyzes d3f:ResourceAccess ; + d3f:d3fend-id "D3-UDTA" ; + d3f:definition "Analyzing the amount of data transferred by a user." ; + d3f:kb-article """## How it works +Unusual data transfer activity may indicate unauthorized activity. Data transfers can be analyzed by collecting network traffic or application logs. + +## Considerations +* There is a potential for false positives from anomalies that are not associated with unauthorized activity. +* Attackers that move low and slow may not differentiate their data transfer behavior enough for an alert to trigger.""" ; + d3f:kb-reference d3f:Reference-SystemAndMethodThereofForIdentifyingAndRespondingToSecurityIncidentsBasedOnPreemptiveForensics_PaloAltoNetworksInc, + d3f:Reference-SystemForImplementingThreatDetectionUsingThreatAndRiskAssessmentOfAsset-actorInteractions_VECTRANETWORKSInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:ResourceAccess ], + d3f:UserBehaviorAnalysis . + +d3f:UserInitConfigurationFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Init Configuration File" ; + d3f:definition "A user initialization configuration file is a file containing the information necessary to configure that part of a user's environment which is common to all applications and actions. User configurations may be overridden by more specific configuration information (such as that found in a application configuration file.)" ; + rdfs:subClassOf d3f:ConfigurationFile, + d3f:UserLogonInitResource ; + skos:altLabel "User Configuration File" . + +d3f:UserLogonInitResource a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Logon Init Resource" ; + d3f:definition "A user logon initialization resource contains information used to configure a user's environment when a user logs into a system." ; + rdfs:subClassOf d3f:LocalResource . + +d3f:UserStartupScriptFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Startup Script File" ; + d3f:definition "A user startup script file is a shortcut file that is executed when a user logs in and starts a session on the host. These indicate applications the user wants started at login. For Windows, these are typically found in the user's startup directory." ; + rdfs:subClassOf d3f:ExecutableScript, + d3f:UserLogonInitResource . + +d3f:Variability a owl:Class, + owl:NamedIndividual ; + rdfs:label "Variability" ; + d3f:d3fend-id "D3A-VAR" ; + d3f:definition "Dispersion (also called variability, scatter, or spread) is the extent to which a distribution is stretched or squeezed. A measure of statistical dispersion is a nonnegative real number that is zero if all the data are the same and increases as the data become more diverse." ; + d3f:kb-article """## References +Wikipedia. (n.d.). Statistical dispersion. [Link](https://en.wikipedia.org/wiki/Statistical_dispersion)""" ; + rdfs:subClassOf d3f:DescriptiveStatistics . + +d3f:Volume a owl:Class, + owl:NamedIndividual ; + rdfs:label "Volume" ; + d3f:definition "In the context of computer operating systems, a volume or logical drive is a single accessible storage area with a single file system, typically (though not necessarily) resident on a single partition of a hard disk. Although a volume might be different from a physical disk drive, it can still be accessed with an operating system's logical interface. However, a volume differs from a partition." ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "Drive Volume", + "Logical Drive" . + +d3f:WebSessionActivityAnalysis a d3f:WebSessionActivityAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Session Activity Analysis" ; + d3f:analyzes d3f:WebResourceAccess ; + d3f:d3fend-id "D3-WSAA" ; + d3f:definition "Monitoring changes in user web session behavior by comparing current web session activity to a baseline behavior profile or a catalog of predetermined malicious behavior." ; + d3f:kb-article """## How it works +User web session data is collected over a period of time to create a user behavior profile. Data collected includes clicks made on a website, average time between clicks, filling out web forms, order in which pages are viewed, and downloading files. Current user web session behavior is then compared against the use behavior profile to identify anomalies and a likelihood that the current user web session is malicious. Current user web session behavior can also be compared to predetermined known malicious behavior profiles that are developed through analysis of malware in run time at a threat research facility. + +## Considerations +* Potential for false positives from anomalies that are not associated with malicious activity. +* Attackers may not differentiate their web session activity enough to trigger an alert.""" ; + d3f:kb-reference d3f:Reference-HostIntrusionPreventionSystemUsingSoftwareAndUserBehaviorAnalysis_SophosLtd, + d3f:Reference-SystemAndMethodForDetectionOfAChangeInBehaviorInTheUseOfAWebsiteThroughVectorVelocityAnalysis_SilverTailSystems, + d3f:Reference-SystemAndMethodForNetworkSecurityIncludingDetectionOfAttacksThroughPartnerWebsites_EMCIPHoldingCoLLC, + d3f:Reference-SystemAndMethodThereofForIdentifyingAndRespondingToSecurityIncidentsBasedOnPreemptiveForensics_PaloAltoNetworksInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:WebResourceAccess ], + d3f:UserBehaviorAnalysis . + +d3f:WindowsNtProtectVirtualMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows NtProtectVirtualMemory" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OSAPIAllocateMemory . + +d3f:copies a owl:ObjectProperty ; + rdfs:label "copies" ; + d3f:definition "x copies y: An technique or agent x reproduces or makes and exact copy of some digital artifact y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:creates . + +d3f:d3fend-data-property a owl:DatatypeProperty ; + rdfs:label "d3fend-data-property" ; + rdfs:subPropertyOf owl:topDataProperty . + +d3f:d3fend-kb-object-property a owl:ObjectProperty ; + rdfs:label "d3fend-kb-object-property" ; + d3f:definition "x d3fend-kb-object-property y: The object y is a d3fend knowledge base object property. These properties allow the linkage of knowledge and information supporting and illustrating the d3fend model." ; + rdfs:subPropertyOf d3f:d3fend-object-property . + +d3f:d3fend-object-property a owl:ObjectProperty ; + rdfs:label "d3fend-object-property" ; + rdfs:subPropertyOf owl:topObjectProperty . + +d3f:evaluates a owl:ObjectProperty ; + rdfs:label "evaluates" ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-evaluate . + +d3f:evicts a owl:ObjectProperty ; + rdfs:label "evicts" ; + rdfs:subPropertyOf d3f:counters, + d3f:d3fend-tactical-verb-property, + d3f:may-evict . + +d3f:manages a owl:ObjectProperty ; + rdfs:label "manages" ; + d3f:definition "x manages y: The technique or agent x watches and directs the use of a digital artifact y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with ; + skos:altLabel "oversees", + "supervises" . + +d3f:runs a owl:ObjectProperty ; + rdfs:label "runs" ; + d3f:definition "x runs y: To carry out a process or program y, as on a computer or a machine x; where y may be a large software assembly or a specific module or instruction. Examples: \"run a new program on the Mac\"; \"the computer runs the application software\"." ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-run . + +d3f:AccessMediation a d3f:AccessMediation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Access Mediation" ; + d3f:d3fend-id "D3-AMED" ; + d3f:definition "Access mediation is the process of granting or denying specific requests to: 1) obtain and use information and related information processing services; and 2) enter specific physical facilities (e.g., Federal buildings, military establishments, border crossing entrances)." ; + d3f:enables d3f:Isolate ; + d3f:kb-reference d3f:Reference-CNNSI-4009 ; + d3f:synonym "Access Control" ; + rdfs:seeAlso , + , + , + , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Isolate ], + d3f:DefensiveTechnique . + +d3f:AdministrativeNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Administrative Network Traffic" ; + d3f:definition "Administrative network traffic is network traffic related to the remote administration or control of hosts or devices through a standard remote administrative protocol. Remote shells, terminals, RDP, and VNC are examples of these protocols, which are typically only used by administrators." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:AssetInventory a d3f:AssetInventory, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Asset Inventory" ; + d3f:d3fend-id "D3-AI" ; + d3f:definition "Asset inventorying identifies and records the organization's assets and enriches each inventory item with knowledge about their vulnerabilities." ; + d3f:display-order 1 ; + d3f:enables d3f:Model ; + d3f:synonym "Asset Discovery", + "Asset Inventorying" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Model ], + d3f:DefensiveTechnique . + +d3f:CWE-1173 a owl:Class ; + rdfs:label "Improper Use of Validation Framework" ; + d3f:cwe-id "CWE-1173" ; + rdfs:subClassOf d3f:CWE-20 . + +d3f:CWE-221 a owl:Class ; + rdfs:label "Information Loss or Omission" ; + d3f:cwe-id "CWE-221" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-312 a owl:Class ; + rdfs:label "Cleartext Storage of Sensitive Information" ; + d3f:cwe-id "CWE-312" ; + rdfs:subClassOf d3f:CWE-311, + d3f:CWE-922 . + +d3f:CWE-436 a owl:Class ; + rdfs:label "Interpretation Conflict" ; + d3f:cwe-id "CWE-436" ; + rdfs:subClassOf d3f:CWE-435 . + +d3f:CWE-610 a owl:Class ; + rdfs:label "Externally Controlled Reference to a Resource in Another Sphere" ; + d3f:cwe-id "CWE-610" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-684 a owl:Class ; + rdfs:label "Incorrect Provision of Specified Functionality" ; + d3f:cwe-id "CWE-684" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-695 a owl:Class ; + rdfs:label "Use of Low-Level Functionality" ; + d3f:cwe-id "CWE-695" ; + rdfs:subClassOf d3f:CWE-573 . + +d3f:CWE-754 a owl:Class ; + rdfs:label "Improper Check for Unusual or Exceptional Conditions" ; + d3f:cwe-id "CWE-754" ; + rdfs:subClassOf d3f:CWE-703 . + +d3f:CentralTendency a owl:Class, + owl:NamedIndividual ; + rdfs:label "Central Tendency" ; + d3f:d3fend-id "D3A-CT" ; + d3f:definition "A measure of central tendency ) is a summary measure that attempts to describe a whole set of data with a single value that represents the middle or centre of its distribution." ; + d3f:kb-article """## References +Australian Bureau of Statistics. (n.d.). Measures of Central Tendency. [Link](https://www.abs.gov.au/statistics/understanding-statistics/statistical-terms-and-concepts/measures-central-tendency) + +Wikipedia. (n.d.). Central tendency. [Link](https://en.wikipedia.org/wiki/Central_tendency)""" ; + rdfs:subClassOf d3f:DescriptiveStatistics . + +d3f:CollectorAgent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Agent" ; + d3f:definition "A network agent is software installed on a network node or device that transmits information back to a collector agent or management system. Kinds of network agents include SNMP Agent, IPMI agents, WBEM agents, and many proprietary agents capturing network monitoring and management information." ; + d3f:synonym "Exporter" ; + rdfs:subClassOf d3f:Software . + +d3f:ComputerNetworkNode a owl:Class ; + rdfs:label "Computer Network Node" ; + d3f:definition "A network node running on a computer platform." ; + rdfs:subClassOf d3f:ComputerPlatform, + d3f:NetworkNode . + +d3f:DatabaseQueryStringAnalysis a d3f:DatabaseQueryStringAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Database Query String Analysis" ; + d3f:analyzes d3f:DatabaseQuery ; + d3f:d3fend-id "D3-DQSA" ; + d3f:definition "Analyzing database queries to detect [SQL Injection](https://capec.mitre.org/data/definitions/66.html)." ; + d3f:kb-article """## How it works + +Some implementations use software hooks to intercept function calls related to database query operations. Other implementations might intercept or collect network traffic. The database query string is then extracted and analyzed with various methods, for example: +* Detecting specific administrative SQL commands +* Anomalous sequences of commands when compared to a statistical baseline. +* Anomalous commands for a given user role. + +## Considerations + +Some capabilities sanitize queries before permitting them to be transmitted to the database. This incurs risks such altering data in an undesired way or breaking application functionality.""" ; + d3f:kb-reference d3f:Reference-SystemAndMethodForInternetSecurity_CylanceInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:DatabaseQuery ], + d3f:ProcessAnalysis . + +d3f:DecoyEnvironment a d3f:DecoyEnvironment, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Decoy Environment" ; + d3f:d3fend-id "D3-DE" ; + d3f:definition "A Decoy Environment comprises hosts and networks for the purposes of deceiving an attacker." ; + d3f:enables d3f:Deceive ; + d3f:kb-article """## Technique Overview + +Systems in a decoy environment are typically configured so that some detectable means of communication does not have any legitimate business purpose. Any communication via these means should be logged and analyzed to find potential indicators of compromise for a possible past or future attack against other systems.""" ; + d3f:manages d3f:DecoyArtifact ; + d3f:synonym "Honeypot" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:manages ; + owl:someValuesFrom d3f:DecoyArtifact ], + [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Deceive ], + d3f:DefensiveTechnique . + +d3f:EndpointSensor a owl:Class, + owl:NamedIndividual ; + rdfs:label "Endpoint Sensor" ; + d3f:definition "A sensor application installed on a endpoint (platform) to collect information on platform components." ; + rdfs:seeAlso d3f:ComputerPlatform ; + rdfs:subClassOf d3f:CyberSensor . + +d3f:Evict a d3f:DefensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Evict" ; + d3f:definition "The eviction tactic is used to remove an adversary from a computer network." ; + d3f:display-order 4 ; + d3f:display-priority 0 ; + rdfs:subClassOf d3f:DefensiveTactic . + +d3f:FileTransferNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "File Transfer Network Traffic" ; + d3f:definition "File transfer network traffic is network traffic related to file transfers between network nodes. This includes only network traffic conforming to standard file transfer protocols, not custom transfer protocols." ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:IOPortRestriction a d3f:IOPortRestriction, + owl:Class, + owl:NamedIndividual ; + rdfs:label "IO Port Restriction" ; + d3f:d3fend-id "D3-IOPR" ; + d3f:definition "Limiting access to computer input/output (IO) ports to restrict unauthorized devices." ; + d3f:filters d3f:InputDevice, + d3f:RemovableMediaDevice ; + d3f:kb-article """## How It works + +Software-based restriction uses agent software installed on a computer system. The agent software monitors all IO port system traffic. The agent software is configurable to limit the use of certain devices connected to IO ports. The restriction software can also be configured to limit the access to files and applications on external storage devices connected to IO ports. + +Hardware-based restriction can also be employed to limit access to IO ports. For example, a hardware USB filter device that is placed between the host system and the external devices can filter IO port connections based on configurable rules. When new devices are connected to the USB filter the type of device is determined. Using an allow list a connection determination is made for the device. + +Some implementations detect when a device is connected in order to authorize the connection against a list of approved devices, in some cases by device type. For example, if the device is determined to be a storage device, then the contained files and executables are examined to more accurately identify the device type. + +Types of restrictions that may be applied: +- Device connection +- Device command filtering +- Device file system read or write restrictions + +## Considerations + * Agent software will need to be installed on host systems + * Configurations for allow/deny for devices and files will need to be maintained""" ; + d3f:kb-reference d3f:Reference-ComputerMotherboardHavingPeripheralSecurityFunctions, + d3f:Reference-MethodAndSystemForControllingCommunicationPorts, + d3f:Reference-USBFilterForHubMaliciousCodePreventionSystem ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:RemovableMediaDevice ], + [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:InputDevice ], + d3f:AccessMediation . + +d3f:IdentifierAnalysis a d3f:IdentifierAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Identifier Analysis" ; + d3f:d3fend-id "D3-ID" ; + d3f:definition "Analyzing identifier artifacts such as IP address, domain names, or URL(I)s." ; + d3f:enables d3f:Detect ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Detect ], + d3f:DefensiveTechnique . + +d3f:ImageCodeSegment a owl:Class, + owl:NamedIndividual ; + rdfs:label "Image Code Segment" ; + d3f:contains d3f:Subroutine ; + d3f:definition "An image code segment, also known as a text segment or simply as text, is a portion of an object file that contains executable instructions. The term \"segment\" comes from the memory segment, which is a historical approach to memory management that has been succeeded by paging. When a program is stored in an object file, the code segment is a part of this file; when the loader places a program into memory so that it may be executed, various memory regions are allocated (in particular, as pages), corresponding to both the segments in the object files and to segments only needed at run time. For example, the code segment of an object file is loaded into a corresponding code segment in memory." ; + rdfs:seeAlso d3f:ProcessCodeSegment, + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Subroutine ], + d3f:ImageSegment . + +d3f:InboundSessionVolumeAnalysis a d3f:InboundSessionVolumeAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Inbound Session Volume Analysis" ; + d3f:analyzes d3f:InboundInternetNetworkTraffic ; + d3f:d3fend-id "D3-ISVA" ; + d3f:definition "Analyzing inbound network session or connection attempt volume." ; + d3f:kb-article """## How it works +Network appliances are configured to alert on certain packets that typically are involved in DoS attacks. Typical packets include ICMP packets and SYN requests that are commonly used to flood networks. A sampling period is used to define a time window in which collected counts of the identified packets can be measured. If the collected number of packets exceeds a predefined limit then an alert is generated. + +## Considerations +Scalability as volume of attacks increase; single servers may not have the memory and storage resources to handle high volumes of network traffic.""" ; + d3f:kb-reference d3f:Reference-DetectingDDoSAttackUsingSnort, + , + d3f:Reference-MethodAndSystemForUDPFloodAttackDetection-RioreyLLC, + , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:InboundInternetNetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:Log a owl:Class, + owl:NamedIndividual ; + rdfs:label "Log" ; + d3f:definition "A record of events in the order of their occurrence." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:D3FENDCore, + d3f:DigitalInformationBearer ; + skos:altLabel "Chronology" . + +d3f:OSAPIAllocateMemory a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Allocate Memory" ; + d3f:invokes d3f:AllocateMemory ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:AllocateMemory ], + d3f:OSAPISystemFunction . + +d3f:OSAPICreateProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Create Process" ; + d3f:invokes d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:OSAPISystemFunction . + +d3f:OperatingSystemConfigurationComponent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System Configuration Component" ; + d3f:definition "An component of the overall information necessary for the configuration of an operating system." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OperatingSystemConfiguration ; + skos:altLabel "Operating System Configuration Information", + "System Configuration" . + +d3f:OperationalActivityMapping a d3f:OperationalActivityMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Operational Activity Mapping" ; + d3f:d3fend-id "D3-OAM" ; + d3f:definition "Operational activity mapping identifies activities of the organization and the organization's suborganizations, groups, roles, and individuals that carry out the activities and then establishes the dependencies of the activities on the systems and people that perform those activities." ; + d3f:enables d3f:Model ; + d3f:kb-reference d3f:Reference-CatiaUAFPlugin ; + d3f:synonym "Mission Mapping" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Model ], + d3f:DefensiveTechnique . + +d3f:OperationalDependencyMapping a d3f:OperationalDependencyMapping, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Operational Dependency Mapping" ; + d3f:d3fend-id "D3-ODM" ; + d3f:definition "Operational dependency mapping identifies and models the dependencies of the organization's activities on each other and on the organization's performers (people, systems, and services.) This may include modeling the higher- and lower-level activities of an organization forming a hierarchy, or layering, of the dependencies in an organization's activities." ; + d3f:kb-reference d3f:Reference-CatiaUAFPlugin, + d3f:Reference-CyberCommandSystemCYCS, + d3f:Reference-DaggerFactSheet, + d3f:Reference-DaggerModelingAndVisualizationForMissionImpactSituationalAwareness, + d3f:Reference-MissionDependencyModelingForCyberSituationalAwareness, + d3f:Reference-UnifiedArchitectureFrameworkUAF ; + d3f:maps d3f:Dependency, + d3f:OrganizationalActivity ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:Dependency ], + [ a owl:Restriction ; + owl:onProperty d3f:maps ; + owl:someValuesFrom d3f:OrganizationalActivity ], + d3f:OperationalActivityMapping . + +d3f:OperationalRiskAssessment a d3f:OperationalRiskAssessment, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Operational Risk Assessment" ; + d3f:d3fend-id "D3-ORA" ; + d3f:definition "Operational risk assessment identifies and models the vulnerabilities of, and risks to, an organization's activities individually and as a whole." ; + d3f:evaluates d3f:Organization ; + d3f:identifies d3f:Vulnerability ; + d3f:kb-reference d3f:Reference-MGT516ManagingSecurityVulnerabilitiesEnterpriseAndCloud, + d3f:Reference-NIST-RMF-Quick-Start-Guide-Assess-Step-FAQ, + d3f:Reference-NIST-Special-Publication-800-160-Volume-1, + d3f:Reference-NIST-Special-Publication-800-37-Revision-2, + d3f:Reference-NIST-Special-Publication-800-53A-Revision-5, + d3f:Reference-NISTIR-8011-Volume-1 ; + d3f:synonym "Mission Risk Assessment" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:Vulnerability ], + [ a owl:Restriction ; + owl:onProperty d3f:evaluates ; + owl:someValuesFrom d3f:Organization ], + d3f:OperationalActivityMapping . + +d3f:PeripheralFirmware a owl:Class, + owl:NamedIndividual ; + rdfs:label "Peripheral Firmware" ; + d3f:definition "Firmware that is installed on computer peripheral devices." ; + rdfs:seeAlso d3f:Firmware, + ; + rdfs:subClassOf d3f:Firmware . + +d3f:PrimaryStorage a owl:Class, + owl:NamedIndividual ; + rdfs:label "Primary Storage" ; + d3f:contains d3f:PageFrame, + d3f:ProcessSegment ; + d3f:definition "Primary memory of a computer is memory that is wired directly to the processor, consisting of RAM and possibly ROM. These terms are used in contrast to mass storage devices and cache memory (although we may note that when a program accesses main memory, it is often actually interacting with a cache)." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ProcessSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:PageFrame ], + d3f:HardwareDevice, + d3f:Storage . + +d3f:ProcessCodeSegmentVerification a d3f:ProcessCodeSegmentVerification, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Code Segment Verification" ; + d3f:d3fend-id "D3-PCSV" ; + d3f:definition "Comparing the \"text\" or \"code\" memory segments to a source of truth." ; + d3f:kb-article """## How it works +A process code segment is an executable portion of computer memory allocated to a particular process. Process Code Segment Verification implements verification to compare a process code segment to some expected value. + +### Verification logic +Verification can occur during application startup, or continuously during execution. The logic which verifies the process code may be separate in a third-party process, embedded in the application itself at compile time, or dynamically linked at runtime. + +### System of record +Examples of systems of record: + + * On-disk application binary files or checksums + * Remotely stored binary data or checksums + * Embedded binary data or checksums + +### Post Verification Actions +If the verification function determines a process code segment may have been altered, a capability may invoke Eviction techniques as **Process Termination** to end the current process, or **Executable Blacklisting** to prevent the executable from launching in the future. + +## Considerations + +### False positives + +False positives commonly occur in the case that the layout of code in the process segment is legitimately modified: + +* Operating system features or third-party security software may modify the layout of process code, for example in the defensive technique **Segment Address Offset Randomization**, or in the case that a module is rebased. In both of these cases, the alteration occurs before the code is fully loaded into memory, and it would be possible to avoid the false positive by securely feeding this constant offset and any relocation data into the verification logic. + +* Process code segments may be written to modify themselves or other process code segments; however, this goes against widely-accepted current practices in software development. + +### False negatives + +False negatives can occur via alteration of the verification logic or source of truth, or insufficient verification logic. + +* Verification techniques which are executed only locally may be defeated by altering the local verification logic. + +* Verification that is run only on a recurring basis could be evaded if the malicious alteration is completed before verification is run. + +* Verification that requests an operation to be performed on a subset of the code segment could be evaded by performing that operation on a copy of the relevant bytes of the code segment. + +* Verification based on a system of record that can be altered may fail if that system of record is modifiable by a malicious user.""" ; + d3f:kb-reference d3f:Reference-Anti-tamperSystemWithSelf-adjustingGuards_ARXANTECHNOLOGIESInc, + d3f:Reference-GuardsForApplicationInSoftwareTamperproofing_PurdueResearchFoundation, + d3f:Reference-SystemAndMethodForDetectingMalwareInjectedIntoMemoryOfAComputingDevice_EndgameInc, + d3f:Reference-SystemAndMethodForValidatingIn-memoryIntegrityOfExecutableFilesToIdentifyMaliciousActivity_EndgameInc, + d3f:Reference-TamperProofMutatingSoftware_ARXANTECHNOLOGIESInc, + d3f:Reference-ThreatDetectionThroughTheAccumulatedDetectionOfThreatCharacteristics_SophosLtd ; + d3f:verifies d3f:ProcessCodeSegment ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:verifies ; + owl:someValuesFrom d3f:ProcessCodeSegment ], + d3f:ProcessAnalysis . + +d3f:Record a owl:Class, + owl:NamedIndividual ; + rdfs:label "Record" ; + d3f:definition "In computer science, a record (also called struct or compound data) is a basic data structure. A record is a collection of fields, possibly of different data types, typically in fixed number and sequence . The fields of a record may also be called members, particularly in object-oriented programming. Fields may also be called elements, though these risk confusion with the elements of a collection. A tuple may or may not be considered a record, and vice versa, depending on conventions and the specific programming language." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:SourceCodeHardening a owl:Class, + owl:NamedIndividual ; + rdfs:label "Source Code Hardening" ; + d3f:d3fend-id "D3-SCH" ; + d3f:definition "Hardening source code with the intention of making it more difficult to exploit and less error prone." ; + d3f:enables d3f:Harden ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Harden ], + d3f:DefensiveTechnique . + +d3f:SymbolicLink a owl:Class, + owl:NamedIndividual ; + rdfs:label "Symbolic Link" ; + d3f:addresses d3f:File ; + d3f:definition "A symbolic link (also symlink or soft link) is a term for any file that contains a reference to another file or directory in the form of an absolute or relative path and that affects pathname resolution." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:addresses ; + owl:someValuesFrom d3f:File ], + d3f:File, + d3f:FileSystemLink ; + skos:altLabel "Soft Link", + "Softlink", + "Symlink" . + +d3f:SystemFileAnalysis a d3f:SystemFileAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System File Analysis" ; + d3f:analyzes d3f:OperatingSystemFile ; + d3f:d3fend-id "D3-SFA" ; + d3f:definition "Monitoring system files such as authentication databases, configuration files, system logs, and system executables for modification or tampering." ; + d3f:kb-article """## How it works +This technique ensures the integrity of system owned file resources. System files can impact the behavior below the user level. + + +## Considerations +* Need to manage the size of log file analysis. +* False positives are a concern with this technique and filtering will need to be given additional thought. +* A baseline or snapshot of file checksums should be established for future comparison.""" ; + d3f:kb-reference d3f:Reference-AccessPermissionModification_MITRE, + d3f:Reference-AutorunDifferences_MITRE, + d3f:Reference-UserActivityFromClearingEventLogs_MITRE ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:OperatingSystemFile ], + d3f:OperatingSystemMonitoring . + +d3f:SystemServiceSoftware a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Service Software" ; + d3f:contains d3f:OperatingSystemFile ; + d3f:definition "Software services provided as part of the operating system, typically accessed through system calls." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:OperatingSystemFile ], + d3f:Software . + +d3f:T1053 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Scheduled Task/Job" ; + d3f:attack-id "T1053" ; + d3f:definition "The sub-techniques of this are specific software implementations of scheduling capabilities" ; + d3f:executes d3f:ScheduledJob ; + d3f:invokes d3f:CreateProcess ; + d3f:modifies d3f:JobSchedule ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:JobSchedule ], + [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:ScheduledJob ], + [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:ExecutionTechnique, + d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:T1098 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Account Manipulation" ; + d3f:attack-id "T1098" ; + d3f:definition "Adversaries may manipulate accounts to maintain and/or elevate access to victim systems. Account manipulation may consist of any action that preserves or modifies adversary access to a compromised account, such as modifying credentials or permission groups.(Citation: FireEye SMOKEDHAM June 2021) These actions could also include account activity designed to subvert security policies, such as performing iterative password updates to bypass password duration policies and preserve the life of compromised credentials." ; + d3f:modifies d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:UserAccount ], + d3f:PersistenceTechnique . + +d3f:T1588 a owl:Class ; + rdfs:label "Obtain Capabilities" ; + d3f:attack-id "T1588" ; + d3f:definition "Adversaries may buy and/or steal capabilities that can be used during targeting. Rather than developing their own capabilities in-house, adversaries may purchase, freely download, or steal them. Activities may include the acquisition of malware, software (including licenses), exploits, certificates, and information relating to vulnerabilities. Adversaries may obtain capabilities to support their operations throughout numerous phases of the adversary lifecycle." ; + rdfs:subClassOf d3f:ResourceDevelopmentTechnique . + +d3f:UserInitScript a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Init Script" ; + d3f:definition "A script used to initialize and configure elements of the user's applications and user environment." ; + rdfs:subClassOf d3f:ExecutableScript, + d3f:InitScript, + d3f:UserLogonInitResource . + +d3f:WebNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Web Network Traffic" ; + d3f:definition "Web network traffic is network traffic that uses a standard web protocol." ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:addresses a owl:ObjectProperty ; + rdfs:label "addresses" ; + d3f:definition "x addresses y: Relates a pointer x to a digital artifact y located in the address space to which x points. The address space is part of some digital store, whether it be in memory, an image, or a persistent storage device." ; + rdfs:seeAlso , + ; + rdfs:subPropertyOf d3f:associated-with ; + skos:altLabel "points-to" . + +d3f:blocks a owl:ObjectProperty ; + rdfs:label "blocks" ; + d3f:definition "x blocks y: The entity x blocks off the use of digital artifact y by reference to a block or allow list (or both.)" ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:counters, + d3f:filters . + +d3f:date a owl:DatatypeProperty ; + rdfs:label "date"@en ; + d3f:definition "A point or period of time associated with an event in the lifecycle of the resource." ; + rdfs:range xsd:dateTime ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:d3fend-data-property . + +d3f:inventories a owl:ObjectProperty ; + rdfs:label "inventories" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:may-add a owl:ObjectProperty ; + rdfs:label "may-add" ; + d3f:definition "x may-add y: They entity x may add the thing y; that is, 'x adds y' may be true." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:may-be-weakness-of a owl:ObjectProperty ; + rdfs:label "may-be-weakness-of" ; + rdfs:domain d3f:Weakness ; + rdfs:range d3f:Artifact ; + rdfs:subPropertyOf d3f:may-be-associated-with ; + owl:inverseOf d3f:may-have-weakness . + +d3f:ApplicationConfigurationHardening a d3f:ApplicationConfigurationHardening, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Configuration Hardening" ; + d3f:d3fend-id "D3-ACH" ; + d3f:definition "Modifying an application's configuration to reduce its attack surface." ; + d3f:hardens d3f:ApplicationConfiguration ; + d3f:kb-article """## How it works +Application configuration settings can be configured to limit the permissions on an application or disable certain vulnerable application features. + +Hardening an application's configuration involves analyzing not only the application but also the environment in which the application is run in for potential vulnerabilities.""" ; + d3f:kb-reference d3f:Reference-RedHatEnterpriseLinux8SecurityTechnicalImplementationGuide, + d3f:Reference-Windows10STIG ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:ApplicationConfiguration ], + d3f:ApplicationHardening . + +d3f:ArchiveFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Archive File" ; + d3f:definition "An archive file is a file that is composed of one or more computer files along with metadata. Archive files are used to collect multiple data files together into a single file for easier portability and storage, or simply to compress files to use less storage space. Archive files often store directory structures, error detection and correction information, arbitrary comments, and sometimes use built-in encryption." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:File . + +d3f:Artifact a owl:Class, + owl:NamedIndividual ; + rdfs:label "Artifact" ; + d3f:definition "A man-made object taken as a whole." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:AuthenticationLog a owl:Class, + owl:NamedIndividual ; + rdfs:label "Authentication Log" ; + d3f:definition "A log of authentication events." ; + d3f:records d3f:Authentication ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:records ; + owl:someValuesFrom d3f:Authentication ], + d3f:EventLog . + +d3f:AuthorizationEventThresholding a d3f:AuthorizationEventThresholding, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Authorization Event Thresholding" ; + d3f:analyzes d3f:Authorization ; + d3f:created "2020-08-05T00:00:00"^^xsd:dateTime ; + d3f:d3fend-id "D3-AZET" ; + d3f:definition "Collecting authorization events, creating a baseline user profile, and determining whether authorization events are consistent with the baseline profile." ; + d3f:kb-article """## How it works + +Authorization event data is collected to create a baseline user profile. Authorization events that deviate from the baseline and exceed a static or dynamic threshold are identified for further action. Authorization events can include successful and failed authorization attempts as well as events related to permissions including viewing, editing, deleting, creating files, databases etc. + +## Considerations + +Depending on the complexity of the data considered, outliers may not be obvious to a human analyst reviewing events in simplistic analytic views. If malicious activity is not statistically different from benign activity, an alert threshold will not be met.""" ; + d3f:kb-reference d3f:Reference-MethodAndApparatusForNetworkFraudDetectionAndRemediationThroughAnalytics_IdaptiveLLC, + d3f:Reference-SMBSessionSetups_MITRE, + , + d3f:Reference-UserLoggedInToMultipleHosts_MITRE ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Authorization ], + d3f:UserBehaviorAnalysis . + +d3f:CWE-1061 a owl:Class ; + rdfs:label "Insufficient Encapsulation" ; + d3f:cwe-id "CWE-1061" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-269 a owl:Class ; + rdfs:label "Improper Privilege Management" ; + d3f:cwe-id "CWE-269" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-330 a owl:Class ; + rdfs:label "Use of Insufficiently Random Values" ; + d3f:cwe-id "CWE-330" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-362 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')" ; + d3f:cwe-id "CWE-362" ; + d3f:weakness-of d3f:SharedResourceAccessFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:SharedResourceAccessFunction ], + d3f:CWE-691 . + +d3f:CWE-552 a owl:Class ; + rdfs:label "Files or Directories Accessible to External Parties" ; + d3f:cwe-id "CWE-552" ; + rdfs:subClassOf d3f:CWE-285, + d3f:CWE-668 . + +d3f:CWE-705 a owl:Class ; + rdfs:label "Incorrect Control Flow Scoping" ; + d3f:cwe-id "CWE-705" ; + rdfs:subClassOf d3f:CWE-691 . + +d3f:CWE-706 a owl:Class ; + rdfs:label "Use of Incorrectly-Resolved Name or Reference" ; + d3f:cwe-id "CWE-706" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-758 a owl:Class ; + rdfs:label "Reliance on Undefined, Unspecified, or Implementation-Defined Behavior" ; + d3f:cwe-id "CWE-758" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-79 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')" ; + d3f:cwe-id "CWE-79" ; + d3f:weakness-of d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-74 . + +d3f:ClusterAnalysis a owl:Class, + owl:NamedIndividual ; + rdfs:label "Cluster Analysis" ; + d3f:d3fend-id "D3A-CA" ; + d3f:definition "Cluster analysis or clustering is the task of grouping a set of objects in such a way that objects in the same group (called a cluster) are more similar (in some sense) to each other than to those in other groups (clusters)." ; + d3f:kb-article """## References +Cluster analysis. (n.d.). Wikipedia. [Link](https://en.wikipedia.org/wiki/Cluster_analysis)""" ; + rdfs:subClassOf d3f:UnsupervisedLearning . + +d3f:CreateFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Create File" ; + d3f:creates d3f:File ; + d3f:definition "System call to create a new file on a file system. Some operating systems implement this functionality as part of their d3f:OpenFile system call." ; + rdfs:seeAlso , + , + , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:creates ; + owl:someValuesFrom d3f:File ], + d3f:SystemCall . + +d3f:DHCPEvent a owl:Class ; + rdfs:label "DHCP Event" ; + d3f:definition "An event involving the Dynamic Host Configuration Protocol (DHCP), a UDP-based protocol used to dynamically assign IP addresses and configure network parameters, enabling devices to communicate efficiently on a network." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:DHCPNetworkTraffic ], + d3f:ApplicationLayerEvent, + d3f:UDPEvent . + +d3f:DNSLookup a owl:Class, + owl:NamedIndividual ; + rdfs:label "DNS Lookup" ; + d3f:definition "A Domain Name System (DNS) lookup is a record returned from a DNS resolver after querying a DNS name server. Typically considered an A or AAAA record, where a domain name is resolved to an IPv4 or IPv6 address, respectively." ; + rdfs:seeAlso , + , + ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:DNSTrafficAnalysis a d3f:DNSTrafficAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "DNS Traffic Analysis" ; + d3f:analyzes d3f:OutboundInternetDNSLookupTraffic ; + d3f:d3fend-id "D3-DNSTA" ; + d3f:definition "Analysis of domain name metadata, including name and DNS records, to determine whether the domain is likely to resolve to an undesirable host." ; + d3f:kb-article """## How it works +This technique can be accomplished in a number of ways. + +* One example analytic determines whether or not a domain name was generated with an algorithm. Domain generation algorithms (DGAs) are sometimes used to create a domain name automatically that will resolve to C2 infrastructure, without directly coding the domains in question into the malicious code. +* Another method analyzes information about domains that have been visited, including whether a domain name is longer than a common length, if a dynamic DNS domain was visited, if a fast-flux domain was visited, and if a recently created domain was visited. These factors are used to develop a score and if that score is over a certain threshold, an alert is generated. +* Collected malware samples can be executed in a virtual environment to identify network domains that are connected to during execution. The network domains are then generated into signatures to identity bad domains for other hosts. + +This technique does not check for content hosted at the domain. + +## Considerations + +* DNS produces a large amount of traffic which can be resource-intensive to analyze in real time. +* If a server is compromised, for example, as part of a watering hole attack, but the DNS information pointing to that server is not altered, this technique would not catch such an incident.""" ; + d3f:kb-reference d3f:Reference-DomainAgeRegistrationAlert_IncRapid7IncRAPID7Inc, + d3f:Reference-HeuristicBotnetDetection_PaloAltoNetworksInc, + d3f:Reference-MethodAndSystemForDetectingAlgorithm-generatedDomains_VECTRANETWORKSInc, + d3f:Reference-PredictingDomainGenerationAlgorithmsWithLongShort-TermMemoryNetworks_, + d3f:Reference-SinkholingBadNetworkDomainsByRegisteringTheBadNetworkDomainsOnTheInternet_PaloAltoNetworksInc ; + d3f:may-contain d3f:DNSLookup ; + d3f:synonym "Domain Name Analysis" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:DNSLookup ], + [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:OutboundInternetDNSLookupTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:Dependency a owl:Class, + owl:NamedIndividual ; + rdfs:label "Dependency" ; + d3f:definition "A dependency is the relationship of relying on or being controlled by someone or something else. This class reifies dependencies that correspond to the object property depends-on." ; + d3f:dependent d3f:D3FENDCore ; + d3f:provider d3f:D3FENDCore ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:provider ; + owl:someValuesFrom d3f:D3FENDCore ], + [ a owl:Restriction ; + owl:onProperty d3f:dependent ; + owl:someValuesFrom d3f:D3FENDCore ], + d3f:DigitalInformationBearer . + +d3f:EnsembleLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Ensemble Learning" ; + d3f:d3fend-id "D3A-EL" ; + d3f:definition "In statistics and machine learning, ensemble methods use multiple learning algorithms to obtain better predictive performance than could be obtained from any of the constituent learning algorithms alone" ; + d3f:kb-article """## References +Ensemble learning. Wikipedia. [Link](https://en.wikipedia.org/wiki/Ensemble_learning).""" ; + rdfs:subClassOf d3f:MachineLearning . + +d3f:HTTPRequestEvent a owl:Class ; + rdfs:label "HTTP Request Event" ; + d3f:definition "An event where an HTTP request is sent from a client to a server over an established TCP connection." ; + rdfs:subClassOf d3f:HTTPEvent . + +d3f:HardwareComponentInventory a d3f:HardwareComponentInventory, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Hardware Component Inventory" ; + d3f:d3fend-id "D3-HCI" ; + d3f:definition "Hardware component inventorying identifies and records the hardware items in the organization's architecture." ; + d3f:inventories d3f:HardwareDevice ; + d3f:kb-article """## How it works +Administrators collect information on hardware devices such as peripherals, NICs, processors, and memory devices that are components of the computers in their architecture using a variety of administrative and management tools that query for this information. In some cases, where such queries are not supported or provide specific information of interest, an administrator may also collect this information through remote adminstration tools and system commands, either manually or using scripts. + +## Considerations +* Scanning and probing techniques using mapping tools can result in side effects to information technology (IT) and operational technology (OT) systems. +* An adversary conducting network enumeration may engage in activities that parallel normal hardware inventorying activities, but would require escalating to admin privileges for most of the operations requiting administrative tools + +## Examples +* Bus discovery + * Admin-scripted PCI Bus inventory using ssh and pciutils +* Application-layer discovery + * Simple Network Management Protocol (SNMP) collects MIB information + * Web-based Enterprise Management (WBEM) collects CIM information + * Windows Management Instrumentation (WMI) + * Windows Management Infrastructure (MI)""" ; + d3f:kb-reference d3f:Reference-AdvancedDeviceMatchingSystem ; + d3f:synonym "Hardware Component Discovery", + "Hardware Component Inventorying" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:inventories ; + owl:someValuesFrom d3f:HardwareDevice ], + d3f:AssetInventory . + +d3f:HardwareDeviceStateEvent a owl:Class ; + rdfs:label "Hardware Device State Event" ; + d3f:definition "An event involving a change to a device's state, such as connection, disconnection, modification, or operational state transitions (e.g., online or offline). Device state events provide visibility into device availability and operational conditions." ; + rdfs:subClassOf d3f:HardwareDeviceEvent . + +d3f:IPCTrafficAnalysis a d3f:IPCTrafficAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "IPC Traffic Analysis" ; + d3f:analyzes d3f:IntranetIPCNetworkTraffic ; + d3f:d3fend-id "D3-IPCTA" ; + d3f:definition "Analyzing standard inter process communication (IPC) protocols to detect deviations from normal protocol activity." ; + d3f:kb-article """## How it works +Inter process communication enables applications or threads to share data. This can involve one or more computers. Monitoring IPC in your environment can reveal abnormal or malicious activity. +IPC can occur within a single computer or between multiple computers remotely through network protocols. Thus there are multiple ways to collect and monitor these exchanges between processes. A network protocol analyzer may monitor and parse SMB network traffic to record system activity. A host based monitoring agent may monitor IPC activity contained within a single host to look for deviations from standard usages. + +### Examples + * SMB + * Zeromq + * Java RMI API + +## Considerations +* IPC can generate substantial amounts of data, and it may not be feasible to collect all of it. +* IPC may occur over loopback interfaces or direct memory access granted by the operating system.""" ; + d3f:kb-reference d3f:Reference-CAR-2015-04-001%3ARemotelyScheduledTasksViaAT_MITRE, + d3f:Reference-SMBCopyAndExecution_MITRE, + d3f:Reference-SMBEventsMonitoring_MITRE, + d3f:Reference-SMBSessionSetups_MITRE, + d3f:Reference-SMBWriteRequest-NamedPipes_MITRE, + d3f:Reference-SMBWriteRequest_MITRE, + d3f:Reference-SecuritySystemWithMethodologyForInterprocessCommunicationControl_CheckPointSoftwareTechInc ; + d3f:synonym "IPC Analysis" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:IntranetIPCNetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:LocalResource a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Resource" ; + d3f:definition "In computing, a system resource, or simply resource, is any physical or virtual component of limited availability within a computer system. Every device connected to a computer system is a resource. Every internal system component is a resource. Virtual system resources include files (concretely file handles), network connections (concretely network sockets), and memory areas. Managing resources is referred to as resource management, and includes both preventing resource leaks (releasing a resource when a process has finished using it) and dealing with resource contention (when multiple processes wish to access a limited resource)." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Resource ; + skos:altLabel "System Resource" . + +d3f:LocalUserAccount a owl:Class, + owl:NamedIndividual ; + rdfs:label "Local User Account" ; + d3f:definition "A user account on a given host is a local user account for that specific host." ; + rdfs:subClassOf d3f:UserAccount . + +d3f:MachineLearning a owl:Class, + owl:NamedIndividual ; + rdfs:label "Machine Learning" ; + d3f:d3fend-id "D3A-ML" ; + d3f:definition "Machine learning techniques are computational methods that combine statistics, probability, and optimization to make accurate predictions and/or improve performance." ; + d3f:kb-article """## References +Machine learning." Wikipedia. [Link](https://en.wikipedia.org/wiki/Machine_learning).""" ; + rdfs:subClassOf d3f:AnalyticTechnique . + +d3f:Model a d3f:DefensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Model" ; + d3f:definition "The model tactic is used to apply security engineering, vulnerability, threat, and risk analyses to digital systems. This is accomplished by creating and maintaining a common understanding of the systems being defended, the operations on those systems, actors using the systems, and the relationships and interactions between these elements." ; + d3f:display-order -1 ; + d3f:display-priority 1 ; + rdfs:subClassOf d3f:DefensiveTactic . + +d3f:NetworkSession a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Session" ; + d3f:definition "A network session is a temporary and interactive information interchange between two or more devices communicating over a network. A session is established at a certain point in time, and then 'torn down' - brought to an end - at some later point. An established communication session may involve more than one message in each direction. A session is typically stateful, meaning that at least one of the communicating parties needs to hold current state information and save information about the session history in order to be able to communicate, as opposed to stateless communication, where the communication consists of independent requests with responses. Network sessions may be established and implemented as part of protocols and services at the application, session, or transport layers of the OSI model." ; + d3f:produces d3f:NetworkTraffic ; + rdfs:seeAlso , + , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:Session . + +d3f:OperatingSystemProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System Process" ; + d3f:definition "An operating system process, or system process, is a process running to perform operating system functions." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Process ; + skos:altLabel "System Process" . + +d3f:PartitionTable a owl:Class, + owl:NamedIndividual ; + rdfs:label "Partition Table" ; + d3f:addresses d3f:Partition ; + d3f:definition "A partition is a fixed-size subset of a storage device which is treated as a unit by the operating system. A partition table is a table maintained on the storage device by the operating system describing the partitions on that device. The terms partition table and partition map are most commonly associated with the MBR partition table of a Master Boot Record (MBR) in IBM PC compatibles, but it may be used generically to refer to other \"formats\" that divide a disk drive into partitions, such as: GUID Partition Table (GPT), Apple partition map (APM), or BSD disklabel." ; + d3f:may-contain d3f:BootRecord ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:BootRecord ], + [ a owl:Restriction ; + owl:onProperty d3f:addresses ; + owl:someValuesFrom d3f:Partition ], + d3f:DigitalInformationBearer . + +d3f:Pipe a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pipe" ; + d3f:definition "In Unix-like computer operating systems, a pipeline is a mechanism for inter-process communication using message passing. In the strictest sense, a pipe is a single segment of a pipeline, allowing one process to pass information forward to another. Network pipes allow processes on different hosts to interact." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "Pipeline" . + +d3f:ProcessTermination a d3f:ProcessTermination, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Termination" ; + d3f:d3fend-id "D3-PT" ; + d3f:definition "Terminating a running application process on a computer system." ; + d3f:kb-article """## How it works + +Processes are managed by the operating system kernel. Different operating system kernels manage the creation and termination of processes in a different manner, and expose this functionality via the kernel API. + +A running process might be terminated to mitigate its immediate effects if it is exhibiting anomalous, unauthorized, or malicious behavior; such as after detecting anomalous behavior via Administrative Network Activity Analysis, after a failed check from Stack Frame Canary Validation, or after System Call Analysis finds an attempt to execute an unauthorized system call. + +### Proprietary technology +Security software might use proprietary technology to terminate processes, instead of the system-provided functions. Further research may provide specific detail on such methods used. + +### System-provided functions + +#### Windows tools +In Windows, `ExitProcess()` is used to send a signal to a process to request it to exit, and `TerminateProcess()` is used to force a process to exit. + +The `taskkill` executable available in the cmd shell is used to kill a process, with the `/F` switch forcing termination as with `TerminateProcess()`. In PowerShell, `Stop-Process` is used, which is aliased by default to `spps` and `kill`. Processes started in the Windows Subsystem for Linux (WSL) environment may be terminated there with the `kill` command. + +In some cases, existing drivers can also be leveraged to kill processes. + +#### Unix/Linux tools +In Unix-like systems, all process termination requests are handled using signals. The `kill` function takes the Process ID and signal to send, and is accessible with the `kill` command. Some shells have a `kill` builtin function which is separate than the `kill` binary, which can also kill background jobs in the shell and additionally perform the function faster, and can run from an existing instance of the shell if the process table is full. The signal SIGTERM specifies that the process to terminate may invoke a handler that it has defined instead of terminating, and the signal SIGKILL forces immediate termination. + +The related command `xkill` terminates the connection of a program to the X window server, after which the user process may decide to terminate itself; however, termination is not guaranteed as the process, which could be on the same or different host, could then run in a terminal or reconnect to a different X server on any host. Emacs is such a program that would not terminate itself after its connection to the X server is terminated. + +## Considerations + +### Persistence Mechanisms +Terminating a malicious process is not enough to stop an adversary that has already gained persistence in the host via any initial access mechanism, including through that process or another access mechanism. + +### Terminating Multiple Processes +On most operating systems, process termination operations typically occur independently of each other, without functionality provided to atomically terminate multiple processes. If there are multiple malicious processes which can make system calls to spawn other processes once one of them is closed, user session termination or system restart might be required. + +### Process Access Permissions +Users must have permissions to kill the process. On Unix-like systems, either root or the process user can kill the process. On Windows systems, process permissions are managed separately via process security tokens. + +### Process Resource Handles + +#### Terminating Processes with Open Resource Handles + +Processes may have open resource handles, which could leave those resources in an undesired state if the process is forced to terminate. As such, most operating systems provide a means to send a signal to a process to inform it to gracefully terminate, and on most of these operating systems, it is the typical first step used to terminate a process. + +#### Signal Traps +As the process may have open resource handles, commonly-used methods of process termination involve sending a signal to the process to terminate. +On Windows, the `ExitProcess()` function is used for this purpose. Process instructions, as well as a third-party DLL can also cause the process to exit. +On Linux, the process is sent a signal on the occurrence of various events: when it loses the console, `SIGHUP`; when termination is requested, `SIGTERM`. The processor then redirects execution to the function registered to handle the signal. + +Therefore, sending a signal to the process to ask it to terminate may not always work. + +##### Avoiding Signal Traps + +On Unix-like systems, sending the `SIGKILL` signal for a process does not send a message to the process or invoke an implementation-defined handler; instead, it immediately does not allow the process to execute any further processor instructions. On Windows `TerminateProcess()` instead of `ExitProcess()` performs the equivalent. + +#### Hang on System Call Execution + +Even still, as the operating system kernel manages the processes, kernel code may block process signals, including those which cannot be trapped, and does in certain circumstances. Signals are blocked and queued for the duration of the system call when interrupting the system call would result in a kernel invariant being violated, such as when an action results in a malformed data structure; this blocking is common for filesystem requests. Such system calls can hang when a filesystem has gone offline, leading to a long-term uninterruptible sleep, represented in POSIX command `ps` output as D state. +Any malicious system calls or system call handlers are issues of a much larger problem (a kernel-level rootkit) and the system should be redeployed entirely or restored from a backup known to be prior to compromise, and other systems accessible directly and indirectly from that one should also be examined. + +A process that is truly hung in a system call may prevent the system from shutting down and leave it in an unresponsive state; a hard power off is required. + +To speed up the action of terminating a process in uninterruptible sleep, the process resource accesses (handles) could be analyzed. + +On Linux, [`sync` followed by `echo 3 > /proc/sys/vm/drop_caches`](https://www.kernel.org/doc/Documentation/sysctl/vm.txt) is a safe way to free up some inactive resource handles. + + +#### Kernel Processes and Threads +The kernel may not allow kernel processes, which are created via methods other than user-space processes, to be terminated. + +#### Other Code using the Process + +Terminating a shared library can lead to unexpected errors; such shared libraries have their own mechanisms for termination. + +On Windows, a DLL is unloaded when the reference count of the library reaches 0. + +#### Zombie process + +After a process has been terminated, it may still take up an entry in the operating system process table until another event occurs. + +##### Windows +In Windows, a process object is deleted when the last handle to the process is closed. + +##### Linux +In Linux, a process is removed from the process table when it is reaped by its parent process. If the parent terminates, historically the parent has been changed to pid 1; however, in the Linux kernel 3.4 and above, processes can set a different process as the subreaper using the `prctl()` system call. + +Zombie processes and hung processes could be resolved with a restart of the system. + +#### System restart +Finally a system restart might be required to kill a process. +Systems which are only accessible via a remote in-band connection may become inaccessible if a process termination operation that is necessary for reboot does not complete. + +### Subsystems +Processes that are started in a subsystem might not be fully terminated if they are terminated using the command for that subsystem. For example, in the Windows Subsystem for Linux (WSL), processes started and terminated via WSL calls such as with the `kill` command in Bash may still have an entry in the Windows process table.""" ; + d3f:kb-reference d3f:Reference-InstantProcessTerminationToolToRecoverControlOfAnInformationHandlingSystem_DellProductsLP, + d3f:Reference-MalwareDetectionUsingLocalComputationalModels_CrowdstrikeInc ; + d3f:terminates d3f:Process ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:terminates ; + owl:someValuesFrom d3f:Process ], + d3f:ProcessEviction . + +d3f:ResourceDevelopmentTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Resource Development Technique" ; + d3f:enables d3f:TA0042 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0042 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:SecondaryStorage a owl:Class, + owl:NamedIndividual ; + rdfs:label "Secondary Storage" ; + d3f:definition "Secondary memory (storage, hard disk) is the computer component holding information that does not need to be accessed quickly and that needs to be retained long-term." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:HardwareDevice, + d3f:Storage . + +d3f:ServiceApplicationProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Service Application Process" ; + rdfs:subClassOf d3f:ApplicationProcess . + +d3f:ServiceEvent a owl:Class ; + rdfs:label "Service Event" ; + d3f:definition "An event capturing the operation, configuration, or lifecycle of a service application. Services are specialized applications designed to provide reusable functionality to clients, systems, or other applications, often operating in the background or across networks." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:ServiceApplication ], + d3f:ApplicationEvent . + +d3f:Storage a owl:Class, + owl:NamedIndividual ; + rdfs:label "Storage" ; + d3f:definition "Computer data storage, often called storage or memory, is a technology consisting of computer components and recording media used to retain digital data. It is a core function and fundamental component of computers. In the Von Neumann architecture, the CPU consists of two main parts: The control unit and the arithmetic / logic unit (ALU). The former controls the flow of data between the CPU and memory, while the latter performs arithmetic and logical operations on data." ; + d3f:may-contain d3f:FileSystem ; + d3f:synonym "Computer data storage", + "Storage" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:FileSystem ], + d3f:DigitalInformationBearer . + +d3f:SymbolicAI a owl:Class, + owl:NamedIndividual ; + rdfs:label "Symbolic AI" ; + d3f:d3fend-id "D3A-SR" ; + d3f:definition "Symbolic artificial intelligence is the term for the collection of all methods in artificial intelligence that are based on high-level symbolic (human-readable) representations of problems, logic, and search." ; + d3f:kb-article """## How it works +Symbolic artificial intelligence is used in tools such as logic programming, production rules, semantic nets and frames, and it developed applications such as knowledge-based systems (in particular, expert systems), symbolic mathematics, automated theorem provers, ontologies, the semantic web, and automated planning and scheduling systems. The Symbolic AI paradigm led to seminal ideas in search, symbolic programming languages, agents, multi-agent systems, the semantic web, and the strengths and limitations of formal knowledge and reasoning systems. + +## References +1. Symbolic artifical intelligence. (2023, May 23). In _Wikipedia_. [Link](https://en.wikipedia.org/wiki/Symbolic_artificial_intelligence)""" ; + d3f:synonym "Symbolic Artificial Intelligence" ; + rdfs:subClassOf d3f:SymbolicLogic . + +d3f:T1003 a owl:Class ; + rdfs:label "OS Credential Dumping" ; + d3f:attack-id "T1003" ; + d3f:definition "Adversaries may attempt to dump credentials to obtain account login and credential material, normally in the form of a hash or a clear text password. Credentials can be obtained from OS caches, memory, or structures.(Citation: Brining MimiKatz to Unix) Credentials can then be used to perform [Lateral Movement](https://attack.mitre.org/tactics/TA0008) and access restricted information." ; + rdfs:subClassOf d3f:CredentialAccessTechnique . + +d3f:T1021 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote Services" ; + d3f:attack-id "T1021" ; + d3f:definition "Adversaries may use [Valid Accounts](https://attack.mitre.org/techniques/T1078) to log into a service that accepts remote connections, such as telnet, SSH, and VNC. The adversary may then perform actions as the logged-on user." ; + d3f:produces d3f:IntranetNetworkTraffic ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:IntranetNetworkTraffic ], + d3f:LateralMovementTechnique . + +d3f:T1552 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Unsecured Credentials" ; + d3f:accesses d3f:Credential ; + d3f:attack-id "T1552" ; + d3f:definition "Adversaries may search compromised systems to find and obtain insecurely stored credentials. These credentials can be stored and/or misplaced in many locations on a system, including plaintext files (e.g. [Bash History](https://attack.mitre.org/techniques/T1552/003)), operating system or application-specific repositories (e.g. [Credentials in Registry](https://attack.mitre.org/techniques/T1552/002)), or other specialized files/artifacts (e.g. [Private Keys](https://attack.mitre.org/techniques/T1552/004)).(Citation: Brining MimiKatz to Unix)" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Credential ], + d3f:CredentialAccessTechnique . + +d3f:T1583 a owl:Class ; + rdfs:label "Acquire Infrastructure" ; + d3f:attack-id "T1583" ; + d3f:definition "Adversaries may buy, lease, rent, or obtain infrastructure that can be used during targeting. A wide variety of infrastructure exists for hosting and orchestrating adversary operations. Infrastructure solutions include physical or cloud servers, domains, and third-party web services.(Citation: TrendmicroHideoutsLease) Some infrastructure providers offer free trial periods, enabling infrastructure acquisition at limited to no cost.(Citation: Free Trial PurpleUrchin) Additionally, botnets are available for rent or purchase." ; + rdfs:subClassOf d3f:ResourceDevelopmentTechnique . + +d3f:T1584 a owl:Class ; + rdfs:label "Compromise Infrastructure" ; + d3f:attack-id "T1584" ; + d3f:definition "Adversaries may compromise third-party infrastructure that can be used during targeting. Infrastructure solutions include physical or cloud servers, domains, network devices, and third-party web and DNS services. Instead of buying, leasing, or renting infrastructure an adversary may compromise infrastructure and use it during other phases of the adversary lifecycle.(Citation: Mandiant APT1)(Citation: ICANNDomainNameHijacking)(Citation: Talos DNSpionage Nov 2018)(Citation: FireEye EPS Awakens Part 2) Additionally, adversaries may compromise numerous machines to form a botnet they can leverage." ; + rdfs:subClassOf d3f:ResourceDevelopmentTechnique . + +d3f:TCPEvent a owl:Class ; + rdfs:label "TCP Event" ; + d3f:definition "An event involving the Transmission Control Protocol (TCP), providing reliable, ordered, and error-checked delivery of data between applications." ; + rdfs:subClassOf d3f:TransportLayerEvent . + +d3f:Vulnerability a owl:Class, + owl:NamedIndividual ; + rdfs:label "Vulnerability" ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:semantic-relation a owl:ObjectProperty ; + rdfs:label "semantic-relation" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:spoofs a owl:ObjectProperty ; + rdfs:label "spoofs" ; + d3f:definition "x spoofs y: The technique x creates a fake instance of a digital artifact y; that is, y is a decoy, fake, or counterfeit." ; + rdfs:seeAlso , + ; + rdfs:subPropertyOf d3f:associated-with, + d3f:deceives-with . + +d3f:ApplicationEvent a owl:Class ; + rdfs:label "Application Event" ; + d3f:definition "An event that captures the behavior, state, or interactions of software applications or services operating within a system. Application events encompass lifecycle changes, configuration updates, and operational anomalies, providing insight into the health and performance of software components." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:Application ], + d3f:DigitalEvent . + +d3f:ApplicationLayerEvent a owl:Class ; + rdfs:label "Application Layer Event" ; + d3f:definition "An event occurring at the application layer, involving protocols that support application-specific communication." ; + rdfs:subClassOf d3f:NetworkEvent . + +d3f:AuthenticationEventThresholding a d3f:AuthenticationEventThresholding, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Authentication Event Thresholding" ; + d3f:analyzes d3f:Authentication ; + d3f:created "2020-08-05T00:00:00"^^xsd:dateTime ; + d3f:d3fend-id "D3-ANET" ; + d3f:definition "Collecting authentication events, creating a baseline user profile, and determining whether authentication events are consistent with the baseline profile." ; + d3f:kb-article """## How it works +Authentication event data is collected (logon information such as device id, time of day, day of week, geo-location, etc.) to create an activity baseline. Then, a threshold is determined either through a manually specified configuration, or a statistical analysis of deviations in historical data. New authentication events are evaluated to determine if a threshold is exceeded. Thresholds can be static or dynamic. + +### Actions +As a result of the analysis, actions taken could include: + +* [Account Locking](/technique/d3f:AccountLocking) +* Raising an alert + +### Example data sources + * Directory server logs + * VPN Server logs + * IDAM Capability logs + * NAC logs + * Authentication client logs + * Kerberos network traffic + * LDAP network traffic + +## Considerations + +This technique covers statistical outliers. Though depending on the complexity or dimensionality of the data considered, outliers may not be obvious to a human analyst reviewing events in simplistic analytic views. If the malicious activity is not statistically different from benign activity, an alert threshold will not be met.""" ; + d3f:kb-reference d3f:Reference-MethodAndApparatusForNetworkFraudDetectionAndRemediationThroughAnalytics_IdaptiveLLC, + d3f:Reference-SimultaneousLoginsOnAHost_MITRE, + , + d3f:Reference-UserLoggedInToMultipleHosts_MITRE, + d3f:Reference-UserLoginActivityMonitoring_MITRE ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Authentication ], + d3f:UserBehaviorAnalysis . + +d3f:CWE-20 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Input Validation" ; + d3f:cwe-id "CWE-20" ; + d3f:weakness-of d3f:UserInputFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:UserInputFunction ], + d3f:CWE-707 . + +d3f:CWE-697 a owl:Class ; + rdfs:label "Incorrect Comparison" ; + d3f:cwe-id "CWE-697" ; + rdfs:subClassOf d3f:Weakness . + +d3f:CWE-707 a owl:Class ; + rdfs:label "Improper Neutralization" ; + d3f:cwe-id "CWE-707" ; + rdfs:subClassOf d3f:Weakness . + +d3f:CWE-74 a owl:Class ; + rdfs:label "Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')" ; + d3f:cwe-id "CWE-74" ; + rdfs:subClassOf d3f:CWE-707 . + +d3f:CWE-923 a owl:Class ; + rdfs:label "Improper Restriction of Communication Channel to Intended Endpoints" ; + d3f:cwe-id "CWE-923" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:Database a owl:Class, + owl:NamedIndividual ; + rdfs:label "Database" ; + d3f:definition "A database is an organized collection of data, generally stored and accessed electronically from a computer system. Where databases are more complex they are often developed using formal design and modeling techniques." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:DynamicAnalysis a d3f:DynamicAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Dynamic Analysis" ; + d3f:analyzes d3f:DocumentFile, + d3f:ExecutableFile ; + d3f:d3fend-id "D3-DA" ; + d3f:definition "Executing or opening a file in a synthetic \"sandbox\" environment to determine if the file is a malicious program or if the file exploits another program such as a document reader." ; + d3f:kb-article """## How it works +Analyzing the interaction of a piece of code with a system while the code is being executed in a controlled environment such as a sandbox, virtual machine, or simulator. This exposes the natural behavior of the piece of code without requiring the code to be disassembled. + +## Considerations + * Malware often detects a fake environment, then changes its behavior accordingly. For example, it could detect that the system clock is being sped up in an effort to get it to execute commands that it would normally only execute at a later time, or that the hardware manufacturer of the machine is a virtualization provider. + * Malware can attempt to determine if it is being debugged, and change its behavior accordingly. + * For maximum fidelity, the simulated and real environments should be as similar as possible because the malware could perform differently in different environments. + * Sometimes the malware behavior is triggered only under certain conditions (on a specific system date, after a certain time, or after it is sent a specific command) and can't be detected through a short execution in a virtual environment. + +## Implementations +* Cuckoo Sandbox""" ; + d3f:kb-reference d3f:Reference-MalwareAnalysisSystem_PaloAltoNetworksInc, + d3f:Reference-UseOfAnApplicationControllerToMonitorAndControlSoftwareFileAndApplicationEnvironments_SophosLtd ; + d3f:synonym "Malware Detonation", + "Malware Sandbox" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:DocumentFile ], + [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:FileAnalysis . + +d3f:EncryptedCredential a owl:Class, + owl:NamedIndividual ; + rdfs:label "Encrypted Credential" ; + d3f:definition "A credential that is encrypted." ; + rdfs:subClassOf d3f:Credential . + +d3f:HardwareDeviceEvent a owl:Class ; + rdfs:label "Hardware Device Event" ; + d3f:definition "An event capturing the existence, state, or interaction of hardware or virtual devices within a system. Device events encompass activities such as discovery, connection, disconnection, operational state changes, or configuration modifications, providing visibility into device behavior and health." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:HardwareDevice ], + d3f:DigitalEvent . + +d3f:InputDevice a owl:Class, + owl:NamedIndividual ; + rdfs:label "Input Device" ; + d3f:definition "In computing, an input device is a piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance. Examples of input devices include keyboards, mouse, scanners, digital cameras, joysticks, and microphones. Input devices can be categorized based on:" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:HardwareDevice, + d3f:LocalResource . + +d3f:Isolate a d3f:DefensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Isolate" ; + d3f:definition "The isolate tactic creates logical or physical barriers in a system which reduces opportunities for adversaries to create further accesses." ; + d3f:display-order 2 ; + d3f:display-priority 0 ; + rdfs:subClassOf d3f:DefensiveTactic . + +d3f:Pointer a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pointer" ; + d3f:definition "In computer science, a pointer is a programming language object, whose value refers to (or \"points to\") another value stored elsewhere in the computer memory using its memory address. A pointer references a location in memory, and obtaining the value stored at that location is known as dereferencing the pointer. As an analogy, a page number in a book's index could be considered a pointer to the corresponding page; dereferencing such a pointer would be done by flipping to the page with the given page number." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformation . + +d3f:PointerAuthentication a d3f:PointerAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Pointer Authentication" ; + d3f:authenticates d3f:Pointer ; + d3f:d3fend-id "D3-PAN" ; + d3f:definition "Comparing the cryptographic hash or derivative of a pointer's value to an expected value." ; + d3f:kb-article """## How It Works + +Pointer Authentication (frequently referred to as PAC, although the technique is properly Pointer Authentication) is a security feature to provide protection against attackers with memory read/write access. A Pointer Authentication Code (PAC) is a cryptographic hash or derivative computed on the value of a pointer and some additional context information which can then provide a cryptographically strong guarantee about the likelihood that a pointer has been tampered with by an attacker. + +Although pointers are 64 bits, most systems have a substantially smaller virtual address space, leaving unused bits in pointers that can store the value of the PAC, this can be done to reduce memory space requirements. One implementation is in ARMv8.3-A. A PAC is computed over the 64-bit pointer value and a 64-bit context value. Instructions are introduced to deal with pointers: one category to compute and insert the PAC into a pointer, another category to verify the pointer and invalidate the pointer if the PAC does not check, and a third category to remove the pointer and restore the original value without verifying. + +The ARM standard specifies a cryptographic algorithm called QARMA-64 (designed by Qualcomm) to compute the signature, although this algorithm is not required. The architecture provides for five secret 128-bit Pointer Authentication keys: two for instruction pointers, two for data pointers, and a general key for signing larger blocks of data. + +## Considerations + +In the ARM implementation, the mechanisms above for manipulating PACS are provided, but it is up to the code developer to manage the keys for the cryptographic algorithm. + + +A known potential limitation of PACs concerns signing gadgets. Under certain circumstances PACs can be bypassed by forcing the system to run a signing gadget which will allow the signing of arbitrary pointers to occur.""" ; + d3f:kb-reference d3f:Reference-PointerAuthenticationOnARMv8.3, + d3f:Reference-PointerAuthenticationProjectZero ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:Pointer ], + d3f:ApplicationHardening . + +d3f:RPCTrafficAnalysis a d3f:RPCTrafficAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "RPC Traffic Analysis" ; + d3f:analyzes d3f:RPCNetworkTraffic ; + d3f:d3fend-id "D3-RTA" ; + d3f:definition "Monitoring the activity of remote procedure calls in communication traffic to establish standard protocol operations and potential attacker activities." ; + d3f:kb-article """## How it works +A remote procedure call (RPC) enables one computer to execute a specific function on another computer, as if it were a local application process. There are numerous RPC specifications and implementations. RPC capabilities can be abused by attackers in order to achieve a variety of tactical objectives including execution, persistence, initial access, and more. RPC proxies may be used to collect and store RPC traffic. RPCs can occur over network sockets or named pipes. + +Analytics look for unauthorized behavior such as: + +* Processes being launched or scheduled remotely +* System configurations being changed remotely +* Unauthorized file read activity + +Example RPC Protocols: + +* DCE/RPC +* CORBA +* Open Network Computing Remote Procedure Call +* D-Bus +* XML-RPC +* JSON-RPC +* SOAP +* Apache Thrift + +## Considerations +* RPC is widely used in enterprise environments, and significant data filtering may be required in large environments to enable analytic processing. +* RPC traffic may occur over a pipe, or within a host over loopback interface, thus making network collection difficult.""" ; + d3f:kb-reference d3f:Reference-CAR-2014-05-001%3ARPCActivity_MITRE, + d3f:Reference-CAR-2014-11-007-RemoteWindowsManagementInstrumentation_WMI_OverRPC_MITRE, + d3f:Reference-CreateRemoteProcessViaWMIC_MITRE_Other, + d3f:Reference-RPCCallInterception_CrowdstrikeInc, + d3f:Reference-RemotelyLaunchedExecutablesViaServices_MITRE, + d3f:Reference-RemotelyLaunchedExecutablesViaWMI_MITRE, + d3f:Reference-RemotelyScheduledTasksViaSchtasks_MITRE, + d3f:Reference-SMBWriteRequest-NamedPipes_MITRE ; + d3f:synonym "RPC Protocol Analysis" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:RPCNetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:ResourceAccessPatternAnalysis a d3f:ResourceAccessPatternAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Resource Access Pattern Analysis" ; + d3f:analyzes d3f:Authentication, + d3f:Authorization ; + d3f:d3fend-id "D3-RAPA" ; + d3f:definition "Analyzing the resources accessed by a user to identify unauthorized activity." ; + d3f:kb-article """## How it works +This technique analyzes a user's resource accesses by comparing the user's recent activity against a baseline activity model. Major differences between the current activity and the baseline model might indicate unauthorized activity if they are severe enough. + + +## Considerations +* Potential for false positives from anomalies that are not associated with malicious activity. +* Attackers that move low and slow may not differentiate their resource access activity behavior enough to trigger an alert.""" ; + d3f:kb-reference d3f:Reference-HostIntrusionPreventionSystemUsingSoftwareAndUserBehaviorAnalysis_SophosLtd, + d3f:Reference-MethodAndApparatusForNetworkFraudDetectionAndRemediationThroughAnalytics_IdaptiveLLC, + d3f:Reference-ModelingUserAccessToComputerResources_DaedalusGroupLLC, + , + d3f:Reference-SystemAndMethodThereofForIdentifyingAndRespondingToSecurityIncidentsBasedOnPreemptiveForensics_PaloAltoNetworksInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Authentication ], + [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Authorization ], + d3f:UserBehaviorAnalysis . + +d3f:SystemDaemonMonitoring a d3f:SystemDaemonMonitoring, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System Daemon Monitoring" ; + d3f:d3fend-id "D3-SDM" ; + d3f:definition "Tracking changes to the state or configuration of critical system level processes." ; + d3f:kb-article """## How it works +Attackers may manipulate system settings or services to disable system logging or monitoring of security tools and events. Firewall and antivirus services are popular targets for attackers. Disabling system logs will also allow an attacker's actions to go unnoticed. Analysis of logs, registries, and process monitoring help defenders locate signs of tampering. Two possible approaches are to monitor hardened system services or to monitor registry updates for modifications to security settings.""" ; + d3f:kb-reference d3f:Reference-HostIntrusionPreventionSystemUsingSoftwareAndUserBehaviorAnalysis_SophosLtd, + d3f:Reference-MethodUsingKernelModeAssistanceForTheDetectionAndRemovalOfThreatsWhichAreActivelyPreventingDetectionAndRemovalFromARunningSystem_SymantecCorporation, + d3f:Reference-UserActivityFromStoppingWindowsDefensiveServices_MITRE ; + d3f:monitors d3f:OperatingSystemProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:OperatingSystemProcess ], + d3f:OperatingSystemMonitoring . + +d3f:T1556 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Modify Authentication Process" ; + d3f:attack-id "T1556" ; + d3f:definition "Adversaries may modify authentication mechanisms and processes to access user credentials or enable otherwise unwarranted access to accounts. The authentication process is handled by mechanisms, such as the Local Security Authentication Server (LSASS) process and the Security Accounts Manager (SAM) on Windows, pluggable authentication modules (PAM) on Unix-based systems, and authorization plugins on MacOS systems, responsible for gathering, storing, and validating credentials. By modifying an authentication process, an adversary may be able to authenticate to a service or system without using [Valid Accounts](https://attack.mitre.org/techniques/T1078)." ; + d3f:modifies d3f:AuthenticationService ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modifies ; + owl:someValuesFrom d3f:AuthenticationService ], + d3f:CredentialAccessTechnique, + d3f:DefenseEvasionTechnique . + +d3f:WindowsRegistryKeyEvent a owl:Class ; + rdfs:label "Windows Registry Key Event" ; + d3f:definition "Events representing actions performed on Windows Registry keys, such as creation, modification, or deletion, which define hierarchical nodes for storing configuration data." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:WindowsRegistryKey ], + d3f:WindowsRegistryEvent . + +d3f:d3fend-annotation a owl:AnnotationProperty ; + rdfs:label "d3fend-annotation" ; + d3f:definition "x d3fend-annotation y: The d3fend object x has the annotation y." ; + rdfs:subPropertyOf owl:versionInfo . + +d3f:restores a owl:ObjectProperty ; + rdfs:label "restores" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:BootSector a owl:Class, + owl:NamedIndividual ; + rdfs:label "Boot Sector" ; + d3f:definition "A boot record [boot sector] is the sector of a persistent data storage device (e.g., hard disk, floppy disk, optical disc, etc.) which contains machine code to be loaded into random-access memory (RAM) and then executed by a computer system's built-in firmware (e.g., the BIOS, Das U-Boot, etc.)." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:BootRecord . + +d3f:CWE-1076 a owl:Class ; + rdfs:label "Insufficient Adherence to Expected Conventions" ; + d3f:cwe-id "CWE-1076" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-285 a owl:Class ; + rdfs:label "Improper Authorization" ; + d3f:cwe-id "CWE-285" ; + rdfs:subClassOf d3f:CWE-284 . + +d3f:CWE-665 a owl:Class ; + rdfs:label "Improper Initialization" ; + d3f:cwe-id "CWE-665" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-755 a owl:Class ; + rdfs:label "Improper Handling of Exceptional Conditions" ; + d3f:cwe-id "CWE-755" ; + rdfs:subClassOf d3f:CWE-703 . + +d3f:Certificate a owl:Class, + owl:NamedIndividual ; + rdfs:label "Certificate" ; + d3f:contains d3f:Identifier, + d3f:PublicKey ; + d3f:definition "In cryptography, a public key certificate, also known as a digital certificate or identity certificate, is an electronic document used to prove the ownership of a public key. The certificate includes information about the key, information about the identity of its owner (called the subject), and the digital signature of an entity that has verified the certificate's contents (called the issuer). If the signature is valid, and the software examining the certificate trusts the issuer, then it can use that key to communicate securely with the certificate's subject. In email encryption, code signing, and e-signature systems, a certificate's subject is typically a person or organization. However, in Transport Layer Security (TLS) a certificate's subject is typically a computer or other device." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Identifier ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:PublicKey ], + d3f:DigitalInformationBearer ; + skos:altLabel "Public Key Certificate" . + +d3f:CredentialHardening a d3f:CredentialHardening, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Hardening" ; + d3f:d3fend-id "D3-CH" ; + d3f:definition "Credential Hardening techniques modify system or network properties in order to protect system or network/domain credentials." ; + d3f:enables d3f:Harden ; + d3f:hardens d3f:Credential ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Harden ], + [ a owl:Restriction ; + owl:onProperty d3f:hardens ; + owl:someValuesFrom d3f:Credential ], + d3f:DefensiveTechnique . + +d3f:DecoyObject a d3f:DecoyObject, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Decoy Object" ; + d3f:d3fend-id "D3-DO" ; + d3f:definition "A Decoy Object is created and deployed for the purposes of deceiving attackers." ; + d3f:enables d3f:Deceive ; + d3f:kb-article """## Technique Overview +Decoy objects are typically configured with detectable means of communication but do not have any legitimate business purpose. Any communication via or to these objects should be logged and analyzed to find potential indicators of compromise for a possible past or future attack against other systems.""" ; + d3f:synonym "Lure" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Deceive ], + d3f:DefensiveTechnique . + +d3f:DomainName a owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Name" ; + d3f:definition "A domain name is an identification string that defines a realm of administrative autonomy, authority or control within the Internet. Domain names are formed by the rules and procedures of the Domain Name System (DNS). Any name registered in the DNS is a domain name.Domain names are used in various networking contexts and application-specific naming and addressing purposes. In general, a domain name represents an Internet Protocol (IP) resource, such as a personal computer used to access the Internet, a server computer hosting a web site, or the web site itself or any other service communicated via the Internet. In 2015, 294 million domain names had been registered." ; + d3f:identifies d3f:IPAddress ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:IPAddress ], + d3f:Identifier . + +d3f:EventLogEvent a owl:Class ; + rdfs:label "Event Log Event" ; + d3f:definition "An event that captures actions or operations related to the management of system event logs, including modifications, access, and service state changes." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:EventLog ], + d3f:DigitalEvent . + +d3f:HardwareDriver a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hardware Driver" ; + d3f:definition "In computing, a device driver (commonly referred to simply as a driver) is a computer program that operates or controls a particular type of device that is attached to a computer. A driver provides a software interface to hardware devices, enabling operating systems and other computer programs to access hardware functions without needing to know precise details of the hardware being used. A driver communicates with the device through the computer bus or communications subsystem to which the hardware connects. When a calling program invokes a routine in the driver, the driver issues commands to the device. Once the device sends data back to the driver, the driver may invoke routines in the original calling program. Drivers are hardware dependent and operating-system-specific. They usually provide the interrupt handling required for any necessary asynchronous time-dependent hardware interface." ; + d3f:drives d3f:HardwareDevice ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:drives ; + owl:someValuesFrom d3f:HardwareDevice ], + d3f:DigitalInformationBearer ; + skos:altLabel "Device Driver" . + +d3f:Host a owl:Class, + owl:NamedIndividual ; + rdfs:label "Host" ; + d3f:contains d3f:Application ; + d3f:definition "A host is a computer or other device, typically connected to a computer network. A network host may offer information resources, services, and applications to users or other nodes on the network. A network host is a network node that is assigned a network layer host address. Network hosts that participate in applications that use the client-server model of computing, are classified as server or client systems. Network hosts may also function as nodes in peer-to-peer applications, in which all nodes share and consume resources in an equipotent manner." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Application ], + d3f:ComputerNetworkNode ; + skos:altLabel "Network Host" . + +d3f:JobSchedule a owl:Class, + owl:NamedIndividual ; + rdfs:label "Job Schedule" ; + d3f:contains d3f:ScheduledJob ; + d3f:definition "A job schedule contains specification of tasks to be executed at particular times or time intervals. The schedule is a plan that enacted by a task scheduling process. In Windows, the schedule can be accessed at 'C:\\Windows\\System32\\Tasks' or in the registry. In Linux, the schedule is located at '/etc/crontab'" ; + d3f:modified-by d3f:JobSchedulerSoftware ; + d3f:synonym "Task Schedule" ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:modified-by ; + owl:someValuesFrom d3f:JobSchedulerSoftware ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ScheduledJob ], + d3f:DigitalInformation . + +d3f:OSAPICreateFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "OS API Create File" ; + d3f:invokes d3f:CreateFile ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:CreateFile ], + d3f:OSAPISystemFunction . + +d3f:One-timePassword a d3f:One-timePassword, + owl:Class, + owl:NamedIndividual ; + rdfs:label "One-time Password" ; + d3f:d3fend-id "D3-OTP" ; + d3f:definition "A one-time password is valid for only one user authentication." ; + d3f:kb-article """## How it works + +When a user initiates authentication, they are asked for a one-time password, often in addition to other credentials such as a traditional password or smart card. The one-time password may be from a list provided in advance, sent via a channel such as SMS or HTTPS to an app, or a generated token. + +In the case of a physical token which generates one-time passwords incrementally based on time elapsed, that token device need not be connected to the internet. In different implementations, an administrator of the system, or a user with additional verification, can adjust for clock skew between the token and the verification system as needed. + +## Considerations + +### Compromise of delivery channel +- SIM Swapping +- Secure token visual compromise +- Insecure delivery channel + +### Compromise of delivery device +Physical loss of One-time Password device. + +### Compromise of long-term backup codes +These are often provided in the form of a downloadable document with a regular name, which can be searched for in the case that the user forgets where they put them. This digital file or printed document could be stolen. +Additionally, after the code file is printed, it could be recovered from the system printer spool unless the spooler cache is cleared.""" ; + d3f:kb-reference d3f:Reference-DigitalIdentityGuidelines800-63-3, + d3f:Reference-RFC2289-AOne-TimePasswordSystem ; + d3f:synonym "OTP" ; + d3f:use-limits d3f:Password ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:use-limits ; + owl:someValuesFrom d3f:Password ], + d3f:PasswordRotation . + +d3f:PointerDereferencingFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Pointer Dereferencing Function" ; + d3f:addresses d3f:MemoryBlock, + d3f:Pointer ; + d3f:definition "A function which has an operation which dereferences a pointer." ; + rdfs:comment "Note, this is not the actual code which performs the dereferencing operation internal to an application runtime." ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:addresses ; + owl:someValuesFrom d3f:Pointer ], + [ a owl:Restriction ; + owl:onProperty d3f:addresses ; + owl:someValuesFrom d3f:MemoryBlock ], + d3f:Subroutine . + +d3f:ReconnaissanceTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Reconnaissance Technique" ; + d3f:enables d3f:TA0043 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0043 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:SystemCallAnalysis a d3f:SystemCallAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System Call Analysis" ; + d3f:analyzes d3f:SystemCall ; + d3f:d3fend-id "D3-SCA" ; + d3f:definition "Analyzing system calls to determine whether a process is exhibiting unauthorized behavior." ; + d3f:kb-article """## How it works + +System calls are APIs between a user application and the operating system [1]. + +By analyzing a process's use of these APIs, it is, in some cases, possible to ascertain whether a program is exhibiting unauthorized behavior, including trying to escalate its privileges. + +### Gathering System Calls +A common method to capture system calls is to use kernel APIs to hook [2] a process's system call invocations. + +The Linux system call `ptrace` tracks other system calls in a process and allows their alteration; this is made use of by GDB. `strace` utilizes `ptrace` and will print to stdout each system call invoked. Other applications record this data in local or remote databases. + +The log entry for each system call, which may reference additional information such as the date and time, and the process tree for the process which made the system call, is relayed, in real time or post-facto, to an analysis module which consults a catalog or model to determine whether the distribution matches a known-good or known-bad pattern. + + +### Analysis + +System calls are analyzed with a variety of methods. Some analytics look for specific sequences of instructions, others may apply statistical methods to identify abnormal behavior. Sequences of instructions can be abstracted into conceptually higher order user activities, for example: + +* An attacker executes many system calls in a short period of time, with several sequences which could be used to escalate privileges. +* Getting the contents from a URL, writing to a new file, and then executing the same file. +* A ransomware program which either uses a loop or creates many threads to: read a specified file, encrypt its contents, create an output file with a similar name to the original file, and delete the unencrypted original. + +## Considerations + +* Duplicative or extraneous system calls may be added to malware to defeat analytics. +* Malware could replace API hooking instructions to allow system calls to be made without being monitored. +* A model built from a training set of system calls and related data may not be updated fast enough to detect new threats. + + +[1] [Syscalls](http://man7.org/linux/man-pages/man2/syscalls.2.html) + +[2] [Hooking](http://dbpedia.org/resource/Hooking)""" ; + d3f:kb-reference d3f:Reference-CAR-2020-05-001%3AMiniDumpOfLSASS_MITRE, + d3f:Reference-CAR-2021-05-011%3ACreateRemoteThreadIntoLSASS_MITRE, + d3f:Reference-CredentialDumpingViaWindowsTaskManager_MITRE, + d3f:Reference-DLLInjectionViaLoadLibrary_MITRE, + d3f:Reference-DeterministicMethodForDetectingAndBlockingOfExploitsOnInterpretedCode_K2CyberSecurityInc, + d3f:Reference-Hardware-assistedSystemAndMethodForDetectingAndAnalyzingSystemCallsMadeToAnOpertingSystemKernel_EndgameInc, + d3f:Reference-MalwareDetectionInEventLoops_CrowdstrikeInc, + d3f:Reference-PostSandboxMethodsAndSystemsForDetectingAndBlockingZero-dayExploitsViaApiCallValidation_K2CyberSecurityInc ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:SystemCall ], + d3f:ProcessAnalysis . + +d3f:T1036 a owl:Class ; + rdfs:label "Masquerading" ; + d3f:attack-id "T1036" ; + d3f:definition "Adversaries may attempt to manipulate features of their artifacts to make them appear legitimate or benign to users and/or security tools. Masquerading occurs when the name or location of an object, legitimate or malicious, is manipulated or abused for the sake of evading defenses and observation. This may include manipulating file metadata, tricking users into misidentifying the file type, and giving legitimate task or service names." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1070 a owl:Class ; + rdfs:label "Indicator Removal" ; + d3f:attack-id "T1070" ; + d3f:definition "Adversaries may delete or modify artifacts generated within systems to remove evidence of their presence or hinder defenses. Various artifacts may be created by an adversary or something that can be attributed to an adversary’s actions. Typically these artifacts are used as defensive indicators related to monitored events, such as strings from downloaded files, logs that are generated from user actions, and other data analyzed by defenders. Location, format, and type of artifact (such as command or login history) are often specific to each platform." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:loads a owl:ObjectProperty ; + rdfs:label "loads" ; + d3f:definition "x loads y: The technique or process x transfers a software from a storage y to a computer's memory for subsequent execution." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:may-produce a owl:ObjectProperty ; + rdfs:label "may-produce" ; + d3f:definition "x may-produce y: They entity x may produce the thing y; that is, 'x produces y' may be true." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:ApplicationHardening a d3f:ApplicationHardening, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Hardening" ; + d3f:d3fend-id "D3-AH" ; + d3f:definition "Application Hardening makes an executable application more resilient to a class of exploits which either introduce new code or execute unwanted existing code. These techniques may be applied at compile-time or on an application binary." ; + d3f:enables d3f:Harden ; + d3f:kb-article """## Technique Overview + +Exploits may, for example, rely on knowledge of addresses in a process's memory, they may alter memory contents, and they may cause a program to use instructions in a way that they were not intended. By, for example, including code that dynamically changes the memory address of data or code on each run, introducing logic to validating the memory contents before certain potentially dangerous flows are executed, or monitoring a program for unusual sequence of instructions, this makes it harder for an attacker to craft a working exploit.""" ; + d3f:synonym "Process Hardening" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Harden ], + d3f:DefensiveTechnique . + +d3f:CWE-200 a owl:Class ; + rdfs:label "Exposure of Sensitive Information to an Unauthorized Actor" ; + d3f:cwe-id "CWE-200" ; + rdfs:subClassOf d3f:CWE-668 . + +d3f:CWE-657 a owl:Class ; + rdfs:label "Violation of Secure Design Principles" ; + d3f:cwe-id "CWE-657" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-667 a owl:Class ; + rdfs:label "Improper Locking" ; + d3f:cwe-id "CWE-667" ; + rdfs:subClassOf d3f:CWE-662 . + +d3f:CWE-682 a owl:Class ; + rdfs:label "Incorrect Calculation" ; + d3f:cwe-id "CWE-682" ; + rdfs:subClassOf d3f:Weakness . + +d3f:DigitalArtifact a owl:Class, + owl:NamedIndividual ; + rdfs:label "Digital Artifact" ; + d3f:definition "An information-bearing artifact (object) that is, or is encoded to be used with, a digital computer system. This concept is broad to include the literal instances of an artifact, or an implicit summarization of changes to or properties of other artifacts." ; + d3f:display-baseurl "/dao/artifact/" ; + d3f:synonym "Digital Asset" ; + rdfs:seeAlso , + , + ; + rdfs:subClassOf d3f:Artifact . + +d3f:DomainUserAccount a owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain User Account" ; + d3f:definition "A domain user account in Microsoft Windows (2000) defines that user's access to a logical group of network objects (computers, users, devices) that share the same Active Directory databases; that is, a user's access to a domain." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:UserAccount . + +d3f:ExecutionIsolation a d3f:ExecutionIsolation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Execution Isolation" ; + d3f:d3fend-id "D3-EI" ; + d3f:definition "Execution Isolation techniques prevent application processes from accessing non-essential system resources, such as memory, devices, or files." ; + d3f:enables d3f:Isolate ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Isolate ], + d3f:DefensiveTechnique . + +d3f:ExfiltrationTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Exfiltration Technique" ; + d3f:enables d3f:TA0010 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0010 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:GetSystemConfigValue a owl:Class, + owl:NamedIndividual ; + rdfs:label "Get System Config Value" ; + d3f:reads d3f:SystemConfigurationDatabaseRecord ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:SystemConfigurationDatabaseRecord ], + d3f:SystemConfigSystemCall . + +d3f:KernelModule a owl:Class, + owl:NamedIndividual ; + rdfs:label "Kernel Module" ; + d3f:definition """A loadable kernel module (LKM) is an object file that contains code to extend the running kernel, or so-called base kernel, of an operating system. LKMs are typically used to add support for new hardware (as device drivers) and/or filesystems, or for adding system calls. When the functionality provided by a LKM is no longer required, it can be unloaded in order to free memory and other resources. + +Most current Unix-like systems and Microsoft Windows support loadable kernel modules, although they might use a different name for them, such as kernel loadable module (kld) in FreeBSD, kernel extension (kext) in macOS,[1] kernel extension module in AIX, kernel-mode driver in Windows NT[2] and downloadable kernel module (DKM) in VxWorks. They are also known as kernel loadable modules (or KLM), and simply as kernel modules (KMOD).""" ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ObjectFile ; + skos:altLabel "LKM", + "Loadable Kernel Module" . + +d3f:NetworkIsolation a d3f:NetworkIsolation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Isolation" ; + d3f:d3fend-id "D3-NI" ; + d3f:definition "Network Isolation techniques prevent network hosts from accessing non-essential system network resources." ; + d3f:enables d3f:Isolate ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Isolate ], + d3f:DefensiveTechnique . + +d3f:OutboundInternetWebTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Internet Web Traffic" ; + d3f:definition "Outbound internet web traffic is network traffic that is: (a) on an outgoing connection initiated from a host within a network to a host outside the network, and (b) using a standard web protocol." ; + d3f:may-contain d3f:URL ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:URL ], + d3f:OutboundInternetNetworkTraffic, + d3f:WebNetworkTraffic . + +d3f:RemoteTerminalSessionDetection a d3f:RemoteTerminalSessionDetection, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Remote Terminal Session Detection" ; + d3f:analyzes d3f:NetworkTraffic ; + d3f:d3fend-id "D3-RTSD" ; + d3f:definition "Detection of an unauthorized remote live terminal console session by examining network traffic to a network host." ; + d3f:kb-article """## How it works +An external attacker takes remote control of a host inside a company or organization's network and manually directs offensive techniques. Nonstandard terminal sessions and abnormal behaviors are analyzed in this technique. Abnormal behavior detection includes analysis of user input patterns in the real-time session, keyboard output and packet inspection. + +### Network Traffic Inspection +Network traffic from internal hosts is the main concern and focus for the traffic inspection. The network traffic is collected into inspection groups. The groups of traffic are assembled into distinct pair flows (outbound/inbound) and the pair flows are further divided into sessions. Only sessions originated inside of the network are considered for the inspection. Traffic inspection includes analysis to determine if a human is involved in the session exchanges. Time-based statistics are captured for each session being analyzed by the detection engine. + +### Algorithm Analysis Description +Analysis algorithms look for patterns in the network traffic captured from the session data. A detection engine groups the session traffic data, between the hosts, into rapid exchange instances. Analysis of rapid exchange traffic patterns can lead to the discovery of abnormal behavior which is indicative of a compromised internal host. The analysis algorithms look for patterns in the traffic which correlate to known activity (e.g., relay attacks, bot activity, bitcoin mining). Some metrics used during inspection include the following. + +* Number of rapid-exchange instances +* Time interval between packets +* Fixed cadence of traffic +* Rhythm and direction of the initiation of instances +* Volume of data flowing from internal to external controlling host +* Data transfer characteristics +* Variability in length of silent periods + +## Considerations +* Full packet capture is required which can be process intensive to analyze +* Attackers that move low and slow may blend in with existing traffic resulting in false negatives""" ; + d3f:kb-reference d3f:Reference-MethodAndSystemForDetectingExternalControlOfCompromisedHosts_VECTRANETWORKSInc, + d3f:Reference-RDPConnectionDetection_MITRE, + d3f:Reference-RemoteDesktopLogon_MITRE ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:NetworkTrafficAnalysis . + +d3f:RemovableMediaDevice a owl:Class, + owl:NamedIndividual ; + rdfs:label "Removable Media Device" ; + d3f:definition "A removable media device is a hardware device used for computer storage and that is designed to be inserted and removed from the system. It is distinct from other removable media in that all the hardware required to read the data are built into the device. So USB flash drives and external hard drives are removable media devices, whereas tapes and disks are not, as they require additional hardware to perform read/write operations." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:HardwareDevice . + +d3f:T1059 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Command and Scripting Interpreter" ; + d3f:attack-id "T1059" ; + d3f:definition "Adversaries may abuse command and script interpreters to execute commands, scripts, or binaries. These interfaces and languages provide ways of interacting with computer systems and are a common feature across many different platforms. Most systems come with some built-in command-line interface and scripting capabilities, for example, macOS and Linux distributions include some flavor of [Unix Shell](https://attack.mitre.org/techniques/T1059/004) while Windows installations include the [Windows Command Shell](https://attack.mitre.org/techniques/T1059/003) and [PowerShell](https://attack.mitre.org/techniques/T1059/001)." ; + d3f:executes d3f:ExecutableScript ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:ExecutableScript ], + d3f:ExecutionTechnique . + +d3f:T1562 a owl:Class ; + rdfs:label "Impair Defenses" ; + d3f:attack-id "T1562" ; + d3f:definition "Adversaries may maliciously modify components of a victim environment in order to hinder or disable defensive mechanisms. This not only involves impairing preventative defenses, such as firewalls and anti-virus, but also detection capabilities that defenders can use to audit activity and identify malicious behavior. This may also span both native defenses as well as supplemental capabilities installed by users and administrators." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:WindowsRegistryKey a owl:Class, + owl:NamedIndividual ; + rdfs:label "Windows Registry Key" ; + d3f:definition "Windows Registry Keys are container objects similar to folders that contain subkeys and/or data entries called values. A key can be a 'Registry Hive' when it is root key of a logical group of keys, subkeys, and values that has a set of supporting files loaded into memory when the operating system is started or a user logs in." ; + d3f:may-contain d3f:WindowsRegistryKey, + d3f:WindowsRegistryValue ; + rdfs:isDefinedBy , + ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:windows-registry-key ; + owl:someValuesFrom xsd:string ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:WindowsRegistryKey ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:WindowsRegistryValue ], + d3f:SystemConfigurationDatabaseRecord . + +d3f:adds a owl:ObjectProperty ; + rdfs:label "adds" ; + d3f:definition "x adds y: The subject x adds a data object y, such as a file, to some other digital artifact, such as a directory. Examples include an agent or technique adding a record to a database. or a domain entry to a DNS server." ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-add . + +d3f:deletes a owl:ObjectProperty ; + rdfs:label "deletes" ; + d3f:definition "x deletes y: A technique or agent x wipes out the digitally or magnetically recorded information of digital object y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:evicts, + d3f:modifies . + +d3f:identifies a owl:ObjectProperty ; + rdfs:label "identifies" ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:restricts a owl:ObjectProperty ; + rdfs:label "restricts" ; + d3f:definition "x restricts y: An entity x bounds the use of entity y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:AuthenticationService a owl:Class, + owl:NamedIndividual ; + rdfs:label "Authentication Service" ; + d3f:definition "An authentication service is a mechanism, analogous to the use of passwords on time-sharing systems, for the secure authentication of the identity of network clients by servers and vice versa, without presuming the operating system integrity of either (e.g., Kerberos)." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ServiceApplicationProcess . + +d3f:CWE-1078 a owl:Class ; + rdfs:label "Inappropriate Source Code Style or Formatting" ; + d3f:cwe-id "CWE-1078" ; + rdfs:subClassOf d3f:CWE-1076 . + +d3f:CWE-119 a owl:Class, + owl:NamedIndividual ; + rdfs:label "Improper Restriction of Operations within the Bounds of a Memory Buffer" ; + d3f:cwe-id "CWE-119" ; + d3f:weakness-of d3f:RawMemoryAccessFunction ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:weakness-of ; + owl:someValuesFrom d3f:RawMemoryAccessFunction ], + d3f:CWE-118 . + +d3f:CWE-23 a owl:Class ; + rdfs:label "Relative Path Traversal" ; + d3f:cwe-id "CWE-23" ; + rdfs:subClassOf d3f:CWE-22 . + +d3f:CWE-405 a owl:Class ; + rdfs:label "Asymmetric Resource Consumption (Amplification)" ; + d3f:cwe-id "CWE-405" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:CWE-703 a owl:Class ; + rdfs:label "Improper Check or Handling of Exceptional Conditions" ; + d3f:cwe-id "CWE-703" ; + rdfs:subClassOf d3f:Weakness . + +d3f:DigitalInformation a owl:Class ; + rdfs:label "Digital Information" ; + rdfs:subClassOf d3f:DigitalArtifact . + +d3f:Directory a owl:Class, + owl:NamedIndividual ; + rdfs:label "Directory" ; + d3f:definition "In computing, a directory is a file system cataloging structure which contains references to other computer files, and possibly other directories. On many computers, directories are known as folders, or drawers to provide some relevancy to a workbench or the traditional office file cabinet." ; + d3f:may-contain d3f:File ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:File ], + d3f:DigitalInformationBearer . + +d3f:FileAnalysis a d3f:FileAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Analysis" ; + d3f:analyzes d3f:File ; + d3f:d3fend-id "D3-FA" ; + d3f:definition "File Analysis is an analytic process to determine a file's status. For example: virus, trojan, benign, malicious, trusted, unauthorized, sensitive, etc." ; + d3f:enables d3f:Detect ; + d3f:kb-article """## Technique Overview +Some techniques use file signatures or file metadata to compare against historical collections of malware. Files may also be compared against a source of ground truth such as cryptographic signatures. Examining files for potential malware using pattern matching against file contents/file behavior. Binary code may be dissembled and analyzed for predictive malware behavior, such as API call signatures. Analysis might occur within a protected environment such as a sandbox or live system.""" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Detect ], + [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:File ], + d3f:DefensiveTechnique . + +d3f:FileHashing a d3f:FileHashing, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Hashing" ; + d3f:d3fend-id "D3-FH" ; + d3f:definition "Employing file hash comparisons to detect known malware." ; + d3f:kb-article """## How it works +This technique requires a list of hashes to compare a file against. + +## Considerations +Performance on large files or very large numbers of files.""" ; + d3f:kb-reference d3f:Reference-Munin ; + rdfs:subClassOf d3f:FileAnalysis . + +d3f:Identifier a owl:Class, + owl:NamedIndividual ; + rdfs:label "Identifier" ; + d3f:definition "An identifier is a name that identifies (that is, labels the identity of) either a unique object or a unique class of objects, where the \"object\" or class may be an idea, physical [countable] object (or class thereof), or physical [noncountable] substance (or class thereof). The abbreviation ID often refers to identity, identification (the process of identifying), or an identifier (that is, an instance of identification). An identifier may be a word, number, letter, symbol, or any combination of those." ; + d3f:identifies d3f:Artifact ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identifies ; + owl:someValuesFrom d3f:Artifact ], + d3f:DigitalInformation ; + skos:altLabel "ID" . + +d3f:InboundInternetNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Inbound Internet Network Traffic" ; + d3f:definition "Inbound internet traffic is network traffic from a host outside a given network initiated on an incoming connection to a host inside that network." ; + d3f:produces d3f:NetworkTraffic ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:produces ; + owl:someValuesFrom d3f:NetworkTraffic ], + d3f:InboundNetworkTraffic, + d3f:InternetNetworkTraffic . + +d3f:MemoryFreeFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Free Function" ; + d3f:definition "Releases previously reserved memory associated with a process." ; + d3f:invokes d3f:FreeMemory ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:invokes ; + owl:someValuesFrom d3f:FreeMemory ], + d3f:Subroutine . + +d3f:NetworkNode a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Node" ; + d3f:definition "In telecommunications networks, a node (Latin nodus, 'knot') is either a redistribution point or a communication endpoint. The definition of a node depends on the network and protocol layer referred to. A physical network node is an electronic device that is attached to a network, and is capable of creating, receiving, or transmitting information over a communications channel. A passive distribution point such as a distribution frame or patch panel is consequently not a node." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:OperatingSystemConfigurationFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System Configuration File" ; + d3f:definition "An operating system configuration file is a file used to configure the operating system." ; + rdfs:seeAlso d3f:ConfigurationFile, + d3f:OperatingSystem, + ; + rdfs:subClassOf d3f:ConfigurationFile, + d3f:OperatingSystemFile ; + skos:altLabel "System Configuration File" . + +d3f:OutboundInternetDNSLookupTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Internet DNS Lookup Traffic" ; + d3f:definition "Outbound internet DNS lookup traffic is network traffic using the DNS protocol on an outgoing connection initiated from a host within a network to a host outside the network." ; + d3f:may-contain d3f:DNSLookup ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:DNSLookup ], + d3f:DNSNetworkTraffic, + d3f:OutboundInternetNetworkTraffic, + d3f:OutboundNetworkTraffic . + +d3f:OutboundInternetEncryptedTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Internet Encrypted Traffic" ; + d3f:definition "Outbound internet encrypted traffic is encrypted network traffic on an outgoing connection initiated from a host within a network to a host outside the network." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:OutboundInternetNetworkTraffic . + +d3f:PlatformMonitoring a d3f:PlatformMonitoring, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Platform Monitoring" ; + d3f:d3fend-id "D3-PM" ; + d3f:definition "Monitoring platform components such as operating systems software, hardware devices, or firmware." ; + d3f:enables d3f:Detect ; + d3f:kb-article """Platform monitoring consists of the analysis and monitoring of system level devices and low-level components, including hardware devices, to detect unauthorized modifications or suspicious activity. + +Monitored platform components includes system files and embedded devices such as: + + * Kernel software modules + * Boot process code and load logic + * Operating system components and device files + * System libraries and dynamically loaded files + * Hardware device drivers + * Embedded firmware devices""" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Detect ], + d3f:DefensiveTechnique . + +d3f:PropertyListFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Property List File" ; + d3f:definition "In the OS X, iOS, NeXTSTEP, and GNUstep programming frameworks, property list files are files that store serialized objects. Property list files use the filename extension .plist, and thus are often referred to as p-list files. Property list files are often used to store a user's settings. They are also used to store information about bundles and applications, a task served by the resource fork in the old Mac OS." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ConfigurationFile ; + skos:altLabel "Plist File" . + +d3f:Reference-CybersecurityIncidentandVulnerabilityResponsePlaybooks a d3f:GuidelineReference, + owl:NamedIndividual ; + rdfs:label "Reference - Cybersecurity Incident and Vulnerability Response Playbooks" ; + d3f:has-link "https://www.cisa.gov/sites/default/files/publications/Federal_Government_Cybersecurity_Incident_and_Vulnerability_Response_Playbooks_508C.pdf"^^xsd:anyURI ; + d3f:kb-abstract "" ; + d3f:kb-author "Cybersecurity and Infrastructure Security Agency" ; + d3f:kb-mitre-analysis "" ; + d3f:kb-organization "Cybersecurity and Infrastructure Security Agency" ; + d3f:kb-reference-of d3f:RegistryKeyDeletion ; + d3f:kb-reference-title "Cybersecurity Incident & Vulnerability Response Playbooks" . + +d3f:T1055 a owl:Class ; + rdfs:label "Process Injection" ; + d3f:attack-id "T1055" ; + d3f:definition "Adversaries may inject code into processes in order to evade process-based defenses as well as possibly elevate privileges. Process injection is a method of executing arbitrary code in the address space of a separate live process. Running code in the context of another process may allow access to the process's memory, system/network resources, and possibly elevated privileges. Execution via process injection may also evade detection from security products since the execution is masked under a legitimate process." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:T1564 a owl:Class ; + rdfs:label "Hide Artifacts" ; + d3f:attack-id "T1564" ; + d3f:definition "Adversaries may attempt to hide artifacts associated with their behaviors to evade detection. Operating systems may have features to hide various artifacts, such as important system files and administrative task execution, to avoid disrupting user work environments and prevent users from changing files or features on the system. Adversaries may abuse these features to hide artifacts such as files, directories, user accounts, or other system activity to evade detection.(Citation: Sofacy Komplex Trojan)(Citation: Cybereason OSX Pirrit)(Citation: MalwareBytes ADS July 2015)" ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:TPMBootIntegrity a d3f:TPMBootIntegrity, + owl:Class, + owl:NamedIndividual ; + rdfs:label "TPM Boot Integrity" ; + d3f:d3fend-id "D3-TBI" ; + d3f:definition "Assuring the integrity of a platform by demonstrating that the boot process starts from a trusted combination of hardware and software and continues until the operating system has fully booted and applications are running. Sometimes called Static Root of Trust Measurement (STRM)." ; + d3f:kb-article """## How it works +During the boot process, the BIOS boot block (which with this defense enabled, is the Core Root of Trust for Measurement) measures boot components (firmware, ROM). The TPM hashes those measurements and stores the hashes in Platform Configuration Registers (PCRs). Upon a subsequent boot, these hashes are provided to a verifier which compares the stored measurements to the new boot measurements. Integrity of the boot components is assured if they match. + +Attestation of the secure boot occurs when a verifying entity requests a Quote which is a concatenation of the requested PCR values, hashed and signed by the TPM's unique RSA key. The TPM signature is trusted because the private key is stored securely in hardware and never leaves the TPM. + +## Considerations + +* The TPM does not perform the follow-on actions of acting on the PCR value information, it just provides the PCR stored information. +* The current version of TPM is 2.0.; most existing implementations use TPM 1.2. + +## Citations +[1] [TPM 2.0 Library](https://trustedcomputinggroup.org/resource/tpm-library-specification/) +[2] [TCG Trusted Attestation Protocol (TAP) Use Cases for TPM Families 1.2 and 2.0 and DICE](https://trustedcomputinggroup.org/wp-content/uploads/TCG_TNC_TAP_Use_Cases_v1r0p35_published.pdf)""" ; + d3f:kb-reference d3f:Reference-TCGTrustedAttestationProtocolUseCasesForTPMFamilies1.2And2.0AndDICE, + , + d3f:Reference-TrustedAttestationProtocolUseCases ; + d3f:synonym "STRM", + "Static Root of Trust Measurement" ; + rdfs:subClassOf d3f:PlatformHardening . + +d3f:UserAccountEvent a owl:Class ; + rdfs:label "User Account Event" ; + d3f:definition "An event capturing operations or state changes performed on user accounts, including lifecycle management, access control modifications, and policy assignments." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:UserAccount ], + d3f:DigitalEvent . + +d3f:Weakness a owl:Class ; + rdfs:label "Weakness" ; + d3f:definition "A weakness is a condition in a software, firmware, hardware, or service component that, under certain circumstances, could contribute to the introduction of vulnerabilities." ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:authenticates a owl:ObjectProperty ; + rdfs:label "authenticates" ; + d3f:definition "x authenticates y: The subject x establishes the authenticity of some y. This relation indicates an authentication event has occurred." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:hardens . + +d3f:d3fend-catalog-data-property a owl:DatatypeProperty ; + rdfs:label "d3fend-catalog-data-property" ; + rdfs:subPropertyOf d3f:d3fend-data-property, + d3f:d3fend-external-control-data-property ; + skos:altLabel "d3fend-vendor-registry-data-property"@en . + +d3f:filters a owl:ObjectProperty ; + rdfs:label "filters" ; + d3f:definition "x filters y: An technique or agent x removes some specified set of of entities from the content of a digital artifact y, by passing an artifact's content through a filter. A filter is a device that removes something from whatever passes through it." ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + ; + rdfs:subPropertyOf d3f:associated-with, + d3f:isolates . + +d3f:reads a owl:ObjectProperty ; + rdfs:label "reads" ; + d3f:definition "x reads y: The subject x takes the action of reading from a digital source y to acquire data and placing it into volatile memory for processing." ; + rdfs:seeAlso , + ; + rdfs:subPropertyOf d3f:accesses . + +d3f:uses a owl:ObjectProperty ; + rdfs:label "uses" ; + d3f:definition "x uses y: An entity x puts into service a resource or implement y; makes y work or employ for a particular purpose or for its inherent or natural purpose." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:Agent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Agent" ; + d3f:definition "An entity capable of performing intentional actions." ; + rdfs:subClassOf d3f:D3FENDCore . + +d3f:Application a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application" ; + d3f:definition "A program that gives a computer instructions that provide the user with tools to accomplish a task; \"he has tried several different word processing applications\". Distinct from system software that is intrinsically part of the operating system. An application can be made up of executable files, configuration files, shared libraries, etc." ; + d3f:may-contain d3f:ApplicationConfiguration ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:ApplicationConfiguration ], + d3f:Software . + +d3f:BiometricAuthentication a d3f:BiometricAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Biometric Authentication" ; + d3f:authenticates d3f:Person ; + d3f:d3fend-id "D3-BAN" ; + d3f:definition "Using biological measures in order to authenticate a user." ; + d3f:kb-reference d3f:Reference-TokenlessBiometricTransactionAuthorizationMethodAndSystem, + d3f:Reference-www.biometric-solutions.com_keystroke-dynamics ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:Person ], + d3f:AgentAuthentication . + +d3f:CWE-1120 a owl:Class ; + rdfs:label "Excessive Code Complexity" ; + d3f:cwe-id "CWE-1120" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:CWE-691 a owl:Class ; + rdfs:label "Insufficient Control Flow Management" ; + d3f:cwe-id "CWE-691" ; + rdfs:subClassOf d3f:Weakness . + +d3f:CertificateFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Certificate File" ; + d3f:contains d3f:Certificate ; + d3f:definition "A file containing a digital certificate. In cryptography, a public key certificate (also known as a digital certificate or identity certificate) is an electronic document used to prove the ownership of a public key. The certificate includes information about the key, information about its owner's identity, and the digital signature of an entity that has verified the certificate's contents are correct. If the signature is valid, and the person examining the certificate trusts the signer, then they know they can use that key to communicate with its owner." ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Certificate ], + d3f:File . + +d3f:FileEvent a owl:Class ; + rdfs:label "File Event" ; + d3f:definition "An event involving operations performed on digital files, encompassing actions such as creation, modification, deletion, access, and attribute or permission changes." ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:has-participant ; + owl:someValuesFrom d3f:File ], + d3f:DigitalEvent . + +d3f:FirmwareVerification a d3f:FirmwareVerification, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Firmware Verification" ; + d3f:d3fend-id "D3-FV" ; + d3f:definition "Cryptographically verifying firmware integrity." ; + d3f:kb-article """## How it works +Cryptographic hash values are computed for system and peripheral firmware. The hash values are compared against precomputed hash values for the identified firmware. A hash value mismatch may indicate that the firmware may have been tampered with or updated with a non-current release indicating a misconfiguration for the system. + +## Considerations +* Requires cryptographically computed hash values of firmware +* Requires storage of precomputed firmware hash values""" ; + d3f:kb-reference d3f:Reference-FirmwareVerificationEclypsium, + d3f:Reference-FirmwareVerificationTrapezoid, + d3f:Reference-PlatformFirmwareResiliencyGuidelines_NIST ; + d3f:verifies d3f:Firmware ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:verifies ; + owl:someValuesFrom d3f:Firmware ], + d3f:PlatformMonitoring . + +d3f:Harden a d3f:DefensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Harden" ; + d3f:definition "The harden tactic is used to increase the opportunity cost of computer network exploitation. Hardening differs from Detection in that it generally is conducted before a system is online and operational." ; + d3f:display-order 0 ; + d3f:display-priority 0 ; + rdfs:subClassOf d3f:DefensiveTactic . + +d3f:Hardware-basedProcessIsolation a d3f:Hardware-basedProcessIsolation, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Hardware-based Process Isolation" ; + d3f:d3fend-id "D3-HBPI" ; + d3f:definition "Preventing one process from writing to the memory space of another process through hardware based address manager implementations." ; + d3f:isolates d3f:Process ; + d3f:kb-article """## How it works +Process isolation, in this context, is address space separation controlled by a security function that limits the communication between processes so that one process cannot directly modify the executing code of another process. For example with virtual address space: + +* Process A address space is different from process B address space, which prevents process A from writing to process B + +Hardware process isolation is commonly implemented through Direct Memory Access (DMA) which collaborates with a Memory Management Unit (MMU), or Input-Output Memory Management Unit (IOMMU). These hardware controls are deployed directly on processors to aid hosts or enclaves in process isolation. + +* DMA - Direct memory access allows memory access to occur independently of the program currently run by the microprocessor. DMA allows for I/O devices to directly read from and write to memory, or it can be used to efficiently copy blocks of memory. During DMA transfers, the microprocessor can execute an unrelated program. +* MMU - A memory management unit acts as an access control and is responsible for performing the translation of virtual memory addresses to physical memory addresses. The MMU allocates each process its own virtual memory space. +* IOMMU - An input-output memory management unit is used to allocate each I/O device its own virtual address space to the underlying physical addresses. IOMMU allows devices that do not support long memory addresses to address the entire memory space. + +## Considerations +* Private hosts may be vulnerable to DMA attack if they have a PCI or PCI Express port that connects attached devices directly to physical address space. + +## Implementations: + * Intel Virtualization Technology for Directed I/O (Intel VT-d) + * Firecracker""" ; + d3f:kb-reference , + , + d3f:Reference-VirtualizedProcessIsolation_AdvancedMicroDevicesInc ; + d3f:restricts d3f:CreateProcess ; + d3f:synonym "Virtualization" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:Process ], + [ a owl:Restriction ; + owl:onProperty d3f:restricts ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:ExecutionIsolation . + +d3f:InitialAccessTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Initial Access Technique" ; + d3f:enables d3f:TA0001 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0001 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:ScheduledJob a owl:Class, + owl:NamedIndividual ; + rdfs:label "Scheduled Job" ; + d3f:contained-by d3f:JobSchedule ; + d3f:created-by d3f:JobSchedulerSoftware ; + d3f:definition "A task scheduler process is an operating system process that executes scheduled tasks (time-scheduling in the sense of wall clock time; not operating system scheduling of processes for multitasking)." ; + d3f:modified-by d3f:JobSchedulerSoftware ; + d3f:synonym "Scheduled Task", + "Task Scheduler Process" ; + rdfs:seeAlso , + , + , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:created-by ; + owl:someValuesFrom d3f:JobSchedulerSoftware ], + [ a owl:Restriction ; + owl:onProperty d3f:contained-by ; + owl:someValuesFrom d3f:JobSchedule ], + [ a owl:Restriction ; + owl:onProperty d3f:modified-by ; + owl:someValuesFrom d3f:JobSchedulerSoftware ], + d3f:OperatingSystemProcess . + +d3f:T1574 a owl:Class ; + rdfs:label "Hijack Execution Flow" ; + d3f:attack-id "T1574" ; + d3f:definition "Adversaries may execute their own malicious payloads by hijacking the way operating systems run programs. Hijacking execution flow can be for the purposes of persistence, since this hijacked execution may reoccur over time. Adversaries may also use these mechanisms to elevate privileges or evade defenses, such as application control or other restrictions on execution." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:ATTACKEnterpriseTactic a owl:Class ; + rdfs:label "ATTACK Enterprise Tactic" ; + rdfs:subClassOf d3f:ATTACKEnterpriseThing . + +d3f:ATTACKEnterpriseTechnique a owl:Class ; + rdfs:label "ATTACK Enterprise Technique" ; + rdfs:subClassOf d3f:ATTACKEnterpriseThing . + +d3f:Authorization a owl:Class, + owl:NamedIndividual ; + rdfs:label "Authorization" ; + d3f:definition "Authorization is the function of specifying access rights to resources related to information security and computer security in general and to access control in particular. More formally, \"to authorize\" is to define an access policy. For example, human resources staff is normally authorized to access employee records and this policy is usually formalized as access control rules in a computer system. During operation, the system uses the access control rules to decide whether access requests from (authenticated) consumers shall be approved (granted) or disapproved (rejected). Resources include individual files or an item's data, computer programs, computer devices and functionality provided by computer applications. Examples of consumers are computer users, computer program" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authorizes ; + owl:someValuesFrom d3f:Access ], + d3f:DefensiveAction . + +d3f:Certificate-basedAuthentication a d3f:Certificate-basedAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Certificate-based Authentication" ; + d3f:d3fend-id "D3-CBAN" ; + d3f:definition "Requiring a digital certificate in order to authenticate a user." ; + d3f:kb-article """## How it works + +Certificate-based authentication is a security mechanism that uses digital certificates to verify the identity of a user, device, or server before granting access to a network or system. This method relies on a pair of cryptographic keys: a public key and a private key. + +## Considerations + +* Private Key Protection: Ensure that private keys are securely stored and protected against unauthorized access. +* Certificate Revocation: Implement a robust process for revoking certificates if they are compromised or no longer needed. +* Man-in-the Middle Attacks: Use mutual authentication to mitigate the risk of these attacks.""" ; + d3f:kb-reference d3f:Reference-FederalPublicKeyInfrastructure101 ; + d3f:reads d3f:Certificate ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:reads ; + owl:someValuesFrom d3f:Certificate ], + d3f:AgentAuthentication . + +d3f:ConfigurationResource a owl:Class, + owl:NamedIndividual ; + rdfs:label "Configuration Resource" ; + d3f:definition "A resource used to configure a system including software and hardware." ; + rdfs:subClassOf d3f:Resource . + +d3f:DiskEncryption a d3f:DiskEncryption, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Disk Encryption" ; + d3f:d3fend-id "D3-DENCR" ; + d3f:definition "Encrypting a hard disk partition to prevent cleartext access to a file system." ; + d3f:encrypts d3f:Storage ; + d3f:kb-reference d3f:Reference-LUKS1On-DiskFormatSpecificationVersion1.2.3 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:encrypts ; + owl:someValuesFrom d3f:Storage ], + d3f:PlatformHardening . + +d3f:Network a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network" ; + d3f:definition "A network is a group of computers that use a set of common communication protocols over digital interconnections for the purpose of sharing resources located on or provided by the network nodes. The interconnections between nodes are formed from a broad spectrum of telecommunication network technologies, based on physically wired, optical, and wireless radio-frequency methods that may be arranged in a variety of network topologies." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer ; + skos:altLabel "Computer Network" . + +d3f:OperatingSystemFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System File" ; + d3f:definition "An operating system file is a file that is part of, or used to store information about, the operating system itself." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:File . + +d3f:OperatingSystemMonitoring a d3f:OperatingSystemMonitoring, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Operating System Monitoring" ; + d3f:d3fend-id "D3-OSM" ; + d3f:definition "The operating system software, for D3FEND's purposes, includes the kernel and its process management functions, hardware drivers, initialization or boot logic. It also includes and other key system daemons and their configuration. The monitoring or analysis of these components for unauthorized activity constitute **Operating System Monitoring**." ; + d3f:enables d3f:Detect ; + d3f:kb-article """## Technique Overview + +"An operating system (OS) is system software that manages computer hardware and software resources and provides common services for computer programs." [1] + +Operating System Monitoring Techniques have varied implementations including built-in kernel modules, third-party privileged system daemons, or even standard systems administration tools included with an operating system. + +1. http://dbpedia.org/resource/Operating_system""" ; + d3f:kb-reference d3f:Reference-HostIntrusionPreventionSystemUsingSoftwareAndUserBehaviorAnalysis_SophosLtd, + d3f:Reference-UserActivityFromClearingEventLogs_MITRE ; + rdfs:subClassOf d3f:PlatformMonitoring . + +d3f:SystemCallFiltering a d3f:SystemCallFiltering, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System Call Filtering" ; + d3f:d3fend-id "D3-SCF" ; + d3f:definition "Controlling access to local computer system resources with kernel-level capabilities." ; + d3f:filters d3f:SystemCall ; + d3f:isolates d3f:Process ; + d3f:kb-article """## How it works +System call filtering uses a mandatory access control paradigm (that is, a non-discretionary access control) system because the rules and polices that determine access is determined by a security control authority and not distributed to local users. Access determinations are based on designed access control polices and are not based on local resource owner determinations. + +Access is typically granted by defining sets of subjects and sets of objects. Subjects are the entities requesting access and objects are the resources that subjects are trying to access. Rules and policies are defined that associate subjects and object permissions and access controls. + +### Common implementations +#### Security label access control +A fine-grained form control is to apply security labels to individual resources, including processes, and the access control decisions are against a particular resource and a given user attempting to gain access. This type of control requires that the file system has built-in support for security labels. + +Access controls are typically implemented through the use of label identifiers for every file system object. Identifier labels are applied to resources and users are assigned a similar access identifier. Users attempting to access a resource will result in the operating system performing an access control check. The access control check will compare the assigned user's credentials to that of the resource or object they are attempting to access. + +A security context is associated with resources and is used to determine assess. Typical basic access control elements include users, roles and types and together they form a security context which is the basis for the security labels. + +This type of access control is what is employed in SELinux [2]. This form of security kernel access control is considered the most flexible implementation, but it also is the most complex to deploy across the enterprise. Where multiple virtual machines (VM) are run together this type of access control is typically employed to ensure true isolation of processes and VMs. + +#### File path level controls +A less fine-grained form of mandatory access control is to apply security labels that allow for access control at the file path level. Access control is filesystem agnostic and no relabeling of resources is required. Pathname access control usually seems more natural for implementation and corresponding access audits. + +This type of system call filtering is what is employed in AppArmor [3]. AppArmor was developed to provide a simpler alternative method with much less management overhead. A simple access policy is maintained that defines path resource access rules. Access control attributes are typically associated with programs instead of users. + + +## Considerations +Some implementations of security label-based control contain complex rules set that are hard to verify and complex to maintain over time. + +Initial planning of access model and continuous monitoring of the available users, resources and object is necessary. + +## Implementations + + * Linux C-Groups, and policy engines like SELinux and AppArmor + * Windows Mandatory Integrity Control introduced in Windows Vista + + +### Citations +1. [SELinux](https://selinuxproject.org/) +2. [AppArmor](https://www.apparmor.net/)""" ; + d3f:kb-reference d3f:Reference-AnalysisOfTheWindowsVistaSecurityModel_SymantecCorporation, + d3f:Reference-ArchitectureOfTransparentNetworkSecurityForApplicationContainers_NeuvectorInc, + d3f:Reference-OverviewOfTheSeccompSandbox ; + d3f:synonym "System Call Control" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:SystemCall ], + [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:Process ], + d3f:AccessMediation ; + skos:altLabel "Mandatory Access Control", + "System Call Mediation" . + +d3f:T1027 a owl:Class ; + rdfs:label "Obfuscated Files or Information" ; + d3f:attack-id "T1027" ; + d3f:definition "Adversaries may attempt to make an executable or file difficult to discover or analyze by encrypting, encoding, or otherwise obfuscating its contents on the system or in transit. This is common behavior that can be used across different platforms and the network to evade defenses." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique . + +d3f:T1218 a owl:Class ; + rdfs:label "System Binary Proxy Execution" ; + d3f:attack-id "T1218" ; + d3f:definition "Adversaries may bypass process and/or signature-based defenses by proxying execution of malicious content with signed, or otherwise trusted, binaries. Binaries used in this technique are often Microsoft-signed files, indicating that they have been either downloaded from Microsoft or are already native in the operating system.(Citation: LOLBAS Project) Binaries signed with trusted digital certificates can typically execute on Windows systems protected by digital signature validation. Several Microsoft signed binaries that are default on Windows installations can be used to proxy execution of other files or commands." ; + rdfs:subClassOf d3f:DefenseEvasionTechnique, + d3f:ExecutionTechnique . + +d3f:Thread a owl:Class, + owl:NamedIndividual ; + rdfs:label "Thread" ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:isolates a owl:ObjectProperty ; + rdfs:label "isolates" ; + d3f:definition "x isolates y: The technique or agent x sets digital artifact y apart from other digital artifacts, sequestering y." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:d3fend-tactical-verb-property . + +d3f:CWE-345 a owl:Class ; + rdfs:label "Insufficient Verification of Data Authenticity" ; + d3f:cwe-id "CWE-345" ; + rdfs:subClassOf d3f:CWE-693 . + +d3f:CWE-41 a owl:Class ; + rdfs:label "Improper Resolution of Path Equivalence" ; + d3f:cwe-id "CWE-41" ; + rdfs:subClassOf d3f:CWE-706 . + +d3f:DefensiveTactic a owl:Class ; + rdfs:label "Defensive Tactic" ; + d3f:definition "a plan for attaining a particular goal" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enabled-by ; + owl:someValuesFrom d3f:DefensiveTechnique ], + d3f:Goal . + +d3f:DomainAccountMonitoring a d3f:DomainAccountMonitoring, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Account Monitoring" ; + d3f:d3fend-id "D3-DAM" ; + d3f:definition "Monitoring the existence of or changes to Domain User Accounts." ; + d3f:kb-reference d3f:Reference-AuditUserAccountManagement ; + d3f:monitors d3f:DomainUserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:monitors ; + owl:someValuesFrom d3f:DomainUserAccount ], + d3f:UserBehaviorAnalysis . + +d3f:FileContentRules a d3f:FileContentRules, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Content Rules" ; + d3f:d3fend-id "D3-FCR" ; + d3f:definition "Employing a pattern matching rule language to analyze the content of files." ; + d3f:kb-article """## How it works +Rules, often called signatures, are used for both generic and targeted malware detection. The rules are usually expressed in a domain specific language (DSL), then deployed to software that scans files for matches. The rules are developed and broadly distributed by commercial vendors, or they are developed and deployed by enterprise security teams to address highly targeted or custom malware. Conceptually, there are public and private rule sets. Both leverage the same technology, but they are intended to detect different types of cyber adversaries. + +## Considerations +* Patterns expressed in the DSLs range in their complexity. Some scanning engines support file parsing and normalization for high fidelity matching, others support only simple regular expression matching against raw file data. Engineers must make a trade-off in terms of: + * The fidelity of the matching capabilities in order to balance high recall with avoiding false positives, + * The computational load for scanning, and + * The resilience of the engine to deal with adversarial content presented in different forms-- content which in some cases is designed to exploit or defeat the scanning engines. + * Signature libraries can become large over time and impact scanning performance. + * Some vendors who sell signatures have to delete old signatures over time. + * Simple signatures against raw content cannot match against encoded, encrypted, or sufficiently obfuscated content. + +## Implementations + * YARA + * ClamAV""" ; + d3f:kb-reference d3f:Reference-ComputationalModelingAndClassificationOfDataStreams_CrowdstrikeInc, + d3f:Reference-DetectingScript-basedMalware_CrowdstrikeInc, + d3f:Reference-DistributedMeta-informationQueryInANetwork_Bit9Inc, + d3f:Reference-SystemAndMethodsThereofForLogicalIdentificationOfMaliciousThreatsAcrossAPluralityOfEnd-pointDevicesCommunicativelyConnectedByANetwork_PaloAltoNetworksIncCyberSecdoLtd ; + d3f:synonym "File Content Signatures", + "File Signatures" ; + rdfs:subClassOf d3f:FileContentAnalysis . + +d3f:InternetNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Internet Network Traffic" ; + d3f:definition "Internet network traffic is network traffic that crosses a boundary between networks. [This is the general sense of inter-networking; It may or may not cross to or from the Internet]" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:NetworkResource a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Resource" ; + d3f:definition "In computing, a shared resource, or network share, is a computer resource made available from one host to other hosts on a computer network. It is a device or piece of information on a computer that can be remotely accessed from another computer, typically via a local area network or an enterprise intranet, transparently as if it were a resource in the local machine.Network sharing is made possible by inter-process communication over the network." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:RemoteResource ; + skos:altLabel "Shared Resource" . + +d3f:Password a owl:Class, + owl:NamedIndividual ; + rdfs:label "Password" ; + d3f:definition "A password, sometimes called a passcode, is a memorized secret, typically a string of characters, usually used to confirm the identity of a user. Using the terminology of the NIST Digital Identity Guidelines, the secret is memorized by a party called the claimant while the party verifying the identity of the claimant is called the verifier. When the claimant successfully demonstrates knowledge of the password to the verifier through an established authentication protocol, the verifier is able to infer the claimant's identity." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Credential ; + skos:altLabel "Passcode" . + +d3f:Server a owl:Class, + owl:NamedIndividual ; + rdfs:label "Server" ; + d3f:definition "In computing, a server is a piece of computer hardware or software (computer program) that provides functionality for other programs or devices, called \"clients\". This architecture is called the client-server model. Servers can provide various functionalities, often called \"services\", such as sharing data or resources among multiple clients, or performing computation for a client. A single server can serve multiple clients, and a single client can use multiple servers. A client process may run on the same device or may connect over a network to a server on a different device. Typical servers are database servers, file servers, mail servers, print servers, web servers, game servers, and application servers." ; + d3f:manages d3f:ServiceApplicationProcess ; + d3f:runs d3f:ServiceApplication ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:runs ; + owl:someValuesFrom d3f:ServiceApplication ], + [ a owl:Restriction ; + owl:onProperty d3f:manages ; + owl:someValuesFrom d3f:ServiceApplicationProcess ], + d3f:Host . + +d3f:ServiceApplication a owl:Class, + owl:NamedIndividual ; + rdfs:label "Service Application" ; + d3f:definition "An application that provides a set of software functionalities so that multiple clients who can reuse the functionality, provided they are authorized for use of the service." ; + rdfs:seeAlso , + ; + rdfs:subClassOf d3f:Application . + +d3f:T1547 a owl:Class ; + rdfs:label "Boot or Logon Autostart Execution" ; + d3f:attack-id "T1547" ; + d3f:definition "Adversaries may configure system settings to automatically execute a program during system boot or logon to maintain persistence or gain higher-level privileges on compromised systems. Operating systems may have mechanisms for automatically running a program on system boot or account logon.(Citation: Microsoft Run Key)(Citation: MSDN Authentication Packages)(Citation: Microsoft TimeProvider)(Citation: Cylance Reg Persistence Sept 2013)(Citation: Linux Kernel Programming) These mechanisms may include automatically executing programs that are placed in specially designated directories or are referenced by repositories that store configuration information, such as the Windows Registry. An adversary may achieve the same goal by modifying or extending features of the kernel." ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:AccessControlConfiguration a owl:Class, + owl:NamedIndividual ; + rdfs:label "Access Control Configuration" ; + d3f:definition "Information about what access permissions are granted to particular users for particular objects" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ConfigurationResource . + +d3f:Detect a d3f:DefensiveTactic, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Detect" ; + d3f:definition "The detect tactic is used to identify adversary access to or unauthorized activity on computer networks." ; + d3f:display-order 1 ; + d3f:display-priority 0 ; + rdfs:subClassOf d3f:DefensiveTactic . + +d3f:ExecutableAllowlisting a d3f:ExecutableAllowlisting, + d3f:PlatformHardening, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Executable Allowlisting" ; + d3f:blocks d3f:ExecutableFile ; + d3f:d3fend-id "D3-EAL" ; + d3f:definition "Using a digital signature to authenticate a file before opening." ; + d3f:filters d3f:CreateProcess ; + d3f:kb-article """## How it works + +This technique is generic and there are numerous ways to compute and authenticate digital signatures. +A digital certificate is generated from a private/public key pair issued by a certificate authority (CA). A hash of the file is encrypted using the private key. When the file is downloaded by another user, the user's system uses the public key to decrypt the hash and a new hash is created of the downloaded file. The hash decrypted by the public key is compared to the new hash and if there is a mismatch, further techniques, such as file deletion, file quarantine, or **Executable Blacklisting** may be invoked. + +This technique may be invoked when deciding whether to execute a file. + +## Considerations + +Organizations which download or create high volumes of software make management complex, in particular engineering or scientific organizations.""" ; + d3f:kb-reference , + d3f:Reference-EnhancingNetworkSecurityByPreventingUser-InitiatedMalwareExecution_ ; + d3f:synonym "File Signature Authentication" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:blocks ; + owl:someValuesFrom d3f:ExecutableFile ], + [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:CreateProcess ], + d3f:ExecutionIsolation . + +d3f:FileEncryption a d3f:FileEncryption, + owl:Class, + owl:NamedIndividual ; + rdfs:label "File Encryption" ; + d3f:d3fend-id "D3-FE" ; + d3f:definition "Encrypting a file using a cryptographic key." ; + d3f:encrypts d3f:File ; + d3f:kb-article """## How it Works +Files are encrypted using either a single key for both encryption and decryption or separate keys. Single key encryption is symmetric encryption and using two key distinct keys is asymmetric encryption. + +### Symmetric Cryptography +Symmetric encryption uses the same cryptographic key for both the encryption and decryption a file. Managing keys at scale sometimes uses asymmetric key exchange protocols such as Diffie-Hellman can be used to share the symmetric cryptographic key with the others. + +### Asymmetric Cryptography +Asymmetric encryption is typically accomplished using public and private key certificates based on the X.509 standard. Files are encrypted using the public key and decrypted using their private key. Asymmetric encryption is typically slower than symmetric encryption and not widely used for large file encryption, but is popular for key wrapping, key exchanges, and digital signatures. + +## Considerations +- Continuous monitoring to ensure private keys are not compromised and the certificate authority (CA) is trusted. +- Secure transfer of private keys between multiple devices.""" ; + d3f:kb-reference d3f:Reference-MethodForFileEncryption ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:encrypts ; + owl:someValuesFrom d3f:File ], + d3f:PlatformHardening . + +d3f:ProcessAnalysis a d3f:ProcessAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Analysis" ; + d3f:d3fend-id "D3-PA" ; + d3f:definition "Process Analysis consists of observing a running application process and analyzing it to watch for certain behaviors or conditions which may indicate adversary activity. Analysis can occur inside of the process or through a third-party monitoring application. Examples include monitoring system and privileged calls, monitoring process initiation chains, and memory boundary allocations." ; + d3f:enables d3f:Detect ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Detect ], + d3f:DefensiveTechnique . + +d3f:UserBehaviorAnalysis a d3f:UserBehaviorAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "User Behavior Analysis" ; + d3f:d3fend-id "D3-UBA" ; + d3f:definition "User behavior analytics (\"UBA\") as defined by Gartner, is a cybersecurity process about detection of insider threats, targeted attacks, and financial fraud. UBA solutions look at patterns of human behavior, and then apply algorithms and statistical analysis to detect meaningful anomalies from those patterns-anomalies that indicate potential threats.' Instead of tracking devices or security events, UBA tracks a system's users. Big data platforms are increasing UBA functionality by allowing them to analyze petabytes worth of data to detect insider threats and advanced persistent threats." ; + d3f:enables d3f:Detect ; + d3f:kb-article """## Technique Overview + +Some techniques monitor patterns of human behavior and then apply algorithms and to identify patterns such as repeated login attempts from a single IP address or large file downloads, or abnormal accesses. + +Other techniques may have explicit or rigid definitions of "bad behavior" which are then matched against instances in a computer network environment.""" ; + d3f:synonym "Credential Monitoring", + "UBA" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Detect ], + d3f:DefensiveTechnique . + +d3f:monitors a owl:ObjectProperty ; + rdfs:label "monitors" ; + d3f:definition "x monitors y: The technique or agent x keep tabs on; keeps an eye on; or keep the digital artifact y under surveillance." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:detects . + +d3f:CollectionTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Collection Technique" ; + d3f:enables d3f:TA0009 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0009 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:DigitalEvent a owl:Class, + owl:NamedIndividual ; + rdfs:label "Digital Event" ; + d3f:definition "A digital event represents an observable occurrence, action, or state change within digital systems, networks, or their interactions. These events are characterized by their impact on the confidentiality, integrity, availability, or functionality of digital resources, processes, identities, or communications. Digital events are essential units of information in cybersecurity, serving as the basis for detecting threats, analyzing anomalies, and orchestrating responses in complex, interconnected environments." ; + rdfs:subClassOf d3f:Event . + +d3f:DriverLoadIntegrityChecking a d3f:DriverLoadIntegrityChecking, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Driver Load Integrity Checking" ; + d3f:authenticates d3f:HardwareDriver ; + d3f:d3fend-id "D3-DLIC" ; + d3f:definition "Ensuring the integrity of drivers loaded during initialization of the operating system." ; + d3f:kb-article """## How it works +This technique can be accomplished in a number of ways: + +* A kernel level security agent installed on a host machine ensures that the driver associated with the agent is first in the initialization order. A dependent DLL associated with the driver is configured to be processed before other dependent DLLs and executes a number of operations to ensure the driver associated with the security agent is initialized first. + +* Kernel components can be signed by a certificate obtained by a third party to verify the source of the component and whether it has been modified. When signed, the component will include a signature block implemented as a hash value of the component header and can also include a certificate chain. The signature and certificate data are typically added before the kernel component is distributed to the public. + + +## Considerations + +* The private keys to sign certificates as reputable companies have been stolen in the past -- in cases such as where certificates from Adobe, Realtek, and JMicron have been used to sign malicious executables. (Source: https://resources.infosecinstitute.com/cybercrime-exploits-digital-certificates/#gref) + +* Trusted Root Certificate Authorities have been compromised, yielding the ability to use the compromised keys to generate certificates with an arbitrary company name. + +* It may not be difficult for an attacker to start an organization which can obtain a signed certificate. + +* A root certificate authority (CA) whose certificate is trusted in the verification logic could generate incorrect certificates, if they are lax or have ulterior motives.""" ; + d3f:kb-reference d3f:Reference-IntegrityAssuranceThroughEarlyLoadingInTheBootPhase_CrowdstrikeInc, + d3f:Reference-ProtectedComputingEnvironment_MicrosoftTechnologyLicensingLLC ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:HardwareDriver ], + d3f:PlatformHardening . + +d3f:OffensiveTechnique a owl:Class ; + rdfs:label "Offensive Technique" ; + d3f:display-baseurl "/offensive-technique/attack/" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:initiates ; + owl:someValuesFrom d3f:Access ], + [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:OffensiveTactic ], + d3f:CyberTechnique . + +d3f:StrongPasswordPolicy a d3f:StrongPasswordPolicy, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Strong Password Policy" ; + d3f:d3fend-id "D3-SPP" ; + d3f:definition "Modifying system configuration to increase password strength." ; + d3f:kb-article """## How it works +Password strength guidelines include increasing password length, permitting passwords that contain ASCII or Unicode characters, and requiring systems to screen new passwords against lists of commonly used or compromised passwords. +## Considerations +Extremely complex password requirements may lead users to saving passwords in text files or picking obvious passwords that meet the policy.""" ; + d3f:kb-reference d3f:Reference-DigitalIdentityGuidelines800-63-3, + d3f:Reference-Testing_Metrics_for_Password_Creation_Policies_by_Attacking_Large_Sets_of_Revealed_Passwords ; + d3f:strengthens d3f:Password ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:strengthens ; + owl:someValuesFrom d3f:Password ], + d3f:CredentialHardening . + +d3f:T1546 a owl:Class ; + rdfs:label "Event Triggered Execution" ; + d3f:attack-id "T1546" ; + d3f:definition "Adversaries may establish persistence and/or elevate privileges using system mechanisms that trigger execution based on specific events. Various operating systems have means to monitor and subscribe to events such as logons or other user activity such as running specific applications/binaries. Cloud environments may also support various functions and services that monitor and can be invoked in response to specific cloud events.(Citation: Backdooring an AWS account)(Citation: Varonis Power Automate Data Exfiltration)(Citation: Microsoft DART Case Report 001)" ; + rdfs:subClassOf d3f:PersistenceTechnique, + d3f:PrivilegeEscalationTechnique . + +d3f:UserManualReference a owl:Class ; + rdfs:label "User Manual Reference" ; + d3f:pref-label "User Manual" ; + rdfs:subClassOf d3f:TechniqueReference . + +d3f:maps a owl:ObjectProperty ; + rdfs:label "maps" ; + rdfs:subPropertyOf d3f:may-map . + +d3f:ApplicationConfiguration a owl:Class, + owl:NamedIndividual ; + rdfs:label "Application Configuration" ; + d3f:definition "Information used to configure the parameters and initial settings for an application." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ConfigurationResource . + +d3f:D3FENDCore a owl:Class, + owl:NamedIndividual ; + rdfs:label "D3FEND Core" . + +d3f:DomainTrustPolicy a d3f:DomainTrustPolicy, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Domain Trust Policy" ; + d3f:d3fend-id "D3-DTP" ; + d3f:definition "Restricting inter-domain trust by modifying domain configuration." ; + d3f:kb-reference d3f:Reference-HowTrustRelationshipsWorkForResourceForestsInAzureActiveDirectoryDomainServices ; + d3f:restricts d3f:DirectoryService, + d3f:T1087.002 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restricts ; + owl:someValuesFrom d3f:DirectoryService ], + [ a owl:Restriction ; + owl:onProperty d3f:restricts ; + owl:someValuesFrom d3f:T1087.002 ], + d3f:AccessPolicyAdministration . + +d3f:IntranetAdministrativeNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Intranet Administrative Network Traffic" ; + d3f:definition "Intranet administrative network traffic is administrative network traffic that does not cross a given network's boundaries and uses a standard administrative protocol." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:AdministrativeNetworkTraffic, + d3f:IntranetNetworkTraffic . + +d3f:IntranetNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Intranet Network Traffic" ; + d3f:definition "Intranet network traffic is network traffic traversing that does not traverse a given network's boundaries." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:NetworkTraffic . + +d3f:LocalFilePermissions a d3f:LocalFilePermissions, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Local File Permissions" ; + d3f:d3fend-id "D3-LFP" ; + d3f:definition "Restricting access to a local file by configuring operating system functionality." ; + d3f:kb-reference d3f:Reference-FileAndFolderPermissions ; + d3f:restricts d3f:Directory, + d3f:File ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restricts ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:restricts ; + owl:someValuesFrom d3f:Directory ], + d3f:AccessPolicyAdministration . + +d3f:ProcessLineageAnalysis a d3f:ProcessLineageAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Lineage Analysis" ; + d3f:analyzes d3f:Process, + d3f:ProcessTree ; + d3f:d3fend-id "D3-PLA" ; + d3f:definition "Identification of suspicious processes executing on an end-point device by examining the ancestry and siblings of a process, and the associated metadata of each node on the tree, such as process execution, duration, and order relative to siblings and ancestors." ; + d3f:kb-article """## How it works +Process tree analysis techniques gather information on how a process was initiated to determine if a process is malicious. For example, if a process was not initiated from boot or not initiated by another process, that process is identified as suspicious. Also, if a new process was started before a process initiated by the device (ex. during boot) and that new process was not initiated by a user (which can be determined by examining process parameters such as type of process, its creator, source, etc.) the process is identified as suspicious. + +For example, Microsoft Word may block execution of any subprocess that is not in an approved path. + +## Considerations +* Attackers may spoof the parent PID (https://attack.mitre.org/techniques/T1502/), rendering such after-the-fact analysis on process lineage ineffective. +* Processes may hide from various means of detection; an example on Linux is where a rootkit might remove key files for the process from its directory in /proc. +* Zombie processes.""" ; + d3f:kb-reference d3f:Reference-CAR-2020-11-002%3ALocalNetworkSniffing_MITRE, + d3f:Reference-CAR-2020-11-004%3AProcessesStartedFromIrregularParent_MITRE, + d3f:Reference-CAR-2021-02-002%3AGetSystemElevation_MITRE, + d3f:Reference-CAR-2021-05-003%3ABCDEditFailureRecoveryModification_MITRE, + d3f:Reference-CommandLaunchedFromWinLogon_MITRE, + d3f:Reference-DebuggersForAccessibilityApplications_MITRE, + d3f:Reference-GenericRegsvr32_MITRE, + d3f:Reference-OutlierParentsOfCmd_MITRE, + d3f:Reference-ProcessesSpawningCmd.exe_MITRE, + d3f:Reference-QuickExecutionOfASeriesOfSuspiciousCommands_MITRE, + d3f:Reference-Reg.exeCalledFromCommandShell_MITRE, + d3f:Reference-RemotelyLaunchedExecutablesViaWMI_MITRE, + d3f:Reference-ServiceOutlierExecutables_MITRE, + d3f:Reference-ServiceSearchPathInterception_MITRE, + d3f:Reference-ServicesLaunchingCmd_MITRE, + d3f:Reference-SystemAndMethodsThereofForCausalityIdentificationAndAttributionsDeterminationOfProcessesInANetwork_PaloAltoNetworksIncCyberSecdoLtd, + d3f:Reference-SystemAndMethodsThereofForIdentificationOfSuspiciousSystemProcesses_PaloAltoNetworksInc, + d3f:Reference-UACBypass_MITRE ; + d3f:synonym "Process Tree Analysis" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Process ], + [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:ProcessTree ], + d3f:ProcessSpawnAnalysis . + +d3f:SoftwareUpdate a d3f:SoftwareUpdate, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Software Update" ; + d3f:d3fend-id "D3-SU" ; + d3f:definition "Replacing old software on a computer system component." ; + d3f:kb-reference d3f:Reference-MethodAndSystemForProvidingSoftwareUpdatesToLocalMachines ; + d3f:updates d3f:Software ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:updates ; + owl:someValuesFrom d3f:Software ], + d3f:PlatformHardening . + +d3f:StackFrame a owl:Class, + owl:NamedIndividual ; + rdfs:label "Stack Frame" ; + d3f:definition "A machine-dependent and application-binary-dependent (ABI-dependent) data structure containing subroutine state information including the arguments passed into the routine, the return address back to the routine's caller, and space for local variables of the routine." ; + d3f:may-contain d3f:Pointer, + d3f:StackFrameCanary ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:StackFrameCanary ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:Pointer ], + d3f:StackComponent ; + skos:altLabel "Activation Frame", + "Activation Record" . + +d3f:executes a owl:ObjectProperty ; + rdfs:label "executes" ; + d3f:definition "x executes y: The subject x takes the action of carrying out (executing) y, which is a single software module, function, or instruction." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:accesses, + d3f:may-execute, + d3f:runs . + +d3f:AcademicPaperReference a owl:Class ; + rdfs:label "Academic Paper Reference" ; + d3f:pref-label "Academic Paper" ; + rdfs:subClassOf d3f:TechniqueReference . + +d3f:CWE-138 a owl:Class ; + rdfs:label "Improper Neutralization of Special Elements" ; + d3f:cwe-id "CWE-138" ; + rdfs:subClassOf d3f:CWE-707 . + +d3f:EncryptedTunnels a d3f:EncryptedTunnels, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Encrypted Tunnels" ; + d3f:d3fend-id "D3-ET" ; + d3f:definition "Encrypted encapsulation of routable network traffic." ; + d3f:isolates d3f:IntranetNetwork ; + d3f:kb-reference d3f:Reference-SecurityArchitectureForTheInternetProtocol ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:isolates ; + owl:someValuesFrom d3f:IntranetNetwork ], + d3f:NetworkIsolation . + +d3f:FileSystemMetadata a owl:Class, + owl:NamedIndividual ; + rdfs:label "File System Metadata" ; + d3f:definition "Metadata about the files and directories in a file system. For example file name, file length, time modified, group and user ids, and other file attributes." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Metadata . + +d3f:ImpactTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Impact Technique" ; + d3f:enables d3f:TA0040 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0040 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:MemoryBlock a owl:Class, + owl:NamedIndividual ; + rdfs:label "Memory Block" ; + d3f:contains d3f:MemoryWord ; + d3f:definition "In computing (specifically data transmission and data storage), a block, sometimes called a physical record, is a sequence of bytes or bits, usually containing some whole number of records, having a maximum length; a block size. Data thus structured are said to be blocked. The process of putting data into blocks is called blocking, while deblocking is the process of extracting data from blocks. Blocked data is normally stored in a data buffer and read or written a whole block at a time." ; + d3f:may-contain d3f:Record ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:Record ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:MemoryWord ], + d3f:MemoryExtent . + +d3f:TechniqueReference a owl:Class ; + rdfs:label "Technique Reference" ; + d3f:definition "A reference used to develop KB articles." ; + d3f:pref-label "Technique Reference" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:kb-reference-title ; + owl:someValuesFrom xsd:string ], + [ a owl:Restriction ; + owl:onProperty d3f:has-link ; + owl:someValuesFrom xsd:anyURI ], + [ a owl:Restriction ; + owl:onProperty d3f:kb-reference-of ; + owl:someValuesFrom d3f:DefensiveTechnique ], + d3f:D3FENDKBThing . + +d3f:CWE-1390 a owl:Class ; + rdfs:label "Weak Authentication" ; + d3f:cwe-id "CWE-1390" ; + rdfs:subClassOf d3f:CWE-287 . + +d3f:CWE-573 a owl:Class ; + rdfs:label "Improper Following of Specification by Caller" ; + d3f:cwe-id "CWE-573" ; + rdfs:subClassOf d3f:CWE-710 . + +d3f:DocumentFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Document File" ; + d3f:definition "A document is a written, drawn, presented or recorded representation of thoughts. An electronic document file is usually used to describe a primarily textual file, along with its structure and design, such as fonts, colors and additional images." ; + d3f:may-contain d3f:ExecutableScript ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:ExecutableScript ], + d3f:File . + +d3f:EventLog a owl:Class, + owl:NamedIndividual ; + rdfs:label "Event Log" ; + d3f:contains d3f:DigitalEventRecord ; + d3f:definition "Event logs record events taking place in the execution of a system in order to provide an audit trail that can be used to understand the activity of the system and to diagnose problems. They are essential to understand the activities of complex systems, particularly in the case of applications with little user interaction (such as server applications)." ; + d3f:synonym "Digital Event Log" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:DigitalEventRecord ], + d3f:Log . + +d3f:Firmware a owl:Class, + owl:NamedIndividual ; + rdfs:label "Firmware" ; + d3f:definition "In electronic systems and computing, firmware is a type of software that provides control, monitoring and data manipulation of engineered products and systems. Typical examples of devices containing firmware are embedded systems (such as traffic lights, consumer appliances, remote controls and digital watches), computers, computer peripherals, mobile phones, and digital cameras. The firmware contained in these devices provides the low-level control program for the device." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:Software . + +d3f:GuidelineReference a owl:Class ; + rdfs:label "Guideline Reference" ; + d3f:pref-label "Guideline" ; + rdfs:subClassOf d3f:PolicyReference . + +d3f:LateralMovementTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Lateral Movement Technique" ; + d3f:enables d3f:TA0008 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0008 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:Multi-factorAuthentication a d3f:Multi-factorAuthentication, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Multi-factor Authentication" ; + d3f:d3fend-id "D3-MFA" ; + d3f:definition "Requiring proof of two or more pieces of evidence in order to authenticate a user." ; + d3f:kb-article """## How it works +When logging into an account users present two or more credentials that fall into different categories: something you know (password or PIN), something you have (smart card or phone), or something you are (fingerprint). + +## Considerations +MFA configuration steps may vary across accounts and in some cases left up to users to activate and implement.""" ; + d3f:kb-reference ; + d3f:uses d3f:Credential ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:Credential ], + d3f:AgentAuthentication . + +d3f:AccessToken a owl:Class, + owl:NamedIndividual ; + rdfs:label "Access Token" ; + d3f:definition "In computer systems, an access token contains the security credentials for a login session and identifies the user, the user's groups, the user's privileges, and, in some cases, a particular application. Typically one may be asked to enter the access token (e.g. 40 random characters) rather than the usual password (it therefore should be kept secret just like a password)." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Credential ; + skos:altLabel "Ticket", + "Token" . + +d3f:ExecutableBinary a owl:Class, + owl:NamedIndividual ; + rdfs:label "Executable Binary" ; + d3f:contains d3f:ImageCodeSegment, + d3f:ImageDataSegment ; + d3f:definition "An executable binary contains machine code instructions for a physical CPU. D3FEND also considers byte code for a virtual machine to be binary code. This is in contrast to executable scripts written in a scripting language." ; + d3f:may-interpret d3f:ExecutableScript ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ImageDataSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:may-interpret ; + owl:someValuesFrom d3f:ExecutableScript ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ImageCodeSegment ], + d3f:ExecutableFile . + +d3f:ExecutableDenylisting a d3f:ExecutableDenylisting, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Executable Denylisting" ; + d3f:blocks d3f:ExecutableFile ; + d3f:d3fend-id "D3-EDL" ; + d3f:definition "Blocking the execution of files on a host in accordance with defined application policy rules." ; + d3f:filters d3f:CreateProcess ; + d3f:kb-article """## How it works + +#### Criteria + +A policy-enforcing application can register an application for denylisting based on conditions including the following: + +* File attributes + * file name + * file path + * file hash + * file publisher, as obtained from the digital signature + * permissions of the file +* File malware scan (eg. Windows SmartScreen) +* User-File combination + +This may be done to prevent execution of applications which are: + +* an old version with known vulnerabilities +* without a valid license, which could cause legal issues +* in a directory that is accessible to low-privileged users, that could be accessed by a malware dropper +* known trojan horse programs +* too open in their permissions, possibly set to run as a user other than the originator or allowing execution when they should not be +* a match to the hash of other known malware +* are detected as undesirable based on a file scan runtime behavior + +System administrators will customize the rules for the given environment. + +#### Backend + +The policy-enforcing program may work by running in kernel mode, and [intercepting] [system calls which execute a process]. + +## Considerations + +* If denylisting is done by filename, filepath, or hash, these mechanisms may be a worthy first line of defense and detection, but could still be evaded by an attacker. +* Continuous management is needed to keep the denylist up to date, whether it is based on hash, publisher, behavior, or any other digital artifact. +* Although denylists based on attributes such as file path and virus scan could defend against some threats which they have not been explicitly coded to block, denylists may not provide protection from new, unknown, or zero day attacks. + + +## Examples +On a Windows machine the Windows Defender Application Control (WDAC) policy enforcement is run in the kernel and allows for restricting applications.""" ; + d3f:kb-reference , + d3f:Reference-MethodAndApparatusForIncreasingTheSpeedAtWhichComputerVirusesAreDetected_McAfeeLLC ; + d3f:synonym "Executable Blacklisting" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:blocks ; + owl:someValuesFrom d3f:ExecutableFile ], + d3f:ExecutionIsolation . + +d3f:ProcessCodeSegment a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Code Segment" ; + d3f:contains d3f:Subroutine ; + d3f:definition "A process code segment, also known as a text segment or simply as text, is a portion of the program's virtual address space that contains executable instructions and corresponds to the loaded image code segment. Includes additional sections such as an import table." ; + d3f:may-contain d3f:ProcessSegment ; + rdfs:seeAlso d3f:ImageCodeSegment, + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:ProcessSegment ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Subroutine ], + d3f:ProcessSegment ; + skos:altLabel "Process Text Segment" . + +d3f:hardens a owl:ObjectProperty ; + rdfs:label "hardens" ; + rdfs:subPropertyOf d3f:counters, + d3f:d3fend-tactical-verb-property . + +d3f:may-create a owl:ObjectProperty ; + rdfs:label "may-create" ; + d3f:definition "x may-create y: They entity x may create the entity y; that is, 'x creates y' may be true." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:LocalAccountMonitoring a d3f:LocalAccountMonitoring, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Local Account Monitoring" ; + d3f:analyzes d3f:LocalUserAccount ; + d3f:d3fend-id "D3-LAM" ; + d3f:definition "Analyzing local user accounts to detect unauthorized activity." ; + d3f:kb-reference d3f:Reference-AuditUserAccountManagement, + d3f:Reference-CAR-2016-04-004_SuccessfulLocalAccountLogin, + d3f:Reference-OSQueryWindowsUserCollectionCode ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:LocalUserAccount ], + d3f:UserBehaviorAnalysis . + +d3f:PlatformHardening a d3f:PlatformHardening, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Platform Hardening" ; + d3f:d3fend-id "D3-PH" ; + d3f:definition """Hardening components of a Platform with the intention of making them more difficult to exploit. + +Platforms includes components such as: +* BIOS UEFI Subsystems +* Hardware security devices such as Trusted Platform Modules +* Boot process logic or code +* Kernel software components""" ; + d3f:enables d3f:Harden ; + d3f:synonym "Endpoint Hardening", + "System Hardening" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Harden ], + d3f:DefensiveTechnique . + +d3f:Resource a owl:Class, + owl:NamedIndividual ; + rdfs:label "Resource" ; + d3f:definition "In computing, a system resource, or simply resource, is any physical or virtual component of limited availability within a computer system. Every device connected to a computer system is a resource. Every internal system component is a resource. Virtual system resources include files (concretely file handles), network connections (concretely network sockets), and memory areas. Managing resources is referred to as resource management, and includes both preventing resource leaks (releasing a resource when a process has finished using it) and dealing with resource contention (when multiple processes wish to access a limited resource)." ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:DigitalInformationBearer . + +d3f:AccountLocking a d3f:AccountLocking, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Account Locking" ; + d3f:created "2020-08-05T00:00:00"^^xsd:dateTime ; + d3f:d3fend-id "D3-AL" ; + d3f:definition "The process of temporarily disabling user accounts on a system or domain." ; + d3f:disables d3f:UserAccount ; + d3f:kb-article """## How it works +Management servers with enterprise policies for account management provide the ability to enable and disable account for given rules. The rules may include specific periods of time (eg. weekend, plant shutdown, leave periods), specific user types or groups, or individual users. + +## Considerations +* Local accounts caches vs centralized account management +* Single Sign-on +* Role based vs Attribute based systems + +## Examples of account configuration stores +* Directory Services +* Active Directory +* RADIUS +* LDAP +* Oracle User Account Management +* JumpCloud""" ; + d3f:kb-reference d3f:Reference-AccountMonitoring_ForescoutTechnologies, + d3f:Reference-FrameworkForNotifyingADirectoryServiceOfAuthenticationEventsProcessedOutsideTheDirectoryService_OracleInternationalCorp ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:disables ; + owl:someValuesFrom d3f:UserAccount ], + d3f:CredentialEviction . + +d3f:HardwareDevice a owl:Class, + owl:NamedIndividual ; + rdfs:label "Hardware Device" ; + d3f:definition "Hardware devices are the physical artifacts that constitute a network or computer system. Hardware devices are the physical parts or components of a computer, such as the monitor, keyboard, computer data storage, hard disk drive (HDD), graphic cards, sound cards, memory (RAM), motherboard, and so on, all of which are tangible physical objects. By contrast, software is instructions that can be stored and run by hardware. Hardware is directed by the software to execute any command or instruction. A combination of hardware and software forms a usable computing system." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:DigitalInformationBearer, + d3f:PhysicalArtifact . + +d3f:UserInputFunction a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Input Function" ; + d3f:definition "Generic function that receives direct user input from an untrusted source." ; + rdfs:subClassOf d3f:InputFunction . + +d3f:SpecificationReference a owl:Class ; + rdfs:label "Specification Reference" ; + d3f:pref-label "Specification" ; + rdfs:subClassOf d3f:TechniqueReference . + +d3f:URL a owl:Class, + owl:NamedIndividual ; + rdfs:label "URL" ; + d3f:addresses d3f:Resource ; + d3f:definition "A Uniform Resource Locator (URL), commonly informally termed a web address (a term which is not defined identically) is a reference to a web resource that specifies its location on a computer network and a mechanism for retrieving it.A URL is a specific type of Uniform Resource Identifier (URI), although many people use the two terms interchangeably. A URL implies the means to access an indicated resource, which is not true of every URI. URLs occur most commonly to reference web pages (http), but are also used for file transfer (ftp), email (mailto), database access (JDBC), and many other applications." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:addresses ; + owl:someValuesFrom d3f:Resource ], + d3f:Identifier ; + skos:altLabel "Uniform Resource Locator" . + +d3f:may-access a owl:ObjectProperty ; + rdfs:label "may-access" ; + d3f:definition "x may-access y: They entity x may access the thing y; that is, 'x accesses y' may be true." ; + rdfs:subPropertyOf d3f:may-be-associated-with ; + owl:inverseOf d3f:may-be-accessed-by . + +d3f:may-be-associated-with a owl:ObjectProperty ; + rdfs:label "may-be-associated-with" ; + d3f:definition "x may-be-associated-with y: The subject x and object y may be associated in some way." ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:d3fend-object-property . + +d3f:weakness-of a owl:ObjectProperty ; + rdfs:label "weakness-of" ; + rdfs:subPropertyOf d3f:may-be-weakness-of . + +d3f:Authentication a owl:Class, + owl:NamedIndividual ; + rdfs:label "Authentication" ; + d3f:definition "A request-response comprising a user credential presentation to a system and a verification response." ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:User ], + [ a owl:Restriction ; + owl:onProperty d3f:originates-from ; + owl:someValuesFrom d3f:PhysicalLocation ], + [ a owl:Restriction ; + owl:onProperty d3f:may-create ; + owl:someValuesFrom d3f:IntranetNetworkTraffic ], + d3f:DefensiveAction . + +d3f:Email a owl:Class, + owl:NamedIndividual ; + rdfs:label "Email" ; + d3f:definition "An email, or email message, is a document that is sent between computer users across computer networks." ; + d3f:may-contain d3f:File, + d3f:URL ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:URL ], + d3f:DocumentFile . + +d3f:OffensiveTactic a owl:Class ; + rdfs:label "Offensive Tactic" ; + d3f:definition "Per ATT&CK, these are defined as Tactical Goals, not Tactics per se. Many children also fit definition of tactics. Some are neither tactics or tactical goals really (e.g., Execution, which is a useful grouping, but an action, not really a tactic or technique." ; + d3f:synonym "Tactical Objective" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enabled-by ; + owl:someValuesFrom d3f:OffensiveTechnique ], + d3f:Goal . + +d3f:SystemConfigurationDatabase a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Configuration Database" ; + d3f:definition "A database used to hold system configuration data." ; + rdfs:subClassOf d3f:Database . + +d3f:may-invoke a owl:ObjectProperty ; + rdfs:label "may-invoke" ; + d3f:definition "x may-invoke y: They entity x may invoke the thing y; that is, 'x invokes y' may be true." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:CWE-664 a owl:Class ; + rdfs:label "Improper Control of a Resource Through its Lifetime" ; + d3f:cwe-id "CWE-664" ; + rdfs:subClassOf d3f:Weakness . + +d3f:CWE-693 a owl:Class ; + rdfs:label "Protection Mechanism Failure" ; + d3f:cwe-id "CWE-693" ; + rdfs:subClassOf d3f:Weakness . + +d3f:CommandAndControlTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Command and Control Technique" ; + d3f:enables d3f:TA0011 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0011 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:ProcessSegment a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Segment" ; + d3f:definition "Process segments are distinct partitions of the memory space of a running process. Heap, data, code, and stack segments are examples of process segments." ; + d3f:synonym "Process Memory" ; + rdfs:subClassOf d3f:BinarySegment . + +d3f:InternetArticleReference a owl:Class ; + rdfs:label "Internet Article Reference" ; + d3f:pref-label "Internet Article" ; + rdfs:subClassOf d3f:TechniqueReference ; + skos:altLabel "Internet Blog Reference" . + +d3f:CWE-668 a owl:Class ; + rdfs:label "Exposure of Resource to Wrong Sphere" ; + d3f:cwe-id "CWE-668" ; + rdfs:subClassOf d3f:CWE-664 . + +d3f:Credential a owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential" ; + d3f:authenticates d3f:UserAccount ; + d3f:definition "A credential is a physical/tangible object, a piece of knowledge, or a facet of a person's physical being that enables an individual access to a given physical facility or computer-based information system. Typically, credentials can be something a person knows (such as a number or PIN), something they have (such as an access badge), something they are (such as a biometric feature), something they do (measurable behavioral patterns) or some combination of these items. This is known as multi-factor authentication. The typical credential is an access card or key-fob, and newer software can also turn users' smartphones into access devices." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:authenticates ; + owl:someValuesFrom d3f:UserAccount ], + d3f:DigitalInformationBearer . + +d3f:CredentialAccessTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Credential Access Technique" ; + d3f:accesses d3f:Credential ; + d3f:enables d3f:TA0006 ; + d3f:may-access d3f:PasswordFile ; + d3f:may-invoke d3f:CreateProcess ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0006 ], + [ a owl:Restriction ; + owl:onProperty d3f:may-access ; + owl:someValuesFrom d3f:PasswordFile ], + [ a owl:Restriction ; + owl:onProperty d3f:may-invoke ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:accesses ; + owl:someValuesFrom d3f:Credential ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:CWE-710 a owl:Class ; + rdfs:label "Improper Adherence to Coding Standards" ; + d3f:cwe-id "CWE-710" ; + rdfs:subClassOf d3f:Weakness . + +d3f:OSAPISystemFunction a owl:Class ; + rdfs:label "OS API System Function" ; + d3f:definition "Indirect System calls are made through an OS-specific library (like glibc in Linux) that provides a higher-level API for the system calls." ; + d3f:synonym "Indirect System Call" ; + rdfs:subClassOf d3f:OSAPIFunction . + +d3f:SystemConfigurationPermissions a d3f:SystemConfigurationPermissions, + owl:Class, + owl:NamedIndividual ; + rdfs:label "System Configuration Permissions" ; + d3f:d3fend-id "D3-SCP" ; + d3f:definition "Restricting system configuration modifications to a specific user or group of users." ; + d3f:kb-reference d3f:Reference-HowToChangeRegistryValuesOrPermissionsFromACommandLineOrAScript ; + d3f:restricts d3f:SystemConfigurationDatabase ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restricts ; + owl:someValuesFrom d3f:SystemConfigurationDatabase ], + d3f:PlatformHardening . + +d3f:NetworkTrafficAnalysis a d3f:NetworkTrafficAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Traffic Analysis" ; + d3f:d3fend-id "D3-NTA" ; + d3f:definition "Analyzing intercepted or summarized computer network traffic to detect unauthorized activity." ; + d3f:enables d3f:Detect ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:Detect ], + d3f:DefensiveTechnique . + +d3f:DefensiveTechnique a d3f:DefensiveTechnique, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Defensive Technique" ; + d3f:definition "A method which makes a computer system more difficult to attack." ; + d3f:display-baseurl "/technique/" ; + d3f:synonym "Countermeasure Technique", + "Defensive Capability Feature", + "Technical Security Control" ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:DefensiveTactic ], + [ a owl:Restriction ; + owl:onProperty d3f:kb-reference ; + owl:someValuesFrom d3f:TechniqueReference ], + [ a owl:Restriction ; + owl:onProperty d3f:d3fend-id ; + owl:someValuesFrom xsd:string ], + [ a owl:Restriction ; + owl:onProperty d3f:date ; + owl:someValuesFrom xsd:dateTime ], + d3f:CyberTechnique . + +d3f:DiscoveryTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Discovery Technique" ; + d3f:enables d3f:TA0007 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0007 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:ExecutableFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Executable File" ; + d3f:contains d3f:Subroutine ; + d3f:definition "In computing, executable code or an executable file or executable program, sometimes simply an executable, causes a computer \"to perform indicated tasks according to encoded instructions,\" as opposed to a data file that must be parsed by a program to be meaningful. These instructions are traditionally machine code instructions for a physical CPU. However, in a more general sense, a file containing instructions (such as bytecode) for a software interpreter may also be considered executable; even a scripting language source file may therefore be considered executable in this sense. The exact interpretation depends upon the use; while the term often refers only to machine code files, in the context of protection against computer viruses all files which cause potentially hazardous instruction" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:Subroutine ], + d3f:File ; + skos:altLabel "Executable" . + +d3f:Software a owl:Class, + owl:NamedIndividual ; + rdfs:label "Software" ; + d3f:contains d3f:ExecutableFile ; + d3f:definition "Computer software, or simply software, is that part of a computer system that consists of encoded information or computer instructions, in contrast to the physical hardware from which the system is built." ; + d3f:implements d3f:Subroutine ; + d3f:instructs d3f:Process ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ExecutableFile ], + [ a owl:Restriction ; + owl:onProperty d3f:implements ; + owl:someValuesFrom d3f:Subroutine ], + [ a owl:Restriction ; + owl:onProperty d3f:instructs ; + owl:someValuesFrom d3f:Process ], + d3f:DigitalInformation . + +d3f:SharedLibraryFile a owl:Class, + owl:NamedIndividual ; + rdfs:label "Shared Library File" ; + d3f:definition "A shared library file is a file that is intended to be shared by executable files and further shared library (object) files. Modules used by a program are loaded from individual shared objects into memory at load time or runtime, rather than being copied by a linker when it creates a single monolithic executable file for the program" ; + rdfs:isDefinedBy ; + rdfs:subClassOf d3f:ObjectFile ; + skos:altLabel "Shared Library", + "Shared Object" . + +d3f:ExecutableScript a owl:Class, + owl:NamedIndividual ; + rdfs:label "Executable Script" ; + d3f:definition "An executable script is written in a scripting language and interpreted at run time. This is in contrast with an executable binary, which contains machine code instructions for a physical CPU or byte code for a virtual machine." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:ExecutableFile . + +d3f:OutboundInternetNetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Internet Network Traffic" ; + d3f:definition "Outbound internet network traffic is network traffic on an outgoing connection initiated from a host within a network to a host outside the network." ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:InternetNetworkTraffic, + d3f:OutboundNetworkTraffic . + +d3f:ExecutionTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Execution Technique" ; + d3f:enables d3f:TA0002 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0002 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:PrivilegeEscalationTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Privilege Escalation Technique" ; + d3f:enables d3f:TA0004 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0004 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:may-contain a owl:ObjectProperty, + owl:TransitiveProperty ; + rdfs:label "may-contain" ; + d3f:definition "to potentially have as contents or constituent parts; comprise; include." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:ATTACKEnterpriseDataSource a owl:Class ; + rdfs:label "ATTACK Enterprise Data Source" ; + rdfs:subClassOf d3f:ATTACKEnterpriseThing . + +d3f:CWE-284 a owl:Class ; + rdfs:label "Improper Access Control" ; + d3f:cwe-id "CWE-284" ; + rdfs:subClassOf d3f:Weakness . + +d3f:ATTACKEnterpriseMitigation a owl:Class ; + rdfs:label "ATTACK Enterprise Mitigation" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:d3fend-comment ; + owl:someValuesFrom xsd:string ], + [ a owl:Restriction ; + owl:onProperty d3f:semantic-relation ; + owl:someValuesFrom d3f:DefensiveTechnique ], + d3f:ATTACKEnterpriseThing . + +d3f:Subroutine a owl:Class, + owl:NamedIndividual ; + rdfs:label "Subroutine" ; + d3f:definition "In different programming languages, a subroutine may be called a procedure, a function, a routine, a method, or a subprogram. The generic term callable unit is sometimes used." ; + d3f:synonym "Method", + "Semantic Subroutine", + "Software Function" ; + rdfs:seeAlso ; + rdfs:subClassOf d3f:Software . + +d3f:SystemConfigurationDatabaseRecord a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Configuration Database Record" ; + d3f:definition "A database record holding information used to configure the services, parameters, and initial settings for an operating system." ; + rdfs:subClassOf d3f:ConfigurationDatabaseRecord, + d3f:OperatingSystemConfigurationComponent . + +d3f:ProcessSpawnAnalysis a d3f:ProcessSpawnAnalysis, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Process Spawn Analysis" ; + d3f:analyzes d3f:CreateProcess, + d3f:Process ; + d3f:d3fend-id "D3-PSA" ; + d3f:definition "Analyzing spawn arguments or attributes of a process to detect processes that are unauthorized." ; + d3f:kb-article """## How it works +Process attributes are established when an operating system spawns a new process. These attributes are analyzed to look for the presence or absence of specific values or patterns. + +Some attributes of interest are: + - user + - process name + - image path + - security content + +## Considerations + + - Attackers can spoof the parent process identifier (PPID), which could bypass this defense to allow execution of a malicious process from an arbitrary parent process. + - Attackers could have legitimately compromised any of the process properties, such as the user, to make the execution appear legitimate. + - Location: If the full image path is not checked, there could be a conflict with an executable that appears earlier due to resolution involving the system environment path/classpath variable. + - Parsing issues: If the raw command from a shell is analyzed, rather than the actual function call, it is important to identify the actual command being run from its arguments. In Windows, services with unquoted file paths containing spaces will try to use the first token as the executable and the rest as arguments -- and shift tokens to the executable until a valid one is found. + - Some [operating systems](/dao/artifact/d3f:OperatingSystem) can spawn processes without forking.""" ; + d3f:kb-reference d3f:Reference-ActiveDirectoryDumpingViaNTDSUtil_MITRE, + d3f:Reference-CAR-2020-04-001%3AShadowCopyDeletion_MITRE, + d3f:Reference-CAR-2020-05-003%3ARareLolBASCommandLines_MITRE, + d3f:Reference-CAR-2020-08-001%3ANTFSAlternateDataStreamExecution-SystemUtilities_MITRE, + d3f:Reference-CAR-2020-09-003%3AIndicatorBlocking-DriverUnloaded_MITRE, + d3f:Reference-CAR-2020-09-004%3ACredentialsInFiles%26Registry_MITRE, + d3f:Reference-CAR-2020-11-001%3ABootOrLogonInitializationScripts_MITRE, + d3f:Reference-CAR-2020-11-003%3ADLLInjectionWithMavinject_MITRE, + d3f:Reference-CAR-2020-11-005%3AClearPowershellConsoleCommandHistory_MITRE, + d3f:Reference-CAR-2020-11-006%3ALocalPermissionGroupDiscovery_MITRE, + d3f:Reference-CAR-2020-11-007%3ANetworkShareConnectionRemoval_MITRE, + d3f:Reference-CAR-2020-11-008%3AMSBuildAndMsxsl_MITRE, + d3f:Reference-CAR-2020-11-009%3ACompiledHTMLAccess_MITRE, + d3f:Reference-CAR-2021-01-002%3AUnusuallyLongCommandLineStrings_MITRE, + d3f:Reference-CAR-2021-01-003%3AClearingWindowsLogsWithWevtutil_MITRE, + d3f:Reference-CAR-2021-01-004%3AUnusualChildProcessForSpoolsv.ExeOrConnhost.Exe_MITRE, + d3f:Reference-CAR-2021-01-006%3AUnusualChildProcessSpawnedUsingDDEExploit_MITRE, + d3f:Reference-CAR-2021-01-007%3ADetectingTamperingOfWindowsDefenderCommandPrompt_MITRE, + d3f:Reference-CAR-2021-01-008%3ADisableUAC_MITRE, + d3f:Reference-CAR-2021-01-009%3ADetectingShadowCopyDeletionViaVssadmin.exe_MITRE, + d3f:Reference-CAR-2021-02-001%3AWebshell-IndicativeProcessTree_MITRE, + d3f:Reference-CAR-2021-04-001%3ACommonWindowsProcessMasquerading_MITRE, + d3f:Reference-CAR-2021-05-001%3AAttemptToAddCertificateToUntrustedStore_MITRE, + d3f:Reference-CAR-2021-05-002%3ABatchFileWriteToSystem32_MITRE, + d3f:Reference-CAR-2021-05-003%3ABCDEditFailureRecoveryModification_MITRE, + d3f:Reference-CAR-2021-05-004%3ABITSJobPersistence_MITRE, + d3f:Reference-CAR-2021-05-005%3ABITSAdminDownloadFile_MITRE, + d3f:Reference-CAR-2021-05-006%3ACertUtilDownloadWithURLCacheAndSplitArguments_MITRE, + d3f:Reference-CAR-2021-05-007%3ACertUtilDownloadWithVerifyCtlAndSplitArguments_MITRE, + d3f:Reference-CAR-2021-05-008%3ACertutilExeCertificateExtraction_MITRE, + d3f:Reference-CAR-2021-05-009%3ACertUtilWithDecodeArgument_MITRE, + d3f:Reference-CAR-2021-05-010%3ACreateLocalAdminAccountsUsingNetExe_MITRE, + d3f:Reference-CommandLineUsageOfArchivingSoftware_MITRE, + d3f:Reference-CreateRemoteProcessViaWMIC_MITRE_Other, + d3f:Reference-CredentialDumpingViaMimikatz_MITRE, + d3f:Reference-HostDiscoveryCommands_MITRE, + d3f:Reference-LsassProcessDumpViaProcdump_MITRE, + d3f:Reference-PowershellExecution_MITRE, + d3f:Reference-RunDLL32.exeMonitoring_MITRE, + d3f:Reference-Squiblydoo_MITRE, + d3f:Reference-SuspiciousArguments_MITRE, + d3f:Reference-SuspiciousRunLocations_MITRE ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:CreateProcess ], + [ a owl:Restriction ; + owl:onProperty d3f:analyzes ; + owl:someValuesFrom d3f:Process ], + d3f:ProcessAnalysis . + +d3f:creates a owl:ObjectProperty ; + rdfs:label "creates" ; + d3f:definition "x creates y: The subject x bring into existence an object y. Some technique or agent x creates a persistent digital artifact y (as opposed to production of a consumable or transient object.); i.e., bring forth or generate" ; + rdfs:isDefinedBy ; + rdfs:seeAlso d3f:produces ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-create . + +d3f:enables a owl:ObjectProperty ; + rdfs:label "enables" ; + d3f:definition "x enables y: A top level technique x enables a tactic y, that is, the property indicates that a technique x is used to put a particular tactic y into action. In other words, x renders y capable or able for some task." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with . + +d3f:UserAccount a owl:Class, + owl:NamedIndividual ; + rdfs:label "User Account" ; + d3f:definition "A user account allows a user to authenticate to a system and potentially to receive authorization to access resources provided by or connected to that system; however, authentication does not imply authorization. To log into an account, a user is typically required to authenticate oneself with a password or other credentials for the purposes of accounting, security, logging, and resource management." ; + d3f:identified-by d3f:DigitalIdentity ; + d3f:used-by d3f:Agent ; + rdfs:isDefinedBy ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:identified-by ; + owl:someValuesFrom d3f:DigitalIdentity ], + [ a owl:Restriction ; + owl:onProperty d3f:used-by ; + owl:someValuesFrom d3f:Agent ], + d3f:DigitalInformationBearer . + +d3f:UserAccountPermissions a d3f:UserAccountPermissions, + owl:Class, + owl:NamedIndividual ; + rdfs:label "User Account Permissions" ; + d3f:d3fend-id "D3-UAP" ; + d3f:definition "Restricting a user account's access to resources." ; + d3f:kb-reference d3f:Reference-ConfigureUserAccessControlAndPermissions ; + d3f:restricts d3f:UserAccount ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:restricts ; + owl:someValuesFrom d3f:UserAccount ], + d3f:AccessPolicyAdministration . + +d3f:has-participant a owl:ObjectProperty ; + rdfs:label "has-participant" ; + d3f:definition "x has-participant y: The event x involves an object y as a participant, indicating that y plays some role in the event, whether actively, passively, or otherwise." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with ; + owl:inverseOf d3f:participates-in . + +d3f:NetworkTraffic a owl:Class, + owl:NamedIndividual ; + rdfs:label "Network Traffic" ; + d3f:contains d3f:NetworkPackets ; + d3f:definition "Network traffic or data traffic is the data, or alternatively the amount of data, moving across a network at a given point of time. Network data in computer networks is mostly encapsulated in network packets, which provide the load in the network." ; + d3f:may-contain d3f:DomainName ; + d3f:originates-from d3f:PhysicalLocation ; + rdfs:seeAlso , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:NetworkPackets ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:DomainName ], + [ a owl:Restriction ; + owl:onProperty d3f:originates-from ; + owl:someValuesFrom d3f:PhysicalLocation ], + d3f:DigitalInformationBearer ; + skos:altLabel "Data Traffic" . + +d3f:OutboundTrafficFiltering a d3f:OutboundTrafficFiltering, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Outbound Traffic Filtering" ; + d3f:d3fend-id "D3-OTF" ; + d3f:definition "Restricting network traffic originating from a private host or enclave destined towards untrusted networks." ; + d3f:filters d3f:OutboundNetworkTraffic ; + d3f:kb-article """## How it works + +Outbound traffic, in this context, is network traffic originating from a private host or enclave destined towards untrusted networks. +For example: + +* An enterprise desktop intranet user connecting to www.example.com +* An internal mail server connecting to an external mail server, mail.example.com + +Filtering is commonly implemented as firewall rulesets to limit outbound traffic permitted to egress a host or network. Firewalls are deployed either directly on hosts through kernel level software implementations or installed in-line directly on network links. There are benefits and disadvantages to each approach. + +There are various strategies for developing filtering rulesets: + +* Block everything by default +* Limit destination hosts +* Limit destination transport or application protocols +* Restrict content outbound (Ex. strings formatted as social security numbers, or proprietary data) + +## Considerations +* Dynamic IP assignment creates challenges for Outbound Traffic Filtering because users are not necessarily associated with the same IP address. This can be addressed by linking IP address management information with the filtering logic. +* Connections using non-standard transport layer ports may circumvent outbound traffic filtering technology which does not detect application protocol based on traffic content. +* Business requirements typically drive the development of filtering rule sets. + +## Implementations +- iptables (Linux) +- Windows Firewall +- pf (BSD)""" ; + d3f:kb-reference d3f:Reference-AutomaticallyGeneratingRulesForConnectionSecurity_Microsoft ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:OutboundNetworkTraffic ], + d3f:NetworkTrafficFiltering . + +d3f:CreateProcess a owl:Class, + owl:NamedIndividual ; + rdfs:label "Create Process" ; + d3f:definition "A process spawn refers to a function that loads and executes a new child process.The current process may wait for the child to terminate or may continue to execute asynchronously. Creating a new subprocess requires enough memory in which both the child process and the current program can execute. There is a family of spawn functions in DOS, inherited by Microsoft Windows. There is also a different family of spawn functions in an optional extension of the POSIX standards. Fork-exec is another technique combining two Unix system calls, which can effect a process spawn.", + "Creates a process.", + "Executes a process." ; + d3f:executes d3f:Process ; + rdfs:seeAlso , + , + , + , + , + ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:Process ], + d3f:SystemCall ; + skos:altLabel "Execute Process", + "Process Spawn", + "Spawn Process" . + +d3f:DigitalInformationBearer a owl:Class ; + rdfs:label "Digital Information Bearer" ; + rdfs:subClassOf d3f:DigitalArtifact . + +d3f:Process a owl:Class, + owl:NamedIndividual ; + rdfs:label "Process" ; + d3f:contains d3f:ProcessImage ; + d3f:definition "A process is an instance of a computer program that is being executed. It contains the program code and its current activity. Depending on the operating system (OS), a process may be made up of multiple threads of execution that execute instructions concurrently. A computer program is a passive collection of instructions, while a process is the actual execution of those instructions. Several processes may be associated with the same program; for example, opening up several instances of the same program often means more than one process is being executed." ; + d3f:instructed-by d3f:Software ; + d3f:may-execute d3f:Thread ; + d3f:process-image-path d3f:ExecutableBinary ; + d3f:process-user d3f:UserAccount ; + d3f:uses d3f:Resource ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:process-environmental-variables ; + owl:someValuesFrom xsd:string ], + [ a owl:Restriction ; + owl:onProperty d3f:uses ; + owl:someValuesFrom d3f:Resource ], + [ a owl:Restriction ; + owl:onProperty d3f:process-security-context ; + owl:someValuesFrom xsd:string ], + [ a owl:Restriction ; + owl:onProperty d3f:may-execute ; + owl:someValuesFrom d3f:Thread ], + [ a owl:Restriction ; + owl:onProperty d3f:process-identifier ; + owl:someValuesFrom xsd:integer ], + [ a owl:Restriction ; + owl:onProperty d3f:process-command-line-arguments ; + owl:someValuesFrom xsd:string ], + [ a owl:Restriction ; + owl:onProperty d3f:process-user ; + owl:someValuesFrom d3f:UserAccount ], + [ a owl:Restriction ; + owl:onProperty d3f:instructed-by ; + owl:someValuesFrom d3f:Software ], + [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:ProcessImage ], + [ a owl:Restriction ; + owl:onProperty d3f:process-image-path ; + owl:someValuesFrom d3f:ExecutableBinary ], + d3f:DigitalInformationBearer . + +d3f:SystemCall a owl:Class, + owl:NamedIndividual ; + rdfs:label "System Call" ; + d3f:definition "A system call is the programmatic way in which a computer program requests a service from the kernel of the operating system it is executed on. This may include hardware-related services (for example, accessing a hard disk drive), creation and execution of new processes, and communication with integral kernel services such as process scheduling. System calls provide an essential interface between a process and the operating system." ; + d3f:executes d3f:Subroutine ; + d3f:synonym "syscall" ; + rdfs:isDefinedBy ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:executes ; + owl:someValuesFrom d3f:Subroutine ], + d3f:DigitalInformationBearer . + +d3f:analyzes a owl:ObjectProperty ; + rdfs:label "analyzes" ; + d3f:definition "x analyzes y: The subject x break down object y into components or essential features, assessing y by quantitative methods, qualitative methods, or both. Usually the analysis is done in terms of some model or framework." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:detects . + +d3f:InboundTrafficFiltering a d3f:InboundTrafficFiltering, + owl:Class, + owl:NamedIndividual ; + rdfs:label "Inbound Traffic Filtering" ; + d3f:d3fend-id "D3-ITF" ; + d3f:definition "Restricting network traffic originating from untrusted networks destined towards a private host or enclave." ; + d3f:filters d3f:InboundNetworkTraffic ; + d3f:kb-article """## How it works +Inbound Traffic, in this context, is network traffic originating from an untrusted network towards a private host or enclave. +For example: + +* An untrusted network host connecting to a internal commercial portal, shopping.example.com +* An external mail server connecting to an internal mail server, mail.example.com + +Filtering policies are developed by administrators to meet business requirements and limit connectivity. These policies are implemented on edge devices such as firewalls, routers, and intrusion prevention systems. Examples of filters: + +* Blocking incoming traffic from spoofed internally facing IP addresses +* Blocking specific ports and services from establishing connections +* Limiting specific IP ranges from connecting to the network +* Dynamic inbound filtering (Hole punching, STUN, NAT-T) + +## Considerations +* Business requirements typically drive the development of filtering rulesets +* Protocols using non-standard ports may circumvent filtering technology, which does not detect application protocol based on traffic content + +## Implementations +* OpenWRT (Embedded) +* Netfilter (Linux) +* Windows Firewall +* pf(BSD)""" ; + d3f:kb-reference d3f:Reference-ActiveFirewallSystemAndMethodology_McAfeeLLC, + d3f:Reference-AutomaticallyGeneratingRulesForConnectionSecurity_Microsoft, + d3f:Reference-FWTK-FirewallToolkit_, + d3f:Reference-FirewallForInterentAccess_SecureComputingLLC, + d3f:Reference-FirewallForProcessingAConnectionlessNetworkPacket_NationalSecurityAgency, + d3f:Reference-FirewallForProcessingConnection-orientedAndConnectionlessDatagramsOverAConnection-orientedNetwork_NationalSecurityAgency, + d3f:Reference-FirewallsThatFilterBasedUponProtocolCommands_IntelCorp, + d3f:Reference-MethodForControllingComputerNetworkSecurity_CheckpointSoftwareTechnologiesLtd, + d3f:Reference-NetworkFirewallWithProxy_SecureComputingLLC ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:filters ; + owl:someValuesFrom d3f:InboundNetworkTraffic ], + d3f:NetworkTrafficFiltering . + +d3f:may-modify a owl:ObjectProperty ; + rdfs:label "may-modify" ; + d3f:definition "x may-modify y: They entity x may modify the thing y; that is, 'x modifies y' may be true." ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:contains a owl:ObjectProperty, + owl:TransitiveProperty ; + rdfs:label "contains" ; + d3f:definition "x contains y: A core relation that holds between a whole x and its part y. Equivalent to relational concept 'has part' and thus transitive." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-contain . + +d3f:accesses a owl:ObjectProperty ; + rdfs:label "accesses" ; + d3f:definition "x accesses y: An subject x takes the action of reading from, writing into, or executing the stored information in the object y. Reads, writes, and executes are specific cases of accesses." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-access . + +d3f:PersistenceTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Persistence Technique" ; + d3f:enables d3f:TA0003 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0003 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:produces a owl:ObjectProperty ; + rdfs:label "produces" ; + d3f:definition "x produces y: The subject entity x or process produces a data object y, which may be discrete digital object or a stream (e.g., a stream such as network traffic.)" ; + rdfs:isDefinedBy ; + rdfs:seeAlso d3f:creates ; + rdfs:subPropertyOf d3f:associated-with, + d3f:may-produce ; + skos:altLabel "outputs" . + +d3f:DefenseEvasionTechnique a owl:Class, + owl:NamedIndividual ; + rdfs:label "Defense Evasion Technique" ; + d3f:enables d3f:TA0005 ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:enables ; + owl:someValuesFrom d3f:TA0005 ], + d3f:ATTACKEnterpriseTechnique, + d3f:OffensiveTechnique . + +d3f:associated-with a owl:ObjectProperty ; + rdfs:label "associated-with" ; + d3f:definition "x associated-with y: The subject x and object y are associated in some way. This is the most general definite relationship in d3fend (i.e., most general relationship that is not prefixed by 'may-'.)" ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:may-be-associated-with . + +d3f:invokes a owl:ObjectProperty ; + rdfs:label "invokes" ; + d3f:definition "x invokes y: The subject x invokes a system service y by use of an instruction object y that interrupts the program being executed and passes control to the operating system to perform that operation." ; + rdfs:isDefinedBy ; + rdfs:seeAlso ; + rdfs:subPropertyOf d3f:executes, + d3f:may-invoke ; + skos:altLabel "calls" . + +d3f:File a owl:Class, + owl:NamedIndividual ; + rdfs:label "File" ; + d3f:contains d3f:FileSection ; + d3f:definition "A file maintained in computer-readable form." ; + d3f:may-contain d3f:File, + d3f:URL ; + rdfs:seeAlso ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:contains ; + owl:someValuesFrom d3f:FileSection ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:File ], + [ a owl:Restriction ; + owl:onProperty d3f:may-contain ; + owl:someValuesFrom d3f:URL ], + d3f:Resource . + +d3f:ExternalKnowledgeBase a owl:Class ; + rdfs:label "External Knowledge Base" ; + d3f:pref-label "External Knowledge Base" ; + rdfs:subClassOf d3f:TechniqueReference . + +d3f:NISTControl a owl:Class ; + rdfs:label "NIST Control" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:member-of ; + owl:someValuesFrom d3f:NISTSP800-53ControlCatalog ], + d3f:ExternalControl . + +d3f:NIST_SP_800-53_R5 a d3f:NISTSP800-53ControlCatalog, + owl:NamedIndividual ; + rdfs:label "NIST SP 800-53 R5" ; + d3f:archived-at "https://csrc.nist.gov/publications/detail/sp/800-53/rev-5/final"^^xsd:anyURI ; + d3f:has-member d3f:NIST_SP_800-53_R5_AC-17_8, + d3f:NIST_SP_800-53_R5_AC-23, + d3f:NIST_SP_800-53_R5_AC-24, + d3f:NIST_SP_800-53_R5_AC-24_1, + d3f:NIST_SP_800-53_R5_AC-24_2, + d3f:NIST_SP_800-53_R5_AC-2_1, + d3f:NIST_SP_800-53_R5_AC-2_13, + d3f:NIST_SP_800-53_R5_AC-2_2, + d3f:NIST_SP_800-53_R5_AC-2_3, + d3f:NIST_SP_800-53_R5_AC-2_4, + d3f:NIST_SP_800-53_R5_AC-2_5, + d3f:NIST_SP_800-53_R5_AC-2_6, + d3f:NIST_SP_800-53_R5_AC-2_7, + d3f:NIST_SP_800-53_R5_AC-2_9, + d3f:NIST_SP_800-53_R5_AC-3, + d3f:NIST_SP_800-53_R5_AC-3_11, + d3f:NIST_SP_800-53_R5_AC-3_13, + d3f:NIST_SP_800-53_R5_AC-3_3, + d3f:NIST_SP_800-53_R5_AC-3_7, + d3f:NIST_SP_800-53_R5_AC-3_8, + d3f:NIST_SP_800-53_R5_AC-4, + d3f:NIST_SP_800-53_R5_AC-4_1, + d3f:NIST_SP_800-53_R5_AC-4_10, + d3f:NIST_SP_800-53_R5_AC-4_11, + d3f:NIST_SP_800-53_R5_AC-4_12, + d3f:NIST_SP_800-53_R5_AC-4_13, + d3f:NIST_SP_800-53_R5_AC-4_14, + d3f:NIST_SP_800-53_R5_AC-4_15, + d3f:NIST_SP_800-53_R5_AC-4_17, + d3f:NIST_SP_800-53_R5_AC-4_19, + d3f:NIST_SP_800-53_R5_AC-4_20, + d3f:NIST_SP_800-53_R5_AC-4_21, + d3f:NIST_SP_800-53_R5_AC-4_26, + d3f:NIST_SP_800-53_R5_AC-4_27, + d3f:NIST_SP_800-53_R5_AC-4_28, + d3f:NIST_SP_800-53_R5_AC-4_29, + d3f:NIST_SP_800-53_R5_AC-4_3, + d3f:NIST_SP_800-53_R5_AC-4_30, + d3f:NIST_SP_800-53_R5_AC-4_32, + d3f:NIST_SP_800-53_R5_AC-4_4, + d3f:NIST_SP_800-53_R5_AC-4_5, + d3f:NIST_SP_800-53_R5_AC-4_6, + d3f:NIST_SP_800-53_R5_AC-4_8, + d3f:NIST_SP_800-53_R5_AC-5, + d3f:NIST_SP_800-53_R5_AC-6, + d3f:NIST_SP_800-53_R5_AC-6_1, + d3f:NIST_SP_800-53_R5_AC-6_10, + d3f:NIST_SP_800-53_R5_AC-6_3, + d3f:NIST_SP_800-53_R5_AC-6_4, + d3f:NIST_SP_800-53_R5_AC-6_5, + d3f:NIST_SP_800-53_R5_AC-6_6, + d3f:NIST_SP_800-53_R5_AC-6_9, + d3f:NIST_SP_800-53_R5_AC-7, + d3f:NIST_SP_800-53_R5_AC-7_3, + d3f:NIST_SP_800-53_R5_AC-7_4, + d3f:NIST_SP_800-53_R5_AU-10_5, + d3f:NIST_SP_800-53_R5_AU-14_2, + d3f:NIST_SP_800-53_R5_AU-15, + d3f:NIST_SP_800-53_R5_AU-2, + d3f:NIST_SP_800-53_R5_AU-2_1, + d3f:NIST_SP_800-53_R5_AU-2_2, + d3f:NIST_SP_800-53_R5_AU-3, + d3f:NIST_SP_800-53_R5_AU-4, + d3f:NIST_SP_800-53_R5_CM-14, + d3f:NIST_SP_800-53_R5_CM-5, + d3f:NIST_SP_800-53_R5_CM-5_1, + d3f:NIST_SP_800-53_R5_CM-5_3, + d3f:NIST_SP_800-53_R5_CM-5_5, + d3f:NIST_SP_800-53_R5_CM-5_6, + d3f:NIST_SP_800-53_R5_CM-6_3, + d3f:NIST_SP_800-53_R5_IA-2_1, + d3f:NIST_SP_800-53_R5_IA-2_2, + d3f:NIST_SP_800-53_R5_IA-2_4, + d3f:NIST_SP_800-53_R5_IA-2_6, + d3f:NIST_SP_800-53_R5_IR-4_12, + d3f:NIST_SP_800-53_R5_IR-4_13, + d3f:NIST_SP_800-53_R5_MA-3_3, + d3f:NIST_SP_800-53_R5_MA-3_4, + d3f:NIST_SP_800-53_R5_MA-3_5, + d3f:NIST_SP_800-53_R5_MA-3_6, + d3f:NIST_SP_800-53_R5_MA-4_1, + d3f:NIST_SP_800-53_R5_MA-6, + d3f:NIST_SP_800-53_R5_MA-6_1, + d3f:NIST_SP_800-53_R5_MA-6_2, + d3f:NIST_SP_800-53_R5_MA-6_3, + d3f:NIST_SP_800-53_R5_RA-3_3, + d3f:NIST_SP_800-53_R5_RA-3_4, + d3f:NIST_SP_800-53_R5_RA-5, + d3f:NIST_SP_800-53_R5_RA-5_2, + d3f:NIST_SP_800-53_R5_RA-5_3, + d3f:NIST_SP_800-53_R5_RA-5_4, + d3f:NIST_SP_800-53_R5_RA-5_5, + d3f:NIST_SP_800-53_R5_RA-5_6, + d3f:NIST_SP_800-53_R5_RA-5_7, + d3f:NIST_SP_800-53_R5_SA-10_1, + d3f:NIST_SP_800-53_R5_SA-10_3, + d3f:NIST_SP_800-53_R5_SA-10_4, + d3f:NIST_SP_800-53_R5_SA-10_5, + d3f:NIST_SP_800-53_R5_SA-10_6, + d3f:NIST_SP_800-53_R5_SA-11_1, + d3f:NIST_SP_800-53_R5_SA-11_8, + d3f:NIST_SP_800-53_R5_SA-8_18, + d3f:NIST_SP_800-53_R5_SA-8_22, + d3f:NIST_SP_800-53_R5_SC-2, + d3f:NIST_SP_800-53_R5_SC-2_1, + d3f:NIST_SP_800-53_R5_SC-3, + d3f:NIST_SP_800-53_R5_SC-3_1, + d3f:NIST_SP_800-53_R5_SI-2_4, + d3f:NIST_SP_800-53_R5_SI-2_5, + d3f:NIST_SP_800-53_R5_SI-2_6, + d3f:NIST_SP_800-53_R5_SI-3, + d3f:NIST_SP_800-53_R5_SI-3_10, + d3f:NIST_SP_800-53_R5_SI-3_4, + d3f:NIST_SP_800-53_R5_SI-3_8, + d3f:NIST_SP_800-53_R5_SI-4, + d3f:NIST_SP_800-53_R5_SI-4_2, + d3f:NIST_SP_800-53_R5_SI-4_4 ; + d3f:version 5 ; + rdfs:seeAlso . + +d3f:modifies a owl:ObjectProperty ; + rdfs:label "modifies" ; + d3f:definition "x modifies y: A technique or agent x causes a digital object y to change; become different; or undertake a transformation. Afterwards, the data or state held by a digital object is changed." ; + rdfs:isDefinedBy ; + rdfs:subPropertyOf d3f:accesses, + d3f:associated-with, + d3f:may-modify ; + skos:altLabel "alters" . + +d3f:PatentReference a owl:Class ; + rdfs:label "Patent Reference" ; + d3f:pref-label "Patent" ; + rdfs:subClassOf d3f:TechniqueReference . + +d3f:CCICatalog_v2022-04-05 a d3f:ControlCorrelationIdentifierCatalog, + owl:NamedIndividual ; + rdfs:label "CCI Catalog v2022-04-05" ; + d3f:archived-at "https://public.cyber.mil/stigs/cci/"^^xsd:anyURI ; + d3f:has-member d3f:CCI-000015_v2022-04-05, + d3f:CCI-000016_v2022-04-05, + d3f:CCI-000017_v2022-04-05, + d3f:CCI-000018_v2022-04-05, + d3f:CCI-000020_v2022-04-05, + d3f:CCI-000022_v2022-04-05, + d3f:CCI-000025_v2022-04-05, + d3f:CCI-000027_v2022-04-05, + d3f:CCI-000029_v2022-04-05, + d3f:CCI-000030_v2022-04-05, + d3f:CCI-000032_v2022-04-05, + d3f:CCI-000034_v2022-04-05, + d3f:CCI-000035_v2022-04-05, + d3f:CCI-000037_v2022-04-05, + d3f:CCI-000040_v2022-04-05, + d3f:CCI-000044_v2022-04-05, + d3f:CCI-000047_v2022-04-05, + d3f:CCI-000056_v2022-04-05, + d3f:CCI-000057_v2022-04-05, + d3f:CCI-000058_v2022-04-05, + d3f:CCI-000060_v2022-04-05, + d3f:CCI-000066_v2022-04-05, + d3f:CCI-000067_v2022-04-05, + d3f:CCI-000068_v2022-04-05, + d3f:CCI-000071_v2022-04-05, + d3f:CCI-000139_v2022-04-05, + d3f:CCI-000143_v2022-04-05, + d3f:CCI-000144_v2022-04-05, + d3f:CCI-000162_v2022-04-05, + d3f:CCI-000163_v2022-04-05, + d3f:CCI-000164_v2022-04-05, + d3f:CCI-000185_v2022-04-05, + d3f:CCI-000186_v2022-04-05, + d3f:CCI-000187_v2022-04-05, + d3f:CCI-000192_v2022-04-05, + d3f:CCI-000193_v2022-04-05, + d3f:CCI-000194_v2022-04-05, + d3f:CCI-000195_v2022-04-05, + d3f:CCI-000196_v2022-04-05, + d3f:CCI-000197_v2022-04-05, + d3f:CCI-000198_v2022-04-05, + d3f:CCI-000199_v2022-04-05, + d3f:CCI-000200_v2022-04-05, + d3f:CCI-000205_v2022-04-05, + d3f:CCI-000213_v2022-04-05, + d3f:CCI-000218_v2022-04-05, + d3f:CCI-000219_v2022-04-05, + d3f:CCI-000226_v2022-04-05, + d3f:CCI-000346_v2022-04-05, + d3f:CCI-000352_v2022-04-05, + d3f:CCI-000374_v2022-04-05, + d3f:CCI-000381_v2022-04-05, + d3f:CCI-000382_v2022-04-05, + d3f:CCI-000386_v2022-04-05, + d3f:CCI-000417_v2022-04-05, + d3f:CCI-000663_v2022-04-05, + d3f:CCI-000764_v2022-04-05, + d3f:CCI-000765_v2022-04-05, + d3f:CCI-000766_v2022-04-05, + d3f:CCI-000767_v2022-04-05, + d3f:CCI-000768_v2022-04-05, + d3f:CCI-000771_v2022-04-05, + d3f:CCI-000772_v2022-04-05, + d3f:CCI-000774_v2022-04-05, + d3f:CCI-000776_v2022-04-05, + d3f:CCI-000804_v2022-04-05, + d3f:CCI-000831_v2022-04-05, + d3f:CCI-000877_v2022-04-05, + d3f:CCI-000880_v2022-04-05, + d3f:CCI-000884_v2022-04-05, + d3f:CCI-000888_v2022-04-05, + d3f:CCI-001009_v2022-04-05, + d3f:CCI-001019_v2022-04-05, + d3f:CCI-001067_v2022-04-05, + d3f:CCI-001069_v2022-04-05, + d3f:CCI-001082_v2022-04-05, + d3f:CCI-001083_v2022-04-05, + d3f:CCI-001084_v2022-04-05, + d3f:CCI-001085_v2022-04-05, + d3f:CCI-001086_v2022-04-05, + d3f:CCI-001087_v2022-04-05, + d3f:CCI-001089_v2022-04-05, + d3f:CCI-001090_v2022-04-05, + d3f:CCI-001092_v2022-04-05, + d3f:CCI-001094_v2022-04-05, + d3f:CCI-001096_v2022-04-05, + d3f:CCI-001100_v2022-04-05, + d3f:CCI-001109_v2022-04-05, + d3f:CCI-001111_v2022-04-05, + d3f:CCI-001115_v2022-04-05, + d3f:CCI-001117_v2022-04-05, + d3f:CCI-001118_v2022-04-05, + d3f:CCI-001124_v2022-04-05, + d3f:CCI-001125_v2022-04-05, + d3f:CCI-001127_v2022-04-05, + d3f:CCI-001128_v2022-04-05, + d3f:CCI-001133_v2022-04-05, + d3f:CCI-001144_v2022-04-05, + d3f:CCI-001145_v2022-04-05, + d3f:CCI-001146_v2022-04-05, + d3f:CCI-001147_v2022-04-05, + d3f:CCI-001150_v2022-04-05, + d3f:CCI-001166_v2022-04-05, + d3f:CCI-001169_v2022-04-05, + d3f:CCI-001170_v2022-04-05, + d3f:CCI-001178_v2022-04-05, + d3f:CCI-001185_v2022-04-05, + d3f:CCI-001199_v2022-04-05, + d3f:CCI-001200_v2022-04-05, + d3f:CCI-001210_v2022-04-05, + d3f:CCI-001211_v2022-04-05, + d3f:CCI-001233_v2022-04-05, + d3f:CCI-001237_v2022-04-05, + d3f:CCI-001239_v2022-04-05, + d3f:CCI-001242_v2022-04-05, + d3f:CCI-001262_v2022-04-05, + d3f:CCI-001297_v2022-04-05, + d3f:CCI-001305_v2022-04-05, + d3f:CCI-001310_v2022-04-05, + d3f:CCI-001350_v2022-04-05, + d3f:CCI-001352_v2022-04-05, + d3f:CCI-001356_v2022-04-05, + d3f:CCI-001368_v2022-04-05, + d3f:CCI-001372_v2022-04-05, + d3f:CCI-001373_v2022-04-05, + d3f:CCI-001374_v2022-04-05, + d3f:CCI-001376_v2022-04-05, + d3f:CCI-001377_v2022-04-05, + d3f:CCI-001399_v2022-04-05, + d3f:CCI-001400_v2022-04-05, + d3f:CCI-001401_v2022-04-05, + d3f:CCI-001403_v2022-04-05, + d3f:CCI-001404_v2022-04-05, + d3f:CCI-001405_v2022-04-05, + d3f:CCI-001414_v2022-04-05, + d3f:CCI-001424_v2022-04-05, + d3f:CCI-001425_v2022-04-05, + d3f:CCI-001426_v2022-04-05, + d3f:CCI-001427_v2022-04-05, + d3f:CCI-001428_v2022-04-05, + d3f:CCI-001436_v2022-04-05, + d3f:CCI-001452_v2022-04-05, + d3f:CCI-001453_v2022-04-05, + d3f:CCI-001454_v2022-04-05, + d3f:CCI-001493_v2022-04-05, + d3f:CCI-001494_v2022-04-05, + d3f:CCI-001495_v2022-04-05, + d3f:CCI-001496_v2022-04-05, + d3f:CCI-001499_v2022-04-05, + d3f:CCI-001555_v2022-04-05, + d3f:CCI-001556_v2022-04-05, + d3f:CCI-001557_v2022-04-05, + d3f:CCI-001574_v2022-04-05, + d3f:CCI-001589_v2022-04-05, + d3f:CCI-001619_v2022-04-05, + d3f:CCI-001632_v2022-04-05, + d3f:CCI-001662_v2022-04-05, + d3f:CCI-001668_v2022-04-05, + d3f:CCI-001677_v2022-04-05, + d3f:CCI-001682_v2022-04-05, + d3f:CCI-001683_v2022-04-05, + d3f:CCI-001684_v2022-04-05, + d3f:CCI-001685_v2022-04-05, + d3f:CCI-001686_v2022-04-05, + d3f:CCI-001695_v2022-04-05, + d3f:CCI-001744_v2022-04-05, + d3f:CCI-001749_v2022-04-05, + d3f:CCI-001762_v2022-04-05, + d3f:CCI-001764_v2022-04-05, + d3f:CCI-001767_v2022-04-05, + d3f:CCI-001774_v2022-04-05, + d3f:CCI-001811_v2022-04-05, + d3f:CCI-001812_v2022-04-05, + d3f:CCI-001813_v2022-04-05, + d3f:CCI-001855_v2022-04-05, + d3f:CCI-001858_v2022-04-05, + d3f:CCI-001936_v2022-04-05, + d3f:CCI-001937_v2022-04-05, + d3f:CCI-001941_v2022-04-05, + d3f:CCI-001953_v2022-04-05, + d3f:CCI-001954_v2022-04-05, + d3f:CCI-001957_v2022-04-05, + d3f:CCI-001991_v2022-04-05, + d3f:CCI-002005_v2022-04-05, + d3f:CCI-002009_v2022-04-05, + d3f:CCI-002010_v2022-04-05, + d3f:CCI-002015_v2022-04-05, + d3f:CCI-002016_v2022-04-05, + d3f:CCI-002041_v2022-04-05, + d3f:CCI-002145_v2022-04-05, + d3f:CCI-002165_v2022-04-05, + d3f:CCI-002169_v2022-04-05, + d3f:CCI-002178_v2022-04-05, + d3f:CCI-002179_v2022-04-05, + d3f:CCI-002201_v2022-04-05, + d3f:CCI-002205_v2022-04-05, + d3f:CCI-002207_v2022-04-05, + d3f:CCI-002211_v2022-04-05, + d3f:CCI-002218_v2022-04-05, + d3f:CCI-002233_v2022-04-05, + d3f:CCI-002235_v2022-04-05, + d3f:CCI-002238_v2022-04-05, + d3f:CCI-002262_v2022-04-05, + d3f:CCI-002263_v2022-04-05, + d3f:CCI-002264_v2022-04-05, + d3f:CCI-002272_v2022-04-05, + d3f:CCI-002277_v2022-04-05, + d3f:CCI-002281_v2022-04-05, + d3f:CCI-002282_v2022-04-05, + d3f:CCI-002283_v2022-04-05, + d3f:CCI-002284_v2022-04-05, + d3f:CCI-002289_v2022-04-05, + d3f:CCI-002290_v2022-04-05, + d3f:CCI-002302_v2022-04-05, + d3f:CCI-002306_v2022-04-05, + d3f:CCI-002307_v2022-04-05, + d3f:CCI-002308_v2022-04-05, + d3f:CCI-002309_v2022-04-05, + d3f:CCI-002322_v2022-04-05, + d3f:CCI-002346_v2022-04-05, + d3f:CCI-002347_v2022-04-05, + d3f:CCI-002353_v2022-04-05, + d3f:CCI-002355_v2022-04-05, + d3f:CCI-002357_v2022-04-05, + d3f:CCI-002358_v2022-04-05, + d3f:CCI-002359_v2022-04-05, + d3f:CCI-002361_v2022-04-05, + d3f:CCI-002363_v2022-04-05, + d3f:CCI-002364_v2022-04-05, + d3f:CCI-002381_v2022-04-05, + d3f:CCI-002382_v2022-04-05, + d3f:CCI-002384_v2022-04-05, + d3f:CCI-002385_v2022-04-05, + d3f:CCI-002394_v2022-04-05, + d3f:CCI-002397_v2022-04-05, + d3f:CCI-002400_v2022-04-05, + d3f:CCI-002403_v2022-04-05, + d3f:CCI-002409_v2022-04-05, + d3f:CCI-002411_v2022-04-05, + d3f:CCI-002420_v2022-04-05, + d3f:CCI-002421_v2022-04-05, + d3f:CCI-002422_v2022-04-05, + d3f:CCI-002423_v2022-04-05, + d3f:CCI-002425_v2022-04-05, + d3f:CCI-002426_v2022-04-05, + d3f:CCI-002460_v2022-04-05, + d3f:CCI-002462_v2022-04-05, + d3f:CCI-002463_v2022-04-05, + d3f:CCI-002464_v2022-04-05, + d3f:CCI-002465_v2022-04-05, + d3f:CCI-002466_v2022-04-05, + d3f:CCI-002467_v2022-04-05, + d3f:CCI-002468_v2022-04-05, + d3f:CCI-002470_v2022-04-05, + d3f:CCI-002475_v2022-04-05, + d3f:CCI-002476_v2022-04-05, + d3f:CCI-002530_v2022-04-05, + d3f:CCI-002531_v2022-04-05, + d3f:CCI-002533_v2022-04-05, + d3f:CCI-002536_v2022-04-05, + d3f:CCI-002546_v2022-04-05, + d3f:CCI-002605_v2022-04-05, + d3f:CCI-002607_v2022-04-05, + d3f:CCI-002613_v2022-04-05, + d3f:CCI-002614_v2022-04-05, + d3f:CCI-002617_v2022-04-05, + d3f:CCI-002618_v2022-04-05, + d3f:CCI-002630_v2022-04-05, + d3f:CCI-002631_v2022-04-05, + d3f:CCI-002661_v2022-04-05, + d3f:CCI-002662_v2022-04-05, + d3f:CCI-002684_v2022-04-05, + d3f:CCI-002688_v2022-04-05, + d3f:CCI-002689_v2022-04-05, + d3f:CCI-002690_v2022-04-05, + d3f:CCI-002691_v2022-04-05, + d3f:CCI-002710_v2022-04-05, + d3f:CCI-002711_v2022-04-05, + d3f:CCI-002712_v2022-04-05, + d3f:CCI-002715_v2022-04-05, + d3f:CCI-002716_v2022-04-05, + d3f:CCI-002717_v2022-04-05, + d3f:CCI-002718_v2022-04-05, + d3f:CCI-002723_v2022-04-05, + d3f:CCI-002724_v2022-04-05, + d3f:CCI-002726_v2022-04-05, + d3f:CCI-002729_v2022-04-05, + d3f:CCI-002740_v2022-04-05, + d3f:CCI-002743_v2022-04-05, + d3f:CCI-002746_v2022-04-05, + d3f:CCI-002748_v2022-04-05, + d3f:CCI-002749_v2022-04-05, + d3f:CCI-002771_v2022-04-05, + d3f:CCI-002824_v2022-04-05, + d3f:CCI-002883_v2022-04-05, + d3f:CCI-002890_v2022-04-05, + d3f:CCI-002891_v2022-04-05, + d3f:CCI-003014_v2022-04-05, + d3f:CCI-003123_v2022-04-05 ; + d3f:version "2022-04-05" ; + rdfs:seeAlso . + +d3f:DISA_FSO a d3f:Organization, + owl:NamedIndividual ; + rdfs:label "DISA FSO" ; + d3f:definition "Defense Information Systems Agency (DISA) Field Security Office (FSO)" . + +d3f:CCIControl a owl:Class ; + rdfs:label "CCI Control" ; + rdfs:subClassOf [ a owl:Restriction ; + owl:onProperty d3f:published ; + owl:someValuesFrom xsd:dateTime ], + [ a owl:Restriction ; + owl:onProperty d3f:member-of ; + owl:someValuesFrom d3f:ControlCorrelationIdentifierCatalog ], + [ a owl:Restriction ; + owl:onProperty d3f:control-name ; + owl:someValuesFrom xsd:string ], + d3f:ExternalControl . + +[] a owl:AllDisjointClasses ; + owl:members ( d3f:CoefficientOfVariation d3f:InterquartileRange d3f:MeanAbsoluteDeviation d3f:MedianAbsoluteDeviation d3f:Range d3f:StandardDeviation d3f:Variance ) . + +[] a owl:AllDisjointClasses ; + owl:members ( d3f:GeometricMean d3f:HarmonicMean d3f:Mean d3f:Median d3f:Mode d3f:TrimmedMean d3f:WeightedMean ) . + +[] a owl:AllDisjointClasses ; + owl:members ( d3f:Classifying d3f:Forecasting d3f:Generation d3f:Matching d3f:Summarizing ) . + +[] a owl:AllDisjointClasses ; + owl:members ( d3f:Kurtosis d3f:Moments d3f:Skewness ) . + +[] a owl:AllDisjointClasses ; + owl:members ( d3f:Clustering d3f:Grouping d3f:Histogramming ) . diff --git a/sparql-101/notebooks/guestbook-all-in-one.yaml b/sparql-101/notebooks/guestbook-all-in-one.yaml new file mode 100644 index 0000000..a223dab --- /dev/null +++ b/sparql-101/notebooks/guestbook-all-in-one.yaml @@ -0,0 +1,149 @@ +apiVersion: v1 +kind: Service +metadata: + name: redis-master + labels: + app: redis + tier: backend + role: master +spec: + ports: + - port: 6379 + targetPort: 6379 + selector: + app: redis + tier: backend + role: master +--- +apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1 +kind: Deployment +metadata: + name: redis-master +spec: + selector: + matchLabels: + app: redis + role: master + tier: backend + replicas: 1 + template: + metadata: + labels: + app: redis + role: master + tier: backend + spec: + containers: + - name: master + image: registry.k8s.io/redis:e2e # or just image: redis + resources: + requests: + cpu: 100m + memory: 100Mi + ports: + - containerPort: 6379 +--- +apiVersion: v1 +kind: Service +metadata: + name: redis-replica + labels: + app: redis + tier: backend + role: replica +spec: + ports: + - port: 6379 + selector: + app: redis + tier: backend + role: replica +--- +apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1 +kind: Deployment +metadata: + name: redis-replica +spec: + selector: + matchLabels: + app: redis + role: replica + tier: backend + replicas: 2 + template: + metadata: + labels: + app: redis + role: replica + tier: backend + spec: + containers: + - name: replica + image: gcr.io/google_samples/gb-redisslave:v1 + resources: + requests: + cpu: 100m + memory: 100Mi + env: + - name: GET_HOSTS_FROM + value: dns + # If your cluster config does not include a dns service, then to + # instead access an environment variable to find the master + # service's host, comment out the 'value: dns' line above, and + # uncomment the line below: + # value: env + ports: + - containerPort: 6379 +--- +apiVersion: v1 +kind: Service +metadata: + name: frontend + labels: + app: guestbook + tier: frontend +spec: + # comment or delete the following line if you want to use a LoadBalancer + type: NodePort + # if your cluster supports it, uncomment the following to automatically create + # an external load-balanced IP for the frontend service. + # type: LoadBalancer + ports: + - port: 80 + selector: + app: guestbook + tier: frontend +--- +apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1 +kind: Deployment +metadata: + name: frontend +spec: + selector: + matchLabels: + app: guestbook + tier: frontend + replicas: 3 + template: + metadata: + labels: + app: guestbook + tier: frontend + spec: + containers: + - name: php-redis + image: gcr.io/google-samples/gb-frontend:v5 + resources: + requests: + cpu: 100m + memory: 100Mi + env: + - name: GET_HOSTS_FROM + value: dns + # If your cluster config does not include a dns service, then to + # instead access environment variables to find service host + # info, comment out the 'value: dns' line above, and uncomment the + # line below: + # value: env + ports: + - containerPort: 80 diff --git a/sparql-101/notebooks/guestbook.ttl b/sparql-101/notebooks/guestbook.ttl new file mode 100644 index 0000000..085fe5b --- /dev/null +++ b/sparql-101/notebooks/guestbook.ttl @@ -0,0 +1,249 @@ +@prefix d3f: . +@prefix k8s: . +@prefix rdf: . +@prefix rdfs: . + +k8s:Application a rdfs:Class ; + rdfs:subClassOf k8s:Kind . + +k8s:BuildConfig a rdfs:Class ; + rdfs:subClassOf k8s:Kind . + +k8s:Cluster a rdfs:Class ; + rdfs:subClassOf d3f:ContainerOrchestrationSoftware, + k8s:Kind . + +k8s:ConfigMap a rdfs:Class ; + rdfs:subClassOf d3f:ConfigurationResource, + k8s:Kind . + +k8s:Container a rdfs:Class ; + rdfs:subClassOf d3f:ContainerProcess, + k8s:Kind . + +k8s:Deployment a rdfs:Class ; + rdfs:subClassOf d3f:ApplicationConfiguration, + k8s:Kind, + k8s:Workload . + +k8s:DeploymentConfig a rdfs:Class ; + rdfs:subClassOf d3f:ApplicationConfiguration, + k8s:Kind . + +k8s:Endpoints a rdfs:Class ; + rdfs:subClassOf d3f:NetworkService, + k8s:Kind . + +k8s:Host a rdfs:Class ; + rdfs:subClassOf d3f:NetworkNode, + k8s:Kind . + +k8s:Image a rdfs:Class ; + rdfs:subClassOf d3f:ContainerImage, + k8s:Kind . + +k8s:ImageStream a rdfs:Class ; + rdfs:subClassOf d3f:ContainerImage, + k8s:Kind . + +k8s:Kind a rdfs:Class . + +k8s:Namespace a rdfs:Class ; + rdfs:subClassOf k8s:Kind . + +k8s:Node a rdfs:Class ; + rdfs:subClassOf d3f:Server, + k8s:Kind . + +k8s:PersistentVolumeClaim a rdfs:Class ; + rdfs:subClassOf d3f:Volume, + k8s:Kind . + +k8s:Port a rdfs:Class ; + rdfs:subClassOf d3f:NetworkService, + k8s:Kind . + +k8s:Registry a rdfs:Class ; + rdfs:subClassOf d3f:SoftwareArtifactServer . + +k8s:Route a rdfs:Class ; + rdfs:subClassOf d3f:InternetNetworkTraffic, + k8s:Kind . + +k8s:Secret a rdfs:Class ; + rdfs:subClassOf d3f:ConfigurationResource, + d3f:Credential, + k8s:Kind . + +k8s:Service a rdfs:Class ; + rdfs:subClassOf d3f:IntranetNetworkTraffic, + k8s:Kind . + +k8s:Workload a rdfs:Class ; + rdfs:subClassOf k8s:Kind . + + a k8s:Registry ; + k8s:hasChild . + + a k8s:Registry ; + k8s:hasChild , + . + +k8s:CronJob rdfs:comment "Runs on a schedule" ; + rdfs:subClassOf k8s:Workload . + +k8s:HorizontalPodAutoscaler rdfs:comment "Automatically scales the number of Pods in a replication controller, deployment, replica set or stateful set based on observed CPU utilization (or, with custom metrics support, on some other application-provided metrics)" ; + rdfs:subClassOf k8s:Workload ; + k8s:scaleTarget [ a d3f:Workload ] . + +k8s:Job rdfs:comment "Runs only once" ; + rdfs:subClassOf k8s:Workload . + +k8s:Pod rdfs:label "Pod" ; + d3f:contains [ a k8s:Container ] ; + d3f:hasClusterIP [ a d3f:IPAddress ] ; + d3f:hasNetNs [ a ] ; + d3f:runsOn [ a k8s:Node ] ; + rdfs:comment "A group of one or more containers, with shared storage/network, and a specification for how to run the containers" ; + rdfs:subClassOf k8s:Kind . + +k8s:ReplicaSet rdfs:subClassOf k8s:Workload . + +k8s:Selector rdfs:subClassOf d3f:NetworkService . + +k8s:StatefulSet rdfs:subClassOf k8s:Workload . + +k8s:accesses a rdf:Property ; + rdfs:subPropertyOf k8s:connected . + +k8s:cluster k8s:hasChild . + +k8s:executes a rdf:Property ; + rdfs:subPropertyOf k8s:connected . + +k8s:hasApplication a rdf:Property ; + rdfs:subPropertyOf k8s:connected . + +k8s:hasImage a rdf:Property ; + rdfs:subPropertyOf k8s:connected . + +k8s:hasNamespace a rdf:Property . + +k8s:hasSelector a rdf:Property ; + rdfs:subPropertyOf k8s:connected . + +k8s:runsOn a rdf:Property ; + rdfs:domain k8s:DaemonSet ; + rdfs:range k8s:Node ; + rdfs:subPropertyOf k8s:connected . + + d3f:accesses . + + d3f:accesses . + + d3f:accesses . + + a k8s:Application ; + k8s:hasChild . + + a k8s:Application ; + k8s:hasChild , + . + + a k8s:Deployment ; + rdfs:label "dc/frontend" ; + d3f:runs ; + k8s:hasChild ; + k8s:hasNamespace . + + a k8s:Deployment ; + rdfs:label "dc/redis-master" ; + d3f:runs ; + k8s:hasChild ; + k8s:hasNamespace . + + a k8s:Deployment ; + rdfs:label "dc/redis-replica" ; + d3f:runs ; + k8s:hasChild ; + k8s:hasNamespace . + +k8s:DaemonSet rdfs:comment "Ensures that all (or some) Nodes run a copy of a Pod" ; + rdfs:subClassOf k8s:Workload . + + a k8s:Host ; + d3f:accesses . + + a k8s:Host ; + d3f:accesses . + + a k8s:Host ; + d3f:accesses . + + a k8s:Container ; + rdfs:label "php-redis" ; + d3f:runs ; + k8s:hasImage . + + a k8s:Container ; + rdfs:label "master" ; + d3f:runs ; + k8s:hasImage . + + a k8s:Container ; + rdfs:label "replica" ; + d3f:runs ; + k8s:hasImage . + + a k8s:Service ; + rdfs:label "svc/frontend" ; + k8s:hasChild , + , + ; + k8s:hasHost ; + k8s:hasNamespace ; + k8s:hasPort . + + a k8s:Service ; + rdfs:label "svc/redis-master" ; + k8s:hasChild , + , + ; + k8s:hasHost ; + k8s:hasNamespace ; + k8s:hasPort ; + k8s:portForward "6379-TCP>6379" . + + a k8s:Service ; + rdfs:label "svc/redis-replica" ; + k8s:hasChild , + , + ; + k8s:hasHost ; + k8s:hasNamespace ; + k8s:hasPort . + + a k8s:Image . + + a k8s:Image . + + a k8s:Image . + + a k8s:Port . + + a k8s:Port . + + a k8s:Port . + +k8s:connected a rdf:Property . + + a k8s:Namespace ; + rdfs:label "default_" ; + k8s:hasChild , + , + , + , + , + , + , + . diff --git a/sparql-101/notebooks/tools.py b/sparql-101/notebooks/tools.py index 4aa25ea..44584d7 100644 --- a/sparql-101/notebooks/tools.py +++ b/sparql-101/notebooks/tools.py @@ -1,6 +1,7 @@ import re import networkx as nx +import pandas as pd from bokeh.io import output_notebook, show from bokeh.models import Circle, ColumnDataSource, HoverTool, LabelSet, MultiLine from bokeh.plotting import figure, from_networkx @@ -12,7 +13,6 @@ from bokeh.models import ( BoxSelectTool, Circle, - EdgesAndLinkedNodes, HoverTool, MultiLine, NodesAndLinkedEdges, @@ -21,10 +21,21 @@ from bokeh.palettes import Spectral4 +def default_layout(G): + df = pd.DataFrame(index=G.nodes(), columns=G.nodes()) + for row, data in nx.shortest_path_length(G): + for col, dist in data.items(): + df.loc[row, col] = dist + + df = df.fillna(df.max().max()) + + return nx.kamada_kawai_layout(G, dist=df.to_dict()) + + def plot_graph( g, label_property=None, - layout=nx.circular_layout, + layout=None, limit: int = 0, pattern=None, line_color="gray", @@ -47,15 +58,35 @@ def plot_graph( G = rdflib_to_networkx_multidigraph(f) fig = fig or figure(title="RDF Graph Visualization with Bokeh") fig.add_tools(HoverTool(tooltips=None), TapTool(), BoxSelectTool()) - radius = 0.01 + + # Generate a customized layout if not provided. + if not layout: + layout = default_layout(G) + + # Calculate node degrees + degrees = dict(G.degree()) + max_degree = max(degrees.values()) if degrees else 1 + # Convert the networkx graph to a Bokeh graph renderer using the computed layout graph_renderer = from_networkx(G, layout, scale=1, center=(0, 0)) - graph_renderer.node_renderer.glyph = Circle(radius=radius, fill_color="fill_color") + + # Normalize node sizes based on degree + # Add node sizes to the data source + node_sizes = { + node: 0.01 + (degree / max_degree) * 0.05 for node, degree in degrees.items() + } + graph_renderer.node_renderer.data_source.data["node_size"] = [ + node_sizes[node] for node in G.nodes() + ] + + graph_renderer.node_renderer.glyph = Circle( + radius="node_size", fill_color="fill_color" + ) graph_renderer.node_renderer.selection_glyph = Circle( - radius=3 * radius, fill_color=Spectral4[2] + radius="node_size", fill_color=Spectral4[2] ) graph_renderer.node_renderer.hover_glyph = Circle( - radius=3 * radius, fill_color=Spectral4[1] + radius="node_size", fill_color=Spectral4[1] ) graph_renderer.edge_renderer.glyph = MultiLine( @@ -66,7 +97,7 @@ def plot_graph( ) graph_renderer.edge_renderer.hover_glyph = MultiLine(line_color="red", line_width=5) graph_renderer.selection_policy = NodesAndLinkedEdges() - graph_renderer.inspection_policy = EdgesAndLinkedNodes() + graph_renderer.inspection_policy = NodesAndLinkedEdges() fig.renderers.append(graph_renderer) @@ -114,3 +145,8 @@ def test_node_label(): g.parse("https://dbpedia.org/data/Tortelloni.n3", format="n3") node = URIRef("http://dbpedia.org/resource/Broth") assert node_label(g, node, RDFS.label) == "Broth" + + +def test_inputsource(): + g = Graph() + g.parse("https://dbpedia.org/data/Tortelloni.n3", format="n3") diff --git a/sparql-101/tox.ini b/sparql-101/tox.ini index 268e6e7..cee54b2 100644 --- a/sparql-101/tox.ini +++ b/sparql-101/tox.ini @@ -5,7 +5,7 @@ skipsdist = True [testenv] deps = git+https://github.com/ioggstream/notedown -whitelist_externals = +allowlist_externals = make commands = make From dfbaccabcd7aeef76bca6e8e48901e196e8ceb82 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Tue, 20 May 2025 19:36:41 +0200 Subject: [PATCH 44/52] Fix: #86. Add Datasets. (#88) * Split semantics and knowledge. * SparQL * Countries. * Traversing with sparql. * Construct. * Add json-ld * Context mangling * Add rdflib.Dataset. * Enriching data. --- sparql-101/00-teaser.md | 79 +- sparql-101/01-intro-jsonld.md | 538 - sparql-101/01-knowledge.md | 477 + sparql-101/02-semantics.md | 368 + sparql-101/02-sparql.md | 260 - sparql-101/05-sparql.md | 395 + sparql-101/07-jsonld.md | 253 + ...ntax-semantic.md => 09-syntax-semantic.md} | 3 + sparql-101/10-rdf.md | 315 + sparql-101/11-sparql-metadata.md | 274 + sparql-101/12-enriching-data.md | 300 + sparql-101/Makefile | 2 +- sparql-101/README.md | 53 + sparql-101/notebooks/00-jupyter-intro.ipynb | 28 +- sparql-101/notebooks/00-teaser.ipynb | 155 +- sparql-101/notebooks/01-intro-jsonld.ipynb | 1064 - sparql-101/notebooks/01-knowledge.ipynb | 970 + sparql-101/notebooks/02-semantics.ipynb | 671 + sparql-101/notebooks/02-sparql.ipynb | 487 - sparql-101/notebooks/05-sparql.ipynb | 780 + sparql-101/notebooks/07-jsonld.ipynb | 492 + ...emantic.ipynb => 09-syntax-semantic.ipynb} | 226 +- sparql-101/notebooks/10-rdf.ipynb | 551 + sparql-101/notebooks/11-sparql-metadata.ipynb | 464 + sparql-101/notebooks/12-enriching-data.ipynb | 489 + sparql-101/notebooks/countries.ttl | 36438 ++++++++++++++++ sparql-101/notebooks/sample.ttl | 35 + sparql-101/notebooks/simpsons.ttl | 15 + sparql-101/notebooks/tools.py | 2 + sparql-101/requirements.txt | 9 + sparql-101/tox.ini | 2 + 31 files changed, 43642 insertions(+), 2553 deletions(-) delete mode 100644 sparql-101/01-intro-jsonld.md create mode 100644 sparql-101/01-knowledge.md create mode 100644 sparql-101/02-semantics.md delete mode 100644 sparql-101/02-sparql.md create mode 100644 sparql-101/05-sparql.md create mode 100644 sparql-101/07-jsonld.md rename sparql-101/{03-syntax-semantic.md => 09-syntax-semantic.md} (99%) create mode 100644 sparql-101/10-rdf.md create mode 100644 sparql-101/11-sparql-metadata.md create mode 100644 sparql-101/12-enriching-data.md create mode 100644 sparql-101/README.md delete mode 100644 sparql-101/notebooks/01-intro-jsonld.ipynb create mode 100644 sparql-101/notebooks/01-knowledge.ipynb create mode 100644 sparql-101/notebooks/02-semantics.ipynb delete mode 100644 sparql-101/notebooks/02-sparql.ipynb create mode 100644 sparql-101/notebooks/05-sparql.ipynb create mode 100644 sparql-101/notebooks/07-jsonld.ipynb rename sparql-101/notebooks/{03-syntax-semantic.ipynb => 09-syntax-semantic.ipynb} (79%) create mode 100644 sparql-101/notebooks/10-rdf.ipynb create mode 100644 sparql-101/notebooks/11-sparql-metadata.ipynb create mode 100644 sparql-101/notebooks/12-enriching-data.ipynb create mode 100644 sparql-101/notebooks/countries.ttl create mode 100644 sparql-101/notebooks/sample.ttl create mode 100644 sparql-101/notebooks/simpsons.ttl create mode 100644 sparql-101/requirements.txt diff --git a/sparql-101/00-teaser.md b/sparql-101/00-teaser.md index fb80e23..da26d16 100644 --- a/sparql-101/00-teaser.md +++ b/sparql-101/00-teaser.md @@ -8,13 +8,20 @@ Author: ## Agenda - 1h. What is semantics and how to describe information in a - meaningful (and machine-readable) way using RDF. + meaningful (and machine-readable) way using Resource Description Format (RDF). - 1h. Storing data or describing knowledge? Practical use of getting security insights from data. - Bonus track: Graphs and semantic search: mixing graphs and vector databases +### Hints + +- **Type in** exercises so you can learn from your mistakes +- If your notebook get stuck, **restart the kernel and run all** cells +- **Repetita iuvant**: concepts will be explained multiple times, + from different perspectives, thoughout various notebooks. + ## Teaser In this course, we will learn how to describe information in a @@ -41,13 +48,13 @@ from rdflib import Graph from rdflib.namespace import FOAF, OWL sentences = """ -PREFIX owl: -PREFIX foaf: -PREFIX : +@prefix owl: . +@prefix foaf: . +@prefix : . :Homer foaf:knows :Marge, :Lisa, :Bart, :Maggie; foaf:interest ; - foaf:firstName "Homer". + foaf:firstName "Homer" . :Lisa foaf:firstName "Lisa"; foaf:interest . @@ -75,21 +82,27 @@ print(json_text) There's plenty of knowledge in the web! ```python +from pathlib import Path from rdflib import Graph from rdflib.namespace import RDFS -import networkx as nx -from requests import get + +# We can parse either a local file or a remote URL. +tortellini_url = "https://dbpedia.org/data/Tortellini.n3" +tortellini_n3 = Path("Tortellini.n3") g = Graph() -g.parse(data=get("https://dbpedia.org/data/Tortellini.n3").text, format="n3") +g.parse(tortellini_n3, format="n3") plot_graph(g, label_property=RDFS.label, limit=30, pattern=".*/dbpedia.org") ``` And we can connect them together ```python +tagliatelle_url = "https://dbpedia.org/data/Tagliatelle.n3" +tagliatelle_n3 = Path("Tagliatelle.n3") + # Extend our graph -g.parse(data=get("https://dbpedia.org/data/Tagliatelle.n3").text, format="n3") +g.parse(tagliatelle_n3, format="n3") plot_graph(g, label_property=RDFS.label, limit=50, pattern=".*/dbpedia.org") ``` @@ -170,8 +183,8 @@ SELECT ?URI, ?concept, ?identifier WHERE { ?URI skos:inScheme euvoc:country ; - dc:identifier ?identifier ; - skos:prefLabel ?concept + skos:prefLabel ?concept ; + dc:identifier ?identifier . FILTER(lang(?concept) = 'en') @@ -184,52 +197,56 @@ LIMIT 5 And their relations ```python -eu.query(""" +result = eu.query(""" PREFIX euvoc: PREFIX skos: PREFIX dct: -# Construct a graph of countries and their identifiers related by dct:replaces +# Construct a new graph of countries and their identifiers related by dct:replaces # countries must be in the euvoc:country scheme. -CONSTRUCT { ?a dct:replaces ?b} +CONSTRUCT { + ?a dct:replaces ?b +} WHERE { - ?a skos:inScheme euvoc:country. - ?b skos:inScheme euvoc:country. + ?a skos:inScheme euvoc:country . + ?b skos:inScheme euvoc:country . ?a dct:replaces ?b . } LIMIT 5 -""").bindings +""") + +list(result.graph) ``` More relations ```python from tools import plot_graph -import networkx as nx +from rdflib.namespace import SKOS ret = eu.query(""" PREFIX skos: - +PREFIX nuts: CONSTRUCT { - -?s skos:narrower ?q - + ?s skos:narrower ?q ; + skos:prefLabel ?label . } WHERE { + # Austrian administrative units. + nuts:AT skos:narrower+ ?q . -?s skos:inScheme ; -skos:narrower ?q ; - "0" -. + ?s skos:inScheme ; + skos:narrower ?q ; + skos:prefLabel ?label + . } -LIMIT 400 +LIMIT 40 """) - -plot_graph(ret.graph, layout=nx.planar_layout) +plot_graph(ret.graph, label_property=SKOS.prefLabel,) ``` --- @@ -299,9 +316,9 @@ WHERE { } """)) -print('\n'.join(sorted([ +print(*sorted([ (f"Attack: {a['attack_label']}," f" {a['affects'].fragment} {a['artifact'].fragment} for {a['uri']}") for a in attack_surface -]))) +]), sep="\n") ``` diff --git a/sparql-101/01-intro-jsonld.md b/sparql-101/01-intro-jsonld.md deleted file mode 100644 index a33a449..0000000 --- a/sparql-101/01-intro-jsonld.md +++ /dev/null @@ -1,538 +0,0 @@ -# Knowledge Management 101 - -## Agenda - -- Knowledge management -- Semantics what? -- Triples & co -- Attaching semantics -- Graph databases -- JsonLD - -*Beware*: commands may contain small typos. You have to fix them to properly complete the course! - ----- - -Prerequisites: - -- json, yaml, xmlschema -- HTTP, OpenAPI 3 -- SQL and database hints - ---- - -## Intro: What is knowledge? - -Knowledge is a set of information that is useful for a given purpose. - -We express knowledge through language and symbols -in various forms: text, images, and sounds. - -To use knowledge we need to: - -- sense; -- interpret; -- understand. - -When reading a book, for example, we not only need to read and understand the words, -but also to interpret the meaning of the sentences and paragraphs -based on the context and our previous knowledge. - ----- - -## Intro: The Encyclopedia - -The Encyclopedia was one of the first attempts to organize knowledge, -and to make it available to the public. - -Today, we have various encyclopedias on the web, -such as Wikipedia and dbpedia. - -Exercise: open the "Python" page on dbpedia: - -- https://dbpedia.org/page/Python_(programming_language) - -And on Wikidata: - -- https://www.wikidata.org/wiki/Q28865 - ----- - -## Intro: The Encyclopedia - -Knowledge is organized in a graph structure, -where each node is a concept and the edges are the relationships between them. - -```mermaid -graph LR - -subgraph dbpedia[DBpedia] - dbr:Python[Python] -->|designer| dbr:gvr[Guido van Rossum] - dbr:Python[Python] -->|operating System| dbr:win[Windows] & dbr:linux[Linux] & ... - dbr:gvr -->|born| dbr:nl[Netherlands] -end - -subgraph wikidata[WikiData] - wd:Q30942[Guido van Rossum] ---|developer| wd:Q28865[Python] - wd:Q16402[Monty Python] ---|named after| wd:Q28865 -end - -wd:Q28865 -.-|same as| dbr:Python -wd:Q30942 -.-|same as| dbr:gvr -``` - -This is the basis of the Semantic Web, -where knowledge is represented in a machine-readable format, -but it is also the basis of the Web itself -(e.g., see [Web Linking RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288)). - ----- - -## Intro: The Encyclopedia - -The above graph can be expressed by sentences such as: - -- Python is named after Monty Python. -- Guido van Rossum is the designer of Python. -- Python runs on Linux. - -their general form is - -```mermaid -graph LR -subject((subject)) --- predicate(predicate) --> object -``` - -## Intro: The Encyclopedia - -Encyclopedia voices on Wikipedia and dbpedia are expressed in -[Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/). - -It is a formal language to represent knowledge in a machine-readable format -using triples of the form `subject predicate object`. - -Let's translate the above definition from English to RDF: - -> Tortellini are a typical Italian food, ->
made with pasta filled with meat such as prosciutto. - -becomes something like - -```turtle -:Tortellini a :Food . -:Tortellini :country dbr:Italy . -:Tortellini :relatedTo dbr:Prosciutto . -``` - -## Exercise: Get a voice from dbpedia - -Now, let's get the actual voice from dbpedia -using the python RDF library. - -```python -# Get a voice from dbpedia using rdflib -from rdflib import Graph - -# What's Tortellini? -g = Graph() -g.parse("https://dbpedia.org/data/Tortellini.ttl", format="turtle") -``` - -We get a graph with the information about Tortellini. - -```mermaid -graph LR - subgraph dbpedia[DBpedia] - dbr:Tortellini[Tortellini] -->|is a| dbo:Food[Food] - dbr:Tortellini -->|related to| dbr:Prosciutto[Prosciutto] - dbr:Tortellini -->|country| dbp:Italy[Italy] - ... - end -``` - -An encyclopedia voice contains a list of sentences :) - -```python -# List all the details about Tortellini. -sentences = list(g) - -print('\n'.join([str(s) for s in sentences])) -``` - -Exercise: - -- how many sentences are there? -- how many elements does each sentence have? - - ----- - -```python -from rdflib.namespace import RDF, RDFS, FOAF - -# Now we get specific properties from the graph. -_type = list(g.objects(predicate=RDF.type)) -print(_type) -``` - - -```python -import rdflib -from rdflib.extras.external_graph_libs import rdflib_to_networkx_multidigraph -import networkx as nx -import matplotlib.pyplot as plt - -G = rdflib_to_networkx_multidigraph(g) - -# Plot Networkx instance of RDF Graph -pos = nx.spring_layout(G, scale=2) -edge_labels = nx.get_edge_attributes(G, 'r') -nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels) -nx.draw(G, with_labels=True) - -#if not in interactive mode for -plt.show() - -``` - -## Intro: Semantics what? - -Semantics: the study of meaning. - -Semantics ensures that a message is understood; -messages include data and HTTP exchanges. - -Here are some ambiguous messages: - -```yaml -name: FABIANO Romildo -income: 4_000_000 -``` - -Is this a given name or a full name? -What is the currency of the income? -Is it a monthly or yearly income? - ----- - -Integrating data from different sources is difficult because of the lack of semantic interoperability. - - -```mermaid -graph LR -Am>"{name: FABIANO Romildo\nincome: 4_000_000}"] -Cm>"{givenName: FABIANO\nfamilyName: Romildo\ntax: 12_000EUR}"] -B((Data sink)) - -A((Data source 1)) ---Am --> B -C((Data source 3)) ---Cm --> B -``` - ----- - -Identifiers may differ between systems, -and even registry data are not always interoperable. - -```mermaid -graph LR -Am>"{givenName: Angela\nfamilyName: Merkel\ndate_of_birth: 1954-07-17}"] -Cm>"{givenName: Angela\nfamilyName: Kasner\ndate_of_birth: 1954-07-17}"] -B((Data sink)) - -A((Data source 1)) ---Am --> B -C((Data source 3)) ---Cm --> B -``` - ----- - -The lack of standardization in the format and meaning of data -hinders interoperability between the databases of different organizations, -and even inside different branches of the same organization, -and therefore the creation of digital services. - -A first example is the lack of syntactic interoperability: -a well-defined entity (eg. the tax code) is represented with different fields or formats: - -``` -{"tax_code": "MRORSS77T05E472W"} -{"cf": "mrorss77T05E472W"} -{"taxCode": "MRORSS77T05E472W"} -``` - ----- - -Another example is semantic interoperability: the concept of family has different meanings (eg. in the fiscal domain, in the registry domain, ..): - -```yaml -relatives: - - name: Mario Rossi - relationship: father - - name: Carla Rossi - relationship: sister - cohabiting: false -``` - -```yaml -relatives: - - name: Mario Rossi - relationship: padre -``` - ---- - -## Vocabularies to the rescue - -Controlled Vocabularies use URIs to disambiguate the meaning of terms and provide semantics. - -Every term is identified by an absolute URI. -The prefix identifies the vocabulary name, -and the suffix identifies the term. - -```python - -dog_uri = "https://dbpedia.org/data/Dog" - -``` - - -To semantically standardize data, services and their content, conceptual tools such as ontologies and controlled vocabularies (codelist, taxonomies, ..) are used. - -Ontology: an ontology is a set of logical axioms that conceptualize a domain of interest by defining concepts and the semantics of relationships between them. - -When ontologies contain further restrictions (e.g., - -Controlled vocabulary: a vocabulary where the terms are validated by a designated authority. -It can be of different types - EG.A list (codelist), a hierarchical structure (taxonomy), a glossary and a tesauro (which adds further constraints to a taxonomy). - -Examples of European controlled vocabularies are found here https://op.europa.eu/en/web/eu-vocabularies/controlled-vocabularies - -## Syntax standardization - -Data model: a data model, or data schema is a formal representation/description and machine-penadable of the actual or potential content of the data contained in a separate object. - -In other words, it is the set of semantic and sequential instructions that can be used -to check the stored input in a given file, -or to connect a file that respects these instructions to a system or an application of exchange of information. - -There are several formats to describe the patterns, -including XML Schema and JSON Schema. Formal definition of the syntax of an entity. -See https://json-schema.org/understanding-json-schema/about.html - -A Controlled vocabulary may support syntactic standardization. - ----- - -Per standardizzare sintatticamente i servizi serve pubblicare degli schemi dati a cui tutte le organizzazioni devono conformarsi. Storicamente la standardizzazione degli schemi dati si basa sul concetto di namespace eventualmente distribuiti - vedi il formato di specifica XSD. - -Se in ecosistemi ben definiti questo approccio funziona, al crescere della dimensione si pongono una serie di problematiche legate sia alla compattezza dei dati trasportati che del contesto di sicurezza legato ad esempio alla eventuale necessità di dereferenziare gli URI (eg. https://owasp.org/www-pdf-archive/XML_Based_Attacks_-_OWASP.pdf ) . - -Mentre poi la metadatazione delle pagine tramite json-ld ha come platea principale i sistemi di processamento batch dei motori di ricerca, i dati convogliati tramite API vengono sempre più frequentemente processati da applicazioni mobile che hanno dei vincoli sia in termini di banda che di consumo di risorse (eg. batteria dei cellulari, riscaldamento) più stringenti. - -Inoltre la creazione di servizi sempre più integrati porta ad un aumento del numero di richieste, e della conseguente necessità di supportare in maniera sostenibile i carichi sui sistemi IT. - ---- - -## Defining semantic contents - -Semantic contents are defined through -sentences of the form -`subject predicate object` -and their sets (called graphs). - -Here is an example of a graph with three sentences: - -``` -"the dog" "has the color" "black" -"the dog" "is an" "animal" -"black" "is a" "color" -``` - -and an associated formal description in text/turle - -``` -prefix animals: -prefix colors: - -animals:dog colors:hasColor colors:black -colors:black a colors:Color -animals:dog a animals:Animal -``` - ----- - -RDF: Resource Description Framework - -allows to represent information on the web based on two data structures: - -- **elements** (IRIs, blank nodes and literals); -- **triples** (subject-predicate-object); -- **graphs** (sets of triples). - -and on **vocabularies** of elements identified by IRIs and namespaces. - -An RDF dataset is a set of **graphs**. - ----- - -#### Ontologies - -To standardize the semantics of digital content, -we use ontologies. - -In Italy, there's the official ontology of person -(Common Person Vocabulary) that we can use to uniquely describe someone. - -``` -@prefix cpv: . - - cpv:givenName "Roberto" . - cpv:familyName "Polli" . - -``` - ----- - -An ontology is defined by a set of IRIs and their relationships. - -``` -@prefix xsd:   . -@prefix dct:   . - -https://w3id.org/italia/onto/CPV dct:modified  "2020-04-27"^^xsd:date ; -https://w3id.org/italia/onto/CPV dct:title     "Person Ontology"@en, - "Ontologia delle persone"@it ; - -``` - ---- - -### Json-LD - -JSON-LD è un formato che permette di serializzare in JSON delle informazioni basate sul -[RDF data model](https://www.w3.org/TR/json-ld11/#data-model). - -Un documento JSON-LD è quindi sia un documento RDF che JSON, e rappresenta un'istanza di un RDF data model. - -JSON-LD inoltre *estende* RDF per permettere la serializzazione di dataset RDF generalizzati. - ----- -Dato un oggetto JSON - -```yaml -id: robipolli@gmail.com -given_name: Roberto -family_name: Polli -``` - -JSON-LD permette di trasformarlo in un grafo RDF associandogli un contesto. - -```yaml -"@context": - cpv: "https://w3id.org/italia/onto/CPV" - given_name: "cpv:givenName" - family_name: "cpv:familyName" - id: "@id" -id: robipolli@gmail.com -given_name: Roberto -family_name: Polli -``` - ---- - -Oltre all'ontologia italiana, un altro vocabolario -molto usato sul web è www.schema.org. Le parole chiave -che definisce sono disponibili in formato json-ld -https://schema.org/docs/jsonldcontext.jsonld - ---- - -È anche possibile ridefinire o localizzare i campi, -eventualmente usando diversi namespace. - -```yaml -"@context": - "sdo": "http://schema.org/" - "nome":"sdo:name" - "nome_proprio": "sdo:givenName" -"@type": "Person" - "nome": "Jane Doe" - "nome_proprio": "Jane" - "sdo:jobTitle": "Professor" - "sdo:telephone": "(425) 123-4567" -``` - ---- - -### Localizzazione - -JSON-LD supporta nativamente informazioni -localizzate: - -```yaml --- come lista -occupation: --  @value: "Student" -   @language: en --  @value: "Etudiant" -   @language: fr -``` - -oppure - -```yaml --- come oggetto -@context: -  occupation: -    @container: @language -occupation: -  en: Student -  fr: Etudiant -``` - -oppure - -```yaml ---- tramite elementi multipli, utile anche per la serializzazione di API semplici -@context: - occupation: {@language: en} - occupation_fr: {@language: fr} -occupation: Student -occupation_fr: Etudiant -``` - ---- - -#### Context mangling - -@context mangling: modificando il contesto di un oggetto -se ne altera il significato. - -```yaml -payment_from: alice@foo.example -payment_to: bob@foo.example -"@context": https://payment/context.jsonld -``` - -Alterando la risposta del server https://payment/context.jsonld -possiamo invertire il verso del pagamento! - -```yaml -@context: - payment_from: http://banking#debtor - payment_to: http://banking#creditor -``` - --> - -```yaml -@context: - payment_to: http://banking#debtor - payment_from: http://banking#creditor -``` - ----- - -Esistono diverse ipotesi tecnologiche basate -sull'elaborazione semantica dei dati a runtime. -Tutte queste implementazioni devono indirizzare -questo tipo di rischi. diff --git a/sparql-101/01-knowledge.md b/sparql-101/01-knowledge.md new file mode 100644 index 0000000..30859c1 --- /dev/null +++ b/sparql-101/01-knowledge.md @@ -0,0 +1,477 @@ +# Knowledge Management 101 + +## Agenda + +- What is knowledge? +- Knowledge and graphs +- RDF: machine-readable knowledge + +*Beware*: commands may contain small typos. You have to fix them to properly complete the course! + +---- + +Prerequisites: + +- json, yaml, xmlschema +- HTTP, OpenAPI 3 +- SQL and database hints + +```python +# rdflib is a python library to work with resources. +%pip install rdflib +``` + +--- + + + +## What is knowledge? + +Knowledge is a set of information that is useful for a given purpose. + +We express knowledge through language and symbols +in various forms: text, images, and sounds. + +---- + +To use knowledge we need to: + +- sense; +- interpret; +- understand. + +---- + +When reading a book, we need to: + +- read and understand the words, +- interpret the meaning of the sentences and paragraphs; +- understand the meaning of the text as a whole. + +This requires an awareness of the context +and our previous knowledge. + +---- + +## What is knowledge? The Encyclopedia + +The [Encyclopédie](https://en.wikipedia.org/wiki/Encyclop%C3%A9die) +was one of the first modern attempts to organize knowledge, +and to make it available to the public. + +Its voices can be basically seen as a collection of sentences, +each of the form + +```mermaid +graph LR +subject((subject)) --- predicate(predicate) --> object +``` + +---- + +Every term is identified by an absolute URI. + +The prefix identifies the vocabulary name, +and the suffix identifies the term. + +```python +from rdflib import URIRef +dog_uri = URIRef("https://dbpedia.org/data/Dog") +``` + +We'll see how to use URIs to express knowledge. + +---- + +For example, an hypotetical Python encyclopedia voice +could be: + +> Python is a programming language +>
designed by Guido van Rossum and +>
named after the Monty Python comedy group. + +---- + +## Knowledge and Graphs + +We can represent this text as a graph + +💡 The object of a sentece +can be the subject of another sentence. + +```mermaid +graph LR +python[Python] -->|is a| programming_language[programming language] +python -->|designed by| gvr[Guido van Rossum] +python -->|named after| monty_python[Monty Python] +monty_python -->|is a| comedy_group[comedy group] +``` + +---- + +There are various encyclopedias on the web, +such as Wikipedia and dbpedia. + +##### Exercise: web encyclopedias + +1. open the "Python" page on dbpedia: + + - + + and on Wikidata: + + - + +2. note that in both sites every + piece of information is expressed in couples + such as "predicate" and "object". + +3. navigate those pages and + click on the links to see how + the information is organized. + +---- + +Since we can represent sentences as graphs, +it is natural to represent and organize knowledge +in a graph structure, +where each node is a concept and the edges are the relationships between them. + +Here is an excerpt from the Python encyclopedia voice of Dbpedia: + +```mermaid +graph LR + +subgraph dbpedia[DBpedia] + dbr:Python[Python] -->|designer| dbr:gvr[Guido van Rossum] + dbr:Python[Python] -->|runs on
operating system| dbr:win[Windows] & dbr:linux[Linux] & ... + dbr:gvr -->|born| dbr:nl[Netherlands] +end + +``` + +---- + +Another example is the Python encyclopedia voice of Wikidata: + +```mermaid +graph LR +subgraph wikidata[WikiData] + wd:Q30942[Guido van Rossum] ---|developer| wd:Q28865[Python] + wd:Q16402[Monty Python] ---|named after| wd:Q28865 +end +``` + +---- + +## Knowledge and Graphs: The Semantic Web + +We can use further knowledge - using exisiting cross-references +between Dbpedia and Wikidata, +or using our own knowledge - to connect the two graphs together. + +```mermaid +graph LR + +subgraph dbpedia[DBpedia] + dbr:Python[Python] -->|designer| dbr:gvr[Guido van Rossum] + dbr:Python[Python] -->|runs on
operating System| dbr:win[Windows] & dbr:linux[Linux] & ... + dbr:gvr -->|born| dbr:nl[Netherlands] +end + + +subgraph wikidata[WikiData] + wd:Q30942[Guido van Rossum] ---|developer| wd:Q28865[Python] + wd:Q16402[Monty Python] ---|named after| wd:Q28865 +end + +wd:Q28865 -.-|same as| dbr:Python +wd:Q30942 -.-|same as| dbr:gvr +``` + +This is the basis of the Semantic Web, +where knowledge is represented in a machine-readable format. + +But it is also the basis of the Web itself +(e.g., see [Web Linking RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288)). + +---- + +## RDF: Machine Readable Knowledge + +Encyclopedia voices on Wikipedia and dbpedia are expressed in +[Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/). + +It is a W3C formal language to represent knowledge in a machine-readable format +using triples subject-predicate-object. + +RDF has different serialization formats, +such as [Turtle](https://www.w3.org/TR/turtle/), +[JSON-LD](https://json-ld.org/), +and [XML](https://www.w3.org/TR/rdf-syntax-grammar/). + +We'll use the Turtle format in this course, +where a sentence is expressed as a + +```raw +subject predicate object . +``` + +:exclamation: note the dot at the end of the sentence :exclamation: + +---- + +## RDF: Machine Readable Knowledge + +Subjects and predicates are uniquely identified by [URIs](https://www.w3.org/TR/rdf11-concepts/#section-uris). + +Objects can be either URIs or literals (strings, numbers, dates, etc.). + +URIs provide a definition context for subjects and predicates, +and allow to disambiguate their meaning depending on the +definition provided by a given vocabulary. + +Every term is identified by an absolute URI +enclosed by `<>`. + +```python +sentences = """ + a . +""" +``` + +---- + +Let's parse our first RDF sentence using the [rdflib](https://rdflib.readthedocs.io/en/stable/) library. + +```python +from rdflib import Graph + +g = Graph() +g.parse(data=sentences, format="turtle") + +print(*g, sep="\n") +``` + +---- + +We can also represent the same sentence in JSON-LD. + +```python +json_text = g.serialize(format="application/ld+json") +print(json_text) +``` + +##### Exercise: take 2 minutes to map the JSON-LD format to the Turtle format. + +We'll see JSON-LD in detail later. + +--- + +## RDF: Namespaces and cURIe + +RDF use namespace prefixes to shorten URIs +(the [cURIe](https://www.w3.org/TR/curie/) syntax). + +```python +sentences = """ +# The @prefix directive defines a namespace prefix +@prefix dbr: . +@prefix dbo: . + +dbr:Tortellini a dbo:Food . +""" + +g1 = Graph() +g1.parse(data=sentences, format="turtle") +print(*g1, sep="\n") +``` + +```python +# Get the namespaces used in the g1 graph. +g1_ns = set(g1.namespaces()) +print(*g1_ns, sep="\n") +``` + +```python +# Expand an entry using predefined namespaces. +g1.namespace_manager.expand_curie("dbr:Lasagne") +``` + +---- + +Another vocabulary could provide a different definition for the same term. +:warning: URI could not always be human-readable. + +```python +from rdflib import URIRef +wikidata_python = URIRef("https://www.wikidata.org/wiki/Q28865") + +wikidata_python +``` + +---- + +Let's express the following English definition in RDF: + +> Tortellini are a typical Italian food, +>
made with pasta filled with meat such as prosciutto. + +We must use different sentences, +and we'll express a generic relationship +with the `dbo:WikiPageWikiLink` +predicate. + +```python +sentences = """ +@prefix : . +@prefix dbp: . +@prefix dbo: . + +:Tortellini a dbo:Food . +:Tortellini dbp:country :Italy . +:Tortellini dbo:WikiPageWikiLink :Prosciutto . +:Meat dbo:WikiPageWikiLink :Prosciutto . +""" +``` + +#### Exercise: parse the sentences using rdflib and answer the following questions + +- how many sentences are there? +- how many subjects are there? +- how many namespaces are there? + +```python +from rdflib import Graph + +tortellini = Graph() + +# Use this cell for the exercise +``` + +#### Exercise: use `Graph.namespaces` to get the namespaces added by the sentences above + +```python +from rdflib import Graph + +default_ns = set(Graph().namespaces()) + +# Use this cell for the exercise +``` + +#### Exercise: serialize the above graph in JSON-LD format + +```python +# Use this cell for the exercise +tortellini_jsonld = ... +``` + +#### Exercise: Load the JSON-LD object in a variable + +- What's the type and len of the serialized object? +- What's in the first element of the serialized object? + +```python +import json + +# Use this cell for the exercise +... +``` + +#### Exercise: Get a voice from dbpedia + +Now, let's get the actual voice from dbpedia. + +```python +# Get a voice from dbpedia using rdflib +from rdflib import Graph +tortellini_url = "https://dbpedia.org/data/Tortellini.n3" +tortellini_n3 = Path("Tortellini.n3") + +# What are Tortellini? +g = Graph() +g.parse(tortellini_url, format="turtle") +``` + +We get a graph with the information about Tortellini. + +```mermaid +graph LR + subgraph dbpedia[DBpedia] + dbr:Tortellini[Tortellini] -->|is a| dbo:Food[Food] + dbr:Tortellini -->|related to| dbr:Prosciutto[Prosciutto] + dbr:Tortellini -->|country| dbp:Italy[Italy] + ... + end +``` + +An encyclopedia voice contains a list of sentences :) + +```python +# List all the details about Tortellini. +sentences = list(g) +excerpt = sentences[0:15] +print(*[str(s) for s in excerpt], sep="\n") +``` + +#### Exercise: counting sentences + +- how many sentences are there? +- how many elements does each sentence have? + +```python +# Use this cell for the exercise +``` + +---- + +```python +from rdflib.namespace import RDF, RDFS, FOAF + +# Now we get specific properties from the graph. +_type = list(g.objects(predicate=RDF.type)) +print(_type) +``` + +```python +from tools import plot_graph +plot_graph(g, limit=30) +``` + +#### Exercise: extending graphs + +There's plenty of knowledge in the web! + +```python +from rdflib import Graph +from rdflib.namespace import RDFS + +tortellini_url = "https://dbpedia.org/data/Tortellini.n3" +tortellini_n3 = Path("Tortellini.n3") + +g = Graph() +g.parse(tortellini_n3, format="n3") +plot_graph(g, limit=30, pattern=".*/dbpedia.org") +``` + +And we can connect them together + +```python +tagliatelle_url = "https://dbpedia.org/data/Tagliatelle.n3" +tagliatelle_n3 = Path("Tagliatelle.n3") +# Extend our graph +g.parse(tagliatelle_n3, format="n3") +``` + +Exercise: how many sentences are there now? + +```python +# Use this cell for the exercise +``` + +Plot the graph again to see the new nodes and +their relations. + +```python +plot_graph(g, label_property=RDFS.label, limit=50, pattern=".*/dbpedia.org") +``` diff --git a/sparql-101/02-semantics.md b/sparql-101/02-semantics.md new file mode 100644 index 0000000..5e236c0 --- /dev/null +++ b/sparql-101/02-semantics.md @@ -0,0 +1,368 @@ +# Knowledge Management 101 + +## Agenda + +- Semantics what? +- Triples & co +- Attaching semantics +- Graph databases +- JsonLD + +*Beware*: commands may contain small typos. You have to fix them to properly complete the course! + +---- + +## Semantics what? + +Semantics: the study of meaning. + +Semantics ensures that a message is understood; +messages include data and HTTP exchanges. + +Here is an ambiguous message: + +```yaml +name: FABIANO Romildo +income: 4_000_000 +``` + +Is this a given name or a full name? +What is the currency of the income? +Is it a monthly or yearly income? + +---- + +Integrating data from different sources is difficult because of the lack of semantic interoperability. + +```mermaid +graph LR +Am>"{name: FABIANO Romildo\nincome: 4_000_000}"] +Cm>"{givenName: FABIANO\nfamilyName: Romildo\ntax: 12_000EUR}"] +B((Data sink)) + +A((Data source 1)) ---Am --> B +C((Data source 3)) ---Cm --> B +``` + +---- + +:exclamation: Identifiers may differ between systems, +and even registry data are not always interoperable. + +```mermaid +graph LR +Am>"{givenName: Angela\nfamilyName: Merkel\ndate_of_birth: 1954-07-17}"] +Cm>"{givenName: Angela\nfamilyName: Kasner\ndate_of_birth: 1954-07-17}"] +B((Data sink)) + +A((Data source 1)) ---Am --> B +C((Data source 3)) ---Cm --> B +``` + +---- + +The lack of standardization in the format and meaning of data +hinders interoperability between the databases of different organizations, +and even inside different branches of the same organization, +and therefore the creation of digital services. + +A first example is the lack of syntactic interoperability: +a well-defined entity (eg. the tax code) is represented with different fields or formats: + +```json +{"tax_code": "RSSMRO77T05E472W"} +{"cf": "RSSMRO77T05E472W"} +{"taxCode": "RSSMRO77T05E472W"} +``` + +---- + +Another example is semantic interoperability: the concept of family has different meanings (eg. in the fiscal domain, in the registry domain, ..): + +```yaml +relatives: + - name: Mario Rossi + relationship: father + - name: Carla Rossi + relationship: sister + cohabiting: false +``` + +```yaml +relatives: + - name: Mario Rossi + relationship: father +``` + +--- + +## Vocabularies to the rescue: Controlled vocabularies + +Controlled Vocabularies use URIs to disambiguate the meaning of terms and provide semantics. + +Every term is identified by an absolute URI. + +The prefix identifies the vocabulary name, +and the suffix identifies the term. + +```python +from rdflib import URIRef +dog_uri = URIRef("https://dbpedia.org/data/Dog") +``` + +## Vocabularies to the rescue: RDF + +RDF: Resource Description Framework + +It allows to represent information on the web based on: + +- **elements** (IRIs, blank nodes and literals); + +```python +from rdflib import URIRef, Literal, BNode + +iri = URIRef("mailto:mr@test") +iri2 = URIRef("https://schema.org/name") +blank_node = BNode("anon") +literal = Literal("Mario Rossi") + +# Serialize in the N3 format +# (Notation 3 is a compact, human-readable format for RDF) +print(iri.n3(), blank_node.n3(), literal.n3(), sep="\n") +``` + +Exercise: RDF elements + +In the cell below, create a literal with the following values +and look at its [Notation 3 (N3)](https://www.w3.org/TeamSubmission/n3/) serialization. + +- `42` (integer), `42.0` (float), `"42"` (string); +- `datetime.now()` (date); + +```python +from datetime import datetime +... +for value in (42, 42.0, "42", datetime.now()): + literal = Literal(value) + print(literal.n3()) +``` + +- **triples** (subject-predicate-object); + +```python +triple = (iri, iri2, literal) +print(triple) +``` + +- **graphs** (sets of triples). + +```python +from rdflib import Graph +g = Graph() +g.add(triple) +print(g.serialize(format="turtle")) +``` + +and on **vocabularies** of elements identified by IRIs and namespaces. + +---- + +An RDF dataset is a set of **graphs**. + +```mermaid +graph LR + +subgraph Dataset + subgraph Graph1["Graph <https\://example.org/graph1>"] + t1[ + subject predicate object . + subject predicate object . + subject predicate object . + ] + end + subgraph Graph2[Graph <urn:example:graph2>] + t2[ + subject predicate object . + subject predicate object . + subject predicate object . + ] + end + subgraph Graph3[Graph <_:anonymous_graph>] + t3[ + subject predicate object . + subject predicate object . + subject predicate object . + ] + end +end +``` + +```python +from rdflib import Dataset + +d = Dataset() +``` + +#### Exercise: dataset + +- use the `Dataset.graphs` method to list the graphs in the dataset; + +- add a graph to the dataset. + +```python +simpsons = d.graph(identifier="urn:example:simpsons") +simpsons.parse("simpsons.ttl", format="turtle") + +``` + +- list the graphs in the dataset again, together with their identifiers. + + + + +- get the `identifier` of one graph. What's its type? + + + +---- + +To semantically standardize data, services and their content, +conceptual tools such as ontologies +and controlled vocabularies (codelist, taxonomies, ..) +are used. + +#### Exercise: the DBpedia ontology and dataset + +Parse the following RDF sentences in a dataset. + +```python +sentences = """ +@prefix : . +@prefix dbp: . +@prefix dbo: . + +# We can group together sentences with the same subject +# using `;` +:Tortellini + # `a` is a shortcut for `rdf:type` + a dbo:Food ; + dbp:country :Italy ; + dbo:WikiPageWikiLink :Prosciutto . # Always end with a dot + +:Meat dbo:WikiPageWikiLink :Prosciutto . +""" + +# Create a new named graph in the dataset. +g = d.graph(identifier="urn:my_dbpedia") +... + +``` + + + +- Get the URIs representing Tortellini and Food using the `Graph.subjects` and `Graph.objects` methods. + +```python +# Deduplicate subjects using set() +subjects = set( ... ) +objects = set( ... ) +print(subjects | objects) +``` + +- what's the namespace of the `Tortellini` URI? +- what's the namespace of the `Food` URI? +- Open both URIs in a browser and check their content, + then try to understand the difference between + their namespaces. + +## Ontologies and controlled vocabularies + +Ontologies are used to standardize the semantics of digital content. + +- **Ontology**: an ontology is a set of logical axioms that conceptualize a domain of interest by defining concepts and the semantics of relationships between them. + +Example: the Italian ontology for person defines: + +- the concept of person; +- its properties (e.g., givenName, familyName, hasChildren); +- the range of each property (e.g., string, date, person); +- the domain of each property (e.g., person, organization, place); +- See also . + +```mermaid +graph TD + +subgraph CPV["CPV Ontology"] + Person + familyName([familyName]) + givenName([givenName]) + hasChildren([hasChildren]) +end + +subgraph xsd[XMLSchema] + xsd:string +end + +givenName & familyName & hasChildren -.-o|domain| Person + +familyName & givenName ---->|range| xsd:string +hasChildren -->|range| Person + + +``` + + +- **Controlled vocabulary**: a vocabulary where the terms are validated by a designated authority. + It can be of different types - e.g., a list (codelist), a hierarchical structure (taxonomy), a glossary and a thesaurus (which adds further constraints to a taxonomy). + +Examples of European controlled vocabularies are here + +---- + +## Ontologies in Italy + +In Italy, there's , a National Data Catalog for Semantic Interoperatbility +containing the official ontology for person +(Common Person Vocabulary) that we can use to uniquely describe someone. + +```text +@prefix CPV: . + + + CPV:givenName "Roberto" ; + CPV:familyName "Polli" . + +``` + +---- + +An ontology is defined by a set of IRIs and their relationships. + +```python +from rdflib import Graph + +sentences = """ +@prefix xsd: . +@prefix dct: . + + + dct:modified "2020-04-27"^^xsd:date ; + # Use `,` to group multiple objects + dct:title "Person Ontology"@en, + "Ontologia delle persone"@it . + +# An ontology defines the meaning of predicates. + + rdfs:comment "The given name of a person. E.g. 'Mario' is the given name of the person 'Mario Rossi'."@en ; + rdfs:label "given name"@en ; + rdfs:range xsd:string . + +""" + +``` + + + + + +Exercise: how many triples are in the graph? diff --git a/sparql-101/02-sparql.md b/sparql-101/02-sparql.md deleted file mode 100644 index e1a4a95..0000000 --- a/sparql-101/02-sparql.md +++ /dev/null @@ -1,260 +0,0 @@ -# Graph databases & SparQL - -## Agenda - - - Storing and retrieving triples - - Virtuoso - - GraphDB - -*Beware*: commands contain small typos. You must fix them to properly complete the course! - ----- - -Prerequisites: - -- json, yaml, xmlschema -- HTTP, OpenAPI 3 -- SQL and database hints - - ---- - -## Graphs (again) - -A graph is a set (unordered) of triples. - -Each triple consists of a `subject`, `predicate`, `object`. - -Graph databases such as [Virtuoso (opensource)](), -[GraphDB (proprietary)](), -[Amazon Nepture (proprietary SaaS)]() -support the [SparQL]() language. -Other databases - [Neo4j (opensource)]() use -custom language. - ----- - -Let's populate some entries in SparQL -and see how it works. - -Open [sample.ttl](sample.ttl) and list -all entries - -```sparql -SELECT * WHERE { - ?subject ?predicate ?object -} -``` - -(describe sparql query) - ----- - -SparQL can then be used to correlate -entries using semantically defined -vocabularies such as FOAF. - -```sparql -@prefix foaf: . - -SELECT * WHERE { - ?s foaf:name ?o -} -``` - -| s | o | -| --- | --- | -| | "Roberto"| -| | "Jon"| - -In this case `foaf:name` has a very specific meaning. -You don't need to create indexes in your database -to search for specific predicates. - ----- - -Graph databases have an inference engine that can be used -to process complex queries. - -```sparql -@prefix foaf: . - -SELECT * WHERE { - ?s foaf:knows ?o -``` - -| s | o | -| --- | --- | -| r@example | j@example | - ----- - -And using multiple lines we can infer things -such as friend-of-a-friend emails. - -```sparql -@prefix foaf: . - -SELECT DISTINCT ?mail1, ?mail3 WHERE { - ?user1 foaf:knows ?user2 - . ?user2 foaf:knows ?user3 - - . ?user1 foaf:mbox ?mail1 - . ?user3 foaf:mbox ?mail3 -``` - -Note that the query describes each relation -ignoring the way data is stored. - ---- - -# Querying DBPedia - -[DBPedia](https://dbpedia.org/sparql) is a graph database with a lot of data inside. - -We can use it to learn sparql. - -- list concepts - -``` -select distinct ?Concept where {[] a ?Concept} LIMIT 20 -``` - ----- - -Now we want to list all `Person` - -```sparql -@prefix foaf: . - -SELECT DISTINCT * WHERE { - ?s a foaf:Person -} LIMIT 10 -``` - ----- - -All `Person`s born in Pisa - -```sparql - -@prefix foaf: . -@prefix dbp: . -@prefix dbr: . - -select distinct * where { - ?s a foaf:Person . - ?s dbp:birthPlace dbr:Pisa -} LIMIT 10 - -``` - -... with their deathplaces - -```sparql -@prefix foaf: . -@prefix dbp: . -@prefix dbr: . -@prefix dbo: . - - -select distinct * where { -?s a foaf:Person . -?s dbp:birthPlace dbr:Pisa . -?s dbp:deathPlace ?death_place -} LIMIT 10 -``` - ----- - -If deathplace is in UK - -```sparql - -@prefix foaf: . -@prefix dbp: . -@prefix dbr: . -@prefix dbo: . - -select distinct * where { - ?s a foaf:Person . - ?s dbp:birthPlace dbr:Rome . - ?s dbp:deathPlace ?deathPlace . - ?deathPlace dbo:country dbr:United_Kingdom -} LIMIT 50 - -``` - ----- - -We can extend the search to every person -born in Italy and dead in UK: - -- replacing `dbr:Rome` with `?birth_place` -- restricting `?birth_place` to `dbr:Italy` - -```sparql -@prefix foaf: . -@prefix dbp: . -@prefix dbr: . -@prefix dbo: . - -SELECT DISTINCT * WHERE { - -?s a foaf:Person . -?s dbp:birthPlace ?birth_place . -?s dbp:deathPlace ?deathPlace . - -?deathPlace dbo:country dbr:United_Kingdom . -?birth_place dbo:country dbr:Italy - -} LIMIT 50 -``` - ----- - -There's no limit to the inference, for example -we could require that the birthplace of that -person should match the one of a Pope. - -```sparql -@prefix foaf: . -@prefix dbp: . -@prefix dbr: . -@prefix dbo: . -@prefix rdf: . - -select distinct * where { - ?s a foaf:Person . - ?s dbp:birthPlace ?birth_place . - ?birth_place dbo:country dbr:Italy . - ?s dbp:deathPlace ?death_place . - ?death_place dbo:country dbr:France . - - ?pope rdf:type dbo:Pope . - ?pope dbp:birthPlace ?birth_place . # relation with the birth_place -} LIMIT 50 -``` - ----- - -Shortening sparql queries - -```sparql -@prefix foaf: . -@prefix dbp: . -@prefix dbr: . -@prefix dbo: . -@prefix rdf: . - -select distinct * where { - ?s a foaf:Person ; - dbp:birthPlace ?birth_place ; - dbp:deathPlace ?death_place . - ?birth_place dbo:country dbr:Italy . - ?death_place dbo:country dbr:France . - - ?pope rdf:type dbo:Pope ; - dbp:birthPlace ?birth_place . # relation with the birth_place -} LIMIT 50 -``` diff --git a/sparql-101/05-sparql.md b/sparql-101/05-sparql.md new file mode 100644 index 0000000..a1f7004 --- /dev/null +++ b/sparql-101/05-sparql.md @@ -0,0 +1,395 @@ +# SparQL 101 + +## Agenda + +- Storing and retrieving triples + +*Beware*: commands contain small typos. You must fix them to properly complete the course! + +--- + +Prerequisites: + +- json, yaml, xmlschema +- HTTP, OpenAPI 3 +- SQL and database hints + +--- + +## Querying graphs with SparQL + +An RDF graph is an (unordered) set of triples. + +Each triple consists of a `subject`, `predicate`, `object`. + +SparQL is a query language for RDF graphs. + +---- + +A sparql query retrieves all entries +matching one or more sentences + +```raw +SELECT * +WHERE { + ?subject ?predicate ?object . + # ... more sentences ... +} +``` + +This workshop provides a non-exhaustive introduction to SparQL. + +---- + +Open [sample.ttl](sample.ttl) in another tab +and see its content. + +```python +from rdflib import Graph +g = Graph() +g.parse("sample.ttl", format="text/turtle") +``` + +Use our utility function to print the graph. + +```python +from tools import plot_graph +plot_graph(g, label_property=FOAF.name) +``` + + +List all entries + +```python +q = """ +SELECT * +WHERE { + ?subject ?predicate ?object . +} +LIMIT 2 +""" +result = g.query(q) +[r.asdict() for r in result] +``` + +Exercise: + +- Remove the `LIMIT` clause. + How many triples are in the graph? + +```python +# Use this cell for the exercise. + +# You can use variable names. +for r in result: + print(r.subject, r.predicate, r.object, sep="\t") + +``` + +- Replace `?subject` with `?foo`: + what happens? + +---- + + +SparQL can correlate +entries using semantically defined +vocabularies such as FOAF. + +:warning: The `PREFIX` statement in a sparql query +must not have a trailing dot, because it is not a sentence. +This is different from the `@prefix` statement +in turtle. + +```python +q = """ +PREFIX foaf: + +SELECT * WHERE { + ?s foaf:name ?o . +} +""" + +result = g.query(q) +[r.asdict() for r in result] +``` + +In this case `foaf:name` has a very specific meaning. +You don't need to create indexes in your database +to search for specific predicates. + +Exercise: + +- What happens if you add a dot at the end of the `PREFIX` statement + in the above query? + +---- + +Graph databases have an inference engine that can be used +to process complex queries. + +```python +q = """ +PREFIX foaf: + +SELECT * +WHERE { + ?s a foaf:Person . + ?s foaf:knows ?o . +} +""" + +result = g.query(q) +[r.asdict() for r in result] +``` + +The `*` operator matches a predicate +0 or more times. +This allows to find all +the friends' network of a person. + +Exercise: + +- modify the above query replacing `foaf:knows` with `foaf:knows*` + and see what happens. + +SparQL supports GROUP BY and ORDER BY clauses. + +```python +q = """ +PREFIX foaf: + +SELECT DISTINCT + ?s + (GROUP_CONCAT(?o; separator=", ") AS ?friends) +WHERE { + ?s + a foaf:Person ; + foaf:knows* ?o + . +} +GROUP BY ?s +""" +result = g.query(q) +{str(r.s): {"network": str(r.friends) } for r in result} +``` + +---- + +Using multiple lines we can infer things +such as friend-of-a-friend emails. + +```python +q = """ +PREFIX foaf: + +SELECT DISTINCT + ?mail1 ?mail3 +WHERE { + ?user1 foaf:knows ?user2 + . + ?user2 foaf:knows ?user3 + . + ?user1 foaf:mbox ?mail1 + . + ?user3 foaf:mbox ?mail3 +} +""" + +result = g.query(q) +[r.asdict() for r in result] +``` + +Since we are not interested in the `user2` variable, +we can simplify the query specifying +a path of predicates. + +```python +q = """ +PREFIX foaf: + +SELECT DISTINCT + ?mail1 ?mail3 +WHERE { + ?user1 foaf:knows/foaf:knows ?user3 + . + ?user1 foaf:mbox ?mail1 + . + ?user3 foaf:mbox ?mail3 +} +""" +result = g.query(q) +{str(r.mail1): str(r.mail3) for r in result} +``` + +---- + +Note that the query describes each relation +ignoring the way data is stored. + +--- + +# Querying DBPedia + +[DBPedia](https://dbpedia.org/sparql) is a graph database with a lot of data inside. + +We can use it to learn sparql. + +- list concepts + +```text +SELECT DISTINCT + ?Concept +WHERE { + [] a ?Concept +} +LIMIT 20 +``` + +---- + +Now we want to list all `Person` + +```text +PREFIX foaf: + +SELECT DISTINCT + * +WHERE { + ?s a foaf:Person +} +LIMIT 10 +``` + +---- + +All `Person`s born in Pisa + +```sparql +PREFIX foaf: +PREFIX dbp: +PREFIX dbr: + +SELECT DISTINCT + * +WHERE { + ?s a foaf:Person . + ?s dbp:birthPlace dbr:Pisa +} +LIMIT 10 + +``` + +... with their deathplaces + +```raw +PREFIX foaf: +PREFIX dbp: +PREFIX dbr: +PREFIX dbo: + + +SELECT DISTINCT * +WHERE { + ?s a foaf:Person . + ?s dbp:birthPlace dbr:Pisa . + ?s dbp:deathPlace ?death_place +} +LIMIT 10 +``` + +---- + +If deathplace is in UK + +```raw +PREFIX foaf: +PREFIX dbp: +PREFIX dbr: +PREFIX dbo: + +SELECT DISTINCT * WHERE { + ?s a foaf:Person . + ?s dbp:birthPlace dbr:Rome . + ?s dbp:deathPlace ?deathPlace . + ?deathPlace dbo:country dbr:United_Kingdom +} +LIMIT 50 + +``` + +---- + +We can extend the search to every person +born in Italy and dead in UK: + +- replacing `dbr:Rome` with `?birth_place` +- restricting `?birth_place` to `dbr:Italy` + +```sparql +PREFIX foaf: +PREFIX dbp: +PREFIX dbr: +PREFIX dbo: + +SELECT DISTINCT * +WHERE { + ?s a foaf:Person . + ?s dbp:birthPlace ?birth_place . + ?s dbp:deathPlace ?deathPlace . + + ?deathPlace dbo:country dbr:United_Kingdom . + ?birth_place dbo:country dbr:Italy +} +LIMIT 50 +``` + +---- + +There's no theoretical ;) limit to the inference, for example +we could require that the birthplace of that +person should match the one of a Pope. + +```sparql +PREFIX foaf: +PREFIX dbp: +PREFIX dbr: +PREFIX dbo: +PREFIX rdf: + +SELECT DISTINCT * WHERE { + ?s a foaf:Person . + ?s dbp:birthPlace ?birth_place . + ?birth_place dbo:country dbr:Italy . + ?s dbp:deathPlace ?death_place . + ?death_place dbo:country dbr:France . + + ?pope rdf:type dbo:Pope . + ?pope dbp:birthPlace ?birth_place . # relation with the birth_place +} +LIMIT 50 +``` + +---- + +Shortening sparql queries + +```sparql +PREFIX foaf: +PREFIX dbp: +PREFIX dbr: +PREFIX dbo: +PREFIX rdf: + +SELECT DISTINCT * WHERE { + ?s a foaf:Person ; + dbp:birthPlace ?birth_place ; + dbp:deathPlace ?death_place . + ?birth_place dbo:country dbr:Italy . + ?death_place dbo:country dbr:France . + + ?pope rdf:type dbo:Pope ; + dbp:birthPlace ?birth_place . # relation with the birth_place +} +LIMIT 50 +``` diff --git a/sparql-101/07-jsonld.md b/sparql-101/07-jsonld.md new file mode 100644 index 0000000..fe6c9cd --- /dev/null +++ b/sparql-101/07-jsonld.md @@ -0,0 +1,253 @@ +# Agenda + +- Storing data vs Describing Knowledge +- JSON-LD + +## Storing data + +We store data in different ways and formats: +using constrained or loose schemas, +with more or less rigid serializations. + +JSON (and YAML) is a human-readable way to +store data. + +```yaml +[ + { name: Homer, surname: Simpson, spouse: Marge Simpson }, + { name: Marge, surname: Simpson, spouse: Homer Simpson }, +] +``` + +We can then add identifiers (such as UUIDs or email), to be sure that cross references +are not ambiguous. + +```yaml +[ + { email: homer@simpson.org, name: Homer, surname: Simpson, spouse: marge@simpson.org }, + { email: marge@simpson.org, name: Marge, surname: Simpson, spouse: homer@simpson.org }, +] +``` + +Now we may have different datasets, such as the Springfield Elementary +school. Luckily we can "join" on an identifying field, but this is +not true for all fields. + +```yaml +[ + { email: bart@simpson.org, name: Bart Simpson, parent: marge@simpson.org }, + { email: milhouse@vanhouten.org, name: Milhouse Van Houten, parent: kirk@vanhouten.org} +] +``` + +So we actually store data, but we lack knowledge. + +### JSON-LD + +JSON-LD is a JSON serialization for information described using the +[RDF data model](https://www.w3.org/TR/json-ld11/#data-model). + +A JSON-LD document is both an RDF and a JSON document. + +---- + +```python +homer = { + "email": "homer@simpson.org", + "name": "Homer", + "surname": "Simpson", + "spouse": "marge@simpson.org" +} +``` + +JSON-LD associates it with a context that disambiguates information + +```python +import json + +# A context maps JSON keys to IRIs. +context = { + # Map name and surname to the IRI of the FOAF vocabulary. + "name": "foaf:givenName", + "surname": "foaf:familyName", + # Use the email key as an IRI, + # prefixing it with the base IRI. + "email": "@id", + "@base": "https://simpsons.org/#", +} +``` + +```python +homer_ld_json = json.dumps({ + "@context": context + **homer +}) +``` + +Exercise: + +- load `homer_ld_json` in a Graph() +- print the serialization of the graph in `text/turtle` format + + +```python +from rdflib import Graph + +``` + + + + + +--- + + is a collaborative vocabulary to +describe information about people, places, events, and more. +While it is not a formal ontology, and should be used with care +(e.g., in regulated domains), +it is widely used for search engine optimization (SEO) and +structured data markup, as well as for increase interoperability +in non-critical applications (e.g., e-commerce, marketing, ...). + +Its terms are availabe here + +--- + +Start with an object with fields in Italian: + + +```python +jane = { + "nome": "Jane Doe", + "nome_proprio": "Jane", + "titolo": "Professor", + "telefono": "(425) 123-4567" +} +``` + +Annotate it with schema.org. + +```python +context = { + "sdo": "http://schema.org/", + "nome": "sdo:name", + "nome_proprio": "sdo:givenName", + "titolo": "sdo:jobTitle", + "telefono": "sdo:telephone", + } +``` + +```python +import json +jane_ld = { + "@context": context, + "@type": "sdo:Person", + **jane + } +print(json.dumps(jane_ld)) +``` + +Exercise: + +- load `jane_ld` in a Graph() +- what's the subject of the sentences? + +```python +jane_ld_json = ... +``` + + +--- + +### Localization + +RDF (and JSON-LD) support localization natively. + +```python +jane_ld["competenze"] = { + 'it': 'Informatica', + 'en': 'Computer Science', + 'fr': 'Informatique' +} + +# Associate the entry to the context. +jane_ld["@context"].update({ + "competenze" : { + "@id": "sdo:skills", + # The @container keyword + # does the magic of converting + # a dictionary into a list of objects. + "@container": "@language" + } +}) +``` + +Now we can serialize the graph. + +```python +from rdflib import Graph +g=Graph() +g.parse(data=json.dumps(jane_ld), format='json-ld') +print(g.serialize(format='turtle')) +``` + + +Another localization mechanism allows +to map multiple values to a single property. + +```python +jane_ld["soprannome"] = "Gianna" +jane_ld["soprannome_fr"] = "Jeanette" + +# And the annotations. +jane_ld["@context"].update({ + "soprannome" : "sdo:alternateName", + "soprannome_fr" : { + "@id": "sdo:alternateName", + "@language": "fr" + } +}) +``` + +--- + +#### Context mangling + +Modifying a JSON-LD context, +alters the +meaning of the data. + +Imagine you have a JSON-LD document +with a referenced context (i.e., a URL) +that is supposed to be downloaded +and used to interpret the data. + +```yaml +"@context": https://payment/context.jsonld +payment_from: alice@foo.example +payment_to: bob@foo.example +``` + +Someone altering the +could reverse the payment flow. + +```yaml +# Original context +@context: + payment_from: http://banking#debtor + payment_to: http://banking#creditor +``` + +-> + +```yaml +# Altered context +@context: + payment_to: http://banking#debtor + payment_from: http://banking#creditor +``` + +---- + +When resolving contexts at runtime, +implementations should address these risks. diff --git a/sparql-101/03-syntax-semantic.md b/sparql-101/09-syntax-semantic.md similarity index 99% rename from sparql-101/03-syntax-semantic.md rename to sparql-101/09-syntax-semantic.md index f1909c1..dfaa6b4 100644 --- a/sparql-101/03-syntax-semantic.md +++ b/sparql-101/09-syntax-semantic.md @@ -220,3 +220,6 @@ flowchart CSV --csv-ld--> RDF ``` + + +--- diff --git a/sparql-101/10-rdf.md b/sparql-101/10-rdf.md new file mode 100644 index 0000000..66de428 --- /dev/null +++ b/sparql-101/10-rdf.md @@ -0,0 +1,315 @@ +# Graph databases & SparQL + +## Agenda + +- Storing and retrieving triples +- Using the `rdflib.Dataset` class +- Querying and traversing graphs + +*Beware*: commands may contain small typos. You must fix them to properly complete the course! + +---- + +Prerequisites: + +- JSON, YAML, xmlschema +- HTTP, OpenAPI 3 +- SQL and database hints + +```python +%pip install oxrdflib +``` + + +--- + +## Graphs (again) + +### RDF databases + +An RDF graph is an (unordered) set of triples. + +Each triple consists of a `subject`, `predicate`, `object`. + +Graph databases such as: + +- [Virtuoso (opensource)](https://virtuoso.openlinksw.com/), +- [GraphDB (proprietary)](), +- [Amazon Nepture (proprietary SaaS)]() + +store triples into graphs. + +They can be queried using the [SparQL]() language. + + +---- + +### Non-RDF databases: Neo4j + +Another notable graph database is [Neo4j (opensource)](). + +It is not a triple store, and it +adopt a different approach named [Labeled Property Graphs](https://en.wikipedia.org/wiki/Labeled_property_graph) + +Neo4j can be queried with the [Cypher](https://neo4j.com/developer/cypher-query-language/) language. + +Neo4j supports RDF datasets via the Neosemantics plugin. + +---- + +## rdflib backends + +We will simulate a graph database using +[rdflib](https://rdflib.readthedocs.io/en/stable/index.html), +that supports SparQL queries. + +rdflib supports multiple backends to parse and store triples. + +oxrdflib is a performant one +based on [Oxigraph](https://github.com/oxigraph/oxigraph). + +Let's create a `Dataset`. + +```python +from rdflib import Dataset + +d = Dataset(store="Oxigraph") +``` + +Exercise: + +- use the `Dataset.bind` method to bind the `eu` prefix to the + `https://publications.europa.eu/resource/authority/` namespace; +- use the `Dataset.graph` method to create the `eu:country` graph; + +```python +print(list(d.graphs())) +d.bind("eu", "https://publications.europa.eu/resource/authority/") +eu_country_id = d.namespace_manager.expand_curie("eu:country") +``` + +```python +# Use the default backend +g = d.graph(eu_country_id) +%time g.parse("countries-skos-ap-act.ttl", format="text/turtle") +print("The graph contains", len(g), "triples.") +``` + +```python +d = Dataset(store="Oxigraph") +g = d.graph(eu_country_id) +# Use the ox-turtle parser. +%time g.parse("countries-skos-ap-act.ttl", format="ox-turtle") +print("The graph contains", len(g), "triples.") +``` + +See also: + +- + +Now create another graph + +```python +simpsons = d.graph(identifier="urn:example:simpsons") +simpsons.parse("simpsons.ttl", format="ox-turtle") +``` + +Now list the graphs in the dataset: +note that the default graph does not contain triples. + +```python +print( + {k.identifier.n3(): len(k) for k in d.graphs()} +) +``` + +What happens if I query the dataset? + +```python +q = """SELECT DISTINCT * +WHERE { + [] a ?Class +} +LIMIT 10 +""" +d.query(q).bindings +``` + +Now, try to query each graph + +```python +for g in d.graphs(): + print({g.identifier.n3(): g.query(q).bindings}) +``` + +There's a Dataset flag that allows to query all the graphs in the dataset. + +```python +# By default, sparql does not query all the graphs. +assert d.default_union == False + +# .. but you can change this behaviour... +d.default_union = True + +# ... and now you can query all the graphs. +d.query(q).bindings +``` + +--- + +## SparQL practice + +Let's load into it the [European vocabulary for countries](countries.ttl). + +See also: + +- [EU Authority Tables](https://op.europa.eu/en/web/eu-vocabularies/authority-tables) + +```python +from rdflib import Graph + +# Let's create a graph. +g = Graph(store="Oxigraph") + +# And load into it the European +# vocabulary for countries. +g.parse("countries-skos-ap-act.ttl", format="ox-turtle") +``` + + + + +--- + +### Traversing the graph + +The Country graph contains more than countries. + +```python +to_curie = g.namespace_manager.curie + +q = """ +PREFIX country: + +SELECT DISTINCT * +WHERE { + country:ITA skos:narrower ?narrower . + ?narrower skos:prefLabel ?label . + FILTER (lang(?label) = "en") +} +""" +result = g.query(q) + +narrower = {to_curie(r.narrower): str(r.label) for r in result} + +print(*narrower.items(), sep="\n") +``` + +Exercise: + +- run the above query replacing `skos:narrower` with `skos:narrower*`; + what happens? +- run the above query using `country:FRA` and see what happens; + then replace `skos:narrower` with `skos:narrower/skos:narrower`: + do you see the same number of results? + + +The `*` operator is used to traverse the graph +and find all the nodes reachable from the starting node. +The `*` operator is not supported by all graph databases. + + +#### Creating a graph + +SparQL can create new graphs from an existing one. + +```sparql +q = """ +PREFIX country: + +CONSTRUCT { + ?narrower + skos:prefLabel ?label ; + skos:broader ?broader . +} +WHERE { + ?narrower + # All resources transitively related to country:FRA... + skos:broader* country:FRA ; + + # ... with their labels ... + skos:prefLabel ?label ; + + # ... and their broader relations. + skos:broader ?broader . + + FILTER (lang(?label) = "en") +} +""" +result = g.query(q) +list(result.graph) +``` + +Let's visualize the graph. + +```python +from tools import plot_graph +from rdflib import SKOS + +plot_graph(result.graph, label_property=SKOS.prefLabel) +``` + +#### More metadata + +The Country graph contains more than countries ;) +the resource type is identified by the `lemon:context` property. + +```python +q = """ +PREFIX lemon: +PREFIX country: +PREFIX context: + +SELECT DISTINCT + ?broader + (COUNT(?narrower) AS ?count) +WHERE { + ?broader + skos:narrower+ ?narrower ; + + lemon:context context:COUNTRY ; + + # ... with their labels ... + skos:prefLabel ?label . + + + FILTER (lang(?label) = "en") +} +GROUP BY ?broader +ORDER BY ?count +""" +result = g.query(q) +list(result) +``` + +--- + +## Datasets + +An RDF dataset is made of multiple graphs. + +```python +from rdflib import Dataset + +d = Dataset(store='Oxigraph') +# Add ns shortcuts. +d.bind("eu", "https://publications.europa.eu/resource/authority/") +d.bind("schema": "https://schema.org/") +d.bind("euvoc": "http://publications.europa.eu/ontology/euvoc#") + + + +d.graph(identifier="urn:People").parse(data=json.dumps(nodes_ld), format="application/ld+json") +d.graph(identifier="eu:country").parse("countries-skos-ap-act.ttl", format="ox-turtle") +[len(x) for x in d.graphs()] +``` diff --git a/sparql-101/11-sparql-metadata.md b/sparql-101/11-sparql-metadata.md new file mode 100644 index 0000000..e73d5aa --- /dev/null +++ b/sparql-101/11-sparql-metadata.md @@ -0,0 +1,274 @@ +# Agenda + +- Using SparQL to query metadata + +## Metadata, Metadata + +Between all triples, +some contain metadata, +such as: + +- the resource types (`rdf:type`/`a`, or `rdfs:subClassOf` predicates); +- information about predicates; + + + + +```python +g=Graph(store="Oxigraph") + +# Load the graph. +g.parse("countries-skos-ap-act.ttl", format="ox-turtle") +``` + +And query the simplest metadata. + +```python +q = """ +SELECT DISTINCT + ?type +WHERE { + ?s a ?type . +} +""" +result = g.query(q) + +[r.type for r in result] +``` + +We can simplify the above query +avoiding gathering `?s` at all +using the `[]` syntax +that matches anything. + +```python +q = """ +SELECT DISTINCT + ?type +WHERE { + [] a ?type . +} +""" +result = g.query(q) + +[r.type for r in result] +``` + +Exercise: + +- where can you find the definition of `skos:Concept` and `skos:ConceptScheme`? + + + +---- + +List `skos:ConceptScheme`s +and their labels. + +```python +q = """ +SELECT DISTINCT * +WHERE { + ?ConceptScheme + a skos:ConceptScheme ; + skos:prefLabel ?label . + # Only English labels + FILTER (lang(?label) = "en") +} +""" +result = g.query(q) +[r.asdict() for r in result] +``` + +Exercise: + +- Rewrite the above query using + two sentences. + + + +---- + +Now find all the triples +where the `object` is +` + + +```python +q = """ +SELECT DISTINCT * +WHERE { + ?s ?p . +} +""" +result = g.query(q) +[r.asdict() for r in result] +``` + +Exercise: + +- Rewrite the above query using + the PREFIX directive. + + + + +```python +q = """ +PREFIX euvoc: + +SELECT DISTINCT * +WHERE { + ?s ?p ... +} +LIMIT 6 +""" +result = g.query(q) +[r.asdict() for r in result] +``` + +--- + +Let's visualize the graph +using: + +- dotted lines to represent type relations +- parallelograms to represent literals + +```mermaid +graph + +skos:ConceptScheme +skos:ConceptScheme -->|skos:prefLabel| _l1[/"Concept Scheme"/] + +country:0005 -.->|a| skos:ConceptScheme +country:0005 ---|skos:prefLabel| _l[/"Current EU members"/] + +country -.->|a| skos:ConceptScheme +country:AUT --->|skos:inScheme| country:0005 +country:BEL --->|skos:inScheme| country:0005 +country:... --->|skos:inScheme| country:0005 + +``` + +--- + +Now, query for the information +associated with the `country:AUT` node. + +```python +q = """ +PREFIX euvoc: + +SELECT DISTINCT * +WHERE { + country:AUT ?p ?o . + + # Remove blank nodes. + FILTER(!isBlank(?o)) + +} +""" + +result = g.query(q) +print(*[(r.p.n3(), r.o.n3()) for r in result],sep="\n") +``` + +Exercise: + +- query all skos:Schemes and their labels + where `country:AUT` +- Hint: use two distinct sentences + + + +--- + +**A knowledge graph contains both data and the associated metadata.** +**There isn't a fixed schema, but a set of relations.** +**The actual schema is defined by the ontology and may evolve over time.** + +--- + + +Questions: + +- List the namespaces registered in the graph. + + + +```python +q = """ +SELECT DISTINCT * +WHERE { + [] a ?type . +} +""" +result = g.query(q) +[r.type for r in result] +``` + +```python +# For human readable results, bind prefixes. +g.bind("euvoc", "http://publications.europa.eu/ontology/euvoc#Country") +g.bind("country", "http://publications.europa.eu/resource/authority/country/") +to_curie = g.namespace_manager.curie + +result = g.query(""" +# You always need to bind the prefixes +PREFIX euvoc: + +SELECT DISTINCT * +WHERE { + ?c a euvoc:Country . +} +LIMIT 3 +""") +[to_curie(r.c) for r in result] +``` + +Now we will infer how countries are modeled +retrieving all associated predicates, +starting with the types. + +We can list all the predicates +associated with `euvoc:Country`, +thus inferring how countries are modeled. + +The fact that every property is defined by +an URI allows us to use +the same property in different contexts. + +```python +q = """ +PREFIX euvoc: +PREFIX country: + +SELECT DISTINCT * +WHERE { + [] a euvoc:Country ; + a ?type . +} +""" +result = g.query(q) +country_types = {r.type for r in result} +``` + +The data model extracted from the graph: +subjects in the country:0005 ConceptScheme +inherit properties from both `euvoc:Country` +and `skos:Concept`. + +```mermaid +graph LR + +country:... --->|skos:inScheme| country:0005 + +country:... -.->|a| euvoc:Country & skos:Concept + +skos:Concept -.->|a| rdfs:Class +euvoc:Country -.->|a| rdfs:Class +euvoc:status -->|rdfs:domain| euvoc:Country +skos:prefLabel -->|rdfs:domain| skos:Concept + +``` diff --git a/sparql-101/12-enriching-data.md b/sparql-101/12-enriching-data.md new file mode 100644 index 0000000..bf9c520 --- /dev/null +++ b/sparql-101/12-enriching-data.md @@ -0,0 +1,300 @@ +# Agenda + +- Enriching data with external knowledge + +- Starting from a dataset, identify keywords that can be + used to link entries to external knowledge. + +## Graphs vs Tables + +Storing data in tables requires to have a fixed schema. + +Column meaning is defined outside the table, or +where possible, in the table header. + +When a row is associated with a specific entity, +the table has an identifier column, +usually indexed. + +| id | name | surname | spouse | +|----|-------|---------|----------------| +| 1 | Homer | Simpson || +| 2 | Marge | Simpson || +| 3 | Bart | Simpson | || + +Another database related to the same entity +may have a different schema. + +| email | name | surname | parent | +|--------------------|-------|---------|----------------| +| | Homer | Simpson || +| | Marge | Simpson || +| | Bart | Simpson | + +With RDF, there is no fixed schema. +Instead, we have a public set of predicates +that can be used to describe the same entity. + +```mermaid +graph LR + +subgraph db1 + db1-id + db1-name + db1-surname +end + +subgraph db2 + db2-email + db2-name + db2-surname +end + +subgraph foaf + givenName + familyName + mbox + knows +end + +db1-name --> givenName ~~~ db2-name --> givenName +db1-surname --> familyName ~~~ db2-surname --> familyName +db1-id --> mbox ~~~ db2-email --> mbox +``` + +Storing data in a graph allows to use +a set of predefined predicates (see them as properties) +that are globally defined. + +--- + +Start with a json dataset. + +```python + +data = [ + {"email":"ft@a.test", "name": "Francisca", "surname": "Trujillo", "country": "ES"}, + {"email":"mr@a.test", "name": "Mario", "surname": "Rossi", "country": "IT"}, + {"email":"jd@a.test", "name": "Jane", "surname": "Doe", "country": "US"}, + {"email":"mg@a.test", "name": "Rashid", "surname": "Gowda", "country": "GB"}, +] +``` + +Add a context to the dataset. + +```python +context = { + "@vocab": "https://schema.org/", + "my": "https://a.test/my#", + # The code property is appended to the base URL to form the country URI. + "email": "@id", + "@base": "", + "name": "givenName", + "surname": "familyName", + # Define a custom country property. + "country": "my:country", + } +``` + +Now assemble everything in a JSON-LD graph + +```python +nodes_ld = { + # Every country is a resource. + "@graph": data, + "@context": context, +} +``` + +Exercise: + +- add a `"@type": "Person"` to every entry + +```python +nodes_ld = { + # Every country is a resource. + "@graph": [ { "@type": "Person", **c} for c in nodes], + "@context": context, +} +``` + +And create a dataset and bind the selected namespaces. + +```python +from rdflib import Dataset + +d = Dataset(store='Oxigraph') +# Add ns shortcuts. +d.bind("eu", "https://publications.europa.eu/resource/authority/") +d.bind("schema": "https://schema.org/") +d.bind("euvoc": "http://publications.europa.eu/ontology/euvoc#") +d.bind("my": "https://a.test/my#") + +``` + +Exercise: + +- list the graphs in the dataset; how many are there? + +```python +import json +# Create a people graph and add the entries +d.graph(identifier="urn:People").parse(data=json.dumps(nodes_ld), format="application/ld+json") +``` + +Exercise: + +- list the triples in the dataset; +- list the triples in the `urn:People` graph; + +Load the countries vocabulary in a new graph. + +```python +d.graph(identifier="eu:country").parse("countries-skos-ap-act.ttl", format="ox-turtle") +``` + +Now we have a graph to enrich with external data. + +Match the custom country property with the ISO code +contained in the EU vocabulary +to retrieve the EU country identifier. + +```python +q = """ +SELECT DISTINCT + ?person ?country +WHERE { + + # Match sentences in + GRAPH { + ?person + a :Person ; + my:country ?my_country_code . + } + + # Match sentences in + GRAPH { + ?country a euvoc:Country ; + skos:notation ?isoCode ; + . + } + + # Match the isoCode of the country. + FILTER ( ?isoCode = STRDT(?my_country_code, euvoc:ISO_3166_1_ALPHA_2) ) +} +""" + +res = d.query(q) + +[x.asdict() for x in res] + +``` + +Exercise: + +- Replace `` with `?g`: what happens? +- Can you replace both GRAPHs values with `?variables`? +- See the [string to datatype (STRDT) docs] + +If that's OK, we can update the graph with the country identifier. + +```python +q = """ +INSERT { + GRAPH { + ?person :nationality ?country . + } +} +WHERE { + + # Match sentences in + GRAPH { + ?person + a :Person ; + my:country ?my_country_code . + } + + # Match sentences in + GRAPH { + ?country a euvoc:Country ; + skos:notation ?isoCode ; + . + } + + # Match the isoCode of the country. + FILTER ( ?isoCode = STRDT(?my_country_code, euvoc:ISO_3166_1_ALPHA_2) ) +} +""" +d.update(q) +``` + +Now we can see the country identifier in the graph. + +```python +print(d.graph(identifier="urn:People").serialize(format="turtle")) +``` + +Now, we can even have a "fat" graph with all the information + +```python +q = """ +PREFIX euvoc: +INSERT { + GRAPH { + ?p my:countryName ?countryName . + } +} +WHERE { + ?p a :Person ; + :nationality ?country . + + ?country skos:prefLabel ?countryName . + # We want the country name in English. + FILTER ( LANG(?countryName) = "en" ) +} +""" +d.update(q) + +``` + +We can also mangle the data a bit... + +```python +q = """ +INSERT { + GRAPH { + ?p my:phone ?plus_prefix . + } +} +WHERE { + ?p a :Person ; + :nationality _:country . + + _:country skos:notation ?prefix . + + # We want the country name in English. + FILTER ( DATATYPE(?prefix) = euvoc:PHONE_PREFIX ) + + # Bind a modified value to the variable ?plus_prefix. + BIND ( + CONCAT("+", str(?prefix)) AS ?plus_prefix + ) +} +""" +d.update(q) + + +``` + +Exercise: + +- replace `?country` with `_:country`: does it work? +- replace the two sentences with the following **one**: does it work? + +```raw +?p a :Person ; + :nationality [ + skos:notation ?prefix + ] +. +``` diff --git a/sparql-101/Makefile b/sparql-101/Makefile index 0e32070..67b378e 100644 --- a/sparql-101/Makefile +++ b/sparql-101/Makefile @@ -1,4 +1,4 @@ -FILES=$(wildcard *.md) +FILES=$(wildcard [0-9]*.md) BOOKS = $(patsubst %.md,notebooks/%.ipynb,$(FILES)) SLIDES = $(patsubst %.ipynb,%.html,$(BOOKS)) diff --git a/sparql-101/README.md b/sparql-101/README.md new file mode 100644 index 0000000..17910b2 --- /dev/null +++ b/sparql-101/README.md @@ -0,0 +1,53 @@ +# Knowledge Management 101 + +## Elevator Pitch + +Still stuck while modeling your data? Start managing your knowledge instead! +This workshop introduces tools and techniques to get the best of your information, +including graph databases, RDF, SparQL and vector embeddings. + +## Abstract + +This workshop introduces knowledge management tools and techniques, +showing how to describe knowledge instead of just modeling data. + +Each section is based on jupyter. Participants should set up a dockerized +environment before the tutorial. + +## Agenda + +### Introduction + +- [ ] Environment setup +- [x] Jupyter [00-jupyter-intro.md] +- [x] Teaser [00-teaser.md] + +### Part 1 + +- [x] What is semantics? Describing information in a meaningful way: RDF and JSON-LD [01-knowledge.md], [02-semantics.md], [05-sparql.md], [10-rdf.md] +- [x] Knowledge Graphs and related technologies +- [x] Exercises: using and querying the EU Country vocabulary + +### Part 2 + +- [ ] Storing data vs describing knowledge. [07-jsonld.md](07-jsonld.md) + +Exercises: the DevSecOps dataset as a Knowledge Graph +Getting security insights using SparQL + +### Part 3 + +Graphs and semantic search: mixing Graph and Vector databases +Exercises: the EU Recruitment dataset (ESCO) and CV analysis +You will learn about +Resource Description Framework (RDF) and JSON-LD, rdflib +Graph databases, Openlink Virtuoso, SparQL +Vector search, Qdrant + +### Prerequisites + +beginner: docker, jupyter +intermediate: python, JSON, YAML, HTML, HTTP +good understanding of: databases, SQL, data modeling +Tags +Best Practice, Data Engineering, Algorithms and Data Structures diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb index fd742e3..773710f 100644 --- a/sparql-101/notebooks/00-jupyter-intro.ipynb +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "d652f97e", + "id": "b505bce6", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "ba5029b6", + "id": "3133db54", "metadata": { "slideshow": { "slide_type": "slide" @@ -38,7 +38,7 @@ }, { "cell_type": "markdown", - "id": "e5f8e51f", + "id": "aa4c9bd3", "metadata": { "slideshow": { "slide_type": "slide" @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "872aec87", + "id": "b61b3dbc", "metadata": { "slideshow": { "slide_type": "slide" @@ -74,7 +74,7 @@ }, { "cell_type": "markdown", - "id": "388c8340", + "id": "237233ec", "metadata": { "slideshow": { "slide_type": "slide" @@ -98,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "1450b00d", + "id": "64d017cc", "metadata": { "slideshow": { "slide_type": "slide" @@ -112,7 +112,7 @@ }, { "cell_type": "markdown", - "id": "3a45615d", + "id": "4e31124a", "metadata": { "slideshow": { "slide_type": "subslide" @@ -127,7 +127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5288686d", + "id": "36ab4c9c", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +136,7 @@ }, { "cell_type": "markdown", - "id": "62d76a1f", + "id": "b3a7bab3", "metadata": { "slideshow": { "slide_type": "slide" @@ -154,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "36a5a816", + "id": "9f48faef", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "b8520a07", + "id": "d9c5530d", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -174,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e62c503f", + "id": "8e84cd06", "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ }, { "cell_type": "markdown", - "id": "4c82dab5", + "id": "c5331858", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "d0dc09fd", + "id": "880ea870", "metadata": {}, "source": [ "----" diff --git a/sparql-101/notebooks/00-teaser.ipynb b/sparql-101/notebooks/00-teaser.ipynb index 1bb511b..abd914b 100644 --- a/sparql-101/notebooks/00-teaser.ipynb +++ b/sparql-101/notebooks/00-teaser.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "570caaee", + "id": "aa1e4e17", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "ee35a21e", + "id": "86d4bc31", "metadata": { "slideshow": { "slide_type": "slide" @@ -25,13 +25,20 @@ "## Agenda\n", "\n", "- 1h. What is semantics and how to describe information in a\n", - " meaningful (and machine-readable) way using RDF.\n", + " meaningful (and machine-readable) way using Resource Description Format (RDF).\n", "\n", "- 1h. Storing data or describing knowledge?\n", " Practical use of getting security insights from data.\n", "\n", "- Bonus track: Graphs and semantic search: mixing graphs and vector databases\n", "\n", + "### Hints\n", + "\n", + "- **Type in** exercises so you can learn from your mistakes\n", + "- If your notebook get stuck, **restart the kernel and run all** cells\n", + "- **Repetita iuvant**: concepts will be explained multiple times,\n", + " from different perspectives, thoughout various notebooks.\n", + "\n", "## Teaser\n", "\n", "In this course, we will learn how to describe information in a\n", @@ -41,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2e6d3349", + "id": "28139a01", "metadata": {}, "outputs": [], "source": [ @@ -50,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "4707ed11", + "id": "24a247c9", "metadata": {}, "source": [ "(and some graph libraries)" @@ -59,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "feaf5507", + "id": "9015b33d", "metadata": {}, "outputs": [], "source": [ @@ -69,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7aebe3f6", + "id": "b961e951", "metadata": {}, "outputs": [], "source": [ @@ -78,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "c09768c6", + "id": "66b79eab", "metadata": {}, "source": [ "For example network of persons:" @@ -87,7 +94,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1d852e72", + "id": "cf78e7ed", "metadata": {}, "outputs": [], "source": [ @@ -95,13 +102,13 @@ "from rdflib.namespace import FOAF, OWL\n", "\n", "sentences = \"\"\"\n", - "PREFIX owl: \n", - "PREFIX foaf: \n", - "PREFIX : \n", + "@prefix owl: .\n", + "@prefix foaf: .\n", + "@prefix : .\n", "\n", ":Homer foaf:knows :Marge, :Lisa, :Bart, :Maggie;\n", " foaf:interest ;\n", - " foaf:firstName \"Homer\".\n", + " foaf:firstName \"Homer\" .\n", "\n", ":Lisa foaf:firstName \"Lisa\";\n", " foaf:interest .\n", @@ -114,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "4b6fb468", + "id": "f6104109", "metadata": {}, "source": [ "... eventually rendered as a graph ..." @@ -123,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e33ccc90", + "id": "791d4528", "metadata": {}, "outputs": [], "source": [ @@ -133,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "6f04b146", + "id": "4db88682", "metadata": {}, "source": [ "Convert it in [JSON-LD](https://json-ld.org/) format:" @@ -142,7 +149,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0396f0fd", + "id": "fba3b778", "metadata": {}, "outputs": [], "source": [ @@ -152,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "1446ce9c", + "id": "b71e5988", "metadata": {}, "source": [ "There's plenty of knowledge in the web!" @@ -161,23 +168,26 @@ { "cell_type": "code", "execution_count": null, - "id": "e6804291", + "id": "71f44701", "metadata": {}, "outputs": [], "source": [ + "from pathlib import Path\n", "from rdflib import Graph\n", "from rdflib.namespace import RDFS\n", - "import networkx as nx\n", - "from requests import get\n", + "\n", + "# We can parse either a local file or a remote URL.\n", + "tortellini_url = \"https://dbpedia.org/data/Tortellini.n3/"\n", + "tortellini_n3 = Path(\"Tortellini.n3\")\n", "\n", "g = Graph()\n", - "g.parse(data=get(\"https://dbpedia.org/data/Tortellini.n3/").text, format=\"n3\")\n", + "g.parse(tortellini_n3, format=\"n3\")\n", "plot_graph(g, label_property=RDFS.label, limit=30, pattern=\".*/dbpedia.org\")" ] }, { "cell_type": "markdown", - "id": "6342db4b", + "id": "20d5f71a", "metadata": {}, "source": [ "And we can connect them together" @@ -186,19 +196,22 @@ { "cell_type": "code", "execution_count": null, - "id": "392f2214", + "id": "c158f157", "metadata": {}, "outputs": [], "source": [ + "tagliatelle_url = \"https://dbpedia.org/data/Tagliatelle.n3/"\n", + "tagliatelle_n3 = Path(\"Tagliatelle.n3\")\n", + "\n", "# Extend our graph\n", - "g.parse(data=get(\"https://dbpedia.org/data/Tagliatelle.n3/").text, format=\"n3\")\n", + "g.parse(tagliatelle_n3, format=\"n3\")\n", "\n", "plot_graph(g, label_property=RDFS.label, limit=50, pattern=\".*/dbpedia.org\")" ] }, { "cell_type": "markdown", - "id": "48af2a84", + "id": "c02d1e09", "metadata": {}, "source": [ "Graphs contain a lot of senteces" @@ -207,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "08c54d26", + "id": "47cd6fa8", "metadata": {}, "outputs": [], "source": [ @@ -216,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "acc2e120", + "id": "1bee9a22", "metadata": {}, "source": [ "but we can query them (e.g., for Italian food)" @@ -225,7 +238,7 @@ { "cell_type": "code", "execution_count": null, - "id": "31a78d24", + "id": "d2cd58a3", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "ebd12bcd", + "id": "02786c9d", "metadata": {}, "source": [ "and see if two resources have something in common..." @@ -254,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e415c3bf", + "id": "d47c8ee1", "metadata": {}, "outputs": [], "source": [ @@ -272,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "67206231", + "id": "ff9d8192", "metadata": {}, "source": [ "We can query remote graphs (e.g., DBPedia):" @@ -281,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "839547c6", + "id": "533acf2c", "metadata": {}, "outputs": [], "source": [ @@ -306,7 +319,7 @@ }, { "cell_type": "markdown", - "id": "367447cb", + "id": "2480e557", "metadata": {}, "source": [ "Provided by different organizations" @@ -315,7 +328,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a2e0e571", + "id": "6b767bdf", "metadata": {}, "outputs": [], "source": [ @@ -332,8 +345,8 @@ "WHERE {\n", " ?URI\n", " skos:inScheme euvoc:country ;\n", - " dc:identifier ?identifier ;\n", - " skos:prefLabel ?concept\n", + " skos:prefLabel ?concept ;\n", + " dc:identifier ?identifier\n", " .\n", "\n", " FILTER(lang(?concept) = 'en')\n", @@ -345,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "88f36a9c", + "id": "3427d90e", "metadata": {}, "source": [ "And their relations" @@ -354,33 +367,37 @@ { "cell_type": "code", "execution_count": null, - "id": "9acba5d8", + "id": "5efe6a8c", "metadata": {}, "outputs": [], "source": [ - "eu.query(\"\"\"\n", + "result = eu.query(\"\"\"\n", "PREFIX euvoc: \n", "PREFIX skos: \n", "PREFIX dct: \n", "\n", - "# Construct a graph of countries and their identifiers related by dct:replaces\n", + "# Construct a new graph of countries and their identifiers related by dct:replaces\n", "# countries must be in the euvoc:country scheme.\n", "\n", - "CONSTRUCT { ?a dct:replaces ?b}\n", + "CONSTRUCT {\n", + " ?a dct:replaces ?b\n", + "}\n", "WHERE {\n", - " ?a skos:inScheme euvoc:country.\n", - " ?b skos:inScheme euvoc:country.\n", + " ?a skos:inScheme euvoc:country .\n", + " ?b skos:inScheme euvoc:country .\n", " ?a dct:replaces ?b .\n", "}\n", "\n", "LIMIT 5\n", "\n", - "\"\"\").bindings" + "\"\"\")\n", + "\n", + "list(result.graph)" ] }, { "cell_type": "markdown", - "id": "405b4534", + "id": "6a96821f", "metadata": {}, "source": [ "More relations" @@ -389,38 +406,38 @@ { "cell_type": "code", "execution_count": null, - "id": "0b0cb6ad", + "id": "ffc61dd1", "metadata": {}, "outputs": [], "source": [ "from tools import plot_graph\n", - "import networkx as nx\n", + "from rdflib.namespace import SKOS\n", "ret = eu.query(\"\"\"\n", "PREFIX skos: \n", - "\n", + "PREFIX nuts: \n", "\n", "CONSTRUCT {\n", - "\n", - "?s skos:narrower ?q\n", - "\n", + " ?s skos:narrower ?q ;\n", + " skos:prefLabel ?label .\n", "}\n", "WHERE {\n", + " # Austrian administrative units.\n", + " nuts:AT skos:narrower+ ?q .\n", "\n", - "?s skos:inScheme ;\n", - "skos:narrower ?q ;\n", - " \"0\"\n", - ".\n", + " ?s skos:inScheme ;\n", + " skos:narrower ?q ;\n", + " skos:prefLabel ?label\n", + " .\n", "}\n", - "LIMIT 400\n", + "LIMIT 40\n", "\"\"\")\n", "\n", - "\n", - "plot_graph(ret.graph, layout=nx.planar_layout)" + "plot_graph(ret.graph, label_property=SKOS.prefLabel,)" ] }, { "cell_type": "markdown", - "id": "4aabbc36", + "id": "68dcc425", "metadata": { "slideshow": { "slide_type": "slide" @@ -435,7 +452,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4ce0a3a5", + "id": "1e1bd0da", "metadata": {}, "outputs": [], "source": [ @@ -444,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "0d2e058a", + "id": "5bff3431", "metadata": { "slideshow": { "slide_type": "slide" @@ -459,7 +476,7 @@ { "cell_type": "code", "execution_count": null, - "id": "25d436c0", + "id": "38074a08", "metadata": {}, "outputs": [], "source": [ @@ -483,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "3e09f002", + "id": "fb01e09f", "metadata": {}, "source": [ "Get security insights from the NSA knowledge graph." @@ -492,7 +509,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d9facd7e", + "id": "17b63ccb", "metadata": {}, "outputs": [], "source": [ @@ -509,7 +526,7 @@ }, { "cell_type": "markdown", - "id": "42e2099d", + "id": "eed21151", "metadata": {}, "source": [ "and apply this stuff to our infrastructure." @@ -518,7 +535,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dcfcd6e4", + "id": "2e082bd6", "metadata": {}, "outputs": [], "source": [ @@ -541,11 +558,11 @@ "}\n", "\"\"\"))\n", "\n", - "print('\\n'.join(sorted([\n", + "print(*sorted([\n", " (f\"Attack: {a['attack_label']},\"\n", " f\" {a['affects'].fragment} {a['artifact'].fragment} for {a['uri']}\")\n", " for a in attack_surface\n", - "])))" + "]), sep=\"\\n\")" ] } ], diff --git a/sparql-101/notebooks/01-intro-jsonld.ipynb b/sparql-101/notebooks/01-intro-jsonld.ipynb deleted file mode 100644 index f1bf031..0000000 --- a/sparql-101/notebooks/01-intro-jsonld.ipynb +++ /dev/null @@ -1,1064 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "17089c5d", - "metadata": {}, - "source": [ - "# Knowledge Management 101\n", - "\n", - "## Agenda\n", - "\n", - "- Knowledge management\n", - "- Semantics what?\n", - "- Triples & co\n", - "- Attaching semantics\n", - "- Graph databases\n", - "- JsonLD\n", - "\n", - "*Beware*: commands may contain small typos. You have to fix them to properly complete the course!" - ] - }, - { - "cell_type": "markdown", - "id": "312de91a", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Prerequisites:\n", - "\n", - "- json, yaml, xmlschema\n", - "- HTTP, OpenAPI 3\n", - "- SQL and database hints" - ] - }, - { - "cell_type": "markdown", - "id": "744b399d", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Intro: What is knowledge?\n", - "\n", - "Knowledge is a set of information that is useful for a given purpose.\n", - "\n", - "We express knowledge through language and symbols\n", - "in various forms: text, images, and sounds.\n", - "\n", - "To use knowledge we need to:\n", - "\n", - "- sense;\n", - "- interpret;\n", - "- understand.\n", - "\n", - "When reading a book, for example, we not only need to read and understand the words,\n", - "but also to interpret the meaning of the sentences and paragraphs\n", - "based on the context and our previous knowledge." - ] - }, - { - "cell_type": "markdown", - "id": "d624b915", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "## Intro: The Encyclopedia\n", - "\n", - "The Encyclopedia was one of the first attempts to organize knowledge,\n", - "and to make it available to the public.\n", - "\n", - "Today, we have various encyclopedias on the web,\n", - "such as Wikipedia and dbpedia.\n", - "\n", - "Exercise: open the \"Python\" page on dbpedia:\n", - "\n", - "- https://dbpedia.org/page/Python_(programming_language)\n", - "\n", - "And on Wikidata:\n", - "\n", - "- https://www.wikidata.org/wiki/Q28865" - ] - }, - { - "cell_type": "markdown", - "id": "6b88c40a", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "## Intro: The Encyclopedia\n", - "\n", - "Knowledge is organized in a graph structure,\n", - "where each node is a concept and the edges are the relationships between them." - ] - }, - { - "cell_type": "markdown", - "id": "5cbf10f3", - "metadata": {}, - "source": [ - "```mermaid\n", - "graph LR\n", - "\n", - "subgraph dbpedia[DBpedia]\n", - " dbr:Python[Python] -->|designer| dbr:gvr[Guido van Rossum]\n", - " dbr:Python[Python] -->|operating System| dbr:win[Windows] & dbr:linux[Linux] & ...\n", - " dbr:gvr -->|born| dbr:nl[Netherlands]\n", - "end\n", - "\n", - "subgraph wikidata[WikiData]\n", - " wd:Q30942[Guido van Rossum] ---|developer| wd:Q28865[Python]\n", - " wd:Q16402[Monty Python] ---|named after| wd:Q28865\n", - "end\n", - "\n", - "wd:Q28865 -.-|same as| dbr:Python\n", - "wd:Q30942 -.-|same as| dbr:gvr\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "37d5d4b3", - "metadata": {}, - "source": [ - "This is the basis of the Semantic Web,\n", - "where knowledge is represented in a machine-readable format,\n", - "but it is also the basis of the Web itself\n", - "(e.g., see [Web Linking RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288))." - ] - }, - { - "cell_type": "markdown", - "id": "68900194", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "## Intro: The Encyclopedia\n", - "\n", - "The above graph can be expressed by sentences such as:\n", - "\n", - "- Python is named after Monty Python.\n", - "- Guido van Rossum is the designer of Python.\n", - "- Python runs on Linux.\n", - "\n", - "their general form is" - ] - }, - { - "cell_type": "markdown", - "id": "c005e593", - "metadata": {}, - "source": [ - "```mermaid\n", - "graph LR\n", - "subject((subject)) --- predicate(predicate) --> object\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "0142ecce", - "metadata": {}, - "source": [ - "## Intro: The Encyclopedia\n", - "\n", - "Encyclopedia voices on Wikipedia and dbpedia are expressed in\n", - "[Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/).\n", - "\n", - "It is a formal language to represent knowledge in a machine-readable format\n", - "using triples of the form `subject predicate object`.\n", - "\n", - "Let's translate the above definition from English to RDF:\n", - "\n", - "> Tortellini are a typical Italian food,\n", - ">
made with pasta filled with meat such as prosciutto.\n", - "\n", - "becomes something like" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bcdce224", - "metadata": { - "attributes": { - "classes": [ - "turtle" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - ":Tortellini a :Food .\n", - ":Tortellini :country dbr:Italy .\n", - ":Tortellini :relatedTo dbr:Prosciutto ." - ] - }, - { - "cell_type": "markdown", - "id": "58c46601", - "metadata": {}, - "source": [ - "## Exercise: Get a voice from dbpedia\n", - "\n", - "Now, let's get the actual voice from dbpedia\n", - "using the python RDF library." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "b6190470", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - ")>" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Get a voice from dbpedia using rdflib\n", - "from rdflib import Graph\n", - "from requests import get\n", - "# What's Tortellini?\n", - "g = Graph()\n", - "g.parse(data=get(\"https://dbpedia.org/data/Tortellini.ttl/").text, format=\"turtle\")" - ] - }, - { - "cell_type": "markdown", - "id": "d74700b6", - "metadata": {}, - "source": [ - "We get a graph with the information about Tortellini." - ] - }, - { - "cell_type": "markdown", - "id": "f966d9e4", - "metadata": {}, - "source": [ - "```mermaid\n", - "graph LR\n", - " subgraph dbpedia[DBpedia]\n", - " dbr:Tortellini[Tortellini] -->|is a| dbo:Food[Food]\n", - " dbr:Tortellini -->|related to| dbr:Prosciutto[Prosciutto]\n", - " dbr:Tortellini -->|country| dbp:Italy[Italy]\n", - " ...\n", - " end\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "9e09ef8d", - "metadata": {}, - "source": [ - "An encyclopedia voice contains a list of sentences :)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "520b4791", - "metadata": {}, - "outputs": [], - "source": [ - "# List all the details about Tortellini.\n", - "sentences = list(g)\n", - "\n", - "print('\\n'.join([str(s) for s in sentences]))" - ] - }, - { - "cell_type": "markdown", - "id": "86a71aa0", - "metadata": {}, - "source": [ - "Exercise:\n", - "\n", - "- how many sentences are there?\n", - "- how many elements does each sentence have?" - ] - }, - { - "cell_type": "markdown", - "id": "7a077d4f", - "metadata": {}, - "source": [ - "----" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4d18b18d", - "metadata": {}, - "outputs": [], - "source": [ - "from rdflib.namespace import RDF, RDFS, FOAF\n", - "\n", - "# Now we get specific properties from the graph.\n", - "_type = list(g.objects(predicate=RDF.type))\n", - "print(_type)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c442255d", - "metadata": {}, - "outputs": [], - "source": [ - "import rdflib\n", - "from rdflib.extras.external_graph_libs import rdflib_to_networkx_multidigraph\n", - "import networkx as nx\n", - "import matplotlib.pyplot as plt\n", - "\n", - "G = rdflib_to_networkx_multidigraph(g)\n", - "\n", - "# Plot Networkx instance of RDF Graph\n", - "pos = nx.spring_layout(G, scale=2)\n", - "edge_labels = nx.get_edge_attributes(G, 'r')\n", - "nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)\n", - "nx.draw(G, with_labels=True)\n", - "\n", - "#if not in interactive mode for\n", - "plt.show()\n" - ] - }, - { - "cell_type": "markdown", - "id": "5a8ad042", - "metadata": {}, - "source": [ - "## Intro: Semantics what?\n", - "\n", - "Semantics: the study of meaning.\n", - "\n", - "Semantics ensures that a message is understood;\n", - "messages include data and HTTP exchanges.\n", - "\n", - "Here are some ambiguous messages:" - ] - }, - { - "cell_type": "markdown", - "id": "3cd2a007", - "metadata": {}, - "source": [ - "```yaml\n", - "name: FABIANO Romildo\n", - "income: 4_000_000\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "7c6ef343", - "metadata": {}, - "source": [ - "Is this a given name or a full name?\n", - "What is the currency of the income?\n", - "Is it a monthly or yearly income?" - ] - }, - { - "cell_type": "markdown", - "id": "0945f6fc", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Integrating data from different sources is difficult because of the lack of semantic interoperability." - ] - }, - { - "cell_type": "markdown", - "id": "ff6f372e", - "metadata": {}, - "source": [ - "```mermaid\n", - "graph LR\n", - "Am>\"{name: FABIANO Romildo\\nincome: 4_000_000}\"]\n", - "Cm>\"{givenName: FABIANO\\nfamilyName: Romildo\\ntax: 12_000EUR}\"]\n", - "B((Data sink))\n", - "\n", - "A((Data source 1)) ---Am --> B\n", - "C((Data source 3)) ---Cm --> B\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "cec2a096", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Identifiers may differ between systems,\n", - "and even registry data are not always interoperable." - ] - }, - { - "cell_type": "markdown", - "id": "3779e015", - "metadata": {}, - "source": [ - "```mermaid\n", - "graph LR\n", - "Am>\"{givenName: Angela\\nfamilyName: Merkel\\ndate_of_birth: 1954-07-17}\"]\n", - "Cm>\"{givenName: Angela\\nfamilyName: Kasner\\ndate_of_birth: 1954-07-17}\"]\n", - "B((Data sink))\n", - "\n", - "A((Data source 1)) ---Am --> B\n", - "C((Data source 3)) ---Cm --> B\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "f7ed1b61", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "The lack of standardization in the format and meaning of data\n", - "hinders interoperability between the databases of different organizations,\n", - "and even inside different branches of the same organization,\n", - "and therefore the creation of digital services.\n", - "\n", - "A first example is the lack of syntactic interoperability:\n", - "a well-defined entity (eg. the tax code) is represented with different fields or formats:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f73e3bc9", - "metadata": {}, - "outputs": [], - "source": [ - "{\"tax_code\": \"MRORSS77T05E472W\"}\n", - "{\"cf\": \"mrorss77T05E472W\"}\n", - "{\"taxCode\": \"MRORSS77T05E472W\"}" - ] - }, - { - "cell_type": "markdown", - "id": "7862a925", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Another example is semantic interoperability: the concept of family has different meanings (eg. in the fiscal domain, in the registry domain, ..):" - ] - }, - { - "cell_type": "markdown", - "id": "4991b95b", - "metadata": {}, - "source": [ - "```yaml\n", - "relatives:\n", - " - name: Mario Rossi\n", - " relationship: father\n", - " - name: Carla Rossi\n", - " relationship: sister\n", - " cohabiting: false\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "f0c0d00d", - "metadata": {}, - "source": [ - "```yaml\n", - "relatives:\n", - " - name: Mario Rossi\n", - " relationship: padre\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "683d891e", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Vocabularies to the rescue\n", - "\n", - "Controlled Vocabularies use URIs to disambiguate the meaning of terms and provide semantics.\n", - "\n", - "Every term is identified by an absolute URI.\n", - "The prefix identifies the vocabulary name,\n", - "and the suffix identifies the term." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "131749fc", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "dog_uri = \"https://dbpedia.org/data/Dog/"\n" - ] - }, - { - "cell_type": "markdown", - "id": "3e9f7fbd", - "metadata": {}, - "source": [ - "To semantically standardize data, services and their content, conceptual tools such as ontologies and controlled vocabularies (codelist, taxonomies, ..) are used.\n", - "\n", - "Ontology: an ontology is a set of logical axioms that conceptualize a domain of interest by defining concepts and the semantics of relationships between them.\n", - "\n", - "When ontologies contain further restrictions (e.g.,\n", - "\n", - "Controlled vocabulary: a vocabulary where the terms are validated by a designated authority.\n", - "It can be of different types - EG.A list (codelist), a hierarchical structure (taxonomy), a glossary and a tesauro (which adds further constraints to a taxonomy).\n", - "\n", - "Examples of European controlled vocabularies are found here https://op.europa.eu/en/web/eu-vocabularies/controlled-vocabularies\n", - "\n", - "## Syntax standardization\n", - "\n", - "Data model: a data model, or data schema is a formal representation/description and machine-penadable of the actual or potential content of the data contained in a separate object.\n", - "\n", - "In other words, it is the set of semantic and sequential instructions that can be used\n", - "to check the stored input in a given file,\n", - "or to connect a file that respects these instructions to a system or an application of exchange of information.\n", - "\n", - "There are several formats to describe the patterns,\n", - "including XML Schema and JSON Schema. Formal definition of the syntax of an entity.\n", - "See https://json-schema.org/understanding-json-schema/about.html\n", - "\n", - "A Controlled vocabulary may support syntactic standardization." - ] - }, - { - "cell_type": "markdown", - "id": "b3d81e71", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Per standardizzare sintatticamente i servizi serve pubblicare degli schemi dati a cui tutte le organizzazioni devono conformarsi. Storicamente la standardizzazione degli schemi dati si basa sul concetto di namespace eventualmente distribuiti - vedi il formato di specifica XSD.\n", - "\n", - "Se in ecosistemi ben definiti questo approccio funziona, al crescere della dimensione si pongono una serie di problematiche legate sia alla compattezza dei dati trasportati che del contesto di sicurezza legato ad esempio alla eventuale necessità di dereferenziare gli URI (eg. https://owasp.org/www-pdf-archive/XML_Based_Attacks_-_OWASP.pdf ) .\n", - "\n", - "Mentre poi la metadatazione delle pagine tramite json-ld ha come platea principale i sistemi di processamento batch dei motori di ricerca, i dati convogliati tramite API vengono sempre più frequentemente processati da applicazioni mobile che hanno dei vincoli sia in termini di banda che di consumo di risorse (eg. batteria dei cellulari, riscaldamento) più stringenti.\n", - "\n", - "Inoltre la creazione di servizi sempre più integrati porta ad un aumento del numero di richieste, e della conseguente necessità di supportare in maniera sostenibile i carichi sui sistemi IT." - ] - }, - { - "cell_type": "markdown", - "id": "e4596f2a", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Defining semantic contents\n", - "\n", - "Semantic contents are defined through\n", - "sentences of the form\n", - "`subject predicate object`\n", - "and their sets (called graphs).\n", - "\n", - "Here is an example of a graph with three sentences:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9acd5f4f", - "metadata": {}, - "outputs": [], - "source": [ - "\"the dog\" \"has the color\" \"black\"\n", - "\"the dog\" \"is an\" \"animal\"\n", - "\"black\" \"is a\" \"color\"" - ] - }, - { - "cell_type": "markdown", - "id": "cbc3d113", - "metadata": {}, - "source": [ - "and an associated formal description in text/turle" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "65ed09ce", - "metadata": {}, - "outputs": [], - "source": [ - "prefix animals: \n", - "prefix colors: \n", - "\n", - "animals:dog colors:hasColor colors:black\n", - "colors:black a colors:Color\n", - "animals:dog a animals:Animal" - ] - }, - { - "cell_type": "markdown", - "id": "00c6b948", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "RDF: Resource Description Framework\n", - "\n", - "allows to represent information on the web based on two data structures:\n", - "\n", - "- **elements** (IRIs, blank nodes and literals);\n", - "- **triples** (subject-predicate-object);\n", - "- **graphs** (sets of triples).\n", - "\n", - "and on **vocabularies** of elements identified by IRIs and namespaces.\n", - "\n", - "An RDF dataset is a set of **graphs**." - ] - }, - { - "cell_type": "markdown", - "id": "35726329", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "#### Ontologies\n", - "\n", - "To standardize the semantics of digital content,\n", - "we use ontologies.\n", - "\n", - "In Italy, there's the official ontology of person\n", - "(Common Person Vocabulary) that we can use to uniquely describe someone." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7d125a96", - "metadata": {}, - "outputs": [], - "source": [ - "@prefix cpv: .\n", - "\n", - " cpv:givenName \"Roberto\" .\n", - " cpv:familyName \"Polli\" .\n" - ] - }, - { - "cell_type": "markdown", - "id": "b29a3e45", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "An ontology is defined by a set of IRIs and their relationships." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "03709d15", - "metadata": {}, - "outputs": [], - "source": [ - "@prefix xsd:   .\n", - "@prefix dct:   .\n", - "\n", - "https://w3id.org/italia/onto/CPV%20dct:modified%C2%A0%20/"2020-04-27\"^^xsd:date ;\n", - "https://w3id.org/italia/onto/CPV%20dct:title%20%C2%A0%20%C2%A0%20/"Person Ontology\"@en,\n", - " \"Ontologia delle persone\"@it ;\n" - ] - }, - { - "cell_type": "markdown", - "id": "38922698", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "### Json-LD\n", - "\n", - "JSON-LD è un formato che permette di serializzare in JSON delle informazioni basate sul\n", - "[RDF data model](https://www.w3.org/TR/json-ld11/#data-model).\n", - "\n", - "Un documento JSON-LD è quindi sia un documento RDF che JSON, e rappresenta un'istanza di un RDF data model.\n", - "\n", - "JSON-LD inoltre *estende* RDF per permettere la serializzazione di dataset RDF generalizzati." - ] - }, - { - "cell_type": "markdown", - "id": "8c4fe713", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "Dato un oggetto JSON" - ] - }, - { - "cell_type": "markdown", - "id": "6ab64196", - "metadata": {}, - "source": [ - "```yaml\n", - "id: robipolli@gmail.com\n", - "given_name: Roberto\n", - "family_name: Polli\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "f134c6bb", - "metadata": {}, - "source": [ - "JSON-LD permette di trasformarlo in un grafo RDF associandogli un contesto." - ] - }, - { - "cell_type": "markdown", - "id": "b065135a", - "metadata": {}, - "source": [ - "```yaml\n", - "\"@context\":\n", - " cpv: \"https://w3id.org/italia/onto/CPV/"\n", - " given_name: \"cpv:givenName\"\n", - " family_name: \"cpv:familyName\"\n", - " id: \"@id\"\n", - "id: robipolli@gmail.com\n", - "given_name: Roberto\n", - "family_name: Polli\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "64db2077", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "Oltre all'ontologia italiana, un altro vocabolario\n", - "molto usato sul web è www.schema.org. Le parole chiave\n", - "che definisce sono disponibili in formato json-ld\n", - "https://schema.org/docs/jsonldcontext.jsonld" - ] - }, - { - "cell_type": "markdown", - "id": "98e7246d", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "È anche possibile ridefinire o localizzare i campi,\n", - "eventualmente usando diversi namespace." - ] - }, - { - "cell_type": "markdown", - "id": "cbb809f4", - "metadata": {}, - "source": [ - "```yaml\n", - "\"@context\":\n", - " \"sdo\": \"http://schema.org//"\n", - " \"nome\":\"sdo:name\"\n", - " \"nome_proprio\": \"sdo:givenName\"\n", - "\"@type\": \"Person\"\n", - " \"nome\": \"Jane Doe\"\n", - " \"nome_proprio\": \"Jane\"\n", - " \"sdo:jobTitle\": \"Professor\"\n", - " \"sdo:telephone\": \"(425) 123-4567\"\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "dbe29fa5", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "### Localizzazione\n", - "\n", - "JSON-LD supporta nativamente informazioni\n", - "localizzate:" - ] - }, - { - "cell_type": "markdown", - "id": "a3b29a55", - "metadata": {}, - "source": [ - "```yaml\n", - "-- come lista\n", - "occupation:\n", - "-  @value: \"Student\"\n", - "   @language: en\n", - "-  @value: \"Etudiant\"\n", - "   @language: fr\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "a2235bdc", - "metadata": {}, - "source": [ - "oppure" - ] - }, - { - "cell_type": "markdown", - "id": "f6f2c863", - "metadata": {}, - "source": [ - "```yaml\n", - "-- come oggetto\n", - "@context:\n", - "  occupation:\n", - "    @container: @language\n", - "occupation:\n", - "  en: Student\n", - "  fr: Etudiant\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "318ed8e2", - "metadata": {}, - "source": [ - "oppure" - ] - }, - { - "cell_type": "markdown", - "id": "186dbe2d", - "metadata": {}, - "source": [ - "```yaml\n", - "--- tramite elementi multipli, utile anche per la serializzazione di API semplici\n", - "@context:\n", - " occupation: {@language: en}\n", - " occupation_fr: {@language: fr}\n", - "occupation: Student\n", - "occupation_fr: Etudiant\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "dc23814a", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "#### Context mangling\n", - "\n", - "@context mangling: modificando il contesto di un oggetto\n", - "se ne altera il significato." - ] - }, - { - "cell_type": "markdown", - "id": "98557a84", - "metadata": {}, - "source": [ - "```yaml\n", - "payment_from: alice@foo.example\n", - "payment_to: bob@foo.example\n", - "\"@context\": https://payment/context.jsonld\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "de51c413", - "metadata": {}, - "source": [ - "Alterando la risposta del server https://payment/context.jsonld\n", - "possiamo invertire il verso del pagamento!" - ] - }, - { - "cell_type": "markdown", - "id": "58de02ca", - "metadata": {}, - "source": [ - "```yaml\n", - "@context:\n", - " payment_from: http://banking#debtor\n", - " payment_to: http://banking#creditor\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "ad9dee43", - "metadata": {}, - "source": [ - "->" - ] - }, - { - "cell_type": "markdown", - "id": "8d9e060e", - "metadata": {}, - "source": [ - "```yaml\n", - "@context:\n", - " payment_to: http://banking#debtor\n", - " payment_from: http://banking#creditor\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "a8eaff40", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Esistono diverse ipotesi tecnologiche basate\n", - "sull'elaborazione semantica dei dati a runtime.\n", - "Tutte queste implementazioni devono indirizzare\n", - "questo tipo di rischi." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "py3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/sparql-101/notebooks/01-knowledge.ipynb b/sparql-101/notebooks/01-knowledge.ipynb new file mode 100644 index 0000000..0fe66b8 --- /dev/null +++ b/sparql-101/notebooks/01-knowledge.ipynb @@ -0,0 +1,970 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e368654f", + "metadata": {}, + "source": [ + "# Knowledge Management 101\n", + "\n", + "## Agenda\n", + "\n", + "- What is knowledge?\n", + "- Knowledge and graphs\n", + "- RDF: machine-readable knowledge\n", + "\n", + "*Beware*: commands may contain small typos. You have to fix them to properly complete the course!" + ] + }, + { + "cell_type": "markdown", + "id": "3a86cea5", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Prerequisites:\n", + "\n", + "- json, yaml, xmlschema\n", + "- HTTP, OpenAPI 3\n", + "- SQL and database hints" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "adc2732e", + "metadata": {}, + "outputs": [], + "source": [ + "# rdflib is a python library to work with resources.\n", + "%pip install rdflib" + ] + }, + { + "cell_type": "markdown", + "id": "d2fbcd47", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "\n", + "\n", + "## What is knowledge?\n", + "\n", + "Knowledge is a set of information that is useful for a given purpose.\n", + "\n", + "We express knowledge through language and symbols\n", + "in various forms: text, images, and sounds." + ] + }, + { + "cell_type": "markdown", + "id": "821006e3", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "To use knowledge we need to:\n", + "\n", + "- sense;\n", + "- interpret;\n", + "- understand." + ] + }, + { + "cell_type": "markdown", + "id": "0d529263", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "When reading a book, we need to:\n", + "\n", + "- read and understand the words,\n", + "- interpret the meaning of the sentences and paragraphs;\n", + "- understand the meaning of the text as a whole.\n", + "\n", + "This requires an awareness of the context\n", + "and our previous knowledge." + ] + }, + { + "cell_type": "markdown", + "id": "8b574b09", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## What is knowledge? The Encyclopedia\n", + "\n", + "The [Encyclopédie](https://en.wikipedia.org/wiki/Encyclop%C3%A9die)\n", + "was one of the first modern attempts to organize knowledge,\n", + "and to make it available to the public.\n", + "\n", + "Its voices can be basically seen as a collection of sentences,\n", + "each of the form" + ] + }, + { + "cell_type": "markdown", + "id": "650bb0c8", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "subject((subject)) --- predicate(predicate) --> object\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "e6ea63d5", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Every term is identified by an absolute URI.\n", + "\n", + "The prefix identifies the vocabulary name,\n", + "and the suffix identifies the term." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf27797b", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import URIRef\n", + "dog_uri = URIRef(\"https://dbpedia.org/data/Dog/")" + ] + }, + { + "cell_type": "markdown", + "id": "3a64a168", + "metadata": {}, + "source": [ + "We'll see how to use URIs to express knowledge." + ] + }, + { + "cell_type": "markdown", + "id": "c6ef4fb2", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "For example, an hypotetical Python encyclopedia voice\n", + "could be:\n", + "\n", + "> Python is a programming language\n", + ">
designed by Guido van Rossum and\n", + ">
named after the Monty Python comedy group." + ] + }, + { + "cell_type": "markdown", + "id": "bafe3d7a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## Knowledge and Graphs\n", + "\n", + "We can represent this text as a graph\n", + "\n", + "💡 The object of a sentece\n", + "can be the subject of another sentence." + ] + }, + { + "cell_type": "markdown", + "id": "71df0b36", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "python[Python] -->|is a| programming_language[programming language]\n", + "python -->|designed by| gvr[Guido van Rossum]\n", + "python -->|named after| monty_python[Monty Python]\n", + "monty_python -->|is a| comedy_group[comedy group]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "2c3e257e", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "There are various encyclopedias on the web,\n", + "such as Wikipedia and dbpedia.\n", + "\n", + "##### Exercise: web encyclopedias\n", + "\n", + "1. open the \"Python\" page on dbpedia:\n", + "\n", + " - \n", + "\n", + " and on Wikidata:\n", + "\n", + " - \n", + "\n", + "2. note that in both sites every\n", + " piece of information is expressed in couples\n", + " such as \"predicate\" and \"object\".\n", + "\n", + "3. navigate those pages and\n", + " click on the links to see how\n", + " the information is organized." + ] + }, + { + "cell_type": "markdown", + "id": "9724a8a0", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Since we can represent sentences as graphs,\n", + "it is natural to represent and organize knowledge\n", + "in a graph structure,\n", + "where each node is a concept and the edges are the relationships between them.\n", + "\n", + "Here is an excerpt from the Python encyclopedia voice of Dbpedia:" + ] + }, + { + "cell_type": "markdown", + "id": "bc469e2b", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "\n", + "subgraph dbpedia[DBpedia]\n", + " dbr:Python[Python] -->|designer| dbr:gvr[Guido van Rossum]\n", + " dbr:Python[Python] -->|runs on
operating system| dbr:win[Windows] & dbr:linux[Linux] & ...\n", + " dbr:gvr -->|born| dbr:nl[Netherlands]\n", + "end\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "f7f2e0fb", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Another example is the Python encyclopedia voice of Wikidata:" + ] + }, + { + "cell_type": "markdown", + "id": "1ee7760a", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "subgraph wikidata[WikiData]\n", + " wd:Q30942[Guido van Rossum] ---|developer| wd:Q28865[Python]\n", + " wd:Q16402[Monty Python] ---|named after| wd:Q28865\n", + "end\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "693e0c37", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## Knowledge and Graphs: The Semantic Web\n", + "\n", + "We can use further knowledge - using exisiting cross-references\n", + "between Dbpedia and Wikidata,\n", + "or using our own knowledge - to connect the two graphs together." + ] + }, + { + "cell_type": "markdown", + "id": "e8f7dbc7", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "\n", + "subgraph dbpedia[DBpedia]\n", + " dbr:Python[Python] -->|designer| dbr:gvr[Guido van Rossum]\n", + " dbr:Python[Python] -->|runs on
operating System| dbr:win[Windows] & dbr:linux[Linux] & ...\n", + " dbr:gvr -->|born| dbr:nl[Netherlands]\n", + "end\n", + "\n", + "\n", + "subgraph wikidata[WikiData]\n", + " wd:Q30942[Guido van Rossum] ---|developer| wd:Q28865[Python]\n", + " wd:Q16402[Monty Python] ---|named after| wd:Q28865\n", + "end\n", + "\n", + "wd:Q28865 -.-|same as| dbr:Python\n", + "wd:Q30942 -.-|same as| dbr:gvr\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "41c61763", + "metadata": {}, + "source": [ + "This is the basis of the Semantic Web,\n", + "where knowledge is represented in a machine-readable format.\n", + "\n", + "But it is also the basis of the Web itself\n", + "(e.g., see [Web Linking RFC 8288](https://datatracker.ietf.org/doc/html/rfc8288))." + ] + }, + { + "cell_type": "markdown", + "id": "c6bf4d49", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## RDF: Machine Readable Knowledge\n", + "\n", + "Encyclopedia voices on Wikipedia and dbpedia are expressed in\n", + "[Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/).\n", + "\n", + "It is a W3C formal language to represent knowledge in a machine-readable format\n", + "using triples subject-predicate-object.\n", + "\n", + "RDF has different serialization formats,\n", + "such as [Turtle](https://www.w3.org/TR/turtle/),\n", + "[JSON-LD](https://json-ld.org/),\n", + "and [XML](https://www.w3.org/TR/rdf-syntax-grammar/).\n", + "\n", + "We'll use the Turtle format in this course,\n", + "where a sentence is expressed as a" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd9e5a04", + "metadata": { + "attributes": { + "classes": [ + "raw" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "subject predicate object ." + ] + }, + { + "cell_type": "markdown", + "id": "3ed9dd69", + "metadata": {}, + "source": [ + ":exclamation: note the dot at the end of the sentence :exclamation:" + ] + }, + { + "cell_type": "markdown", + "id": "0daa7dcb", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## RDF: Machine Readable Knowledge\n", + "\n", + "Subjects and predicates are uniquely identified by [URIs](https://www.w3.org/TR/rdf11-concepts/#section-uris).\n", + "\n", + "Objects can be either URIs or literals (strings, numbers, dates, etc.).\n", + "\n", + "URIs provide a definition context for subjects and predicates,\n", + "and allow to disambiguate their meaning depending on the\n", + "definition provided by a given vocabulary.\n", + "\n", + "Every term is identified by an absolute URI\n", + "enclosed by `<>`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e3f8bcd", + "metadata": {}, + "outputs": [], + "source": [ + "sentences = \"\"\"\n", + " a .\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "33e262ab", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Let's parse our first RDF sentence using the [rdflib](https://rdflib.readthedocs.io/en/stable/) library." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "921a883f", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "\n", + "g = Graph()\n", + "g.parse(data=sentences, format=\"turtle\")\n", + "\n", + "print(*g, sep=\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "86c97a05", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "We can also represent the same sentence in JSON-LD." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db64425f", + "metadata": {}, + "outputs": [], + "source": [ + "json_text = g.serialize(format=\"application/ld+json\")\n", + "print(json_text)" + ] + }, + { + "cell_type": "markdown", + "id": "ca5e6d2f", + "metadata": {}, + "source": [ + "##### Exercise: take 2 minutes to map the JSON-LD format to the Turtle format.\n", + "\n", + "We'll see JSON-LD in detail later." + ] + }, + { + "cell_type": "markdown", + "id": "a03371b2", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## RDF: Namespaces and cURIe\n", + "\n", + "RDF use namespace prefixes to shorten URIs\n", + "(the [cURIe](https://www.w3.org/TR/curie/) syntax)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75c6255b", + "metadata": {}, + "outputs": [], + "source": [ + "sentences = \"\"\"\n", + "# The @prefix directive defines a namespace prefix\n", + "@prefix dbr: .\n", + "@prefix dbo: .\n", + "\n", + "dbr:Tortellini a dbo:Food .\n", + "\"\"\"\n", + "\n", + "g1 = Graph()\n", + "g1.parse(data=sentences, format=\"turtle\")\n", + "print(*g1, sep=\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ffa9876", + "metadata": {}, + "outputs": [], + "source": [ + "# Get the namespaces used in the g1 graph.\n", + "g1_ns = set(g1.namespaces())\n", + "print(*g1_ns, sep=\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a94f619d", + "metadata": {}, + "outputs": [], + "source": [ + "# Expand an entry using predefined namespaces.\n", + "g1.namespace_manager.expand_curie(\"dbr:Lasagne\")" + ] + }, + { + "cell_type": "markdown", + "id": "fe22b8a7", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Another vocabulary could provide a different definition for the same term.\n", + ":warning: URI could not always be human-readable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6e419ce", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import URIRef\n", + "wikidata_python = URIRef(\"https://www.wikidata.org/wiki/Q28865/")\n", + "\n", + "wikidata_python" + ] + }, + { + "cell_type": "markdown", + "id": "1e8fce7c", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Let's express the following English definition in RDF:\n", + "\n", + "> Tortellini are a typical Italian food,\n", + ">
made with pasta filled with meat such as prosciutto.\n", + "\n", + "We must use different sentences,\n", + "and we'll express a generic relationship\n", + "with the `dbo:WikiPageWikiLink`\n", + "predicate." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "baee1dbd", + "metadata": {}, + "outputs": [], + "source": [ + "sentences = \"\"\"\n", + "@prefix : .\n", + "@prefix dbp: .\n", + "@prefix dbo: .\n", + "\n", + ":Tortellini a dbo:Food .\n", + ":Tortellini dbp:country :Italy .\n", + ":Tortellini dbo:WikiPageWikiLink :Prosciutto .\n", + ":Meat dbo:WikiPageWikiLink :Prosciutto .\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "d980e884", + "metadata": {}, + "source": [ + "#### Exercise: parse the sentences using rdflib and answer the following questions\n", + "\n", + "- how many sentences are there?\n", + "- how many subjects are there?\n", + "- how many namespaces are there?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f412bed0", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "\n", + "tortellini = Graph()\n", + "\n", + "# Use this cell for the exercise" + ] + }, + { + "cell_type": "markdown", + "id": "68e8fc01", + "metadata": {}, + "source": [ + "#### Exercise: use `Graph.namespaces` to get the namespaces added by the sentences above" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bd74d5c", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "\n", + "default_ns = set(Graph().namespaces())\n", + "\n", + "# Use this cell for the exercise" + ] + }, + { + "cell_type": "markdown", + "id": "9adefd34", + "metadata": {}, + "source": [ + "#### Exercise: serialize the above graph in JSON-LD format" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "022e82e6", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise\n", + "tortellini_jsonld = ..." + ] + }, + { + "cell_type": "markdown", + "id": "6e3d9cb5", + "metadata": {}, + "source": [ + "#### Exercise: Load the JSON-LD object in a variable\n", + "\n", + "- What's the type and len of the serialized object?\n", + "- What's in the first element of the serialized object?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8079541", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "\n", + "# Use this cell for the exercise\n", + "..." + ] + }, + { + "cell_type": "markdown", + "id": "cdc3e4e7", + "metadata": {}, + "source": [ + "#### Exercise: Get a voice from dbpedia\n", + "\n", + "Now, let's get the actual voice from dbpedia." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9abbc8c6", + "metadata": {}, + "outputs": [], + "source": [ + "# Get a voice from dbpedia using rdflib\n", + "from rdflib import Graph\n", + "tortellini_url = \"https://dbpedia.org/data/Tortellini.n3/"\n", + "tortellini_n3 = Path(\"Tortellini.n3\")\n", + "\n", + "# What are Tortellini?\n", + "g = Graph()\n", + "g.parse(tortellini_url, format=\"turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "5bebfdd5", + "metadata": {}, + "source": [ + "We get a graph with the information about Tortellini." + ] + }, + { + "cell_type": "markdown", + "id": "3f3083d7", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + " subgraph dbpedia[DBpedia]\n", + " dbr:Tortellini[Tortellini] -->|is a| dbo:Food[Food]\n", + " dbr:Tortellini -->|related to| dbr:Prosciutto[Prosciutto]\n", + " dbr:Tortellini -->|country| dbp:Italy[Italy]\n", + " ...\n", + " end\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "7c1b4210", + "metadata": {}, + "source": [ + "An encyclopedia voice contains a list of sentences :)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fcc5d966", + "metadata": {}, + "outputs": [], + "source": [ + "# List all the details about Tortellini.\n", + "sentences = list(g)\n", + "excerpt = sentences[0:15]\n", + "print(*[str(s) for s in excerpt], sep=\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "c9d103d6", + "metadata": {}, + "source": [ + "#### Exercise: counting sentences\n", + "\n", + "- how many sentences are there?\n", + "- how many elements does each sentence have?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cbd09932", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise" + ] + }, + { + "cell_type": "markdown", + "id": "b55c2e67", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf711e48", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib.namespace import RDF, RDFS, FOAF\n", + "\n", + "# Now we get specific properties from the graph.\n", + "_type = list(g.objects(predicate=RDF.type))\n", + "print(_type)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2bacc031", + "metadata": {}, + "outputs": [], + "source": [ + "from tools import plot_graph\n", + "plot_graph(g, limit=30)" + ] + }, + { + "cell_type": "markdown", + "id": "8404e1b9", + "metadata": {}, + "source": [ + "#### Exercise: extending graphs\n", + "\n", + "There's plenty of knowledge in the web!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3e08195e", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "from rdflib.namespace import RDFS\n", + "\n", + "tortellini_url = \"https://dbpedia.org/data/Tortellini.n3/"\n", + "tortellini_n3 = Path(\"Tortellini.n3\")\n", + "\n", + "g = Graph()\n", + "g.parse(tortellini_n3, format=\"n3\")\n", + "plot_graph(g, limit=30, pattern=\".*/dbpedia.org\")" + ] + }, + { + "cell_type": "markdown", + "id": "38c1a731", + "metadata": {}, + "source": [ + "And we can connect them together" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f16d365e", + "metadata": {}, + "outputs": [], + "source": [ + "tagliatelle_url = \"https://dbpedia.org/data/Tagliatelle.n3/"\n", + "tagliatelle_n3 = Path(\"Tagliatelle.n3\")\n", + "# Extend our graph\n", + "g.parse(tagliatelle_n3, format=\"n3\")" + ] + }, + { + "cell_type": "markdown", + "id": "d007370a", + "metadata": {}, + "source": [ + "Exercise: how many sentences are there now?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ad41a4e", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise" + ] + }, + { + "cell_type": "markdown", + "id": "28b6a1f2", + "metadata": {}, + "source": [ + "Plot the graph again to see the new nodes and\n", + "their relations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1cd8c96", + "metadata": {}, + "outputs": [], + "source": [ + "plot_graph(g, label_property=RDFS.label, limit=50, pattern=\".*/dbpedia.org\")" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/02-semantics.ipynb b/sparql-101/notebooks/02-semantics.ipynb new file mode 100644 index 0000000..3895a62 --- /dev/null +++ b/sparql-101/notebooks/02-semantics.ipynb @@ -0,0 +1,671 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bf26561a", + "metadata": {}, + "source": [ + "# Knowledge Management 101\n", + "\n", + "## Agenda\n", + "\n", + "- Semantics what?\n", + "- Triples & co\n", + "- Attaching semantics\n", + "- Graph databases\n", + "- JsonLD\n", + "\n", + "*Beware*: commands may contain small typos. You have to fix them to properly complete the course!" + ] + }, + { + "cell_type": "markdown", + "id": "0e905a3a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## Semantics what?\n", + "\n", + "Semantics: the study of meaning.\n", + "\n", + "Semantics ensures that a message is understood;\n", + "messages include data and HTTP exchanges.\n", + "\n", + "Here is an ambiguous message:" + ] + }, + { + "cell_type": "markdown", + "id": "26d31a03", + "metadata": {}, + "source": [ + "```yaml\n", + "name: FABIANO Romildo\n", + "income: 4_000_000\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "e39f6218", + "metadata": {}, + "source": [ + "Is this a given name or a full name?\n", + "What is the currency of the income?\n", + "Is it a monthly or yearly income?" + ] + }, + { + "cell_type": "markdown", + "id": "97892ecc", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Integrating data from different sources is difficult because of the lack of semantic interoperability." + ] + }, + { + "cell_type": "markdown", + "id": "5f2c4406", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "Am>\"{name: FABIANO Romildo\\nincome: 4_000_000}\"]\n", + "Cm>\"{givenName: FABIANO\\nfamilyName: Romildo\\ntax: 12_000EUR}\"]\n", + "B((Data sink))\n", + "\n", + "A((Data source 1)) ---Am --> B\n", + "C((Data source 3)) ---Cm --> B\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "63aaaa68", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + ":exclamation: Identifiers may differ between systems,\n", + "and even registry data are not always interoperable." + ] + }, + { + "cell_type": "markdown", + "id": "37e48758", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "Am>\"{givenName: Angela\\nfamilyName: Merkel\\ndate_of_birth: 1954-07-17}\"]\n", + "Cm>\"{givenName: Angela\\nfamilyName: Kasner\\ndate_of_birth: 1954-07-17}\"]\n", + "B((Data sink))\n", + "\n", + "A((Data source 1)) ---Am --> B\n", + "C((Data source 3)) ---Cm --> B\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "9149bc84", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "The lack of standardization in the format and meaning of data\n", + "hinders interoperability between the databases of different organizations,\n", + "and even inside different branches of the same organization,\n", + "and therefore the creation of digital services.\n", + "\n", + "A first example is the lack of syntactic interoperability:\n", + "a well-defined entity (eg. the tax code) is represented with different fields or formats:" + ] + }, + { + "cell_type": "markdown", + "id": "448590cb", + "metadata": {}, + "source": [ + "```json\n", + "{\"tax_code\": \"RSSMRO77T05E472W\"}\n", + "{\"cf\": \"RSSMRO77T05E472W\"}\n", + "{\"taxCode\": \"RSSMRO77T05E472W\"}\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "6091534d", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Another example is semantic interoperability: the concept of family has different meanings (eg. in the fiscal domain, in the registry domain, ..):" + ] + }, + { + "cell_type": "markdown", + "id": "617f7120", + "metadata": {}, + "source": [ + "```yaml\n", + "relatives:\n", + " - name: Mario Rossi\n", + " relationship: father\n", + " - name: Carla Rossi\n", + " relationship: sister\n", + " cohabiting: false\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "907b2d49", + "metadata": {}, + "source": [ + "```yaml\n", + "relatives:\n", + " - name: Mario Rossi\n", + " relationship: father\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "30a8fe50", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Vocabularies to the rescue: Controlled vocabularies\n", + "\n", + "Controlled Vocabularies use URIs to disambiguate the meaning of terms and provide semantics.\n", + "\n", + "Every term is identified by an absolute URI.\n", + "\n", + "The prefix identifies the vocabulary name,\n", + "and the suffix identifies the term." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b41c241", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import URIRef\n", + "dog_uri = URIRef(\"https://dbpedia.org/data/Dog/")" + ] + }, + { + "cell_type": "markdown", + "id": "a48d6179", + "metadata": {}, + "source": [ + "## Vocabularies to the rescue: RDF\n", + "\n", + "RDF: Resource Description Framework\n", + "\n", + "It allows to represent information on the web based on:\n", + "\n", + "- **elements** (IRIs, blank nodes and literals);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd4650f6", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import URIRef, Literal, BNode\n", + "\n", + "iri = URIRef(\"mailto:mr@test\")\n", + "iri2 = URIRef(\"https://schema.org/name/")\n", + "blank_node = BNode(\"anon\")\n", + "literal = Literal(\"Mario Rossi\")\n", + "\n", + "# Serialize in the N3 format\n", + "# (Notation 3 is a compact, human-readable format for RDF)\n", + "print(iri.n3(), blank_node.n3(), literal.n3(), sep=\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "94633b8c", + "metadata": {}, + "source": [ + "Exercise: RDF elements\n", + "\n", + "In the cell below, create a literal with the following values\n", + "and look at its [Notation 3 (N3)](https://www.w3.org/TeamSubmission/n3/) serialization.\n", + "\n", + "- `42` (integer), `42.0` (float), `\"42\"` (string);\n", + "- `datetime.now()` (date);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0ab3fd2c", + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import datetime\n", + "...\n", + "for value in (42, 42.0, \"42\", datetime.now()):\n", + " literal = Literal(value)\n", + " print(literal.n3())" + ] + }, + { + "cell_type": "markdown", + "id": "53cbb521", + "metadata": {}, + "source": [ + "- **triples** (subject-predicate-object);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26f54d6c", + "metadata": {}, + "outputs": [], + "source": [ + "triple = (iri, iri2, literal)\n", + "print(triple)" + ] + }, + { + "cell_type": "markdown", + "id": "90392664", + "metadata": {}, + "source": [ + "- **graphs** (sets of triples)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8295353", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "g = Graph()\n", + "g.add(triple)\n", + "print(g.serialize(format=\"turtle\"))" + ] + }, + { + "cell_type": "markdown", + "id": "47356d3c", + "metadata": {}, + "source": [ + "and on **vocabularies** of elements identified by IRIs and namespaces." + ] + }, + { + "cell_type": "markdown", + "id": "93948419", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "An RDF dataset is a set of **graphs**." + ] + }, + { + "cell_type": "markdown", + "id": "3fc0989c", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "\n", + "subgraph Dataset\n", + " subgraph Graph1[\"Graph <https\\://example.org/graph1>\"]\n", + " t1[\n", + " subject predicate object .\n", + " subject predicate object .\n", + " subject predicate object .\n", + " ]\n", + " end\n", + " subgraph Graph2[Graph <urn:example:graph2>]\n", + " t2[\n", + " subject predicate object .\n", + " subject predicate object .\n", + " subject predicate object .\n", + " ]\n", + " end\n", + " subgraph Graph3[Graph <_:anonymous_graph>]\n", + " t3[\n", + " subject predicate object .\n", + " subject predicate object .\n", + " subject predicate object .\n", + " ]\n", + " end\n", + "end\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a759d42a", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Dataset\n", + "\n", + "d = Dataset()" + ] + }, + { + "cell_type": "markdown", + "id": "c2164b14", + "metadata": {}, + "source": [ + "#### Exercise: dataset\n", + "\n", + "- use the `Dataset.graphs` method to list the graphs in the dataset;\n", + "\n", + "- add a graph to the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fcdfd698", + "metadata": {}, + "outputs": [], + "source": [ + "simpsons = d.graph(identifier=\"urn:example:simpsons\")\n", + "simpsons.parse(\"simpsons.ttl\", format=\"turtle\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "bd8d51d0", + "metadata": {}, + "source": [ + "- list the graphs in the dataset again, together with their identifiers.\n", + "\n", + "\n", + "\n", + "\n", + "- get the `identifier` of one graph. What's its type?\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "55fac132", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "To semantically standardize data, services and their content,\n", + "conceptual tools such as ontologies\n", + "and controlled vocabularies (codelist, taxonomies, ..)\n", + "are used.\n", + "\n", + "#### Exercise: the DBpedia ontology and dataset\n", + "\n", + "Parse the following RDF sentences in a dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0425f5d9", + "metadata": {}, + "outputs": [], + "source": [ + "sentences = \"\"\"\n", + "@prefix : .\n", + "@prefix dbp: .\n", + "@prefix dbo: .\n", + "\n", + "# We can group together sentences with the same subject\n", + "# using `;`\n", + ":Tortellini\n", + " # `a` is a shortcut for `rdf:type`\n", + " a dbo:Food ;\n", + " dbp:country :Italy ;\n", + " dbo:WikiPageWikiLink :Prosciutto . # Always end with a dot\n", + "\n", + ":Meat dbo:WikiPageWikiLink :Prosciutto .\n", + "\"\"\"\n", + "\n", + "# Create a new named graph in the dataset.\n", + "g = d.graph(identifier=\"urn:my_dbpedia\")\n", + "...\n" + ] + }, + { + "cell_type": "markdown", + "id": "0467e0ef", + "metadata": {}, + "source": [ + "- Get the URIs representing Tortellini and Food using the `Graph.subjects` and `Graph.objects` methods." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d69e0607", + "metadata": {}, + "outputs": [], + "source": [ + "# Deduplicate subjects using set()\n", + "subjects = set( ... )\n", + "objects = set( ... )\n", + "print(subjects | objects)" + ] + }, + { + "cell_type": "markdown", + "id": "66ffff26", + "metadata": {}, + "source": [ + "\n", + "- what's the namespace of the `Tortellini` URI?\n", + "- what's the namespace of the `Food` URI?\n", + "- Open both URIs in a browser and check their content,\n", + " then try to understand the difference between\n", + " their namespaces.\n", + "\n", + "## Ontologies and controlled vocabularies\n", + "\n", + "Ontologies are used to standardize the semantics of digital content.\n", + "\n", + "- **Ontology**: an ontology is a set of logical axioms that conceptualize a domain of interest by defining concepts and the semantics of relationships between them.\n", + "\n", + "Example: the Italian ontology for person defines:\n", + "\n", + "- the concept of person;\n", + "- its properties (e.g., givenName, familyName, hasChildren);\n", + "- the range of each property (e.g., string, date, person);\n", + "- the domain of each property (e.g., person, organization, place);\n", + "- See also ." + ] + }, + { + "cell_type": "markdown", + "id": "beefa870", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph TD\n", + "\n", + "subgraph CPV[\"CPV Ontology\"]\n", + " Person\n", + " familyName([familyName])\n", + " givenName([givenName])\n", + " hasChildren([hasChildren])\n", + "end\n", + "\n", + "subgraph xsd[XMLSchema]\n", + " xsd:string\n", + "end\n", + "\n", + "givenName & familyName & hasChildren -.-o|domain| Person\n", + "\n", + "familyName & givenName ---->|range| xsd:string\n", + "hasChildren -->|range| Person\n", + "\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "13b89b85", + "metadata": {}, + "source": [ + "- **Controlled vocabulary**: a vocabulary where the terms are validated by a designated authority.\n", + " It can be of different types - e.g., a list (codelist), a hierarchical structure (taxonomy), a glossary and a thesaurus (which adds further constraints to a taxonomy).\n", + "\n", + "Examples of European controlled vocabularies are here " + ] + }, + { + "cell_type": "markdown", + "id": "475f43b2", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## Ontologies in Italy\n", + "\n", + "In Italy, there's , a National Data Catalog for Semantic Interoperatbility\n", + "containing the official ontology for person\n", + "(Common Person Vocabulary) that we can use to uniquely describe someone." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a6b3d4f", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix CPV: .\n", + "\n", + "\n", + " CPV:givenName \"Roberto\" ;\n", + " CPV:familyName \"Polli\" .\n" + ] + }, + { + "cell_type": "markdown", + "id": "cbc4f9aa", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "An ontology is defined by a set of IRIs and their relationships." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "208b5897", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "\n", + "sentences = \"\"\"\n", + "@prefix xsd: .\n", + "@prefix dct: .\n", + "\n", + "\n", + " dct:modified \"2020-04-27\"^^xsd:date ;\n", + " # Use `,` to group multiple objects\n", + " dct:title \"Person Ontology\"@en,\n", + " \"Ontologia delle persone\"@it .\n", + "\n", + "# An ontology defines the meaning of predicates.\n", + "\n", + " rdfs:comment \"The given name of a person. E.g. 'Mario' is the given name of the person 'Mario Rossi'.\"@en ;\n", + " rdfs:label \"given name\"@en ;\n", + " rdfs:range xsd:string .\n", + "\n", + "\"\"\"\n" + ] + }, + { + "cell_type": "markdown", + "id": "be7559e1", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "Exercise: how many triples are in the graph?" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/02-sparql.ipynb b/sparql-101/notebooks/02-sparql.ipynb deleted file mode 100644 index 92da4e8..0000000 --- a/sparql-101/notebooks/02-sparql.ipynb +++ /dev/null @@ -1,487 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "24c7471b", - "metadata": {}, - "source": [ - "# Graph databases & SparQL\n", - "\n", - "## Agenda\n", - "\n", - " - Storing and retrieving triples\n", - " - Virtuoso\n", - " - GraphDB\n", - "\n", - "*Beware*: commands contain small typos. You must fix them to properly complete the course!\n", - "\n", - "----\n", - "\n", - "Prerequisites:\n", - "\n", - "- json, yaml, xmlschema\n", - "- HTTP, OpenAPI 3\n", - "- SQL and database hints\n", - "\n", - "\n", - "---\n", - "\n", - "## Graphs (again)\n", - "\n", - "A graph is a set (unordered) of triples.\n", - "\n", - "Each triple consists of a `subject`, `predicate`, `object`.\n", - "\n", - "Graph databases such as [Virtuoso (opensource)](),\n", - "[GraphDB (proprietary)](),\n", - "[Amazon Nepture (proprietary SaaS)]()\n", - "support the [SparQL]() language.\n", - "Other databases - [Neo4j (opensource)]() use\n", - "custom language.\n", - "\n", - "----\n", - "\n", - "Let's populate some entries in SparQL\n", - "and see how it works.\n", - "\n", - "Open [sample.ttl](sample.ttl) and list\n", - "all entries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e6e09119", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "SELECT * WHERE {\n", - " ?subject ?predicate ?object\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "4b490b74", - "metadata": {}, - "source": [ - "(describe sparql query)\n", - "\n", - "----\n", - "\n", - "SparQL can then be used to correlate\n", - "entries using semantically defined\n", - "vocabularies such as FOAF." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "57c63148", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "@prefix foaf: .\n", - "\n", - "SELECT * WHERE {\n", - " ?s foaf:name ?o\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "5a5fd278", - "metadata": {}, - "source": [ - "| s | o |\n", - "| --- | --- |\n", - "| | \"Roberto\"|\n", - "| | \"Jon\"|\n", - "\n", - "In this case `foaf:name` has a very specific meaning.\n", - "You don't need to create indexes in your database\n", - "to search for specific predicates.\n", - "\n", - "----\n", - "\n", - "Graph databases have an inference engine that can be used\n", - "to process complex queries." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9e4c4c6f", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "@prefix foaf: .\n", - "\n", - "SELECT * WHERE {\n", - " ?s foaf:knows ?o" - ] - }, - { - "cell_type": "markdown", - "id": "6357679a", - "metadata": {}, - "source": [ - "| s | o |\n", - "| --- | --- |\n", - "| r@example | j@example |\n", - "\n", - "----\n", - "\n", - "And using multiple lines we can infer things\n", - "such as friend-of-a-friend emails." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5749bceb", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "@prefix foaf: .\n", - "\n", - "SELECT DISTINCT ?mail1, ?mail3 WHERE {\n", - " ?user1 foaf:knows ?user2\n", - " . ?user2 foaf:knows ?user3\n", - "\n", - " . ?user1 foaf:mbox ?mail1\n", - " . ?user3 foaf:mbox ?mail3" - ] - }, - { - "cell_type": "markdown", - "id": "f2060f34", - "metadata": {}, - "source": [ - "Note that the query describes each relation\n", - "ignoring the way data is stored.\n", - "\n", - "---\n", - "\n", - "# Querying DBPedia\n", - "\n", - "[DBPedia](https://dbpedia.org/sparql) is a graph database with a lot of data inside.\n", - "\n", - "We can use it to learn sparql.\n", - "\n", - "- list concepts" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dc625953", - "metadata": {}, - "outputs": [], - "source": [ - "select distinct ?Concept where {[] a ?Concept} LIMIT 20" - ] - }, - { - "cell_type": "markdown", - "id": "0a8082a7", - "metadata": {}, - "source": [ - "----\n", - "\n", - "Now we want to list all `Person`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f33b1f6f", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "@prefix foaf: .\n", - "\n", - "SELECT DISTINCT * WHERE {\n", - " ?s a foaf:Person\n", - "} LIMIT 10" - ] - }, - { - "cell_type": "markdown", - "id": "4d0c8273", - "metadata": {}, - "source": [ - "----\n", - "\n", - "All `Person`s born in Pisa" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e6b4491c", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "\n", - "@prefix foaf: .\n", - "@prefix dbp: .\n", - "@prefix dbr: .\n", - "\n", - "select distinct * where {\n", - " ?s a foaf:Person .\n", - " ?s dbp:birthPlace dbr:Pisa\n", - "} LIMIT 10\n" - ] - }, - { - "cell_type": "markdown", - "id": "a5beda2c", - "metadata": {}, - "source": [ - "... with their deathplaces" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c6583693", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "@prefix foaf: .\n", - "@prefix dbp: .\n", - "@prefix dbr: .\n", - "@prefix dbo: .\n", - "\n", - "\n", - "select distinct * where {\n", - "?s a foaf:Person .\n", - "?s dbp:birthPlace dbr:Pisa .\n", - "?s dbp:deathPlace ?death_place\n", - "} LIMIT 10" - ] - }, - { - "cell_type": "markdown", - "id": "99714093", - "metadata": {}, - "source": [ - "----\n", - "\n", - "If deathplace is in UK" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d7dd1748", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "\n", - "@prefix foaf: .\n", - "@prefix dbp: .\n", - "@prefix dbr: .\n", - "@prefix dbo: .\n", - "\n", - "select distinct * where {\n", - " ?s a foaf:Person .\n", - " ?s dbp:birthPlace dbr:Rome .\n", - " ?s dbp:deathPlace ?deathPlace .\n", - " ?deathPlace dbo:country dbr:United_Kingdom\n", - "} LIMIT 50\n" - ] - }, - { - "cell_type": "markdown", - "id": "e6f2d465", - "metadata": {}, - "source": [ - "----\n", - "\n", - "We can extend the search to every person\n", - "born in Italy and dead in UK:\n", - "\n", - "- replacing `dbr:Rome` with `?birth_place`\n", - "- restricting `?birth_place` to `dbr:Italy`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a494f0ec", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "@prefix foaf: .\n", - "@prefix dbp: .\n", - "@prefix dbr: .\n", - "@prefix dbo: .\n", - "\n", - "SELECT DISTINCT * WHERE {\n", - "\n", - "?s a foaf:Person .\n", - "?s dbp:birthPlace ?birth_place .\n", - "?s dbp:deathPlace ?deathPlace .\n", - "\n", - "?deathPlace dbo:country dbr:United_Kingdom .\n", - "?birth_place dbo:country dbr:Italy\n", - "\n", - "} LIMIT 50" - ] - }, - { - "cell_type": "markdown", - "id": "09498edb", - "metadata": {}, - "source": [ - "----\n", - "\n", - "There's no limit to the inference, for example\n", - "we could require that the birthplace of that\n", - "person should match the one of a Pope." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8958b3c5", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "@prefix foaf: .\n", - "@prefix dbp: .\n", - "@prefix dbr: .\n", - "@prefix dbo: .\n", - "@prefix rdf: .\n", - "\n", - "select distinct * where {\n", - " ?s a foaf:Person .\n", - " ?s dbp:birthPlace ?birth_place .\n", - " ?birth_place dbo:country dbr:Italy .\n", - " ?s dbp:deathPlace ?death_place .\n", - " ?death_place dbo:country dbr:France .\n", - "\n", - " ?pope rdf:type dbo:Pope .\n", - " ?pope dbp:birthPlace ?birth_place . # relation with the birth_place\n", - "} LIMIT 50" - ] - }, - { - "cell_type": "markdown", - "id": "ea0eb0aa", - "metadata": {}, - "source": [ - "----\n", - "\n", - "Shortening sparql queries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d4c6b08b", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "@prefix foaf: .\n", - "@prefix dbp: .\n", - "@prefix dbr: .\n", - "@prefix dbo: .\n", - "@prefix rdf: .\n", - "\n", - "select distinct * where {\n", - " ?s a foaf:Person ;\n", - " dbp:birthPlace ?birth_place ;\n", - " dbp:deathPlace ?death_place .\n", - " ?birth_place dbo:country dbr:Italy .\n", - " ?death_place dbo:country dbr:France .\n", - "\n", - " ?pope rdf:type dbo:Pope ;\n", - " dbp:birthPlace ?birth_place . # relation with the birth_place\n", - "} LIMIT 50" - ] - } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/sparql-101/notebooks/05-sparql.ipynb b/sparql-101/notebooks/05-sparql.ipynb new file mode 100644 index 0000000..b375b52 --- /dev/null +++ b/sparql-101/notebooks/05-sparql.ipynb @@ -0,0 +1,780 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "430d7ec4", + "metadata": {}, + "source": [ + "# SparQL 101\n", + "\n", + "## Agenda\n", + "\n", + "- Storing and retrieving triples\n", + "\n", + "*Beware*: commands contain small typos. You must fix them to properly complete the course!" + ] + }, + { + "cell_type": "markdown", + "id": "03df0e12", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "Prerequisites:\n", + "\n", + "- json, yaml, xmlschema\n", + "- HTTP, OpenAPI 3\n", + "- SQL and database hints" + ] + }, + { + "cell_type": "markdown", + "id": "71108fbe", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Querying graphs with SparQL\n", + "\n", + "An RDF graph is an (unordered) set of triples.\n", + "\n", + "Each triple consists of a `subject`, `predicate`, `object`.\n", + "\n", + "SparQL is a query language for RDF graphs." + ] + }, + { + "cell_type": "markdown", + "id": "06e469b8", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "A sparql query retrieves all entries\n", + "matching one or more sentences" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7abe2b5d", + "metadata": { + "attributes": { + "classes": [ + "raw" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "SELECT *\n", + "WHERE {\n", + " ?subject ?predicate ?object .\n", + " # ... more sentences ...\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "3c813b3b", + "metadata": {}, + "source": [ + "This workshop provides a non-exhaustive introduction to SparQL." + ] + }, + { + "cell_type": "markdown", + "id": "03916d73", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Open [sample.ttl](sample.ttl) in another tab\n", + "and see its content." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57f3a76e", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "g = Graph()\n", + "g.parse(\"sample.ttl\", format=\"text/turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "1c84f013", + "metadata": {}, + "source": [ + "Use our utility function to print the graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad515c08", + "metadata": {}, + "outputs": [], + "source": [ + "from tools import plot_graph\n", + "plot_graph(g, label_property=FOAF.name)" + ] + }, + { + "cell_type": "markdown", + "id": "229465ed", + "metadata": {}, + "source": [ + "List all entries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4837038c", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT *\n", + "WHERE {\n", + " ?subject ?predicate ?object .\n", + "}\n", + "LIMIT 2\n", + "\"\"\"\n", + "result = g.query(q)\n", + "[r.asdict() for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "fb11c835", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- Remove the `LIMIT` clause.\n", + " How many triples are in the graph?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0c1ba415", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise.\n", + "\n", + "# You can use variable names.\n", + "for r in result:\n", + " print(r.subject, r.predicate, r.object, sep=\"\\t\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "f2a704ea", + "metadata": {}, + "source": [ + "- Replace `?subject` with `?foo`:\n", + " what happens?" + ] + }, + { + "cell_type": "markdown", + "id": "dac922b6", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "\n", + "SparQL can correlate\n", + "entries using semantically defined\n", + "vocabularies such as FOAF.\n", + "\n", + ":warning: The `PREFIX` statement in a sparql query\n", + "must not have a trailing dot, because it is not a sentence.\n", + "This is different from the `@prefix` statement\n", + "in turtle." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "072ab7e5", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX foaf: \n", + "\n", + "SELECT * WHERE {\n", + " ?s foaf:name ?o .\n", + "}\n", + "\"\"\"\n", + "\n", + "result = g.query(q)\n", + "[r.asdict() for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "5e691016", + "metadata": {}, + "source": [ + "In this case `foaf:name` has a very specific meaning.\n", + "You don't need to create indexes in your database\n", + "to search for specific predicates.\n", + "\n", + "Exercise:\n", + "\n", + "- What happens if you add a dot at the end of the `PREFIX` statement\n", + " in the above query?" + ] + }, + { + "cell_type": "markdown", + "id": "9f3b0220", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Graph databases have an inference engine that can be used\n", + "to process complex queries." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5fcf96e6", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX foaf: \n", + "\n", + "SELECT *\n", + "WHERE {\n", + " ?s a foaf:Person .\n", + " ?s foaf:knows ?o .\n", + "}\n", + "\"\"\"\n", + "\n", + "result = g.query(q)\n", + "[r.asdict() for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "eb463dbe", + "metadata": {}, + "source": [ + "The `*` operator matches a predicate\n", + "0 or more times.\n", + "This allows to find all\n", + "the friends' network of a person.\n", + "\n", + "Exercise:\n", + "\n", + "- modify the above query replacing `foaf:knows` with `foaf:knows*`\n", + " and see what happens.\n", + "\n", + "SparQL supports GROUP BY and ORDER BY clauses." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cefa4629", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX foaf: \n", + "\n", + "SELECT DISTINCT\n", + " ?s\n", + " (GROUP_CONCAT(?o; separator=\", \") AS ?friends)\n", + "WHERE {\n", + " ?s\n", + " a foaf:Person ;\n", + " foaf:knows* ?o\n", + " .\n", + "}\n", + "GROUP BY ?s\n", + "\"\"\"\n", + "result = g.query(q)\n", + "{str(r.s): {\"network\": str(r.friends) } for r in result}" + ] + }, + { + "cell_type": "markdown", + "id": "129a47a2", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Using multiple lines we can infer things\n", + "such as friend-of-a-friend emails." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f964d6ee", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX foaf: \n", + "\n", + "SELECT DISTINCT\n", + " ?mail1 ?mail3\n", + "WHERE {\n", + " ?user1 foaf:knows ?user2\n", + " .\n", + " ?user2 foaf:knows ?user3\n", + " .\n", + " ?user1 foaf:mbox ?mail1\n", + " .\n", + " ?user3 foaf:mbox ?mail3\n", + "}\n", + "\"\"\"\n", + "\n", + "result = g.query(q)\n", + "[r.asdict() for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "25aac0e3", + "metadata": {}, + "source": [ + "Since we are not interested in the `user2` variable,\n", + "we can simplify the query specifying\n", + "a path of predicates." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44ad5679", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX foaf: \n", + "\n", + "SELECT DISTINCT\n", + " ?mail1 ?mail3\n", + "WHERE {\n", + " ?user1 foaf:knows/foaf:knows ?user3\n", + " .\n", + " ?user1 foaf:mbox ?mail1\n", + " .\n", + " ?user3 foaf:mbox ?mail3\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "{str(r.mail1): str(r.mail3) for r in result}" + ] + }, + { + "cell_type": "markdown", + "id": "c59075dd", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Note that the query describes each relation\n", + "ignoring the way data is stored." + ] + }, + { + "cell_type": "markdown", + "id": "a8d2941d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "# Querying DBPedia\n", + "\n", + "[DBPedia](https://dbpedia.org/sparql) is a graph database with a lot of data inside.\n", + "\n", + "We can use it to learn sparql.\n", + "\n", + "- list concepts" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8022feb", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "SELECT DISTINCT\n", + " ?Concept\n", + "WHERE {\n", + " [] a ?Concept\n", + "}\n", + "LIMIT 20" + ] + }, + { + "cell_type": "markdown", + "id": "3690bc72", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Now we want to list all `Person`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26dd4f10", + "metadata": { + "attributes": { + "classes": [ + "text" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "PREFIX foaf: \n", + "\n", + "SELECT DISTINCT\n", + " *\n", + "WHERE {\n", + " ?s a foaf:Person\n", + "}\n", + "LIMIT 10" + ] + }, + { + "cell_type": "markdown", + "id": "d40dbc06", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "All `Person`s born in Pisa" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a6909c0f", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "PREFIX foaf: \n", + "PREFIX dbp: \n", + "PREFIX dbr: \n", + "\n", + "SELECT DISTINCT\n", + " *\n", + "WHERE {\n", + " ?s a foaf:Person .\n", + " ?s dbp:birthPlace dbr:Pisa\n", + "}\n", + "LIMIT 10\n" + ] + }, + { + "cell_type": "markdown", + "id": "00f2c1d1", + "metadata": {}, + "source": [ + "... with their deathplaces" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68dc8630", + "metadata": { + "attributes": { + "classes": [ + "raw" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "PREFIX foaf: \n", + "PREFIX dbp: \n", + "PREFIX dbr: \n", + "PREFIX dbo: \n", + "\n", + "\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " ?s a foaf:Person .\n", + " ?s dbp:birthPlace dbr:Pisa .\n", + " ?s dbp:deathPlace ?death_place\n", + "}\n", + "LIMIT 10" + ] + }, + { + "cell_type": "markdown", + "id": "b05d64f8", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "If deathplace is in UK" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05edb225", + "metadata": { + "attributes": { + "classes": [ + "raw" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "PREFIX foaf: \n", + "PREFIX dbp: \n", + "PREFIX dbr: \n", + "PREFIX dbo: \n", + "\n", + "SELECT DISTINCT * WHERE {\n", + " ?s a foaf:Person .\n", + " ?s dbp:birthPlace dbr:Rome .\n", + " ?s dbp:deathPlace ?deathPlace .\n", + " ?deathPlace dbo:country dbr:United_Kingdom\n", + "}\n", + "LIMIT 50\n" + ] + }, + { + "cell_type": "markdown", + "id": "981b76f9", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "We can extend the search to every person\n", + "born in Italy and dead in UK:\n", + "\n", + "- replacing `dbr:Rome` with `?birth_place`\n", + "- restricting `?birth_place` to `dbr:Italy`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d41a9fec", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "PREFIX foaf: \n", + "PREFIX dbp: \n", + "PREFIX dbr: \n", + "PREFIX dbo: \n", + "\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " ?s a foaf:Person .\n", + " ?s dbp:birthPlace ?birth_place .\n", + " ?s dbp:deathPlace ?deathPlace .\n", + "\n", + " ?deathPlace dbo:country dbr:United_Kingdom .\n", + " ?birth_place dbo:country dbr:Italy\n", + "}\n", + "LIMIT 50" + ] + }, + { + "cell_type": "markdown", + "id": "f66d126a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "There's no theoretical ;) limit to the inference, for example\n", + "we could require that the birthplace of that\n", + "person should match the one of a Pope." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "882feefb", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "PREFIX foaf: \n", + "PREFIX dbp: \n", + "PREFIX dbr: \n", + "PREFIX dbo: \n", + "PREFIX rdf: \n", + "\n", + "SELECT DISTINCT * WHERE {\n", + " ?s a foaf:Person .\n", + " ?s dbp:birthPlace ?birth_place .\n", + " ?birth_place dbo:country dbr:Italy .\n", + " ?s dbp:deathPlace ?death_place .\n", + " ?death_place dbo:country dbr:France .\n", + "\n", + " ?pope rdf:type dbo:Pope .\n", + " ?pope dbp:birthPlace ?birth_place . # relation with the birth_place\n", + "}\n", + "LIMIT 50" + ] + }, + { + "cell_type": "markdown", + "id": "9d6d054f", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Shortening sparql queries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "086e4214", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "PREFIX foaf: \n", + "PREFIX dbp: \n", + "PREFIX dbr: \n", + "PREFIX dbo: \n", + "PREFIX rdf: \n", + "\n", + "SELECT DISTINCT * WHERE {\n", + " ?s a foaf:Person ;\n", + " dbp:birthPlace ?birth_place ;\n", + " dbp:deathPlace ?death_place .\n", + " ?birth_place dbo:country dbr:Italy .\n", + " ?death_place dbo:country dbr:France .\n", + "\n", + " ?pope rdf:type dbo:Pope ;\n", + " dbp:birthPlace ?birth_place . # relation with the birth_place\n", + "}\n", + "LIMIT 50" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/07-jsonld.ipynb b/sparql-101/notebooks/07-jsonld.ipynb new file mode 100644 index 0000000..496d6eb --- /dev/null +++ b/sparql-101/notebooks/07-jsonld.ipynb @@ -0,0 +1,492 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "384d8485", + "metadata": {}, + "source": [ + "# Agenda\n", + "\n", + "- Storing data vs Describing Knowledge\n", + "- JSON-LD\n", + "\n", + "## Storing data\n", + "\n", + "We store data in different ways and formats:\n", + "using constrained or loose schemas,\n", + "with more or less rigid serializations.\n", + "\n", + "JSON (and YAML) is a human-readable way to\n", + "store data." + ] + }, + { + "cell_type": "markdown", + "id": "ad8329a1", + "metadata": {}, + "source": [ + "```yaml\n", + "[\n", + " { name: Homer, surname: Simpson, spouse: Marge Simpson },\n", + " { name: Marge, surname: Simpson, spouse: Homer Simpson },\n", + "]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "4094059a", + "metadata": {}, + "source": [ + "We can then add identifiers (such as UUIDs or email), to be sure that cross references\n", + "are not ambiguous." + ] + }, + { + "cell_type": "markdown", + "id": "009856a6", + "metadata": {}, + "source": [ + "```yaml\n", + "[\n", + " { email: homer@simpson.org, name: Homer, surname: Simpson, spouse: marge@simpson.org },\n", + " { email: marge@simpson.org, name: Marge, surname: Simpson, spouse: homer@simpson.org },\n", + "]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "3982fbf9", + "metadata": {}, + "source": [ + "Now we may have different datasets, such as the Springfield Elementary\n", + "school. Luckily we can \"join\" on an identifying field, but this is\n", + "not true for all fields." + ] + }, + { + "cell_type": "markdown", + "id": "53bb6e2f", + "metadata": {}, + "source": [ + "```yaml\n", + "[\n", + " { email: bart@simpson.org, name: Bart Simpson, parent: marge@simpson.org },\n", + " { email: milhouse@vanhouten.org, name: Milhouse Van Houten, parent: kirk@vanhouten.org}\n", + "]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "e37eace6", + "metadata": {}, + "source": [ + "So we actually store data, but we lack knowledge.\n", + "\n", + "### JSON-LD\n", + "\n", + "JSON-LD is a JSON serialization for information described using the\n", + "[RDF data model](https://www.w3.org/TR/json-ld11/#data-model).\n", + "\n", + "A JSON-LD document is both an RDF and a JSON document." + ] + }, + { + "cell_type": "markdown", + "id": "a6738316", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64d8797b", + "metadata": {}, + "outputs": [], + "source": [ + "homer = {\n", + " \"email\": \"homer@simpson.org\",\n", + " \"name\": \"Homer\",\n", + " \"surname\": \"Simpson\",\n", + " \"spouse\": \"marge@simpson.org\"\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "c1918357", + "metadata": {}, + "source": [ + "JSON-LD associates it with a context that disambiguates information" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "672265e9", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "\n", + "# A context maps JSON keys to IRIs.\n", + "context = {\n", + " # Map name and surname to the IRI of the FOAF vocabulary.\n", + " \"name\": \"foaf:givenName\",\n", + " \"surname\": \"foaf:familyName\",\n", + " # Use the email key as an IRI,\n", + " # prefixing it with the base IRI.\n", + " \"email\": \"@id\",\n", + " \"@base\": \"https://simpsons.org/#\",\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39b957bd", + "metadata": {}, + "outputs": [], + "source": [ + "homer_ld_json = json.dumps({\n", + " \"@context\": context\n", + " **homer\n", + "})" + ] + }, + { + "cell_type": "markdown", + "id": "b571bacf", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- load `homer_ld_json` in a Graph()\n", + "- print the serialization of the graph in `text/turtle` format" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d60e6e84", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n" + ] + }, + { + "cell_type": "markdown", + "id": "5e805734", + "metadata": {}, + "source": [ + "\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "e1f3e7e6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + " is a collaborative vocabulary to\n", + "describe information about people, places, events, and more.\n", + "While it is not a formal ontology, and should be used with care\n", + "(e.g., in regulated domains),\n", + "it is widely used for search engine optimization (SEO) and\n", + "structured data markup, as well as for increase interoperability\n", + "in non-critical applications (e.g., e-commerce, marketing, ...).\n", + "\n", + "Its terms are availabe here " + ] + }, + { + "cell_type": "markdown", + "id": "2c090b72", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "Start with an object with fields in Italian:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c921c440", + "metadata": {}, + "outputs": [], + "source": [ + "jane = {\n", + " \"nome\": \"Jane Doe\",\n", + " \"nome_proprio\": \"Jane\",\n", + " \"titolo\": \"Professor\",\n", + " \"telefono\": \"(425) 123-4567\"\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "0b69fe7d", + "metadata": {}, + "source": [ + "Annotate it with schema.org." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94d53a5b", + "metadata": {}, + "outputs": [], + "source": [ + "context = {\n", + " \"sdo\": \"http://schema.org//",\n", + " \"nome\": \"sdo:name\",\n", + " \"nome_proprio\": \"sdo:givenName\",\n", + " \"titolo\": \"sdo:jobTitle\",\n", + " \"telefono\": \"sdo:telephone\",\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9454cf55", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "jane_ld = {\n", + " \"@context\": context,\n", + " \"@type\": \"sdo:Person\",\n", + " **jane\n", + " }\n", + "print(json.dumps(jane_ld))" + ] + }, + { + "cell_type": "markdown", + "id": "0c39ed51", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- load `jane_ld` in a Graph()\n", + "- what's the subject of the sentences?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e79fb5c9", + "metadata": {}, + "outputs": [], + "source": [ + "jane_ld_json = ..." + ] + }, + { + "cell_type": "markdown", + "id": "67e71f22", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "### Localization\n", + "\n", + "RDF (and JSON-LD) support localization natively." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9cfb4e7f", + "metadata": {}, + "outputs": [], + "source": [ + "jane_ld[\"competenze\"] = {\n", + " 'it': 'Informatica',\n", + " 'en': 'Computer Science',\n", + " 'fr': 'Informatique'\n", + "}\n", + "\n", + "# Associate the entry to the context.\n", + "jane_ld[\"@context\"].update({\n", + " \"competenze\" : {\n", + " \"@id\": \"sdo:skills\",\n", + " # The @container keyword\n", + " # does the magic of converting\n", + " # a dictionary into a list of objects.\n", + " \"@container\": \"@language\"\n", + " }\n", + "})" + ] + }, + { + "cell_type": "markdown", + "id": "ad333619", + "metadata": {}, + "source": [ + "Now we can serialize the graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5524f85b", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "g=Graph()\n", + "g.parse(data=json.dumps(jane_ld), format='json-ld')\n", + "print(g.serialize(format='turtle'))" + ] + }, + { + "cell_type": "markdown", + "id": "43e11363", + "metadata": {}, + "source": [ + "Another localization mechanism allows\n", + "to map multiple values to a single property." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9cec6010", + "metadata": {}, + "outputs": [], + "source": [ + "jane_ld[\"soprannome\"] = \"Gianna\"\n", + "jane_ld[\"soprannome_fr\"] = \"Jeanette\"\n", + "\n", + "# And the annotations.\n", + "jane_ld[\"@context\"].update({\n", + " \"soprannome\" : \"sdo:alternateName\",\n", + " \"soprannome_fr\" : {\n", + " \"@id\": \"sdo:alternateName\",\n", + " \"@language\": \"fr\"\n", + " }\n", + "})" + ] + }, + { + "cell_type": "markdown", + "id": "534931c7", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "#### Context mangling\n", + "\n", + "Modifying a JSON-LD context,\n", + "alters the\n", + "meaning of the data.\n", + "\n", + "Imagine you have a JSON-LD document\n", + "with a referenced context (i.e., a URL)\n", + "that is supposed to be downloaded\n", + "and used to interpret the data." + ] + }, + { + "cell_type": "markdown", + "id": "1f3b1a16", + "metadata": {}, + "source": [ + "```yaml\n", + "\"@context\": https://payment/context.jsonld\n", + "payment_from: alice@foo.example\n", + "payment_to: bob@foo.example\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "1fb83e7a", + "metadata": {}, + "source": [ + "Someone altering the \n", + "could reverse the payment flow." + ] + }, + { + "cell_type": "markdown", + "id": "183da940", + "metadata": {}, + "source": [ + "```yaml\n", + "# Original context\n", + "@context:\n", + " payment_from: http://banking#debtor\n", + " payment_to: http://banking#creditor\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "eb052a91", + "metadata": {}, + "source": [ + "->" + ] + }, + { + "cell_type": "markdown", + "id": "cc24dd62", + "metadata": {}, + "source": [ + "```yaml\n", + "# Altered context\n", + "@context:\n", + " payment_to: http://banking#debtor\n", + " payment_from: http://banking#creditor\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "94498462", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "When resolving contexts at runtime,\n", + "implementations should address these risks." + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/03-syntax-semantic.ipynb b/sparql-101/notebooks/09-syntax-semantic.ipynb similarity index 79% rename from sparql-101/notebooks/03-syntax-semantic.ipynb rename to sparql-101/notebooks/09-syntax-semantic.ipynb index 250e26a..d7007f0 100644 --- a/sparql-101/notebooks/03-syntax-semantic.ipynb +++ b/sparql-101/notebooks/09-syntax-semantic.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "46c2b764", + "id": "3a42dde6", "metadata": {}, "source": [ "# Modeling Semantic APIs\n", @@ -10,8 +10,18 @@ "## Agenda\n", "\n", "- API e Semantica\n", - "- json-schema e json-ld\n", - "\n", + "- json-schema e json-ld" + ] + }, + { + "cell_type": "markdown", + "id": "c2cacd15", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ "---\n", "\n", "## API e Semantica\n", @@ -25,8 +35,18 @@ "\n", "Descrivendo un'API con un IDL (wsdl o OAS3)\n", "possiamo descrivere la semantica includendola\n", - "nell'IDL.\n", - "\n", + "nell'IDL." + ] + }, + { + "cell_type": "markdown", + "id": "a27295d6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ "---\n", "\n", "### Semantica e Sintassi\n", @@ -46,8 +66,18 @@ "definita in fase di specifica\n", "evita di dover risolvere a runtime\n", "referenze ricorsive\n", - "ed evita problemi di \"@context mangling\".\n", - "\n", + "ed evita problemi di \"@context mangling\"." + ] + }, + { + "cell_type": "markdown", + "id": "15e088aa", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ "----\n", "\n", "#### Collegare context e dati\n", @@ -59,7 +89,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dcf02c64", + "id": "a921a056", "metadata": { "attributes": { "classes": [ @@ -80,11 +110,21 @@ }, { "cell_type": "markdown", - "id": "0fbe123c", + "id": "014874b9", "metadata": {}, "source": [ - "Ma non un meccanismo per associare queste informazioni ad uno schema.\n", - "\n", + "Ma non un meccanismo per associare queste informazioni ad uno schema." + ] + }, + { + "cell_type": "markdown", + "id": "8d886a11", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ "----\n", "\n", "#### Collegare context e schema\n", @@ -99,7 +139,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9d6ee28e", + "id": "b5abf24a", "metadata": { "attributes": { "classes": [ @@ -118,7 +158,7 @@ }, { "cell_type": "markdown", - "id": "0c0af50b", + "id": "93af78e8", "metadata": {}, "source": [ "non è detto che sia semplice associare una sintassi\n", @@ -126,8 +166,18 @@ "\n", "- un indirizzo\n", "- una coppia di coordinate\n", - "- l'URI di un luogo\n", - "\n", + "- l'URI di un luogo" + ] + }, + { + "cell_type": "markdown", + "id": "4ff65249", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ "----\n", "\n", "Uno scambio efficiente di informazioni in tempo reale\n", @@ -138,8 +188,18 @@ "[json-schema]() e [xmlschema]().\n", "\n", "json-schema può essere usato anche per validare\n", - "la sintassi di un file json-ld.\n", - "\n", + "la sintassi di un file json-ld." + ] + }, + { + "cell_type": "markdown", + "id": "b52da7d7", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ "----\n", "\n", "Per dichiarare il @context associandolo ad uno schema\n", @@ -152,19 +212,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "7ee7e934", - "metadata": { - "attributes": { - "classes": [ - "yaml" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "b2bdf902", + "metadata": {}, "source": [ + "```yaml\n", "# Associate a json-ld context to a schema\n", "Customer:\n", "  type: object\n", @@ -175,13 +227,18 @@ " \"@vocab\": \"http://schema.org/"\n", " pet: null\n", " email: {type: string}\n", - "    pet: {type: string}" + "    pet: {type: string}\n", + "```" ] }, { "cell_type": "markdown", - "id": "2f4c603e", - "metadata": {}, + "id": "fa65a21c", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, "source": [ "----\n", "\n", @@ -191,19 +248,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "8ede8e5b", - "metadata": { - "attributes": { - "classes": [ - "yaml" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "10965c44", + "metadata": {}, "source": [ + "```yaml\n", "# Associate a json-ld context to a schema\n", "Customer:\n", "  type: object\n", @@ -212,13 +261,18 @@ " \"@context\":\n", " const: \"https://api.example/customer-context.jsonld/"\n", " email: {type: string}\n", - "    pet: {type: string}" + "    pet: {type: string}\n", + "```" ] }, { "cell_type": "markdown", - "id": "4d003e61", - "metadata": {}, + "id": "3fe6d8af", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, "source": [ "----\n", "\n", @@ -228,19 +282,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "9a523318", - "metadata": { - "attributes": { - "classes": [ - "yaml" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "7fc4de4c", + "metadata": {}, "source": [ + "```yaml\n", "openapi: 3.0.1\n", "...\n", "paths:\n", @@ -264,13 +310,19 @@ " given_name: givenName\n", " family_name: familyName\n", " - $ref: \"#/components/schemas/Person\"\n", - "\n" + "\n", + "\n", + "```" ] }, { "cell_type": "markdown", - "id": "486581b9", - "metadata": {}, + "id": "0654deae", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ "---\n", "\n", @@ -285,19 +337,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "cd6e98e7", - "metadata": { - "attributes": { - "classes": [ - "yaml" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "63a021ca", + "metadata": {}, "source": [ + "```yaml\n", "Person:\n", " type: object\n", " properties:\n", @@ -306,12 +350,14 @@ " x-refersTo: https://w3id.org/italia/onto/CPV/givenName\n", " familyName:\n", " x-refersTo: https://w3id.org/italia/onto/CPV/familyName\n", - " type: string\n" + " type: string\n", + "\n", + "```" ] }, { "cell_type": "markdown", - "id": "96015ba8", + "id": "ace30271", "metadata": {}, "source": [ "### Ontologia per json-schema\n", @@ -331,23 +377,25 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "bd9fd935", - "metadata": { - "attributes": { - "classes": [ - "mermaid" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "b6abad78", + "metadata": {}, "source": [ + "```mermaid\n", "flowchart\n", "\n", " RDF--Framing--> JSON --context--> RDF\n", - " CSV --csv-ld--> RDF\n" + " CSV --csv-ld--> RDF\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "9479b3d7", + "metadata": {}, + "source": [ + "---" ] } ], diff --git a/sparql-101/notebooks/10-rdf.ipynb b/sparql-101/notebooks/10-rdf.ipynb new file mode 100644 index 0000000..6b667eb --- /dev/null +++ b/sparql-101/notebooks/10-rdf.ipynb @@ -0,0 +1,551 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9cffa82c", + "metadata": {}, + "source": [ + "# Graph databases & SparQL\n", + "\n", + "## Agenda\n", + "\n", + "- Storing and retrieving triples\n", + "- Using the `rdflib.Dataset` class\n", + "- Querying and traversing graphs\n", + "\n", + "*Beware*: commands may contain small typos. You must fix them to properly complete the course!" + ] + }, + { + "cell_type": "markdown", + "id": "01e544e8", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Prerequisites:\n", + "\n", + "- JSON, YAML, xmlschema\n", + "- HTTP, OpenAPI 3\n", + "- SQL and database hints" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8ab1bc7", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install oxrdflib" + ] + }, + { + "cell_type": "markdown", + "id": "4bf1396f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Graphs (again)\n", + "\n", + "### RDF databases\n", + "\n", + "An RDF graph is an (unordered) set of triples.\n", + "\n", + "Each triple consists of a `subject`, `predicate`, `object`.\n", + "\n", + "Graph databases such as:\n", + "\n", + "- [Virtuoso (opensource)](https://virtuoso.openlinksw.com/),\n", + "- [GraphDB (proprietary)](),\n", + "- [Amazon Nepture (proprietary SaaS)]()\n", + "\n", + "store triples into graphs.\n", + "\n", + "They can be queried using the [SparQL]() language." + ] + }, + { + "cell_type": "markdown", + "id": "a6ffcbb9", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "### Non-RDF databases: Neo4j\n", + "\n", + "Another notable graph database is [Neo4j (opensource)]().\n", + "\n", + "It is not a triple store, and it\n", + "adopt a different approach named [Labeled Property Graphs](https://en.wikipedia.org/wiki/Labeled_property_graph)\n", + "\n", + "Neo4j can be queried with the [Cypher](https://neo4j.com/developer/cypher-query-language/) language.\n", + "\n", + "Neo4j supports RDF datasets via the Neosemantics plugin." + ] + }, + { + "cell_type": "markdown", + "id": "7c9a105a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "## rdflib backends\n", + "\n", + "We will simulate a graph database using\n", + "[rdflib](https://rdflib.readthedocs.io/en/stable/index.html),\n", + "that supports SparQL queries.\n", + "\n", + "rdflib supports multiple backends to parse and store triples.\n", + "\n", + "oxrdflib is a performant one\n", + "based on [Oxigraph](https://github.com/oxigraph/oxigraph).\n", + "\n", + "Let's create a `Dataset`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae7427ae", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Dataset\n", + "\n", + "d = Dataset(store=\"Oxigraph\")" + ] + }, + { + "cell_type": "markdown", + "id": "71c72e8a", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- use the `Dataset.bind` method to bind the `eu` prefix to the\n", + " `https://publications.europa.eu/resource/authority/` namespace;\n", + "- use the `Dataset.graph` method to create the `eu:country` graph;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b03243d", + "metadata": {}, + "outputs": [], + "source": [ + "print(list(d.graphs()))\n", + "d.bind(\"eu\", \"https://publications.europa.eu/resource/authority//")\n", + "eu_country_id = d.namespace_manager.expand_curie(\"eu:country\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31ebab4c", + "metadata": {}, + "outputs": [], + "source": [ + "# Use the default backend\n", + "g = d.graph(eu_country_id)\n", + "%time g.parse(\"countries-skos-ap-act.ttl\", format=\"text/turtle\")\n", + "print(\"The graph contains\", len(g), \"triples.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "212b8e76", + "metadata": {}, + "outputs": [], + "source": [ + "d = Dataset(store=\"Oxigraph\")\n", + "g = d.graph(eu_country_id)\n", + "# Use the ox-turtle parser.\n", + "%time g.parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")\n", + "print(\"The graph contains\", len(g), \"triples.\")" + ] + }, + { + "cell_type": "markdown", + "id": "7ebdadc0", + "metadata": {}, + "source": [ + "See also:\n", + "\n", + "- \n", + "\n", + "Now create another graph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3906f4f0", + "metadata": {}, + "outputs": [], + "source": [ + "simpsons = d.graph(identifier=\"urn:example:simpsons\")\n", + "simpsons.parse(\"simpsons.ttl\", format=\"ox-turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "9d4e51aa", + "metadata": {}, + "source": [ + "Now list the graphs in the dataset:\n", + "note that the default graph does not contain triples." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8cc286ad", + "metadata": {}, + "outputs": [], + "source": [ + "print(\n", + " {k.identifier.n3(): len(k) for k in d.graphs()}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "f124709b", + "metadata": {}, + "source": [ + "What happens if I query the dataset?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab811073", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"SELECT DISTINCT *\n", + "WHERE {\n", + " [] a ?Class\n", + "}\n", + "LIMIT 10\n", + "\"\"\"\n", + "d.query(q).bindings" + ] + }, + { + "cell_type": "markdown", + "id": "820b4943", + "metadata": {}, + "source": [ + "Now, try to query each graph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71cf57c9", + "metadata": {}, + "outputs": [], + "source": [ + "for g in d.graphs():\n", + " print({g.identifier.n3(): g.query(q).bindings})" + ] + }, + { + "cell_type": "markdown", + "id": "7f65e49f", + "metadata": {}, + "source": [ + "There's a Dataset flag that allows to query all the graphs in the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2613d4a9", + "metadata": {}, + "outputs": [], + "source": [ + "# By default, sparql does not query all the graphs.\n", + "assert d.default_union == False\n", + "\n", + "# .. but you can change this behaviour...\n", + "d.default_union = True\n", + "\n", + "# ... and now you can query all the graphs.\n", + "d.query(q).bindings" + ] + }, + { + "cell_type": "markdown", + "id": "d2b40d6d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## SparQL practice\n", + "\n", + "Let's load into it the [European vocabulary for countries](countries.ttl).\n", + "\n", + "See also:\n", + "\n", + "- [EU Authority Tables](https://op.europa.eu/en/web/eu-vocabularies/authority-tables)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d39c7160", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "\n", + "# Let's create a graph.\n", + "g = Graph(store=\"Oxigraph\")\n", + "\n", + "# And load into it the European\n", + "# vocabulary for countries.\n", + "g.parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "78c49046", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "### Traversing the graph\n", + "\n", + "The Country graph contains more than countries." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5fd9dc5", + "metadata": {}, + "outputs": [], + "source": [ + "to_curie = g.namespace_manager.curie\n", + "\n", + "q = \"\"\"\n", + "PREFIX country: \n", + "\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " country:ITA skos:narrower ?narrower .\n", + " ?narrower skos:prefLabel ?label .\n", + " FILTER (lang(?label) = \"en\")\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "\n", + "narrower = {to_curie(r.narrower): str(r.label) for r in result}\n", + "\n", + "print(*narrower.items(), sep=\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "ba8de546", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- run the above query replacing `skos:narrower` with `skos:narrower*`;\n", + " what happens?\n", + "- run the above query using `country:FRA` and see what happens;\n", + " then replace `skos:narrower` with `skos:narrower/skos:narrower`:\n", + " do you see the same number of results?\n", + "\n", + "\n", + "The `*` operator is used to traverse the graph\n", + "and find all the nodes reachable from the starting node.\n", + "The `*` operator is not supported by all graph databases.\n", + "\n", + "\n", + "#### Creating a graph\n", + "\n", + "SparQL can create new graphs from an existing one." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99294a86", + "metadata": { + "attributes": { + "classes": [ + "sparql" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX country: \n", + "\n", + "CONSTRUCT {\n", + " ?narrower\n", + " skos:prefLabel ?label ;\n", + " skos:broader ?broader .\n", + "}\n", + "WHERE {\n", + " ?narrower\n", + " # All resources transitively related to country:FRA...\n", + " skos:broader* country:FRA ;\n", + "\n", + " # ... with their labels ...\n", + " skos:prefLabel ?label ;\n", + "\n", + " # ... and their broader relations.\n", + " skos:broader ?broader .\n", + "\n", + " FILTER (lang(?label) = \"en\")\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "list(result.graph)" + ] + }, + { + "cell_type": "markdown", + "id": "5c1f8d21", + "metadata": {}, + "source": [ + "Let's visualize the graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "404ea94f", + "metadata": {}, + "outputs": [], + "source": [ + "from tools import plot_graph\n", + "from rdflib import SKOS\n", + "\n", + "plot_graph(result.graph, label_property=SKOS.prefLabel)" + ] + }, + { + "cell_type": "markdown", + "id": "8b00e217", + "metadata": {}, + "source": [ + "#### More metadata\n", + "\n", + "The Country graph contains more than countries ;)\n", + "the resource type is identified by the `lemon:context` property." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c474cc66", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX lemon: \n", + "PREFIX country: \n", + "PREFIX context: \n", + "\n", + "SELECT DISTINCT\n", + " ?broader\n", + " (COUNT(?narrower) AS ?count)\n", + "WHERE {\n", + " ?broader\n", + " skos:narrower+ ?narrower ;\n", + "\n", + " lemon:context context:COUNTRY ;\n", + "\n", + " # ... with their labels ...\n", + " skos:prefLabel ?label .\n", + "\n", + "\n", + " FILTER (lang(?label) = \"en\")\n", + "}\n", + "GROUP BY ?broader\n", + "ORDER BY ?count\n", + "\"\"\"\n", + "result = g.query(q)\n", + "list(result)" + ] + }, + { + "cell_type": "markdown", + "id": "ddc65b42", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Datasets\n", + "\n", + "An RDF dataset is made of multiple graphs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fcd1d493", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Dataset\n", + "\n", + "d = Dataset(store='Oxigraph')\n", + "# Add ns shortcuts.\n", + "d.bind(\"eu\", \"https://publications.europa.eu/resource/authority//")\n", + "d.bind(\"schema\": \"https://schema.org//")\n", + "d.bind(\"euvoc\": \"http://publications.europa.eu/ontology/euvoc#\")\n", + "\n", + "\n", + "\n", + "d.graph(identifier=\"urn:People\").parse(data=json.dumps(nodes_ld), format=\"application/ld+json\")\n", + "d.graph(identifier=\"eu:country\").parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")\n", + "[len(x) for x in d.graphs()]" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/11-sparql-metadata.ipynb b/sparql-101/notebooks/11-sparql-metadata.ipynb new file mode 100644 index 0000000..f4db06e --- /dev/null +++ b/sparql-101/notebooks/11-sparql-metadata.ipynb @@ -0,0 +1,464 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "66959832", + "metadata": {}, + "source": [ + "# Agenda\n", + "\n", + "- Using SparQL to query metadata\n", + "\n", + "## Metadata, Metadata\n", + "\n", + "Between all triples,\n", + "some contain metadata,\n", + "such as:\n", + "\n", + "- the resource types (`rdf:type`/`a`, or `rdfs:subClassOf` predicates);\n", + "- information about predicates;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63209b60", + "metadata": {}, + "outputs": [], + "source": [ + "g=Graph(store=\"Oxigraph\")\n", + "\n", + "# Load the graph.\n", + "g.parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "cfe66ec1", + "metadata": {}, + "source": [ + "And query the simplest metadata." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c67c74b6", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?type\n", + "WHERE {\n", + " ?s a ?type .\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "\n", + "[r.type for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "69200742", + "metadata": {}, + "source": [ + "We can simplify the above query\n", + "avoiding gathering `?s` at all\n", + "using the `[]` syntax\n", + "that matches anything." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29cf8d79", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?type\n", + "WHERE {\n", + " [] a ?type .\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "\n", + "[r.type for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "1c633bcd", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- where can you find the definition of `skos:Concept` and `skos:ConceptScheme`?\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "7470f6a6", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "List `skos:ConceptScheme`s\n", + "and their labels." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb23ac8c", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " ?ConceptScheme\n", + " a skos:ConceptScheme ;\n", + " skos:prefLabel ?label .\n", + " # Only English labels\n", + " FILTER (lang(?label) = \"en\")\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "[r.asdict() for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "5920a054", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- Rewrite the above query using\n", + " two sentences.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "9dd2f7ed", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Now find all the triples\n", + "where the `object` is\n", + "`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "afc6662f", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " ?s ?p .\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "[r.asdict() for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "582a2e6e", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- Rewrite the above query using\n", + " the PREFIX directive.\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50f20648", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX euvoc: \n", + "\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " ?s ?p ...\n", + "}\n", + "LIMIT 6\n", + "\"\"\"\n", + "result = g.query(q)\n", + "[r.asdict() for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "86b9f2c3", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "Let's visualize the graph\n", + "using:\n", + "\n", + "- dotted lines to represent type relations\n", + "- parallelograms to represent literals" + ] + }, + { + "cell_type": "markdown", + "id": "ffad2759", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph\n", + "\n", + "skos:ConceptScheme\n", + "skos:ConceptScheme -->|skos:prefLabel| _l1[/\"Concept Scheme\"/]\n", + "\n", + "country:0005 -.->|a| skos:ConceptScheme\n", + "country:0005 ---|skos:prefLabel| _l[/\"Current EU members\"/]\n", + "\n", + "country -.->|a| skos:ConceptScheme\n", + "country:AUT --->|skos:inScheme| country:0005\n", + "country:BEL --->|skos:inScheme| country:0005\n", + "country:... --->|skos:inScheme| country:0005\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "8058ee1d", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "Now, query for the information\n", + "associated with the `country:AUT` node." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97e4a24d", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX euvoc: \n", + "\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " country:AUT ?p ?o .\n", + "\n", + " # Remove blank nodes.\n", + " FILTER(!isBlank(?o))\n", + "\n", + "}\n", + "\"\"\"\n", + "\n", + "result = g.query(q)\n", + "print(*[(r.p.n3(), r.o.n3()) for r in result],sep=\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "507895d4", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- query all skos:Schemes and their labels\n", + " where `country:AUT`\n", + "- Hint: use two distinct sentences\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "a30b5c0f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "**A knowledge graph contains both data and the associated metadata.**\n", + "**There isn't a fixed schema, but a set of relations.**\n", + "**The actual schema is defined by the ontology and may evolve over time.**" + ] + }, + { + "cell_type": "markdown", + "id": "cb83e676", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "\n", + "Questions:\n", + "\n", + "- List the namespaces registered in the graph.\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea87517c", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " [] a ?type .\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "[r.type for r in result]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "056bd8ec", + "metadata": {}, + "outputs": [], + "source": [ + "# For human readable results, bind prefixes.\n", + "g.bind(\"euvoc\", \"http://publications.europa.eu/ontology/euvoc#Country\")\n", + "g.bind(\"country\", \"http://publications.europa.eu/resource/authority/country//")\n", + "to_curie = g.namespace_manager.curie\n", + "\n", + "result = g.query(\"\"\"\n", + "# You always need to bind the prefixes\n", + "PREFIX euvoc: \n", + "\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " ?c a euvoc:Country .\n", + "}\n", + "LIMIT 3\n", + "\"\"\")\n", + "[to_curie(r.c) for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "ecfe7550", + "metadata": {}, + "source": [ + "Now we will infer how countries are modeled\n", + "retrieving all associated predicates,\n", + "starting with the types.\n", + "\n", + "We can list all the predicates\n", + "associated with `euvoc:Country`,\n", + "thus inferring how countries are modeled.\n", + "\n", + "The fact that every property is defined by\n", + "an URI allows us to use\n", + "the same property in different contexts." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9044c973", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX euvoc: \n", + "PREFIX country: \n", + "\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " [] a euvoc:Country ;\n", + " a ?type .\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "country_types = {r.type for r in result}" + ] + }, + { + "cell_type": "markdown", + "id": "7eac1dfb", + "metadata": {}, + "source": [ + "The data model extracted from the graph:\n", + "subjects in the country:0005 ConceptScheme\n", + "inherit properties from both `euvoc:Country`\n", + "and `skos:Concept`." + ] + }, + { + "cell_type": "markdown", + "id": "131b6b32", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "\n", + "country:... --->|skos:inScheme| country:0005\n", + "\n", + "country:... -.->|a| euvoc:Country & skos:Concept\n", + "\n", + "skos:Concept -.->|a| rdfs:Class\n", + "euvoc:Country -.->|a| rdfs:Class\n", + "euvoc:status -->|rdfs:domain| euvoc:Country\n", + "skos:prefLabel -->|rdfs:domain| skos:Concept\n", + "\n", + "```" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/12-enriching-data.ipynb b/sparql-101/notebooks/12-enriching-data.ipynb new file mode 100644 index 0000000..b75c068 --- /dev/null +++ b/sparql-101/notebooks/12-enriching-data.ipynb @@ -0,0 +1,489 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0e54704d", + "metadata": {}, + "source": [ + "# Agenda\n", + "\n", + "- Enriching data with external knowledge\n", + "\n", + "- Starting from a dataset, identify keywords that can be\n", + " used to link entries to external knowledge.\n", + "\n", + "## Graphs vs Tables\n", + "\n", + "Storing data in tables requires to have a fixed schema.\n", + "\n", + "Column meaning is defined outside the table, or\n", + "where possible, in the table header.\n", + "\n", + "When a row is associated with a specific entity,\n", + "the table has an identifier column,\n", + "usually indexed.\n", + "\n", + "| id | name | surname | spouse |\n", + "|----|-------|---------|----------------|\n", + "| 1 | Homer | Simpson ||\n", + "| 2 | Marge | Simpson ||\n", + "| 3 | Bart | Simpson | ||\n", + "\n", + "Another database related to the same entity\n", + "may have a different schema.\n", + "\n", + "| email | name | surname | parent |\n", + "|--------------------|-------|---------|----------------|\n", + "| | Homer | Simpson ||\n", + "| | Marge | Simpson ||\n", + "| | Bart | Simpson |\n", + "\n", + "With RDF, there is no fixed schema.\n", + "Instead, we have a public set of predicates\n", + "that can be used to describe the same entity." + ] + }, + { + "cell_type": "markdown", + "id": "459a9f7c", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "\n", + "subgraph db1\n", + " db1-id\n", + " db1-name\n", + " db1-surname\n", + "end\n", + "\n", + "subgraph db2\n", + " db2-email\n", + " db2-name\n", + " db2-surname\n", + "end\n", + "\n", + "subgraph foaf\n", + " givenName\n", + " familyName\n", + " mbox\n", + " knows\n", + "end\n", + "\n", + "db1-name --> givenName ~~~ db2-name --> givenName\n", + "db1-surname --> familyName ~~~ db2-surname --> familyName\n", + "db1-id --> mbox ~~~ db2-email --> mbox\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "0ba8e8a8", + "metadata": {}, + "source": [ + "Storing data in a graph allows to use\n", + "a set of predefined predicates (see them as properties)\n", + "that are globally defined." + ] + }, + { + "cell_type": "markdown", + "id": "0e6a0361", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "Start with a json dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59cbe9c8", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "data = [\n", + " {\"email\":\"ft@a.test\", \"name\": \"Francisca\", \"surname\": \"Trujillo\", \"country\": \"ES\"},\n", + " {\"email\":\"mr@a.test\", \"name\": \"Mario\", \"surname\": \"Rossi\", \"country\": \"IT\"},\n", + " {\"email\":\"jd@a.test\", \"name\": \"Jane\", \"surname\": \"Doe\", \"country\": \"US\"},\n", + " {\"email\":\"mg@a.test\", \"name\": \"Rashid\", \"surname\": \"Gowda\", \"country\": \"GB\"},\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "ecbc0e6e", + "metadata": {}, + "source": [ + "Add a context to the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abf88dec", + "metadata": {}, + "outputs": [], + "source": [ + "context = {\n", + " \"@vocab\": \"https://schema.org//",\n", + " \"my\": \"https://a.test/my#\",\n", + " # The code property is appended to the base URL to form the country URI.\n", + " \"email\": \"@id\",\n", + " \"@base\": \"\",\n", + " \"name\": \"givenName\",\n", + " \"surname\": \"familyName\",\n", + " # Define a custom country property.\n", + " \"country\": \"my:country\",\n", + " }" + ] + }, + { + "cell_type": "markdown", + "id": "ad29fbbc", + "metadata": {}, + "source": [ + "Now assemble everything in a JSON-LD graph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8bbf5698", + "metadata": {}, + "outputs": [], + "source": [ + "nodes_ld = {\n", + " # Every country is a resource.\n", + " \"@graph\": data,\n", + " \"@context\": context,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "bac1cf38", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- add a `\"@type\": \"Person\"` to every entry" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fd17203", + "metadata": {}, + "outputs": [], + "source": [ + "nodes_ld = {\n", + " # Every country is a resource.\n", + " \"@graph\": [ { \"@type\": \"Person\", **c} for c in nodes],\n", + " \"@context\": context,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "61c431e3", + "metadata": {}, + "source": [ + "And create a dataset and bind the selected namespaces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e3feba", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Dataset\n", + "\n", + "d = Dataset(store='Oxigraph')\n", + "# Add ns shortcuts.\n", + "d.bind(\"eu\", \"https://publications.europa.eu/resource/authority//")\n", + "d.bind(\"schema\": \"https://schema.org//")\n", + "d.bind(\"euvoc\": \"http://publications.europa.eu/ontology/euvoc#\")\n", + "d.bind(\"my\": \"https://a.test/my#\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "221d2c0a", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- list the graphs in the dataset; how many are there?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c56c6c9a", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "# Create a people graph and add the entries\n", + "d.graph(identifier=\"urn:People\").parse(data=json.dumps(nodes_ld), format=\"application/ld+json\")" + ] + }, + { + "cell_type": "markdown", + "id": "58bf6f4d", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- list the triples in the dataset;\n", + "- list the triples in the `urn:People` graph;\n", + "\n", + "Load the countries vocabulary in a new graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b37a5ad", + "metadata": {}, + "outputs": [], + "source": [ + "d.graph(identifier=\"eu:country\").parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "5ada99af", + "metadata": {}, + "source": [ + "Now we have a graph to enrich with external data.\n", + "\n", + "Match the custom country property with the ISO code\n", + "contained in the EU vocabulary\n", + "to retrieve the EU country identifier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cff65c91", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?person ?country\n", + "WHERE {\n", + "\n", + " # Match sentences in \n", + " GRAPH {\n", + " ?person\n", + " a :Person ;\n", + " my:country ?my_country_code .\n", + " }\n", + "\n", + " # Match sentences in \n", + " GRAPH {\n", + " ?country a euvoc:Country ;\n", + " skos:notation ?isoCode ;\n", + " .\n", + " }\n", + "\n", + " # Match the isoCode of the country.\n", + " FILTER ( ?isoCode = STRDT(?my_country_code, euvoc:ISO_3166_1_ALPHA_2) )\n", + "}\n", + "\"\"\"\n", + "\n", + "res = d.query(q)\n", + "\n", + "[x.asdict() for x in res]\n" + ] + }, + { + "cell_type": "markdown", + "id": "37103281", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- Replace `` with `?g`: what happens?\n", + "- Can you replace both GRAPHs values with `?variables`?\n", + "- See the [string to datatype (STRDT) docs]\n", + "\n", + "If that's OK, we can update the graph with the country identifier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e782e22", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "INSERT {\n", + " GRAPH {\n", + " ?person :nationality ?country .\n", + " }\n", + "}\n", + "WHERE {\n", + "\n", + " # Match sentences in \n", + " GRAPH {\n", + " ?person\n", + " a :Person ;\n", + " my:country ?my_country_code .\n", + " }\n", + "\n", + " # Match sentences in \n", + " GRAPH {\n", + " ?country a euvoc:Country ;\n", + " skos:notation ?isoCode ;\n", + " .\n", + " }\n", + "\n", + " # Match the isoCode of the country.\n", + " FILTER ( ?isoCode = STRDT(?my_country_code, euvoc:ISO_3166_1_ALPHA_2) )\n", + "}\n", + "\"\"\"\n", + "d.update(q)" + ] + }, + { + "cell_type": "markdown", + "id": "e1f0d1c4", + "metadata": {}, + "source": [ + "Now we can see the country identifier in the graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f334c01f", + "metadata": {}, + "outputs": [], + "source": [ + "print(d.graph(identifier=\"urn:People\").serialize(format=\"turtle\"))" + ] + }, + { + "cell_type": "markdown", + "id": "5ae1953d", + "metadata": {}, + "source": [ + "Now, we can even have a \"fat\" graph with all the information" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c00b593a", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX euvoc: \n", + "INSERT {\n", + " GRAPH {\n", + " ?p my:countryName ?countryName .\n", + " }\n", + "}\n", + "WHERE {\n", + " ?p a :Person ;\n", + " :nationality ?country .\n", + "\n", + " ?country skos:prefLabel ?countryName .\n", + " # We want the country name in English.\n", + " FILTER ( LANG(?countryName) = \"en\" )\n", + "}\n", + "\"\"\"\n", + "d.update(q)\n" + ] + }, + { + "cell_type": "markdown", + "id": "2cf488a9", + "metadata": {}, + "source": [ + "We can also mangle the data a bit..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d37155c", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "INSERT {\n", + " GRAPH {\n", + " ?p my:phone ?plus_prefix .\n", + " }\n", + "}\n", + "WHERE {\n", + " ?p a :Person ;\n", + " :nationality _:country .\n", + "\n", + " _:country skos:notation ?prefix .\n", + "\n", + " # We want the country name in English.\n", + " FILTER ( DATATYPE(?prefix) = euvoc:PHONE_PREFIX )\n", + "\n", + " # Bind a modified value to the variable ?plus_prefix.\n", + " BIND (\n", + " CONCAT(\"+\", str(?prefix)) AS ?plus_prefix\n", + " )\n", + "}\n", + "\"\"\"\n", + "d.update(q)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "ed47f959", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- replace `?country` with `_:country`: does it work?\n", + "- replace the two sentences with the following **one**: does it work?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "05804563", + "metadata": { + "attributes": { + "classes": [ + "raw" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "?p a :Person ;\n", + " :nationality [\n", + " skos:notation ?prefix\n", + " ]\n", + "." + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/countries.ttl b/sparql-101/notebooks/countries.ttl new file mode 100644 index 0000000..5292cfb --- /dev/null +++ b/sparql-101/notebooks/countries.ttl @@ -0,0 +1,36438 @@ +@prefix at: . +@prefix atold: . +@prefix dc: . +@prefix euvoc: . +@prefix owl: . +@prefix rdfs: . +@prefix skos: . +@prefix xsd: . + + a skos:Concept ; + at:authority-code "1A0" ; + at:deprecated "true" ; + at:end.use "2008-02-17" ; + at:op-code "1A0" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "1A" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "KOSOVO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "1A" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "1A0" ; + dc:source "EurLex" ] ; + at:start.use "2008-02-17" ; + atold:op-code "1A0" ; + dc:identifier "1A0" ; + owl:deprecated true ; + skos:altLabel "Kosovo"@lb, + "Kosova"@sq, + "Косово"@sr ; + skos:historyNote "Guidance of the Secretary-General of the European Commission of 14.3.2012 about Kosovo denomination in European Commission documents and events: ‘This designation is without prejudice to positions on status, and is in line with UNSCR 1244/1999 and the ICJ Opinion on the Kosovo declaration of independence.’ UNSCR = United Nations Security Council Resolution, ICJ = International Court of Justice."@en, + "The new code XKX is to be used instead of the retired 1A0."@en, + "The user-assigned codes XK and XKX are being used by different organisations as temporary country codes for Kosovo which does not have an officially assigned ISO code yet."@en ; + skos:inScheme atold:country ; + skos:prefLabel "كوسوفو"@ar, + "Косово"@bg, + "Kosovo"@ca, + "Kosovo"@cs, + "Kosovo"@da, + "Kosovo"@de, + "Κόσοβο"@el, + "Kosovo"@en, + "Kosovo"@es, + "Kosovo"@et, + "Kosovo"@fi, + "Kosovo"@fr, + "An Chosaiv"@ga, + "Kosovo"@hr, + "Koszovó"@hu, + "Kósovó"@is, + "Kosovo"@it, + "コソボ"@ja, + "Kososvo"@lb, + "Kosovas"@lt, + "Kosova"@lv, + "Il-Kosovo"@mt, + "Kosovo"@nl, + "Kosovo"@no, + "Kosowo"@pl, + "Kosovo"@pt, + "Kosovo"@ro, + "Косово"@ru, + "Kosovo"@sk, + "Kosovo"@sl, + "Kosovo"@sv, + "Kosova"@tr, + "Косово"@uk, + "科索沃"@zh ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "AFI" ; + at:deprecated "true" ; + at:end.use "1977-06-26" ; + at:op-code "AFI" ; + at:start.use "1967-04-01" ; + atold:op-code "AFI" ; + dc:identifier "AFI" ; + owl:deprecated true ; + skos:altLabel "الفرنسية عفر والعيسيون"@ar ; + skos:historyNote "The ‘AI’ ISO code has been reassigned to Anguilla."@en, + "Wikipedia: The ‘French Territory of Afars and Issas’, ‘Territoire français des Afars et des Issas’ TFAI was the name given to present-day Djibouti between 1967 and 1977, while it was an overseas territory of France. The area was formerly known as the ‘Côte française des Somalis’ or ‘French Somaliland’ between 1896 and 1967."@en, + "Le code ISO ‘AI’ a été réassigné à Anguilla."@fr ; + skos:inScheme atold:country ; + skos:notation "AI"^^euvoc:ISO_3166_1_ALPHA_2, + "AFI"^^euvoc:ISO_3166_1_ALPHA_3, + "AIDJ"^^euvoc:ISO_3166_3, + "AFI"^^euvoc:NAC ; + skos:prefLabel "Френска територия на Афар и Иса"@bg, + "Francouzské území Afarů a Isů"@cs, + "Fransk Afars og Issas"@da, + "Französisches Afar- und Issagebiet"@de, + "Γαλλικό Έδαφος των Αφάρ και Ίσσα"@el, + "French Afar and Issas"@en, + "Territorio Francés de los Afars y de los Issas"@es, + "Afarite ja Issade Territoorium"@et, + "Ranskan Afar ja Issamaa"@fi, + "Territoire français des Afars et des Issas"@fr, + "Críoch Fhrancach na nAfarach agus na nIosach"@ga, + "Francuski Afaru i Issasa"@hr, + "Afarok és Isszák francia területe"@hu, + "Afar e Issas francesi"@it, + "Prancūzijos afarų ir isų teritorija"@lt, + "Francijas Afaru un Isas teritorija"@lv, + "Afar u Issas Franċiżi"@mt, + "Afar- en Issaland"@nl, + "Francuskie Terytorium Afarów i Issów"@pl, + "Território Francês dos Afares e dos Issas"@pt, + "Teritoriul francez al populațiilor afar și issas"@ro, + "Francúzske územie Afarov a Issov"@sk, + "Francoski Afar in Issas"@sl, + "Franska Afar- och Issaterritoriet"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "BUR" ; + at:deprecated "true" ; + at:end.use "1989-06-17" ; + at:op-code "BUR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "BUR" ; + dc:source "EurLex" ] ; + at:start.use "1948-01-04" ; + atold:op-code "BUR" ; + dc:identifier "BUR" ; + owl:deprecated true ; + skos:altLabel "Съюз на Бирма"@bg, + "Barmský svaz"@cs, + "Burmaunionen"@da, + "Union Birma"@de, + "Ένωση της Βιρμανίας"@el, + "Union of Burma"@en, + "Unión de Birmania"@es, + "Birma Liit"@et, + "Burman unioni"@fi, + "Union de Birmanie"@fr, + "Aontas Bhurma"@ga, + "Burmanska unija"@hr, + "Burmai Unió"@hu, + "Unione birmana"@it, + "Birmos Sąjunga"@lt, + "Birmas Savienība"@lv, + "L-Unjoni ta’ Burma"@mt, + "Myanma"@my, + "Unie van Birma"@nl, + "Związek Birmański"@pl, + "União da Birmânia"@pt, + "Uniunea Birmania"@ro, + "Barmská únia"@sk, + "Zvezna republika Burma"@sl, + "Burmaunionen"@sv ; + skos:changeNote "Wikipedia: From 1974 to 1988, the long label changed from ‘Union of Burma’ to ‘Socialist Republic of the Union of Burma’."@en ; + skos:hiddenLabel "Myanmar/Burma"@da, + "Republikken Myanmarunionen"@da, + "fra Myanmar/Burma, burmesisk, myanmarsk"@da, + "birmanisch"@de, + "Βιρμανίας"@el, + "Myanmar/Birmania"@es, + "de Myanmar/Birmania"@es, + "Myanmar/Burma"@fi, + "myanmarilainen/burmalainen"@fi, + "de Birmanie"@fr, + "Burmach"@ga, + "burmansko"@hr, + "burmai"@hu, + "Myanmar/Birmania"@it, + "del Myanmar/Birmania"@it, + "Mianmaras / Birma"@lt, + "Mianmaro / Birmos"@lt, + "Birmas"@lv, + "Myanmarjana/Burmiża"@mt, + "il-Myanmar/Burma"@mt, + "Myanmar / Birma"@nl, + "van Myanmar / Birma"@nl, + "birmanesa"@pt, + "birmană"@ro, + "burmansko"@sl, + "burmesisk"@sv ; + skos:inScheme atold:country ; + skos:notation "25"^^euvoc:EP, + "BUR"^^euvoc:FD_400, + "BU"^^euvoc:ISO_3166_1_ALPHA_2, + "BUR"^^euvoc:ISO_3166_1_ALPHA_3, + "BUMM"^^euvoc:ISO_3166_3, + "BUR"^^euvoc:NAC ; + skos:prefLabel "Бирма"@bg, + "Barma"@cs, + "Burma"@da, + "Birma"@de, + "Βιρμανία"@el, + "Burma"@en, + "Birmania"@es, + "Birma"@et, + "Burma"@fi, + "Birmanie"@fr, + "Burma"@ga, + "Burma"@hr, + "Burma"@hu, + "Birmania"@it, + "Birma"@lt, + "Birma"@lv, + "Burma"@mt, + "Birma"@nl, + "Birma"@pl, + "Birmânia"@pt, + "Birmania"@ro, + "Barma"@sk, + "Burma"@sl, + "Burma"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "BYS" ; + at:deprecated "true" ; + at:end.use "1991-08-24" ; + at:op-code "BYS" ; + at:start.use "1918-03-25" ; + atold:op-code "BYS" ; + dc:identifier "BYS" ; + owl:deprecated true ; + skos:altLabel "Белару́сь"@be, + "Беларуская Савецкая Сацыялістычная Рэспубліка"@be, + "Белоруската съветска социалистическа република"@bg, + "Bjeloruska Sovjetska Socijalistička Republika"@bs, + "República Socialista Soviètica de Bielorússia"@ca, + "Běloruská sovětská socialistická republika"@cs, + "Hviderussiske sovjetsocialistiske republik"@da, + "Belarussische Sozialistische Sowjetrepublik"@de, + "Σοβιετικής Δημοκρατίας της Λευκορωσίας"@el, + "Byelorussian Soviet Socialist Republic"@en, + "República Socialista Soviética de Bielorrusia"@es, + "Valgevene Nõukogude Sotsialistlik Vabariik"@et, + "Bielorrusiar Sobietar Errepublika Sozialistetan"@eu, + "Valko-Venäjän sosialistinen neuvostotasavalta"@fi, + "République socialiste soviétique biélorusse"@fr, + "Poblacht na Bealarúise"@ga, + "República Socialista Soviética de Bielorrusia"@gl, + "Bjeloruska Sovjetska Socijalistička Republika"@hr, + "Belorusz Szovjet Szocialista Köztársaság"@hu, + "Repubblica socialista sovietica bielorussa"@it, + "Baltarusijos Tarybų Socialistinė Respublika"@lt, + "Baltkrievijas Padomju Sociālistisko Republiku"@lv, + "Белоруската Советска Социјалистичка Република"@mk, + "Ir-Repubblika tal-Bjelorussja"@mt, + "Wit-Russische Socialistische Sovjetrepubliek"@nl, + "Den hviterussiske sosialistiske sovjetrepublikk"@no, + "Białoruska Socjalistyczna Republika Radziecka"@pl, + "República Socialista Soviética da Bielorrússia"@pt, + "Republica Sovietică Socialistă Belarusă"@ro, + "Белорусская Советская Социалистическая Республика"@ru, + "Bieloruská sovietska socialistická republika"@sk, + "Beloruska sovjetskih socialističnih republik"@sl, + "Republikave Sovjetike Socialiste Bjelloruse"@sq, + "Белоруска Совјетска Социјалистичка Република"@sr, + "Vitryska socialistiska sovjetrepubliken"@sv, + "Beyaz Rusya Sovyet Sosyalist Cumhuriyeti"@tr, + "Білоруська Радянська Соціалістична Республіка"@uk ; + skos:changeNote "Closing event: long name change. Successor ‘Republic of Belarus’ COU0007."@en, + "Wikipedia: Byelorussian SSR is a founding constituent republic of the Soviet Union COU0054."@en ; + skos:hiddenLabel "Република Беларус"@bg, + "Běloruská republika"@cs, + "Hviderusland"@da, + "Republikken Hviderusland"@da, + "Belarus"@de, + "Republik Belarus"@de, + "ΣΣΔ Λευκορωσίας"@el, + "República de Bielorrusia"@es, + "bielorrusa"@es, + "Valgevene NSV"@et, + "RSS de Bielorussie"@fr, + "biélorusse"@fr, + "an Bhealarúis"@ga, + "Republika Bjelarus"@hr, + "Belorusz SZSZK"@hu, + "belorusz szovjet szocialista köztársasági"@hu, + "Repubblica di Bielorussia"@it, + "Baltarusijos"@lt, + "Baltarusijos Respublika"@lt, + "Baltkrievijas"@lv, + "Belarussa"@mt, + "il-Belarussja"@mt, + "ir-Repubblika tal-Belarussja"@mt, + "Belarus / Wit-Rusland"@nl, + "Belarussische / Wit-Russische"@nl, + "República da Bielorrússia"@pt, + "Bielorusia"@ro, + "bielorusă"@ro, + "Bieloruská SSR"@sk, + "Beloruska sovjetska socialistična republika"@sl, + "Republiken Vitryssland"@sv ; + skos:inScheme atold:country ; + skos:notation "27"^^euvoc:EP, + "BY"^^euvoc:ISO_3166_1_ALPHA_2, + "BYS"^^euvoc:ISO_3166_1_ALPHA_3, + "112"^^euvoc:ISO_3166_1_NUM, + "BYAA"^^euvoc:ISO_3166_3, + "BYS"^^euvoc:NAC ; + skos:prefLabel "Беларусь"@be, + "Беларус"@bg, + "Bjelorusija"@bs, + "Bielorússia"@ca, + "Bělorusko"@cs, + "Belarus"@da, + "Weißrussland"@de, + "Λευκορωσία"@el, + "Belarus"@en, + "Bielorrusia"@es, + "Valgevene"@et, + "Bielorrusia"@eu, + "Valko-Venäjä"@fi, + "Hvítarussland"@fo, + "Belarus"@fr, + "An Bhealarúis"@ga, + "Bielorrusia"@gl, + "Bjelorusija"@hr, + "Fehéroroszország"@hu, + "Hvíta-Rússland"@is, + "Bielorussia"@it, + "Baltarusija"@lt, + "Baltkrievija"@lv, + "Белорусија"@mk, + "Il-Bjelorussja"@mt, + "Wit-Rusland"@nl, + "Kviterussland"@no, + "Białoruś"@pl, + "Bielorrússia"@pt, + "Bielorussia"@rm, + "Belarus"@ro, + "Белоруссия"@ru, + "Bielorusko"@sk, + "Belorusija"@sl, + "Bjellorusia"@sq, + "Белорусија"@sr, + "Vitryssland"@sv, + "Beyaz Rusya"@tr, + "Білорусь"@uk ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "CSK" ; + at:deprecated "true" ; + at:end.use "1992-12-31" ; + at:op-code "CSK" ; + at:start.use "1945-04-04" ; + atold:op-code "CSK" ; + dc:identifier "CSK" ; + owl:deprecated true ; + skos:altLabel "Чехословашка република"@bg, + "Чехословашка социалистическа република"@bg, + "Чешка и Словашка федеративна република"@bg, + "Čehoslovačka Republika"@bs, + "Čehoslovačka Socijalistička Republika"@bs, + "Češka i Slovačka Federativna Republika"@bs, + "República Txeca i Eslovàquia"@ca, + "Československá republika"@cs, + "Československá socialistická republika"@cs, + "Česká a Slovenská federativní republika"@cs, + "Den Tjekkiske og Slovakiske Føderative Republik"@da, + "Den Tjekkoslovakiske Republik"@da, + "Den tjekkoslovakiske socialistiske Republik"@da, + "Tschechische und Slowakische Föderative Republik"@de, + "Tschechoslowakische Republik"@de, + "Tschechoslowakische Sozialistische Republik"@de, + "Τσεχική και Σλοβακική Ομοσπονδιακή Δημοκρατία"@el, + "Τσεχοσλοβακική Δημοκρατία"@el, + "Τσεχοσλοβακική Σοσιαλιστική Δημοκρατία"@el, + "Czech and Slovak Federative Republic"@en, + "Czechoslovak Republic"@en, + "Czechoslovak Socialist Republic"@en, + "República Checoslovaca"@es, + "República Federativa Checa y Eslovaca"@es, + "República Socialista de Checoslovaquia"@es, + "Tšehhi ja Slovaki Liitvabariik"@et, + "Tšehhoslovakkia Sotsialistlik Vabariik"@et, + "Tšehhoslovakkia Vabariik"@et, + "Tšekin ja Slovakian liittotasavalta"@fi, + "Tšekkoslovakian sosialistinen tasavalta"@fi, + "Tšekkoslovakian tasavalta"@fi, + "République fédérative tchèque et slovaque"@fr, + "République socialiste tchécoslovaque"@fr, + "République tchécoslovaque"@fr, + "Poblacht Chónaidhmitheach na Seice agus na Slóvaice"@ga, + "Poblacht Shóisialach na Seicslóvaice"@ga, + "Poblacht na Seicslóvaice"@ga, + "Čehoslovačka Republika"@hr, + "Čehoslovačka Socijalistička Republika"@hr, + "Češka i Slovačka Federativna Republika"@hr, + "Cseh és Szlovák Szövetségi Köztársaság"@hu, + "Csehszlovák Köztársaság"@hu, + "Csehszlovák Szocialista Köztársaság"@hu, + "Repubblica cecoslovacca"@it, + "Repubblica federativa ceca e slovacca"@it, + "Repubblica socialista cecoslovacca"@it, + "Čekijos ir Slovakijos Federacinė Respublika"@lt, + "Čekoslovakijos Respublika"@lt, + "Čekoslovakijos Socialistinė Respublika"@lt, + "Čehijas un Slovākijas Federatīvā Republika"@lv, + "Čehoslovākijas Republika"@lv, + "Čehoslovākijas Sociālistiskā Republika"@lv, + "Чешка и Словачка федеративна република"@mk, + "Ir-Repubblika Federattiva Ċeka u Slovakka"@mt, + "Ir-Repubblika Soċjalista Ċekoslovakka"@mt, + "Ir-Repubblika Ċekoslovakka"@mt, + "Tsjechische en Slowaakse Federatieve Republiek"@nl, + "Tsjechoslowaakse Republiek"@nl, + "Tsjechoslowaakse Socialistische Republiek"@nl, + "Føderale republikken Tsjekko-Slovakia"@no, + "Sosialistiske republikken Tsjekkoslovakia"@no, + "Tsjekkoslovakiske republikk"@no, + "Czechosłowacka Republika Socjalistyczna"@pl, + "Czeska i Słowacka Republika Federacyjna"@pl, + "Republika Czechosłowacka"@pl, + "República Checoslovaca"@pt, + "República Federativa Checa e Eslovaca"@pt, + "República Socialista Checoslovaca"@pt, + "Republica Cehoslovacă"@ro, + "Republica Federativă Cehă și Slovacă"@ro, + "Republica Socialistă Cehoslovacă"@ro, + "Чехословацкая республика"@ru, + "Чехословацкой социалистической республикой"@ru, + "Чешская и Словацкая Федеративная Республика"@ru, + "Československá republika"@sk, + "Československá socialistická republika"@sk, + "Česká a Slovenská Federatívna Republika"@sk, + "Češka in Slovaška zvezna republika"@sl, + "Češkoslovaška republika"@sl, + "Češkoslovaška socialistična republika"@sl, + "Чехословачка Република"@sr, + "Чехословачка Социјалистичка Република"@sr, + "Чешка и Словачка Федеративна Република"@sr, + "Socialistiska republiken Tjeckoslovakien"@sv, + "Tjeckiska och slovakiska federativa republiken"@sv, + "Tjeckoslovakiska republiken"@sv, + "Чесько-Словацька Федеративна Республіка"@uk, + "Чехо-Словацька Республіка"@uk, + "Чехо-Словацька Соціалістична Республіка"@uk ; + skos:changeNote "Closing event: Long name change. Successor ‘Czech and Slovak Federative Republic’ COU0063."@en, + "Closing event: Long name change. Successor ‘Czechoslovak Socialist Republic’ COU0062."@en, + "Closing event: Splitting of the country into Czech Republic and Slovak Republic. Long name change. Successors ‘Czech Republic’ COU0013 and ‘Slovak Republic’ COU0052."@en, + "Opening event: long name change. Predecessor ‘Czechoslovak Republic’ COU0010."@en, + "Opening event: long name change. Predecessor ‘Czechoslovak Socialist Republic’ COU0062."@en, + "Satellite state of the Soviet Union 1948-1989 in the Warsaw Pact. Source: Wikipedia."@en ; + skos:hiddenLabel "tjekkoslovakisk"@da, + "Tschechoslowakische Sozialistische Republik"@de, + "tschechoslowakisch"@de, + "τσεχοσλοβακική"@el, + "Czech"@en, + "Tšehhi"@et, + "tšekkoslovakialainen"@fi, + "Seicslóvaiceach"@ga, + "an tSeicslóvaic"@ga, + "Čehoslovačka Socijalistička Republika"@hr, + "čehoslovačko"@hr, + "Csehoszlovákia"@hu, + "cecoslovacca"@it, + "Čekoslovakijos"@lt, + "Čehoslovākijas"@lv, + "Tsjecho-Slowaaks"@nl, + "checoslovaca"@pt, + "cehoslovacă"@ro, + "Československo"@sk, + "tjeckoslovakisk"@sv ; + skos:historyNote "The ‘CS’ ISO code had been reassigned to ‘Serbia and Montenegro’, now Serbia, RS and Montenegro, ME."@en, + "Le code ISO «CS» a été réassigné à la «Serbie-et-Monténégro», maintenant Serbie, RS et Monténégro, ME."@fr ; + skos:inScheme atold:country ; + skos:notation "39"^^euvoc:EP, + "CS"^^euvoc:ISO_3166_1_ALPHA_2, + "CSK"^^euvoc:ISO_3166_1_ALPHA_3, + "200"^^euvoc:ISO_3166_1_NUM, + "CSHH"^^euvoc:ISO_3166_3, + "CSK"^^euvoc:NAC ; + skos:prefLabel "Чэхаславакія"@be, + "Чехословакия"@bg, + "Čehoslovačka"@bs, + "Txecoslovàquia"@ca, + "Československo"@cs, + "Tjekkoslovakiet"@da, + "Tschechoslowakei"@de, + "Τσεχοσλοβακία"@el, + "Czechoslovakia"@en, + "Checoslovaquia"@es, + "Tšehhoslovakkia"@et, + "Txekoslovakia"@eu, + "Tšekkoslovakia"@fi, + "Kekkoslovakia"@fo, + "Tchécoslovaquie"@fr, + "An tSeicslóvaic"@ga, + "Checoslovaquia"@gl, + "Čehoslovačka"@hr, + "Csehszlovákia"@hu, + "Tékkóslóvakía"@is, + "Cecoslovacchia"@it, + "Čekoslovakija"@lt, + "Čehoslovākija"@lv, + "Чехословачка"@mk, + "Ċekoslovakkja"@mt, + "Tsjecho-Slowakije"@nl, + "Tsjekkoslovakia"@no, + "Czechosłowacja"@pl, + "Checoslováquia"@pt, + "Cehoslovacia"@ro, + "Чехословакия"@ru, + "Česko-Slovensko"@sk, + "Češkoslovaška"@sl, + "Чехословачка"@sr, + "Tjeckoslovakien"@sv, + "Çekoslovakya"@tr, + "Чехословаччина"@uk ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "CTE" ; + at:deprecated "true" ; + at:end.use "1979-07-11" ; + at:op-code "CTE" ; + at:start.use "1950-05-09" ; + atold:op-code "CTE" ; + dc:identifier "CTE" ; + owl:deprecated true ; + skos:hiddenLabel "Canton- og Enderburyøerne"@da, + "fra Canton- og Enderburyøerne"@da, + "Canton und Enderbury"@de, + "von Canton und Enderbury"@de, + "Νήσοι Καντών και Εντέρμπουρυ"@el, + "Νήσων Καντών και Εντέρμπουρυ"@el, + "de las islas Kanton y Enderbury"@es, + "islas Kanton y Enderbury"@es, + "Cantoni ja Enderbury saared"@et, + "Cantoni ja Enderbury saarte"@et, + "Kanton ja Enderbury -saaret"@fi, + "kiribatilainen"@fi, + "Iles Canton et Enderbury"@fr, + "Oileáin Chantúin agus Enderbury"@ga, + "duine ó Oileáin Chantúin agus Enderbury"@ga, + "Otoci Kanton i Enderbury"@hr, + "Otoka Kanton i Enderbury"@hr, + "Canton- és Enderbury-szigeteki"@hu, + "Isole Canton e Enderbury"@it, + "delle Isole Canton e Enderbury"@it, + "Kantono ir Endebrio salos"@lt, + "Kantono ir Endebrio salų"@lt, + "Kantonas un Enderberijas Salu"@lv, + "il-Gżejjer Canton u Enderbury"@mt, + "il-Gżejjer Kanton u Enderbury"@mt, + "van Canton en Enderbury"@nl, + "Canton i Enderbury"@pl, + "Ilhas Canton e Enderbury"@pt, + "das Ilhas Canton e Enderbury"@pt, + "din Insulele Canton și Enderbury"@ro, + "Ostrovy Canton a Enderbury"@sk, + "otoka Kanton in Enderbury"@sl, + "otokov Kanton in Enderbury"@sl, + "Canton och Enderburyöarna"@sv, + "från Canton och Enderburyöarna"@sv ; + skos:inScheme atold:country ; + skos:notation "40"^^euvoc:EP, + "CT"^^euvoc:ISO_3166_1_ALPHA_2, + "CTE"^^euvoc:ISO_3166_1_ALPHA_3, + "CTKI"^^euvoc:ISO_3166_3, + "CTE"^^euvoc:NAC ; + skos:prefLabel "Острови Кантон и Ендърбъри"@bg, + "Ostrovy Canton a Enderbury"@cs, + "Øerne Canton og Enderbury"@da, + "Canton- und Enderbury-Inseln"@de, + "Νησιά Καντών και Εντέρμπουρυ"@el, + "Canton and Enderbury Islands"@en, + "Islas Canton y Enderbury"@es, + "Canton ja Enderbury"@et, + "Canton- ja Enderburysaaret"@fi, + "Îles Canton et Enderbury"@fr, + "Oileáin Canton agus Enderbury"@ga, + "Canton i otok Enderbury"@hr, + "Canton- és Enderbury-szigetek"@hu, + "Canton e isole Enderbury"@it, + "Kantono ir Enderberio salos"@lt, + "Kantonas un Enderberijas Salas"@lv, + "Il-Gżejjer Canton u Enderbury"@mt, + "Canton en Enderbury"@nl, + "Wyspy Kanton i Enderbury"@pl, + "Ilhas Cantão e Enderbury"@pt, + "Insulele Canton și Enderbury"@ro, + "Canton a Enderbury"@sk, + "Otoka Canton in Enderbury"@sl, + "Kanton och Enderbury"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "DDR" ; + at:deprecated "true" ; + at:end.use "1990-10-02" ; + at:op-code "DDR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "DDR" ; + dc:source "EurLex" ] ; + at:start.use "1949-05-23" ; + atold:op-code "DDR" ; + dc:identifier "DDR" ; + owl:deprecated true ; + skos:altLabel "Усходняя Германія"@be, + "ГДР"@bg, + "Източна Германия"@bg, + "Istočna Njemačka"@bs, + "Alemanya de l’Est"@ca, + "NDR"@cs, + "Východní Německo"@cs, + "DDR"@da, + "Østtyskland"@da, + "DDR"@de, + "Ostdeutschland"@de, + "Ανατολική Γερμανία"@el, + "ΓΛΔ"@el, + "East Germany"@en, + "GDR"@en, + "Alemania Oriental"@es, + "Alemania del Este"@es, + "DDR"@es, + "RDA"@es, + "Ida-Saksamaa"@et, + "Saksa DV"@et, + "Ekialdeko Alemania"@eu, + "Itä-Saksa"@fi, + "SDT"@fi, + "Eysturtýskland"@fo, + "Allemagne de l’Est"@fr, + "RDA"@fr, + "An Ghearmáin Thoir"@ga, + "Oirthear na Gearmáine"@ga, + "Alemaña do Leste"@gl, + "Istočna Njemačka"@hr, + "NDR"@hr, + "Kelet-Németország"@hu, + "NDK"@hu, + "Austur-Þýskaland"@is, + "Germania Est"@it, + "RDT"@it, + "Rytų Vokietija"@lt, + "VDR"@lt, + "Austrumvācija"@lv, + "VDR"@lv, + "Источна Германија"@mk, + "RDĠ"@mt, + "Ġermanja tal-Lvant"@mt, + "DDR"@nl, + "Oost-Duitsland"@nl, + "Øst-Tyskland"@no, + "NDR"@pl, + "Niemcy Wschodnie"@pl, + "Alemanha Oriental"@pt, + "Alemanha do Leste"@pt, + "RDA"@pt, + "Germania de Est"@ro, + "R.D.G."@ro, + "RDG"@ro, + "Восто́чная Герма́ния"@ru, + "NDR"@sk, + "Východné Nemecko"@sk, + "NDR"@sl, + "Vzhodna Nemčija"@sl, + "Gjermania Lindore"@sq, + "Источна Немачка"@sr, + "TDR"@sv, + "Östtyskland"@sv, + "Doğu Almanya"@tr, + "Східна Німеччина"@uk ; + skos:changeNote "Closing event: Reunification with West Germany on 3.10.1990."@en, + "Satellite state of the Soviet Union 1949-1990 in the Warsaw Pact. Source: Wikipedia."@en, + "Wikipedia: At German reunification on October 3, 1990, the Länder states of East Germany were integrated as new federal states to the Federal Republic of Germany FRG."@en ; + skos:definition "This concept identifies the Eastern part of Germany during the Cold War, with East Berlin as its capital, and until the German reunification."@en ; + skos:hiddenLabel "østtysk"@da, + "der Deutschen Demokratischen Republik / DDR-"@de, + "Λαϊκής Δημοκρατίας της Γερμανίας"@el, + "German"@en, + "de la República Democrática Alemana"@es, + "itäsaksalainen"@fi, + "République Démocratique Allemande"@fr, + "allemande"@fr, + "Gearmánach"@ga, + "an Ghearmáin Thoir"@ga, + "njemačko"@hr, + "Repubblica democratica tedesca"@it, + "della Repubblica democratica tedesca"@it, + "Vokietijos Demokratinės Respublikos"@lt, + "Vācijas Demokrātiskās Republikas"@lv, + "ir-Repubblika Demokratika Ġermaniża"@mt, + "van de DDR"@nl, + "niemieckie"@pl, + "alemã-oriental"@pt, + "germană"@ro, + "Nemecká demokratická republika, NDR"@sk, + "Nemške demokratične republike"@sl, + "östtysk"@sv ; + skos:inScheme atold:country ; + skos:notation "45"^^euvoc:EP, + "DDR"^^euvoc:FD_010, + "DD"^^euvoc:ISO_3166_1_ALPHA_2, + "DDR"^^euvoc:ISO_3166_1_ALPHA_3, + "278"^^euvoc:ISO_3166_1_NUM, + "DDDE"^^euvoc:ISO_3166_3, + "DDR"^^euvoc:NAC ; + skos:prefLabel "Германская Дэмакратычная Рэспубліка"@be, + "Германска демократична република"@bg, + "Njemačka Demokratska Republika"@bs, + "República Democràtica Alemanya"@ca, + "Německá demokratická republika"@cs, + "Den Tyske demokratiske Republik"@da, + "Deutsche Demokratische Republik"@de, + "Λαϊκή Δημοκρατία της Γερμανίας"@el, + "German Democratic Republic"@en, + "República Democrática Alemana"@es, + "Saksa Demokraatlik Vabariik"@et, + "Alemaniako Errepublika Demokratikoa"@eu, + "Saksan demokraattinen tasavalta"@fi, + "Týska Fólkaræðisliga Lýðveldið"@fo, + "République démocratique allemande"@fr, + "Poblacht Dhaonlathach na Gearmáine"@ga, + "República Democrática Alemá"@gl, + "Njemačka Demokratska Republika"@hr, + "Német Demokratikus Köztársaság"@hu, + "Þýska alþýðulýðveldið"@is, + "Repubblica Democratica Tedesca"@it, + "Vokietijos Demokratinė Respublika"@lt, + "Vācijas Demokrātiskā Republika"@lv, + "Германска Демократска Република"@mk, + "Ir-Repubblika Demokratika Ġermaniża"@mt, + "Duitse Democratische Republiek"@nl, + "Den tyske demokratiske republikk"@no, + "Niemiecka Republika Demokratyczna"@pl, + "República Democrática Alemã"@pt, + "Republica Democrată Germană"@ro, + "Германская Демократическая Республика"@ru, + "Nemecká demokratická republika"@sk, + "Nemška demokratična republika"@sl, + "Republika Demokratike e Gjermanis"@sq, + "Немачка Демократска Република"@sr, + "Tyska demokratiska republiken"@sv, + "Demokratik Almanya Cumhuriyeti"@tr, + "Німецька Демократична Республіка"@uk ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "DHY" ; + at:deprecated "true" ; + at:end.use "1975-11-29" ; + at:op-code "DHY" ; + at:start.use "1958-12-04" ; + atold:op-code "DHY" ; + dc:identifier "DHY" ; + owl:deprecated true ; + skos:altLabel "Република Дахомей"@bg, + "Republika Dahome"@cs, + "Republikken Dahomey"@da, + "Republik Dahome"@de, + "Δημοκρατία της Δαχομέης"@el, + "Republic of Dahomey"@en, + "República de Dahomey"@es, + "Dahomee Vabariik"@et, + "Dahomeyn tasavalta"@fi, + "République du Dahomey"@fr, + "Poblacht Dahomey"@ga, + "Republika Dahomej"@hr, + "Dahomey Köztársaság"@hu, + "Repubblica del Dahomey"@it, + "Dahomėjos Respublika"@lt, + "Dahomejas Republika"@lv, + "Ir-Repubblika ta’ Dahomey"@mt, + "Republiek Dahomey"@nl, + "Republika Dahomej"@pl, + "República do Daomé"@pt, + "Republica Dahomey"@ro, + "Republika Dahome"@sk, + "Republika Dahomej"@sl, + "Republiken Dahomey"@sv ; + skos:inScheme atold:country ; + skos:notation "DY"^^euvoc:ISO_3166_1_ALPHA_2, + "DHY"^^euvoc:ISO_3166_1_ALPHA_3, + "DYBJ"^^euvoc:ISO_3166_3, + "DHY"^^euvoc:NAC ; + skos:prefLabel "Дахомей"@bg, + "Dahome"@cs, + "Dahomey"@da, + "Dahome"@de, + "Δαχομέη"@el, + "Dahomey"@en, + "Dahomey"@es, + "Dahomee"@et, + "Dahomey"@fi, + "Dahomey"@fr, + "Dahomey"@ga, + "Dahomej"@hr, + "Dahomey"@hu, + "Dahomey"@it, + "Dahomėja"@lt, + "Dahomeja"@lv, + "Dahomey"@mt, + "Dahomey"@nl, + "Dahomej"@pl, + "Daomé"@pt, + "Dahomey"@ro, + "Dahome"@sk, + "Dahomej"@sl, + "Dahomey"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "EUR" ; + at:deprecated "false" ; + at:op-code "EUR" ; + at:start.use "1993-11-01" ; + atold:op-code "EUR" ; + dc:identifier "EUR" ; + skos:altLabel "EC"@bg, + "EU"@cs, + "EU"@da, + "EU"@de, + "ΕΕ"@el, + "EU"@en, + "UE"@es, + "EL"@et, + "EU"@fi, + "UE"@fr, + "AE"@ga, + "EU"@hr, + "EU"@hu, + "UE"@it, + "ES"@lt, + "ES"@lv, + "UE"@mt, + "EU"@nl, + "UE"@pl, + "UE"@pt, + "UE"@ro, + "EÚ"@sk, + "EU"@sl, + "EU"@sv ; + skos:inScheme atold:country ; + skos:notation ".eu"^^euvoc:IANA_DOMAIN, + "EU"^^euvoc:ISO_3166_1_ALPHA_2, + "EUR"^^euvoc:NAC ; + skos:prefLabel "الاتحاد الأوروبي"@ar, + "Еўрапейскі Саюз"@be, + "Европейски съюз"@bg, + "Evropska unija"@bs, + "Unió Europea"@ca, + "Evropská unie"@cs, + "Den Europæiske Union"@da, + "Europäische Union"@de, + "Ευρωπαϊκή Ένωση"@el, + "European Union"@en, + "Unión Europea"@es, + "Euroopa Liit"@et, + "Europar Batasuna"@eu, + "Euroopan unioni"@fi, + "Evropasamveldið"@fo, + "Union européenne"@fr, + "An tAontas Eorpach"@ga, + "Unión Europea"@gl, + "Europska unija"@hr, + "Európai Unió"@hu, + "Evrópusambandið"@is, + "Unione europea"@it, + "欧州連合"@ja, + "Europäesch Unioun"@lb, + "Europos Sąjunga"@lt, + "Eiropas Savienība"@lv, + "Европска Унија"@mk, + "Unjoni Ewropea"@mt, + "Europese Unie"@nl, + "Den europeiske union"@no, + "Unia Europejska"@pl, + "União Europeia"@pt, + "Uniun Europeica"@rm, + "Uniunea Europeană"@ro, + "Европейский Союз"@ru, + "Európska únia"@sk, + "Evropska unija"@sl, + "Bashkimi Evropian"@sq, + "Европска унија"@sr, + "Europeiska unionen"@sv, + "Avrupa Birliği"@tr, + "Європейський Союз"@uk, + "欧洲联盟"@zh ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "FXX" ; + at:deprecated "true" ; + at:end.use "1997-12-31" ; + at:op-code "FXX" ; + at:start.use "1950-05-09" ; + atold:op-code "FXX" ; + dc:identifier "FXX" ; + owl:deprecated true ; + skos:altLabel "Métropole"@fr ; + skos:hiddenLabel "континентална Франция"@bg, + "Francie, metropolitní"@cs, + "Francouzská republika, metropolitní"@cs, + "Frankrigs europæiske område"@da, + "fra Frankrigs europæiske område"@da, + "Französisches Mutterland"@de, + "des französischen Mutterlandes"@de, + "Μητροπολιτικής Γαλλίας"@el, + "France, metropolitan"@en, + "francesa"@es, + "Ranskan emämaa"@fi, + "ranskalainen"@fi, + "française"@fr, + "An Fhrainc (Meitreapholaiteach)"@ga, + "Francach"@ga, + "an Fhrainc (Meitreapholaiteach)"@ga, + "Francuska"@hr, + "Francuska Republika"@hr, + "francusko"@hr, + "kontinentális franciaországi"@hu, + "Francia metropolitana"@it, + "della Francia metropolitana"@it, + "Prancūzija"@lt, + "Prancūzijos"@lt, + "Prancūzijos Respublika"@lt, + "Francijas Eiropas daļa"@lv, + "Francijas Eiropas daļas"@lv, + "Franza, metropolitana"@mt, + "Frankrijk (Europees)"@nl, + "Franse"@nl, + "Francja, terytorium europejskie"@pl, + "Republika Francuska, terytorium europejskie"@pl, + "francuskie"@pl, + "da França Metropolitana"@pt, + "din Franța Metropolitană"@ro, + "metropolitné Francúzsko"@sk, + "francosko"@sl, + "Frankrike (fastlandet)"@sv, + "fransk"@sv ; + skos:inScheme atold:country ; + skos:notation "61"^^euvoc:EP, + "FX"^^euvoc:ISO_3166_1_ALPHA_2, + "FXX"^^euvoc:ISO_3166_1_ALPHA_3, + "FXFR"^^euvoc:ISO_3166_3, + "FXX"^^euvoc:NAC ; + skos:prefLabel "Европейска част на Франция"@bg, + "Francie (metropolitní území)"@cs, + "Frankrigs hovedland"@da, + "Frankreich (Mutterland)"@de, + "Μητροπολιτική Γαλλία"@el, + "Metropolitan France"@en, + "Francia metropolitana"@es, + "Prantsuse emamaa"@et, + "Ranska (emämaa)"@fi, + "France métropolitaine"@fr, + "An Fhrainc Dhúthach"@ga, + "Kontinentalna Francuska"@hr, + "Franciaország kontinentális területe"@hu, + "Francia (metropolitana)"@it, + "Žemyninė Prancūzija"@lt, + "Francija (metropole)"@lv, + "Franza Metropolitana"@mt, + "Europees Frankrijk"@nl, + "Francja metropolitalna"@pl, + "França Metropolitana"@pt, + "Franța metropolitană"@ro, + "Kontinentálne Francúzsko"@sk, + "Francija (celinska)"@sl, + "Den europeiska delen av Frankrike"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "GEL" ; + at:deprecated "true" ; + at:end.use "1979-07-11" ; + at:op-code "GEL" ; + at:start.use "1950-05-09" ; + atold:op-code "GEL" ; + dc:identifier "GEL" ; + owl:deprecated true ; + skos:historyNote "The ‘GE’ ISO code has been reassigned to Georgia."@en, + "Le code ISO «GE» a été réassigné à la Géorgie."@fr ; + skos:inScheme atold:country ; + skos:notation "GE"^^euvoc:ISO_3166_1_ALPHA_2, + "GEL"^^euvoc:ISO_3166_1_ALPHA_3, + "GEHH"^^euvoc:ISO_3166_3, + "GEL"^^euvoc:NAC ; + skos:prefLabel "Острови Гилбърт и Елис"@bg, + "Gilbertovy and Elliceovy ostrovy"@cs, + "Øerne Gilbert og Ellice"@da, + "Gilbert- und Ellice-Inseln"@de, + "Νησιά Γκίλμπερτ και Έλις"@el, + "Gilbert and Ellice Islands"@en, + "Islas Gilbert y Ellice"@es, + "Gilberti ja Ellice’i saared"@et, + "Gilbert- ja Ellicensaaret"@fi, + "Îles Gilbert et Ellice"@fr, + "Oileáin Gilbert agus Ellice"@ga, + "Otoci Gilbert i Ellice"@hr, + "Gilbert- és Ellice-szigetek"@hu, + "Gilbert e Ellice"@it, + "Gilberto ir Eliso salos"@lt, + "Gilberta un Elisas Salas"@lv, + "Il-Gżejjer Gilbert u Ellice"@mt, + "Gilbert- en Ellice-eilanden"@nl, + "Wyspy Gilberta i Lagunowe"@pl, + "Ilhas Gilbert e Ellice"@pt, + "Insulele Gilbert și Ellice"@ro, + "Ostrovy Gilbert a Ellice"@sk, + "Gilbertovi in Elliceovi otoki"@sl, + "Gilbert- och Elliceöarna"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "HVO" ; + at:deprecated "true" ; + at:end.use "1984-08-03" ; + at:op-code "HVO" ; + at:start.use "1958-12-11" ; + atold:op-code "HVO" ; + dc:identifier "HVO" ; + owl:deprecated true ; + skos:altLabel "Република Горна Волта"@bg, + "Republika Horní Volta"@cs, + "Republikken Øvre Volta"@da, + "Republik Obervolta"@de, + "Δημοκρατία της Άνω Βόλτα"@el, + "Republic of Upper Volta"@en, + "República del Alto Volta"@es, + "Ülem-Volta Vabariik"@et, + "Ylä-Voltan tasavalta"@fi, + "République de Haute-Volta"@fr, + "Poblacht Volta Uachtaraigh"@ga, + "Republika Gornja Volta"@hr, + "Felső-voltai Köztársaság"@hu, + "Repubblica dell’Alto Volta"@it, + "Aukštutinės Voltos Respublika"@lt, + "Augšvoltas Republika"@lv, + "Ir-Repubblika tal-Volta ta’ Fuq"@mt, + "Republiek Opper-Volta"@nl, + "Republika Górnej Wolty"@pl, + "República do Alto Volta"@pt, + "Republica Volta Superioară"@ro, + "Republika Horná Volta"@sk, + "Republika Zgornja Volta"@sl, + "Republiken Övre Volta"@sv ; + skos:inScheme atold:country ; + skos:notation "HV"^^euvoc:ISO_3166_1_ALPHA_2, + "HVO"^^euvoc:ISO_3166_1_ALPHA_3, + "HVBF"^^euvoc:ISO_3166_3, + "HVO"^^euvoc:NAC ; + skos:prefLabel "Горна Волта"@bg, + "Horní Volta"@cs, + "Øvre Volta"@da, + "Obervolta"@de, + "Άνω Βόλτα"@el, + "Upper Volta"@en, + "Alto Volta"@es, + "Ülem-Volta"@et, + "Ylä-Volta"@fi, + "Haute-Volta"@fr, + "Volta Uachtarach"@ga, + "Gornja Volta"@hr, + "Felső-Volta"@hu, + "Alto Volta"@it, + "Aukštutinė Volta"@lt, + "Augšvolta"@lv, + "Il-Volta ta’ Fuq"@mt, + "Opper-Volta"@nl, + "Górna Wolta"@pl, + "Alto Volta"@pt, + "Volta Superioară"@ro, + "Horná Volta"@sk, + "Zgornja Volta"@sl, + "Övre Volta"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "JTN" ; + at:deprecated "true" ; + at:end.use "1986-12-31" ; + at:op-code "JTN" ; + at:start.use "1950-05-09" ; + atold:op-code "JTN" ; + dc:identifier "JTN" ; + owl:deprecated true ; + skos:hiddenLabel "Johnstonøen"@da, + "fra Johnstonøen"@da, + "Johnstoninsel"@de, + "der Johnstoninsel"@de, + "Νήσου Τζόνστον"@el, + "atolón de Johnston"@es, + "del atolón de Johnston"@es, + "Johnstoninsaari"@fi, + "yhdysvaltalainen"@fi, + "Ile Johnston"@fr, + "duine ó Oileán Johnston"@ga, + "Otoka Johnston"@hr, + "Johnston-szigeti"@hu, + "dell'Isola Johnston"@it, + "Džonstono salos"@lt, + "Džonstona Salas"@lv, + "il-Gżira ta’ Johnston"@mt, + "Johnston"@nl, + "van Johnston"@nl, + "Johnstonu"@pl, + "da Ilha Johnston"@pt, + "Insulele Johnston"@ro, + "din Insulele Johnston"@ro, + "Johnstonov ostrov"@sk, + "otoka Johnston"@sl, + "Johnstonön"@sv, + "från Johnstonön"@sv ; + skos:inScheme atold:country ; + skos:notation "91"^^euvoc:EP, + "JT"^^euvoc:ISO_3166_1_ALPHA_2, + "JTN"^^euvoc:ISO_3166_1_ALPHA_3, + "JTUM"^^euvoc:ISO_3166_3, + "JTN"^^euvoc:NAC ; + skos:prefLabel "Остров Джонстън"@bg, + "Ostrov Johnston"@cs, + "Øen Johnston"@da, + "Johnston-Insel"@de, + "Νήσος Τζόνστον"@el, + "Johnston Island"@en, + "Atolón Johnston"@es, + "Johnstoni atoll"@et, + "Johnstonin saari"@fi, + "Île Johnston"@fr, + "Oileán Johnston"@ga, + "Otok Johnston"@hr, + "Johnston-sziget"@hu, + "Isola Johnston"@it, + "Džonstono sala"@lt, + "Džonstona Sala"@lv, + "Il-Gżira Johnston"@mt, + "Johnston-eiland"@nl, + "Johnston"@pl, + "Ilha Johnston"@pt, + "Insula Johnston"@ro, + "Johnston"@sk, + "Otok Johnston"@sl, + "Johnston Island"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "MID" ; + at:deprecated "true" ; + at:end.use "1986-12-31" ; + at:op-code "MID" ; + at:start.use "1950-05-09" ; + atold:op-code "MID" ; + dc:identifier "MID" ; + owl:deprecated true ; + skos:hiddenLabel "Midwayøerne"@da, + "fra Midwayøerne"@da, + "Midwayinseln"@de, + "der Midwayinseln"@de, + "Νήσοι Μιντγουέι"@el, + "Νήσων Μιντγουέι"@el, + "de las islas Midway"@es, + "yhdysvaltalainen"@fi, + "Iles Midway"@fr, + "duine ó Oileáin Midway"@ga, + "Otočja Midway"@hr, + "Otočje Midway"@hr, + "Midway-szigeteki"@hu, + "delle Isole Midway"@it, + "Midvėjaus salų"@lt, + "Midveja Salu"@lv, + "il-Gżejjer Midway"@mt, + "Midway"@nl, + "Midwayeilanden"@nl, + "van Midway"@nl, + "das Ilhas Midway"@pt, + "din Insulele Midway"@ro, + "midwaysko"@sl, + "otočje Midway"@sl, + "från Midwayöarna"@sv ; + skos:inScheme atold:country ; + skos:notation "115"^^euvoc:EP, + "MI"^^euvoc:ISO_3166_1_ALPHA_2, + "MID"^^euvoc:ISO_3166_1_ALPHA_3, + "MIUM"^^euvoc:ISO_3166_3, + "MID"^^euvoc:NAC ; + skos:prefLabel "Острови Мидуей"@bg, + "Ostrovy Midway"@cs, + "Øerne Midway"@da, + "Midway-Inseln"@de, + "Νήσοι Μίντγουαιη"@el, + "Midway Islands"@en, + "Islas Midway"@es, + "Midway saared"@et, + "Midwaysaaret"@fi, + "Îles Midway"@fr, + "Oileáin Midway"@ga, + "Otoci Midway"@hr, + "Midway-szigetek"@hu, + "Isole Midway"@it, + "Midvėjaus salos"@lt, + "Midveja Salas"@lv, + "Il-Gżejjer Midway"@mt, + "Midway-eilanden"@nl, + "Midway"@pl, + "Ilhas Midway"@pt, + "Insulele Midway"@ro, + "Midwayské ostrovy"@sk, + "Otoki Midway"@sl, + "Midwayöarna"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "NHB" ; + at:deprecated "true" ; + at:end.use "1980-07-29" ; + at:op-code "NHB" ; + at:start.use "1950-05-09" ; + atold:op-code "NHB" ; + dc:identifier "NHB" ; + owl:deprecated true ; + skos:altLabel "Niuhebridis"@bi, + "Nouvelles-Hébrides"@fr ; + skos:inScheme atold:country ; + skos:notation "NH"^^euvoc:ISO_3166_1_ALPHA_2, + "NHB"^^euvoc:ISO_3166_1_ALPHA_3, + "NHVU"^^euvoc:ISO_3166_3, + "NHB"^^euvoc:NAC ; + skos:prefLabel "Нови Хебриди"@bg, + "Nové Hebridy"@cs, + "Ny Hebriderne"@da, + "Neue Hebriden"@de, + "Νέές Εβρίδες"@el, + "New Hebrides"@en, + "Nuevas Hébridas"@es, + "Uus-Hebriidid"@et, + "Uudet-Hebridit"@fi, + "Nouvelles Hébrides"@fr, + "Nua-Inse Ghall"@ga, + "Novi Hebridi"@hr, + "Új-Hebridák"@hu, + "Nuove Ebridi"@it, + "Naujieji Hebridai"@lt, + "Jaunhebridu Salas"@lv, + "New Hebrides"@mt, + "Nieuwe Hebriden"@nl, + "Nowe Hebrydy"@pl, + "Novas Hébridas"@pt, + "Noile Hebride"@ro, + "Nové Hebridy"@sk, + "Novi Hebridi"@sl, + "Nya Hebriderna"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "NTZ" ; + at:deprecated "true" ; + at:end.use "1993-12-31" ; + at:op-code "NTZ" ; + at:start.use "1950-05-09" ; + atold:op-code "NTZ" ; + dc:identifier "NTZ" ; + owl:deprecated true ; + skos:hiddenLabel "neutrální oblast"@cs, + "Den Neutrale Zone"@da, + "Den Neutrale Zone mellem Saudi-Arabien og Irak"@da, + "fra Den Neutrale Zone mellem Saudi-Arabien og Irak"@da, + "der Neutralen Zone"@de, + "Ουδέτερη Ζώνη"@el, + "Ουδέτερης Ζώνης"@el, + "Zona neutra"@es, + "Neutraalin vyöhykkeen asukas"@fi, + "Crios Neodrach"@ga, + "duine as Crios Neodrach"@ga, + "Neutralno području"@hr, + "semleges övezet"@hu, + "semleges övezeti"@hu, + "Zona Neutra"@it, + "della Zona Neutra"@it, + "Neutralioji zona"@lt, + "neitrālā zona"@lv, + "neitrālās zonas"@lv, + "iż-Żona Newtrali"@mt, + "van de Neutrale Zone"@nl, + "Saudyjsko-Iracka Strefa Neutralna"@pl, + "bezpaństwowiec"@pl, + "da Zona Neutra"@pt, + "Zona Neutră"@ro, + "din Zona Neutră"@ro, + "nevtralnega območja"@sl, + "från en neutral zon"@sv ; + skos:inScheme atold:country ; + skos:notation "136"^^euvoc:EP, + "NT"^^euvoc:ISO_3166_1_ALPHA_2, + "NTZ"^^euvoc:ISO_3166_1_ALPHA_3, + "NTHH"^^euvoc:ISO_3166_3, + "NTZ"^^euvoc:NAC ; + skos:prefLabel "Неутрална зона"@bg, + "Neutrální území"@cs, + "Neutralt område"@da, + "Neutrale Zone"@de, + "Ουδέτερη ζώνη"@el, + "Neutral Zone"@en, + "Zona neutral"@es, + "Neutraalne tsoon"@et, + "Neutraali vyöhyke"@fi, + "Zone neutre"@fr, + "Limistéar Neodrach"@ga, + "Neutralno područje"@hr, + "Semleges terület"@hu, + "Zona neutrale"@it, + "Neutrali zona"@lt, + "Neitrāla zona"@lv, + "Żona Newtrali"@mt, + "Neutrale zone"@nl, + "Strefa neutralna"@pl, + "Zona Neutra"@pt, + "Zonă neutră"@ro, + "Neutrálna zóna"@sk, + "Nevtralno območje"@sl, + "Neutral zon"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "PCZ" ; + at:deprecated "true" ; + at:end.use "1980-12-31" ; + at:op-code "PCZ" ; + at:start.use "1950-05-09" ; + atold:op-code "PCZ" ; + dc:identifier "PCZ" ; + owl:deprecated true ; + skos:inScheme atold:country ; + skos:notation "PZ"^^euvoc:ISO_3166_1_ALPHA_2, + "PCZ"^^euvoc:ISO_3166_1_ALPHA_3, + "PZPA"^^euvoc:ISO_3166_3, + "PCZ"^^euvoc:NAC ; + skos:prefLabel "Зона на Панамския канал"@bg, + "Zóna Panamského průplavu"@cs, + "Panamakanalzonen"@da, + "Panama, Kanal-Zone"@de, + "Ζώνη της διώρυγας του Παναμά"@el, + "Panama Canal Zone"@en, + "Zona del Canal de Panamá"@es, + "Panama kanali tsoon"@et, + "Panaman kanavavyöhyke"@fi, + "Zone du canal de Panama"@fr, + "Limistéar Chanáil Phanama"@ga, + "Zona Panamskog kanala"@hr, + "Panama-csatorna övezete"@hu, + "Zona del canale di Panama"@it, + "Panamos kanalo zona"@lt, + "Panamas kanāla zona"@lv, + "Iż-Żona tal-Kanal ta’ Panama"@mt, + "Panamese Kanaalzone"@nl, + "Strefa Kanału Panamskiego"@pl, + "Zona do Canal do Panamá"@pt, + "Zona Canalului Panama"@ro, + "Panamské prieplavové pásmo"@sk, + "Območje panamskega prekopa"@sl, + "Panamakanalzonen"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "RHO" ; + at:deprecated "true" ; + at:end.use "1980-04-17" ; + at:op-code "RHO" ; + at:start.use "1950-05-09" ; + atold:op-code "RHO" ; + dc:identifier "RHO" ; + owl:deprecated true ; + skos:inScheme atold:country ; + skos:notation "RH"^^euvoc:ISO_3166_1_ALPHA_2, + "RHO"^^euvoc:ISO_3166_1_ALPHA_3, + "RHZW"^^euvoc:ISO_3166_3, + "RHO"^^euvoc:NAC ; + skos:prefLabel "Южна Родезия"@bg, + "Jižní Rhodesie"@cs, + "Sydrhodesia"@da, + "Südrhodesien"@de, + "Νότια Ροδεσία"@el, + "Southern Rhodesia"@en, + "Rodesia del Sur"@es, + "Lõuna-Rodeesia"@et, + "Etelä-Rhodesia"@fi, + "Rhodésie du Sud"@fr, + "An Róidéis Theas"@ga, + "Južna Rodezija"@hr, + "Dél-Rodézia"@hu, + "Rodesia meridionale"@it, + "Pietų Rodezija"@lt, + "Dienvidrodēzija"@lv, + "Ir-Rodesja tan-Nofsinhar"@mt, + "Zuid-Rhodesië"@nl, + "Rodezja Południowa"@pl, + "Rodésia do Sul"@pt, + "Rodezia de Sud"@ro, + "Južná Rodézia"@sk, + "Južna Rodezija"@sl, + "Sydrhodesia"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "SCG" ; + at:deprecated "true" ; + at:end.use "2006-06-02" ; + at:op-code "SCG" ; + at:start.use "2003-02-04" ; + atold:op-code "SCG" ; + dc:identifier "SCG" ; + owl:deprecated true ; + skos:altLabel "Staatenunion von Serbien und Montenegro"@de, + "State Union of Serbia and Montenegro"@en, + "Aontas Stáit na Seirbia agus Mhontainéagró"@ga, + "L-Istat tal-Unjoni tas-Serbja u l-Montenegro"@mt ; + skos:changeNote "Closing event: Splitting of the country into Republic of Serbia COU0048, Republic of Montenegro COU0039. Successors: COU0048, COU0039."@en, + "Opening event: long name change. Predecessor ‘Federal Republic of Yugoslavia’ COU0061."@en ; + skos:hiddenLabel "Statsunionen Serbien og Montenegro"@da, + "serbisk-montenegrinsk"@da, + "von Serbien und Montenegro"@de, + "República de Serbia"@es, + "Serbia"@es, + "serbia"@es, + "serbiamontenegrolainen"@fi, + "Serbie-et-Montenegro"@fr, + "de Serbie-et-Monténégro"@fr, + "duine ó Sheirbia agus Montainéagró"@ga, + "srbijanskocrnogorsko"@hr, + "Szerbia és Montenegró Államközösség"@hu, + "Szerbia és Montenegró-i"@hu, + "serbo-montenegrina"@it, + "Serbijos ir Juodkalnijos"@lt, + "Serbijas un Melnkalnes"@lv, + "is-Serbja u Montenegro"@mt, + "mis-Serbja u Montenegro"@mt, + "van Servië en Montenegro"@nl, + "Serbii i Czarnogóry"@pl, + "da Sérvia e Montenegro"@pt, + "Serbia și Muntenegru"@ro, + "din Serbia și Muntenegru"@ro, + "Štátne spoločenstvo Srbsko a Čierna Hora"@sk, + "srbsko-črnogorsko"@sl, + "från Serbien och Montenegro"@sv ; + skos:historyNote "The ‘CS’ ISO code was formerly used for ‘Czechoslovakia’, now Czechia, CZ and Slovakia, SK."@en, + "Le code ISO «CS» a été précédemment assigné à la «Tchécoslovaquie», maintenant Tchéquie, CZ et Slovaquie, SK."@fr ; + skos:inScheme atold:country ; + skos:notation "275"^^euvoc:EP, + "CS"^^euvoc:ISO_3166_1_ALPHA_2, + "SCG"^^euvoc:ISO_3166_1_ALPHA_3, + "891"^^euvoc:ISO_3166_1_NUM, + "CSXX"^^euvoc:ISO_3166_3, + "SCG"^^euvoc:NAC ; + skos:prefLabel "Сербія і Чарнагорыя"@be, + "Сърбия и Черна гора"@bg, + "Srbija i Crna Gora"@bs, + "Sèrbia i Montenegro"@ca, + "Srbsko a Černá Hora"@cs, + "Serbien og Montenegro"@da, + "Serbien und Montenegro"@de, + "Σερβία και Μαυροβούνιο"@el, + "Serbia and Montenegro"@en, + "Serbia y Montenegro"@es, + "Serbia ja Montenegro"@et, + "Serbia eta Montenegro"@eu, + "Serbia ja Montenegro"@fi, + "Serbie-et-Monténégro"@fr, + "Seirbia agus Montainéagró"@ga, + "Serbia e Montenegro"@gl, + "Srbija i Crna Gora"@hr, + "Szerbia és Montenegró"@hu, + "Serbía og Svartfjallaland"@is, + "Serbia e Montenegro"@it, + "Serbija ir Juodkalnija"@lt, + "Serbija un Melnkalne"@lv, + "Србија и Црна Гора"@mk, + "Serbja u Montenegro"@mt, + "Servië en Montenegro"@nl, + "Serbia og Montenegro"@no, + "Serbia i Czarnogóra"@pl, + "Sérvia e Montenegro"@pt, + "Serbia şi Muntenegru"@ro, + "Сербия и Черногория"@ru, + "Srbsko a Čierna Hora"@sk, + "Srbija in Črna gora"@sl, + "Serbia dhe Mali i Zi"@sq, + "Србија и Црна Гора"@sr, + "Serbien och Montenegro"@sv, + "Sırbistan-Karadağ"@tr, + "Сербія і Чорногорія"@uk ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "SKM" ; + at:deprecated "true" ; + at:end.use "1975-05-16" ; + at:op-code "SKM" ; + at:start.use "1950-05-09" ; + atold:op-code "SKM" ; + dc:identifier "SKM" ; + owl:deprecated true ; + skos:altLabel "सिक्किम"@ne, + "སུ་ཁྱིམ་"@sip ; + skos:historyNote "The ‘SK’ ISO code has been reassigned to Slovakia."@en, + "Le code ISO «SK» a été réassigné à la Slovaquie."@fr ; + skos:inScheme atold:country ; + skos:notation "SK"^^euvoc:ISO_3166_1_ALPHA_2, + "SKM"^^euvoc:ISO_3166_1_ALPHA_3, + "SKIN"^^euvoc:ISO_3166_3, + "SKM"^^euvoc:NAC ; + skos:prefLabel "Сиким"@bg, + "Sikkim"@cs, + "Sikkim"@da, + "Sikkim"@de, + "Σικκίμ"@el, + "Sikkim"@en, + "Sikkim"@es, + "Sikkim"@et, + "Sikkim"@fi, + "Sikkim"@fr, + "Sikkim"@ga, + "Sikim"@hr, + "Szikkim"@hu, + "Sikkim"@it, + "Sikimas"@lt, + "Sikima"@lv, + "Is-Sikkim"@mt, + "Sikkim"@nl, + "Sikkim"@pl, + "Siquim"@pt, + "Sikkim"@ro, + "Sikkim"@sk, + "Sikim"@sl, + "Sikkim"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "SUN" ; + at:deprecated "true" ; + at:end.use "1991-12-25" ; + at:op-code "SUN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SU" ; + dc:source "EurLex" ] ; + at:start.use "1922-12-30" ; + atold:op-code "SUN" ; + dc:identifier "SUN" ; + owl:deprecated true ; + skos:altLabel "Саюз Савецкіх Сацыялістычных Рэспублік"@be, + "СССР"@bg, + "Съюзът на съветските социалистически републики"@bg, + "Unió de Repúbliques Socialistes Soviètiques"@ca, + "SSSR"@cs, + "Svaz sovětských socialistických republik"@cs, + "SSSR"@da, + "USSR"@da, + "Unionen af Socialistiske Sovjetrepublikker"@da, + "UdSSR"@de, + "Union der Sozialistischen Sowjetrepubliken"@de, + "Ένωση Σοβιετικών Σοσιαλιστικών Δημοκρατιών"@el, + "ΕΣΣΔ"@el, + "USSR"@en, + "Union of Soviet Socialist Republics"@en, + "URSS"@es, + "Unión de Repúblicas Socialistas Soviéticas"@es, + "NSV Liit"@et, + "NSVL"@et, + "Nõukogude Sotsialistlike Vabariikide Liit"@et, + "Sobietar Errepublika Sozialisten Batasuna"@eu, + "SNTL"@fi, + "Sosialististen Neuvostotasavaltojen Liitto"@fi, + "URSS"@fr, + "Union des républiques socialistes soviétiques"@fr, + "An tAontas Sóivéadach"@ga, + "Aontas na bPoblachtaí Sóivéadacha Sóisialacha"@ga, + "Unión de Repúblicas Socialistas Soviéticas"@gl, + "SSSR"@hr, + "Savez Sovjetskih Socijalističkih Republika"@hr, + "SZSZKSZ"@hu, + "Szovjet Szocialista Köztársaságok Szövetsége"@hu, + "Sambandsríki sósíalískra sovíetlýðvelda"@is, + "URSS"@it, + "Unione delle Repubbliche Socialiste Sovietiche"@it, + "TSRS"@lt, + "Tarybų Socialistinių Respublikų Sąjunga"@lt, + "Tarybų Sąjunga"@lt, + "PSRS"@lv, + "Padomju Sociālistisko Republiku Savienība"@lv, + "Сојуз на Советските Социјалистички Републики"@mk, + "L-Unjoni tar-Repubbliki Soċjalisti Sovjetiċi"@mt, + "USSR"@nl, + "Unie van Socialistische Sovjetrepublieken"@nl, + "Samveldet av sosialistiske sovjetrepublikkar"@no, + "ZSRR"@pl, + "Związek Socjalistycznych Republik Radzieckich"@pl, + "URSS"@pt, + "União das Repúblicas Socialistas Soviéticas"@pt, + "URSS"@ro, + "Uniunea Republicilor Sovietice Socialiste"@ro, + "Союз Советских Социалистических Республик"@ru, + "ZSSR"@sk, + "Zväz sovietskych socialistických republík"@sk, + "ZSSR"@sl, + "Zveza sovjetskih socialističnih republik"@sl, + "Bashkimi i Republikave Sovjetike Socialiste"@sq, + "Савез Совјетских Социјалистичких Република"@sr, + "Socialistiska rådsrepublikernas union"@sv, + "СССР"@sv, + "Sovyet Sosyalist Cumhuriyetler Birliği"@tr, + "Союз Радянських Соціалістичних Республік"@uk ; + skos:changeNote "Closing event: Splitting of the country into Republic of Armenia COU0084, Republic of Azerbaijan COU0092, Republic of Estonia COU0017, Georgia COU0203, Republic of Kazakhstan COU0259, Kyrgyz Republic COU0265, Republic of Latvia COU0036, Republic of Lithuania COU0034, Republic of Moldova COU0038, Russian Federation COU0049, Republic of Tajikistan COU0431, Turkmenistan COU0443, Republic of Uzbekistan COU0460, Republic of Belarus COU0007, Ukraine COU0056. Successors: COU0084, COU0092, COU0017, COU0203, COU0259, COU0265, COU0036, COU0034, COU0038, COU0049, COU0431, COU0443, COU0460, COU0007, COU0056."@en ; + skos:hiddenLabel "sovjetisk"@da, + "der UdSSR"@de, + "Soviet"@en, + "neuvostoliittolainen"@fi, + "russe"@fr, + "APSS"@ga, + "duine ó Aontas na bPoblachtaí Sóivéadacha Sóisialacha"@ga, + "sovjetsko"@hr, + "dell'URSS"@it, + "l-URSS"@mt, + "van de USSR"@nl, + "Związek Radziecki"@pl, + "da URSS"@pt, + "U.R.S.S."@ro, + "rusă"@ro, + "sovjetsko"@sl, + "De Socialistiska Rådsrepublikernas Union"@sv, + "sovjetisk"@sv ; + skos:inScheme atold:country ; + skos:notation "167"^^euvoc:EP, + "SU"^^euvoc:FD_010, + "SU"^^euvoc:FD_400, + "SU"^^euvoc:ISO_3166_1_ALPHA_2, + "SUN"^^euvoc:ISO_3166_1_ALPHA_3, + "810"^^euvoc:ISO_3166_1_NUM, + "SUHH"^^euvoc:ISO_3166_3, + "SUN"^^euvoc:NAC ; + skos:prefLabel "Савецкі Саюз"@be, + "Съветски съюз"@bg, + "Sovjetski Savez"@bs, + "Unió Soviètica"@ca, + "Sovětský svaz"@cs, + "Sovjetunionen"@da, + "Sowjetunion"@de, + "Σοβιετική Ένωση"@el, + "Soviet Union"@en, + "Unión Soviética"@es, + "Nõukogude Liit"@et, + "Sobietar Batasuna"@eu, + "Neuvostoliitto"@fi, + "Sovjetsamveldið"@fo, + "Union soviétique"@fr, + "Aontas na Sóivéide"@ga, + "Unión Soviética"@gl, + "Sovjetski Savez"@hr, + "Szovjetunió"@hu, + "Sovétríkin"@is, + "Unione Sovietica"@it, + "Sovietų Sąjunga"@lt, + "Padomju Savienība"@lv, + "Советски Сојуз"@mk, + "Unjoni Sovjetika"@mt, + "Sovjet-Unie"@nl, + "Sovjetunionen"@no, + "Związek Sowiecki"@pl, + "União Soviética"@pt, + "Uniunea Sovietică"@ro, + "Советский Союз"@ru, + "Sovietsky zväz"@sk, + "Sovjetska zveza"@sl, + "Bashkimi Sovjetik"@sq, + "Совјетски Савез"@sr, + "Sovjetunionen"@sv, + "Sovyetler Birliği"@tr, + "Радянський Союз"@uk ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "TMP" ; + at:deprecated "true" ; + at:end.use "2002-05-19" ; + at:op-code "TMP" ; + at:start.use "1975-11-28" ; + atold:op-code "TMP" ; + dc:identifier "TMP" ; + owl:deprecated true ; + skos:altLabel "Timor Português"@pt ; + skos:hiddenLabel "Демократична република Източен Тимор"@bg, + "Demokratická republika Východní Timor"@cs, + "Den Demokratiske Republik Timor-Leste"@da, + "Timor-Leste, Østtimor"@da, + "fra Timor-Leste, fra Østtimor, østtimorisk"@da, + "von Osttimor"@de, + "Ανατολικού Τιμόρ"@el, + "República Democrática de Timor Oriental"@es, + "timorense"@es, + "Itä-Timorin demokraattinen tasavalta"@fi, + "itätimorilainen"@fi, + "Timor Oriental"@fr, + "est-timorais"@fr, + "Poblacht Dhaonlathach Thíomór Thoir"@ga, + "duine ó Thíomór Thoir"@ga, + "Timor-Leste"@hr, + "istočnotimorsko"@hr, + "kelet-timori"@hu, + "Repubblica democratica di Timor Leste"@it, + "di Timor Leste"@it, + "Rytų Timoro"@lt, + "Rytų Timoro Demokratinė Respublika"@lt, + "Austrumtimoras"@lv, + "Oost-Timorese"@nl, + "Demokratyczna Republika Timoru Wschodniego"@pl, + "timorense"@pt, + "Republica Democratică a Timorului de Est"@ro, + "din Timorul de Est"@ro, + "Východotimorská demokratická republika"@sk, + "vzhodnotimorsko"@sl, + "Demokratiska republiken Östtimor"@sv, + "östtimoriansk"@sv ; + skos:inScheme atold:country ; + skos:notation "178"^^euvoc:EP, + "TP"^^euvoc:ISO_3166_1_ALPHA_2, + "TMP"^^euvoc:ISO_3166_1_ALPHA_3, + "TPTL"^^euvoc:ISO_3166_3, + "TMP"^^euvoc:NAC ; + skos:prefLabel "Източен Тимор"@bg, + "Východní Timor"@cs, + "Østtimor"@da, + "Osttimor"@de, + "Ανατολικό Τιμόρ"@el, + "East Timor"@en, + "Timor Oriental"@es, + "Ida-Timor"@et, + "Itä-Timor"@fi, + "Timor-Oriental"@fr, + "Tíomór Thoir"@ga, + "Istočni Timor"@hr, + "Kelet-Timor"@hu, + "Timor Leste"@it, + "Rytų Timoras"@lt, + "Austrumtimora"@lv, + "Timor tal-Lvant"@mt, + "Oost-Timor"@nl, + "Timor Wschodni"@pl, + "Timor-Leste"@pt, + "Timorul de Est"@ro, + "Východný Timor"@sk, + "Vzhodni Timor"@sl, + "Östtimor"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "VDR" ; + at:deprecated "true" ; + at:end.use "1976-07-01" ; + at:op-code "VDR" ; + at:start.use "1954-07-20" ; + atold:op-code "VDR" ; + dc:identifier "VDR" ; + owl:deprecated true ; + skos:altLabel "Nordvietnam"@de, + "North Vietnam"@en, + "Põhja-Vietnam"@et, + "Nord-Vietnam"@fr, + "République démocratique du Viêt-Nam"@fr, + "Việt Nam Dân chủ Cộng hòa"@vi ; + skos:inScheme atold:country ; + skos:notation "VD"^^euvoc:ISO_3166_1_ALPHA_2, + "VDR"^^euvoc:ISO_3166_1_ALPHA_3, + "VDVN"^^euvoc:ISO_3166_3, + "VDR"^^euvoc:NAC ; + skos:prefLabel "Демократична република Виетнам"@bg, + "Vietnamská demokratická republika"@cs, + "Den Demokratiske Republik Vietnam"@da, + "Demokratische Republik Vietnam"@de, + "Λαϊκή Δημοκρατία του Βιετνάμ"@el, + "Democratic Republic of Vietnam"@en, + "República Democrática de Vietnam"@es, + "Vietnami Demokraatlik Vabariik"@et, + "Vietnamin demokraattinen kansantasavalta"@fi, + "République démocratique du Viêt Nam"@fr, + "Poblacht Dhaonlathach Vítneam"@ga, + "Demokratska Republika Vijetnam"@hr, + "Vietnámi Demokratikus Köztársaság"@hu, + "Repubblica democratica del Vietnam"@it, + "Vietnamo Demokratinė Respublika"@lt, + "Vjetnamas Demokrātiskā Republika"@lv, + "Ir-Repubblika Demokratika tal-Vjetnam"@mt, + "Democratische Republiek Vietnam"@nl, + "Demokratyczna Republika Wietnamu"@pl, + "República Democrática do Congo"@pt, + "Republica Democratică Vietnam"@ro, + "Vietnamská demokratická republika"@sk, + "Demokratična republika Vietnam"@sl, + "Nordvietnam"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "WAK" ; + at:deprecated "true" ; + at:end.use "1986-12-31" ; + at:op-code "WAK" ; + at:start.use "1950-05-09" ; + atold:op-code "WAK" ; + dc:identifier "WAK" ; + owl:deprecated true ; + skos:altLabel "Wake Islands"@en ; + skos:hiddenLabel "Wakeøen"@da, + "fra Wakeøen"@da, + "Wakeinsel"@de, + "der Wakeinsel"@de, + "Νήσος Γουέικ"@el, + "Νήσου Γουέικ"@el, + "de la isla Wake"@es, + "Wakesaari"@fi, + "yhdysvaltalainen"@fi, + "Ile de Wake"@fr, + "duine ó Oileán Wake"@ga, + "Otoka Wake"@hr, + "Wake-szigeti"@hu, + "Isola Wake"@it, + "dell'Isola Wake"@it, + "Veiko salos"@lt, + "Veika Salas"@lv, + "il-Gżira ta' Wake"@mt, + "Wake"@nl, + "van Wake"@nl, + "Ilha de Wake"@pt, + "da Ilha de Wake"@pt, + "Insulele Wake"@ro, + "din Insulele Wake"@ro, + "otoka Wake"@sl, + "Wakeön"@sv, + "från Wakeön"@sv ; + skos:inScheme atold:country ; + skos:notation "197"^^euvoc:EP, + "WK"^^euvoc:ISO_3166_1_ALPHA_2, + "WAK"^^euvoc:ISO_3166_1_ALPHA_3, + "WKUM"^^euvoc:ISO_3166_3, + "WAK"^^euvoc:NAC ; + skos:prefLabel "Остров Уейк"@bg, + "Ostrov Wake"@cs, + "Øen Wake"@da, + "Wake"@de, + "Νήσος Ουέηκ"@el, + "Wake Island"@en, + "Isla Wake"@es, + "Wake"@et, + "Wakensaari"@fi, + "Île de Wake"@fr, + "Oileán Wake"@ga, + "Otok Wake"@hr, + "Wake-sziget"@hu, + "Isola di Wake"@it, + "Veiko sala"@lt, + "Veika Sala"@lv, + "Il-Gżira ta’ Wake"@mt, + "Wake-eiland"@nl, + "Wake"@pl, + "Ilha Wake"@pt, + "Insula Wake"@ro, + "Ostrov Wake"@sk, + "Otok Wake"@sl, + "Wake"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "XBI" ; + at:deprecated "true" ; + at:end.use "1970-01-15" ; + at:op-code "XBI" ; + at:start.use "1967-05-30" ; + atold:op-code "XBI" ; + dc:identifier "XBI" ; + owl:deprecated true ; + skos:altLabel "Republic of Biafra"@en ; + skos:definition "partially recognised secessionist state in West Africa that declared independence from Nigeria and existed from 1967 until 1970"@en ; + skos:inScheme atold:country, + ; + skos:notation "XBI"^^euvoc:NAC ; + skos:prefLabel "Biafra"@da, + "Biafra"@en, + "Biafra"@fr ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XKA" ; + at:deprecated "true" ; + at:end.use "1979-01-06" ; + at:op-code "XKA" ; + at:start.use "1976-01-05" ; + atold:op-code "XKA" ; + dc:identifier "XKA" ; + owl:deprecated true ; + skos:definition "one-party totalitarian state which encompassed modern-day Cambodia and existed from 1975 to 1979; it was controlled by the Khmer Rouge"@en ; + skos:inScheme atold:country, + ; + skos:notation "XKA"^^euvoc:NAC ; + skos:prefLabel "Democratic Kampuchea"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XKM" ; + at:deprecated "true" ; + at:end.use "1989-05-01" ; + at:op-code "XKM" ; + at:start.use "1979-01-07" ; + atold:op-code "XKM" ; + dc:identifier "XKM" ; + owl:deprecated true ; + skos:definition "partially recognised state in Southeast Asia supported by Vietnam which existed from 1979 to 1989; it was founded in Cambodia by the Kampuchean United Front for National Salvation, a group of Cambodian communists"@en ; + skos:inScheme atold:country, + ; + skos:notation "XKM"^^euvoc:NAC ; + skos:prefLabel "People’s Republic of Kampuchea"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XXV" ; + at:deprecated "false" ; + at:op-code "XXV" ; + at:start.use "2022-12-09" ; + atold:op-code "XXV" ; + dc:identifier "XXV" ; + skos:definition "territory between Egypt and Sudan not claimed by either country"@en ; + skos:inScheme atold:country, + ; + skos:notation "XXV"^^euvoc:NAC ; + skos:prefLabel "Bir Tawil"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "YMD" ; + at:deprecated "true" ; + at:end.use "1990-05-21" ; + at:op-code "YMD" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "NY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "NY" ; + dc:source "EurLex" ] ; + at:start.use "1962-09-26" ; + atold:op-code "YMD" ; + dc:identifier "YMD" ; + owl:deprecated true ; + skos:altLabel "اليمن الشمالي"@ar, + "Йеменска арабска република"@bg, + "Jemenská arabská republika"@cs, + "Den Arabiske Republik Yemen"@da, + "Arabische Republik Jemen"@de, + "Αραβική Δημοκρατία της Υεμένης"@el, + "Yemen (Sanaa)"@en, + "Yemen Arab Republic"@en, + "República Árabe de Yemen"@es, + "Jeemeni Araabia Vabariik"@et, + "Jemenin arabitasavalta"@fi, + "République arabe du Yémen"@fr, + "Poblacht Arabach Éimin"@ga, + "Arapska Republika Jemen"@hr, + "Jemeni Arab Köztársaság"@hu, + "Repubblica araba dello Yemen"@it, + "Jemeno Arabų Respublika"@lt, + "Jemenas Arābu Republika"@lv, + "Ir-Repubblika Għarbija tal-Jemen"@mt, + "Arabische Republiek Jemen"@nl, + "Jemeńska Republika Arabska"@pl, + "República Árabe do Iémen"@pt, + "Republica Arabă Yemen"@ro, + "Jemenská arabská republika"@sk, + "Arabska republika Jemen"@sl, + "Arabrepubliken Yemen"@sv ; + skos:hiddenLabel "Йемен"@bg, + "Република Йемен"@bg, + "Jemen"@cs, + "Jemenská republika"@cs, + "Republikken Yemen"@da, + "Yemen"@da, + "yemenitisk"@da, + "Demokratischer Jemen"@de, + "jemenitisch"@de, + "Δημοκρατική Υεμένη"@el, + "Λαϊκή Δημοκρατία της Υεμένης"@el, + "Υεμένης"@el, + "Yemen"@en, + "República de Yemen"@es, + "Yemen"@es, + "yemení"@es, + "Etelä-Jemen"@fi, + "Jemenin demokraattinen kansantasavalta"@fi, + "jemeniläinen, eteläjemeniläinen"@fi, + "Yemen Démocratique"@fr, + "Poblacht Éimin"@ga, + "Éimin"@ga, + "Éimineach"@ga, + "Jemen"@hr, + "Republika Jemen"@hr, + "jemensko"@hr, + "Jemen"@hu, + "jemeni"@hu, + "Repubblica dello Yemen"@it, + "Yemen"@it, + "yemenita"@it, + "Jemenas"@lt, + "Jemeno"@lt, + "Jemeno Respublika"@lt, + "Jemena"@lv, + "Jemenas"@lv, + "Jemenas Republika"@lv, + "Jemenita"@mt, + "il-Jemen"@mt, + "ir-Repubblika tal-Jemen"@mt, + "Jemen"@nl, + "Jemenitische"@nl, + "Republiek Jemen"@nl, + "Jemen"@pl, + "Iémen Democrático"@pt, + "do Iémen Democrático"@pt, + "Statul Yemen Democrat"@ro, + "yemenită"@ro, + "Jemen"@sk, + "Jemenská republika"@sk, + "Demokratični Jemen"@sl, + "Jemen"@sl, + "jemensko"@sl, + "Jemen"@sv, + "Republiken Jemen"@sv, + "jemenitisk"@sv ; + skos:inScheme atold:country ; + skos:notation "201"^^euvoc:EP, + "NY"^^euvoc:FD_010, + "NY"^^euvoc:FD_400, + "YD"^^euvoc:ISO_3166_1_ALPHA_2, + "YMD"^^euvoc:ISO_3166_1_ALPHA_3, + "YDYE"^^euvoc:ISO_3166_3, + "YMD"^^euvoc:NAC ; + skos:prefLabel "Северен Йемен"@bg, + "Severní Jemen"@cs, + "Nordyemen"@da, + "Nordjemen"@de, + "Βόρεια Υεμένη"@el, + "North Yemen"@en, + "Yemen del Norte"@es, + "Põhja-Jeemen"@et, + "Pohjois-Jemen"@fi, + "Yémen du Nord"@fr, + "Éimin Thuaidh"@ga, + "Sjeverni Jemen"@hr, + "Észak-Jemen"@hu, + "Yemen del Nord"@it, + "Šiaurės Jemenas"@lt, + "Ziemeļjemena"@lv, + "Il-Jemen ta’ Fuq"@mt, + "Noord-Jemen"@nl, + "Jemen Północny"@pl, + "Iémen do Norte"@pt, + "Yemenul de Nord"@ro, + "Severný Jemen"@sk, + "Severni Jemen"@sl, + "Nordjemen"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "YUG" ; + at:deprecated "true" ; + at:end.use "2003-02-03" ; + at:op-code "YUG" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "YU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "YU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "YU" ; + dc:source "EurLex" ] ; + at:start.use "1945-11-29" ; + atold:op-code "YUG" ; + dc:identifier "YUG" ; + owl:deprecated true ; + skos:altLabel "Сацыялістычная Федэратыўная Рэспубліка Югаславія"@be, + "Саюзная Рэспубліка Югаславія"@be, + "Федэратыўная Народная Рэспубліка Югаславія"@be, + "Социалистическа Федеративна Република Югославия"@bg, + "Съюзна република Югославия"@bg, + "Федеративна народна република Югославия"@bg, + "Federativna Narodna Republika Jugoslavija"@bs, + "Savezna Republika Jugoslavija"@bs, + "Socijalistička Federativna Republika Jugoslavija"@bs, + "República Federal Popular de Iugoslàvia"@ca, + "República Federal Socialista de Iugoslàvia"@ca, + "República Federal de Iugoslàvia"@ca, + "Federativní lidová republika Jugoslávie"@cs, + "Socialistická federativní republika Jugoslávie"@cs, + "Svazová republika Jugoslávie"@cs, + "Den Føderative Folkerepublik Jugoslavien"@da, + "Den Socialistiske Føderative Republik Jugoslavien"@da, + "Forbundsrepublikken Jugoslavien"@da, + "Bundesrepublik Jugoslawien"@de, + "Föderative Volksrepublik Jugoslawien"@de, + "Sozialistische Föderative Republik Jugoslawien"@de, + "Ομοσπονδιακή Δημοκρατία της Γιουγκοσλαβίας"@el, + "Ομοσπονδιακή Λαϊκή Δημοκρατία της Γιουγκοσλαβίας"@el, + "Σοσιαλιστική Ομοσπονδιακή Δημοκρατία της Γιουγκοσλαβίας"@el, + "Federal People’s Republic of Yugoslavia"@en, + "Federal Republic of Yugoslavia"@en, + "Socialist Federal Republic of Yugoslavia"@en, + "República Federal Popular de Yugoslavia"@es, + "República Federal Socialista de Yugoslavia"@es, + "República Federal de Yugoslavia"@es, + "Jugoslaavia Föderatiivne Rahvavabariik"@et, + "Jugoslaavia Föderatiivne Sotsialistlik Vabariik"@et, + "Jugoslaavia Liitvabariik"@et, + "Jugoslavian federatiivinen kansantasavalta"@fi, + "Jugoslavian liittotasavalta"@fi, + "Jugoslavian sosialistinen liittotasavalta"@fi, + "République fédérale de Yougoslavie"@fr, + "République fédérale populaire de Yougoslavie"@fr, + "République fédérale socialiste de Yougoslavie"@fr, + "An Iúgslaiv"@ga, + "Dhaon-Phoblacht Chónaidhme na hIúgslaive"@ga, + "Poblacht Chónaidhme Shóisialach na hIúgslaive"@ga, + "Poblacht Chónaidhme na hIúgslaive"@ga, + "República Federal Popular de Iugoslavia"@gl, + "República Federal Socialista de Iugoslavia"@gl, + "República Federal de Iugoslavia"@gl, + "Југославија"@hbs, + "Federativna Narodna Republika Jugoslavija"@hr, + "Savezna Republika Jugoslavija"@hr, + "Socijalistička Federativna Republika Jugoslavija"@hr, + "Jugoszláv Föderatív Népköztársaság"@hu, + "Jugoszláv Szocialista Szövetségi Köztársaság"@hu, + "Jugoszláv Szövetségi Köztársaság"@hu, + "Sambandsalþýðulýðveldið Júgóslavía"@is, + "Sambandslýðveldi Júgóslavíu"@is, + "Sósíalíska sambandslýðveldið Júgóslavía"@is, + "Repubblica Federale di Jugoslavia"@it, + "Repubblica Federativa Popolare di Jugoslavia"@it, + "Repubblica Socialista Federale di Jugoslavia"@it, + "Jugoslavijos Demokratinę Respubliką"@lt, + "Jugoslavijos Federacinė Respublika"@lt, + "Jugoslavijos Socialistinė Federacinė Respublika"@lt, + "Dienvidslāvijas Federatīvo Republiku"@lv, + "Dienvidslāvijas Federālā republika"@lv, + "Dienvidslāvijas Sociālistisko Federālo Republiku"@lv, + "Социјалистичка Федеративна Република Југославија"@mk, + "Сојузна Република Југославија"@mk, + "Федеративна Народна Република Југославија"@mk, + "Ir-Repubblika Federali tal-Jugoslavja"@mt, + "Ir-Repubblika Federali tal-Poplu tal-Jugoslavja"@mt, + "Ir-Repubblika Soċjalista Federali tal-Jugoslavja"@mt, + "Federale Republiek Joegoslavië"@nl, + "Federale Volksrepubliek Joegoslavië"@nl, + "Socialistische Federale Republiek Joegoslavië"@nl, + "Den Føderale Folkerepublikken Jugoslavia"@no, + "Den føderale republikken Jugoslavia"@no, + "Den sosialistiske føderale republikken Jugoslavia"@no, + "Federacyjna Ludowa Republika Jugosławii"@pl, + "Federalnej Republiki Jugosławii"@pl, + "Socjalistycznej Federacyjnej Republiki Jugosławii"@pl, + "República Federal da Jugoslávia"@pt, + "República Popular Federal da Jugoslávia"@pt, + "República Socialista Federativa da Iugoslávia"@pt, + "Republica Federală Iugoslavia"@ro, + "Republica Populară Federală Iugoslavia"@ro, + "Republica Socialistă Federativă Iugoslavia"@ro, + "Социалистическая Федеративная Республика Югославия"@ru, + "Союзная Республика Югославия"@ru, + "Федеративная Народная Республика Югославия"@ru, + "Federativna Narodna Republika Jugoslavija"@sk, + "Federatívna republika Juhoslávia"@sk, + "Socijalistička Federativna Republika Jugoslavija"@sk, + "Federativna ljudska republika Jugoslavija"@sl, + "Socialistična federativna republika Jugoslavija"@sl, + "Zvezna republika Jugoslavija"@sl, + "Republikës Federative Socialiste të Jugosllavisë"@sq, + "Савезна Република Југославија"@sr, + "Социјалистичка Федеративна Република Југославија"@sr, + "Федеративна Народна Република Југославија"@sr, + "Folkrepubliken Jugoslavien"@sv, + "Socialistiska federationen Jugoslavien"@sv, + "Yugoslavya Federal Halk Cumhuriyeti"@tr, + "Yugoslavya Sosyalist Federal Cumhuriyeti"@tr, + "Народної Федеративної Республіки Югославії"@uk, + "Соціалістичної Федеративної Республіки Югославії"@uk ; + skos:changeNote "Closing event: Long name change. Successor ‘Socialist Federal Republic of Yugoslavia’ COU0060."@en, + "Closing event: Long name change. Successor ‘State Union of Serbia and Montenegro’ COU0011."@en, + "Closing event: Splitting of the country into Republic of Slovenia COU0051, Republic of Croatia COU0026, Federal Republic of Yugoslavia COU0061, Bosnia and Herzegovina COU0004, Former Yugoslav Republic of Macedonia COU0040. Successors: COU0051, COU0026, COU0061, COU0004, COU0040."@en, + "Opening event: long name change. Predecessor ‘Federal People’s Republic of Yugoslavia’ COU0059."@en, + "Opening event: long name change. Predecessor ‘Socialist Federal Republic of Yugoslavia’ COU0060."@en, + "Satellite state of the Soviet Union 1943-1948 in the Warsaw Pact. Government extant until 1992. Source: Wikipedia."@en ; + skos:hiddenLabel "jugoslavisk"@da, + "jugoslawisch"@de, + "γιουγκοσλαβική"@el, + "Yugoslav"@en, + "Antigua República Yugoslava de Macedonia"@es, + "de la Antigua República Yugoslava de Macedonia"@es, + "jugoslavialainen"@fi, + "Iúgslavach"@ga, + "Poblacht Shóisialach Chónaidhme na hIúgslaive"@ga, + "an Iúgslaiv"@ga, + "Socijalistička Federativna Republika Jugoslavija"@hr, + "jugoslavensko"@hr, + "Iugoslavia"@it, + "iugoslava"@it, + "Jugoslavijos"@lt, + "Dienvidslāvijas"@lv, + "il-Jugoslavja"@mt, + "Joegoslavisch"@nl, + "jugoslava"@pt, + "iugoslavă"@ro, + "jugoslovansko"@sl, + "jugoslavisk"@sv ; + skos:inScheme atold:country ; + skos:notation "267"^^euvoc:EP, + "YU"^^euvoc:FD_010, + "YU"^^euvoc:FD_140, + "YU"^^euvoc:FD_400, + "YU"^^euvoc:ISO_3166_1_ALPHA_2, + "YUG"^^euvoc:ISO_3166_1_ALPHA_3, + "891"^^euvoc:ISO_3166_1_NUM, + "YUCS"^^euvoc:ISO_3166_3, + "YUG"^^euvoc:NAC ; + skos:prefLabel "Югаславія"@be, + "Югославия"@bg, + "Jugoslavija"@bs, + "Iugoslàvia"@ca, + "Jugoslávie"@cs, + "Jugoslavien"@da, + "Jugoslawien"@de, + "Γιουγκοσλαβία"@el, + "Yugoslavia"@en, + "Yugoslavia"@es, + "Jugoslaavia"@et, + "Jugoslavia"@fi, + "Jugoslavia"@fo, + "Yougoslavie"@fr, + "Iúgslaiv"@ga, + "Iugoslavia"@gl, + "Jugoslavija"@hr, + "Jugoszlávia"@hu, + "Júgóslavía"@is, + "Jugoslavia"@it, + "Jugoslavija"@lt, + "Dienvidslāvija"@lv, + "Југославија"@mk, + "Jugoslavja"@mt, + "Joegoslavië"@nl, + "Jugoslavia"@no, + "Jugosławia"@pl, + "Jugoslávia"@pt, + "Iugoslavia"@ro, + "Югославия"@ru, + "Juhoslávia"@sk, + "Jugoslavija"@sl, + "Jugosllavia"@sq, + "Југославија"@sr, + "Jugoslavien"@sv, + "Yugoslavya"@tr, + "Югославія"@uk ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "ZAR" ; + at:deprecated "true" ; + at:end.use "1997-05-17" ; + at:op-code "ZAR" ; + at:start.use "1960-06-30" ; + atold:op-code "ZAR" ; + dc:identifier "ZAR" ; + owl:deprecated true ; + skos:altLabel "Zaïre"@kg, + "Zaïre"@ln, + "Zaïre"@lua, + "Zaïre"@sw ; + skos:hiddenLabel "Republikken Zaire"@da, + "zairisk"@da, + "von Zaire"@de, + "Zairean"@en, + "zaireña"@es, + "Kodakondsuseta"@et, + "zairelainen"@fi, + "Poblacht na Sáíre"@ga, + "Sáíreach"@ga, + "an tSáír"@ga, + "zairsko"@hr, + "Zaire Köztársaság"@hu, + "zairei"@hu, + "Congo (ex. Zaire)"@it, + "Repubblica democratica del Congo"@it, + "della Repubblica democratica del Congo"@it, + "Zairo"@lt, + "Zairas"@lv, + "iż-Żaire"@mt, + "Zaïrees"@nl, + "Republika Zairu"@pl, + "zairense"@pt, + "zaireză"@ro, + "zairsko"@sl, + "zairisk"@sv ; + skos:inScheme atold:country ; + skos:notation "207"^^euvoc:EP, + "ZR"^^euvoc:FD_010, + "ZR"^^euvoc:FD_400, + "ZR"^^euvoc:ISO_3166_1_ALPHA_2, + "ZAR"^^euvoc:ISO_3166_1_ALPHA_3, + "ZRCD"^^euvoc:ISO_3166_3, + "ZAR"^^euvoc:NAC ; + skos:prefLabel "Заир"@bg, + "Zair"@cs, + "Zaire"@da, + "Zaire"@de, + "Ζαΐρ"@el, + "Zaire"@en, + "Zaire"@es, + "Sair"@et, + "Zaire"@fi, + "Zaïre"@fr, + "An tSáír"@ga, + "Zair"@hr, + "Zaire"@hu, + "Zaire"@it, + "Zairas"@lt, + "Zaira"@lv, + "Iż-Żaire"@mt, + "Zaïre"@nl, + "Zair"@pl, + "Zaire"@pt, + "Zair"@ro, + "Zair"@sk, + "Zair"@sl, + "Zaire"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "ZR0" ; + at:deprecated "true" ; + at:end.use "1960-06-30" ; + at:op-code "ZR0" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "ZR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "ZR" ; + dc:source "EurLex" ] ; + at:start.use "1960-06-30" ; + atold:op-code "ZR0" ; + dc:identifier "ZR0" ; + owl:deprecated true ; + skos:altLabel "Zaïre"@kg, + "Zaïre"@ln, + "Zaïre"@lua, + "Zaïre"@sw ; + skos:historyNote "The code ZR0 is retired and replaced by ZAR."@en ; + skos:inScheme atold:country ; + skos:prefLabel "Заир"@bg, + "Zair"@cs, + "Zaire"@da, + "Zaire"@de, + "Ζαΐρ"@el, + "Zaire"@en, + "Zaire"@es, + "Sair"@et, + "Zaire"@fi, + "Zaïre"@fr, + "An tSáír"@ga, + "Zair"@hr, + "Zaire"@hu, + "Zaire"@it, + "Zairas"@lt, + "Zaira"@lv, + "Iż-Żaire"@mt, + "Zaïre"@nl, + "Zair"@pl, + "Zaire"@pt, + "Zair"@ro, + "Zair"@sk, + "Zair"@sl, + "Zaire"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "ANT" ; + at:deprecated "true" ; + at:end.use "2010-10-09" ; + at:op-code "ANT" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "NA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "NA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "AN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "NA" ; + dc:source "EurLex" ] ; + at:start.use "1954-12-29" ; + atold:op-code "ANT" ; + dc:identifier "ANT" ; + owl:deprecated true ; + skos:altLabel "De Nederlandske Antiller"@da, + "Dutch Antilles"@en, + "Fédération des Antilles néerlandaises"@fr, + "État fédéral autonome des Antilles néerlandaises"@fr, + "Antia Hulandes"@pap ; + skos:broader ; + skos:changeNote "Closing event: Splitting of COU0328, Netherlands Antilles."@en, + "Comprised: Bonaire, Curaçao, Saba, Saint Eustatius, southern Saint Martin until 9.10.2010 and Aruba until 1986."@en, + "Source ISO 3166-3 newsletter I-6: insertion of ISO 3166-3 alpha-4 code."@en, + "Source Wikipedia: From 29.12.1954 until 9.10.2010, the Netherlands Antilles were one of the three constituent countries of the Kingdom of the Netherlands, with the Netherlands and Aruba which were part of the Netherlands Antilles until they seceded in 1986. The Netherlands Antilles were dissolved on 10 October 2010, resulting in two new constituent countries, Curaçao and Sint Maarten, with the other islands joining the Netherlands as ‘special municipalities’, officially public bodies."@en, + "Comprenait: Bonaire, Curaçao, Saba, Saint Eustatius, la partie sud de Saint Martin jusqu’au 9.10.2010, et Aruba jusqu'en 1986."@fr, + "Source ISO 3166-3 newsletter I-6: ajout du code ISO 3166-3 alpha-4."@fr, + "Source Wikipedia: Du 29.12.1954 au 9.10.2010, les Antilles néerlandaises ont constitué un des 3 États du Royaume des Pays-Bas, à côté des Pays-Bas et d’Aruba qui a fait partie des Antilles néerlandaises jusqu'au 1er janvier 1986. Le 10.10.2010, les Antilles néerlandaises ont été dissoutes: Curaçao et la partie néerlandaise de l’île de Saint-Martin forment dès lors deux nouveaux États autonomes au sein du Royaume des Pays-Bas. Les îles de Bonaire, Saba et Saint-Eustache furent réunies aux Pays-Bas en tant que municipalités à statut particulier."@fr ; + skos:hiddenLabel "antillansk"@da, + "der Niederländischen Antillen"@de, + "Ολλανδικών Αντιλλών"@el, + "Hollandi Antillid"@et, + "Hollandi Antillide"@et, + "alankomaalainen, alankomaidenantillilainen"@fi, + "Antilles Néerlandaises"@fr, + "néerlandaise"@fr, + "duine ó Aintillí na hÍsiltíre"@ga, + "Nizozemskih Antila"@hr, + "holland antilláki"@hu, + "delle Antille Olandesi"@it, + "Olandijos Antilų"@lt, + "Nīderlandes Antiļu"@lv, + "l-Antilli Olandiżi"@mt, + "van de Nederlandse Antillen"@nl, + "antylskie"@pl, + "das Antilhas Neerlandesas"@pt, + "Insulele Antile Olandeze"@ro, + "din Insulele Antile Olandeze"@ro, + "nizozemskoantilsko"@sl, + "från Nederländska Antillerna"@sv ; + skos:inScheme atold:country, + ; + skos:notation "264"^^euvoc:EP, + "6"^^euvoc:EP, + "NA"^^euvoc:FD_010, + "AN"^^euvoc:FD_140, + "NA"^^euvoc:FD_140, + "NA"^^euvoc:FD_400, + ".an"^^euvoc:IANA_DOMAIN, + "AN"^^euvoc:ISO_3166_1_ALPHA_2, + "ANT"^^euvoc:ISO_3166_1_ALPHA_3, + "530"^^euvoc:ISO_3166_1_NUM, + "ANHH"^^euvoc:ISO_3166_3, + "ANT"^^euvoc:NAC, + "NA"^^euvoc:TIR ; + skos:prefLabel "Нидерландски Антили"@bg, + "Nizozemské Antily"@cs, + "Nederlandske Antiller"@da, + "Niederländische Antillen"@de, + "Ολλανδικές Αντίλλες"@el, + "Netherlands Antilles"@en, + "Antillas Neerlandesas"@es, + "Madalmaade Antillid"@et, + "Alankomaiden Antillit"@fi, + "Antilles néerlandaises"@fr, + "Aintillí na hÍsiltíre"@ga, + "Nizozemski Antili"@hr, + "Holland Antillák"@hu, + "Antille olandesi"@it, + "Olandijos Antilai"@lt, + "Nīderlandes Antiļas"@lv, + "L-Antilli Olandiżi"@mt, + "Nederlandse Antillen"@nl, + "Antyle Holenderskie"@pl, + "Antilhas Neerlandesas"@pt, + "Antilele Olandeze"@ro, + "Holandské Antily"@sk, + "Nizozemski Antili"@sl, + "Nederländska Antillerna"@sv ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "ATA" ; + at:deprecated "false" ; + at:op-code "ATA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AQ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "AQ" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ATA" ; + dc:identifier "ATA" ; + skos:altLabel "Antartico"@it ; + skos:changeNote "No permanent inhabitants."@en, + "Aucun habitant permanent."@fr ; + skos:hiddenLabel "Ανταρκτικής"@el, + "Antarktis"@et, + "Antarktise"@et, + "duine ó Antartaice"@ga, + "dell'Antartide"@it, + "Antarkties"@lt, + "l-Antartika"@mt, + "antártica"@pt, + "din Antarctica"@ro ; + skos:inScheme atold:country, + ; + skos:notation "7"^^euvoc:EP, + ".aq"^^euvoc:IANA_DOMAIN, + "AQ"^^euvoc:ISG_COU, + "AQ"^^euvoc:ISO_3166_1_ALPHA_2, + "ATA"^^euvoc:ISO_3166_1_ALPHA_3, + "010"^^euvoc:ISO_3166_1_NUM, + "ATA"^^euvoc:NAC, + "AQ"^^euvoc:TED, + "AQ"^^euvoc:TED_SCHEMA, + "010"^^euvoc:UNSD_M49 ; + skos:prefLabel "انتارتيكا"@ar, + "Антарктика"@bg, + "Antàrtida"@ca, + "Antarktida"@cs, + "Antarktis"@da, + "Antarktis"@de, + "Ανταρκτική"@el, + "Antarctica"@en, + "Antártida"@es, + "Antarktika"@et, + "Antarktis"@fi, + "Antarctique"@fr, + "Antartaice"@ga, + "Antarktika"@hr, + "Antarktisz"@hu, + "Suðurskautslandið"@is, + "Antartide"@it, + "南極"@ja, + "Antarktis"@lb, + "Antarktis"@lt, + "Antarktika"@lv, + "L-Antartika"@mt, + "Antarctica"@nl, + "Antarktis"@no, + "Antarktyda"@pl, + "Antártida"@pt, + "Antarctica"@ro, + "Антарктида"@ru, + "Antarktída"@sk, + "Antarktika"@sl, + "Antarktis"@sv, + "Antarktika"@tr, + "Антарктика"@uk, + "南极洲"@zh ; + skos:topConceptOf atold:country, + . + + a skos:Concept ; + at:authority-code "ATB" ; + at:deprecated "true" ; + at:end.use "1981-05-15" ; + at:op-code "ATB" ; + at:start.use "1950-05-09" ; + atold:op-code "ATB" ; + dc:identifier "ATB" ; + owl:deprecated true ; + skos:broader ; + skos:historyNote "No permanent inhabitants."@en, + "The ISO 3166-3 codes ‘BQ, ATB, 080’ are valid from 1974 to 1981, and have been merged into Antarctica codes ‘AQ, ATA, 010’."@en, + "The ‘BQ’ ISO code has been reassigned to Bonaire, Sint Eustatius and Saba."@en, + "Aucun habitant permanent."@fr, + "Le code ISO ‘BQ’ a été réassigné à Bonaire, Saint-Eustache et Saba."@fr ; + skos:inScheme atold:country, + ; + skos:notation "BQ"^^euvoc:ISO_3166_1_ALPHA_2, + "ATB"^^euvoc:ISO_3166_1_ALPHA_3, + "BQAQ"^^euvoc:ISO_3166_3, + "ATB"^^euvoc:NAC ; + skos:prefLabel "Британски антарктически територии"@bg, + "Britské antarktické území"@cs, + "Det Britiske Antarktis’ områder"@da, + "Britisches Antarktis-Territorium"@de, + "Βρετανικό Έδαφος της Ανταρκτικής"@el, + "British Antarctic Territory"@en, + "Territorio Antártico Británico"@es, + "Briti Antarktise ala"@et, + "Brittiläinen antarktinen alue"@fi, + "Territoire de l’Antarctique britannique"@fr, + "Críoch Antartach na Breataine"@ga, + "Britansko Antarktičko Područje"@hr, + "Brit antarktiszi terület"@hu, + "Territorio antartico britannico"@it, + "Britanijos Antarkties teritorija"@lt, + "Britu Antarktikas teritorijas"@lv, + "It-Territorju Antartiku Britanniku"@mt, + "Brits Zuidpoolgebied"@nl, + "Brytyjskie Terytorium Antarktyczne"@pl, + "Território Antártico Britânico"@pt, + "Teritoriile Antarctice Britanice"@ro, + "Britské antarktické územie"@sk, + "Britansko antarktično ozemlje"@sl, + "Brittiska antarktiska territorriet"@sv ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "ATN" ; + at:deprecated "true" ; + at:end.use "1983-01-15" ; + at:op-code "ATN" ; + at:start.use "1950-05-09" ; + atold:op-code "ATN" ; + dc:identifier "ATN" ; + owl:deprecated true ; + skos:altLabel "Dronning Maud Land"@no ; + skos:broader ; + skos:hiddenLabel "Земя Кралица Мод"@bg, + "fra Dronning Maud Land"@da, + "von Königin-Maud-Land"@de, + "Γης της Βασίλισσας Μάουντ"@el, + "Queen Maud Land"@en, + "de la Tierra de la Reina Maud"@es, + "Kuningatar Maudin maan asukas"@fi, + "Terre de la Reine Maud"@fr, + "Críoch na Banríona Maud"@ga, + "duine ó Chríoch na Banríona Maud"@ga, + "Zemlje kraljice Maud"@hr, + "Queen Maud-föld"@hu, + "Queen Maud-földi"@hu, + "Terra della regina Maud"@it, + "della Terra della regina Maud"@it, + "Karalienės Matildos Žemės"@lt, + "Karalienes Modas Zemes"@lv, + "l-Art tar-Reġina Maud"@mt, + "Koningin Maudland"@nl, + "van Koningin Maudland"@nl, + "Ziemi Królowej Maud"@pl, + "da Terra da Rainha Maud"@pt, + "din Țara Reginei Maud"@ro, + "Țara Reginei Maud"@ro, + "Zemlja kraljice Maud"@sl, + "Zemlje kraljice Maud"@sl, + "Drottning Mauds land"@sv, + "från Drottning Mauds land"@sv ; + skos:historyNote "The ISO 3166-3 codes ‘NQ, ATN, 216’ are valid from 1974 to 1983, and have been merged into Antarctica codes ‘AQ, ATA, 010’."@en ; + skos:inScheme atold:country, + ; + skos:notation "134"^^euvoc:EP, + "NQ"^^euvoc:ISO_3166_1_ALPHA_2, + "ATN"^^euvoc:ISO_3166_1_ALPHA_3, + "216"^^euvoc:ISO_3166_1_NUM, + "NQAQ"^^euvoc:ISO_3166_3, + "ATN"^^euvoc:NAC ; + skos:prefLabel "Земята на кралица Мод"@bg, + "Země královny Maud"@cs, + "Dronning Maud Land"@da, + "Königin-Maud-Land"@de, + "Γη της Βασίλισσας Μάουντ"@el, + "Dronning Maud Land"@en, + "Tierra de la Reina Maud"@es, + "Kuninganna Maudi maa"@et, + "Kuningatar Maudin maa"@fi, + "Terre de la Reine-Maud"@fr, + "Dronning Maud Land"@ga, + "Zemlja kraljice Maud"@hr, + "Maud királyné föld"@hu, + "Dronning Maud Land"@it, + "Karalienės Matildos žemė"@lt, + "Karalienes Modas Zeme"@lv, + "Dronning Maud Land"@mt, + "Dronning Maudland"@nl, + "Ziemia Królowej Maud"@pl, + "Terra da Rainha Maud"@pt, + "Ținutul Dronning Maud"@ro, + "Zem kráľovnej Maud"@sk, + "Ozemlje Dronning Maud Land"@sl, + "Dronning Maud Land"@sv ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "CRQ" ; + at:deprecated "false" ; + at:op-code "CRQ" ; + at:start.use "2022-12-09" ; + atold:op-code "CRQ" ; + dc:identifier "CRQ" ; + skos:altLabel "Sark Island"@en ; + skos:broader ; + skos:definition "part of the Channel Islands in the southwestern English Channel; it is a royal fief, which forms part of the Bailiwick of Guernsey, with its own set of laws based on Norman law and its own parliament"@en ; + skos:inScheme atold:country, + ; + skos:notation "CQ"^^euvoc:ISO_3166_1_ALPHA_2, + "CRQ"^^euvoc:ISO_3166_1_ALPHA_3, + "680"^^euvoc:ISO_3166_1_NUM, + "CRQ"^^euvoc:NAC ; + skos:prefLabel "Sark"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "FQ0" ; + at:deprecated "true" ; + at:end.use "1955-08-05" ; + at:op-code "FQ0" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "TF" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "TF" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1955-08-05" ; + atold:op-code "FQ0" ; + dc:identifier "FQ0" ; + owl:deprecated true ; + skos:altLabel "Французские Южные территории"@ru ; + skos:broader ; + skos:changeNote "end_use_date 15/05/1981 removed, concept changed from deprecated to current, see COU0199 and MDR-1713."@en ; + skos:historyNote "FQ is a former ISO alpha-2 code, replaced by TF."@en, + "The code ATF is to be used instead of the former FQ0."@en ; + skos:inScheme atold:country, + ; + skos:prefLabel "إقليم الأراضي الفرنسية الجنوبية والقطبية الجنوبية"@ar, + "Френски южни и антарктически територии"@bg, + "Terres Australs i Antàrtiques Franceses"@ca, + "Francouzská jižní a antarktická území"@cs, + "De Franske Besiddelser i Det Sydlige Indiske Ocean og Antarktis"@da, + "Französische Süd- und Antarktisgebiete"@de, + "Γαλλικές περιοχές του νότιου ημισφαιρίου και της Ανταρκτικής"@el, + "French Southern and Antarctic Lands"@en, + "Territorios Australes y Antárticas Franceses"@es, + "Prantsuse Antarktilised ja Lõunaalad"@et, + "Ranskan eteläiset ja antarktiset alueet"@fi, + "Terres australes et antarctiques françaises"@fr, + "Críocha an Deiscirt agus an Antartaigh de chuid na Fraince"@ga, + "Francuska Južna i Antarktička Područja"@hr, + "Francia Déli és Antarktiszi Területek"@hu, + "Frönsku suðlægu landsvæðin"@is, + "Terre australi e antartiche francesi"@it, + "フランス領南方・南極地域"@ja, + "Franséisch Süd- an Antarktisgebidder"@lb, + "Prancūzijos Pietų ir Antarkties Sritys"@lt, + "Francijas Dienvidjūru un Antarktikas Zemes"@lv, + "It-Territorji Franċiżi tan-Nofsinhar u tal-Antartika"@mt, + "Franse Zuidelijke en Zuidpoolgebieden"@nl, + "Fransk sørlig og antarktisk territorium"@no, + "Francuskie Terytoria Południowe i Antarktyczne"@pl, + "Terras Austrais e Antárticas Francesas"@pt, + "Teritoriile Australe și Antarctice Franceze"@ro, + "Французские Южные и Антарктические территории"@ru, + "Francúzske južné a antarktické územia"@sk, + "Francoska južna in antarktična ozemlja"@sl, + "De franska territorierna i södra Indiska oceanen och Antarktis"@sv, + "Fransız Güney ve Antarktik Bölgesi"@tr, + "Французькі Південні і Антарктичні Території"@uk, + "法属南部和南极土地"@zh ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "HKG" ; + at:deprecated "false" ; + at:op-code "HKG" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "HK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "HK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "HK" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "HK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "HK" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "HKG" ; + dc:identifier "HKG" ; + skos:altLabel "منطقة هونغ كونغ الإدارية الخاصة بجمهورية الصين الشعبية"@ar, + "САР Хонконг"@bg, + "Специален административен район на Китайската народна република Хонконг"@bg, + "Специален административен регион Хонконг"@bg, + "Regió Administrativa Especial de Hong Kong de la República Popular de la Xina"@ca, + "ZAO Hongkong"@cs, + "Zvláštní administrativní oblast Hongkong"@cs, + "Zvláštní administrativní oblast Čínské lidové republiky Hongkong"@cs, + "Det Særlige Administrative Område Hongkong"@da, + "Folkerepublikken Kinas Særlige Administrative Region Hongkong"@da, + "Hongkong SAR"@da, + "Sonderverwaltungsregion Hongkong"@de, + "Sonderverwaltungsregion Hongkong der Volksrepublik China"@de, + "ΕΔΠ του Χονγκ Κονγκ"@el, + "Ειδική Διοικητική Περιοχή Χονγκ Κονγκ της Λαϊκής Δημοκρατίας της Κίνας"@el, + "Ειδική διοικητική περιοχή του Χονγκ Κονγκ"@el, + "Hong Kong SAR"@en, + "Hong Kong Special Administrative Region"@en, + "Hong Kong Special Administrative Region of the People’s Republic of China"@en, + "RAE de Hong Kong"@es, + "Región Administrativa Especial de Hong Kong"@es, + "Región Administrativa Especial de Hong Kong de la República Popular China"@es, + "Hiina Rahvavabariigi Hongkongi erihalduspiirkond"@et, + "Hongkongin erityishallintoalue"@fi, + "Kiinan kansantasavallan erityishallintoalue Hongkong"@fi, + "RAS de Hong Kong"@fr, + "Région administrative spéciale Hong Kong de la République populaire de Chine"@fr, + "Région administrative spéciale de Hong Kong"@fr, + "Sainréigiún Riaracháin Hong Cong, Daonphoblacht na Síne"@ga, + "Posebno upravno područje Narodne Republike Kine Hong Kong"@hr, + "A Kínai Népköztársaság Hongkongi Különleges Közigazgatási Területe"@hu, + "Hongkong KKT"@hu, + "Hongkong Különleges Közigazgatási Terület"@hu, + "Hong Kong, sérstjórnarsvæði Alþýðulýðveldisins Kína"@is, + "RAS di Hong Kong"@it, + "Regione amministrativa speciale di Hong Kong"@it, + "Regione amministrativa speciale di Hong Kong della Repubblica popolare cinese"@it, + "中華人民共和国香港特別行政区"@ja, + "Sonderverwaltungsregioun Hongkong vun der Volleksrepublik China"@lb, + "YAR Honkongas"@lt, + "Ypatingasis Administracinis Kinijos Liaudies Respublikos Regionas Honkongas"@lt, + "Ypatingasis Administracinis Regionas Honkongas"@lt, + "Honkongas Īpašās Pārvaldes Apgabals"@lv, + "Ķīnas Tautas Republikas Honkongas īpašās pārvaldes apgabals"@lv, + "Hong Kong SAR"@mt, + "Ir-Reġjun Amministrattiv Speċjali ta’ Hong Kong"@mt, + "Ir-Reġjun Amministrattiv Speċjali ta’ Hong Kong tar-Repubblika tal-Poplu taċ-Ċina"@mt, + "SAR Hongkong"@nl, + "Speciale Administratieve Regio Hongkong"@nl, + "Speciale Administratieve Regio Hongkong van de Volksrepubliek China"@nl, + "Folkerepublikken Kinas spesielle administrative region Hongkong"@no, + "Specjalny Region Administracyjny Hongkong Chińskiej Republiki Ludowej"@pl, + "RAE de Hong Kong"@pt, + "Região Administrativa Especial de Hong Kong"@pt, + "Região Administrativa Especial de Hong Kong da República Popular da China"@pt, + "RAS Hong Kong"@ro, + "Regiunea Administrativă Specială Hong Kong"@ro, + "Regiunea Administrativă Specială Hong Kong a Republicii Populare Chineze"@ro, + "Специальный административный район Гонконг Китайской Народной Республики"@ru, + "OAO Hongkong"@sk, + "Osobitná administratívna oblasť Hongkong"@sk, + "Osobitná administratívna oblasť Čínskej ľudovej republiky Hongkong"@sk, + "PUO Hongkong"@sl, + "Posebno upravno območje Hongkong"@sl, + "Posebno upravno območje Ljudske republike Kitajske Hongkong"@sl, + "Den särskilda administrativa regionen Hongkong"@sv, + "Folkrepubliken Kinas särskilda administrativa region Hongkong"@sv, + "Hongkong SAR"@sv, + "Çin Halk Cumhuriyeti Hong Kong Özel İdare Bölgesi"@tr, + "Особливий адміністративний район Гонконг Китайської Народної Республіки"@uk, + "香港"@yue, + "中华人民共和国香港特别行政区"@zh ; + skos:hiddenLabel "Zvláštní administrativní oblast Hong Kong"@cs, + "kiinalainen, hongkongilainen"@fi, + "Sainréigiún Riaracháin Hong Cong i nDaonphoblacht na Síne"@ga, + "Síneach ó Hong Cong"@ga, + "Honkongo"@lt, + "ir-Reġjun Amministrattiv Speċjali ta' Hong Kong tar-Repubblika tal-Poplu taċ-Ċina"@mt, + "ta' Hong Kong"@mt, + "Specjalny Region Administracyjny Hongkong"@pl ; + skos:inScheme atold:country, + ; + skos:notation "76"^^euvoc:EP, + "HK"^^euvoc:FD_010, + "HK"^^euvoc:FD_140, + "HK"^^euvoc:FD_400, + ".hk"^^euvoc:IANA_DOMAIN, + "HK"^^euvoc:ISG_COU, + "HK"^^euvoc:ISO_3166_1_ALPHA_2, + "HKG"^^euvoc:ISO_3166_1_ALPHA_3, + "344"^^euvoc:ISO_3166_1_NUM, + "HKG"^^euvoc:NAC, + "852"^^euvoc:PHONE_PREFIX, + "HK"^^euvoc:TED, + "HK"^^euvoc:TED_SCHEMA, + "Eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "344"^^euvoc:UNSD_M49 ; + skos:prefLabel "هونغ كونغ"@ar, + "Хонконг"@bg, + "Hong Kong"@ca, + "Hongkong"@cs, + "Hongkong"@da, + "Hongkong"@de, + "Χονγκ Κονγκ"@el, + "Hong Kong"@en, + "Hong Kong"@es, + "Hongkong"@et, + "Hongkong"@fi, + "Hong Kong"@fr, + "Hong Cong"@ga, + "Hong Kong"@hr, + "Hongkong"@hu, + "Hong Kong"@is, + "Hong Kong"@it, + "香港"@ja, + "Hongkong"@lb, + "Honkongas"@lt, + "Honkonga"@lv, + "Hong Kong"@mt, + "Hongkong"@nl, + "Hong Kong"@no, + "Hongkong"@pl, + "Hong Kong"@pt, + "Hong Kong"@ro, + "Гонконг"@ru, + "Hongkong"@sk, + "Hongkong"@sl, + "Hongkong"@sv, + "Hong Kong"@tr, + "Гонконг"@uk, + "香港"@zh ; + skos:topConceptOf atold:country, + . + + a skos:Concept ; + at:authority-code "IMN" ; + at:deprecated "false" ; + at:op-code "IMN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "IM" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "IM" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "IMN" ; + dc:identifier "IMN" ; + skos:altLabel "Øen Man"@da, + "Ellan Vannin"@gv, + "Isle of Man"@nl ; + skos:changeNote "Междуинституционално ръководство за изготвяне на публикациите: Гърнзи: Подчинена на Британската корона територия. Не е част от Обединеното кралство, но зависи от него по въпросите, свързани с външните отношения. Не е част от Европейския съюз, но е асоцииран с него чрез протокол 3 към Акта за присъединяване на Обединеното кралство."@bg, + "Pravidla pro jednotnou úpravu dokumentů: Guernsey: Území závislé na britské koruně. Není součástí Spojeného království, ale je na něm závislé, co se týče mezinárodních vztahů. Není také součástí Evropské unie, ale je přičleněno protokolem 3 k Aktu Spojeného království o přistoupení."@cs, + "Vejledning i Udformning af EU-publikationer: Guernsey: Hører under den britiske krone. Ikke del af Storbritannien, men er afhængig af Storbritannien i udenrigspolitiske anliggender. Ikke medlem af Den Europæiske Union, men er associeret med den ved Protokol 3 i Storbritanniens tiltrædelsesakt."@da, + "Interinstitutionelle Regeln für Veröffentlichungen: Guernsey: Nicht Teil des Vereinigten Königreichs, sondern als Kronbesitz direkt der britischen Krone unterstellt; in auswärtigen Angelegenheiten dem Vereinigten Königreich unterstellt. Nicht Teil der Europäischen Union, aber ihr assoziiert durch Protokoll 3 des Beitrittsvertrags des Vereinigten Königreichs."@de, + "Διοργανικό εγχειρίδιο σύνταξης κειμένων: Γκέρνζυ: «British Crown dependency». Δεν αποτελεί μέρος του Ηνωμένου Βασιλείου, αλλά εξαρτάται από αυτό για θέματα εξωτερικών σχέσεων. Δεν αποτελεί μέρος της Ευρωπαϊκής Ένωσης, αλλά συνδέεται με αυτήν μέσω του Πρωτοκόλλου 3 της Πράξης Προσχώρησης του Ηνωμένου Βασιλείου."@el, + "Interinstitutional Style Guide: Guernsey: British Crown dependency. Not part of the United Kingdom, but depends on it in matters concerning external relations. Not part of the European Union, but is associated with it through Protocol 3 to the United Kingdom’s Act of Accession."@en, + "Libro de estilo interinstitucional: Guernesey: Territorio autónomo dependiente de la corona británica. No forma parte del Reino Unido pero depende de él para sus asuntos exteriores. Tampoco forma parte de la Unión Europea aunque está asociado a ella con arreglo al Protocolo 3 anejo al Tratado de Adhesión del Reino Unido."@es, + "Institutsioonidevaheline stiilijuhend: Guernsey: Briti Krooni sõltkond; ei ole UK osa, kuid sellest sõltuv välissuhete osas. Ei ole ELi liige, kuid assotsieerunud sellega UK ühinemisakti protokolli nr 3 kaudu."@et, + "Toimielinten yhteiset tekstinlaadinnan ohjeet: Guernsey: Brittiläinen erillisalue kruununsiirtomaa, joka ei ole osa Yhdistynyttä kuningaskuntaa mutta joka on riippuvainen sen ulkosuhteista. Ei ole osa Euroopan unionia mutta erityissuhteista määrätään pöytäkirjassa N:o 3, joka on liitetty Yhdistyneen kuningaskunnan liittymisasiakirjaan."@fi, + "Code de rédaction interinstitutionnel: Guernesey: dépendance de la Couronne britannique. Ne fait pas partie du Royaume-Uni, mais en dépend pour ses affaires extérieures. Ne fait pas partie de l’Union européenne, mais y est associée en vertu du protocole 3 annexé au traité d’adhésion du Royaume-Uni."@fr, + "An Treoir Stíle Idirinstitíuideach:"@ga, + "Intézményközi kiadványszerkesztési útmutató: Guernsey: Brit koronafüggőség. Nem része az Egyesült Királyságnak, védelméért és nemzetközi kapcsolataiért azonban a brit kormány felelős. Nem tagja az Európai Uniónak; kapcsolatát az EU-val az Egyesült Királyság csatlakozási szerződésének 3. jegyzőkönyve szabályozza."@hu, + "Manuale interistituzionale di convenzioni redazionali: Guernsey: dipendenza della Corona britannica. Non fa parte del Regno Unito, ma ne dipende per i suoi affari esteri. Non fa parte dell’Unione europea ma è a essa associata in virtù del protocollo n. 3 allegato all’atto di adesione del Regno Unito."@it, + "Institucijų leidinių rengimo vadovas: Gernsis: Didžiosios Britanijos Karūnos priklausinys. Nėra Jungtinės Karalystės dalis, tačiau nuo jos priklauso jo išorės santykiai. Nėra ir Europos Sąjungos dalis, tačiau su ja asocijuojasi pagal Jungtinės Karalystės stojimo sutarties 3 protokolą."@lt, + "Iestāžu publikāciju noformēšanas rokasgrāmata: Gērnsija: no britu karaļa varas atkarīga teritorija. Neietilpst Apvienotās Karalistes sastāvā, bet tās starptautiskās attiecības ir Apvienotās Karalistes kompetencē. Neietilpst Eiropas Savienības sastāvā, taču, balstoties uz Apvienotās Karalistes Pievienošanās akta Protokolu Nr. 3, ir asociēta ar ES."@lv, + "Gwida tal-Istil Interistituzzjonali: Guernsey: Dipendenza tal-Kuruna Ingliża. Mhix parti mir-Renju Unit, iżda tiddependi fuqu fejn jidħlu relazzjonijiet esterni. Mhix parti mill-Unjoni Ewropea, iżda hija assoċjata magħha permezz tal-Protokoll 3 anness mal-Att ta’ Adeżjoni tar-Renju Unit."@mt, + "Interinstitutionele schrijfwijzer: Guernsey: Brits kroonbezit. Maakt geen deel uit van het Verenigd Koninkrijk, dat echter wel verantwoordelijk is voor de buitenlandse betrekkingen. Maakt geen deel uit van de Europese Unie maar is er wel mee geassocieerd op grond van Protocol 3 bij de toetredingsakte van het Verenigd Koninkrijk."@nl, + "Międzyinstytucjonalny przewodnik redakcyjny: Guernsey: Zależność od Korony Brytyjskiej. Nie stanowi części Zjednoczonego Królestwa, ale jest od niego zależne w sprawach zagranicznych. Nie stanowi części Unii Europejskiej, ale jest z nią stowarzyszone w świetle protokołu 3 załączonego do traktatu o przystąpieniu Zjednoczonego Królestwa."@pl, + "Código de Redação Interinstitucional: Guernesey: Dependente da Coroa britânica. Não faz parte do Reino Unido, mas depende dele para os negócios estrangeiros. Não faz parte da União Europeia, mas está-lhe associada em virtude do Protocolo n.º 3 anexo ao Tratado de Adesão do Reino Unido."@pt, + "Ghid de redactare interinstituțional: Guernsey: dependență a Coroanei britanice. Nu face parte din Regatul Unit, dar depinde de acesta în ceea ce privește relațiile externe. Nu face parte din Uniunea Europeană, dar i se asociază în termenii protocolului 3 anexat la Tratatul de aderare a Regatului Unit."@ro, + "Medziinštitucionálna príručka úpravy dokumentov: Guernsey: Územie závislé od britskej koruny. Nie je súčasťou Spojeného kráľovstva, ale je od neho závislé v oblasti zahraničných vecí. Nie je súčasťou Európskej únie, ale je k nemu pričlenené prostredníctvom protokolu 3 k aktu o pristúpení Spojeného kráľovstva."@sk, + "Medinstitucionalni slogovni priročnik: Guernsey: ozemlje pod britansko krono. Ni del Združenega kraljestva, je pa to pristojno za zunanje odnose. Ni del Evropske unije, a je povezan z njo s Protokolom 3 k Aktu o pristopu Združenega kraljestva."@sl, + "Publikationshandboken: Guernsey: Självstyrande område under den brittiska kronan. Tillhör inte Förenade kungariket, men det senare sköter dess internationella relationer. Står utanför Europeiska unionen, men är associerat via protokoll 3 till Förenade kungarikets anslutningsakt."@sv ; + skos:hiddenLabel "der Insel Man"@de, + "Νήσος του Μαν"@el, + "Νήσου του Μαν"@el, + "de la Isla de Man"@es, + "Mani saare"@et, + "anglaise"@fr, + "Manainn"@ga, + "Menas"@lt, + "Meno"@lt, + "Meno Sala"@lt, + "Menas Salas"@lv, + "minn Isle of Man"@mt, + "Eiland Man"@nl, + "Wyspa Man"@pl, + "manesa"@pt, + "Man"@sk, + "Ostrov Man"@sk ; + skos:historyNote "The Isle of Man was erroneously classified as EU whereas it is not and has never been part of the European Union."@en ; + skos:inScheme atold:country, + ; + skos:notation "283"^^euvoc:EP, + ".im"^^euvoc:IANA_DOMAIN, + "IM"^^euvoc:ISG_COU, + "IM"^^euvoc:ISO_3166_1_ALPHA_2, + "IMN"^^euvoc:ISO_3166_1_ALPHA_3, + "833"^^euvoc:ISO_3166_1_NUM, + "IMN"^^euvoc:NAC, + "44"^^euvoc:PHONE_PREFIX, + "IM"^^euvoc:TED, + "IM"^^euvoc:TED_SCHEMA, + "GBM"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "833"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزيرة مان"@ar, + "Востраў Мэн"@be, + "Остров Ман"@bg, + "Ostrvo Man"@bs, + "Illa de Man"@ca, + "Ostrov Man"@cs, + "Isle of Man"@da, + "Insel Man"@de, + "Νήσος Μαν"@el, + "Isle of Man"@en, + "Isla de Man"@es, + "Mani saar"@et, + "Man Uhartea"@eu, + "Mansaari"@fi, + "Mann"@fo, + "Île de Man"@fr, + "Oileán Mhanann"@ga, + "Illa de Man"@gl, + "Otok Man"@hr, + "Man-sziget"@hu, + "Mön"@is, + "Isola di Man"@it, + "マン島"@ja, + "Insel Man"@lb, + "Meno sala"@lt, + "Menas sala"@lv, + "Островот Ман"@mk, + "Isle of Man"@mt, + "Man"@nl, + "Man"@no, + "Wyspy Man"@pl, + "Ilha de Man"@pt, + "Insla da Man"@rm, + "Insula Man"@ro, + "Остров Мэн"@ru, + "Ostrovov Man"@sk, + "Otok Man"@sl, + "Ishulli i Njeriut"@sq, + "Острво Мен"@sr, + "Isle of Man"@sv, + "Man Adası"@tr, + "Острів Мен"@uk, + "马恩岛"@zh ; + skos:topConceptOf atold:country, + . + + a skos:Concept ; + at:authority-code "JEY" ; + at:deprecated "false" ; + at:op-code "JEY" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "JE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "JE" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "JEY" ; + dc:identifier "JEY" ; + skos:altLabel "Департамент Джърси"@bg, + "Jerse"@bs, + "Batllia de Jersey"@ca, + "Bailiwick Jersey"@cs, + "Bailiwick of Jersey"@da, + "Vogtei Jersey"@de, + "Βαϊλάτο του Τζέρζι"@el, + "Bailiwick of Jersey"@en, + "Bailía de Jersey"@es, + "Jersey erihalduskonna"@et, + "Jerseyn hallintoalueen"@fi, + "Bailliage de Jersey"@fr, + "Báillcheantar Gheirsí"@ga, + "Bailiado de Xersei"@gl, + "Jersey Bailiffség"@hu, + "Fógetaumdæmið Jersey"@is, + "Baliato di Jersey"@it, + "ジャージー代官管轄区"@ja, + "Vogtei Jersey"@lb, + "Džersio Valda"@lt, + "Džērsijas tiesu izpildītāja iecirknis"@lv, + "Il-Bailiwick ta’ Jersey"@mt, + "Bailiwick of Jersey"@nl, + "Bailiwick of Jersey"@no, + "Baliwat Jersey"@pl, + "Bailiado de Jersey"@pt, + "Domeniul Jersey"@ro, + "Бейливик Джерси"@ru, + "Územná jednotka Jersey"@sk, + "Bailiffovo okrožje Jersey"@sl, + "Bailiwick of Jersey"@sv, + "Jersey Muhafızlığı"@tr, + "Бейлівік Джерсі"@uk, + "泽西岛辖区"@zh ; + skos:hiddenLabel "Baliwick of Jersey"@da, + "Τζέρσεϊ"@el, + "anglaise"@fr, + "duine ó Gheirsí"@ga, + "Džersio"@lt, + "Džērsija"@lv, + "Džērsijas"@lv, + "il-Bailiwick ta' Jersey"@mt, + "jerseyskie"@pl, + "jersiana"@pt ; + skos:historyNote "UNSD geoscheme intermediate region name for Jersey is ‘Channel Islands’."@en ; + skos:inScheme atold:country, + ; + skos:notation "281"^^euvoc:EP, + ".je"^^euvoc:IANA_DOMAIN, + "JE"^^euvoc:ISG_COU, + "JE"^^euvoc:ISO_3166_1_ALPHA_2, + "JEY"^^euvoc:ISO_3166_1_ALPHA_3, + "832"^^euvoc:ISO_3166_1_NUM, + "JEY"^^euvoc:NAC, + "44"^^euvoc:PHONE_PREFIX, + "JE"^^euvoc:TED, + "JE"^^euvoc:TED_SCHEMA, + "GBJ"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "832"^^euvoc:UNSD_M49 ; + skos:prefLabel "جيرزي"@ar, + "Джэрзі"@be, + "Джърси"@bg, + "Jersey"@bs, + "Jersey"@ca, + "Jersey"@cs, + "Jersey"@da, + "Jersey"@de, + "Τζέρζι"@el, + "Jersey"@en, + "Jersey"@es, + "Jersey"@et, + "Jersey"@eu, + "Jersey"@fi, + "Jersey"@fo, + "Jersey"@fr, + "Geirsí"@ga, + "Xersei"@gl, + "Jersey"@hr, + "Jersey"@hu, + "Jersey"@is, + "Jersey"@it, + "ジャージー"@ja, + "Jersey"@lb, + "Džersis"@lt, + "Džersija"@lv, + "Џерси"@mk, + "Jersey"@mt, + "Jersey"@nl, + "Jersey"@no, + "Jersey"@pl, + "Jersey"@pt, + "Jersey"@rm, + "Jersey"@ro, + "Джерси"@ru, + "Jersey"@sk, + "Jersey"@sl, + "Jersey"@sq, + "Џерзи"@sr, + "Jersey"@sv, + "Jersey"@tr, + "Джерсі"@uk, + "泽西岛"@zh ; + skos:topConceptOf atold:country, + . + + a skos:Concept ; + at:authority-code "MAC" ; + at:deprecated "false" ; + at:op-code "MAC" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "MO" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MH" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "MAC" ; + dc:identifier "MAC" ; + skos:altLabel "منطقة ماكاو الإدارية الخاصة بجمهورية الصين الشعبية"@ar, + "Административен район със специален статут Макао"@bg, + "Специален административен район на Китайската народна република Макао"@bg, + "Regió administrativa especial de Macau de la República Popular de la Xina"@ca, + "澳門"@chn, + "Zvláštní administrativní oblast Čínské lidové republiky Macao"@cs, + "Folkerepublikken Kinas Særlige Administrative Region Macao"@da, + "Macao"@de, + "Sonderverwaltungsregion Macau"@de, + "Ειδική Διοικητική Περιοχή Μακάο της Λαϊκής Δημοκρατίας της Κίνας"@el, + "Macao Special Administrative Region of the People’s Republic of China"@en, + "Región Administrativa Especial de Macao de la República Popular China"@es, + "Hiina Rahvavabariigi Macau erihalduspiirkond"@et, + "Kiinan kansantasavallan erityishallintoalue Macao"@fi, + "Macau"@fr, + "Région administrative spéciale de Macao"@fr, + "Sainréigiún Riaracháin Macao, Daon-Phoblacht na Síne"@ga, + "Posebno upravno područje Narodne Republike Kine Macao"@hr, + "Makaó Különleges Közigazgatási Terület"@hu, + "sérstjórnarsvæðið Makaó í Alþýðulýðveldinu Kína"@is, + "Regione amministrativa speciale di Macao"@it, + "中華人民共和国マカオ特別行政区"@ja, + "Sonderverwaltungsregioun Macau vun der Volleksrepublik China"@lb, + "Ypatingasis Administracinis Kinijos Regionas Makao"@lt, + "Ķīnas Tautas Republikas Makao Īpašās pārvaldes apgabals"@lv, + "Ir-Reġjun Amministrattiv Speċjali tal-Macao tar-Repubblika tal-Poplu taċ-Ċina"@mt, + "Speciale Administratieve Regio Macau van de Volksrepubliek China"@nl, + "Macaos spesielle administrative region i Folkerepublikken Kina"@no, + "Specjalny Region Administracyjny Makau"@pl, + "Região Administrativa Especial de Macau da República Popular da China"@pt, + "Regiunea Administrativă Specială Macao a Republicii Populare Chineze"@ro, + "Специальный административный район Макао Китайской Народной Республики"@ru, + "Osobitná administratívna oblasť Čínskej ľudovej republiky Macao"@sk, + "Posebno upravno območje Ljudske republike Kitajske Makav"@sl, + "Den särskilda administrativa regionen Macao"@sv, + "Çin Halk Cumhuriyeti Makau Özel İdare Bölgesi"@tr, + "Спеціальний адміністративний район Аоминь Китайської Народної Республіки"@uk, + "中华人民共和国澳门特别行政区"@zh ; + skos:hiddenLabel "Zvláštní administrativní oblast Macao"@cs, + "Región Administrativa Especial de Macao de la República Popular China"@es, + "kiinalainen, macaolainen"@fi, + "duine ó Macao"@ga, + "Macaa"@hr, + "A Kínai Népköztársaság Makaói Különleges Közigazgatási Területe"@hu, + "Regione amministrativa speciale di Macao della Repubblica Popolare Cinese"@it, + "il-Macao"@mt, + "ir-Reġjun Amministrattiv Speċjali tal-Macao tar-Repubblika tal-Poplu taċ-Ċina"@mt, + "Região Administrativa Especial de Macau da República Popular da China"@pt, + "Posebno upravno območje Macao"@sl, + "Folkrepubliken Kinas särskilda administrativa region Macao"@sv ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + ; + skos:notation "211"^^euvoc:EP, + "MH"^^euvoc:FD_010, + ".mo"^^euvoc:IANA_DOMAIN, + "MO"^^euvoc:ISG_COU, + "MO"^^euvoc:ISO_3166_1_ALPHA_2, + "MAC"^^euvoc:ISO_3166_1_ALPHA_3, + "446"^^euvoc:ISO_3166_1_NUM, + "MAC"^^euvoc:NAC, + "853"^^euvoc:PHONE_PREFIX, + "MO"^^euvoc:TED, + "MO"^^euvoc:TED_SCHEMA, + "Eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "446"^^euvoc:UNSD_M49 ; + skos:prefLabel "ماكاو"@ar, + "Макао"@bg, + "Macau"@ca, + "Macao"@cs, + "Macao"@da, + "Macau"@de, + "Μακάο"@el, + "Macao"@en, + "Macao"@es, + "Macau"@et, + "Macao"@fi, + "Macao"@fr, + "Macao"@ga, + "Macao"@hr, + "Makaó"@hu, + "Makaó"@is, + "Macao"@it, + "マカオ"@ja, + "Macau"@lb, + "Makao"@lt, + "Makao"@lv, + "Il-Macao"@mt, + "Macau"@nl, + "Macau"@no, + "Makau"@pl, + "Macau"@pt, + "Macao"@ro, + "Макао"@ru, + "Macao"@sk, + "Makav"@sl, + "Macao"@sv, + "Makao"@tr, + "Макао"@uk, + "澳门"@zh ; + skos:topConceptOf atold:country, + . + + a skos:Concept ; + at:authority-code "PCI" ; + at:deprecated "true" ; + at:end.use "1994-09-30" ; + at:op-code "PCI" ; + at:start.use "1950-05-09" ; + atold:op-code "PCI" ; + dc:identifier "PCI" ; + owl:deprecated true ; + skos:broader ; + skos:hiddenLabel "Тихоокеански острови"@bg, + "Tichomořské ostrovy"@cs, + "Stillehavsøer"@da, + "fra Stillehavsøerne"@da, + "Pazifische Inseln"@de, + "der Pazifischen Inseln"@de, + "Νήσοι του Ειρηνικού"@el, + "Νήσων του Ειρηνικού"@el, + "Pacific Islands"@en, + "de las islas del Pacífico"@es, + "islas del Pacífico"@es, + "Tyynenmeren saaret"@fi, + "Tyynenmeren saarten asukas"@fi, + "Iles du Pacifique"@fr, + "Oileáin san Aigéan Ciúin"@ga, + "duine ó Oileáin san Aigéan Ciúin"@ga, + "Pacifičko otočje"@hr, + "Pacifičkog otočja"@hr, + "Csendes-óceáni-szigetek"@hu, + "csendes-óceáni-szigeteki"@hu, + "Isole del Pacifico"@it, + "delle Isole del Pacifico"@it, + "Ramiojo vandenyno salos"@lt, + "Ramiojo vandenyno salų"@lt, + "Klusā okeāna salas"@lv, + "Klusā okeāna salu"@lv, + "il-Gżejjer tal-Paċifiku"@mt, + "Pacifische eilanden"@nl, + "van de Pacifische eilanden"@nl, + "Wyspy Pacyfiku"@pl, + "Ilhas do Pacífico"@pt, + "das Ilhas do Pacífico"@pt, + "Insulele Pacificului"@ro, + "din insulele Pacificului"@ro, + "Tichomorské ostrovy"@sk, + "Pacifiški otoki"@sl, + "Pacifiških otokov"@sl, + "Stillahavsöar"@sv, + "Stillahavsöarna"@sv, + "från Stillahavsöarna"@sv ; + skos:inScheme atold:country, + ; + skos:notation "140"^^euvoc:EP, + "PC"^^euvoc:ISO_3166_1_ALPHA_2, + "PCI"^^euvoc:ISO_3166_1_ALPHA_3, + "PCHH"^^euvoc:ISO_3166_3, + "PCI"^^euvoc:NAC ; + skos:prefLabel "Територия под попечителство на тихоокеанските острови"@bg, + "Poručenské území Tichomořských ostrovů"@cs, + "De ikke-selvstyrende Stillehavsøer"@da, + "Treuhandgebiet Pazifische Inseln"@de, + "Εδάφη υπό εντολή των Νήσων του Ειρηνικού"@el, + "Trust Territory of the Pacific Islands"@en, + "Territorio en Fideicomiso de las Islas del Pacífico"@es, + "Vaikse ookeani saarte hooldusterritoorium"@et, + "Tyynenmeren saarten huoltohallintoalue"@fi, + "Territoires sous tutelle des îles du Pacifique"@fr, + "Críoch Iontaobhais Oileáin an Aigéin Chiúin"@ga, + "Starateljsko područje tihooceanskih otoka"@hr, + "Csendes-óceáni-szigetek gyámsági területe"@hu, + "Territorio fiduciario delle isole del Pacifico"@it, + "Ramiojo vandenyno salų globojamoji teritorija"@lt, + "Klusā okeāna salu aizbildnības teritorijas"@lv, + "Territorju Tutelat tal-Gżejjer tal-Paċifiku"@mt, + "Trustschap van de Pacifische Eilanden"@nl, + "Powiernicze Terytorium Wysp Pacyfiku"@pl, + "Protetorado das Ilhas do Pacífico"@pt, + "Teritoriile sub tutelă ale insulelor din Pacific"@ro, + "Poručenské územie Tichomorských ostrovov"@sk, + "Ozemlje pacifiških otokov pod nekdanjim skrbništvom"@sl, + "Förvaltarskapsområdet Stillahavsöarna"@sv ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "PUS" ; + at:deprecated "true" ; + at:end.use "1986-12-31" ; + at:op-code "PUS" ; + at:start.use "1950-05-09" ; + atold:op-code "PUS" ; + dc:identifier "PUS" ; + owl:deprecated true ; + skos:altLabel "Ηνωμένες Πολιτείες – Διάφορες Νήσοι του Ειρηνικού"@el, + "United States Miscellaneous Pacific Islands"@en, + "Diversas islas del Pacífico de los Estados Unidos"@es, + "Ameerika Ühendriigid – mitmesugused Vaikse ookeani saared"@et, + "Yhdysvaltain Tyynenmeren saaret"@fi, + "Razni pacifički otoci Sjedinjenih Država"@hr, + "Egyesült Államok egyéb Csendes-óceáni-szigetek"@hu, + "Jungtinių Valstijų Ramiojo vandenyno salos"@lt, + "Verenigde Staten, diverse eilanden in de Stille Oceaan"@nl, + "Diversas Ilhas do Pacífico dos Estados Unidos da América"@pt, + "Diverse insule din Pacific ale Statelor Unite"@ro, + "Razni pacifiški otoki Združenih držav"@sl, + "Förenta staternas stillahavsöar"@sv ; + skos:broader ; + skos:hiddenLabel "Различни тихоокеански острови (САЩ)"@bg, + "Různé tichomořské ostrovy (Spojené státy)"@cs, + "Stillehavsøer (USA)"@da, + "fra USA's Stillehavsøer"@da, + "Pazifische Inseln (USA)"@de, + "der Pazifischen Inseln (USA)"@de, + "Διάφορα νησιά του Ειρηνικού (Ηνωμένες Πολιτείες)"@el, + "Διαφόρων νησιών του Ειρηνικού (Ηνωμένες Πολιτείες)"@el, + "Various Pacific Islands (United States)"@en, + "Islas menores alejadas de los Estados Unidos"@es, + "de las Islas menores alejadas de los Estados Unidos"@es, + "Yhdysvaltain Tyynenmeren erillissaaret"@fi, + "yhdysvaltalainen"@fi, + "Iles Diverses du Pacifique (Etats-Unis)"@fr, + "Oileáin Éagsúla san Aigéan Ciúin (Na Stáit Aontaithe)"@ga, + "duine ó Oileáin Éagsúla san Aigéan Ciúin (Na Stáit Aontaithe)"@ga, + "Razni pacifički otoci (SAD)"@hr, + "Raznih pacifičkih otoka (SAD)"@hr, + "Amerikai Csendes-óceáni-szigetek"@hu, + "amerikai csendes-óceáni szigeteki"@hu, + "Isole diverse del Pacifico (Stati Uniti)"@it, + "delle Isole diverse del Pacifico (Stati Uniti)"@it, + "Įvairios Ramiojo vandenyno salos (JAV)"@lt, + "Įvairių Ramiojo vandenyno salų (JAV)"@lt, + "Dažādas Klusā okeāna salas (Amerkas Savienotās Valstis)"@lv, + "Dažādu Klusā okeāna salu (Amerkas Savienotās Valstis)"@lv, + "Diversi Gżejjer tal-Paċifiku (Stati Uniti)"@mt, + "Pacifische eilanden van de Verenigde Staten"@nl, + "van de Pacifische eilanden van de Verenigde Staten"@nl, + "Wyspy Pacyfiku (Stany Zjednoczone)"@pl, + "Ilhas Diversas do Pacífico (Estados Unidos)"@pt, + "das Ilhas Diversas do Pacífico (Estados Unidos)"@pt, + "Diverse Insule din Pacific (Statele Unite)"@ro, + "din Diverse Insule din Pacific (Statele Unite)"@ro, + "Rozličné tichomorské ostrovy (Spojené štáty)"@sk, + "različni tihomorski otoki (ZDA)"@sl, + "različni tihomorski otoki (Združene države Amerike)"@sl, + "različnih tihomorskih otokov (ZDA)"@sl, + "Stillahavsöar (USA)"@sv, + "från Stillahavsöar (USA)"@sv ; + skos:inScheme atold:country ; + skos:notation "212"^^euvoc:EP, + "PU"^^euvoc:ISO_3166_1_ALPHA_2, + "PUS"^^euvoc:ISO_3166_1_ALPHA_3, + "PUUM"^^euvoc:ISO_3166_3, + "PUS"^^euvoc:NAC ; + skos:prefLabel "Различни тихоокеански острови на САЩ"@bg, + "Různé tichomořské ostrovy USA"@cs, + "Diverse amerikanske stillehavsøer"@da, + "Vereinigte Staaten Sonstiges Pazifische Inseln"@de, + "ΗΠΑ – Διάφορες Νήσοι του Ειρηνικού"@el, + "US Miscellaneous Pacific Islands"@en, + "Diversas islas del Pacífico de los EE. UU."@es, + "Ühendriikide hajasaared"@et, + "USA:n Tyynenmeren saaret"@fi, + "Diverses îles du Pacifique (États-Unis)"@fr, + "Il-oileáin na Stát Aontaithe san Aigéan Ciúin"@ga, + "Razni pacifički otoci SAD-a"@hr, + "USA egyéb Csendes-óceáni-szigetek"@hu, + "Stati Uniti – varie isole del Pacifico"@it, + "JAV priklausančios Ramiojo vandenyno salos"@lt, + "ASV dažādas Klusā okeāna salas"@lv, + "Gżejjer tal-Paċifiku Mixxellanji tal-Istati Uniti"@mt, + "VS, diverse eilanden in de Stille Oceaan"@nl, + "Różne Wyspy Pacyfiku Stanów Zjednoczonych"@pl, + "Diversas Ilhas do Pacífico dos EUA"@pt, + "Diverse insule din Pacific ale SUA"@ro, + "Rôzne tichomorské ostrovy USA"@sk, + "Razni pacifiški otoki ZDA"@sl, + "USA:s stillahavsöar"@sv ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "XAC" ; + at:deprecated "false" ; + at:op-code "XAC" ; + at:start.use "1934-05-10" ; + atold:op-code "XAC" ; + dc:identifier "XAC" ; + skos:altLabel "Territory of Ashmore and Cartier Islands"@en ; + skos:broader ; + skos:definition "uninhabited external territory of Australia consisting of four low-lying tropical islands in two separate reefs, and the 12-nautical-mile territorial sea generated by the islands; the territory is located in the Indian Ocean"@en ; + skos:inScheme atold:country, + ; + skos:notation "XAC"^^euvoc:NAC ; + skos:prefLabel "Ashmore and Cartier Islands"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XAD" ; + at:deprecated "false" ; + at:op-code "XAD" ; + at:start.use "1960-08-16" ; + atold:op-code "XAD" ; + dc:identifier "XAD" ; + skos:broader ; + skos:definition "parts of Cyprus which stayed under British jurisdiction and remained British sovereign territory when the 1960 Treaty of Establishment created the independent Republic of Cyprus"@en ; + skos:inScheme atold:country, + ; + skos:notation "XAD"^^euvoc:NAC ; + skos:prefLabel "UK Sovereign Base Areas of Akrotiri and Dhekelia"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XBA" ; + at:deprecated "true" ; + at:end.use "1966-10-03" ; + at:op-code "XBA" ; + at:start.use "1884-04-18" ; + atold:op-code "XBA" ; + dc:identifier "XBA" ; + owl:deprecated true ; + skos:broader ; + skos:definition "British Crown colony that existed from 1884 to 1966 in present-day Lesotho"@en ; + skos:inScheme atold:country, + ; + skos:notation "XBA"^^euvoc:NAC ; + skos:prefLabel "Basutoland"@en, + "Bassoutoland"@fr ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XBH" ; + at:deprecated "false" ; + at:op-code "XBH" ; + at:start.use "2022-12-09" ; + atold:op-code "XBH" ; + dc:identifier "XBH" ; + skos:altLabel "Büsingen on the Upper Rhine"@en ; + skos:broader ; + skos:definition "German municipality in the south of Baden-Württemberg and an enclave entirely surrounded by Swiss canton of Schaffhausen, Zürich and Thurgau; politically it is part of Germany, forming part of the district of Konstanz, but economically it forms part of the Swiss customs union"@en ; + skos:inScheme atold:country, + ; + skos:notation "XBH"^^euvoc:NAC ; + skos:prefLabel "Büsingen am Hochrhein"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XCI" ; + at:deprecated "false" ; + at:op-code "XCI" ; + at:start.use "2020-01-01" ; + atold:op-code "XCI" ; + dc:identifier "XCI" ; + skos:broader ; + skos:definition "Since 1 January 2020, Campione d'Italia, an Italian enclave situated on Swiss territory, has been included in the customs territory of the European Union and in the territorial scope of excise duty. At the same time, it remains outside the territorial scope of value added tax. Source: Council Directive (EU) 2019/475 of 18 February 2019."@en ; + skos:inScheme atold:country, + ; + skos:notation "XCI"^^euvoc:NAC ; + skos:prefLabel "Campione d’Italia"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XGS" ; + at:deprecated "false" ; + at:op-code "XGS" ; + at:start.use "2022-12-09" ; + atold:op-code "XGS" ; + dc:identifier "XGS" ; + skos:broader ; + skos:definition "Palestinian exclave on the eastern coast of the Mediterranean Sea"@en ; + skos:inScheme atold:country, + ; + skos:notation "XGS"^^euvoc:NAC ; + skos:prefLabel "Ивицата Газа"@bg, + "Pásmo Gazy"@cs, + "Gazastriben"@da, + "Gazastreifen"@de, + "Λωρίδα της Γάζας"@el, + "Gaza Strip"@en, + "Franja de Gaza"@es, + "Gaza sektor"@et, + "Gazan kaista"@fi, + "Bande de Gaza"@fr, + "Stráice Gaza"@ga, + "Pojas Gaze"@hr, + "Gázai övezet"@hu, + "Striscia di Gaza"@it, + "Gazos Ruožas"@lt, + "Gazas josla"@lv, + "Strixxa ta’ Gaża"@mt, + "Gazastrook"@nl, + "Strefa Gazy"@pl, + "Faixa de Gaza"@pt, + "Fâșia Gaza"@ro, + "Pásmo Gazy"@sk, + "Območje Gaze"@sl, + "Gazaremsan"@sv ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XIC" ; + at:deprecated "false" ; + at:op-code "XIC" ; + at:start.use "2018-11-07" ; + atold:op-code "XIC" ; + dc:identifier "XIC" ; + skos:broader ; + skos:definition "Spanish autonomous community and archipelago in the Atlantic Ocean"@en ; + skos:inScheme atold:country, + ; + skos:notation "IC"^^euvoc:ISO_3166_1_ALPHA_2, + "XIC"^^euvoc:NAC ; + skos:prefLabel "Canary Islands"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XIH" ; + at:deprecated "false" ; + at:op-code "XIH" ; + at:start.use "2022-12-09" ; + atold:op-code "XIH" ; + dc:identifier "XIH" ; + skos:altLabel "Island of Heligoland"@en ; + skos:broader ; + skos:definition "small archipelago in the North Sea; a part of the German state of Schleswig-Holstein since 1890, the islands were historically possessions of Denmark, then became the possessions of the United Kingdom from 1807 to 1890"@en ; + skos:inScheme atold:country, + ; + skos:notation "XIH"^^euvoc:NAC ; + skos:prefLabel "Хелголан"@bg, + "Helgoland"@da, + "Helgoland"@de, + "Heligoland"@en, + "Helgoland"@fi, + "Helgoland"@fr, + "Helgoland"@hu, + "Helgoland"@nl, + "Helgoland"@pt, + "Helgoland"@sl ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XLF" ; + at:deprecated "false" ; + at:op-code "XLF" ; + at:start.use "2022-12-09" ; + atold:op-code "XLF" ; + dc:identifier "XLF" ; + skos:altLabel "Fezzan region (Libya)"@en ; + skos:broader ; + skos:definition "strategic southwestern region of Libya; its stability is vital for Europe’s security and that of the wider Mediterranean area (source: https://fpc.org.uk/)"@en ; + skos:inScheme atold:country, + ; + skos:notation "XLF"^^euvoc:NAC ; + skos:prefLabel "Fezzan (Libya)"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XLI" ; + at:deprecated "false" ; + at:op-code "XLI" ; + at:start.use "2022-12-09" ; + atold:op-code "XLI" ; + dc:identifier "XLI" ; + skos:broader ; + skos:definition "Italian comune – a special-administered territory in the province of Sondrio, in the region of Lombardy, Italy"@en ; + skos:inScheme atold:country, + ; + skos:notation "XLI"^^euvoc:NAC ; + skos:prefLabel "Livigno"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XLL" ; + at:deprecated "false" ; + at:op-code "XLL" ; + at:start.use "2020-01-01" ; + atold:op-code "XLL" ; + dc:identifier "XLL" ; + skos:broader ; + skos:definition "Since 1 January 2020, the Italian waters of Lake Lugano have been included in the customs territory of the European Union and in the territorial scope of excise duty. At the same time, they remain outside the territorial scope of value added tax. Source: Council Directive (EU) 2019/475 of 18 February 2019."@en ; + skos:inScheme atold:country, + ; + skos:notation "XLL"^^euvoc:NAC ; + skos:prefLabel "Italian waters of Lake Lugano"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XMA" ; + at:deprecated "false" ; + at:op-code "XMA" ; + at:start.use "2022-12-09" ; + atold:op-code "XMA" ; + dc:identifier "XMA" ; + skos:broader ; + skos:definition "monastic community of Mount Athos, an autonomous region within the Hellenic Republic, ecclesiastically under the direct jurisdiction of the Ecumenical Patriarch of Constantinople"@en ; + skos:inScheme atold:country, + ; + skos:notation "XMA"^^euvoc:NAC ; + skos:prefLabel "Mount Athos"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XNC" ; + at:deprecated "false" ; + at:op-code "XNC" ; + at:start.use "1983-11-15" ; + atold:op-code "XNC" ; + dc:identifier "XNC" ; + skos:broader ; + skos:definition "northeastern portion of the island of Cyprus; recognised only by Türkiye, and considered by the international community to be part of the Republic of Cyprus"@en ; + skos:inScheme atold:country, + ; + skos:notation "XNC"^^euvoc:NAC ; + skos:prefLabel "зони на Република Кипър, в които правителството на Република Кипър не упражнява ефективен контрол"@bg, + "území Kyperské republiky, nad nimiž vláda Kyperské republiky nevykonává skutečnou kontrolu"@cs, + "områder af Republikken Cypern, hvor Republikken Cyperns regering ikke udøver faktisk kontrol"@da, + "Teile der Republik Zypern, in denen die Regierung der Republik Zypern keine tatsächliche Kontrolle ausübt"@de, + "περιοχές της Κυπριακής Δημοκρατίας στις οποίες η κυβέρνηση της Κυπριακής Δημοκρατίας δεν ασκεί αποτελεσματικό έλεγχο"@el, + "areas of the Republic of Cyprus in which the Government of the Republic of Cyprus does not exercise effective control"@en, + "zonas de la República de Chipre en las que el Gobierno de ese país no ejerce un control efectivo"@es, + "Küprose Vabariigi piirkonnad, mille üle Küprose Vabariigi valitsusel puudub tegelik kontroll"@et, + "Kyproksen tasavallan alueet, jotka eivät kuulu Kyproksen tasavallan hallituksen tosiasialliseen hallintaan"@fi, + "zones de la République de Chypre dans lesquelles le gouvernement de la République de Chypre n’exerce pas de contrôle effectif"@fr, + "limistéir de Phoblacht na Cipire nach bhfuil rialú éifeachtach á fheidhmiú ag Rialtas Phoblacht na Cipire iontu"@ga, + "područjima Republike Cipra u kojima Vlada Republike Cipra ne provodi stvarnu kontrolu"@hr, + "a Ciprusi Köztársaság azon területei, ahol a Ciprusi Köztársaság kormánya nem gyakorol tényleges ellenőrzést"@hu, + "ne della Repubblica di Cipro sulle quali il governo della Repubblica di Cipro non esercita un controllo effettivo"@it, + "Kipro Respublikos teritorijos, kurių Kipro Respublikos Vyriausybė veiksmingai nekontroliuoja"@lt, + "Kipras Republikas daļas, kuras Kipras Republikas valdība faktiski nekontrolē"@lv, + "żoni tar-Repubblika ta’ Ċipru li fihom il-Gvern tar-Repubblika ta’ Ċipru ma jeżerċitax kontroll effettiv"@mt, + "gebieden van de Republiek Cyprus waarover de regering van de Republiek Cyprus niet feitelijk het gezag uitoefent"@nl, + "obszary Republiki Cypryjskiej, nad którymi rząd Republiki Cypryjskiej nie sprawuje faktycznej kontroli"@pl, + "zonas da República de Chipre em que o governo da República de Chipre não exerce um controlo efetivo"@pt, + "zonele din Republica Cipru în care Guvernul Republicii Cipru nu exercită un control efectiv"@ro, + "oblasti Cyperskej republiky, v ktorých vláda Cyperskej republiky nevykonáva skutočnú kontrolu"@sk, + "območjih Republike Ciper, ki niso pod dejanskim nadzorom Vlade Republike Ciper"@sl, + "områden i Republiken Cypern där Republiken Cyperns regering inte utövar den faktiska kontrollen"@sv ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XNY" ; + at:deprecated "true" ; + at:end.use "1964-07-05" ; + at:op-code "XNY" ; + at:start.use "1907-07-06" ; + atold:op-code "XNY" ; + dc:identifier "XNY" ; + owl:deprecated true ; + skos:altLabel "Nyasaland Protectorate"@en ; + skos:broader ; + skos:definition "British protectorate located in Africa; between 1953 and 1963, Nyasaland was part of the Federation of Rhodesia and Nyasaland; after the Federation was dissolved, Nyasaland became independent from Britain on 6 July 1964 and was renamed Malawi."@en ; + skos:inScheme atold:country, + ; + skos:notation "XNY"^^euvoc:NAC ; + skos:prefLabel "Nyasaland"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XPA" ; + at:deprecated "false" ; + at:op-code "XPA" ; + at:start.use "1976-04-30" ; + atold:op-code "XPA" ; + dc:identifier "XPA" ; + skos:altLabel "Autonomous Region of the Azores"@en ; + skos:broader ; + skos:inScheme atold:country, + ; + skos:notation "XPA"^^euvoc:NAC ; + skos:prefLabel "Azores"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XPM" ; + at:deprecated "false" ; + at:op-code "XPM" ; + at:start.use "2022-12-09" ; + atold:op-code "XPM" ; + dc:identifier "XPM" ; + skos:altLabel "Autonomous Region of Madeira"@en ; + skos:broader ; + skos:inScheme atold:country, + ; + skos:notation "XPM"^^euvoc:NAC ; + skos:prefLabel "Madeira"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XSC" ; + at:deprecated "false" ; + at:op-code "XSC" ; + at:start.use "2022-12-09" ; + atold:op-code "XSC" ; + dc:identifier "XSC" ; + skos:broader ; + skos:definition "Spanish autonomous city on the north coast of Africa"@en ; + skos:inScheme atold:country, + ; + skos:notation "XSC"^^euvoc:NAC ; + skos:prefLabel "Ceuta"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XSL" ; + at:deprecated "false" ; + at:op-code "XSL" ; + at:start.use "2022-12-09" ; + atold:op-code "XSL" ; + dc:identifier "XSL" ; + skos:altLabel "Republic of Somaliland"@en ; + skos:broader ; + skos:definition "de facto sovereign state in the Horn of Africa, still considered internationally to be part of Somalia"@en ; + skos:inScheme atold:country, + ; + skos:notation "XSL"^^euvoc:NAC ; + skos:prefLabel "Somaliland"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XSM" ; + at:deprecated "false" ; + at:op-code "XSM" ; + at:start.use "1995-03-14" ; + atold:op-code "XSM" ; + dc:identifier "XSM" ; + skos:broader ; + skos:definition "autonomous city of Spain located in north Africa"@en ; + skos:inScheme atold:country, + ; + skos:notation "XSM"^^euvoc:NAC ; + skos:prefLabel "Melilla"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XWS" ; + at:deprecated "true" ; + at:end.use "1961-12-31" ; + at:op-code "XWS" ; + at:start.use "1914-12-17" ; + atold:op-code "XWS" ; + dc:identifier "XWS" ; + owl:deprecated true ; + skos:altLabel "Territory of Western Samoa"@en ; + skos:broader ; + skos:definition "external territory of New Zealand"@en ; + skos:inScheme atold:country, + ; + skos:notation "XWS"^^euvoc:NAC ; + skos:prefLabel "Western Samoa"@en ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "XXI" ; + at:deprecated "false" ; + at:op-code "XXI" ; + at:start.use "1950-05-09" ; + atold:op-code "XXI" ; + dc:identifier "XXI" ; + skos:broader ; + skos:inScheme atold:country, + ; + skos:notation "XXI"^^euvoc:NAC ; + skos:prefLabel "Северна Ирландия"@bg, + "Severní Irsko"@cs, + "Nordirland"@da, + "Nordirland"@de, + "Βόρεια Ιρλανδία"@el, + "Northern Ireland"@en, + "Irlanda del Norte"@es, + "Põhja-Iirimaa"@et, + "Pohjois-Irlanti"@fi, + "Irlande du Nord"@fr, + "Tuaisceart Éireann"@ga, + "Sjeverna Irska"@hr, + "Észak-Írország"@hu, + "Irlanda del Nord"@it, + "Šiaurės Airija"@lt, + "Ziemeļīrija"@lv, + "l-Irlanda ta’ Fuq"@mt, + "Noord-Ierland"@nl, + "Irlandia Północna"@pl, + "Irlanda do Norte"@pt, + "Irlanda de Nord"@ro, + "Severné Írsko"@sk, + "Severna Irska"@sl, + "Nordirland"@sv ; + skos:topConceptOf . + + a skos:Concept ; + at:authority-code "ALA" ; + at:deprecated "false" ; + at:op-code "ALA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AX" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "AX" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ALA" ; + dc:identifier "ALA" ; + skos:altLabel "Islas Åland"@es, + "Ahvenanmaan maakunta"@fi, + "Oileáin Åland"@ga, + "Alandų Salos"@lt, + "Landskapet Åland"@sv ; + skos:broader ; + skos:hiddenLabel "Острови Оланд"@bg, + "Ålandy"@cs, + "Åland"@de, + "Νήσων Ώλαντ"@el, + "Ahvenamaa maakond"@et, + "duine ó Oileáin Åland"@ga, + "Olandski Otoci"@hr, + "Olandskih Otoka"@hr, + "Alandų"@lt, + "il-Gżejjer Åland"@mt, + "Wysp Alandzkich"@pl, + "Ålandskih otokov"@sl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "277"^^euvoc:EP, + ".ax"^^euvoc:IANA_DOMAIN, + "AX"^^euvoc:ISG_COU, + "AX"^^euvoc:ISO_3166_1_ALPHA_2, + "ALA"^^euvoc:ISO_3166_1_ALPHA_3, + "248"^^euvoc:ISO_3166_1_NUM, + "ALA"^^euvoc:NAC, + "FI2"^^euvoc:NUTS, + "AX"^^euvoc:TED, + "AX"^^euvoc:TED_SCHEMA, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "248"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر أولاند"@ar, + "Oстрови Оланд"@bg, + "Illes Åland"@ca, + "Alandy"@cs, + "Åland"@da, + "Ålandinseln"@de, + "Νήσοι Ώλαντ"@el, + "Åland Islands"@en, + "Åland"@es, + "Ahvenamaa"@et, + "Ahvenanmaa"@fi, + "Îles Åland"@fr, + "Na hOileáin Åland"@ga, + "Ålandski Otoci"@hr, + "Åland-szigetek"@hu, + "Álandseyjar"@is, + "Isole Åland"@it, + "オーランド諸島"@ja, + "Åland-Inselen"@lb, + "Alandai"@lt, + "Ālandu Salas"@lv, + "Il-Gżejjer Åland"@mt, + "Åland"@nl, + "Åland"@no, + "Wyspy Alandzkie"@pl, + "Alanda"@pt, + "Insulele Åland"@ro, + "Аландские острова"@ru, + "Alandy"@sk, + "Ålandski otoki"@sl, + "Åland"@sv, + "Aland Adaları"@tr, + "Аландські острови"@uk, + "奥兰群岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "ASM" ; + at:deprecated "false" ; + at:op-code "ASM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AS" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "AS" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ASM" ; + dc:identifier "ASM" ; + skos:altLabel "إقليم ساموا الأمريكي"@ar, + "Territori de Samoa Americana"@ca, + "Teritorium Americká Samoa"@cs, + "Territoriet Amerikansk Samoa"@da, + "Territorium Amerikanisch-Samoa"@de, + "Έδαφος της Αμερικανικής Σαμόας"@el, + "Territory of American Samoa"@en, + "Territorio de Samoa Americana"@es, + "Territoire des Samoa américaines"@fr, + "Críoch Shamó Meiriceánach"@ga, + "Područje Američke Samoe"@hr, + "Territorio delle Samoa americane"@it, + "Amerikos Samoa Teritorija"@lt, + "ASV Samoa teritorija"@lv, + "It-Territorju tas-Samoa Amerikana"@mt, + "Territorium Amerikaans-Samoa"@nl, + "Terytorium Samoa Amerykańskiego"@pl, + "Território da Samoa Americana"@pt, + "Teritoriul Samoa Americană"@ro, + "Территория Американское Самоа"@ru, + "Teritórium Americkej Samoy"@sk, + "Ozemlje Ameriška Samoa"@sl, + "Sāmoa Amelika"@sm, + "Amerikan Samoası Bölgesi"@tr, + "Територія Американського Самоа"@uk, + "美属萨摩亚领土"@zh ; + skos:broader ; + skos:hiddenLabel "Έδαφος της Αμερικανικής Σαμόα"@el, + "Αμερικανικής Σαμόας"@el, + "amerikansamoalainen, yhdysvaltalainen"@fi, + "des Samoa américaines"@fr, + "Críoch Shamó Mheiriceá"@ga, + "Samó Mheiriceá"@ga, + "Samóch Meiriceánach"@ga, + "Američke Samoe"@hr, + "Teritorij Američke Samoe"@hr, + "ASV Samoas"@lv, + "Samoana"@mt, + "is-Samoa Amerikana"@mt, + "it-Territorju tas-Samoa Amerikana"@mt, + "samoańskie"@pl, + "da Samoa Americana"@pt, + "Ameriške Samoe"@sl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "9"^^euvoc:EP, + ".as"^^euvoc:IANA_DOMAIN, + "AS"^^euvoc:ISG_COU, + "AS"^^euvoc:ISO_3166_1_ALPHA_2, + "ASM"^^euvoc:ISO_3166_1_ALPHA_3, + "016"^^euvoc:ISO_3166_1_NUM, + "ASM"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "AS"^^euvoc:TED, + "AS"^^euvoc:TED_SCHEMA, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "016"^^euvoc:UNSD_M49 ; + skos:prefLabel "ساموا الأمريكية"@ar, + "Американска Самоа"@bg, + "Samoa Nord-americana"@ca, + "Americká Samoa"@cs, + "Amerikansk Samoa"@da, + "Amerikanisch-Samoa"@de, + "Αμερικανική Σαμόα"@el, + "American Samoa"@en, + "Samoa Americana"@es, + "Ameerika Samoa"@et, + "Amerikan Samoa"@fi, + "Samoa américaines"@fr, + "Samó Meiriceánach"@ga, + "Američka Samoa"@hr, + "Amerikai Szamoa"@hu, + "Bandaríska Samóa"@is, + "Samoa americane"@it, + "アメリカ領サモア"@ja, + "Amerikanesch-Samoa"@lb, + "Amerikos Samoa"@lt, + "ASV Samoa"@lv, + "Is-Samoa Amerikana"@mt, + "Amerikaans-Samoa"@nl, + "Amerikansk Samoa"@no, + "Samoa Amerykańskie"@pl, + "Samoa Americana"@pt, + "Samoa Americană"@ro, + "Американское Самоа"@ru, + "Americká Samoa"@sk, + "Ameriška Samoa"@sl, + "Amerikanska Samoa"@sv, + "Amerikan Samoası"@tr, + "Американське Самоа"@uk, + "美属萨摩亚"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "BVT" ; + at:deprecated "false" ; + at:op-code "BVT" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BV" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "BV" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "BVT" ; + dc:identifier "BVT" ; + skos:altLabel "Buvė Sala"@lt ; + skos:broader ; + skos:hiddenLabel "Остров Буве"@bg, + "Νήσου Μπουβέ"@el, + "Bouvet' saar"@et, + "Bouvet' saare"@et, + "de l'Île Bouvet"@fr, + "duine ó Oileán Bouvet"@ga, + "Otoka Bouvet"@hr, + "dell'Isola di Bouvet"@it, + "Buvē Salas"@lv, + "il-Gżira Bouvet"@mt, + "il-Gżira ta’ Bouvet"@mt, + "mill-Gżira Bouvet"@mt, + "Wyspy Bouveta"@pl, + "Bouvetovega otoka"@sl ; + skos:inScheme atold:country, + , + ; + skos:notation "26"^^euvoc:EP, + ".bv"^^euvoc:IANA_DOMAIN, + "BV"^^euvoc:ISG_COU, + "BV"^^euvoc:ISO_3166_1_ALPHA_2, + "BVT"^^euvoc:ISO_3166_1_ALPHA_3, + "074"^^euvoc:ISO_3166_1_NUM, + "BVT"^^euvoc:NAC, + "BV"^^euvoc:TED, + "BV"^^euvoc:TED_SCHEMA, + "BV"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "074"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزيرة بوفيت"@ar, + "Oстров Буве"@bg, + "Illa Bouvet"@ca, + "Bouvetův ostrov"@cs, + "Bouvetøen"@da, + "Bouvetinsel"@de, + "Νήσος Μπουβέ"@el, + "Bouvet Island"@en, + "Isla Bouvet"@es, + "Bouvet’ saar"@et, + "Bouvet’nsaari"@fi, + "Île Bouvet"@fr, + "Oileán Bouvet"@ga, + "Bouvetov Otok"@hr, + "Bouvet-sziget"@hu, + "Bouvet-eyja"@is, + "Isola di Bouvet"@it, + "ブーベ島"@ja, + "Bouvetinsel"@lb, + "Buvė"@lt, + "Buvē sala"@lv, + "Il-Gżira Bouvet"@mt, + "Bouveteiland"@nl, + "Bouvetøya"@no, + "Wyspa Bouveta"@pl, + "Ilha Bouvet"@pt, + "Insula Bouvet"@ro, + "Остров Буве"@ru, + "Bouvetov ostrov"@sk, + "Bouvetov otok"@sl, + "Bouvetön"@sv, + "Bouvet Adası"@tr, + "Острів Буве"@uk, + "布维岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "CCK" ; + at:deprecated "false" ; + at:op-code "CCK" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CC" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "CC" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "CCK" ; + dc:identifier "CCK" ; + skos:altLabel "إقليم جزر كوكس (كيلينغ)"@ar, + "Територия Кокосови острови"@bg, + "Territori de les Illes Cocos (Keeling)"@ca, + "Teritorium Kokosové (Keelingovy) ostrovy"@cs, + "Keelinginseln"@de, + "Territorium Kokosinseln"@de, + "Έδαφος των Νήσων Κόκος (Κίλινγκ)"@el, + "Cocos Keeling Islands"@en, + "Territory of Cocos (Keeling) Islands"@en, + "Territorio de las Islas Cocos"@es, + "Kookossaarte ala"@et, + "Territoire des Îles des Cocos"@fr, + "Críoch na nOileán Cocos"@ga, + "Područje Kokosovih (Keelingovih) Otoka"@hr, + "Kókusz-szigetek"@hu, + "Territorio delle Isole Cocos"@it, + "{ココス(キーリング)諸島準州}"@ja, + "Territoire vun de Kokosinselen"@lb, + "Kokosų (Kilingo) Salų Teritorija"@lt, + "Kokosu (Kīlinga) salu teritorija"@lv, + "It-Territorju tal-Gżejjer Cocos (Keeling)"@mt, + "Territorium Cocoseilanden"@nl, + "Terytorium Wysp Kokosowych (Keelinga)"@pl, + "Território das Ilhas Cocos"@pt, + "Teritoriul Insulelor Cocos (Keeling)"@ro, + "Территория Кокосовые острова (Килинг)"@ru, + "Teritórium Kokosových ostrovov"@sk, + "Ozemlje Kokosovi (Keelingovi) otoki"@sl, + "Territoriet Kokosöarna"@sv, + "Cocos (Keeling) Adaları Bölgesi"@tr, + "Територія Кокосові острови (Кілінг)"@uk, + "科科斯(基林)群岛领土"@zh ; + skos:broader ; + skos:hiddenLabel "Cocosøerne (Keeling)"@da, + "Territoriet Cocosøerne"@da, + "Kokosinseln (Keelinginseln)"@de, + "Νήσοι Κόκος (Κίλινγκ)"@el, + "Νήσων Κόκος (Κίλινγκ)"@el, + "Kookossaarte"@et, + "australialainen, kookossaarelainen"@fi, + "Îles Cocos (Keeling)"@fr, + "Críoch Oileáin Cocos (Keeling)"@ga, + "Oileáin Cocos (Keeling)"@ga, + "duine ó Oileáin Cocos (Keeling)"@ga, + "Kokosovih (Keelingovih) Otoka"@hr, + "Teritorij Kokosovih (Keelingovih) Otoka"@hr, + "Kókusz (Keeling)-szigetek"@hu, + "Kokosu (Kīlinga) Salu"@lv, + "il-Gżejjer Cocos (Keeling)"@mt, + "it-Territorju tal-Gżejjer Cocos (Keeling)"@mt, + "Wysp Kokosowych"@pl, + "Ilhas dos Cocos"@pt, + "Território das Ilhas dos Cocos"@pt, + "coquense"@pt, + "din Insulele Cocos (Keeling)"@ro, + "Kokosovih otokov"@sl, + "Ozemlje Kokosovi otoki"@sl ; + skos:inScheme atold:country, + , + ; + skos:notation "30"^^euvoc:EP, + ".cc"^^euvoc:IANA_DOMAIN, + "CC"^^euvoc:ISG_COU, + "CC"^^euvoc:ISO_3166_1_ALPHA_2, + "CCK"^^euvoc:ISO_3166_1_ALPHA_3, + "166"^^euvoc:ISO_3166_1_NUM, + "CCK"^^euvoc:NAC, + "61"^^euvoc:PHONE_PREFIX, + "CC"^^euvoc:TED, + "CC"^^euvoc:TED_SCHEMA, + "Australia and New Zealand"^^euvoc:UNSD_GEOSCHEME, + "166"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر كوكس (كيلينغ)"@ar, + "Кокосови острови"@bg, + "Illes Cocos (Keeling)"@ca, + "Kokosové (Keelingovy) ostrovy"@cs, + "Cocosøerne"@da, + "Kokosinseln"@de, + "Νήσοι Κόκος (Κήλινγκ)"@el, + "Cocos (Keeling) Islands"@en, + "Islas Cocos"@es, + "Kookossaared"@et, + "Kookossaaret"@fi, + "Îles des Cocos"@fr, + "Oileáin Cocos"@ga, + "Kokosovi (Keelingovi) Otoci"@hr, + "Kókusz-szigetek/Keeling-szigetek"@hu, + "Kókoseyjar"@is, + "Isole Cocos"@it, + "{ココス(キーリング)諸島}"@ja, + "Kokosinselen"@lb, + "Kokosų (Kilingo) Salos"@lt, + "Kokosu (Kīlinga) salas"@lv, + "Il-Gżejjer Cocos (Keeling)"@mt, + "Cocoseilanden"@nl, + "Kokos (Keeling)-øyene"@no, + "Wyspy Kokosowe"@pl, + "Ilhas Cocos"@pt, + "Insulele Cocos (Keeling)"@ro, + "Кокосовые острова (Килинг)"@ru, + "Kokosové ostrovy"@sk, + "Kokosovi (Keelingovi) otoki"@sl, + "Kokosöarna"@sv, + "Cocos (Keeling) Adaları"@tr, + "Кокосові острови (Кілінг)"@uk, + "科科斯(基林)群岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "CPT" ; + at:deprecated "false" ; + at:op-code "CPT" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CP" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "CP" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "CPT" ; + dc:identifier "CPT" ; + skos:altLabel "جزيرة كليبرتون"@ar, + "Oстров Клипертон"@bg, + "Illa Clipperton"@ca, + "Clippertonův ostrov"@cs, + "Clippertonøen"@da, + "Νήσος Κλίπερτον"@el, + "Clipperton Island"@en, + "Isla Clipperton"@es, + "Clipperton saar"@et, + "Clippertoninsaari"@fi, + "Île Clipperton"@fr, + "Île de Clipperton"@fr, + "Île de la Passion"@fr, + "Oileán Clipperton"@ga, + "Otok Clipperton"@hr, + "Clipperton-sziget"@hu, + "Clipperton-eyja"@is, + "Isola di Clipperton"@it, + "クリッパートン島"@ja, + "Clippertoninsel"@lb, + "Klipertono Sala"@lt, + "Klipertona sala"@lv, + "Il-Gżira Clipperton"@mt, + "Clippertoneiland"@nl, + "Clippertonøya"@no, + "Wyspa Clipperton"@pl, + "Ilha de Clipperton"@pt, + "Insula Clipperton"@ro, + "Остров Клиппертон"@ru, + "Clippertonov ostrov"@sk, + "Clippertonov otok"@sl, + "Clippertonön"@sv, + "Clipperton Adası"@tr, + "Острів Кліппертон"@uk ; + skos:broader ; + skos:changeNote "No permanent inhabitants."@en, + "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en, + "Aucun habitant permanent."@fr ; + skos:inScheme atold:country, + , + ; + skos:notation "CP"^^euvoc:ISG_COU, + "CP"^^euvoc:ISO_3166_1_ALPHA_2, + "CPT"^^euvoc:ISO_3166_1_ALPHA_3, + "CPT"^^euvoc:NAC, + "CP"^^euvoc:TED, + "CP"^^euvoc:TED_SCHEMA ; + skos:prefLabel "كليبرتون"@ar, + "Клипертон"@bg, + "Clipperton"@ca, + "Clipperton"@cs, + "Clipperton"@da, + "Clipperton"@de, + "Κλίπερτον"@el, + "Clipperton"@en, + "Clipperton"@es, + "Clipperton"@et, + "Clipperton"@fi, + "Clipperton"@fr, + "Clipperton"@ga, + "Clipperton"@hr, + "Clipperton"@hu, + "Clipperton"@is, + "Clipperton"@it, + "クリッパートン"@ja, + "Clipperton"@lb, + "Klipertonas"@lt, + "Klipertona"@lv, + "Clipperton"@mt, + "Clipperton"@nl, + "Clipperton"@no, + "Clipperton"@pl, + "Clipperton"@pt, + "Clipperton"@ro, + "Клиппертон"@ru, + "Clipperton"@sk, + "Clipperton"@sl, + "Clipperton"@sv, + "Clipperton"@tr, + "Кліппертон"@uk, + "克利珀顿岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "CXR" ; + at:deprecated "false" ; + at:op-code "CXR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CX" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "CX" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "CXR" ; + dc:identifier "CXR" ; + skos:altLabel "إقليم جزيرة كريسماس"@ar, + "Територия остров Рождество"@bg, + "Territori de l'Illa Christmas"@ca, + "Teritorium Vánoční ostrov"@cs, + "Juleøen"@da, + "Territoriet Christmas Island"@da, + "Territorium Weihnachtsinsel"@de, + "Έδαφος της Νήσου των Χριστουγέννων"@el, + "Christmas Island Territory"@en, + "Territorio de la Isla Christmas"@es, + "Jõulusaare ala"@et, + "Joulusaaren territorio"@fi, + "Territoire de l’Île Christmas"@fr, + "Críoch Oileán na Nollag"@ga, + "Područje Božićnog Otoka"@hr, + "Terrritorio dell’Isola Christmas"@it, + "Territoire vun der Chrëschtdagsinsel"@lb, + "Kalėdų Salos Teritorija"@lt, + "Ziemassvētku salas teritorija"@lv, + "It-Territorju tal-Gżira Christmas"@mt, + "Territorium Christmaseiland"@nl, + "Terytorium Wyspy Bożego Narodzenia"@pl, + "Território da Ilha Christmas"@pt, + "Teritoriul Insulei Christmas"@ro, + "Территория остров Рождества"@ru, + "Teritórium Vianočného ostrova"@sk, + "Ozemlje Božični otok"@sl, + "Territoriet Julön"@sv, + "Christmas Adası Bölgesi"@tr, + "Територія острова Різдва"@uk, + "圣诞岛领地"@zh ; + skos:broader ; + skos:hiddenLabel "Остров Рождество"@bg, + "Νήσου των Χριστουγέννων"@el, + "Joulusaari"@fi, + "australialainen, joulusaarelainen"@fi, + "de l'Île Christmas"@fr, + "duine ó Oileán na Nollag"@ga, + "Božićnog Otoka"@hr, + "Teritorij Božićnog Otoka"@hr, + "Territorio dell'Isola Christmas"@it, + "dell'Isola Christmas"@it, + "Ziemassvētku Salas"@lv, + "Ziemsvētku Salas Teritorija"@lv, + "it-Territorju tal-Gżira Christmas"@mt, + "mill-Gżira Christmas"@mt, + "Wyspy Bożego Narodzenia"@pl, + "Ilha do Natal"@pt, + "Território da Ilha do Natal"@pt, + "natalense"@pt ; + skos:inScheme atold:country, + , + ; + skos:notation "43"^^euvoc:EP, + ".cx"^^euvoc:IANA_DOMAIN, + "CX"^^euvoc:ISG_COU, + "CX"^^euvoc:ISO_3166_1_ALPHA_2, + "CXR"^^euvoc:ISO_3166_1_ALPHA_3, + "162"^^euvoc:ISO_3166_1_NUM, + "CXR"^^euvoc:NAC, + "61"^^euvoc:PHONE_PREFIX, + "CX"^^euvoc:TED, + "CX"^^euvoc:TED_SCHEMA, + "Australia and New Zealand"^^euvoc:UNSD_GEOSCHEME, + "162"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزيرة كريسماس"@ar, + "Oстров Рождество"@bg, + "Illa Christmas"@ca, + "Vánoční ostrov"@cs, + "Christmas Island"@da, + "Weihnachtsinsel"@de, + "Νήσος των Χριστουγέννων"@el, + "Christmas Island"@en, + "Isla Christmas"@es, + "Jõulusaar"@et, + "Joulusaar"@fi, + "Île Christmas"@fr, + "Oileán na Nollag"@ga, + "Božićni Otok"@hr, + "Karácsony-sziget"@hu, + "Jólaey"@is, + "Isola Christmas"@it, + "クリスマス島"@ja, + "Chrëschtdagsinsel"@lb, + "Kalėdų Sala"@lt, + "Ziemassvētku sala"@lv, + "Il-Gżira Christmas"@mt, + "Christmaseiland"@nl, + "Juleøya"@no, + "Wyspa Bożego Narodzenia"@pl, + "Ilha Christmas"@pt, + "Insula Christmas"@ro, + "Остров Рождества"@ru, + "Vianočný ostrov"@sk, + "Božični otok"@sl, + "Julön"@sv, + "Christmas Adası"@tr, + "Острів Різдва"@uk, + "圣诞岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "GGY" ; + at:deprecated "false" ; + at:op-code "GGY" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "GG" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "GGY" ; + dc:identifier "GGY" ; + skos:altLabel "غويرنسي"@ar, + "Департамент Гърнзи"@bg, + "Batllia de Guernsey"@ca, + "Bailiwick Guernsey"@cs, + "Bailiwick of Guernsey"@da, + "Vogtei Guernsey"@de, + "Βαϊλάτο του Γκέρνζι"@el, + "Bailiwick of Guernsey"@en, + "Bailiazgo de Guernsey"@es, + "Guernsey sõltkond"@et, + "Guernseyn voutikunta"@fi, + "Bailliage de Guernesey"@fr, + "Báillcheantar Gheansaí"@ga, + "Bailiado de Guernsey"@gl, + "Guernsey Bailiffség"@hu, + "Fógetaumdæmið Guernsey"@is, + "Baliato di Guernsey"@it, + "ガーンジー代官管轄区"@ja, + "Vogtei Guernsey"@lb, + "Gernsio Valda"@lt, + "Gērnsijas teritoriālā vienība"@lv, + "Il-Bailiwick ta’ Guernsey"@mt, + "Bailiwick of Guernsey"@nl, + "Baliwat Guernsey"@pl, + "Bailiado de Guernsey"@pt, + "Domeniul Guernsey"@ro, + "Бейливик Гернси"@ru, + "Bailiwick Guernsey"@sk, + "Bailiffovo okrožje Guernsey"@sl, + "Bailiwick of Guernsey"@sv, + "Guernsey Muhafızlığı"@tr, + "Бейлівік Гернсі"@uk, + "根西岛辖区"@zh ; + skos:changeNote "Междуинституционално ръководство за изготвяне на публикациите: Гърнзи: Подчинена на Британската корона територия. Не е част от Обединеното кралство, но зависи от него по въпросите, свързани с външните отношения. Не е част от Европейския съюз, но е асоцииран с него чрез протокол 3 към Акта за присъединяване на Обединеното кралство."@bg, + "Pravidla pro jednotnou úpravu dokumentů: Guernsey: Území závislé na britské koruně. Není součástí Spojeného království, ale je na něm závislé, co se týče mezinárodních vztahů. Není také součástí Evropské unie, ale je přičleněno protokolem 3 k Aktu Spojeného království o přistoupení."@cs, + "Vejledning i Udformning af EU-publikationer: Guernsey: Hører under den britiske krone. Ikke del af Storbritannien, men er afhængig af Storbritannien i udenrigspolitiske anliggender. Ikke medlem af Den Europæiske Union, men er associeret med den ved Protokol 3 i Storbritanniens tiltrædelsesakt."@da, + "Interinstitutionelle Regeln für Veröffentlichungen: Guernsey: Nicht Teil des Vereinigten Königreichs, sondern als Kronbesitz direkt der britischen Krone unterstellt; in auswärtigen Angelegenheiten dem Vereinigten Königreich unterstellt. Nicht Teil der Europäischen Union, aber ihr assoziiert durch Protokoll 3 des Beitrittsvertrags des Vereinigten Königreichs."@de, + "Διοργανικό εγχειρίδιο σύνταξης κειμένων: Γκέρνζυ: «British Crown dependency». Δεν αποτελεί μέρος του Ηνωμένου Βασιλείου, αλλά εξαρτάται από αυτό για θέματα εξωτερικών σχέσεων. Δεν αποτελεί μέρος της Ευρωπαϊκής Ένωσης, αλλά συνδέεται με αυτήν μέσω του Πρωτοκόλλου 3 της Πράξης Προσχώρησης του Ηνωμένου Βασιλείου."@el, + "Interinstitutional Style guide: Guernsey: British Crown dependency. Not part of the United Kingdom, but depends on it in matters concerning external relations. Not part of the European Union, but is associated with it through Protocol 3 to the United Kingdom’s Act of Accession."@en, + "Libro de estilo interinstitucional: Guernesey: Territorio autónomo dependiente de la corona británica. No forma parte del Reino Unido pero depende de él para sus asuntos exteriores. Tampoco forma parte de la Unión Europea aunque está asociado a ella con arreglo al Protocolo 3 anejo al Tratado de Adhesión del Reino Unido."@es, + "Institutsioonidevaheline stiilijuhend: Guernsey: Briti Krooni sõltkond; ei ole UK osa, kuid sellest sõltuv välissuhete osas. Ei ole ELi liige, kuid assotsieerunud sellega UK ühinemisakti protokolli nr 3 kaudu."@et, + "Toimielinten yhteiset tekstinlaadinnan ohjeet: Guernsey: Brittiläinen erillisalue kruununsiirtomaa, joka ei ole osa Yhdistynyttä kuningaskuntaa mutta joka on riippuvainen sen ulkosuhteista. Ei ole osa Euroopan unionia mutta erityissuhteista määrätään pöytäkirjassa N:o 3, joka on liitetty Yhdistyneen kuningaskunnan liittymisasiakirjaan."@fi, + "Code de rédaction interinstitutionnel: Guernesey: dépendance de la Couronne britannique. Ne fait pas partie du Royaume-Uni, mais en dépend pour ses affaires extérieures. Ne fait pas partie de l’Union européenne, mais y est associée en vertu du protocole 3 annexé au traité d’adhésion du Royaume-Uni."@fr, + "An Treoir Stíle Idirinstitíuideach:"@ga, + "Intézményközi kiadványszerkesztési útmutató: Guernsey: Brit koronafüggőség. Nem része az Egyesült Királyságnak, védelméért és nemzetközi kapcsolataiért azonban a brit kormány felelős. Nem tagja az Európai Uniónak; kapcsolatát az EU-val az Egyesült Királyság csatlakozási szerződésének 3. jegyzőkönyve szabályozza."@hu, + "Manuale interistituzionale di convenzioni redazionali: Guernsey: dipendenza della Corona britannica. Non fa parte del Regno Unito, ma ne dipende per i suoi affari esteri. Non fa parte dell’Unione europea ma è a essa associata in virtù del protocollo n. 3 allegato all’atto di adesione del Regno Unito."@it, + "Institucijų leidinių rengimo vadovas: Gernsis: Didžiosios Britanijos Karūnos priklausinys. Nėra Jungtinės Karalystės dalis, tačiau nuo jos priklauso jo išorės santykiai. Nėra ir Europos Sąjungos dalis, tačiau su ja asocijuojasi pagal Jungtinės Karalystės stojimo sutarties 3 protokolą."@lt, + "Iestāžu publikāciju noformēšanas rokasgrāmata: Gērnsija: no britu karaļa varas atkarīga teritorija. Neietilpst Apvienotās Karalistes sastāvā, bet tās starptautiskās attiecības ir Apvienotās Karalistes kompetencē. Neietilpst Eiropas Savienības sastāvā, taču, balstoties uz Apvienotās Karalistes Pievienošanās akta Protokolu Nr. 3, ir asociēta ar ES."@lv, + "Gwida tal-Istil Interistituzzjonali: Guernsey: Dipendenza tal-Kuruna Ingliża. Mhix parti mir-Renju Unit, iżda tiddependi fuqu fejn jidħlu relazzjonijiet esterni. Mhix parti mill-Unjoni Ewropea, iżda hija assoċjata magħha permezz tal-Protokoll 3 anness mal-Att ta’ Adeżjoni tar-Renju Unit."@mt, + "Interinstitutionele schrijfwijzer: Guernsey: Brits kroonbezit. Maakt geen deel uit van het Verenigd Koninkrijk, dat echter wel verantwoordelijk is voor de buitenlandse betrekkingen. Maakt geen deel uit van de Europese Unie maar is er wel mee geassocieerd op grond van Protocol 3 bij de toetredingsakte van het Verenigd Koninkrijk."@nl, + "Międzyinstytucjonalny przewodnik redakcyjny: Guernsey: Zależność od Korony Brytyjskiej. Nie stanowi części Zjednoczonego Królestwa, ale jest od niego zależne w sprawach zagranicznych. Nie stanowi części Unii Europejskiej, ale jest z nią stowarzyszone w świetle protokołu 3 załączonego do traktatu o przystąpieniu Zjednoczonego Królestwa."@pl, + "Código de Redação Interinstitucional: Guernesey: Dependente da Coroa britânica. Não faz parte do Reino Unido, mas depende dele para os negócios estrangeiros. Não faz parte da União Europeia, mas está-lhe associada em virtude do Protocolo n.º 3 anexo ao Tratado de Adesão do Reino Unido."@pt, + "Ghid de redactare interinstituțional: Guernsey: dependență a Coroanei britanice. Nu face parte din Regatul Unit, dar depinde de acesta în ceea ce privește relațiile externe. Nu face parte din Uniunea Europeană, dar i se asociază în termenii protocolului 3 anexat la Tratatul de aderare a Regatului Unit."@ro, + "Medziinštitucionálna príručka úpravy dokumentov: Guernsey: Územie závislé od britskej koruny. Nie je súčasťou Spojeného kráľovstva, ale je od neho závislé v oblasti zahraničných vecí. Nie je súčasťou Európskej únie, ale je k nemu pričlenené prostredníctvom protokolu 3 k aktu o pristúpení Spojeného kráľovstva."@sk, + "Medinstitucionalni slogovni priročnik: Guernsey: ozemlje pod britansko krono. Ni del Združenega kraljestva, je pa to pristojno za zunanje odnose. Ni del Evropske unije, a je povezan z njo s Protokolom 3 k Aktu o pristopu Združenega kraljestva."@sl, + "Publikationshandboken: Guernsey: Självstyrande område under den brittiska kronan. Tillhör inte Förenade kungariket, men det senare sköter dess internationella relationer. Står utanför Europeiska unionen, men är associerat via protokoll 3 till Förenade kungarikets anslutningsakt."@sv ; + skos:hiddenLabel "Гърнзи"@bg, + "Γκέρνσεϊ"@el, + "Bailía de Guernesey"@es, + "Guernesey"@es, + "anglaise"@fr, + "duine ó Gheansaí"@ga, + "Gernsio"@lt, + "il-Bailiwick ta' Guernsey"@mt, + "Bailiado de Guernesey"@pt, + "guernesiana"@pt ; + skos:historyNote "UNSD geoscheme intermediate region name for Guernsey is ‘Channel Islands’."@en ; + skos:inScheme atold:country, + ; + skos:narrower ; + skos:notation "282"^^euvoc:EP, + ".gg"^^euvoc:IANA_DOMAIN, + "GG"^^euvoc:ISG_COU, + "GG"^^euvoc:ISO_3166_1_ALPHA_2, + "GGY"^^euvoc:ISO_3166_1_ALPHA_3, + "831"^^euvoc:ISO_3166_1_NUM, + "GGY"^^euvoc:NAC, + "44"^^euvoc:PHONE_PREFIX, + "GG"^^euvoc:TED, + "GG"^^euvoc:TED_SCHEMA, + "GBG"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "831"^^euvoc:UNSD_M49 ; + skos:prefLabel "جيرنسي"@ar, + "Гернсі"@be, + "Гърнси"@bg, + "Guernsey"@bs, + "Guernsey"@ca, + "Guernsey"@cs, + "Guernsey"@da, + "Guernsey"@de, + "Γκέρνζι"@el, + "Guernsey"@en, + "Guernsey"@es, + "Guernsey"@et, + "Guernsey"@eu, + "Guernsey"@fi, + "Guernsey"@fo, + "Guernesey"@fr, + "Geansaí"@ga, + "Guernsey"@gl, + "Guernsey"@hr, + "Guernsey"@hu, + "Guernsey"@is, + "Guernsey"@it, + "ガーンジー"@ja, + "Guernsey"@lb, + "Gernsis"@lt, + "Gērnsija"@lv, + "Гернси"@mk, + "Guernsey"@mt, + "Guernsey"@nl, + "Guernsey"@no, + "Guernsey"@pl, + "Guernsey"@pt, + "Guernsey"@rm, + "Guernsey"@ro, + "Гернси"@ru, + "Guernsey"@sk, + "Guernsey"@sl, + "Guernsey"@sq, + "Гернзи"@sr, + "Guernsey"@sv, + "Guernsey"@tr, + "Гернсі"@uk, + "根西岛"@zh ; + skos:topConceptOf atold:country, + . + + a skos:Concept ; + at:authority-code "GLP" ; + at:deprecated "false" ; + at:op-code "GLP" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GP" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "GP" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "GLP" ; + dc:identifier "GLP" ; + skos:broader ; + skos:hiddenLabel "Γουαδελούπης"@el, + "ranskalainen, guadeloupelainen"@fi, + "française"@fr, + "Guadalúpach"@ga, + "Guadalupa"@hr, + "guadalupsko"@hr, + "Gvadelupos"@lt, + "Guadeloupeana"@mt, + "Guadeloupe"@sl, + "guadeloupsko"@sl ; + skos:historyNote "ISO 3166-1 Newsletter VI-1 of 21.9.2007: ‘Includes la Désirade, Marie-Galante, les Saintes’ and excludes ‘Saint-Barthélémy, northern Saint-Martin’."@en, + "Long labels have been corrected in some languages; the former English label was ‘Department of Guadeloupe’."@en, + "ISO 3166-1 Newsletter VI-1 du 21.9.2007: ‘Y compris: la Désirade, Marie-Galante, les Saintes’ et excluant ‘Saint-Barthélémy, la partie nord de Saint-Martin’."@fr ; + skos:inScheme atold:country, + , + ; + skos:notation "69"^^euvoc:EP, + ".gp"^^euvoc:IANA_DOMAIN, + "GP"^^euvoc:ISG_COU, + "GP"^^euvoc:ISO_3166_1_ALPHA_2, + "GLP"^^euvoc:ISO_3166_1_ALPHA_3, + "312"^^euvoc:ISO_3166_1_NUM, + "GLP"^^euvoc:NAC, + "FRY1"^^euvoc:NUTS, + "590"^^euvoc:PHONE_PREFIX, + "GP"^^euvoc:TED, + "GP"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "312"^^euvoc:UNSD_M49 ; + skos:prefLabel "الغوادلوب"@ar, + "Гваделупа"@bg, + "Guadalupe"@ca, + "Guadeloupe"@cs, + "Guadeloupe"@da, + "Guadeloupe"@de, + "Γουαδελούπη"@el, + "Guadeloupe"@en, + "Guadalupe"@es, + "Guadeloupe"@et, + "Guadeloupe"@fi, + "Guadeloupe"@fr, + "Guadalúip"@ga, + "Guadeloupe"@hr, + "Guadeloupe"@hu, + "Gvadelúpeyjar"@is, + "Guadalupa"@it, + "グアドループ"@ja, + "Guadeloupe"@lb, + "Gvadelupa"@lt, + "Gvadelupa"@lv, + "Guadeloupe"@mt, + "Guadeloupe"@nl, + "Guadeloupe"@no, + "Gwadelupa"@pl, + "Guadalupe"@pt, + "Guadelupa"@ro, + "Гваделупа"@ru, + "Guadeloupe"@sk, + "Gvadelup"@sl, + "Guadeloupe"@sv, + "Guadelup"@tr, + "Гваделупа"@uk, + "瓜德罗普"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "GUF" ; + at:deprecated "false" ; + at:op-code "GUF" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GF" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "GF" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "GUF" ; + dc:identifier "GUF" ; + skos:altLabel "Zámořský departement Francouzská Guyana"@cs, + "Διαμέρισμα της Γαλλικής Γουιάνας"@el, + "Departamento de Guayana Francesa"@es, + "Guajaana departemang"@et, + "Guayanan departementti"@fi, + "Dipartimento e regione della Guyana francese"@it, + "Prancūzijos Gvianos Departamentas"@lt, + "Francijas Gviānas departaments"@lv, + "Departamento da Guiana Francesa"@pt, + "Zámorský departmán Francúzskej Guyany"@sk, + "Departma Francoska Gvajana"@sl, + "Departementet och regionen Franska Guyana"@sv ; + skos:broader ; + skos:hiddenLabel "Γαλλικής Γουιάνας"@el, + "Διαμέρισμα Γαλλικής Γουιάνας"@el, + "Departement of French Guiana"@en, + "ranskalainen, ranskanguayanalainen"@fi, + "Département de Guyane Française"@fr, + "Guyane française"@fr, + "française"@fr, + "Roinn Ghuáin na Fraince"@ga, + "Francuske Gijane"@hr, + "Francijas Gviānas"@lv, + "il-Guyana Franċiża"@mt ; + skos:inScheme atold:country, + , + ; + skos:notation "64"^^euvoc:EP, + ".gf"^^euvoc:IANA_DOMAIN, + "GF"^^euvoc:ISG_COU, + "GF"^^euvoc:ISO_3166_1_ALPHA_2, + "GUF"^^euvoc:ISO_3166_1_ALPHA_3, + "254"^^euvoc:ISO_3166_1_NUM, + "GUF"^^euvoc:NAC, + "FRY3"^^euvoc:NUTS, + "594"^^euvoc:PHONE_PREFIX, + "GF"^^euvoc:TED, + "GF"^^euvoc:TED_SCHEMA, + "South America"^^euvoc:UNSD_GEOSCHEME, + "254"^^euvoc:UNSD_M49 ; + skos:prefLabel "غيانا الفرنسية"@ar, + "Френска Гвиана"@bg, + "Guaiana Francesa"@ca, + "Francouzská Guyana"@cs, + "Fransk Guyana"@da, + "Französisch-Guayana"@de, + "Γαλλική Γουιάνα"@el, + "French Guiana"@en, + "Guayana Francesa"@es, + "Prantsuse Guajaana"@et, + "Ranskan Guayana"@fi, + "Guyane"@fr, + "Guáin na Fraince"@ga, + "Francuska Gijana"@hr, + "Francia Guyana"@hu, + "Franska Gvæjana"@is, + "Guyana francese"@it, + "フランス領ギアナ"@ja, + "Franséisch-Guayana"@lb, + "Prancūzijos Gviana"@lt, + "Francijas Gviāna"@lv, + "Il-Guyana Franċiża"@mt, + "Frans-Guyana"@nl, + "Fransk Guiana"@no, + "Gujana Francuska"@pl, + "Guiana Francesa"@pt, + "Guyana Franceză"@ro, + "Французская Гвиана"@ru, + "Francúzska Guyana"@sk, + "Francoska Gvajana"@sl, + "Franska Guyana"@sv, + "Fransız Guyanası"@tr, + "Французька Гвіана"@uk, + "法属圭亚那"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "GUM" ; + at:deprecated "false" ; + at:op-code "GUM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GU" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "GU" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "GUM" ; + dc:identifier "GUM" ; + skos:altLabel "إقليم غوام"@ar, + "Territori de Guam"@ca, + "Guåhan"@ch, + "Teritorium Guam"@cs, + "Territoriet Guam"@da, + "Territorium Guam"@de, + "Έδαφος του Γκουάμ"@el, + "Territory of Guam"@en, + "Territorio de Guam"@es, + "Guami ala"@et, + "Territoire de Guam"@fr, + "Críoch Guam"@ga, + "Teritorij Guam"@hr, + "Territorio di Guam"@it, + "グアム準州"@ja, + "Territoire vu Guam"@lb, + "Guamo Teritorija"@lt, + "ASV Guamas teritorija"@lv, + "It-Territorju ta’ Guam"@mt, + "Territorium Guam"@nl, + "Terytorium Guamu"@pl, + "Território de Guam"@pt, + "Teritoriul Guam"@ro, + "Территория Гуам"@ru, + "Guamské teritórium"@sk, + "Ozemlje Gvam"@sl, + "Territoriet Guam"@sv, + "Guam Bölgesi"@tr, + "Територія Гуаму"@uk, + "关岛领土"@zh ; + skos:broader ; + skos:hiddenLabel "Guamin territorio"@fi, + "yhdysvaltalainen, guamilainen"@fi, + "cuamienne"@fr, + "Guama"@hr, + "Guam-sziget"@hu, + "guamaniano"@it, + "Guamo"@lt, + "Guamas Teritorija"@lv, + "it-Territorju ta' Guam"@mt, + "Guame"@pt, + "Território de Guame"@pt ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "74"^^euvoc:EP, + ".gu"^^euvoc:IANA_DOMAIN, + "GU"^^euvoc:ISG_COU, + "GU"^^euvoc:ISO_3166_1_ALPHA_2, + "GUM"^^euvoc:ISO_3166_1_ALPHA_3, + "316"^^euvoc:ISO_3166_1_NUM, + "GUM"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "GU"^^euvoc:TED, + "GU"^^euvoc:TED_SCHEMA, + "Micronesia"^^euvoc:UNSD_GEOSCHEME, + "316"^^euvoc:UNSD_M49 ; + skos:prefLabel "غوام"@ar, + "Гуам"@bg, + "Guam"@ca, + "Guam"@cs, + "Guam"@da, + "Guam"@de, + "Γκουάμ"@el, + "Guam"@en, + "Guam"@es, + "Guam"@et, + "Guam"@fi, + "Guam"@fr, + "Guam"@ga, + "Guam"@hr, + "Guam"@hu, + "Gvam"@is, + "Guam"@it, + "グアム"@ja, + "Guam"@lb, + "Guamas"@lt, + "Guama"@lv, + "Guam"@mt, + "Guam"@nl, + "Guam"@no, + "Guam"@pl, + "Guam"@pt, + "Guam"@ro, + "Гуам"@ru, + "Guam"@sk, + "Gvam"@sl, + "Guam"@sv, + "Guam"@tr, + "Гуам"@uk, + "关岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "HMD" ; + at:deprecated "false" ; + at:op-code "HMD" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "HM" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "HM" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "HMD" ; + dc:identifier "HMD" ; + skos:altLabel "إقليم جزر هيرد وماكدونالد"@ar, + "Territori de l’Illa Heard i les Illes McDonald"@ca, + "Teritorium Heardův ostrov a McDonaldovy ostrovy"@cs, + "Territoriet Heard Island og McDonald Islands"@da, + "HIMI"@de, + "Territorium Heard und die McDonaldinseln"@de, + "Έδαφος των Νήσων Χερντ και Μακντόναλντ"@el, + "HIMI"@en, + "Territory of Heard Island and McDonald Islands"@en, + "Territorio de las Islas Heard y McDonald"@es, + "Heardi ja McDonaldi saarte ala"@et, + "Territoire des Îles Heard et McDonald"@fr, + "Críoch Oileán Heard agus Oileáin McDonald"@ga, + "Teritorij Heardov Otok i McDonaldovi Otoci"@hr, + "Territorio delle Isole Heard e McDonald"@it, + "Territoire vun der Heardinsel an de McDonaldinselen"@lb, + "Herdo Salos ir Makdonaldo Salų Teritorija"@lt, + "Hērda salas un Makdonalda salu teritorija"@lv, + "It-Territorju tal-Gżira Heard u l-Gżejjer McDonald"@mt, + "Territorium Heardeiland en McDonaldeilanden"@nl, + "Terytorium Wysp Heard i McDonalda"@pl, + "Território das Ilhas Heard e das Ilhas McDonald"@pt, + "Teritoriul Insulei Heard şi al Insulelor McDonald"@ro, + "Территория остров Херд и острова Макдональд"@ru, + "Teritórium Heardovho ostrova a Macdonaldových ostrovov"@sk, + "Ozemlje Heardov otok in Mcdonaldovi otoki"@sl, + "Territoriet Heardön och McDonaldöarna"@sv, + "Heard Adası ve Mcdonald Adaları Bölgesi"@tr, + "Територія острова Герд і острови Макдональд"@uk, + "赫德岛和麦克唐纳群岛领土"@zh ; + skos:broader ; + skos:hiddenLabel "Heard und McDonaldinseln"@de, + "Νήσων Χερντ και Μακντόναλντ"@el, + "Heardin ja McDonaldinsaarten territorio"@fi, + "australialainen"@fi, + "Territoire des Iles Heard et Mc Donald"@fr, + "duine ó Oileán Heard agus Oileáin McDonald"@ga, + "Otoka Heard i McDonald"@hr, + "Herdo ir Makdonaldo"@lt, + "Herdo ir Makdonaldo Salų Teritorija"@lt, + "Hērda Salas un Makdonalda Salu"@lv, + "il-Gżira Heard u l-Gżejjer McDonald"@mt, + "it-Territorju tal-Gżira Heard u l-Gżejjer McDonald"@mt, + "mill-Gżira Heard u l-Gżejjer McDonald"@mt, + "Heard en McDonaldeilanden"@nl, + "Territorium Heard en McDonaldeilanden"@nl, + "van Heard en McDonaldeilanden"@nl, + "Wysp Heard i McDonalda"@pl, + "Wyspy Heard i McDonald"@pl, + "Ilha Heard e Ilhas McDonald"@pt, + "Território da Ilha Heard e das Ilhas McDonald"@pt, + "das Ilha Heard e Ilhas McDonald"@pt, + "Insula Heard și Insulele McDonald"@ro, + "Teritoriul Insulei Heard și al Insulelor McDonald"@ro, + "din Insula Heard și Insulele McDonald"@ro, + "Heardov ostrov a Macdonaldove ostrovy"@sk, + "Heardovega otoka in McDonaldovih otokov"@sl ; + skos:inScheme atold:country, + , + ; + skos:notation "77"^^euvoc:EP, + ".hm"^^euvoc:IANA_DOMAIN, + "HM"^^euvoc:ISG_COU, + "HM"^^euvoc:ISO_3166_1_ALPHA_2, + "HMD"^^euvoc:ISO_3166_1_ALPHA_3, + "334"^^euvoc:ISO_3166_1_NUM, + "HMD"^^euvoc:NAC, + "HM"^^euvoc:TED, + "HM"^^euvoc:TED_SCHEMA, + "Australia and New Zealand"^^euvoc:UNSD_GEOSCHEME, + "334"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر هيرد وماكدونالد"@ar, + "Хърд и Макдоналд"@bg, + "Illa Heard i Illes McDonald"@ca, + "Heardův ostrov a McDonaldovy ostrovy"@cs, + "Heard Island og McDonald Islands"@da, + "Heard und die McDonaldinseln"@de, + "Νήσοι Χερντ και Μακντόναλντ"@el, + "Heard Island and McDonald Islands"@en, + "Islas Heard y McDonald"@es, + "Heard ja McDonald"@et, + "Heard ja McDonaldinsaaret"@fi, + "Îles Heard et McDonald"@fr, + "Oileán Heard agus Oileáin McDonald"@ga, + "Heardov Otok i McDonaldovi Otoci"@hr, + "Heard-sziget és McDonald-szigetek"@hu, + "Heard og McDonalds-eyjar"@is, + "Isole Heard e McDonald"@it, + "ハード島とマクドナルド諸島"@ja, + "Heardinsel a McDonaldinselen"@lb, + "Herdas ir Makdonaldas"@lt, + "Hērda sala un Makdonalda salas"@lv, + "Il-Gżira Heard u l-Gżejjer McDonald"@mt, + "Heardeiland en McDonaldeilanden"@nl, + "Heard-øya og McDonald-øyene"@no, + "Wyspy Heard i McDonalda"@pl, + "Ilhas Heard e McDonald"@pt, + "Insula Heard şi Insulele McDonald"@ro, + "Остров Херд и острова Макдональд"@ru, + "Heardov ostrov"@sk, + "Heardov otok in Mcdonaldovi otoki"@sl, + "Heardön och McDonaldöarna"@sv, + "Heard Adası ve Mcdonald Adaları"@tr, + "Острів Герд і острови Макдональд"@uk, + "赫德岛和麦克唐纳群岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "IOT" ; + at:deprecated "false" ; + at:op-code "IOT" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "IO" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "IO" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "IOT" ; + dc:identifier "IOT" ; + skos:altLabel "Det Britiske Territorium i Det Indiske Ocean"@da, + "BIOT"@en, + "Território Britânico do Oceano Índico"@pt, + "Британская территория в Индийском океане"@ru ; + skos:broader ; + skos:hiddenLabel "Det britiske territorium i Det Indiske Ocean"@da, + "Βρετανικού Εδάφους Ινδικού Ωκεανού"@el, + "Βρετανικό Έδαφος Ινδικού Ωκεανού"@el, + "britannialainen"@fi, + "Territoire britannique de l'océan Indien"@fr, + "du Territoire britannique de l'océan Indien"@fr, + "Críoch Aigéan Indiach na Breataine"@ga, + "duine ó Chríoch Aigéan Indiach na Breataine"@ga, + "Britanski Indijskooceanski Teritorij"@hr, + "Britanskog Indijskooceanskog Teritorija"@hr, + "Territorio britannico dell'Oceano Indiano"@it, + "del Territorio britannico dell'Oceano Indiano"@it, + "Britu Indijas Okeāna Teritorija"@lv, + "Britu Indijas Okeāna Teritorijas"@lv, + "it-Territorju Brittaniku tal-Oċean Indjan"@mt, + "mit-Territorju Brittaniku tal-Oċean Indjan"@mt, + "Brits Indische Oceaanterritorium"@nl, + "Brytyjskiego Terytorium Oceanu Indyjskiego"@pl, + "Britanskega ozemlja v Indijskem oceanu"@sl ; + skos:inScheme atold:country, + , + ; + skos:notation "85"^^euvoc:EP, + ".io"^^euvoc:IANA_DOMAIN, + "IO"^^euvoc:ISG_COU, + "IO"^^euvoc:ISO_3166_1_ALPHA_2, + "IOT"^^euvoc:ISO_3166_1_ALPHA_3, + "086"^^euvoc:ISO_3166_1_NUM, + "IOT"^^euvoc:NAC, + "IO"^^euvoc:TED, + "IO"^^euvoc:TED_SCHEMA, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "086"^^euvoc:UNSD_M49 ; + skos:prefLabel "إقليم المحيط الهندي البريطاني"@ar, + "Британски територии в Индийския океан"@bg, + "Territori Britànic de l'Oceà Índic"@ca, + "Britské indickooceánské území"@cs, + "Britiske Territorium i Det Indiske Ocean"@da, + "Britisches Territorium im Indischen Ozean"@de, + "Βρετανικό Έδαφος του Ινδικού Ωκεανού"@el, + "British Indian Ocean Territory"@en, + "Territorio Británico del Océano Índico"@es, + "Briti India ookeani ala"@et, + "Brittiläinen Intian valtameren alue"@fi, + "Territoire britannique de l’océan Indien"@fr, + "Críoch de chuid na Ríochta Aontaithe san Aigéin Indiach"@ga, + "Britansko Indijskooceansko Područje"@hr, + "Brit Indiai-óceáni Terület"@hu, + "Bresku Indlandshafseyjar"@is, + "Territorio britannico dell’oceano Indiano"@it, + "イギリス領インド洋地域"@ja, + "Britteschen Territoire an dem Indeschen Ozean"@lb, + "Indijos Vandenyno Britų Sritis"@lt, + "Indijas okeāna Lielbritānijas teritorija"@lv, + "It-Territorju Brittaniku tal-Oċean Indjan"@mt, + "Brits gebied in de Indische Oceaan"@nl, + "Det britiske territoriet i Indiahavet"@no, + "Brytyjskie Terytorium Oceanu Indyjskiego"@pl, + "Território Britânicodo Oceano Índico"@pt, + "Teritoriul Britanic din Oceanul Indian"@ro, + "Британская Территория в Индийском Океане"@ru, + "Britské indickooceánske územie"@sk, + "Britansko ozemlje v Indijskem oceanu"@sl, + "Brittiska territoriet i Indiska oceanen"@sv, + "Britanya Hint Okyanusu Bölgesi"@tr, + "Британська Територія в Індійському Океані"@uk, + "英属印度洋领地"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "MNP" ; + at:deprecated "false" ; + at:op-code "MNP" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MP" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "MP" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "MNP" ; + dc:identifier "MNP" ; + skos:altLabel "كومنولث جزر ماريانا الشمالية"@ar, + "Общност Северни Мариански острови"@bg, + "Commonwealth de les Illes Marianes del Nord"@ca, + "Northern Mariana Islands"@cal, + "Notte Mariånas"@ch, + "Společenství Ostrovy Severní Mariany"@cs, + "Commonwealth of the Northern Mariana Islands"@da, + "Commonwealth der Nördlichen Marianen"@de, + "Κοινοπολιτεία των Βόρειων Μαριάνων Νήσων"@el, + "Commonwealth of the Northern Mariana Islands"@en, + "Commonwealth de las Islas Marianas del Norte"@es, + "Põhja-Mariaani Ühendus"@et, + "Pohjois-Mariaanien yhteisö"@fi, + "Commonwealth des Îles Mariannes du Nord"@fr, + "Comhlathas Oileáin Mháirianacha Thuaidh"@ga, + "Zajednica Sjevernomarijanskih Otoka"@hr, + "Északi-Mariana-szigetek Társult Állam"@hu, + "Samveldið Norður-Maríanaeyjar"@is, + "Territorio autonomo delle Isole Marianne settentrionali"@it, + "北マリアナ諸島自治連邦区"@ja, + "Commonwealth vun den nërdleche Marianainselen"@lb, + "Marianos Šiaurinių Salų Sandrauga"@lt, + "Ziemeļu Marianas Salu Sadraudzība"@lv, + "Il-Commonwealth tal-Gżejjer Mariana tat-Tramuntana"@mt, + "Gemenebest der Noordelijke Marianen"@nl, + "Samveldet Nord-Marianene"@no, + "Wspólnota Marianów Północnych"@pl, + "Comunidade das Ilhas Marianas do Norte"@pt, + "Comunitatea Insulelor Mariane de Nord"@ro, + "Содружество Северных Марианских Островов"@ru, + "Spoločenstvo ostrovov Severné Mariány"@sk, + "Skupnost Severni Marijanski otoki"@sl, + "Samväldet Nordmarianerna"@sv, + "Kuzey Mariana Adaları Milletler Topluluğu"@tr, + "Співдружність Північних Маріанських Островів"@uk, + "北马里亚纳群岛联邦"@zh ; + skos:broader ; + skos:hiddenLabel "Βορείων Μαριανών Νήσων"@el, + "Κοινοπολιτεία των Βορείων Μαριανών Νήσων"@el, + "Commonwealth of the Northern Marianas"@en, + "yhdysvaltalainen, pohjoismariaanilainen"@fi, + "Comhlathas na nOileán Máirianach Thuaidh"@ga, + "duine ó na hOileáin Mháirianacha Thuaidh"@ga, + "na hOileáin Mháirianacha Thuaidh"@ga, + "Sjeverni Marijanski Otoci"@hr, + "Sjevernih Marijanskih Otoka"@hr, + "Zajednica Sjevernih Marijanskih Otoka"@hr, + "delle Isole Marianne settentrionali"@it, + "Ziemeļu Marianas Salu"@lv, + "Marianiża"@mt, + "il-Commonwealth tal-Gżejjer Mariana tat-Tramuntana"@mt, + "il-Gżejjer Mariana tat-Tramuntana"@mt, + "van de Noordelijke Marianen"@nl, + "norte-marianense"@pt, + "Severné Mariány"@sk, + "Severnih Marianskih otokov"@sl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "119"^^euvoc:EP, + ".mp"^^euvoc:IANA_DOMAIN, + "MP"^^euvoc:ISG_COU, + "MP"^^euvoc:ISO_3166_1_ALPHA_2, + "MNP"^^euvoc:ISO_3166_1_ALPHA_3, + "580"^^euvoc:ISO_3166_1_NUM, + "MNP"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "MP"^^euvoc:TED, + "MP"^^euvoc:TED_SCHEMA, + "Micronesia"^^euvoc:UNSD_GEOSCHEME, + "580"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر ماريانا الشمالية"@ar, + "Северни Мариански острови"@bg, + "Illes Marianes del Nord"@ca, + "Ostrovy Severní Mariany"@cs, + "Nordmarianerne"@da, + "Nördliche Marianen"@de, + "Βόρειες Μαριάνες Νήσοι"@el, + "Northern Mariana Islands"@en, + "Islas Marianas del Norte"@es, + "Põhja-Mariaanid"@et, + "Pohjois-Mariaanit"@fi, + "Îles Mariannes du Nord"@fr, + "Na hOileáin Mháirianacha Thuaidh"@ga, + "Sjevernomarijanski Otoci"@hr, + "Északi-Mariana-szigetek"@hu, + "Norður-Maríanaeyjar"@is, + "Isole Marianne settentrionali"@it, + "北マリアナ諸島"@ja, + "Nërdlich Marianen"@lb, + "Marianos Šiaurinės Salos"@lt, + "Ziemeļu Marianas salas"@lv, + "Il-Gżejjer Mariana tat-Tramuntana"@mt, + "Noordelijke Marianen"@nl, + "Nord-Marianene"@no, + "Mariany Północne"@pl, + "Ilhas Marianas do Norte"@pt, + "Insulele Mariane de Nord"@ro, + "Северные Марианские Острова"@ru, + "Ostrovy Severné Mariány"@sk, + "Severni Marijanski otoki"@sl, + "Nordmarianerna"@sv, + "Kuzey Mariana Adaları"@tr, + "Північні Маріанські Острови"@uk, + "北马里亚纳群岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "MTQ" ; + at:deprecated "false" ; + at:op-code "MTQ" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MQ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "MQ" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "MTQ" ; + dc:identifier "MTQ" ; + skos:broader ; + skos:hiddenLabel "Διαμέρισμα Μαρτινίκας"@el, + "Μαρτινίκας"@el, + "Department of Martinique"@en, + "Martiniquen departementti"@fi, + "ranskalainen, martiniquelainen"@fi, + "Département de Martinique"@fr, + "française"@fr, + "Roinn Martinique"@ga, + "duine ó Martinique"@ga, + "Martiniquea"@hr, + "Martinikos"@lt, + "Martinikas departaments"@lv, + "departma Martinik"@sl ; + skos:inScheme atold:country, + , + ; + skos:notation "120"^^euvoc:EP, + ".mq"^^euvoc:IANA_DOMAIN, + "MQ"^^euvoc:ISG_COU, + "MQ"^^euvoc:ISO_3166_1_ALPHA_2, + "MTQ"^^euvoc:ISO_3166_1_ALPHA_3, + "474"^^euvoc:ISO_3166_1_NUM, + "MTQ"^^euvoc:NAC, + "FRY2"^^euvoc:NUTS, + "596"^^euvoc:PHONE_PREFIX, + "MQ"^^euvoc:TED, + "MQ"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "474"^^euvoc:UNSD_M49 ; + skos:prefLabel "المارتينيك"@ar, + "Мартиника"@bg, + "Martinica"@ca, + "Martinik"@cs, + "Martinique"@da, + "Martinique"@de, + "Μαρτινίκα"@el, + "Martinique"@en, + "Martinica"@es, + "Martinique"@et, + "Martinique"@fi, + "Martinique"@fr, + "Martinique"@ga, + "Martinique"@hr, + "Martinique"@hu, + "Martiník"@is, + "Martinica"@it, + "マルティニーク"@ja, + "Martinique"@lb, + "Martinika"@lt, + "Martinika"@lv, + "Martinique"@mt, + "Martinique"@nl, + "Martinique"@no, + "Martynika"@pl, + "Martinica"@pt, + "Martinica"@ro, + "Мартиника"@ru, + "Martinik"@sk, + "Martinik"@sl, + "Martinique"@sv, + "Martinik"@tr, + "Мартиніка"@uk, + "马提尼克"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "MYT" ; + at:deprecated "false" ; + at:op-code "MYT" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "YT" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "YT" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "MYT" ; + dc:identifier "MYT" ; + skos:broader ; + skos:changeNote "Wikipedia: ‘Mayotte has become an overseas department on 31 March 2011 OCT, having previously been an overseas collectivity OCT. Mayotte is due to become an overseas region OMR and part of the European Union on 1 January 2014.’"@en ; + skos:hiddenLabel "Εδαφική Κοινότητα της Μαγιότ"@el, + "Territorial Collectivity of Mayotte"@en, + "ranskalainen, mayottelainen"@fi, + "Collectivité territoriale de Mayotte"@fr, + "Comhroinn Chríochach Mayotte"@ga, + "duine ó Mayotte"@ga, + "Mayottea"@hr, + "Majoto"@lt, + "Majotas Teritoriālā Kopiena"@lv, + "Territoriale Gemeenschap Mayotte"@nl, + "Coletividade Departamental de Maiote"@pt, + "Ozemeljska skupnost Mayotte"@sl ; + skos:historyNote "Mayotte had the administrative status OCT (overseas countries and territories) until 30.3.2011 and became OMR (outermost regions) the next day."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "203"^^euvoc:EP, + ".yt"^^euvoc:IANA_DOMAIN, + "YT"^^euvoc:ISG_COU, + "YT"^^euvoc:ISO_3166_1_ALPHA_2, + "MYT"^^euvoc:ISO_3166_1_ALPHA_3, + "175"^^euvoc:ISO_3166_1_NUM, + "MYT"^^euvoc:NAC, + "FRY5"^^euvoc:NUTS, + "262"^^euvoc:PHONE_PREFIX, + "YT"^^euvoc:TED, + "YT"^^euvoc:TED_SCHEMA, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "175"^^euvoc:UNSD_M49 ; + skos:prefLabel "مايوت"@ar, + "Майот"@bg, + "Mayotte"@ca, + "Mayotte"@cs, + "Mayotte"@da, + "Mayotte"@de, + "Μαγιότ"@el, + "Mayotte"@en, + "Mayotte"@es, + "Mayotte"@et, + "Mayotte"@fi, + "Mayotte"@fr, + "Mayotte"@ga, + "Mayotte"@hr, + "Mayotte"@hu, + "Mayotte"@is, + "Mayotte"@it, + "マヨット"@ja, + "Mayotte"@lb, + "Majotas"@lt, + "Majota"@lv, + "Mayotte"@mt, + "Mayotte"@nl, + "Mayotte"@no, + "Majotta"@pl, + "Maiote"@pt, + "Mayotte"@ro, + "Майотта"@ru, + "Mayotte"@sk, + "Mayotte"@sl, + "Mayotte"@sv, + "Mayotte"@tr, + "Майотта"@uk, + "马约特"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "NFK" ; + at:deprecated "false" ; + at:op-code "NFK" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "NF" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "NF" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "NFK" ; + dc:identifier "NFK" ; + skos:altLabel "إقليم جزيرة نورفولك"@ar, + "Територия остров Норфолк"@bg, + "Territori de l’Illa Norfolk"@ca, + "Teritorium ostrova Norfolk"@cs, + "Territoriet Norfolk Island"@da, + "Territorium Norfolkinsel"@de, + "Έδαφος της Νήσου Νόρφολκ"@el, + "Territory of Norfolk Island"@en, + "Territorio de la Isla Norfolk"@es, + "Norfolki saare ala"@et, + "Territoire de l’Île Norfolk"@fr, + "Críoch Oileán Norfolk"@ga, + "Teritorij Otoka Norfolka"@hr, + "Territorio dell’Isola Norfolk"@it, + "Territoire vun den Norfolkinselen"@lb, + "Norfolko Salos Teritorija"@lt, + "Norfolkas salas teritorija"@lv, + "It-Territorju tal-Gżira Norfolk"@mt, + "Territorium Norfolkeiland"@nl, + "Norfolkøya"@no, + "Norfuk Ailen"@pih, + "Terytorium Wyspy Norfolk"@pl, + "Território da Ilha Norfolk"@pt, + "Teritoriul Insulei Norfolk"@ro, + "Территория остров Норфолк"@ru, + "Teritórium ostrova Norfolk"@sk, + "Territoriet Norfolkön"@sv, + "Norfolk Adası Bölgesi"@tr, + "Територія острова Норфолк"@uk, + "诺福克岛领土"@zh ; + skos:broader ; + skos:hiddenLabel "Остров Норфолк"@bg, + "Έδαφος της Νήσου Νόρφοκ"@el, + "Νήσος Νόρφοκ"@el, + "Νήσου Νόρφοκ"@el, + "Norfolkinsaaren territorio"@fi, + "australialainen, norfolkinsaarelainen"@fi, + "Territoire de l'Ile Norfolk"@fr, + "norfolkaise"@fr, + "duine ó Oileán Norfolk"@ga, + "Norfolk"@hr, + "Norfolka"@hr, + "Teritorij otoka Norfolka"@hr, + "Territorio dell'Isola Norfolk"@it, + "dell'Isola Norfolk"@it, + "Norfolkas Salas"@lv, + "il-Gżira Norfolk"@mt, + "it-Territorju tal-Gżira Norfolk"@mt, + "van Norfolkeiland"@nl, + "norfolkina"@pt, + "Teritórium ostrov Norfolk"@sk, + "Norfolškega otoka"@sl ; + skos:historyNote "Interinstitutionelle Regeln für Veröffentlichungen: die Norfolkinsel: Autonomes Gebiet Australiens."@de, + "Interinstitutional Style Guide: Norfolk Island: self-governing territory of Australia."@en, + "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en, + "Code de rédaction interinstitutionnel: Île Norfolk: territoire autonome de l’Australie."@fr ; + skos:inScheme atold:country, + , + ; + skos:notation "129"^^euvoc:EP, + ".nf"^^euvoc:IANA_DOMAIN, + "NF"^^euvoc:ISG_COU, + "NF"^^euvoc:ISO_3166_1_ALPHA_2, + "NFK"^^euvoc:ISO_3166_1_ALPHA_3, + "574"^^euvoc:ISO_3166_1_NUM, + "NFK"^^euvoc:NAC, + "672"^^euvoc:PHONE_PREFIX, + "NF"^^euvoc:TED, + "NF"^^euvoc:TED_SCHEMA, + "Australia and New Zealand"^^euvoc:UNSD_GEOSCHEME, + "574"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزيرة نورفولك"@ar, + "Oстров Норфолк"@bg, + "Illa Norfolk"@ca, + "Ostrov Norfolk"@cs, + "Norfolk Island"@da, + "Norfolkinsel"@de, + "Νήσος Νόρφολκ"@el, + "Norfolk Island"@en, + "Isla Norfolk"@es, + "Norfolki saar"@et, + "Norfolkinsaari"@fi, + "Île Norfolk"@fr, + "Oileán Norfolk"@ga, + "Otok Norfolk"@hr, + "Norfolk-sziget"@hu, + "Norfolkeyja"@is, + "Isola Norfolk"@it, + "ノーフォーク島"@ja, + "Norfolkinsel"@lb, + "Norfolko Sala"@lt, + "Norfolkas sala"@lv, + "Il-Gżira Norfolk"@mt, + "Norfolkeiland"@nl, + "Norfolkøyene"@no, + "Norfolk"@pl, + "Ilha Norfolk"@pt, + "Insula Norfolk"@ro, + "Остров Норфолк"@ru, + "Norfolk"@sk, + "Otok Norfolk"@sl, + "Norfolkön"@sv, + "Norfolk Adası"@tr, + "Острів Норфолк"@uk, + "诺福克岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "NIU" ; + at:deprecated "false" ; + at:op-code "NIU" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "NU" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "NIU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NU" ; + dc:source "TED" ] ; + at:start.use "1974-10-19" ; + atold:op-code "NIU" ; + dc:identifier "NIU" ; + skos:altLabel "Rock of Polynesia"@en, + "Niuē"@niu ; + skos:broader ; + skos:hiddenLabel "Niue"@fr, + "niouéenne"@fr, + "duine ó Niue"@ga, + "Niuea"@hr, + "Niujės"@lt, + "niueńskie"@pl, + "Niuê"@pt, + "niueana"@pt ; + skos:historyNote "Interinstitutional Style Guide: Niue: self-governing in free-association with New Zealand."@en, + "Niue is not a republic but its full name was listed as ‘the Republic of Niue’ for a number of years on the ISO list of country names (ISO-3166-1). In its newsletter of 14 July 2011, the ISO acknowledged that this was a mistake and the words ‘the Republic of’ were deleted from the ISO list of country names."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "137"^^euvoc:EP, + "NIU"^^euvoc:FD_010, + ".nu"^^euvoc:IANA_DOMAIN, + "NU"^^euvoc:ISG_COU, + "NU"^^euvoc:ISO_3166_1_ALPHA_2, + "NIU"^^euvoc:ISO_3166_1_ALPHA_3, + "570"^^euvoc:ISO_3166_1_NUM, + "NIU"^^euvoc:NAC, + "683"^^euvoc:PHONE_PREFIX, + "NU"^^euvoc:TED, + "NU"^^euvoc:TED_SCHEMA, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "570"^^euvoc:UNSD_M49 ; + skos:prefLabel "نيوي"@ar, + "Ниуе"@bg, + "Niue"@ca, + "Niue"@cs, + "Niue"@da, + "Niue"@de, + "Νιούε"@el, + "Niue"@en, + "Niue"@es, + "Niue"@et, + "Niue"@fi, + "Niué"@fr, + "Niue"@ga, + "Niue"@hr, + "Niue"@hu, + "Niue"@is, + "Niue"@it, + "ニウエ"@ja, + "Niue"@lb, + "Niujė"@lt, + "Niue"@lv, + "Niue"@mt, + "Niue"@nl, + "Niue"@no, + "Niue"@pl, + "Niue"@pt, + "Niue"@ro, + "Ниуэ"@ru, + "Niue"@sk, + "Niue"@sl, + "Niue"@sv, + "Niue"@tr, + "Ніуе"@uk, + "纽埃"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "PRI" ; + at:deprecated "false" ; + at:op-code "PRI" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "PR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "PR" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "PRI" ; + dc:identifier "PRI" ; + skos:altLabel "كومنولث بورتو ريكو"@ar, + "Пуерторикански съюз"@bg, + "Commonwealth de Puerto Rico"@ca, + "Portorické společenství"@cs, + "Commonwealth of Puerto Rico"@da, + "Freistaat Puerto Rico"@de, + "Κοινοπολιτεία του Πουέρτο Ρίκο"@el, + "Πόρτο Ρίκο"@el, + "Commonwealth of Puerto Rico"@en, + "Estado Libre Asociado de Puerto Rico"@es, + "Puerto Rico Ühendus"@et, + "Puerto Ricon yhteisö"@fi, + "Commonwealth de Porto Rico"@fr, + "Comhlathas Pórtó Ríce"@ga, + "Zajednica Portoriko"@hr, + "Samveldið Púertó Ríkó"@is, + "Stato libero associato di Portorico"@it, + "プエルトリコ プエルトリコ自治連邦区"@ja, + "Commonwealth vu Puerto Rico"@lb, + "Puerto Riko Sandrauga"@lt, + "Puertoriko Sadraudzība"@lv, + "Il-Commonwealth ta’ Puerto Rico"@mt, + "Gemenebest Porto Rico"@nl, + "Commonwealth of Puerto Rico"@no, + "Wspólnota Portoryka"@pl, + "Estado Livre Associado de Porto Rico"@pt, + "Comunitatea Puerto Rico"@ro, + "Содружество Пуэрто-Рико"@ru, + "Portorické spoločenstvo"@sk, + "Skupnost Portoriko"@sl, + "Samväldet Puerto Rico"@sv, + "Porto Riko Topluluğu"@tr, + "Співдружність Пуерто-Рико"@uk, + "波多黎各自由联邦"@zh ; + skos:broader ; + skos:hiddenLabel "Пеурто Рико"@bg, + "Пуерториканска общност"@bg, + "Commonwealth of the Puerto Rico"@da, + "Puerto Ricon liittovaltio"@fi, + "yhdysvaltalainen, puertoricolainen"@fi, + "Comhlathas Phórtó Ríce"@ga, + "Pórto Ríce"@ga, + "portorikansko"@hr, + "Puerto Rico Társult Állam"@hu, + "Puerto Riko"@lt, + "il-Commonwealth ta' Puerto Riko"@mt, + "Gemenebest Puerto Rico"@nl, + "Puerto Rico"@nl, + "Svobodna pridružena država Portoriko"@sl ; + skos:inScheme atold:country, + , + ; + skos:notation "147"^^euvoc:EP, + ".pr"^^euvoc:IANA_DOMAIN, + "PR"^^euvoc:ISG_COU, + "PR"^^euvoc:ISO_3166_1_ALPHA_2, + "PRI"^^euvoc:ISO_3166_1_ALPHA_3, + "630"^^euvoc:ISO_3166_1_NUM, + "PRI"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "PR"^^euvoc:TED, + "PR"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "630"^^euvoc:UNSD_M49 ; + skos:prefLabel "بورتو ريكو"@ar, + "Пуерто Рико"@bg, + "Puerto Rico"@ca, + "Portoriko"@cs, + "Puerto Rico"@da, + "Puerto Rico"@de, + "Πουέρτο Ρίκο"@el, + "Puerto Rico"@en, + "Puerto Rico"@es, + "Puerto Rico"@et, + "Puerto Rico"@fi, + "Porto Rico"@fr, + "Pórtó Ríce"@ga, + "Portoriko"@hr, + "Puerto Rico"@hu, + "Púertó Ríkó"@is, + "Portorico"@it, + "プエルトリコ"@ja, + "Puerto Rico"@lb, + "Puerto Rikas"@lt, + "Puertoriko"@lv, + "Puerto Rico"@mt, + "Porto Rico"@nl, + "Puerto Rico"@no, + "Portoryko"@pl, + "Porto Rico"@pt, + "Puerto Rico"@ro, + "Пуэрто-Рико"@ru, + "Portoriko"@sk, + "Portoriko"@sl, + "Puerto Rico"@sv, + "Porto Riko"@tr, + "Пуерто-Рико"@uk, + "波多黎各"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "REU" ; + at:deprecated "false" ; + at:op-code "REU" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "RE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "RE" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "REU" ; + dc:identifier "REU" ; + skos:altLabel "Île Bourbon"@en, + "Île Bourbon"@fr ; + skos:broader ; + skos:hiddenLabel "Διαμέρισμα της Ρεουνιόν"@el, + "Department of Réunion"@en, + "Réunionin departementti"@fi, + "ranskalainen, réunionilainen"@fi, + "Département de la Réunion"@fr, + "française"@fr, + "Roinn La Réunion"@ga, + "duine ó La Réunion"@ga, + "Réuniona"@hr, + "Reunjono"@lt, + "Reinjonas departaments"@lv, + "reunionense"@pt, + "departma Reunion"@sl ; + skos:inScheme atold:country, + , + ; + skos:notation "249"^^euvoc:EP, + ".re"^^euvoc:IANA_DOMAIN, + "RE"^^euvoc:ISG_COU, + "RE"^^euvoc:ISO_3166_1_ALPHA_2, + "REU"^^euvoc:ISO_3166_1_ALPHA_3, + "638"^^euvoc:ISO_3166_1_NUM, + "REU"^^euvoc:NAC, + "FRY4"^^euvoc:NUTS, + "262"^^euvoc:PHONE_PREFIX, + "RE"^^euvoc:TED, + "RE"^^euvoc:TED_SCHEMA, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "638"^^euvoc:UNSD_M49 ; + skos:prefLabel "ريونيون"@ar, + "Реюнион"@bg, + "Reunió"@ca, + "Réunion"@cs, + "Réunion"@da, + "Réunion"@de, + "Ρεουνιόν"@el, + "Réunion"@en, + "Reunión"@es, + "Réunion"@et, + "Réunion"@fi, + "La Réunion"@fr, + "La Réunion"@ga, + "Réunion"@hr, + "Réunion"@hu, + "Réunion"@is, + "Riunione"@it, + "レユニオン"@ja, + "Réunion"@lb, + "Reunjonas"@lt, + "Reinjona"@lv, + "Réunion"@mt, + "Réunion"@nl, + "Réunion"@no, + "Reunion"@pl, + "Reunião"@pt, + "Réunion"@ro, + "Реюньон"@ru, + "Réunion"@sk, + "Reunion"@sl, + "Réunion"@sv, + "Reunion"@tr, + "Реюньйон"@uk, + "留尼汪"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "SGS" ; + at:deprecated "false" ; + at:op-code "SGS" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GS" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "GS" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "SGS" ; + dc:identifier "SGS" ; + skos:altLabel "SGSSI"@en, + "Pietų Džordžijos ir Pietų Sandvičo Salos"@lt, + "Южная Джорджия и Южные Сандвичевы острова"@ru ; + skos:broader ; + skos:changeNote "No permanent inhabitants."@en, + "Aucun habitant permanent."@fr ; + skos:hiddenLabel "von Südgeorgien und den Südlichen Sandwichinseln"@de, + "Νότια Γεωργία και Νότιες Νήσοι Σάντουιτς"@el, + "Νότιας Γεωργίας και Νοτίων Νήσων Σάντουιτς"@el, + "Georgia del Sur e Islas Sandwich del Sur"@es, + "de Georgia del Sur e Islas Sandwich del Sur"@es, + "Lõuna-Georgia ja Lõuna-Sandwichi saarte"@et, + "britannialainen"@fi, + "Géorgie du Sud et les Îles Sandwich du Sud"@fr, + "an tSeoirsia Theas agus Oileáin Sandwich Theas"@ga, + "duine ón tSeoirsia Theas agus Oileáin Sandwich Theas"@ga, + "Južne Georgije i Južnih Sendvičkih Otoka"@hr, + "Déli-Georgia és Déli-Sandwich-szigetek"@hu, + "Isole Georgia del sud e Sandwich australi"@it, + "delle Isole Georgia del sud e Sandwich australi"@it, + "Dienviddžordžija un Dienvidsendviču Salu"@lv, + "il-Georgia tan-Nofsinhar u l-Gżejjer Sandwich tan-Nofsinhar"@mt, + "Zuid-Georgië en de Zuidelijke Sandwicheilanden"@nl, + "van Zuid-Georgië en de Zuidelijke Sandwicheilanden"@nl, + "Georgia Poludniowa Gruzja i Sandwich Południowy"@pl, + "Georgia de Sud și Insulele Sandwich de Sud"@ro, + "din Georgia de Sud și Insulele Sandwich de Sud"@ro, + "Južne Georgie in Južnih Sandwichevih otokov"@sl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "72"^^euvoc:EP, + ".gs"^^euvoc:IANA_DOMAIN, + "GS"^^euvoc:ISG_COU, + "GS"^^euvoc:ISO_3166_1_ALPHA_2, + "SGS"^^euvoc:ISO_3166_1_ALPHA_3, + "239"^^euvoc:ISO_3166_1_NUM, + "SGS"^^euvoc:NAC, + "GS"^^euvoc:TED, + "GS"^^euvoc:TED_SCHEMA, + "South America"^^euvoc:UNSD_GEOSCHEME, + "239"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر جورجيا الجنوبية وساندويتش الجنوبية"@ar, + "Южна Джорджия и Южни Сандвичеви острови"@bg, + "Geòrgia del Sud i Illes Sandwich del Sud"@ca, + "Jižní Georgie a Jižní Sandwichovy ostrovy"@cs, + "Sydgeorgien og Sydsandwichøerne"@da, + "Südgeorgien und die Südlichen Sandwichinseln"@de, + "Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς"@el, + "South Georgia and the South Sandwich Islands"@en, + "Islas Georgias del Sur y Sandwich del Sur"@es, + "Lõuna-Georgia ja Lõuna-Sandwichi saared"@et, + "Etelä-Georgia ja Eteläiset Sandwichsaaret"@fi, + "Îles Géorgie du Sud et Sandwich du Sud"@fr, + "An tSeoirsia Theas agus Oileáin Sandwich Theas"@ga, + "Južna Georgija i Južni Sendvički Otoci"@hr, + "Dél-Georgia és Déli-Sandwich-szigetek"@hu, + "Suður-Georgía og Suður-Sandvíkureyjar"@is, + "Isole Georgia del sud e Sandwich del sud"@it, + "サウスジョージア・サウスサンドウィッチ諸島"@ja, + "Südgeorgien an déi südlech Sandwichinselen"@lb, + "Pietų Džordžija ir Pietų Sandvičas"@lt, + "Dienviddžordžija un Dienvidsendviču salas"@lv, + "Il-Georgia tan-Nofsinhar u l-Gżejjer Sandwich tan-Nofsinhar"@mt, + "Zuid-Georgië en de Zuid-Sandwicheilanden"@nl, + "Sør-Georgia og Sør-Sandwichøyene"@no, + "Georgia Południowa i Sandwich Południowy"@pl, + "Ilhas Geórgia do Sul e Sandwich do Sul"@pt, + "Georgia de Sud şi Insulele Sandwich de Sud"@ro, + "Южная Джорджия и Южные Сандвичевы Острова"@ru, + "Južná Georgia a Južné Sandwichove ostrovy"@sk, + "Južna Georgija in Južni Sandwichevi otoki"@sl, + "Sydgeorgien och Sydsandwichöarna"@sv, + "Güney Georgia ve Güney Sandviç Adaları"@tr, + "Південна Джорджія та Південні Сандвічеві Острови"@uk, + "南乔治亚岛和南桑德韦奇岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "SJM" ; + at:deprecated "false" ; + at:op-code "SJM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "SJ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "SJ" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "SJM" ; + dc:identifier "SJM" ; + skos:altLabel "Свалбард"@bg ; + skos:broader ; + skos:hiddenLabel "fra Svalbard; fra Jan Mayen"@da, + "von Svalbard, von Jan Mayen"@de, + "Νήσοι Σβάλμπαρντ και Γιαν Μαγιέν"@el, + "Νήσων Σβάλμπαρντ και Γιαν Μαγιέν"@el, + "of Svalbard, of Jan Mayen"@en, + "de Svalbard, de Jan Mayen"@es, + "norjalainen, svalbardilainen, janmayenilainen"@fi, + "Svalbard et Île Jan Mayen"@fr, + "de Svalbard, de Jan Mayen"@fr, + "duine ó Svalbard agus Jan Mayen"@ga, + "Svalbarda i Jan Mayena"@hr, + "svalbardi, Jan Mayen-i"@hu, + "di Svalbard e Jan Mayen"@it, + "Svalbardo ir Jano Majeno"@lt, + "Svalbāra un Jana Majena Sala"@lv, + "Svalbāras un Jana Majena Salas"@lv, + "minn Svalbard, minn Jan Mayen"@mt, + "van Svalbard en Jan Mayen"@nl, + "swalbardzkie i Jan Mayenu"@pl, + "svalbardense; jan-mayenense"@pt, + "Svalbard și Jan Mayen"@ro, + "din Svalbard, din Jan Mayen"@ro, + "Svalbarda in Jana Mayena"@sl, + "från Svalbard, från Jan Mayen"@sv ; + skos:historyNote "Svalbard and Jan Mayen have a common ISO code but different status. Svalbard is a free economic zone and a demilitarized zone, and is not part of the Schengen Area nor the European Economic Area. Jan Mayen is part of these areas, like the rest of Norway."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "160"^^euvoc:EP, + ".sj"^^euvoc:IANA_DOMAIN, + "SJ"^^euvoc:ISG_COU, + "SJ"^^euvoc:ISO_3166_1_ALPHA_2, + "SJM"^^euvoc:ISO_3166_1_ALPHA_3, + "744"^^euvoc:ISO_3166_1_NUM, + "SJM"^^euvoc:NAC, + "47"^^euvoc:PHONE_PREFIX, + "SJ"^^euvoc:TED, + "SJ"^^euvoc:TED_SCHEMA, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "744"^^euvoc:UNSD_M49 ; + skos:prefLabel "سفالبارد وجان مايان"@ar, + "Свалбард и Ян Майен"@bg, + "Svalbard i Jan Mayen"@ca, + "Svalbard a Jan Mayen"@cs, + "Svalbard og Jan Mayen"@da, + "Svalbard und Jan Mayen"@de, + "Σβάλμπαρντ και Γιαν Μαγιέν"@el, + "Svalbard and Jan Mayen"@en, + "Svalbard y Jan Mayen"@es, + "Svalbard ja Jan Mayen"@et, + "Svalbard ja Jan Mayen"@fi, + "Svalbard et Jan Mayen"@fr, + "Svalbard agus Jan Mayen"@ga, + "Svalbard i Jan Mayen"@hr, + "Svalbard és Jan Mayen"@hu, + "Svalbarði og Jan Mayen"@is, + "Svalbard e Jan Mayen"@it, + "スヴァールバル諸島およびヤンマイエン島"@ja, + "Svalbard a Jan Mayen"@lb, + "Svalbardas ir Janas Majenas"@lt, + "Svālbara un Jana Majena Sala"@lv, + "Svalbard u Jan Mayen"@mt, + "Svalbard en Jan Mayen"@nl, + "Svalbard og Jan Mayen"@no, + "Svalbard i Jan Mayen"@pl, + "Svalbard e Jan Mayen"@pt, + "Svalbard şi Jan Mayen"@ro, + "Шпицберген и Ян Майен"@ru, + "Svalbard a Jan Mayen"@sk, + "Svalbard in Jan Mayen"@sl, + "Svalbard och Jan Mayen"@sv, + "Svalbard ve Jan Mayen"@tr, + "Свальбард і Ян-Маєн"@uk, + "斯瓦尔巴岛和扬马延岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "TKL" ; + at:deprecated "false" ; + at:op-code "TKL" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "TK" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "TK" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "TKL" ; + dc:identifier "TKL" ; + skos:altLabel "Tokelausaaret"@fi, + "Tokelauské ostrovy"@sk, + "Tokelau"@tkl ; + skos:broader ; + skos:hiddenLabel "uusiseelantilainen, tokelaulainen"@fi, + "Tokelau"@fr, + "tokélaouanne"@fr, + "Tócalá"@ga, + "duine ó Thócalá"@ga, + "Tokelaua"@hr, + "Tokelau"@mt, + "Toquelau"@pt, + "toquelauana"@pt ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "175"^^euvoc:EP, + ".tk"^^euvoc:IANA_DOMAIN, + "TK"^^euvoc:ISG_COU, + "TK"^^euvoc:ISO_3166_1_ALPHA_2, + "TKL"^^euvoc:ISO_3166_1_ALPHA_3, + "772"^^euvoc:ISO_3166_1_NUM, + "TKL"^^euvoc:NAC, + "690"^^euvoc:PHONE_PREFIX, + "TK"^^euvoc:TED, + "TK"^^euvoc:TED_SCHEMA, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "772"^^euvoc:UNSD_M49 ; + skos:prefLabel "توكيلاو"@ar, + "Токелау"@bg, + "Tokelau"@ca, + "Tokelau"@cs, + "Tokelau"@da, + "Tokelau"@de, + "Τοκελάου"@el, + "Tokelau"@en, + "Tokelau"@es, + "Tokelau"@et, + "Tokelau"@fi, + "Tokélaou"@fr, + "Tokélaou"@ga, + "Tokelau"@hr, + "Tokelau-szigetek"@hu, + "Tókelá"@is, + "Tokelau"@it, + "トケラウ"@ja, + "Tokelau"@lb, + "Tokelau"@lt, + "Tokelau"@lv, + "It-Tokelau"@mt, + "Tokelau"@nl, + "Tokelau"@no, + "Tokelau"@pl, + "Tokelau"@pt, + "Tokelau"@ro, + "Токелау"@ru, + "Tokelau"@sk, + "Tokelav"@sl, + "Tokelauöarna"@sv, + "Tokelau"@tr, + "Токелау"@uk, + "托克劳"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "TWN" ; + at:deprecated "false" ; + at:op-code "TWN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "TW" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RC" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TW" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "TW" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "RC" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RC" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "TWN" ; + dc:identifier "TWN" ; + skos:altLabel "中華民國"@chn, + "Formosa"@en, + "Formose"@fr ; + skos:hiddenLabel "Republikken Taiwan"@da, + "der Republik China"@de, + "Ταϊβάν, Δημοκρατία της Κίνας"@el, + "Taiwan, Kiinan tasavalta"@fi, + "taiwanaise"@fr, + "an Téaváin"@ga, + "an Téaváin, Poblacht na Síne"@ga, + "duine ón Téaváin"@ga, + "Tajvan, Kínai Köztársaság"@hu, + "Kinijos Respublika, Taivanas"@lt, + "Taivano"@lt, + "Taivāna, Ķīnas Republika"@lv, + "Taivānas"@lv, + "ir-Repubblika taċ-Ċina, it-Tajwan"@mt, + "it-Tajwan"@mt, + "Taiwanese"@nl, + "Taiwan, Čínska republika"@sk ; + skos:inScheme atold:country, + , + ; + skos:notation "181"^^euvoc:EP, + "RC"^^euvoc:FD_010, + "RC"^^euvoc:FD_140, + "TW"^^euvoc:FD_140, + "RC"^^euvoc:FD_400, + ".tw"^^euvoc:IANA_DOMAIN, + "TW"^^euvoc:ISG_COU, + "TW"^^euvoc:ISO_3166_1_ALPHA_2, + "TWN"^^euvoc:ISO_3166_1_ALPHA_3, + "158"^^euvoc:ISO_3166_1_NUM, + "TWN"^^euvoc:NAC, + "886"^^euvoc:PHONE_PREFIX, + "TW"^^euvoc:TED, + "TW"^^euvoc:TED_SCHEMA, + "Eastern Asia"^^euvoc:UNSD_GEOSCHEME ; + skos:prefLabel "تايوان"@ar, + "Тайван"@bg, + "Taiwan"@ca, + "Tchaj-wan"@cs, + "Taiwan"@da, + "Taiwan"@de, + "Ταϊβάν"@el, + "Taiwan"@en, + "Taiwán"@es, + "Taiwan"@et, + "Taiwan"@fi, + "Taïwan"@fr, + "An Téaváin"@ga, + "Tajvan"@hr, + "Tajvan"@hu, + "Taívan"@is, + "Taiwan"@it, + "台湾"@ja, + "Taiwan"@lb, + "Taivanas"@lt, + "Taivāna"@lv, + "It-Tajwan"@mt, + "Taiwan"@nl, + "Taiwan"@no, + "Tajwan"@pl, + "Taiwan"@pt, + "Taiwan"@ro, + "Тайвань"@ru, + "Taiwan"@sk, + "Tajvan"@sl, + "Taiwan"@sv, + "Tayvan"@tr, + "Тайвань"@uk, + "台湾"@zh ; + skos:topConceptOf atold:country, + , + . + + a skos:Concept ; + at:authority-code "UMI" ; + at:deprecated "false" ; + at:op-code "UMI" ; + at:start.use "1950-05-09" ; + atold:op-code "UMI" ; + dc:identifier "UMI" ; + skos:altLabel "De Forenede Staters Mindre Øbesiddelser"@da, + "US Minor Outlying Islands"@en, + "Ühendriikide väikesed hajasaared"@et, + "Jungtinių Valstijų Mažosios Tolimosios Salos"@lt ; + skos:broader ; + skos:hiddenLabel "Menší odlehlé ostrovy Spojených států amerických"@cs, + "De Forenede Staters Mindre Øbesiddelser"@da, + "USA's mindre øbesiddelser"@da, + "Kleinere Amerikanische Überseeinseln"@de, + "Απομακρυσμένων Νησίδων των Ηνωμένων Πολιτειών"@el, + "yhdysvaltalainen"@fi, + "Îles mineures éloignées des Etats-Unis"@fr, + "duine ó Oileáin Bheaga Fhorimeallacha na Stát Aontaithe"@ga, + "Malih udaljenih otoka SAD-a"@hr, + "Amerikai Egyesült Államok Külső Szigetei"@hu, + "amerikai egyesült államok külső szigeteibeli"@hu, + "Mažosios Tolimosios Salos (JAV)"@lt, + "Mažųjų Tolimųjų Salų (JAV)"@lt, + "il-Gżejjer Minuri Mbiegħda tal-Istati Uniti"@mt, + "mill-Gżejjer Minuri Mbiegħda tal-Istati Uniti"@mt, + "Powiernicze Wyspy Pacyfiku Stanów Zjednoczonych"@pl, + "Ilhas Menores Afastadas dos Estados Unidos"@pt, + "Menšie odľahlé ostrovy USA"@sk, + "Stranski zunanji otoki ZDA"@sl, + "Stranski zunanji otoki Združenih držav Amerike"@sl, + "Stranskih zunanjih otokov ZDA"@sl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en, + "Wikipedia and ISO 3166-1: Territories of US. Statistical designation defined by the International Organization for Standardization’s ISO 3166-1 code, consists of eight United States insular areas in the Pacific Ocean: Baker Island FQ, Howland Island HQ, Jarvis Island DQ, Johnston Atoll JQ, Kingman Reef KQ, Midway Islands MQ, Palmyra Atoll LQ and Wake Island WQ; and one in the Caribbean Sea: Navassa Island BQ."@en, + "Wikipedia et ISO 3166-1: Territoires des USA. Désignation statistique définie par l’ISO 3166-1, consistant en 8 îles et atolls des États-Unis situés dans l’océan Pacifique: l’île Baker FQ, l’île Howland HQ, l’île Jarvis DQ, l’atoll Johnston JQ, le récif Kingman KQ, les îles Midway MQ, l’atoll Palmyra LQ et l’île Wake WQ; ainsi qu’une île dans la mer des Caraïbes: l’île de la Navasse BQ."@fr ; + skos:inScheme atold:country, + , + ; + skos:notation "185"^^euvoc:EP, + ".um"^^euvoc:IANA_DOMAIN, + "UM"^^euvoc:ISG_COU, + "UM"^^euvoc:ISO_3166_1_ALPHA_2, + "UMI"^^euvoc:ISO_3166_1_ALPHA_3, + "581"^^euvoc:ISO_3166_1_NUM, + "UMI"^^euvoc:NAC, + "Micronesia"^^euvoc:UNSD_GEOSCHEME, + "581"^^euvoc:UNSD_M49 ; + skos:prefLabel "الولايات المتحدة الجزر الصغيرة النائية"@ar, + "Малки отдалечени острови на Съединените щати"@bg, + "Illes d’Ultramar Menors dels Estats Units"@ca, + "Menší odlehlé ostrovy USA"@cs, + "USA’s Mindre Øbesiddelser"@da, + "Kleinere Amerikanischen Überseeinseln"@de, + "Απομακρυσμένες Νησίδες των Ηνωμένων Πολιτειών"@el, + "United States Minor Outlying Islands"@en, + "Islas menores alejadas de los Estados Unidos"@es, + "Ühendriikide hajasaared"@et, + "Yhdysvaltain pienet erillissaaret"@fi, + "Îles mineures éloignées des États-Unis"@fr, + "Oileáin Bheaga Fhorimeallacha na Stát Aontaithe"@ga, + "Mali udaljeni otoci SAD-a"@hr, + "Az Amerikai Egyesült Államok Külső Szigetei"@hu, + "Smáeyjar Bandaríkjanna"@is, + "Isole minori periferiche degli Stati Uniti"@it, + "合衆国領有小離島"@ja, + "Klenger ofgeleeën Insele vun de Vereenegte Staaten"@lb, + "Mažosios Tolimosios Salos"@lt, + "ASV Mazās Aizjūras Salas"@lv, + "Il-Gżejjer Minuri Mbiegħda tal-Istati Uniti"@mt, + "Verafgelegen eilandjes van de Verenigde Staten"@nl, + "USAs ytre øyer"@no, + "Małe Oddalone Wyspy Stanów Zjednoczonych"@pl, + "Ilhas Menores Distantes dos Estados Unidos"@pt, + "Insulele Minore Îndepărtate ale Statelor Unite"@ro, + "Малые Тихоокеанские Отдалённые острова Соединённых Штатов"@ru, + "Menšie odľahlé ostrovy Spojených štátov"@sk, + "Ameriški manjši zunanji otoki"@sl, + "Förenta staternas mindre öar"@sv, + "Amerika Birleşik Devletleri Küçük Dış Adaları"@tr, + "Зовнішні малі острови США"@uk, + "美国本土外小岛屿"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "VAT" ; + at:deprecated "false" ; + at:op-code "VAT" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "VA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "V" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "V" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "VA" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "VAT" ; + dc:identifier "VAT" ; + skos:altLabel "Stato della Città del Vaticano"@it, + "Status Civitatis Vaticanae"@la ; + skos:hiddenLabel "دولة مدينة الفاتيكان"@ar, + "Ватыкан"@be, + "Град-държава Ватикан"@bg, + "Светия престол/град държава Ватикан"@bg, + "Vatikan"@bs, + "Ciutat del Vaticà"@ca, + "Svatý stolec / Vatikánský městský stát"@cs, + "Vatikánský městský stát"@cs, + "Den Hellige Stol (Vatikanstaten)"@da, + "Vatikanstaten"@da, + "fra Den Hellige Stol, vatikansk"@da, + "Heiliger Stuhl (Staat Vatikanstadt)"@de, + "Heiliger Stuhl (Vatikanstadt)"@de, + "Vatikanstadt"@de, + "des Heiligen Stuhls / vatikanisch"@de, + "Αγία Έδρα (Βατικανό)"@el, + "Αγίας Έδρας (Βατικανού)"@el, + "Κράτος της Πόλης του Βατικανού"@el, + "Πόλη του Βατικανού"@el, + "Holy See (Vatican City State)"@en, + "Holy See (Vatican)"@en, + "Vatican City State"@en, + "of the Holy See/of the Vatican"@en, + "Estado de la Ciudad del Vaticano"@es, + "Vatikani Linnriik"@et, + "Vatikano Hiria"@eu, + "Pyhä istuin (Vatikaanivaltio)"@fi, + "Vatikaani"@fi, + "Vatikaanivaltio"@fi, + "Vatikanið"@fo, + "Saint-Siège (Vatican)"@fr, + "Saint-Siège (État de la Cité du Vatican )"@fr, + "État de la Cité du Vatican"@fr, + "Stát Chathair na Vatacáine"@ga, + "an Suí Naofa/Cathair na Vatacáine"@ga, + "duine ón Suí Naofa/ó Chathair na Vatacáine"@ga, + "Cidade do Vaticano"@gl, + "Država Vatikanskoga Grada"@hr, + "Sveta Stolica (Država Vatikanskoga Grada)"@hr, + "Svete Stolice (Država Vatikanskoga Grada)"@hr, + "Apostoli Szentszék (Vatikán)"@hu, + "Apostoli Szentszék (Vatikánvárosi Állam)"@hu, + "Vatikánváros Állam"@hu, + "apostoli szentszéki, vatikáni"@hu, + "Vatíkanborgríkið"@is, + "Santa Sede (Stato della Città del Vaticano)"@it, + "Stato della Città del Vaticano"@it, + "della Santa Sede/dello Stato della Città del Vaticano"@it, + "バチカン市国"@ja, + "Vatikanstad"@lb, + "Vatikano Miesto Valstybė"@lt, + "Šventasis Sostas / Vatikanas"@lt, + "Šventasis Sostas / Vatikano Miesto Valstybė"@lt, + "Svētais Krēsls (Vatikāna Pilsētvalsts)"@lv, + "Vatikāna Pilsētvalsts"@lv, + "Vatikāns"@lv, + "Ватикански Град"@mk, + "L-Istat tal-Belt tal-Vatikan"@mt, + "is-Santa Sede / l-Istat tal-Belt tal-Vatikan"@mt, + "mis-Santa Sede / mill-Istat tal-Belt tal-Vatikan"@mt, + "De Heilige Stoel (Vaticaanstad)"@nl, + "Staat Vaticaanstad"@nl, + "Vaticaanstad"@nl, + "van Vaticaanstad"@nl, + "Vatikanstaten"@no, + "Państwo Watykańskie"@pl, + "Watykan"@pl, + "Estado da Cidade do Vaticano"@pt, + "Santa Sé / Estado da Cidade do Vaticano"@pt, + "da Santa Sé / do Estado da Cidade do Vaticano"@pt, + "Vatican"@rm, + "Sfântul Scaun - Vatican"@ro, + "Statul Cetății Vaticanului"@ro, + "Государство-город Ватикан"@ru, + "Svätá stolica (Vatikánsky mestský štát)"@sk, + "Vatikán"@sk, + "Vatikánsky mestský štát"@sk, + "Sveti sedež (Vatikan)"@sl, + "Sveti sedež (Vatikanska mestna država)"@sl, + "Vatikanska mestna država"@sl, + "Qyteti i Vatikanit"@sq, + "Ватикан"@sr, + "Heliga stolen (Vatikanstaten)"@sv, + "Vatikanstaten"@sv, + "från Heliga stolen/vatikansk"@sv, + "Держава-Місто Ватикан"@uk, + "梵蒂冈城"@zh ; + skos:inScheme atold:country, + , + ; + skos:notation "189"^^euvoc:EP, + "V"^^euvoc:FD_010, + "V"^^euvoc:FD_050, + ".va"^^euvoc:IANA_DOMAIN, + "VA"^^euvoc:IBAN_COU, + "VA"^^euvoc:ISG_COU, + "VA"^^euvoc:ISO_3166_1_ALPHA_2, + "VAT"^^euvoc:ISO_3166_1_ALPHA_3, + "336"^^euvoc:ISO_3166_1_NUM, + "VAT"^^euvoc:NAC, + "379"^^euvoc:PHONE_PREFIX, + "39"^^euvoc:PHONE_PREFIX, + "VA"^^euvoc:TED, + "VA"^^euvoc:TED_SCHEMA, + "V"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "336"^^euvoc:UNSD_M49 ; + skos:prefLabel "الكرسي البابوي (الرسولي - الفاتيكان)"@ar, + "Святы Прастол"@be, + "Светия престол"@bg, + "Svete Stolice"@bs, + "Santa Seu"@ca, + "Svatý stolec"@cs, + "Den Hellige Stol"@da, + "Heiliger Stuhl"@de, + "Αγία Έδρα"@el, + "Holy See"@en, + "Santa Sede"@es, + "Püha Tool"@et, + "Aulki Santu"@eu, + "Pyhä istuin"@fi, + "Vatikanríkið"@fo, + "Saint-Siège"@fr, + "An Suí Naofa"@ga, + "Santa Sé"@gl, + "Sveta Stolica"@hr, + "Apostoli Szentszék"@hu, + "Páfastóll"@is, + "Santa Sede"@it, + "教皇聖座"@ja, + "Hellege Stull"@lb, + "Šventasis Sostas"@lt, + "Svētais Krēsls"@lv, + "Света Столица"@mk, + "Is-Santa Sede"@mt, + "Heilige Stoel"@nl, + "Den hellige stol"@no, + "Stolicą Apostolską"@pl, + "Santa Sé"@pt, + "Sontga Sedia"@rm, + "Sfântul Scaun"@ro, + "Папский Престол"@ru, + "Svätá stolica"@sk, + "Sveti sedež"@sl, + "Selisë së Shenjtë"@sq, + "Света Столица"@sr, + "Heliga stolen"@sv, + "Vatikan"@tr, + "Святий Престол"@uk, + "聖座"@zh ; + skos:scopeNote "The Holy See and the Vatican City State are separate subjects of international law (for more information, see the following website: http://www.vatican.va/news_services/press/documentazione/documents/corpo-diplomatico_index_en.html). It is the Holy See, and not the Vatican City State, which is accredited to the European Union et al."@en ; + skos:topConceptOf atold:country, + , + . + + a skos:Concept ; + at:authority-code "VIR" ; + at:deprecated "false" ; + at:op-code "VIR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "VI" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "VI" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "VIR" ; + dc:identifier "VIR" ; + skos:altLabel "جزر فرجن التابعة للولايات المتحدة"@ar, + "Illes Verges dels Estats Units"@ca, + "De Amerikanske Jomfruøer"@da, + "Παρθένες Νήσοι των Ηνωμένων Πολιτειών"@el, + "Virgin Islands of the United States"@en, + "Islas Vírgenes de los Estados Unidos de América"@es, + "Ühendriikide Neitsisaared"@et, + "Îles Vierges des États-Unis"@fr, + "Isole Vergini degli Stati Uniti"@it, + "Joffereninsele vun de Vereenegte Staaten"@lb, + "Jungtinių Valstijų Mergelių Salos"@lt, + "ASV Virdžīnu salas"@lv, + "Insulele Virgine ale Statelor Unite"@ro, + "Виргинские острова Соединённых Штатов"@ru, + "Panenské ostrovy Spojených štátov"@sk, + "Deviški otoki Združenih držav"@sl, + "Amerika Birleşik Devletleri Virjin Adaları"@tr ; + skos:broader ; + skos:hiddenLabel "Παρθένοι Νήσοι των Ηνωμένων Πολιτειών"@el, + "Παρθένων Νήσων των Ηνωμένων Πολιτειών"@el, + "United States Virgin Islands"@en, + "yhdysvaltalainen, yhdysvaltainneitsytsaarelainen"@fi, + "Oileáin Mhaighdean na Stát Aontaithe"@ga, + "Oileáin Mheiriceánacha na Maighdean"@ga, + "duine ó Oileáin Mheiriceánacha na Maighdean"@ga, + "Američkih Djevičanskih Otoka"@hr, + "Mergelių Salos (JAV)"@lt, + "Mergelių Salų (JAV)"@lt, + "il-Gżejjer Verġni Amerikani"@mt, + "mill-Gżejjer Verġni Amerikani"@mt, + "Wysp Dziewiczych Stanów Zjednoczonych"@pl, + "Ilhas Virgens Americanas"@pt, + "Ilhas Virgens dos Estados Unidos"@pt, + "Ameriških Deviških otokov"@sl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "193"^^euvoc:EP, + ".vi"^^euvoc:IANA_DOMAIN, + "VI"^^euvoc:ISG_COU, + "VI"^^euvoc:ISO_3166_1_ALPHA_2, + "VIR"^^euvoc:ISO_3166_1_ALPHA_3, + "850"^^euvoc:ISO_3166_1_NUM, + "VIR"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "VI"^^euvoc:TED, + "VI"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "850"^^euvoc:UNSD_M49 ; + skos:prefLabel "الجزر العذراء الأمريكية (جزر فيرجن الأمريكية)"@ar, + "Американски Вирджински острови"@bg, + "Illes Verges Nord-americanes"@ca, + "Americké Panenské ostrovy"@cs, + "Amerikanske Jomfruøer"@da, + "Amerikanische Jungferninseln"@de, + "Αμερικανικές Παρθένες Νήσοι"@el, + "US Virgin Islands"@en, + "Islas Vírgenes de los Estados Unidos"@es, + "USA Neitsisaared"@et, + "Yhdysvaltain Neitsytsaaret"@fi, + "Îles Vierges américaines"@fr, + "Ógh-Oileáin na Stát Aontaithe"@ga, + "Američki Djevičanski Otoci"@hr, + "Amerikai Virgin-szigetek"@hu, + "Bandarísku Jómfrúareyjar"@is, + "Isole Vergini americane"@it, + "アメリカ領ヴァージン諸島"@ja, + "Amerikanesch Joffereninselen"@lb, + "Mergelių Salos"@lt, + "ASV Virdžīnas"@lv, + "Il-Gżejjer Verġni tal-Istati Uniti"@mt, + "Amerikaanse Maagdeneilanden"@nl, + "De amerikanske Jomfruøyer"@no, + "Wyspy Dziewicze Stanów Zjednoczonych"@pl, + "Ilhas Virgens"@pt, + "Insulele Virgine Americane"@ro, + "Виргинские острова США"@ru, + "Americké Panenské ostrovy"@sk, + "Ameriški Deviški otoki"@sl, + "Amerikanska Jungfruöarna"@sv, + "Birleşik Devletler Virjin Adaları"@tr, + "Американські Віргінські Острови"@uk, + "美属维尔京群岛"@zh ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XEU" ; + at:deprecated "false" ; + at:op-code "XEU" ; + at:start.use "1989-01-01" ; + atold:op-code "XEU" ; + dc:identifier "XEU" ; + skos:broader ; + skos:definition "waters under the sovereignty or jurisdiction of the Member States of the European Union with the exception of waters adjacent to the territories mentioned in Annex II to the Treaty"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XEU"^^euvoc:NAC ; + skos:prefLabel "Води на ЕС"@bg, + "Vody EU"@cs, + "EU-farvande"@da, + "EU-Gewässer"@de, + "Ύδατα της ΕΕ"@el, + "EU Waters"@en, + "Aguas de la UE"@es, + "Eli veed"@et, + "EU:n vedet"@fi, + "Eaux UE"@fr, + "Vode EU-a"@hr, + "Uniós vizek"@hu, + "Acque UE"@it, + "ES vandenys"@lt, + "ES ūdeņi"@lv, + "Ilmijiet tal-UE"@mt, + "EU-wateren"@nl, + "Wody UE"@pl, + "Águas da UE"@pt, + "Ape ale UE"@ro, + "Vody EÚ"@sk, + "Vode EU"@sl, + "EU-vatten"@sv ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XHS" ; + at:deprecated "false" ; + at:op-code "XHS" ; + at:start.use "1982-12-10" ; + atold:op-code "XHS" ; + dc:identifier "XHS" ; + skos:broader ; + skos:definition "high seas, in maritime law, all parts of the mass of saltwater surrounding the globe that are not part of the territorial sea or internal waters of a state"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XHS"^^euvoc:NAC ; + skos:prefLabel "Открито море"@bg, + "Volné moře"@cs, + "Åbent hav"@da, + "Hohe see"@de, + "Ανοικτή θάλασσα"@el, + "High seas"@en, + "Alta mar"@es, + "Avameri"@et, + "Aava meri"@fi, + "Haute mer"@fr, + "Mórmhuir"@ga, + "Otvoreno more"@hr, + "Nyílt tenger"@hu, + "Alto mare"@it, + "Atviroji jūra"@lt, + "Atklātā jūra"@lv, + "Ibħra internazzjonali"@mt, + "Volle zee"@nl, + "Morze pełne"@pl, + "Alto-mar"@pt, + "Mare liberă"@ro, + "Šíre more"@sk, + "Odprto morje"@sl, + "Fritt hav"@sv ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XIN" ; + at:deprecated "false" ; + at:op-code "XIN" ; + at:start.use "1982-12-10" ; + atold:op-code "XIN" ; + dc:identifier "XIN" ; + skos:broader ; + skos:definition "areas outside exclusive economic zones; international waters (high seas) do not belong to any state’s jurisdiction, known under the doctrine of ‘mare liberum’. States have the right to fishing, navigation, overflight, laying cables and pipelines, as well as scientific research"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XIN"^^euvoc:NAC ; + skos:prefLabel "Международни води"@bg, + "Mezinárodní vody"@cs, + "Internationale farvande"@da, + "Internationale Gewässer"@de, + "Διεθνή ύδατα"@el, + "International Waters"@en, + "Aguas internacionales"@es, + "Rahvusvahelised veed"@et, + "Kansainväliset vedet"@fi, + "Eaux internationales"@fr, + "Uiscí idirnáisiúnta"@ga, + "Međunarodne vode"@hr, + "Nemzetközi vizek"@hu, + "Acque internazionali"@it, + "Tarptautiniai vandenys"@lt, + "Starptautiskie ūdeņi"@lv, + "Ilmijiet internazzjonali"@mt, + "Internationale wateren"@nl, + "Wody międzynarodowe"@pl, + "Águas internacionais"@pt, + "Ape internaționale"@ro, + "Medzinárodné vody"@sk, + "Mednarodne vode"@sl, + "Internationella vatten"@sv ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XJL" ; + at:deprecated "false" ; + at:op-code "XJL" ; + at:start.use "1967-06-04" ; + atold:op-code "XJL" ; + dc:identifier "XJL" ; + skos:broader ; + skos:definition "area designated as no man’s land (Latrun area) in the framework of the 4 June 1967 lines"@en ; + skos:inScheme , + ; + skos:notation "XJL"^^euvoc:NAC ; + skos:prefLabel "Latrun no man’s land"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XJM" ; + at:deprecated "false" ; + at:op-code "XJM" ; + at:start.use "1980-05-29" ; + atold:op-code "XJM" ; + dc:identifier "XJM" ; + skos:broader ; + skos:definition "fisheries zone in the marine areas of Jan Mayen; where the fisheries zone does not overlap economic zones of Greenland or Iceland, its outer limits are 200 nautical miles running parallel to the baselines which have been fixed for Jan Mayen"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XJM"^^euvoc:NAC ; + skos:prefLabel "Fisheries zone around Jan Mayen"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XKX" ; + at:deprecated "false" ; + at:op-code "XKX" ; + at:start.use "2008-02-17" ; + atold:op-code "XKX" ; + dc:identifier "XKX" ; + skos:altLabel "Косово"@bg, + "Kosovo"@cs, + "Kosovo"@da, + "Kosovo"@de, + "Κόσοβο"@el, + "Kosovo"@en, + "Kosovo"@es, + "Kosovo"@et, + "Kosovo"@fi, + "Kosovo"@fr, + "An Chosaiv"@ga, + "Kosovo"@hr, + "Koszovó"@hu, + "Kosovo"@it, + "Kosovas"@lt, + "Kosova"@lv, + "Il-Kosovo"@mt, + "Kosovo"@nl, + "Kosowo"@pl, + "Kosovo"@pt, + "Kosovo"@ro, + "Kosovo"@sk, + "Kosovo"@sl, + "Kosova"@sq, + "Косово"@sr, + "Kosovo"@sv ; + skos:hiddenLabel "Косово (съгласно Резолюция 1244/1999 на Съвета за сигурност на ООН) Косово"@bg, + "Kosovo (som defineret ved De Forenede Nationers Sikkerhedsråds resolution 1244)"@da, + "Kosovo (aufgrund der Resolution 1244/99 des VN-Sicherheitsrats)"@de, + "Κοσσυφοπέδιο"@el, + "Κοσσυφοπέδιο (όπως ορίζεται στην απόφαση 1244 του ΣΑ των ΗΕ )"@el, + "Κοσσυφοπεδίου"@el, + "Kosovo (under UNSCR 1244/99)"@en, + "Kosovo/Kósovo"@es, + "Kosovon tasavalta"@fi, + "Kosovo (en vertu de la résolution 1244/99 du CSNU)"@fr, + "Kosovo (u skladu s Rezolucijom Vijeća sigurnosti UN-a 1244/99)"@hr, + "(az ENSZ BT 1244. határozatában foglaltak szerinti) Koszovó"@hu, + "Kosovo"@lt, + "Kosova (saskaņā ar UNSCR 1244/99)"@lv, + "Kosovo"@mt, + "Kosovo (op grond van resolutie 1244/99 van de VN-Veiligheidsraad)"@nl, + "Republika Kosowa"@pl, + "kosovar"@pt, + "din Kosovo"@ro, + "Kosovo (po resoluciji VS OZN 1244/99)"@sl, + "Republiken Kosovo"@sv ; + skos:historyNote "Guidance of the Secretary-General of the European Commission of 14.3.2012 about Kosovo denomination in European Commission documents and events: ‘This designation is without prejudice to positions on status, and is in line with UNSCR 1244/1999 and the ICJ Opinion on the Kosovo declaration of independence.’ UNSCR = United Nations Security Council Resolution, ICJ = International Court of Justice."@en, + "The user-assigned codes XK and XKX are being used by different organisations as temporary country codes for Kosovo which does not have an officially assigned ISO code yet."@en ; + skos:inScheme atold:country, + , + ; + skos:notation "293"^^euvoc:EP, + "1A0"^^euvoc:FD_010, + "KOSOVO"^^euvoc:FD_050, + "XK"^^euvoc:IBAN_COU, + "XKX"^^euvoc:NAC, + "1A"^^euvoc:TED, + "1A"^^euvoc:TED_SCHEMA ; + skos:prefLabel "*كوسوفو"@ar, + "Косово*"@bg, + "Kosovo*"@ca, + "Kosovo*"@cs, + "Kosovo*"@da, + "Kosovo*"@de, + "Κόσοβο*"@el, + "Kosovo*"@en, + "Kosovo*"@es, + "Kosovo*"@et, + "Kosovo*"@fi, + "Kosovo*"@fr, + "An Chosaiv*"@ga, + "Kosovo*"@hr, + "Koszovó*"@hu, + "Kósovó*"@is, + "Kosovo*"@it, + "コソボ*"@ja, + "Kosovo*"@lb, + "Kosovas*"@lt, + "Kosova*"@lv, + "Il-Kosovo*"@mt, + "Kosovo*"@nl, + "Kosovo*"@no, + "Kosowo*"@pl, + "Kosovo*"@pt, + "Kosovo*"@ro, + "Косово*"@ru, + "Kosovo*"@sk, + "Kosovo*"@sl, + "Kosovo*"@sv, + "Kosova*"@tr, + "Косово*"@uk, + "科索沃*"@zh ; + skos:topConceptOf atold:country, + , + . + + a skos:Concept ; + at:authority-code "XME" ; + at:deprecated "false" ; + at:op-code "XME" ; + at:start.use "2022-12-09" ; + atold:op-code "XME" ; + dc:identifier "XME" ; + skos:broader ; + skos:definition "subregion of Oceania in the southwestern Pacific Ocean; the region includes the four independent countries of Fiji, Vanuatu, the Solomon Islands, and Papua New Guinea; it also includes parts of Indonesia – notably the provinces of Papua and West Papua as well as Maluku and the French oversea collectivity of New Caledonia"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XME"^^euvoc:NAC ; + skos:prefLabel "Melanesia"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XQP" ; + at:deprecated "false" ; + at:op-code "XQP" ; + at:start.use "2022-12-09" ; + atold:op-code "XQP" ; + dc:identifier "XQP" ; + skos:broader ; + skos:definition "maritime area under a joint regime between Colombia and Jamaica"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XQP"^^euvoc:NAC ; + skos:prefLabel "Colombia/Jamaica (joint regime)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XQR" ; + at:deprecated "false" ; + at:op-code "XQR" ; + at:start.use "2022-12-09" ; + atold:op-code "XQR" ; + dc:identifier "XQR" ; + skos:broader ; + skos:definition "maritime region under a joint regime"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XQR"^^euvoc:NAC ; + skos:prefLabel "Japan/South Korea (joint regime)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XSG" ; + at:deprecated "false" ; + at:op-code "XSG" ; + at:start.use "1989-01-01" ; + atold:op-code "XSG" ; + dc:identifier "XSG" ; + skos:broader ; + skos:inScheme atold:country, + , + ; + skos:notation "XSG"^^euvoc:NAC ; + skos:prefLabel "Joint area between Senegal and Guinea-Bissau"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XSV" ; + at:deprecated "false" ; + at:op-code "XSV" ; + at:start.use "1977-06-03" ; + atold:op-code "XSV" ; + dc:identifier "XSV" ; + skos:broader ; + skos:definition "zone of 200 nautical miles around Svalbard in order to protect the living marine resources in the ocean and to regulate fishing sustainably"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XSV"^^euvoc:NAC ; + skos:prefLabel "Fisheries Protection Zone around Svalbard"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XXC" ; + at:deprecated "false" ; + at:op-code "XXC" ; + at:start.use "2022-12-09" ; + atold:op-code "XXC" ; + dc:identifier "XXC" ; + skos:broader ; + skos:definition "disputed territory between India and China in the eastern most part of the Kashmir region"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXC"^^euvoc:NAC ; + skos:prefLabel "Aksai Chin (disputed territory)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XXD" ; + at:deprecated "false" ; + at:op-code "XXD" ; + at:start.use "2022-12-09" ; + atold:op-code "XXD" ; + dc:identifier "XXD" ; + skos:broader ; + skos:definition "disputed territory between India and China"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXD"^^euvoc:NAC ; + skos:prefLabel "Arunachal Pradesh (disputed territory)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XXE" ; + at:deprecated "false" ; + at:op-code "XXE" ; + at:start.use "2022-12-09" ; + atold:op-code "XXE" ; + dc:identifier "XXE" ; + skos:broader ; + skos:definition "disputed territory between China and India which covers a number of disputed regions between Askai Chin and Nepal"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXE"^^euvoc:NAC ; + skos:prefLabel "China/India (disputed territory)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XXF" ; + at:deprecated "false" ; + at:op-code "XXF" ; + at:start.use "2022-12-09" ; + atold:op-code "XXF" ; + dc:identifier "XXF" ; + skos:broader ; + skos:definition "disputed territory between Egypt and Sudan"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXF"^^euvoc:NAC ; + skos:prefLabel "Hala’ib Triangle (disputed territory)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XXG" ; + at:deprecated "false" ; + at:op-code "XXG" ; + at:start.use "2022-12-09" ; + atold:op-code "XXG" ; + dc:identifier "XXG" ; + skos:broader ; + skos:definition "disputed territory between Kenia and South Sudan "@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXG"^^euvoc:NAC ; + skos:prefLabel "Ilemi Triangle (disputed territory)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XXH" ; + at:deprecated "false" ; + at:op-code "XXH" ; + at:start.use "2022-12-09" ; + atold:op-code "XXH" ; + dc:identifier "XXH" ; + skos:broader ; + skos:definition "disputed territory between India and Pakistan"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXH"^^euvoc:NAC ; + skos:prefLabel "Jammu and Kashmir (disputed territory)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XXR" ; + at:deprecated "false" ; + at:op-code "XXR" ; + at:start.use "2016-11-15" ; + atold:op-code "XXR" ; + dc:identifier "XXR" ; + skos:broader ; + skos:definition "common maritime and land boundaries and sovereignty over the islands of Mbanié/Mbañe, Cocotiers/Cocoteros and Conga"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXR"^^euvoc:NAC ; + skos:prefLabel "Gabon/Equatorial Guinea (disputed territory)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XXS" ; + at:deprecated "false" ; + at:op-code "XXS" ; + at:start.use "2019-02-25" ; + atold:op-code "XXS" ; + dc:identifier "XXS" ; + skos:broader ; + skos:definition "disputed area following the legal consequences of the separation of the Chagos Archipelago from Mauritius in 1965"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXS"^^euvoc:NAC ; + skos:prefLabel "Chagos Islands (disputed territory)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "XXU" ; + at:deprecated "false" ; + at:op-code "XXU" ; + at:start.use "2022-12-09" ; + atold:op-code "XXU" ; + dc:identifier "XXU" ; + skos:broader ; + skos:definition "area between South Sudan and Sudan which has a special administrative status"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXU"^^euvoc:NAC ; + skos:prefLabel "Abyei region (disputed territory)"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "ABW" ; + at:deprecated "false" ; + at:op-code "ABW" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AW" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "AW" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AW" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1986-01-01" ; + atold:op-code "ABW" ; + dc:identifier "ABW" ; + skos:altLabel "Aruba"@pap ; + skos:broader ; + skos:changeNote "Opening event: splitting from COU0328, Netherlands Antilles."@en, + "Source Wikipedia: ‘Aruba, which has no administrative subdivisions, is one of the four constituent countries that form the Kingdom of the Netherlands, together with the Netherlands, Curaçao, and Sint Maarten.’"@en, + "Source Wikipedia: «Aruba, qui n’a pas de subdivision administrative, forme un des quatre États constitutitfs du Royaume des Pays-Bas, à côté des Pays-Bas, de Curaçao et de Saint-Martin.»"@fr, + "Événement d’ouverture: séparation de COU0328, Antilles néerlandaises."@fr ; + skos:hiddenLabel "alankomaalainen, arubalainen"@fi, + "Arúba"@ga, + "duine ó Arúba"@ga, + "Arube"@hr, + "Arubos"@lt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "12"^^euvoc:EP, + "AW"^^euvoc:FD_140, + ".aw"^^euvoc:IANA_DOMAIN, + "AW"^^euvoc:ISG_COU, + "AW"^^euvoc:ISO_3166_1_ALPHA_2, + "ABW"^^euvoc:ISO_3166_1_ALPHA_3, + "533"^^euvoc:ISO_3166_1_NUM, + "ABW"^^euvoc:NAC, + "297"^^euvoc:PHONE_PREFIX, + "AW"^^euvoc:TED, + "AW"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "533"^^euvoc:UNSD_M49 ; + skos:prefLabel "أروبا"@ar, + "Аруба"@bg, + "Aruba"@ca, + "Aruba"@cs, + "Aruba"@da, + "Aruba"@de, + "Αρούμπα"@el, + "Aruba"@en, + "Aruba"@es, + "Aruba"@et, + "Aruba"@fi, + "Aruba"@fr, + "Aruba"@ga, + "Aruba"@hr, + "Aruba"@hu, + "Arúba"@is, + "Aruba"@it, + "アルバ"@ja, + "Aruba"@lb, + "Aruba"@lt, + "Aruba"@lv, + "Aruba"@mt, + "Aruba"@nl, + "Aruba"@no, + "Aruba"@pl, + "Aruba"@pt, + "Aruba"@ro, + "Аруба"@ru, + "Aruba"@sk, + "Aruba"@sl, + "Aruba"@sv, + "Aruba"@tr, + "Аруба"@uk, + "阿鲁巴"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "AFG" ; + at:deprecated "false" ; + at:op-code "AFG" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AF" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "AF" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AF" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "AF" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "AF" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "AFG" ; + dc:identifier "AFG" ; + skos:altLabel "جمهورية أفغانستان الإسلامية"@ar, + "Ислямска република Афганистан"@bg, + "República Islàmica d'Afganistan"@ca, + "Islámská republika Afghánistán"@cs, + "Den Islamiske Republik Afghanistan"@da, + "Islamische Republik Afghanistan"@de, + "Ισλαμική Δημοκρατία του Αφγανιστάν"@el, + "Islamic Republic of Afghanistan"@en, + "República Islámica de Afganistán"@es, + "Afganistani Islamivabariik"@et, + "افغانستان"@fa, + "Afganistanin islamilainen tasavalta"@fi, + "République islamique d’Afghanistan"@fr, + "Poblacht Ioslamach na hAfganastáine"@ga, + "Islamska Republika Afganistan"@hr, + "Afgán Iszlám Köztársaság"@hu, + "Íslamska lýðveldið Afganistan"@is, + "Repubblica islamica d’Afghanistan"@it, + "アフガニスタン・イスラム共和国"@ja, + "Islamesch Republik Afghanistan"@lb, + "Afganistano Islamo Respublika"@lt, + "Afganistānas Islāma Valsts"@lv, + "Ir-Repubblika Iżlamika tal-Afganistan"@mt, + "Islamitische Republiek Afghanistan"@nl, + "Den islamske republikken Afghanistan"@no, + "Islamska Republika Afganistanu"@pl, + "افغانستان"@ps, + "República Islâmica do Afeganistão"@pt, + "Republica Islamică Afganistan"@ro, + "Исламская Республика Афганистан"@ru, + "Afganská islamská republika"@sk, + "Islamska republika Afganistan"@sl, + "Islamiska republiken Afghanistan"@sv, + "Afganistan İslam Cumhuriyeti"@tr, + "Ісламська Республіка Афганістан"@uk, + "阿富汗伊斯兰共和国"@zh ; + skos:hiddenLabel "Afganistani"@et, + "République islamique d'Afghanistan"@fr, + "an Afganastáin"@ga, + "Islamska Država Afganistan"@hr, + "Repubblica islamica di Afghanistan"@it, + "Afganistano"@lt, + "Afganistānas"@lv, + "Afganistānas Islāma Republika"@lv, + "ir-Repubblika Iżlamika tal-Afganistan"@mt, + "l-Afganistan"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "215"^^euvoc:EP, + "AF"^^euvoc:FD_010, + "AF"^^euvoc:FD_140, + "AF"^^euvoc:FD_400, + ".af"^^euvoc:IANA_DOMAIN, + "AF"^^euvoc:ISG_COU, + "AF"^^euvoc:ISO_3166_1_ALPHA_2, + "AFG"^^euvoc:ISO_3166_1_ALPHA_3, + "004"^^euvoc:ISO_3166_1_NUM, + "AFG"^^euvoc:NAC, + "93"^^euvoc:PHONE_PREFIX, + "AF"^^euvoc:TED, + "AF"^^euvoc:TED_SCHEMA, + "AFG"^^euvoc:TIR, + "Southern Asia"^^euvoc:UNSD_GEOSCHEME, + "004"^^euvoc:UNSD_M49 ; + skos:prefLabel "أفغانستان"@ar, + "Афганистан"@bg, + "Afganistan"@ca, + "Afghánistán"@cs, + "Afghanistan"@da, + "Afghanistan"@de, + "Αφγανιστάν"@el, + "Afghanistan"@en, + "Afganistán"@es, + "Afganistan"@et, + "Afganistan"@fi, + "Afghanistan"@fr, + "An Afganastáin"@ga, + "Afganistan"@hr, + "Afganisztán"@hu, + "Afganistan"@is, + "Afghanistan"@it, + "アフガニスタン"@ja, + "Afghanistan"@lb, + "Afganistanas"@lt, + "Afganistāna"@lv, + "L-Afganistan"@mt, + "Afghanistan"@nl, + "Afghanistan"@no, + "Afganistan"@pl, + "Afeganistão"@pt, + "Afganistan"@ro, + "Афганистан"@ru, + "Afganistan"@sk, + "Afganistan"@sl, + "Afghanistan"@sv, + "Afganistan"@tr, + "Афганістан"@uk, + "阿富汗"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "AGO" ; + at:deprecated "false" ; + at:op-code "AGO" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AO" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "ANG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "ANG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AO" ; + dc:source "TED" ] ; + at:start.use "1975-11-11" ; + atold:op-code "AGO" ; + dc:identifier "AGO" ; + skos:altLabel "جمهورية أنغولا"@ar, + "Република Ангола"@bg, + "República d'Angola"@ca, + "Angolská republika"@cs, + "Republikken Angola"@da, + "Republik Angola"@de, + "Δημοκρατία της Ανγκόλας"@el, + "Republic of Angola"@en, + "República de Angola"@es, + "Angola Vabariik"@et, + "Angolan tasavalta"@fi, + "République d’Angola"@fr, + "Poblacht Angóla"@ga, + "Republika Angola"@hr, + "Angolai Köztársaság"@hu, + "Lýðveldið Angóla"@is, + "Repubblica d’Angola"@it, + "アンゴラ共和国"@ja, + "Republik Angola"@lb, + "Angolos Respublika"@lt, + "Angolas Republika"@lv, + "Ir-Repubblika tal-Angola"@mt, + "Republiek Angola"@nl, + "Republikken Angola"@no, + "Republika Angoli"@pl, + "República de Angola"@pt, + "Republica Angola"@ro, + "Республика Ангола"@ru, + "Angolská republika"@sk, + "Republika Angola"@sl, + "Republiken Angola"@sv, + "Angola Cumhuriyeti"@tr, + "Республіка Ангола"@uk, + "安哥拉共和国"@zh ; + skos:hiddenLabel "Ανγκόλας"@el, + "République d'Angola"@fr, + "Repubblica d'Angola"@it, + "Angolos"@lt, + "Angolas"@lv, + "ir-Repubblika tal-Angola"@mt, + "l-Angola"@mt, + "Angolese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "226"^^euvoc:EP, + "ANG"^^euvoc:FD_010, + "ANG"^^euvoc:FD_400, + ".ao"^^euvoc:IANA_DOMAIN, + "AO"^^euvoc:ISG_COU, + "AO"^^euvoc:ISO_3166_1_ALPHA_2, + "AGO"^^euvoc:ISO_3166_1_ALPHA_3, + "024"^^euvoc:ISO_3166_1_NUM, + "AGO"^^euvoc:NAC, + "244"^^euvoc:PHONE_PREFIX, + "AO"^^euvoc:TED, + "AO"^^euvoc:TED_SCHEMA, + "Middle Africa"^^euvoc:UNSD_GEOSCHEME, + "024"^^euvoc:UNSD_M49 ; + skos:prefLabel "أنغولا"@ar, + "Ангола"@bg, + "Angola"@ca, + "Angola"@cs, + "Angola"@da, + "Angola"@de, + "Ανγκόλα"@el, + "Angola"@en, + "Angola"@es, + "Angola"@et, + "Angola"@fi, + "Angola"@fr, + "Angóla"@ga, + "Angola"@hr, + "Angola"@hu, + "Angóla"@is, + "Angola"@it, + "アンゴラ"@ja, + "Angola"@lb, + "Angola"@lt, + "Angola"@lv, + "L-Angola"@mt, + "Angola"@nl, + "Angola"@no, + "Angola"@pl, + "Angola"@pt, + "Angola"@ro, + "Ангола"@ru, + "Angola"@sk, + "Angola"@sl, + "Angola"@sv, + "Angola"@tr, + "Ангола"@uk, + "安哥拉"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "AIA" ; + at:deprecated "false" ; + at:op-code "AIA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AI" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "AI" ; + dc:source "TED" ] ; + at:start.use "1980-09-19" ; + atold:op-code "AIA" ; + dc:identifier "AIA" ; + skos:broader ; + skos:changeNote "In 1980 Anguilla seceded from Saint Christopher-Nevis-Anguilla and became a separate British colony now a British overseas territory."@en ; + skos:hiddenLabel "britannialainen, anguillalainen"@fi, + "d'Anguilla"@fr, + "Angaíle"@ga, + "duine ó Anguilla"@ga, + "Angvile"@hr, + "Angilijos"@lt ; + skos:historyNote "The ‘AI’ ISO code was formerly used for the ‘French Territory of the Afars and Issas’, now Djibouti, DJ."@en, + "Le code ISO «AI» a été précédemment assigné au «Territoire français des Afars et Issas», maintenant Djibouti, DJ."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:notation "3"^^euvoc:EP, + ".ai"^^euvoc:IANA_DOMAIN, + "AI"^^euvoc:ISG_COU, + "AI"^^euvoc:ISO_3166_1_ALPHA_2, + "AIA"^^euvoc:ISO_3166_1_ALPHA_3, + "660"^^euvoc:ISO_3166_1_NUM, + "AIA"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "AI"^^euvoc:TED, + "AI"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "660"^^euvoc:UNSD_M49 ; + skos:prefLabel "أنغيلا"@ar, + "Ангила"@bg, + "Anguilla"@ca, + "Anguilla"@cs, + "Anguilla"@da, + "Anguilla"@de, + "Ανγκουίλα"@el, + "Anguilla"@en, + "Anguila"@es, + "Anguilla"@et, + "Anguilla"@fi, + "Anguilla"@fr, + "Anguilla"@ga, + "Angvila"@hr, + "Anguilla"@hu, + "Angvilla"@is, + "Anguilla"@it, + "アンギラ"@ja, + "Anguilla"@lb, + "Angilija"@lt, + "Angilja"@lv, + "Anguilla"@mt, + "Anguilla"@nl, + "Anguilla"@no, + "Anguilla"@pl, + "Anguila"@pt, + "Anguilla"@ro, + "Ангилья"@ru, + "Anguilla"@sk, + "Angvila"@sl, + "Anguilla"@sv, + "Anguilla"@tr, + "Ангілья"@uk, + "安圭拉"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "ALB" ; + at:deprecated "false" ; + at:op-code "ALB" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AL" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "AL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AL" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1912-11-18" ; + atold:op-code "ALB" ; + dc:identifier "ALB" ; + skos:altLabel "جمهورية ألبانيا"@ar, + "Рэспу́бліка Албанія"@be, + "Република Албания"@bg, + "Republika Albanija"@bs, + "República d'Albània"@ca, + "Albánská republika"@cs, + "Republikken Albanien"@da, + "Republik Albanien"@de, + "Δημοκρατία της Αλβανίας"@el, + "Republic of Albania"@en, + "República de Albania"@es, + "Albaania Vabariik"@et, + "Albaniako Errepublika"@eu, + "Albanian tasavalta"@fi, + "Lýðveldið Albaniu"@fo, + "République d’Albanie"@fr, + "Poblacht na hAlbáine"@ga, + "República de Albania"@gl, + "Republika Albanija"@hr, + "Albán Köztársaság"@hu, + "Lýðveldið Albanía"@is, + "Repubblica di Albania"@it, + "アルバニア共和国"@ja, + "Republik Albanien"@lb, + "Albanijos Respublika"@lt, + "Albānijas Republika"@lv, + "Република Албанија"@mk, + "Ir-Repubblika tal-Albanija"@mt, + "Republiek Albanië"@nl, + "Republikken Albania"@no, + "Republika Albanii"@pl, + "República da Albânia"@pt, + "Republica da l’Albania"@rm, + "Republica Albania"@ro, + "Республика Албания"@ru, + "Albánska republika"@sk, + "Republika Albanija"@sl, + "Republika e Shqipërisë"@sq, + "Република Албанија"@sr, + "Republiken Albanien"@sv, + "Arnavutluk Cumhuriyeti"@tr, + "Республіка Албанія"@uk, + "阿尔巴尼亚共和国"@zh ; + skos:hiddenLabel "République d'Albanie"@fr, + "an Albáin"@ga, + "Repubblica d'Albania"@it, + "Albanijos"@lt, + "Albānijas"@lv, + "ir-Repubblika tal-Albanija"@mt, + "l-Albanija"@mt, + "Albanese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "4"^^euvoc:EP, + "AL"^^euvoc:FD_010, + ".al"^^euvoc:IANA_DOMAIN, + "AL"^^euvoc:IBAN_COU, + "AL"^^euvoc:ISG_COU, + "AL"^^euvoc:ISO_3166_1_ALPHA_2, + "ALB"^^euvoc:ISO_3166_1_ALPHA_3, + "008"^^euvoc:ISO_3166_1_NUM, + "ALB"^^euvoc:NAC, + "355"^^euvoc:PHONE_PREFIX, + "AL"^^euvoc:TED, + "AL"^^euvoc:TED_SCHEMA, + "AL"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "008"^^euvoc:UNSD_M49 ; + skos:prefLabel "البانيا"@ar, + "Албанія"@be, + "Албания"@bg, + "Albanija"@bs, + "Albània"@ca, + "Albánie"@cs, + "Albanien"@da, + "Albanien"@de, + "Αλβανία"@el, + "Albania"@en, + "Albania"@es, + "Albaania"@et, + "Albania"@eu, + "Albania"@fi, + "Albania"@fo, + "Albanie"@fr, + "An Albáin"@ga, + "Albania"@gl, + "Albanija"@hr, + "Albánia"@hu, + "Albanía"@is, + "Albania"@it, + "アルバニア"@ja, + "Albanien"@lb, + "Albanija"@lt, + "Albānija"@lv, + "Албанија"@mk, + "L-Albanija"@mt, + "Albanië"@nl, + "Albania"@no, + "Albania"@pl, + "Albânia"@pt, + "Albania"@rm, + "Albania"@ro, + "Албания"@ru, + "Albánsko"@sk, + "Albanija"@sl, + "Shqipëria"@sq, + "Албанија"@sr, + "Albanien"@sv, + "Arnavutluk"@tr, + "Албанія"@uk, + "阿尔巴尼亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "AND" ; + at:deprecated "false" ; + at:op-code "AND" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AD" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "AD" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "AND" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "AND" ; + dc:identifier "AND" ; + skos:altLabel "إمارة أندورا"@ar, + "Княства Андора"@be, + "Княжество Андора"@bg, + "Kneževina Andora"@bs, + "Principat d'Andorra"@ca, + "Andorrské knížectví"@cs, + "Fyrstendømmet Andorra"@da, + "Fürstentum Andorra"@de, + "Πριγκιπάτο της Ανδόρας"@el, + "Principality of Andorra"@en, + "Principado de Andorra"@es, + "Andorra Vürstiriik"@et, + "Andorrako Printzerria"@eu, + "Andorran ruhtinaskunta"@fi, + "Prinsadømið Andorra"@fo, + "Principauté d’Andorre"@fr, + "Prionsacht Andóra"@ga, + "Principado de Andorra"@gl, + "Kneževina Andora"@hr, + "Andorrai Hercegség"@hu, + "Furstadæmið Andorra"@is, + "Principato di Andorra"@it, + "アンドラ公国"@ja, + "Fürstentum Andorra"@lb, + "Andoros kunigaikštystė"@lt, + "Andoras Firstiste"@lv, + "Војводство Андора"@mk, + "Il-Prinċipat ta’ Andorra"@mt, + "Vorstendom Andorra"@nl, + "Fyrstedømmet Andorra"@no, + "Księstwo Andory"@pl, + "Principado de Andorra"@pt, + "Principadi d’Andorra"@rm, + "Principatul Andorra"@ro, + "Княжество Андорра"@ru, + "Andorrské kniežatstvo"@sk, + "Principat Andore"@sl, + "Principata e Andorrës"@sq, + "Кнежевина Андора"@sr, + "Furstendömet Andorra"@sv, + "Andorra Prensliği"@tr, + "Князівство Андорра"@uk, + "安道尔公国"@zh ; + skos:hiddenLabel "Ανδόρας"@el, + "Principauté d'Andorre"@fr, + "Andoros"@lt, + "Andoras"@lv, + "il-Prinċipat ta’ Andorra"@mt, + "Andorrese"@nl, + "Kneževina Andora"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "225"^^euvoc:EP, + "AND"^^euvoc:FD_010, + ".ad"^^euvoc:IANA_DOMAIN, + "AD"^^euvoc:IBAN_COU, + "AD"^^euvoc:ISG_COU, + "AD"^^euvoc:ISO_3166_1_ALPHA_2, + "AND"^^euvoc:ISO_3166_1_ALPHA_3, + "020"^^euvoc:ISO_3166_1_NUM, + "AND"^^euvoc:NAC, + "376"^^euvoc:PHONE_PREFIX, + "AD"^^euvoc:TED, + "AD"^^euvoc:TED_SCHEMA, + "AND"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "020"^^euvoc:UNSD_M49 ; + skos:prefLabel "أندورا"@ar, + "Андора"@be, + "Андора"@bg, + "Andora"@bs, + "Andorra"@ca, + "Andorra"@cs, + "Andorra"@da, + "Andorra"@de, + "Ανδόρα"@el, + "Andorra"@en, + "Andorra"@es, + "Andorra"@et, + "Andorra"@eu, + "Andorra"@fi, + "Andorra"@fo, + "Andorre"@fr, + "Andóra"@ga, + "Andorra"@gl, + "Andora"@hr, + "Andorra"@hu, + "Andorra"@is, + "Andorra"@it, + "アンドラ"@ja, + "Andorra"@lb, + "Andora"@lt, + "Andora"@lv, + "Андора"@mk, + "Andorra"@mt, + "Andorra"@nl, + "Andorra"@no, + "Andora"@pl, + "Andorra"@pt, + "Andorra"@rm, + "Andorra"@ro, + "Андорра"@ru, + "Andorra"@sk, + "Andora"@sl, + "Andorra"@sq, + "Андора"@sr, + "Andorra"@sv, + "Andorra"@tr, + "Андорра"@uk, + "安道尔"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ARE" ; + at:deprecated "false" ; + at:op-code "ARE" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "AE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "AE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "AE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "AE" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ARE" ; + dc:identifier "ARE" ; + skos:altLabel "De Forenede Arabiske Emirater"@da, + "Yhdistyneet arabiemiraatit"@fi, + "Państwo Zjednoczonych Emiratów Arabskich"@pl ; + skos:hiddenLabel "Ηνωμένων Αραβικών Εμιράτων"@el, + "Emirian"@en, + "de los Emiratos Árabes Unidos"@es, + "Araabia Ühendemiraatide"@et, + "Arabiemiirikuntien kansalainen, arabiemiirikuntalainen"@fi, + "des Émirats arabes unis"@fr, + "duine ó Aontas na nÉimíríochtaí Arabacha"@ga, + "Ujedinjenih Arapskih Emirata"@hr, + "l-Emirati Għarab Magħquda"@mt, + "emiradense"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "1"^^euvoc:EP, + "AE"^^euvoc:FD_010, + "AE"^^euvoc:FD_140, + "AE"^^euvoc:FD_400, + ".ae"^^euvoc:IANA_DOMAIN, + "AE"^^euvoc:IBAN_COU, + "AE"^^euvoc:ISG_COU, + "AE"^^euvoc:ISO_3166_1_ALPHA_2, + "ARE"^^euvoc:ISO_3166_1_ALPHA_3, + "784"^^euvoc:ISO_3166_1_NUM, + "ARE"^^euvoc:NAC, + "971"^^euvoc:PHONE_PREFIX, + "AE"^^euvoc:TED, + "AE"^^euvoc:TED_SCHEMA, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "784"^^euvoc:UNSD_M49 ; + skos:prefLabel "الإمارات العربية المتحدة"@ar, + "Обединени арабски емирства"@bg, + "Emirats Àrabs Units"@ca, + "Spojené arabské emiráty"@cs, + "Forenede Arabiske Emirater"@da, + "Vereinigte Arabische Emirate"@de, + "Ηνωμένα Αραβικά Εμιράτα"@el, + "United Arab Emirates"@en, + "Emiratos Árabes Unidos"@es, + "Araabia Ühendemiraadid"@et, + "Arabiemiraatit"@fi, + "Émirats arabes unis"@fr, + "Aontas na nÉimíríochtaí Arabacha"@ga, + "Ujedinjeni Arapski Emirati"@hr, + "Egyesült Arab Emírségek"@hu, + "Sameinuðu arabísku furstadæmin"@is, + "Emirati arabi uniti"@it, + "アラブ首長国連邦"@ja, + "Vereenegt Arabesch Emirater"@lb, + "Jungtiniai Arabų Emyratai"@lt, + "Apvienotie Arābu Emirāti"@lv, + "L-Emirati Għarab Magħquda"@mt, + "Verenigde Arabische Emiraten"@nl, + "De forente arabiske emirater"@no, + "Zjednoczone Emiraty Arabskie"@pl, + "Emirados Árabes Unidos"@pt, + "Emiratele Arabe Unite"@ro, + "Объединённые Арабские Эмираты"@ru, + "Spojené arabské emiráty"@sk, + "Združeni arabski emirati"@sl, + "Förenade Arabemiraten"@sv, + "Birleşik Arap Emirlikleri"@tr, + "Об'єднані Арабські Емірати"@uk, + "阿拉伯联合酋长国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ARG" ; + at:deprecated "false" ; + at:op-code "ARG" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "AR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "AR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RA" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ARG" ; + dc:identifier "ARG" ; + skos:altLabel "جمهورية الأرجنتين"@ar, + "Република Аржентина"@bg, + "República Argentina"@ca, + "Argentinská republika"@cs, + "Den Argentinske Republik"@da, + "Argentinische Republik"@de, + "Δημοκρατία της Αργεντινής"@el, + "Argentine Republic"@en, + "República Argentina"@es, + "Argentina Vabariik"@et, + "Argentiinan tasavalta"@fi, + "République argentine"@fr, + "Poblacht na hAirgintíne"@ga, + "Republika Argentina"@hr, + "Argentin Köztársaság"@hu, + "Argentíska lýðveldið"@is, + "Repubblica argentina"@it, + "アルゼンチン共和国"@ja, + "Republik Argentinien"@lb, + "Argentinos Respublika"@lt, + "Argentīnas Republika"@lv, + "Ir-Repubblika Arġentina"@mt, + "Republiek Argentinië"@nl, + "Republikken Argentina"@no, + "Republika Argentyńska"@pl, + "República Argentina"@pt, + "Republica Argentina"@ro, + "Аргентинская Республика"@ru, + "Argentínska republika"@sk, + "Argentinska republika"@sl, + "Republiken Argentina"@sv, + "Arjantin Cumhuriyeti"@tr, + "Аргентинська Республіка"@uk, + "阿根廷共和国"@zh ; + skos:hiddenLabel "argentisk"@da, + "Αργεντινής"@el, + "Argentine; Argentinian"@en, + "an Airgintín"@ga, + "Argentinska Republika"@hr, + "Argentinos"@lt, + "Argentīnas"@lv, + "ir-Repubblika Arġentina"@mt, + "l-Arġentina"@mt, + "Argentijnse Republiek"@nl, + "argentyńskie"@pl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "8"^^euvoc:EP, + "RA"^^euvoc:FD_010, + "AR"^^euvoc:FD_140, + "AR"^^euvoc:FD_160, + "RA"^^euvoc:FD_400, + ".ar"^^euvoc:IANA_DOMAIN, + "AR"^^euvoc:ISG_COU, + "AR"^^euvoc:ISO_3166_1_ALPHA_2, + "ARG"^^euvoc:ISO_3166_1_ALPHA_3, + "032"^^euvoc:ISO_3166_1_NUM, + "ARG"^^euvoc:NAC, + "54"^^euvoc:PHONE_PREFIX, + "AR"^^euvoc:TED, + "AR"^^euvoc:TED_SCHEMA, + "RA"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "032"^^euvoc:UNSD_M49 ; + skos:prefLabel "الارجنتين"@ar, + "Аржентина"@bg, + "Argentina"@ca, + "Argentina"@cs, + "Argentina"@da, + "Argentinien"@de, + "Αργεντινή"@el, + "Argentina"@en, + "Argentina"@es, + "Argentina"@et, + "Argentiina"@fi, + "Argentine"@fr, + "An Airgintín"@ga, + "Argentina"@hr, + "Argentína"@hu, + "Argentína"@is, + "Argentina"@it, + "アルゼンチン"@ja, + "Argentinien"@lb, + "Argentina"@lt, + "Argentīna"@lv, + "L-Arġentina"@mt, + "Argentinië"@nl, + "Argentina"@no, + "Argentyna"@pl, + "Argentina"@pt, + "Argentina"@ro, + "Аргентина"@ru, + "Argentína"@sk, + "Argentina"@sl, + "Argentina"@sv, + "Arjantin"@tr, + "Аргентина"@uk, + "阿根廷"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ARM" ; + at:deprecated "false" ; + at:op-code "ARM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "AM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AM" ; + dc:source "TED" ] ; + at:start.use "1991-09-21" ; + atold:op-code "ARM" ; + dc:identifier "ARM" ; + skos:altLabel "جمهورية أرمينيا"@ar, + "Република Армения"@bg, + "República d'Armènia"@ca, + "Arménská republika"@cs, + "Republikken Armenien"@da, + "Republik Armenien"@de, + "Δημοκρατία της Αρμενίας"@el, + "Republic of Armenia"@en, + "República de Armenia"@es, + "Armeenia Vabariik"@et, + "Armenian tasavalta"@fi, + "République d’Arménie"@fr, + "Poblacht na hAirméine"@ga, + "Republika Armenija"@hr, + "Örmény Köztársaság"@hu, + "Հայաստան"@hy, + "Lýðveldið Armenía"@is, + "Repubblica d’Armenia"@it, + "アルメニア共和国"@ja, + "Republik Armenien"@lb, + "Armėnijos Respublika"@lt, + "Armēnijas Republika"@lv, + "Ir-Repubblika tal-Armenja"@mt, + "Republiek Armenië"@nl, + "Republikken Armenia"@no, + "Republika Armenii"@pl, + "República da Arménia"@pt, + "Republica Armenia"@ro, + "Республика Армения"@ru, + "Arménska republika"@sk, + "Republika Armenija"@sl, + "Republiken Armenien"@sv, + "Ermenistan Cumhuriyeti"@tr, + "Республіка Вірменія"@uk, + "亚美尼亚共和国"@zh ; + skos:hiddenLabel "αρμενική"@el, + "République d'Arménie"@fr, + "an Airméin"@ga, + "Repubblica d'Armenia"@it, + "Armėnijos"@lt, + "Armēnijas"@lv, + "ir-Repubblika tal-Armenja"@mt, + "l-Armenja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "5"^^euvoc:EP, + "AM"^^euvoc:FD_010, + ".am"^^euvoc:IANA_DOMAIN, + "AM"^^euvoc:ISG_COU, + "AM"^^euvoc:ISO_3166_1_ALPHA_2, + "ARM"^^euvoc:ISO_3166_1_ALPHA_3, + "051"^^euvoc:ISO_3166_1_NUM, + "ARM"^^euvoc:NAC, + "374"^^euvoc:PHONE_PREFIX, + "AM"^^euvoc:TED, + "AM"^^euvoc:TED_SCHEMA, + "AM"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "051"^^euvoc:UNSD_M49 ; + skos:prefLabel "أرمينيا"@ar, + "Армения"@bg, + "Armènia"@ca, + "Arménie"@cs, + "Armenien"@da, + "Armenien"@de, + "Αρμενία"@el, + "Armenia"@en, + "Armenia"@es, + "Armeenia"@et, + "Armenia"@fi, + "Arménie"@fr, + "An Airméin"@ga, + "Armenija"@hr, + "Örményország"@hu, + "Armenía"@is, + "Armenia"@it, + "アルメニア"@ja, + "Armenien"@lb, + "Armėnija"@lt, + "Armēnija"@lv, + "L-Armenja"@mt, + "Armenië"@nl, + "Armenia"@no, + "Armenia"@pl, + "Arménia"@pt, + "Armenia"@ro, + "Армения"@ru, + "Arménsko"@sk, + "Armenija"@sl, + "Armenien"@sv, + "Ermenistan"@tr, + "Вірменія"@uk, + "亚美尼亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ATG" ; + at:deprecated "false" ; + at:op-code "ATG" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AG" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "AG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "ATG" ; + dc:source "EurLex" ] ; + at:start.use "1981-11-01" ; + atold:op-code "ATG" ; + dc:identifier "ATG" ; + skos:hiddenLabel "fra Antigua og Barbuda, antiguansk, barbudansk"@da, + "duine ó Antigua agus Barbúda"@ga, + "Antigve i Barbuda"@hr, + "antiguańsko-barbudzkie"@pl, + "de Antígua e Barbuda"@pt, + "Antigua și Barbuda"@ro, + "din Antigua și Barbuda"@ro, + "antiguansk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "2"^^euvoc:EP, + "ATG"^^euvoc:FD_010, + ".ag"^^euvoc:IANA_DOMAIN, + "AG"^^euvoc:ISG_COU, + "AG"^^euvoc:ISO_3166_1_ALPHA_2, + "ATG"^^euvoc:ISO_3166_1_ALPHA_3, + "028"^^euvoc:ISO_3166_1_NUM, + "ATG"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "AG"^^euvoc:TED, + "AG"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "028"^^euvoc:UNSD_M49 ; + skos:prefLabel "أنتيغوا وبربودا"@ar, + "Антигуа и Барбуда"@bg, + "Antigua i Barbuda"@ca, + "Antigua a Barbuda"@cs, + "Antigua og Barbuda"@da, + "Antigua und Barbuda"@de, + "Αντίγκουα και Μπαρμπούντα"@el, + "Antigua and Barbuda"@en, + "Antigua y Barbuda"@es, + "Antigua ja Barbuda"@et, + "Antigua ja Barbuda"@fi, + "Antigua-et-Barbuda"@fr, + "Antigua agus Barbúda"@ga, + "Antigva i Barbuda"@hr, + "Antigua és Barbuda"@hu, + "Antígva og Barbúda"@is, + "Antigua e Barbuda"@it, + "アンティグア・バーブーダ"@ja, + "Antigua a Barbuda"@lb, + "Antigva ir Barbuda"@lt, + "Antigva un Barbuda"@lv, + "Antigua u Barbuda"@mt, + "Antigua en Barbuda"@nl, + "Antigua og Barbuda"@no, + "Antigua i Barbuda"@pl, + "Antígua e Barbuda"@pt, + "Antigua şi Barbuda"@ro, + "Антигуа и Барбуда"@ru, + "Antigua a Barbuda"@sk, + "Antigva in Barbuda"@sl, + "Antigua och Barbuda"@sv, + "Antigua ve Barbuda"@tr, + "Антигуа і Барбуда"@uk, + "安提瓜和巴布达"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "AZE" ; + at:deprecated "false" ; + at:op-code "AZE" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "AZ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "AZR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AZ" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1991-10-18" ; + atold:op-code "AZE" ; + dc:identifier "AZE" ; + skos:altLabel "جمهورية أذربيدجان"@ar, + "Azərbaycan"@az, + "Република Азербайджан"@bg, + "República de l'Azerbaidjan"@ca, + "Ázerbájdžánská republika"@cs, + "Republikken Aserbajdsjan"@da, + "Republik Aserbaidschan"@de, + "Δημοκρατία του Αζερμπαϊτζάν"@el, + "Republic of Azerbaijan"@en, + "República de Azerbaiyán"@es, + "Aserbaidžaani Vabariik"@et, + "Azerbaidžanin tasavalta"@fi, + "République d’Azerbaïdjan"@fr, + "Poblacht na hAsarbaiseáine"@ga, + "Republika Azerbajdžan"@hr, + "Azerbajdzsán Köztársaság"@hu, + "Lýðveldið Aserbaísjan"@is, + "Repubblica dell’Azerbaigian"@it, + "アゼルバイジャン共和国"@ja, + "Republik Aserbaidjan"@lb, + "Azerbaidžano Respublika"@lt, + "Azerbaidžānas Republika"@lv, + "Ir-Repubblika tal-Ażerbajġan"@mt, + "Republiek Azerbeidzjan"@nl, + "Republikken Aserbajdsjan"@no, + "Republika Azerbejdżanu"@pl, + "República do Azerbaijão"@pt, + "Republica Azerbaidjan"@ro, + "Республика Азербайджан"@ru, + "Azerbajdžanská republika"@sk, + "Republika Azerbajdžan"@sl, + "Republiken Azerbajdzjan"@sv, + "Azerbaycan Cumhuriyeti"@tr, + "Республіка Азербайджан"@uk, + "阿塞拜疆共和国"@zh ; + skos:hiddenLabel "Азербайджанска република"@bg, + "Azerbájdžán"@cs, + "Ázerbajdžánská republika"@cs, + "Aserbaidžaani"@et, + "République d'Azerbaïdjan"@fr, + "an Asarbaiseáin"@ga, + "Repubblica dell'Azerbaigian"@it, + "azerbaigiana, azera"@it, + "Azerbaidžano"@lt, + "Azerbaidžānas"@lv, + "Ażerbajġana"@mt, + "ir-Repubblika ta’ Ażerbajġan"@mt, + "l-Azerbajġan"@mt, + "azerbaijana"@pt, + "azerisk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "13"^^euvoc:EP, + "AZR"^^euvoc:FD_010, + ".az"^^euvoc:IANA_DOMAIN, + "AZ"^^euvoc:IBAN_COU, + "AZ"^^euvoc:ISG_COU, + "AZ"^^euvoc:ISO_3166_1_ALPHA_2, + "AZE"^^euvoc:ISO_3166_1_ALPHA_3, + "031"^^euvoc:ISO_3166_1_NUM, + "AZE"^^euvoc:NAC, + "994"^^euvoc:PHONE_PREFIX, + "AZ"^^euvoc:TED, + "AZ"^^euvoc:TED_SCHEMA, + "AZ"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "031"^^euvoc:UNSD_M49 ; + skos:prefLabel "أذربيدجان"@ar, + "Азербайджан"@bg, + "Azerbaidjan"@ca, + "Ázerbájdžán"@cs, + "Aserbajdsjan"@da, + "Aserbaidschan"@de, + "Αζερμπαϊτζάν"@el, + "Azerbaijan"@en, + "Azerbaiyán"@es, + "Aserbaidžaan"@et, + "Azerbaidžan"@fi, + "Azerbaïdjan"@fr, + "An Asarbaiseáin"@ga, + "Azerbajdžan"@hr, + "Azerbajdzsán"@hu, + "Aserbaísjan"@is, + "Azerbaigian"@it, + "アゼルバジャン"@ja, + "Aserbaidjan"@lb, + "Azerbaidžanas"@lt, + "Azerbaidžāna"@lv, + "L-Ażerbajġan"@mt, + "Azerbeidzjan"@nl, + "Azerbaijan"@no, + "Azerbejdżan"@pl, + "Azerbaijão"@pt, + "Azerbaidjan"@ro, + "Азербайджан"@ru, + "Azerbajdžan"@sk, + "Azerbajdžan"@sl, + "Azerbajdzjan"@sv, + "Azerbaycan"@tr, + "Азербайджан"@uk, + "阿塞拜疆"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BDI" ; + at:deprecated "false" ; + at:op-code "BDI" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BI" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "BI" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1962-07-01" ; + atold:op-code "BDI" ; + dc:identifier "BDI" ; + skos:altLabel "جمهورية بوروندي"@ar, + "Република Бурунди"@bg, + "República de Burundi"@ca, + "Republika Burundi"@cs, + "Republikken Burundi"@da, + "Republik Burundi"@de, + "Δημοκρατία του Μπουρούντι"@el, + "Republic of Burundi"@en, + "República de Burundi"@es, + "Burundi Vabariik"@et, + "Burundin tasavalta"@fi, + "République du Burundi"@fr, + "Poblacht na Burúine"@ga, + "Republika Burundi"@hr, + "Burundi Köztársaság"@hu, + "Lýðveldið Búrúndí"@is, + "Repubblica di Burundi"@it, + "ブルンジ共和国"@ja, + "Republik Burundi"@lb, + "Burundžio Respublika"@lt, + "Burundi Republika"@lv, + "Ir-Repubblika tal-Burundi"@mt, + "Republiek Burundi"@nl, + "Republikken Burundi"@no, + "Republika Burundi"@pl, + "República do Burundi"@pt, + "Burundi"@rn, + "Republica Burundi"@ro, + "Республика Бурунди"@ru, + "Burundská republika"@sk, + "Republika Burundi"@sl, + "Republiken Burundi"@sv, + "Brundi Cumhuriyeti"@tr, + "Республіка Бурунді"@uk, + "布隆迪共和国"@zh ; + skos:hiddenLabel "an Bhurúin"@ga, + "Repubblica del Burundi"@it, + "Burundžio"@lt, + "il-Burundi"@mt, + "ir-Repubblika tal-Burundi"@mt, + "Burundese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "228"^^euvoc:EP, + "RU"^^euvoc:FD_010, + "RU"^^euvoc:FD_400, + ".bi"^^euvoc:IANA_DOMAIN, + "BI"^^euvoc:IBAN_COU, + "BI"^^euvoc:ISG_COU, + "BI"^^euvoc:ISO_3166_1_ALPHA_2, + "BDI"^^euvoc:ISO_3166_1_ALPHA_3, + "108"^^euvoc:ISO_3166_1_NUM, + "BDI"^^euvoc:NAC, + "257"^^euvoc:PHONE_PREFIX, + "BI"^^euvoc:TED, + "BI"^^euvoc:TED_SCHEMA, + "RU"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "108"^^euvoc:UNSD_M49 ; + skos:prefLabel "بوروندي"@ar, + "Бурунди"@bg, + "Burundi"@ca, + "Burundi"@cs, + "Burundi"@da, + "Burundi"@de, + "Μπουρούντι"@el, + "Burundi"@en, + "Burundi"@es, + "Burundi"@et, + "Burundi"@fi, + "Burundi"@fr, + "An Bhurúin"@ga, + "Burundi"@hr, + "Burundi"@hu, + "Búrúndí"@is, + "Burundi"@it, + "ブルンジ"@ja, + "Burundi"@lb, + "Burundis"@lt, + "Burundi"@lv, + "Il-Burundi"@mt, + "Burundi"@nl, + "Burundi"@no, + "Burundi"@pl, + "Burundi"@pt, + "Burundi"@ro, + "Бурунди"@ru, + "Burundi"@sk, + "Burundi"@sl, + "Burundi"@sv, + "Burundi"@tr, + "Бурунді"@uk, + "布隆迪"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BEN" ; + at:deprecated "false" ; + at:op-code "BEN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BJ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "BJ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "DY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "DY" ; + dc:source "EurLex" ] ; + at:start.use "1975-11-30" ; + atold:op-code "BEN" ; + dc:identifier "BEN" ; + skos:altLabel "جمهورية بنين"@ar, + "Република Бенин"@bg, + "República de Benín"@ca, + "Beninská republika"@cs, + "Republikken Benin"@da, + "Republik Benin"@de, + "Δημοκρατία του Μπενίν"@el, + "Republic of Benin"@en, + "República de Benín"@es, + "Benini Vabariik"@et, + "Beninin tasavalta"@fi, + "République du Bénin"@fr, + "Poblacht Bheinin"@ga, + "Republika Benin"@hr, + "Benini Köztársaság"@hu, + "Lýðveldið Benín"@is, + "Repubblica del Benin"@it, + "ベナン共和国"@ja, + "Republik Benin"@lb, + "Benino Respublika"@lt, + "Beninas Republika"@lv, + "Ir-Repubblika tal-Benin"@mt, + "Republiek Benin"@nl, + "Republikken Benin"@no, + "Republika Beninu"@pl, + "República do Benim"@pt, + "Republica Benin"@ro, + "Республика Бенин"@ru, + "Beninská republika"@sk, + "Republika Benin"@sl, + "Republiken Benin"@sv, + "Benin Cumhuriyeti"@tr, + "Республіка Бенін"@uk, + "贝宁共和国"@zh ; + skos:hiddenLabel "Burundi"@es, + "Benini"@et, + "Benino"@lt, + "Beninas"@lv, + "il-Benin"@mt, + "ir-Repubblika tal-Benin"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "216"^^euvoc:EP, + "DY"^^euvoc:FD_010, + "DY"^^euvoc:FD_400, + ".bj"^^euvoc:IANA_DOMAIN, + "BJ"^^euvoc:ISG_COU, + "BJ"^^euvoc:ISO_3166_1_ALPHA_2, + "BEN"^^euvoc:ISO_3166_1_ALPHA_3, + "204"^^euvoc:ISO_3166_1_NUM, + "BEN"^^euvoc:NAC, + "229"^^euvoc:PHONE_PREFIX, + "BJ"^^euvoc:TED, + "BJ"^^euvoc:TED_SCHEMA, + "BJ"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "204"^^euvoc:UNSD_M49 ; + skos:prefLabel "بنين"@ar, + "Бенин"@bg, + "Benín"@ca, + "Benin"@cs, + "Benin"@da, + "Benin"@de, + "Μπενίν"@el, + "Benin"@en, + "Benín"@es, + "Benin"@et, + "Benin"@fi, + "Bénin"@fr, + "Beinin"@ga, + "Benin"@hr, + "Benin"@hu, + "Benín"@is, + "Benin"@it, + "ベナン"@ja, + "Benin"@lb, + "Beninas"@lt, + "Benina"@lv, + "Il-Benin"@mt, + "Benin"@nl, + "Benin"@no, + "Benin"@pl, + "Benim"@pt, + "Benin"@ro, + "Бенин"@ru, + "Benin"@sk, + "Benin"@sl, + "Benin"@sv, + "Benin"@tr, + "Бенін"@uk, + "贝宁"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BES" ; + at:deprecated "false" ; + at:op-code "BES" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BQ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "BQ" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "2010-10-10" ; + atold:op-code "BES" ; + dc:identifier "BES" ; + skos:altLabel "Bonaire, Sint Eustatius og Saba"@no ; + skos:broader ; + skos:changeNote "According to Wikipedia: ‘From the dissolution of the Netherlands Antilles on 10 October 2010, the BES islands Bonaire, Saba, and Sint Eustatius were given the status of public body often referred to as “special municipality” within the Netherlands, while the islands of Curaçao and Sint Maarten are independent states within the Kingdom of the Netherlands. At present, although part of the Netherlands, it remains an overseas territory of the European Union.’"@en, + "Wikipedia: Bonaire, Sint Eustatius, and Saba will remain OCTs at least until 2015."@en ; + skos:hiddenLabel "Bonaire, Sint Eustatius a Saba"@cs, + "fra Bonaire, Sint Eustatius og Saba"@da, + "Bonaire, St. Eustatius und Saba"@de, + "von Bonaire, St. Eustatius und Saba"@de, + "Μποναίρ, Άγιος Ευστάθιος και Σάμπα"@el, + "Μποναίρ, Αγίου Ευσταθίου και Σάμπας"@el, + "Caribbean Netherlands"@en, + "Bonaire, Sint-Eustatius ja Saba"@fi, + "alankomaalainen"@fi, + "Bonaire, Saint-Eustache agus Saba"@ga, + "duine ó Bhonaire, Saint-Eustache agus Saba"@ga, + "Otoci Bonaire, Sveti Eustahije i Saba"@hr, + "Otoka Bonaire, Sveti Eustahije i Saba"@hr, + "bonaire-i, Sint Eustatius-i, sabai"@hu, + "Bonaire, Sint Eustatius e Saba"@it, + "di Bonaire, Sint Eustatius e Saba"@it, + "Bonero, Sint Eustatijaus ir Sabos"@lt, + "Bonēra, Sintestatiusa un Saba"@lv, + "Bonēras, Sintestatiusas un Sabas"@lv, + "Bonaire, Sint Eustatius u Saba"@mt, + "Bonaire, Sint-Eustatius en Saba"@nl, + "van Bonaire, Sint-Eustatius en Saba"@nl, + "Bonaire, Sint Eustatius i Saby"@pl, + "de Bonaire, Santo Eustáquio e Saba"@pt, + "Bonaire, Sint Eustatius și Saba"@ro, + "din Bonaire, Sint Eustatius și Saba"@ro, + "Bonaire, Svätý Eustach a Saba"@sk, + "Bonaira, St. Eustatiusa in Sabe"@sl, + "Bonaire, St. Eustatius in Saba"@sl, + "från Bonaire, Sint Eustatius och Saba"@sv ; + skos:historyNote "The ‘BQ’ ISO code was formerly used for the British Antarctic Territory."@en, + "Le code ISO «BQ» a été précédemment assigné au Territoire de l’Antarctique britannique."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:notation "288"^^euvoc:EP, + ".bq"^^euvoc:IANA_DOMAIN, + "BQ"^^euvoc:ISO_3166_1_ALPHA_2, + "BES"^^euvoc:ISO_3166_1_ALPHA_3, + "535"^^euvoc:ISO_3166_1_NUM, + "BES"^^euvoc:NAC, + "599"^^euvoc:PHONE_PREFIX, + "BQ"^^euvoc:TED, + "BQ"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "535"^^euvoc:UNSD_M49 ; + skos:prefLabel "بونير، سانت ارستاتيوس وسابا"@ar, + "Бонер, Синт Еустациус и Саба"@bg, + "Bonaire, Sint Eustatius i Saba"@ca, + "Bonaire, Svatý Eustach a Saba"@cs, + "Bonaire, Sint Eustatius og Saba"@da, + "Bonaire, Sint Eustatius und Saba"@de, + "Μπονέρ, Άγιος Ευστάθιος και Σάμπα"@el, + "Bonaire, Sint Eustatius and Saba"@en, + "Bonaire, San Eustaquio y Saba"@es, + "Bonaire, Sint Eustatius ja Saba"@et, + "Bonaire, Sint Eustatius ja Saba"@fi, + "Bonaire, Saint-Eustache et Saba"@fr, + "Bonaire, Sint Eustatius agus Saba"@ga, + "Bonaire, Sveti Eustazije i Saba"@hr, + "Bonaire, Sint Eustatius és Saba"@hu, + "Bonaire, Sankti Estatíusey og Saba"@is, + "Bonaire, Sant’Eustachio e Saba"@it, + "ボネール、シント・ユースタティウスおよびサバ"@ja, + "Bonaire, Sint Eustatius a Saba"@lb, + "Boneras, Sint Eustatijus ir Saba"@lt, + "Bonaire, Sintēstatiusa un Saba"@lv, + "Bonaire, Saint Eustatius u Saba"@mt, + "Bonaire, Sint Eustatius en Saba"@nl, + "Nederlandsk Karibia"@no, + "Bonaire, Sint Eustatius i Saba"@pl, + "Bonaire, Santo Eustáquio e Saba"@pt, + "Bonaire, Sint Eustatius şi Saba"@ro, + "Бонэйр, Синт-Эстатиус и Саба"@ru, + "Bonaire, Sint Eustatius a Saba"@sk, + "Bonaire, Saint Eustatius in Saba"@sl, + "Bonaire, Sint Eustatius och Saba"@sv, + "Bonaire, Sint Eustatius ve Saba"@tr, + "Бонайре, Сінт-Естатіус і Саба"@uk, + "博内尔岛、圣尤斯特歇斯岛和萨巴岛"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "BFA" ; + at:deprecated "false" ; + at:op-code "BFA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BF" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "HV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "BF" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "HV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "HV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BF" ; + dc:source "TED" ] ; + at:start.use "1984-08-04" ; + atold:op-code "BFA" ; + dc:identifier "BFA" ; + skos:altLabel "Μπουρκίνα Φάσο"@el, + "Burkina Fasó-i Köztársaság"@hu, + "Burkina Faso"@sk ; + skos:hiddenLabel "burkinalainen"@fi, + "burkinabé"@fr, + "Burcíne Fasó"@ga, + "duine ó Bhuircíne Fasó"@ga, + "Burkine Faso"@hr, + "Burkina Faso"@lt, + "il-Burkina Faso"@mt, + "Burkinese"@nl, + "Burquina Faso"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "17"^^euvoc:EP, + "HV"^^euvoc:FD_010, + "BF"^^euvoc:FD_140, + "HV"^^euvoc:FD_140, + "HV"^^euvoc:FD_400, + ".bf"^^euvoc:IANA_DOMAIN, + "BF"^^euvoc:ISG_COU, + "BF"^^euvoc:ISO_3166_1_ALPHA_2, + "BFA"^^euvoc:ISO_3166_1_ALPHA_3, + "854"^^euvoc:ISO_3166_1_NUM, + "BFA"^^euvoc:NAC, + "226"^^euvoc:PHONE_PREFIX, + "BF"^^euvoc:TED, + "BF"^^euvoc:TED_SCHEMA, + "BF"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "854"^^euvoc:UNSD_M49 ; + skos:prefLabel "بوركينا فاسو"@ar, + "Буркина Фасо"@bg, + "Burkina Faso"@ca, + "Burkina Faso"@cs, + "Burkina Faso"@da, + "Burkina Faso"@de, + "Μπουρκίνα"@el, + "Burkina Faso"@en, + "Burkina Faso"@es, + "Burkina Faso"@et, + "Burkina Faso"@fi, + "Burkina Faso"@fr, + "Buircíne Fasó"@ga, + "Burkina Faso"@hr, + "Burkina Faso"@hu, + "Búrkína Fasó"@is, + "Burkina Faso"@it, + "ブルキナファソ"@ja, + "Burkina Faso"@lb, + "Burkina Fasas"@lt, + "Burkinafaso"@lv, + "Il-Burkina Faso"@mt, + "Burkina Faso"@nl, + "Burkina Faso"@no, + "Burkina Faso"@pl, + "Burquina Fasso"@pt, + "Burkina Faso"@ro, + "Буркина-Фасо"@ru, + "Burkina"@sk, + "Burkina Faso"@sl, + "Burkina Faso"@sv, + "Burkina Faso"@tr, + "Буркіна-Фасо"@uk, + "布基纳法索"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BGD" ; + at:deprecated "false" ; + at:op-code "BGD" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "BD" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BD" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "BD" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BD" ; + dc:source "EurLex" ] ; + at:start.use "1971-03-26" ; + atold:op-code "BGD" ; + dc:identifier "BGD" ; + skos:altLabel "جمهورية بنغلاديش الشعبية"@ar, + "Народна република Бангладеш"@bg, + "বাংলাদেশ"@bn, + "República Popular de Bangladesh"@ca, + "Bangladéšská lidová republika"@cs, + "Folkerepublikken Bangladesh"@da, + "Volksrepublik Bangladesch"@de, + "Λαϊκή Δημοκρατία του Μπανγκλαντές"@el, + "People’s Republic of Bangladesh"@en, + "República Popular de Bangladés"@es, + "Bangladeshi Rahvavabariik"@et, + "Bangladeshin kansantasavalta"@fi, + "République populaire du Bangladesh"@fr, + "Daon-Phoblacht Dhaonlathach na Bainglaidéise"@ga, + "Narodna Republika Bangladeš"@hr, + "Bangladesi Népi Köztársaság"@hu, + "Alþýðulýðveldið Bangladesh"@is, + "Repubblica popolare del Bangladesh"@it, + "バングラデシュ人民共和国"@ja, + "Volleksrepublik Bangladesch"@lb, + "Bangladešo Liaudies Respublika"@lt, + "Bangladešas Tautas Republika"@lv, + "Ir-Repubblika tal-Poplu tal-Bangladesh"@mt, + "Volksrepubliek Bangladesh"@nl, + "Folkerepublikken Bangladesh"@no, + "Ludowa Republika Bangladeszu"@pl, + "República Popular do Bangladexe"@pt, + "Republica Populară Bangladesh"@ro, + "Народная Республика Бангладеш"@ru, + "Bangladéšska ľudová republika"@sk, + "Ljudska republika Bangladeš"@sl, + "Folkrepubliken Bangladesh"@sv, + "Bangladeş Halk Cumhuriyeti"@tr, + "Народна Республіка Бангладеш"@uk, + "孟加拉人民共和国"@zh ; + skos:hiddenLabel "People's Republic of Bangladesh"@en, + "Bangladesh"@es, + "Bangladeshi"@et, + "bangladeshilainen"@fi, + "Daon-Phoblacht na Banglaidéise"@ga, + "an Bhanglaidéis"@ga, + "Bangladešo"@lt, + "Bangladešas"@lv, + "il-Bangladesh"@mt, + "ir-Repubblika tal-Poplu tal-Bangladesh"@mt, + "Bengalese"@nl, + "banglijskie"@pl, + "Bangladeche"@pt, + "República Popular do Bangladeche"@pt, + "bangladechiana"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "15"^^euvoc:EP, + "BD"^^euvoc:FD_010, + "BD"^^euvoc:FD_400, + ".bd"^^euvoc:IANA_DOMAIN, + "BD"^^euvoc:ISG_COU, + "BD"^^euvoc:ISO_3166_1_ALPHA_2, + "BGD"^^euvoc:ISO_3166_1_ALPHA_3, + "050"^^euvoc:ISO_3166_1_NUM, + "BGD"^^euvoc:NAC, + "880"^^euvoc:PHONE_PREFIX, + "BD"^^euvoc:TED, + "BD"^^euvoc:TED_SCHEMA, + "BD"^^euvoc:TIR, + "Southern Asia"^^euvoc:UNSD_GEOSCHEME, + "050"^^euvoc:UNSD_M49 ; + skos:prefLabel "بنجلاديش"@ar, + "Бангладеш"@bg, + "Bangladesh"@ca, + "Bangladéš"@cs, + "Bangladesh"@da, + "Bangladesch"@de, + "Μπανγκλαντές"@el, + "Bangladesh"@en, + "Bangladés"@es, + "Bangladesh"@et, + "Bangladesh"@fi, + "Bangladesh"@fr, + "An Bhanglaidéis"@ga, + "Bangladeš"@hr, + "Banglades"@hu, + "Bangladesh"@is, + "Bangladesh"@it, + "バングラデシュ"@ja, + "Bangladesch"@lb, + "Bangladešas"@lt, + "Bangladeša"@lv, + "Il-Bangladesh"@mt, + "Bangladesh"@nl, + "Bangladesh"@no, + "Bangladesz"@pl, + "Bangladexe"@pt, + "Bangladesh"@ro, + "Бангладеш"@ru, + "Bangladéš"@sk, + "Bangladeš"@sl, + "Bangladesh"@sv, + "Bangladeş"@tr, + "Бангладеш"@uk, + "孟加拉国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BHR" ; + at:deprecated "false" ; + at:op-code "BHR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BH" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "BRN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BH" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BRN" ; + dc:source "EurLex" ] ; + at:start.use "1976-12-16" ; + atold:op-code "BHR" ; + dc:identifier "BHR" ; + skos:altLabel "مملكة البحرين"@ar, + "Кралство Бахрейн"@bg, + "Regne de Bahrain"@ca, + "Království Bahrajn"@cs, + "Kongeriget Bahrain"@da, + "Königreich Bahrain"@de, + "Βασίλειο του Μπαχρέιν"@el, + "Kingdom of Bahrain"@en, + "Reino de Bahréin"@es, + "Bahreini Kuningriik"@et, + "Bahrainin kuningaskunta"@fi, + "Royaume de Bahreïn"@fr, + "Ríocht Bhairéin"@ga, + "Kraljevina Bahrein"@hr, + "Bahreini Királyság"@hu, + "Konungsríkið Barein"@is, + "Regno del Bahrein"@it, + "バーレーン王国"@ja, + "Kinnekräich Bahrain"@lb, + "Bahreino Karalystė"@lt, + "Bahreinas Karaliste"@lv, + "Ir-Renju tal-Bahrain"@mt, + "Koninkrijk Bahrein"@nl, + "Kongeriket Bahrain"@no, + "Królestwo Bahrajnu"@pl, + "Reino do Barém"@pt, + "Regatul Bahrain"@ro, + "Королевство Бахрейн"@ru, + "Bahrajnské kráľovstvo"@sk, + "Kraljevina Bahrajn"@sl, + "Konungariket Bahrain"@sv, + "Bahreyn Krallığı"@tr, + "Королівство Бахрейн"@uk, + "巴林王国"@zh ; + skos:hiddenLabel "Bahrein"@da, + "Kongeriget Bahrein"@da, + "Baréin"@es, + "Reino de Baréin"@es, + "bareiní"@es, + "Bahreini"@et, + "Bahreino"@lt, + "Bahreinas"@lv, + "Bahrainija"@mt, + "il-Bahrain"@mt, + "ir-Renju tal-Bahrain"@mt, + "bahrajńskie"@pl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "19"^^euvoc:EP, + "BRN"^^euvoc:FD_010, + "BRN"^^euvoc:FD_400, + ".bh"^^euvoc:IANA_DOMAIN, + "BH"^^euvoc:IBAN_COU, + "BH"^^euvoc:ISG_COU, + "BH"^^euvoc:ISO_3166_1_ALPHA_2, + "BHR"^^euvoc:ISO_3166_1_ALPHA_3, + "048"^^euvoc:ISO_3166_1_NUM, + "BHR"^^euvoc:NAC, + "973"^^euvoc:PHONE_PREFIX, + "BH"^^euvoc:TED, + "BH"^^euvoc:TED_SCHEMA, + "BRN"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "048"^^euvoc:UNSD_M49 ; + skos:prefLabel "البحرين"@ar, + "Бахрейн"@bg, + "Bahrain"@ca, + "Bahrajn"@cs, + "Bahrain"@da, + "Bahrain"@de, + "Μπαχρέιν"@el, + "Bahrain"@en, + "Bahréin"@es, + "Bahrein"@et, + "Bahrain"@fi, + "Bahreïn"@fr, + "Bairéin"@ga, + "Bahrein"@hr, + "Bahrein"@hu, + "Barein"@is, + "Bahrein"@it, + "バーレーン"@ja, + "Bahrain"@lb, + "Bahreinas"@lt, + "Bahreina"@lv, + "Il-Bahrain"@mt, + "Bahrein"@nl, + "Bahrain"@no, + "Bahrajn"@pl, + "Barém"@pt, + "Bahrain"@ro, + "Бахрейн"@ru, + "Bahrajn"@sk, + "Bahrajn"@sl, + "Bahrain"@sv, + "Bahreyn"@tr, + "Бахрейн"@uk, + "巴林"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BHS" ; + at:deprecated "false" ; + at:op-code "BHS" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "BS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BS" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "BS" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "BS" ; + dc:source "EurLex" ] ; + at:start.use "1973-07-10" ; + atold:op-code "BHS" ; + dc:identifier "BHS" ; + skos:altLabel "كومنولث جزر البهاما"@ar, + "Бахамски съюз"@bg, + "Commonwealth de les Bahames"@ca, + "Bahamské společenství"@cs, + "Commonwealth of the Bahamas"@da, + "Commonwealth der Bahamas"@de, + "Κοινοπολιτεία των Μπαχαμών"@el, + "Commonwealth of the Bahamas"@en, + "Commonwealth de las Bahamas"@es, + "Bahama Ühendus"@et, + "Bahaman yhteisö"@fi, + "Commonwealth des Bahamas"@fr, + "Comhlathas na mBahámaí"@ga, + "Bahamska Zajednica"@hr, + "Bahamai Közösség"@hu, + "Samveldið Bahamaeyjar"@is, + "Commonwealth delle Bahamas"@it, + "バハマ国"@ja, + "Commonwealth vun de Bahamas"@lb, + "Bahamų Sandrauga"@lt, + "Bahamu Salu Sadraudzība"@lv, + "Il-Commonwealth tal-Bahamas"@mt, + "Gemenebest van de Bahama’s"@nl, + "Bahamassambandet"@no, + "Wspólnota Bahamów"@pl, + "Comunidade das Baamas"@pt, + "Uniunea Bahamas"@ro, + "Содружество Багамы"@ru, + "Bahamské spoločenstvo"@sk, + "Skupnost Bahami"@sl, + "Samväldet Bahamas"@sv, + "Bahama Milletler Topluluğu"@tr, + "Співдружність Багамських Островів"@uk, + "巴哈马联邦"@zh ; + skos:hiddenLabel "Бахамска общност"@bg, + "Κοινοπολιτεία Μπαχαμών"@el, + "Μπαχαμών"@el, + "na Bahámaí"@ga, + "Zajednica Bahama"@hr, + "Bahamų"@lt, + "Bahamu Salu"@lv, + "il-Bahamas"@mt, + "il-Commonwealth tal-Bahamas"@mt, + "Bahama's"@nl, + "bahamskie"@pl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "23"^^euvoc:EP, + "BS"^^euvoc:FD_010, + "BS"^^euvoc:FD_140, + "BS"^^euvoc:FD_400, + ".bs"^^euvoc:IANA_DOMAIN, + "BS"^^euvoc:ISG_COU, + "BS"^^euvoc:ISO_3166_1_ALPHA_2, + "BHS"^^euvoc:ISO_3166_1_ALPHA_3, + "044"^^euvoc:ISO_3166_1_NUM, + "BHS"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "BS"^^euvoc:TED, + "BS"^^euvoc:TED_SCHEMA, + "BZ"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "044"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر البهاما"@ar, + "Бахамски острови"@bg, + "Bahames, les"@ca, + "Bahamy"@cs, + "Bahamas"@da, + "Bahamas"@de, + "Μπαχάμες"@el, + "Bahamas"@en, + "Bahamas"@es, + "Bahama"@et, + "Bahama"@fi, + "Bahamas"@fr, + "Na Bahámaí"@ga, + "Bahami"@hr, + "Bahama-szigetek"@hu, + "Bahamaeyjar"@is, + "Bahamas"@it, + "バハマ"@ja, + "Bahamas"@lb, + "Bahamos"@lt, + "Bahamu salas"@lv, + "Il-Bahamas"@mt, + "Bahama’s"@nl, + "Bahamas"@no, + "Bahamy"@pl, + "Baamas"@pt, + "Bahamas"@ro, + "Багамские Острова"@ru, + "Bahamy"@sk, + "Bahami"@sl, + "Bahamas"@sv, + "Bahamalar"@tr, + "Багамські Острови"@uk, + "巴哈马"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BIH" ; + at:deprecated "false" ; + at:op-code "BIH" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BOHE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BA" ; + dc:source "TED" ] ; + at:start.use "1992-03-01" ; + atold:op-code "BIH" ; + dc:identifier "BIH" ; + skos:altLabel "Bosnie-et-Herzégovine"@fr, + "Bosnia-Hercegovina"@no ; + skos:changeNote "Nationality ‘of Bosnia and Herzegovinia’ follows the ‘Interinstitutional Style Guide’, which gives the official name of citizenship or adjective validated by the Council in order to cover with one adjective the whole territory. In fact see Wikipedia, there are 2 nationalities in Bosnia and Herzegovina: Bosnian and Herzegovinian."@en, + "Opening event: Splitting of the ‘Socialist Federal Republic of Yugoslavia’ COU0060 into Republic of Slovenia COU0051, Republic of Croatia COU0026, Federal Republic of Yugoslavia COU0061, Bosnia and Herzegovina COU0004, Former Yugoslav Republic of Macedonia COU0040."@en ; + skos:hiddenLabel "Bosna a Herzegovina"@cs, + "Republika Bosna a Hercegovina"@cs, + "fra Bosnien-Hercegovina, bosnisk-hercegovinsk"@da, + "Republik Bosnien und Herzegowina"@de, + "Βοσνίας και Ερζεγοβίνης"@el, + "Δημοκρατία Βοσνίας και Ερζεγοβίνης"@el, + "Republic of Bosnia and Herzegowina"@en, + "Bosnia ja Hertsegoviina Vabariik"@et, + "de Bosnie-et-Herzégovine"@fr, + "an Bhoisnia agus an Heirseagaivéin"@ga, + "duine ón mBoisnia agus an Heirseagaivéin"@ga, + "Republika Bosna i Hercegovina"@hr, + "Bosznia és Hercegovina"@hu, + "Bosznia-hercegovinai Köztársaság"@hu, + "Bosnijas un Hercegovinas Republika"@lv, + "il-Bożnija-Ħerzegovina"@mt, + "bośniacko-hercegowińskie"@pl, + "Bosnia și Herțegovina"@ro, + "din Bosnia și Herțegovina"@ro, + "Republika Bosna a Hercegovina"@sk, + "Republika Bosna in Hercegovina"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "227"^^euvoc:EP, + "268"^^euvoc:EP, + "BOHE"^^euvoc:FD_010, + ".ba"^^euvoc:IANA_DOMAIN, + "BA"^^euvoc:IBAN_COU, + "BA"^^euvoc:ISG_COU, + "BA"^^euvoc:ISO_3166_1_ALPHA_2, + "BIH"^^euvoc:ISO_3166_1_ALPHA_3, + "070"^^euvoc:ISO_3166_1_NUM, + "BIH"^^euvoc:NAC, + "387"^^euvoc:PHONE_PREFIX, + "BA"^^euvoc:TED, + "BA"^^euvoc:TED_SCHEMA, + "BA"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "070"^^euvoc:UNSD_M49 ; + skos:prefLabel "البوسنة والهرسك"@ar, + "Боснія і Герцагавіна"@be, + "Босна и Херцеговина"@bg, + "Bosna i Hercegovina"@bs, + "Bòsnia i Hercegovina"@ca, + "Bosna a Hercegovina"@cs, + "Bosnien-Hercegovina"@da, + "Bosnien und Herzegowina"@de, + "Βοσνία και Ερζεγοβίνη"@el, + "Bosnia and Herzegovina"@en, + "Bosnia y Herzegovina"@es, + "Bosnia ja Hertsegoviina"@et, + "Bosnia-Herzegovina"@eu, + "Bosnia ja Hertsegovina"@fi, + "Bosnia-Hersegovina"@fo, + "Bosnie-Herzégovine"@fr, + "An Bhoisnia agus an Heirseagaivéin"@ga, + "Bosnia e Hercegovina"@gl, + "Bosna i Hercegovina"@hr, + "Bosznia-Hercegovina"@hu, + "Bosnía og Hersegóvína"@is, + "Bosnia-Erzegovina"@it, + "ボスニア・ヘルツェゴビナ"@ja, + "Bosnien-Herzegowina"@lb, + "Bosnija ir Hercegovina"@lt, + "Bosnija un Hercegovina"@lv, + "Босна и Херцеговина"@mk, + "Il-Bożnija-Ħerzegovina"@mt, + "Bosnië en Herzegovina"@nl, + "Bosnia og Herzegovina"@no, + "Bośnia i Hercegowina"@pl, + "Bósnia-Herzegovina"@pt, + "Bosnia-Erzegovina"@rm, + "Bosnia şi Herţegovina"@ro, + "Босния и Герцеговина"@ru, + "Bosna a Hercegovina"@sk, + "Bosna in Hercegovina"@sl, + "Bosnja dhe Hercegovina"@sq, + "Босна и Херцеговина"@sr, + "Bosnien och Hercegovina"@sv, + "Bosna Hersek"@tr, + "Боснія і Герцеговина"@uk, + "波斯尼亚和黑塞哥维那"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BLM" ; + at:deprecated "false" ; + at:op-code "BLM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BL" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "BL" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "2007-07-15" ; + atold:op-code "BLM" ; + dc:identifier "BLM" ; + skos:altLabel "التجمع الإقليمي لسانت بارتيليمي"@ar, + "Общност Сен Бартелеми"@bg, + "Col·lectivitat de Saint Barthélemy"@ca, + "Společenství Saint-Barthélemy"@cs, + "Det Oversøiske Område Saint-Barthélemy"@da, + "Körperschaft St. Barthélemy"@de, + "Εδαφική οντότητα του Αγίου Βαρθολομαίου"@el, + "Collectivity of Saint Barthélemy"@en, + "St. Barth’s"@en, + "St. Barts"@en, + "Colectividad de San Bartolomé"@es, + "Saint-Barthélemy ühendus"@et, + "Saint-Barthélemyn yhteisö"@fi, + "Collectivité de Saint-Barthélemy"@fr, + "Saint-Barth"@fr, + "Comhroinn Saint-Barthélemy"@ga, + "Zajednica Sveti Bartolomej"@hr, + "Saint-Barthélemy térségi önkormányzat"@hu, + "Collettività di Saint-Barthélemy"@it, + "サン=バルテルミー共同体"@ja, + "Kierperschaft Saint Barthélemy"@lb, + "Sen Bartelemi Bendrija"@lt, + "Senbartelmī kopiena"@lv, + "Il-Kollettività ta’ Saint Barthélemy"@mt, + "Gemeenschap Saint-Barthélemy"@nl, + "Saint-Barthélemy"@no, + "Zbiorowość Saint-Barthélemy"@pl, + "Colectividade de São Bartolomeu"@pt, + "Colectivitatea Saint Barthélemy"@ro, + "Сообщество Сен-Бартелеми"@ru, + "Spoločenstvo Svätý Bartolomej"@sk, + "Skupnost Sveti Bartolomej"@sl, + "Förvaltningsområdet Saint-Barthélemy"@sv, + "Saint Barthélemy Kolektivitesi"@tr, + "Спільнота Сен-Бартелемі"@uk, + "圣巴泰勒米集体"@zh ; + skos:broader ; + skos:changeNote "Saint Barthélemy will cease to be an outermost region and become an overseas country and territory on 1 January 2012."@en, + "Wikipedia: On 22 February 2007, Saint Barthélemy and Saint Martin were broken away from the French overseas department of Guadeloupe to be formed into two new overseas collectivities. As a consequence their status was unclear for a time. While a report issued by the French parliament suggested that both islands would probably have to change from being outermost regions OMR status to overseas countries and territories OCT status, the EU Treaties as amended by the Treaty of Lisbon lists them as outermost regions see articles 349 and 355 of the consolidated version of the Treaty on the Functioning of the European Union."@en ; + skos:hiddenLabel "Svatý Bartoloměj"@cs, + "Saint-Barthélemy"@da, + "Αγίου Βαρθολομαίου"@el, + "Saint-Barthélemy"@en, + "ranskalainen, saintbarthélemylainen"@fi, + "française"@fr, + "duine ó Saint-Barthélemy"@ga, + "Saint Barthélemya"@hr, + "Saint-Barthélemy Közösség"@hu, + "saint-barthélemyi"@hu, + "il-Kolletività ta' Saint Barthélemy"@mt, + "minn Saint Barthélemy"@mt, + "Gemeenschap Saint-Barthélémy"@nl, + "Saint-Barthélémy"@nl, + "van Saint-Barthélémy"@nl, + "Wspólnota Saint-Barthélemy"@pl, + "Coletividade de São Bartolomeu"@pt, + "Colectivitatea Saint-Barthélemy"@ro, + "Saint-Barthélemy"@ro, + "Saint-Barthélemyja"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "286"^^euvoc:EP, + ".bl"^^euvoc:IANA_DOMAIN, + "BL"^^euvoc:ISG_COU, + "BL"^^euvoc:ISO_3166_1_ALPHA_2, + "BLM"^^euvoc:ISO_3166_1_ALPHA_3, + "652"^^euvoc:ISO_3166_1_NUM, + "BLM"^^euvoc:NAC, + "BL"^^euvoc:TED, + "BL"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "652"^^euvoc:UNSD_M49 ; + skos:prefLabel "سانت بارتيليمي"@ar, + "Сен Бартелеми"@bg, + "Saint Barthélemy"@ca, + "Saint-Barthélemy"@cs, + "Saint-Barthélémy"@da, + "St. Barthélemy"@de, + "Άγιος Βαρθολομαίος"@el, + "Saint Barthélemy"@en, + "San Bartolomé"@es, + "Saint-Barthélemy"@et, + "Saint-Barthélemy"@fi, + "Saint-Barthélemy"@fr, + "Saint-Barthélemy"@ga, + "Sveti Bartolomej"@hr, + "Saint-Barthélemy"@hu, + "Sankti Bartólómeusareyjar"@is, + "Saint-Barthélemy"@it, + "サン・バルテルミー"@ja, + "Saint-Barthélemy"@lb, + "Sen Bartelemi"@lt, + "Senbartelmī"@lv, + "Saint Barthélemy"@mt, + "Saint-Barthélemy"@nl, + "Saint Barthélemy"@no, + "Saint-Barthélemy"@pl, + "São Bartolomeu"@pt, + "Saint Barthélemy"@ro, + "Сен-Бартелеми"@ru, + "Svätý Bartolomej"@sk, + "Sveti Bartolomej"@sl, + "Saint-Barthélemy"@sv, + "Saint Barthelemy"@tr, + "Сен-Бартелемі"@uk, + "圣巴泰勒米"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "BLR" ; + at:deprecated "false" ; + at:op-code "BLR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BY" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "BY" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BYS" ; + dc:source "EurLex" ] ; + at:start.use "1991-08-25" ; + atold:op-code "BLR" ; + dc:identifier "BLR" ; + skos:altLabel "جمهورية بيلاروس"@ar, + "Рэспу́бліка Белару́сь"@be, + "Република Беларус"@bg, + "Republika Bjelorusija"@bs, + "República de Bielorússia"@ca, + "Běloruská republika"@cs, + "Republikken Hviderusland"@da, + "Republik Belarus"@de, + "Δημοκρατία της Λευκορωσίας"@el, + "Republic of Belarus"@en, + "Belarús"@es, + "República de Bielorrusia"@es, + "Valgevene Vabariik"@et, + "Bielorrusiako Errepublika"@eu, + "Valko-Venäjän tasavalta"@fi, + "Lýðveldið Hvítarussland"@fo, + "Belarus"@fr, + "République de Biélorussie"@fr, + "Poblacht na Bealarúise"@ga, + "República de Bielorrusia"@gl, + "Republika Bjelarus"@hr, + "Belarusz Köztársaság/Fehérorosz Köztársaság"@hu, + "Fehéroroszország"@hu, + "Lýðveldið Belarús"@is, + "Repubblica di Bielorussia"@it, + "Russia Bianca"@it, + "ベラルーシ共和国"@ja, + "Republik Belarus"@lb, + "Baltarusijos Respublika"@lt, + "Baltkrievijas Republika"@lv, + "Република Белорусија"@mk, + "Ir-Repubblika tal-Belarussja"@mt, + "Republiek Belarus"@nl, + "Republikken Hviterussland"@no, + "Republika Białorusi"@pl, + "República da Bielorrússia"@pt, + "Republica da la Bielorussia"@rm, + "Republica Belarus"@ro, + "Республика Беларусь"@ru, + "Bieloruská republika"@sk, + "Republika Belorusija"@sl, + "Republika Bjelloruse"@sq, + "Република Белорусија"@sr, + "Republiken Belarus"@sv, + "Belarus Cumhuriyeti"@tr, + "Республіка Білорусь"@uk, + "白俄罗斯共和国"@zh ; + skos:changeNote "Interinstitutionelle Regeln für Veröffentlichungen: Belarus: Im amtlichen zwischenstaatlichen Schriftverkehr. Die Republik Weißrussland im innerstaatlichen Schriftverkehr sowie auf Landkarten und dergleichen."@de, + "Libro de estilo interinstitucional: Belarús: El Gobierno de este país prefiere la forma Belarús, que tiende a generalizarse, sobre todo en contextos oficiales, en detrimento de la tradicional, Bielorrusia."@es, + "Style Guide: Belarusz: Nemzetközi megállapodásokban használatos elnevezés."@hu, + "Interinstitutionele schrijfwijzer: Belarus: In niet-officiële teksten meestal Wit-Rusland genoemd."@nl, + "Código de Redação Interinstitucional: Bielorrússia: República de Belarus para efeitos protocolares."@pt ; + skos:hiddenLabel "Bielorrussia"@es, + "République du Belarus"@fr, + "an Bhealarúis"@ga, + "Bjelorusija"@hr, + "Belarusz Köztársaság"@hu, + "Baltarusijos"@lt, + "Baltkrievijas"@lv, + "il-Belarussja"@mt, + "ir-Repubblika tal-Belarussja"@mt, + "Belarus / Wit-Rusland"@nl, + "Republiken Vitryssland"@sv, + "Vitryssland"@sv, + "vitrysk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "256"^^euvoc:EP, + "BYS"^^euvoc:FD_010, + ".by"^^euvoc:IANA_DOMAIN, + "BY"^^euvoc:IBAN_COU, + "BY"^^euvoc:ISG_COU, + "BY"^^euvoc:ISO_3166_1_ALPHA_2, + "BLR"^^euvoc:ISO_3166_1_ALPHA_3, + "112"^^euvoc:ISO_3166_1_NUM, + "BLR"^^euvoc:NAC, + "375"^^euvoc:PHONE_PREFIX, + "BY"^^euvoc:TED, + "BY"^^euvoc:TED_SCHEMA, + "BY"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "112"^^euvoc:UNSD_M49 ; + skos:prefLabel "بيلاروسيا"@ar, + "Беларусь"@be, + "Беларус"@bg, + "Bjelorusija"@bs, + "Bielorússia"@ca, + "Bělorusko"@cs, + "Hviderusland"@da, + "Belarus"@de, + "Λευκορωσία"@el, + "Belarus"@en, + "Bielorrusia"@es, + "Valgevene"@et, + "Bielorrusia"@eu, + "Valko-Venäjä"@fi, + "Hvítarussland"@fo, + "Biélorussie"@fr, + "An Bhealarúis"@ga, + "Bielorrusia"@gl, + "Bjelarus"@hr, + "Belarusz"@hu, + "Belarús (Hvíta-Rússland)"@is, + "Bielorussia"@it, + "ベラルーシ"@ja, + "Belarus"@lb, + "Baltarusija"@lt, + "Baltkrievija"@lv, + "Белорусија"@mk, + "Il-Belarussja"@mt, + "Belarus"@nl, + "Belarus"@no, + "Białoruś"@pl, + "Bielorrússia"@pt, + "Bielorussia"@rm, + "Belarus"@ro, + "Беларусь"@ru, + "Bielorusko"@sk, + "Belorusija"@sl, + "Bjellorusia"@sq, + "Белорусија"@sr, + "Belarus"@sv, + "Belarus"@tr, + "Білорусь"@uk, + "白俄罗斯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BLZ" ; + at:deprecated "false" ; + at:op-code "BLZ" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BZ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "BELIZE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BZ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BH" ; + dc:source "EurLex" ] ; + at:start.use "1981-09-21" ; + atold:op-code "BLZ" ; + dc:identifier "BLZ" ; + skos:hiddenLabel "Belize'i"@et, + "bélizienne"@fr, + "an Bheilís"@ga, + "Belizea"@hr, + "Belizo"@lt, + "Belizas"@lv, + "il-Belize"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "28"^^euvoc:EP, + "BH"^^euvoc:FD_010, + "BELIZE"^^euvoc:FD_400, + ".bz"^^euvoc:IANA_DOMAIN, + "BZ"^^euvoc:ISG_COU, + "BZ"^^euvoc:ISO_3166_1_ALPHA_2, + "BLZ"^^euvoc:ISO_3166_1_ALPHA_3, + "084"^^euvoc:ISO_3166_1_NUM, + "BLZ"^^euvoc:NAC, + "501"^^euvoc:PHONE_PREFIX, + "BZ"^^euvoc:TED, + "BZ"^^euvoc:TED_SCHEMA, + "BZ"^^euvoc:TIR, + "Central America"^^euvoc:UNSD_GEOSCHEME, + "084"^^euvoc:UNSD_M49 ; + skos:prefLabel "بليز"@ar, + "Белиз"@bg, + "Belize"@ca, + "Belize"@cs, + "Belize"@da, + "Belize"@de, + "Μπελίζ"@el, + "Belize"@en, + "Belice"@es, + "Belize"@et, + "Belize"@fi, + "Belize"@fr, + "An Bheilís"@ga, + "Belize"@hr, + "Belize"@hu, + "Belís"@is, + "Belize"@it, + "ベリーズ"@ja, + "Belize"@lb, + "Belizas"@lt, + "Beliza"@lv, + "Il-Belize"@mt, + "Belize"@nl, + "Belize"@no, + "Belize"@pl, + "Belize"@pt, + "Belize"@ro, + "Белиз"@ru, + "Belize"@sk, + "Belize"@sl, + "Belize"@sv, + "Belize"@tr, + "Беліз"@uk, + "伯利兹"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BMU" ; + at:deprecated "false" ; + at:op-code "BMU" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "BM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BM" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "BM" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "BMU" ; + dc:identifier "BMU" ; + skos:altLabel "Bermudas"@de, + "Bermuda asumaa"@et ; + skos:broader ; + skos:hiddenLabel "Бермуда"@bg, + "Βερμουδών"@el, + "britannialainen, bermudalainen"@fi, + "Beirmiúdach"@ga, + "Bermudski Otoci"@hr, + "Bermudskih Otoka"@hr, + "Bermudos"@lt, + "Bermudu Salu"@lv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "209"^^euvoc:EP, + "BM"^^euvoc:FD_140, + ".bm"^^euvoc:IANA_DOMAIN, + "BM"^^euvoc:ISG_COU, + "BM"^^euvoc:ISO_3166_1_ALPHA_2, + "BMU"^^euvoc:ISO_3166_1_ALPHA_3, + "060"^^euvoc:ISO_3166_1_NUM, + "BMU"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "BM"^^euvoc:TED, + "BM"^^euvoc:TED_SCHEMA, + "BM"^^euvoc:TIR, + "Northern America"^^euvoc:UNSD_GEOSCHEME, + "060"^^euvoc:UNSD_M49 ; + skos:prefLabel "برمودا"@ar, + "Бермудски острови"@bg, + "Bermudes"@ca, + "Bermudy"@cs, + "Bermuda"@da, + "Bermuda"@de, + "Βερμούδες"@el, + "Bermuda"@en, + "Bermudas"@es, + "Bermuda"@et, + "Bermuda"@fi, + "Bermudes"@fr, + "Beirmiúda"@ga, + "Bermudi"@hr, + "Bermuda"@hu, + "Bermúda"@is, + "Bermuda"@it, + "バミューダ"@ja, + "Bermuda"@lb, + "Bermuda"@lt, + "Bermudu salas"@lv, + "Bermuda"@mt, + "Bermuda"@nl, + "Bermuda"@no, + "Bermudy"@pl, + "Bermudas"@pt, + "Bermuda"@ro, + "Бермудские Острова"@ru, + "Bermudy"@sk, + "Bermudi"@sl, + "Bermuda"@sv, + "Bermuda"@tr, + "Бермудські Острови"@uk, + "百慕大"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "BOL" ; + at:deprecated "false" ; + at:op-code "BOL" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BOL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BO" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "BOL" ; + dc:identifier "BOL" ; + skos:altLabel "دولة بوليفيا المتعددة القوميات"@ar, + "Wuliwya"@ay, + "Многонационална държава Боливия"@bg, + "Estat Plurinacional de Bolívia"@ca, + "Mnohonárodní stát Bolívie"@cs, + "Den Flernationale Stat Bolivia"@da, + "Plurinationale Staat Bolivien"@de, + "Πολυεθνοτικό Κράτος της Βολιβίας"@el, + "Plurinational State of Bolivia"@en, + "Estado Plurinacional de Bolivia"@es, + "Boliivia Paljurahvuseline Riik"@et, + "Bolivian monikansainen valtio"@fi, + "État plurinational de Bolivie"@fr, + "Stát Ilnáisiúnach na Bolaive"@ga, + "Volívia"@gn, + "Višenacionalna Država Bolivija"@hr, + "Többnemzetiségű Bolíviai Állam"@hu, + "Fjölþjóðaríkið Bólivía"@is, + "Stato plurinazionale di Bolivia"@it, + "ボリビア多民族国"@ja, + "Plurinationale Staat Bolivien"@lb, + "Bolivijos Daugiatautė Valstybė"@lt, + "Bolīvijas Daudznāciju Valsts"@lv, + "L-Istat Plurinazzjonali tal-Bolivja"@mt, + "Plurinationale Staat Bolivia"@nl, + "Den flernasjonale stat Bolivia"@no, + "Wielonarodowe Państwo Boliwii"@pl, + "Estado Plurinacional da Bolívia"@pt, + "Bulivya"@qu, + "Statul Plurinaţional al Boliviei"@ro, + "Многонациональное Государство Боливия"@ru, + "Bolívijský mnohonárodný štát"@sk, + "Večnacionalna država Bolivija"@sl, + "Mångnationella staten Bolivia"@sv, + "Bolivya Çok Uluslu Devleti"@tr, + "Багатонаціональна Держава Болівія"@uk, + "多民族玻利维亚国"@zh ; + skos:hiddenLabel "Plurinationaler Staat Bolivien"@de, + "Πολυεθνοτικό κράτος της Βολιβίας"@el, + "βολιβιανή"@el, + "Republic of Bolivia"@en, + "République de Bolivie"@fr, + "Stát Ilnáisiún na Bolaive"@ga, + "an Bholaiv"@ga, + "Bolivijos"@lt, + "Bolīvijas"@lv, + "Bolīvijas Republika"@lv, + "il-Bolivja"@mt, + "l-Istat Plurinazzjonali tal-Bolivja"@mt, + "Wielonarodowe Państwo Boliwia"@pl, + "boliwiijskie"@pl, + "Statul Plurinațional al Boliviei"@ro, + "Bolívijský mnohonárodný štát"@sk ; + skos:inScheme atold:country, + , + , + ; + skos:notation "21"^^euvoc:EP, + "BOL"^^euvoc:FD_010, + ".bo"^^euvoc:IANA_DOMAIN, + "BO"^^euvoc:ISG_COU, + "BO"^^euvoc:ISO_3166_1_ALPHA_2, + "BOL"^^euvoc:ISO_3166_1_ALPHA_3, + "068"^^euvoc:ISO_3166_1_NUM, + "BOL"^^euvoc:NAC, + "591"^^euvoc:PHONE_PREFIX, + "BO"^^euvoc:TED, + "BO"^^euvoc:TED_SCHEMA, + "BO"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "068"^^euvoc:UNSD_M49 ; + skos:prefLabel "بوليفيا"@ar, + "Боливия"@bg, + "Bolívia"@ca, + "Bolívie"@cs, + "Bolivia"@da, + "Bolivien"@de, + "Βολιβία"@el, + "Bolivia"@en, + "Bolivia"@es, + "Boliivia"@et, + "Bolivia"@fi, + "Bolivie"@fr, + "An Bholaiv"@ga, + "Bolivija"@hr, + "Bolívia"@hu, + "Bólivía"@is, + "Bolivia"@it, + "ボリビア"@ja, + "Bolivien"@lb, + "Bolivija"@lt, + "Bolīvija"@lv, + "Il-Bolivja"@mt, + "Bolivia"@nl, + "Bolivia"@no, + "Boliwia"@pl, + "Bolívia"@pt, + "Bolivia"@ro, + "Боливия"@ru, + "Bolívia"@sk, + "Bolivija"@sl, + "Bolivia"@sv, + "Bolivya"@tr, + "Болівія"@uk, + "玻利维亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BRA" ; + at:deprecated "false" ; + at:op-code "BRA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "BR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "BR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BR" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "BRA" ; + dc:identifier "BRA" ; + skos:altLabel "جمهورية ألمانيا الاتحادية"@ar, + "Федеративна република Бразилия"@bg, + "República Federativa del Brasil"@ca, + "Brazilská federativní republika"@cs, + "Den Føderative Republik Brasilien"@da, + "Föderative Republik Brasilien"@de, + "Ομόσπονδη Δημοκρατία της Βραζιλίας"@el, + "Federative Republic of Brazil"@en, + "República Federativa de Brasil"@es, + "Brasiilia Liitvabariik"@et, + "Brasilian liittotasavalta"@fi, + "République fédérative du Brésil"@fr, + "Poblacht Chónaidhmitheach na Brasaíle"@ga, + "Federativna Republika Brazill"@hr, + "Brazil Szövetségi Köztársaság"@hu, + "Sambandslýðveldið Brasilía"@is, + "Repubblica federativa del Brasile"@it, + "ブラジル連邦共和国"@ja, + "Federativ Republik Brasilien"@lb, + "Brazilijos Federacinė Respublika"@lt, + "Brazīlijas Federatīvā Republika"@lv, + "Ir-Repubblika Federattiva tal-Brażil"@mt, + "Federale Republiek Brazilië"@nl, + "Forbundsrepublikken Brasil"@no, + "Federacyjna Republika Brazylii"@pl, + "República Federativa do Brasil"@pt, + "Republica Federativă a Braziliei"@ro, + "Федеративная Республика Бразилия"@ru, + "Brazílska federatívna republika"@sk, + "Federativna republika Brazilija"@sl, + "Förbundsrepubliken Brasilien"@sv, + "Brezilya Federatif Cumhuriyeti"@tr, + "Федеративна Республіка Бразилія"@uk, + "巴西联邦共和国"@zh ; + skos:hiddenLabel "Ομοσπονδιακή Δημοκρατία της Βραζιλίας"@el, + "an Bhrasaíl"@ga, + "Savezna Republika Brazil"@hr, + "Brazilijos"@lt, + "Brazīlijas"@lv, + "il-Brażil"@mt, + "ir-Repubblika Federattiva tal-Brażil"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "22"^^euvoc:EP, + "BR"^^euvoc:FD_010, + "BR"^^euvoc:FD_140, + "BR"^^euvoc:FD_400, + ".br"^^euvoc:IANA_DOMAIN, + "BR"^^euvoc:IBAN_COU, + "BR"^^euvoc:ISG_COU, + "BR"^^euvoc:ISO_3166_1_ALPHA_2, + "BRA"^^euvoc:ISO_3166_1_ALPHA_3, + "076"^^euvoc:ISO_3166_1_NUM, + "BRA"^^euvoc:NAC, + "55"^^euvoc:PHONE_PREFIX, + "BR"^^euvoc:TED, + "BR"^^euvoc:TED_SCHEMA, + "BR"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "076"^^euvoc:UNSD_M49 ; + skos:prefLabel "البرازيل"@ar, + "Бразилия"@bg, + "Brasil"@ca, + "Brazílie"@cs, + "Brasilien"@da, + "Brasilien"@de, + "Βραζιλία"@el, + "Brazil"@en, + "Brasil"@es, + "Brasiilia"@et, + "Brasilia"@fi, + "Brésil"@fr, + "An Bhrasaíl"@ga, + "Brazil"@hr, + "Brazília"@hu, + "Brasilía"@is, + "Brasile"@it, + "ブラジル"@ja, + "Brasilien"@lb, + "Brazilija"@lt, + "Brazīlija"@lv, + "Il-Brażil"@mt, + "Brazilië"@nl, + "Brasil"@no, + "Brazylia"@pl, + "Brasil"@pt, + "Brazilia"@ro, + "Бразилия"@ru, + "Brazília"@sk, + "Brazilija"@sl, + "Brasilien"@sv, + "Brezilya"@tr, + "Бразилія"@uk, + "巴西"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BRB" ; + at:deprecated "false" ; + at:op-code "BRB" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BB" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "BB" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "BDS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "BB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BDS" ; + dc:source "EurLex" ] ; + at:start.use "1966-11-30" ; + atold:op-code "BRB" ; + dc:identifier "BRB" ; + skos:altLabel "Isola Barbados"@it ; + skos:hiddenLabel "Μπαρμπάντος"@el, + "Barbadose"@et, + "Barbadosa"@hr, + "Barbadoso"@lt, + "Barbadosas"@lv ; + skos:historyNote "Barbados changed its state form into republic on 31 November 2021. The head of state is not the Queen of the Commonwealth anymore but the President of the Republic. The country name remained unchanged."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "14"^^euvoc:EP, + "BDS"^^euvoc:FD_010, + "BB"^^euvoc:FD_140, + "BDS"^^euvoc:FD_400, + ".bb"^^euvoc:IANA_DOMAIN, + "BB"^^euvoc:ISG_COU, + "BB"^^euvoc:ISO_3166_1_ALPHA_2, + "BRB"^^euvoc:ISO_3166_1_ALPHA_3, + "052"^^euvoc:ISO_3166_1_NUM, + "BRB"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "BB"^^euvoc:TED, + "BB"^^euvoc:TED_SCHEMA, + "BB"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "052"^^euvoc:UNSD_M49 ; + skos:prefLabel "باربادوس"@ar, + "Барбадос"@bg, + "Barbados"@ca, + "Barbados"@cs, + "Barbados"@da, + "Barbados"@de, + "Μπαρμπέιντος"@el, + "Barbados"@en, + "Barbados"@es, + "Barbados"@et, + "Barbados"@fi, + "Barbade"@fr, + "Barbadós"@ga, + "Barbados"@hr, + "Barbados"@hu, + "Barbados"@is, + "Barbados"@it, + "バルバドス"@ja, + "Barbados"@lb, + "Barbadosas"@lt, + "Barbadosa"@lv, + "Barbados"@mt, + "Barbados"@nl, + "Barbados"@no, + "Barbados"@pl, + "Barbados"@pt, + "Barbados"@ro, + "Барбадос"@ru, + "Barbados"@sk, + "Barbados"@sl, + "Barbados"@sv, + "Barbados"@tr, + "Барбадос"@uk, + "巴巴多斯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BRN" ; + at:deprecated "false" ; + at:op-code "BRN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BRU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BN" ; + dc:source "TED" ] ; + at:start.use "1984-01-01" ; + atold:op-code "BRN" ; + dc:identifier "BRN" ; + skos:altLabel "بروناي دار السلام"@ar, + "Бруней Даруссалам"@bg, + "Brunei Darussalam"@ca, + "Brunej Darussalam"@cs, + "Negara Brunei Darussalam"@da, + "Brunei Darussalam"@de, + "Σουλτανάτο του Μπρουνέι"@el, + "Brunei Darussalam"@en, + "Brunéi Darussalam"@es, + "Brunei Darussalami Riik"@et, + "Brunei Darussalamin valtio"@fi, + "Brunei Darussalam"@fr, + "Brúiné Darasalám"@ga, + "Brunej Darussalam"@hr, + "Brunei Darussalam Állam"@hu, + "Brúnei Darrússalam"@is, + "Negara Brunei Darussalam"@it, + "Sultanato del Brunei Darussalam"@it, + "ブルネイ・ダルサラーム国"@ja, + "Brunei Darussalam"@lb, + "Brunėjaus Darusalamas"@lt, + "Brunejas Darusalamas Valsts"@lv, + "Il-Brunei Darussalam"@mt, + "Brunei Darussalam"@nl, + "Brunei Darussalam"@no, + "Państwo Brunei Darussalam"@pl, + "Estado do Brunei Darussalã"@pt, + "Statul Brunei Darussalam"@ro, + "Бруней-Даруссалам"@ru, + "Brunejsko-darussalamský štát"@sk, + "Država Brunej"@sl, + "Brunei Darussalam"@sv, + "Bruney Darüsselam"@tr, + "Бруней-Даруссалам"@uk, + "文莱达鲁萨兰国"@zh, + "Brunei"@zlm ; + skos:hiddenLabel "Κράτος του Μπρουνέι, κατοικία της ειρήνης"@el, + "Negara Brunei Darussalam"@en, + "Estado de Brunéi Darusalam"@es, + "Brunei Darussalam, Brunei Darussalamin valtio"@fi, + "Negara Brunei Darussalam"@fr, + "Brunėjaus"@lt, + "Brunejas"@lv, + "il-Brunei"@mt, + "il-Brunei Darussalam"@mt, + "Staat Brunei Darussalam"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "20"^^euvoc:EP, + "BRU"^^euvoc:FD_010, + ".bn"^^euvoc:IANA_DOMAIN, + "BN"^^euvoc:ISG_COU, + "BN"^^euvoc:ISO_3166_1_ALPHA_2, + "BRN"^^euvoc:ISO_3166_1_ALPHA_3, + "096"^^euvoc:ISO_3166_1_NUM, + "BRN"^^euvoc:NAC, + "673"^^euvoc:PHONE_PREFIX, + "BN"^^euvoc:TED, + "BN"^^euvoc:TED_SCHEMA, + "BRU"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "096"^^euvoc:UNSD_M49 ; + skos:prefLabel "بروناي"@ar, + "Бруней"@bg, + "Brunei"@ca, + "Brunej"@cs, + "Brunei"@da, + "Brunei"@de, + "Μπρουνέι"@el, + "Brunei"@en, + "Brunéi"@es, + "Brunei"@et, + "Brunei"@fi, + "Brunei"@fr, + "Brúiné"@ga, + "Brunej"@hr, + "Brunei"@hu, + "Brúnei"@is, + "Brunei"@it, + "ブルネイ"@ja, + "Brunei"@lb, + "Brunėjus"@lt, + "Bruneja"@lv, + "Il-Brunei"@mt, + "Brunei"@nl, + "Brunei"@no, + "Brunei"@pl, + "Brunei"@pt, + "Brunei"@ro, + "Бруней"@ru, + "Brunej"@sk, + "Brunej"@sl, + "Brunei"@sv, + "Bruney"@tr, + "Бруні"@uk, + "文莱"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BTN" ; + at:deprecated "false" ; + at:op-code "BTN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BT" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "BT" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "BH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "BT" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "BTN" ; + dc:identifier "BTN" ; + skos:altLabel "مملكة بوتان"@ar, + "Кралство Бутан"@bg, + "Regne de Bhutan"@ca, + "Bhútánské království"@cs, + "Kongeriget Bhutan"@da, + "Königreich Bhutan"@de, + "འབྲུག་ཡུལ་"@dz, + "Βασίλειο του Μπουτάν"@el, + "Kingdom of Bhutan"@en, + "Reino de Bhután"@es, + "Bhutani Kuningriik"@et, + "Bhutanin kuningaskunta"@fi, + "Royaume du Bhoutan"@fr, + "Ríocht na Bútáine"@ga, + "Kraljevina Butan"@hr, + "Bhutáni Királyság"@hu, + "Konungsríkið Bútan"@is, + "Regno del Bhutan"@it, + "ブータン王国"@ja, + "Kinnekräich Bhutan"@lb, + "Butano Karalystė"@lt, + "Butānas Karaliste"@lv, + "Ir-Renju tal-Bhutan"@mt, + "Koninkrijk Bhutan"@nl, + "Kongeriket Bhutan"@no, + "Królestwo Bhutanu"@pl, + "Reino do Butão"@pt, + "Regatul Bhutan"@ro, + "Королевство Бутан"@ru, + "Bhutánske kráľovstvo"@sk, + "Kraljevina Butan"@sl, + "Konungariket Bhutan"@sv, + "Butan Krallığı"@tr, + "Королівство Бутан"@uk, + "不丹王国"@zh ; + skos:hiddenLabel "Bután"@es, + "Reino de Bután"@es, + "butanesa"@es, + "Bhutani"@et, + "an Bhútáin"@ga, + "Butano"@lt, + "Butānas"@lv, + "il-Bhutan"@mt, + "ir-Renju tal-Bhutan"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "24"^^euvoc:EP, + "BT"^^euvoc:FD_010, + "BH"^^euvoc:FD_050, + "BT"^^euvoc:FD_400, + ".bt"^^euvoc:IANA_DOMAIN, + "BT"^^euvoc:ISG_COU, + "BT"^^euvoc:ISO_3166_1_ALPHA_2, + "BTN"^^euvoc:ISO_3166_1_ALPHA_3, + "064"^^euvoc:ISO_3166_1_NUM, + "BTN"^^euvoc:NAC, + "975"^^euvoc:PHONE_PREFIX, + "BT"^^euvoc:TED, + "BT"^^euvoc:TED_SCHEMA, + "BT"^^euvoc:TIR, + "Southern Asia"^^euvoc:UNSD_GEOSCHEME, + "064"^^euvoc:UNSD_M49 ; + skos:prefLabel "بوتان"@ar, + "Бутан"@bg, + "Bhutan"@ca, + "Bhútán"@cs, + "Bhutan"@da, + "Bhutan"@de, + "Μπουτάν"@el, + "Bhutan"@en, + "Bhután"@es, + "Bhutan"@et, + "Bhutan"@fi, + "Bhoutan"@fr, + "An Bhútáin"@ga, + "Butan"@hr, + "Bhután"@hu, + "Bútan"@is, + "Bhutan"@it, + "ブータン"@ja, + "Bhutan"@lb, + "Butanas"@lt, + "Butāna"@lv, + "Il-Bhutan"@mt, + "Bhutan"@nl, + "Bhutan"@no, + "Bhutan"@pl, + "Butão"@pt, + "Bhutan"@ro, + "Бутан"@ru, + "Bhután"@sk, + "Butan"@sl, + "Bhutan"@sv, + "Butan"@tr, + "Бутан"@uk, + "不丹"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "BWA" ; + at:deprecated "false" ; + at:op-code "BWA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "BW" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "BW" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RB" ; + dc:source "EurLex" ] ; + at:start.use "1966-09-30" ; + atold:op-code "BWA" ; + dc:identifier "BWA" ; + skos:altLabel "جمهورية بوتسوانا"@ar, + "Република Ботсуана"@bg, + "República de Botswana"@ca, + "Republika Botswana"@cs, + "Republikken Botswana"@da, + "Republik Botsuana"@de, + "Δημοκρατία της Μποτσουάνας"@el, + "Republic of Botswana"@en, + "República de Botsuana"@es, + "Botswana Vabariik"@et, + "Botswanan tasavalta"@fi, + "République du Botswana"@fr, + "Poblacht na Botsuáine"@ga, + "Republika Bocvana"@hr, + "Botswanai Köztársaság"@hu, + "Lýðveldið Botsvana"@is, + "Repubblica del Botswana"@it, + "ボツワナ共和国"@ja, + "Republik Botswana"@lb, + "Botsvanos Respublika"@lt, + "Botsvānas Republika"@lv, + "Ir-Repubblika tal-Botswana"@mt, + "Republiek Botswana"@nl, + "Republikken Botswana"@no, + "Republika Botswany"@pl, + "República do Botsuana"@pt, + "Republica Botswana"@ro, + "Республика Ботсвана"@ru, + "Botswanská republika"@sk, + "Republika Bocvana"@sl, + "Republiken Botswana"@sv, + "Botswana"@tn, + "Botsvana Cumhuriyeti"@tr, + "Республіка Ботсвана"@uk, + "博茨瓦纳共和国"@zh ; + skos:hiddenLabel "Μποτσουάνας"@el, + "an Bhotsuáin"@ga, + "Botsvanos"@lt, + "Botsvānas"@lv, + "il-Botswana"@mt, + "ir-Repubblika tal-Botswana"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "229"^^euvoc:EP, + "RB"^^euvoc:FD_010, + "RB"^^euvoc:FD_400, + ".bw"^^euvoc:IANA_DOMAIN, + "BW"^^euvoc:ISG_COU, + "BW"^^euvoc:ISO_3166_1_ALPHA_2, + "BWA"^^euvoc:ISO_3166_1_ALPHA_3, + "072"^^euvoc:ISO_3166_1_NUM, + "BWA"^^euvoc:NAC, + "267"^^euvoc:PHONE_PREFIX, + "BW"^^euvoc:TED, + "BW"^^euvoc:TED_SCHEMA, + "BW"^^euvoc:TIR, + "Southern Africa"^^euvoc:UNSD_GEOSCHEME, + "072"^^euvoc:UNSD_M49 ; + skos:prefLabel "بوتسوانا"@ar, + "Ботсуана"@bg, + "Botswana"@ca, + "Botswana"@cs, + "Botswana"@da, + "Botsuana"@de, + "Μποτσουάνα"@el, + "Botswana"@en, + "Botsuana"@es, + "Botswana"@et, + "Botswana"@fi, + "Botswana"@fr, + "An Bhotsuáin"@ga, + "Bocvana"@hr, + "Botswana"@hu, + "Botsvana"@is, + "Botswana"@it, + "ボツワナ"@ja, + "Botswana"@lb, + "Botsvana"@lt, + "Botsvāna"@lv, + "Il-Botswana"@mt, + "Botswana"@nl, + "Botswana"@no, + "Botswana"@pl, + "Botsuana"@pt, + "Botswana"@ro, + "Ботсвана"@ru, + "Botswana"@sk, + "Bocvana"@sl, + "Botswana"@sv, + "Botsvana"@tr, + "Ботсвана"@uk, + "博茨瓦纳"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CAF" ; + at:deprecated "false" ; + at:op-code "CAF" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RCA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CF" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RCA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CF" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "CF" ; + dc:source "TED" ] ; + at:start.use "1960-08-13" ; + atold:op-code "CAF" ; + dc:identifier "CAF" ; + skos:altLabel "Den Centralafrikanske Republik"@da, + "Ködörösêse tî Bêafrîka"@sg ; + skos:hiddenLabel "Κεντροαφρικανικής Δημοκρατίας"@el, + "Kesk-Aafrika Vabariigi"@et, + "duine ó Phoblacht na hAfraice Láir"@ga, + "Repubbica centrafricana"@it, + "ir-Repubblika Ċentru-Afrikana"@mt, + "Republika Środkowoafrykańska"@pl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "31"^^euvoc:EP, + "RCA"^^euvoc:FD_010, + "CF"^^euvoc:FD_140, + "RCA"^^euvoc:FD_400, + ".cf"^^euvoc:IANA_DOMAIN, + "CF"^^euvoc:ISG_COU, + "CF"^^euvoc:ISO_3166_1_ALPHA_2, + "CAF"^^euvoc:ISO_3166_1_ALPHA_3, + "140"^^euvoc:ISO_3166_1_NUM, + "CAF"^^euvoc:NAC, + "236"^^euvoc:PHONE_PREFIX, + "CF"^^euvoc:TED, + "CF"^^euvoc:TED_SCHEMA, + "RCA"^^euvoc:TIR, + "Middle Africa"^^euvoc:UNSD_GEOSCHEME, + "140"^^euvoc:UNSD_M49 ; + skos:prefLabel "جمهورية أفريقيا الوسطى"@ar, + "Централноафриканска република"@bg, + "República Centreafricana"@ca, + "Středoafrická republika"@cs, + "Centralafrikanske Republik"@da, + "Zentralafrikanische Republik"@de, + "Κεντροαφρικανική Δημοκρατία"@el, + "Central African Republic"@en, + "República Centroafricana"@es, + "Kesk-Aafrika Vabariik"@et, + "Keski-Afrikan tasavalta"@fi, + "République centrafricaine"@fr, + "Poblacht na hAfraice Láir"@ga, + "Srednjoafrička Republika"@hr, + "Közép-afrikai Köztársaság"@hu, + "Mið-Afríkulýðveldið"@is, + "Repubblica centrafricana"@it, + "中央アフリカ共和国"@ja, + "Zentralafrikanesch Republik"@lb, + "Centrinės Afrikos Respublika"@lt, + "Centrālāfrikas Republika"@lv, + "Ir-Repubblika Ċentru-Afrikana"@mt, + "Centraal-Afrikaanse Republiek"@nl, + "Den sentralafrikanske republikk"@no, + "Republika Środkowo-afrykańska"@pl, + "República Centro-Africana"@pt, + "Republica Centrafricană"@ro, + "Центрально-Африканская Республика"@ru, + "Stredoafrická republika"@sk, + "Srednjeafriška republika"@sl, + "Centralafrikanska republiken"@sv, + "Orta Afrika Cumhuriyeti"@tr, + "Центральноафриканська Республіка"@uk, + "中非共和国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CAN" ; + at:deprecated "false" ; + at:op-code "CAN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CDN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CA" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CA" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1931-12-11" ; + atold:op-code "CAN" ; + dc:identifier "CAN" ; + skos:hiddenLabel "Kanados"@lt, + "Kanādas"@lv, + "il-Kanada"@mt, + "Canadese"@nl ; + skos:historyNote "Wikipedia: The Statute of Westminster 1931 is an Act of the Parliament of the United Kingdom, passed on 11.12.1931, that established legislative equality for the self-governing Dominions among which Canada of the British Empire with the United Kingdom, thereby marking the effective legislative independence of these countries, either immediately or upon ratification."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "29"^^euvoc:EP, + "CDN"^^euvoc:FD_010, + "CA"^^euvoc:FD_140, + ".ca"^^euvoc:IANA_DOMAIN, + "CA"^^euvoc:ISG_COU, + "CA"^^euvoc:ISO_3166_1_ALPHA_2, + "CAN"^^euvoc:ISO_3166_1_ALPHA_3, + "124"^^euvoc:ISO_3166_1_NUM, + "CAN"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "CA"^^euvoc:TED, + "CA"^^euvoc:TED_SCHEMA, + "CDN"^^euvoc:TIR, + "Northern America"^^euvoc:UNSD_GEOSCHEME, + "124"^^euvoc:UNSD_M49 ; + skos:prefLabel "كندا"@ar, + "Канада"@bg, + "Canadà"@ca, + "Kanada"@cs, + "Canada"@da, + "Kanada"@de, + "Καναδάς"@el, + "Canada"@en, + "Canadá"@es, + "Kanada"@et, + "Kanada"@fi, + "Canada"@fr, + "Ceanada"@ga, + "Kanada"@hr, + "Kanada"@hu, + "Kanada"@is, + "Canada"@it, + "カナダ"@ja, + "Kanada"@lb, + "Kanada"@lt, + "Kanāda"@lv, + "Il-Kanada"@mt, + "Canada"@nl, + "Canada"@no, + "Kanada"@pl, + "Canadá"@pt, + "Canada"@ro, + "Канада"@ru, + "Kanada"@sk, + "Kanada"@sl, + "Kanada"@sv, + "Kanada"@tr, + "Канада"@uk, + "加拿大"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CHE" ; + at:deprecated "false" ; + at:op-code "CHE" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CH" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "CH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{SWI}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CH" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "CH" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "CHE" ; + dc:identifier "CHE" ; + skos:altLabel "الاتحاد السويسري (الكونفيدرالي)"@ar, + "Швейцарская Канфедэрацыя"@be, + "Конфедерация Швейцария"@bg, + "Švicarska konfederacija"@bs, + "Confederació Suïssa"@ca, + "Švýcarská konfederace"@cs, + "Det Schweiziske Forbund"@da, + "Schweizerische Eidgenossenschaft"@de, + "Ελβετική Συνομοσπονδία"@el, + "Swiss Confederation"@en, + "Confederación Suiza"@es, + "Šveitsi Konföderatsioon"@et, + "Suitzar Konfederazioa"@eu, + "Sveitsin valaliito"@fi, + "Confédération suisse"@fr, + "Cónaidhm na hEilvéise"@ga, + "Confederación suíza"@gl, + "Švicarska Konfederacija"@hr, + "Svájci Konföderáció"@hu, + "Svissneska ríkjasambandið"@is, + "Confederazione Svizzera"@it, + "スイス連邦"@ja, + "Schwäizeresch Eidgenossenschaft"@lb, + "Šveicarijos Konfederacija"@lt, + "Šveices Konfederācijas"@lv, + "Швајцарската Конфедерачија"@mk, + "Il-Konfederazzjoni Żvizzera"@mt, + "Zwitserse Bondsstaat"@nl, + "Konføderasjonen Sveits"@no, + "Konfederacja Szwajcarska"@pl, + "Konfederação suíça"@pt, + "Confederaziun svizra"@rm, + "Confederaţia Elveţiană"@ro, + "Швейцарская Конфедерация"@ru, + "Švajčiarska konfederácia"@sk, + "Švicarska konfederacija"@sl, + "Konfederata Zviceriane"@sq, + "Швајцарска Конфедерација"@sr, + "Schweiziska Edsförbundet"@sv, + "İsviçre Konfederasyonu"@tr, + "Швейцарська Конфедерація"@uk, + "瑞士联邦"@zh ; + skos:hiddenLabel "Schweizerische Eidgenoossenschaft"@de, + "Šveitsi"@et, + "Sveitsin valaliitto"@fi, + "an Eilvéis"@ga, + "Svájci Államszövetség"@hu, + "Šveicarijos"@lt, + "Šveices"@lv, + "Šveices Konfederācija"@lv, + "il-Konfederazzjoni Żvizzera"@mt, + "l-Iżvizzera"@mt, + "Confederação Suíça"@pt, + "Confederația Elvețiană"@ro, + "Elveția"@ro, + "elvețiană"@ro ; + skos:inScheme atold:country, + , + , + ; + skos:notation "32"^^euvoc:EP, + "CH"^^euvoc:FD_010, + "CH"^^euvoc:FD_140, + "CH"^^euvoc:FD_160, + "CH"^^euvoc:FD_400, + ".ch"^^euvoc:IANA_DOMAIN, + "CH"^^euvoc:IBAN_COU, + "CH"^^euvoc:ISG_COU, + "CH"^^euvoc:ISO_3166_1_ALPHA_2, + "CHE"^^euvoc:ISO_3166_1_ALPHA_3, + "756"^^euvoc:ISO_3166_1_NUM, + "CHE"^^euvoc:NAC, + "41"^^euvoc:PHONE_PREFIX, + "{SWI}"^^euvoc:PUB_LOC, + "CH"^^euvoc:TED, + "CH"^^euvoc:TED_SCHEMA, + "CH"^^euvoc:TIR, + "Western Europe"^^euvoc:UNSD_GEOSCHEME, + "756"^^euvoc:UNSD_M49 ; + skos:prefLabel "سويسرا"@ar, + "Швейцарыя"@be, + "Швейцария"@bg, + "Švicarska"@bs, + "Suïssa"@ca, + "Švýcarsko"@cs, + "Schweiz"@da, + "Schweiz"@de, + "Ελβετία"@el, + "Switzerland"@en, + "Suiza"@es, + "Šveits"@et, + "Suiza"@eu, + "Sveitsi"@fi, + "Sveis"@fo, + "Suisse"@fr, + "An Eilvéis"@ga, + "Suíza"@gl, + "Švicarska"@hr, + "Svájc"@hu, + "Sviss"@is, + "Svizzera"@it, + "スイス"@ja, + "Schwäiz"@lb, + "Šveicarija"@lt, + "Šveice"@lv, + "Швајцарија"@mk, + "L-Iżvizzera"@mt, + "Zwitserland"@nl, + "Sveits"@no, + "Szwajcaria"@pl, + "Suíça"@pt, + "Svizra"@rm, + "Elveţia"@ro, + "Швейцария"@ru, + "Švajčiarsko"@sk, + "Švica"@sl, + "Zvicra"@sq, + "Швајцарска"@sr, + "Schweiz"@sv, + "İsviçre"@tr, + "Швейцарія"@uk, + "瑞士"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CHL" ; + at:deprecated "false" ; + at:op-code "CHL" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RCH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CL" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CL" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RCH" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "CHL" ; + dc:identifier "CHL" ; + skos:altLabel "جمهورية شيلي"@ar, + "Република Чили"@bg, + "República de Xile"@ca, + "Chilská republika"@cs, + "Republikken Chile"@da, + "Republik Chile"@de, + "Δημοκρατία της Χιλής"@el, + "Republic of Chile"@en, + "República de Chile"@es, + "Tšiili Vabariik"@et, + "Chilen tasavalta"@fi, + "République du Chili"@fr, + "Poblacht na Sile"@ga, + "Republika Čile"@hr, + "Chilei Köztársaság"@hu, + "Lýðveldið Chile"@is, + "Repubblica del Cile"@it, + "チリ共和国"@ja, + "Republik Chile"@lb, + "Čilės Respublika"@lt, + "Čīles Republika"@lv, + "Ir-Repubblika taċ-Ċilì"@mt, + "Republiek Chili"@nl, + "Republikken Chile"@no, + "Republika Chile"@pl, + "República do Chile"@pt, + "Republica Chile"@ro, + "Республика Чили"@ru, + "Čilská republika"@sk, + "Republika Čile"@sl, + "Republiken Chile"@sv, + "Şili Cumhuriyeti"@tr, + "Республіка Чилі"@uk, + "智利共和国"@zh ; + skos:hiddenLabel "χιλιανική"@el, + "an tSile"@ga, + "Čilės"@lt, + "Čīles"@lv, + "ir-Repubblika taċ-Ċilì"@mt, + "iċ-Ċilì"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "35"^^euvoc:EP, + "RCH"^^euvoc:FD_010, + "CL"^^euvoc:FD_140, + "RCH"^^euvoc:FD_400, + ".cl"^^euvoc:IANA_DOMAIN, + "CL"^^euvoc:ISG_COU, + "CL"^^euvoc:ISO_3166_1_ALPHA_2, + "CHL"^^euvoc:ISO_3166_1_ALPHA_3, + "152"^^euvoc:ISO_3166_1_NUM, + "CHL"^^euvoc:NAC, + "56"^^euvoc:PHONE_PREFIX, + "CL"^^euvoc:TED, + "CL"^^euvoc:TED_SCHEMA, + "RCH"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "152"^^euvoc:UNSD_M49 ; + skos:prefLabel "شيلي"@ar, + "Чили"@bg, + "Xile"@ca, + "Chile"@cs, + "Chile"@da, + "Chile"@de, + "Χιλή"@el, + "Chile"@en, + "Chile"@es, + "Tšiili"@et, + "Chile"@fi, + "Chili"@fr, + "An tSile"@ga, + "Čile"@hr, + "Chile"@hu, + "Chile"@is, + "Cile"@it, + "チリ"@ja, + "Chile"@lb, + "Čilė"@lt, + "Čīle"@lv, + "Iċ-Ċilì"@mt, + "Chili"@nl, + "Chile"@no, + "Chile"@pl, + "Chile"@pt, + "Chile"@ro, + "Чили"@ru, + "Čile"@sk, + "Čile"@sl, + "Chile"@sv, + "Şili"@tr, + "Чилі"@uk, + "智利"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CHN" ; + at:deprecated "false" ; + at:op-code "CHN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CHN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "CN" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "CHN" ; + dc:identifier "CHN" ; + skos:altLabel "جمهورية الصين الشعبية"@ar, + "Китайска народна република"@bg, + "República Popular de la Xina"@ca, + "中國"@chn, + "Čínská lidová republika"@cs, + "Folkerepublikken Kina"@da, + "Volksrepublik China"@de, + "Λαϊκή Δημοκρατία της Κίνας"@el, + "People’s Republic of China"@en, + "República Popular China"@es, + "Hiina Rahvavabariik"@et, + "Kiinan kansantasavalta"@fi, + "République populaire de Chine"@fr, + "Daon-Phoblacht na Síne"@ga, + "Narodna Republika Kina"@hr, + "Kínai Népköztársaság"@hu, + "Alþýðulýðveldið Kína"@is, + "Repubblica popolare cinese"@it, + "中華人民共和国"@ja, + "Volleksrepublik China"@lb, + "Kinijos Liaudies Respublika"@lt, + "Ķīnas Tautas Republika"@lv, + "Ir-Repubblika tal-Poplu taċ-Ċina"@mt, + "Volksrepubliek China"@nl, + "Folkerepublikken Kina"@no, + "Chińska Republika Ludowa"@pl, + "República Popular da China"@pt, + "Republica Populară Chineză"@ro, + "Китайская Народная Республика"@ru, + "Čínska ľudová republika"@sk, + "Ljudska republika Kitajska"@sl, + "Folkrepubliken Kina"@sv, + "Çin Halk Cumhuriyeti"@tr, + "Китайська Народна Республіка"@uk, + "中华人民共和国"@zh ; + skos:hiddenLabel "People's Republic of China"@en, + "an tSín"@ga, + "Kinijos"@lt, + "Ķīnas"@lv, + "ir-Repubblika tal-Poplu taċ-Ċina"@mt, + "iċ-Ċina"@mt, + "Chinese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "37"^^euvoc:EP, + "CHN"^^euvoc:FD_010, + "CN"^^euvoc:FD_140, + ".cn"^^euvoc:IANA_DOMAIN, + "CN"^^euvoc:ISG_COU, + "CN"^^euvoc:ISO_3166_1_ALPHA_2, + "CHN"^^euvoc:ISO_3166_1_ALPHA_3, + "156"^^euvoc:ISO_3166_1_NUM, + "CHN"^^euvoc:NAC, + "86"^^euvoc:PHONE_PREFIX, + "CN"^^euvoc:TED, + "CN"^^euvoc:TED_SCHEMA, + "Eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "156"^^euvoc:UNSD_M49 ; + skos:prefLabel "الصين"@ar, + "Китай"@bg, + "Xina"@ca, + "Čína"@cs, + "Kina"@da, + "China"@de, + "Κίνα"@el, + "China"@en, + "China"@es, + "Hiina"@et, + "Kiina"@fi, + "Chine"@fr, + "An tSín"@ga, + "Kina"@hr, + "Kína"@hu, + "Kína"@is, + "Cina"@it, + "中国"@ja, + "China"@lb, + "Kinija"@lt, + "Ķīna"@lv, + "Iċ-Ċina"@mt, + "China"@nl, + "Kina"@no, + "Chiny"@pl, + "China"@pt, + "China"@ro, + "Китай"@ru, + "Čína"@sk, + "Kitajska"@sl, + "Kina"@sv, + "Çin"@tr, + "Китай"@uk, + "中国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CIV" ; + at:deprecated "false" ; + at:op-code "CIV" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CI" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "CI" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "CI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CI" ; + dc:source "EurLex" ] ; + at:start.use "1960-08-07" ; + atold:op-code "CIV" ; + dc:identifier "CIV" ; + skos:altLabel "جمهورية ساحل العاج"@ar, + "Република Кот д’Ивоар"@bg, + "República de Costa d'Ivori"@ca, + "Republika Pobřeží slonoviny"@cs, + "Republikken Elfenbenskysten"@da, + "Republik Côte d’Ivoire"@de, + "Δημοκρατία της Ακτής του Ελεφαντοστού"@el, + "Republic of Côte d’Ivoire"@en, + "República de Costa de Marfil"@es, + "Côte d’Ivoire’i Vabariik"@et, + "Norsunluurannikon tasavalta"@fi, + "République de Côte d’Ivoire"@fr, + "Poblacht an Chósta Eabhair"@ga, + "Republika Côte d’Ivoire"@hr, + "Elefántcsontparti Köztársaság"@hu, + "Lýðveldið Côte d’Ivoire"@is, + "Repubblica della Costa d’Avorio"@it, + "コートジボワール共和国"@ja, + "Republik Elfenbeinküst"@lb, + "Dramblio Kaulo Kranto Respublika"@lt, + "Kotdivuāras Republika"@lv, + "Ir-Repubblika tal-Kosta tal-Avorju"@mt, + "Republiek Ivoorkust"@nl, + "Republikken Elfenbenskysten"@no, + "Republika Wybrzeia Kości Słoniowej"@pl, + "República da Costa do Marfim"@pt, + "Republica Côte d’Ivoire"@ro, + "Республика Кот д'Ивуар"@ru, + "Republika Pobrežia Slonoviny"@sk, + "Republika Slonokoščena obala"@sl, + "Republiken Elfenbenskusten"@sv, + "Kotdivuar Cumhuriyeti"@tr, + "Республіка Кот-д’Івуар"@uk, + "科特迪瓦共和国"@zh ; + skos:hiddenLabel "Кот д'Ивоар"@bg, + "Република Кот д'Ивоар"@bg, + "fra Elfenbenskysten, ivoriansk"@da, + "Côte d'Ivoire"@de, + "Ακτής Ελεφαντοστού"@el, + "Côte d'Ivoire"@en, + "Republic of Côte d'Ivoire"@en, + "Côte d'Ivoire'i Vabariik"@et, + "Côte d’Ivoire'i"@et, + "Côte d'Ivoire"@fr, + "République de Côte d'Ivoire"@fr, + "an Cósta Eabhair"@ga, + "duine ón gCósta Eabhair"@ga, + "Obala Bjelokosti"@hr, + "Republika Côte d'Ivoire"@hr, + "bjelokošćansko"@hr, + "Costa d'Avorio"@it, + "Repubblica della Costa d'Avorio"@it, + "Dramblio Kaulo Kranto"@lt, + "Kotdivuāras"@lv, + "Kosta tal-Avorju"@mt, + "ir-Repubblika tal-Kosta tal-Avorju"@mt, + "Republika Wybrzeża Kości Słoniowej"@pl, + "Wybrzeża Kości Słoniowej"@pl, + "Côte d'Ivoire"@ro ; + skos:inScheme atold:country, + , + , + ; + skos:notation "33"^^euvoc:EP, + "CI"^^euvoc:FD_010, + "CI"^^euvoc:FD_400, + ".ci"^^euvoc:IANA_DOMAIN, + "CI"^^euvoc:ISG_COU, + "CI"^^euvoc:ISO_3166_1_ALPHA_2, + "CIV"^^euvoc:ISO_3166_1_ALPHA_3, + "384"^^euvoc:ISO_3166_1_NUM, + "CIV"^^euvoc:NAC, + "225"^^euvoc:PHONE_PREFIX, + "CI"^^euvoc:TED, + "CI"^^euvoc:TED_SCHEMA, + "CI"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "384"^^euvoc:UNSD_M49 ; + skos:prefLabel "ساحل العاج"@ar, + "Кот д’Ивоар"@bg, + "Costa d'Ivori"@ca, + "Pobřeží slonoviny"@cs, + "Elfenbenskysten"@da, + "Côte d’Ivoire"@de, + "Ακτή Ελεφαντοστού"@el, + "Côte d’Ivoire"@en, + "Costa de Marfil"@es, + "Côte d’Ivoire"@et, + "Norsunluurannikko"@fi, + "Côte d’Ivoire"@fr, + "An Cósta Eabhair"@ga, + "Côte d’Ivoire"@hr, + "Elefántcsontpart"@hu, + "Côte d’Ivoire (Fílabeinsströndin)"@is, + "Costa d’Avorio"@it, + "コートジボワール"@ja, + "Elfenbeinküst"@lb, + "Dramblio Kaulo Krantas"@lt, + "Kotdivuāra"@lv, + "Il-Kosta tal-Avorju"@mt, + "Ivoorkust"@nl, + "Elfenbenskysten"@no, + "Wybrzeże Kości Słoniowej"@pl, + "Costa do Marfim"@pt, + "Côte d’Ivoire"@ro, + "Кот д'Ивуар"@ru, + "Pobrežie Slonoviny"@sk, + "Slonokoščena obala"@sl, + "Elfenbenskusten"@sv, + "Kotdivuar"@tr, + "Кот-д’Івуар"@uk, + "科特迪瓦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CMR" ; + at:deprecated "false" ; + at:op-code "CMR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TC" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CM" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "TC" ; + dc:source "EurLex" ] ; + at:start.use "1960-01-01" ; + atold:op-code "CMR" ; + dc:identifier "CMR" ; + skos:altLabel "جمهورية الكاميرون"@ar, + "Република Камерун"@bg, + "República de Camerun"@ca, + "Kamerunská republika"@cs, + "Republikken Cameroun"@da, + "Republik Kamerun"@de, + "Δημοκρατία του Καμερούν"@el, + "Republic of Cameroon"@en, + "República de Camerún"@es, + "Kameruni Vabariik"@et, + "Kamerunin tasavalta"@fi, + "République du Cameroun"@fr, + "Poblacht Chamarún"@ga, + "Republika Kamerun"@hr, + "Kameruni Köztársaság"@hu, + "Lýðveldið Kamerún"@is, + "Repubblica del Camerun"@it, + "カメルーン共和国"@ja, + "Republik Kamerun"@lb, + "Kamerūno Respublika"@lt, + "Kamerūnas Republika"@lv, + "Ir-Repubblika tal-Kamerun"@mt, + "Republiek Kameroen"@nl, + "Republikken Kamerun"@no, + "Republika Kamerunu"@pl, + "República dos Camarões"@pt, + "Republica Camerun"@ro, + "Республика Камерун"@ru, + "Kamerunská republika"@sk, + "Republika Kamerun"@sl, + "Republiken Kamerun"@sv, + "Kamerun Cumhuriyeti"@tr, + "Республіка Камерун"@uk, + "喀麦隆共和国"@zh ; + skos:hiddenLabel "Kameruni"@et, + "Kamerūno"@lt, + "Kamerūnas"@lv, + "il-Kamerun"@mt, + "ir-Repubblika tal-Kamerun"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "36"^^euvoc:EP, + "TC"^^euvoc:FD_010, + "CM"^^euvoc:FD_140, + "TC"^^euvoc:FD_400, + ".cm"^^euvoc:IANA_DOMAIN, + "CM"^^euvoc:ISG_COU, + "CM"^^euvoc:ISO_3166_1_ALPHA_2, + "CMR"^^euvoc:ISO_3166_1_ALPHA_3, + "120"^^euvoc:ISO_3166_1_NUM, + "CMR"^^euvoc:NAC, + "237"^^euvoc:PHONE_PREFIX, + "CM"^^euvoc:TED, + "CM"^^euvoc:TED_SCHEMA, + "CAM"^^euvoc:TIR, + "Middle Africa"^^euvoc:UNSD_GEOSCHEME, + "120"^^euvoc:UNSD_M49 ; + skos:prefLabel "الكاميرون"@ar, + "Камерун"@bg, + "Camerun"@ca, + "Kamerun"@cs, + "Cameroun"@da, + "Kamerun"@de, + "Καμερούν"@el, + "Cameroon"@en, + "Camerún"@es, + "Kamerun"@et, + "Kamerun"@fi, + "Cameroun"@fr, + "Camarún"@ga, + "Kamerun"@hr, + "Kamerun"@hu, + "Kamerún"@is, + "Camerun"@it, + "カメルーン"@ja, + "Kamerun"@lb, + "Kamerūnas"@lt, + "Kamerūna"@lv, + "Il-Kamerun"@mt, + "Kameroen"@nl, + "Kamerun"@no, + "Kamerun"@pl, + "Camarões"@pt, + "Camerun"@ro, + "Камерун"@ru, + "Kamerun"@sk, + "Kamerun"@sl, + "Kamerun"@sv, + "Kamerun"@tr, + "Камерун"@uk, + "喀麦隆"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "COD" ; + at:deprecated "false" ; + at:op-code "COD" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CD" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CD" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RCB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CD" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1997-05-18" ; + atold:op-code "COD" ; + dc:identifier "COD" ; + skos:altLabel "Den Demokratiske Republik Congo"@da, + "Congo-Kinshasa"@de, + "Congo-Kinshasa"@en, + "Congo-Kinshasa"@fr, + "Kongo"@kg, + "Kongó"@ln, + "Kongu"@lua, + "República Democrática do Congo"@pt, + "Kongo"@sw ; + skos:hiddenLabel "Congo"@da, + "congolesisk"@da, + "Λαϊκής Δημοκρατίας του Κονγκό"@el, + "Democratic Republic of Congo"@en, + "Kongo"@et, + "kongolainen, kinshasankongolainen"@fi, + "Congólach"@ga, + "an Congó"@ga, + "congolese"@it, + "Kongo Demokratinės Respublikos"@lt, + "Kongo"@lv, + "Kongoliża"@mt, + "ir-Repubblika Demokratika tal-Kongo"@mt, + "Congo-Kinshasa"@nl, + "van de Democratische Republiek Congo"@nl, + "da República Democrática do Congo"@pt, + "din Republica Democratică Congo"@ro, + "Demokratične republike Kongo"@sl, + "kongolesisk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "262"^^euvoc:EP, + "RCB"^^euvoc:FD_010, + "CD"^^euvoc:FD_140, + ".cd"^^euvoc:IANA_DOMAIN, + "CD"^^euvoc:ISG_COU, + "CD"^^euvoc:ISO_3166_1_ALPHA_2, + "COD"^^euvoc:ISO_3166_1_ALPHA_3, + "180"^^euvoc:ISO_3166_1_NUM, + "COD"^^euvoc:NAC, + "243"^^euvoc:PHONE_PREFIX, + "CD"^^euvoc:TED, + "CD"^^euvoc:TED_SCHEMA, + "ZRE"^^euvoc:TIR, + "Middle Africa"^^euvoc:UNSD_GEOSCHEME, + "180"^^euvoc:UNSD_M49 ; + skos:prefLabel "جمهورية الكونغو الديمقراطية"@ar, + "Демократична република Конго"@bg, + "República Democràtica del Congo"@ca, + "Demokratická republika Kongo"@cs, + "Demokratiske Republik Congo"@da, + "Demokratische Republik Kongo"@de, + "Λαϊκή Δημοκρατία του Κονγκό"@el, + "Democratic Republic of the Congo"@en, + "República Democrática del Congo"@es, + "Kongo Demokraatlik Vabariik"@et, + "Kongon demokraattinen tasavalta"@fi, + "République démocratique du Congo"@fr, + "Poblacht Dhaonlathach an Chongó"@ga, + "Demokratska Republika Kongo"@hr, + "Kongói Demokratikus Köztársaság"@hu, + "Lýðstjórnarlýðveldið Kongó"@is, + "Repubblica democratica del Congo"@it, + "コンゴ民主共和国"@ja, + "Demokratesch Republik Kongo"@lb, + "Kongo Demokratinė Respublika"@lt, + "Kongo Demokrātiskā Republika"@lv, + "Ir-Repubblika Demokratika tal-Kongo"@mt, + "Democratische Republiek Congo"@nl, + "Den demokratiske republikken Kongo"@no, + "Demokratyczna Republika Konga"@pl, + "Congo-Kinshasa"@pt, + "Republica Democratică Congo"@ro, + "Демократическая Республика Конго"@ru, + "Konžská demokratická republika"@sk, + "Demokratična republika Kongo"@sl, + "Demokratiska republiken Kongo"@sv, + "Kongo Demokratik Cumhuriyeti"@tr, + "Демократична Республіка Конго"@uk, + "刚果民主共和国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "COG" ; + at:deprecated "false" ; + at:op-code "COG" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CG" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "CG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RCB" ; + dc:source "EurLex" ] ; + at:start.use "1960-08-15" ; + atold:op-code "COG" ; + dc:identifier "COG" ; + skos:altLabel "جمهورية الكونغو"@ar, + "Република Конго"@bg, + "República del Congo"@ca, + "Konžská republika"@cs, + "Republikken Congo"@da, + "Congo-Brazzaville"@de, + "Republik Kongo"@de, + "Δημοκρατία του Κονγκό"@el, + "Congo-Brazzaville"@en, + "Republic of the Congo"@en, + "República del Congo"@es, + "Kongo Vabariik"@et, + "Kongon tasavalta"@fi, + "Congo-Brazzaville"@fr, + "République du Congo"@fr, + "Poblacht an Chongó"@ga, + "Republika Kongo"@hr, + "Kongói Köztársaság"@hu, + "Lýðveldið Kongó"@is, + "Repubblica del Congo"@it, + "コンゴ共和国"@ja, + "Kongo"@kg, + "Republik Kongo"@lb, + "Kongó"@ln, + "Kongo Respublika"@lt, + "Kongo Republika"@lv, + "Ir-Repubblika tal-Kongo"@mt, + "Republiek Congo"@nl, + "Republikken Kongo"@no, + "Republika Konga"@pl, + "República do Congo"@pt, + "Republica Congo"@ro, + "Республика Конго"@ru, + "Konžská republika"@sk, + "Republika Kongo"@sl, + "Republiken Kongo"@sv, + "Kongo Cumhuriyeti"@tr, + "Республіка Конго"@uk, + "刚果共和国"@zh ; + skos:hiddenLabel "kongolesisch / der Republik Kongo"@de, + "Κογκό"@el, + "kongolainen, brazzavillenkongolainen"@fi, + "an Congó"@ga, + "Kongo"@lt, + "il-Kongo"@mt, + "ir-Repubblika tal-Kongo"@mt, + "Congo-Brazzaville"@nl, + "Congolese"@nl, + "Congo"@pt, + "da República do Congo"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "230"^^euvoc:EP, + "RCB"^^euvoc:FD_400, + ".cg"^^euvoc:IANA_DOMAIN, + "CG"^^euvoc:ISG_COU, + "CG"^^euvoc:ISO_3166_1_ALPHA_2, + "COG"^^euvoc:ISO_3166_1_ALPHA_3, + "178"^^euvoc:ISO_3166_1_NUM, + "COG"^^euvoc:NAC, + "242"^^euvoc:PHONE_PREFIX, + "CG"^^euvoc:TED, + "CG"^^euvoc:TED_SCHEMA, + "RCB"^^euvoc:TIR, + "Middle Africa"^^euvoc:UNSD_GEOSCHEME, + "178"^^euvoc:UNSD_M49 ; + skos:prefLabel "الكونغو"@ar, + "Конго"@bg, + "Congo"@ca, + "Kongo"@cs, + "Congo"@da, + "Kongo"@de, + "Κονγκό"@el, + "Congo"@en, + "Congo"@es, + "Kongo"@et, + "Kongo"@fi, + "Congo"@fr, + "An Congó"@ga, + "Kongo"@hr, + "Kongó"@hu, + "Kongó"@is, + "Congo"@it, + "コンゴ"@ja, + "Kongo"@lb, + "Kongas"@lt, + "Kongo"@lv, + "Il-Kongo"@mt, + "Congo"@nl, + "Kongo"@no, + "Kongo"@pl, + "Congo-Brazzaville"@pt, + "Congo"@ro, + "Конго"@ru, + "Kongo"@sk, + "Kongo"@sl, + "Kongo"@sv, + "Kongo"@tr, + "Конго"@uk, + "刚果"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "COK" ; + at:deprecated "false" ; + at:op-code "COK" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CK" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "COK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CK" ; + dc:source "TED" ] ; + at:start.use "1960-08-04" ; + atold:op-code "COK" ; + dc:identifier "COK" ; + skos:altLabel "Cookinselen"@lb, + "Cook-øyene"@no, + "Kūki 'Āirani"@rar ; + skos:broader ; + skos:hiddenLabel "Острови Кук"@bg, + "Νήσων Κουκ"@el, + "Cooki saarte"@et, + "uusiseelantilainen, cookinsaarelainen"@fi, + "duine ó Oileáin Cook"@ga, + "Cookovih Otoka"@hr, + "Kuka Salu"@lv, + "il-Gżejjer Cook"@mt, + "Wysp Cooka"@pl, + "cookense"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "34"^^euvoc:EP, + "COK"^^euvoc:FD_010, + ".ck"^^euvoc:IANA_DOMAIN, + "CK"^^euvoc:ISG_COU, + "CK"^^euvoc:ISO_3166_1_ALPHA_2, + "COK"^^euvoc:ISO_3166_1_ALPHA_3, + "184"^^euvoc:ISO_3166_1_NUM, + "COK"^^euvoc:NAC, + "682"^^euvoc:PHONE_PREFIX, + "CK"^^euvoc:TED, + "CK"^^euvoc:TED_SCHEMA, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "184"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر كوك"@ar, + "Oстрови Кук"@bg, + "Illes Cook"@ca, + "Cookovy ostrovy"@cs, + "Cookøerne"@da, + "Cookinseln"@de, + "Νήσοι Κουκ"@el, + "Cook Islands"@en, + "Islas Cook"@es, + "Cooki saared"@et, + "Cookinsaaret"@fi, + "Îles Cook"@fr, + "Oileáin Cook"@ga, + "Cookovi Otoci"@hr, + "Cook-szigetek"@hu, + "Cooks-eyjar"@is, + "Isole Cook"@it, + "クック諸島"@ja, + "Cook-Inselen"@lb, + "Kuko Salos"@lt, + "Kuka salas"@lv, + "Il-Gżejjer Cook"@mt, + "Cookeilanden"@nl, + "Cookøyene"@no, + "Wyspy Cooka"@pl, + "Ilhas Cook"@pt, + "Insulele Cook"@ro, + "Острова Кука"@ru, + "Cookove ostrovy"@sk, + "Cookovi otoki"@sl, + "Cooköarna"@sv, + "Cook Adaları"@tr, + "Острови Кука"@uk, + "库克群岛"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "COL" ; + at:deprecated "false" ; + at:op-code "COL" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CO" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "CO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CO" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "COL" ; + dc:identifier "COL" ; + skos:altLabel "جمهورية كولومبيا"@ar, + "Република Колумбия"@bg, + "República de Colòmbia"@ca, + "Kolumbijská republika"@cs, + "Republikken Colombia"@da, + "Republik Kolumbien"@de, + "Δημοκρατία της Κολομβίας"@el, + "Republic of Colombia"@en, + "República de Colombia"@es, + "Colombia Vabariik"@et, + "Kolumbian tasavalta"@fi, + "République de Colombie"@fr, + "Poblacht na Colóime"@ga, + "Republika Kolumbija"@hr, + "Kolumbiai Köztársaság"@hu, + "Lýðveldið Colombia"@is, + "Repubblica di Colombia"@it, + "コロンビア共和国"@ja, + "Republik Kolumbien"@lb, + "Kolumbijos Respublika"@lt, + "Kolumbijas Republika"@lv, + "Ir-Repubblika tal-Kolombja"@mt, + "Republiek Colombia"@nl, + "Republikken Colombia"@no, + "Republika Kolumbii"@pl, + "República da Colômbia"@pt, + "Republica Columbia"@ro, + "Республика Колумбия"@ru, + "Kolumbijská republika"@sk, + "Republika Kolumbija"@sl, + "Republiken Colombia"@sv, + "Kolombiya Cumhuriyeti"@tr, + "Республіка Колумбія"@uk, + "哥伦比亚共和国"@zh ; + skos:hiddenLabel "an Cholóim"@ga, + "Kolumbijos"@lt, + "Kolumbijas"@lv, + "il-Kolombja"@mt, + "ir-Repubblika tal-Kolombja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "231"^^euvoc:EP, + "CO"^^euvoc:FD_010, + "CO"^^euvoc:FD_140, + "CO"^^euvoc:FD_400, + ".co"^^euvoc:IANA_DOMAIN, + "CO"^^euvoc:ISG_COU, + "CO"^^euvoc:ISO_3166_1_ALPHA_2, + "COL"^^euvoc:ISO_3166_1_ALPHA_3, + "170"^^euvoc:ISO_3166_1_NUM, + "COL"^^euvoc:NAC, + "57"^^euvoc:PHONE_PREFIX, + "CO"^^euvoc:TED, + "CO"^^euvoc:TED_SCHEMA, + "CO"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "170"^^euvoc:UNSD_M49 ; + skos:prefLabel "كولومبيا"@ar, + "Колумбия"@bg, + "Colòmbia"@ca, + "Kolumbie"@cs, + "Colombia"@da, + "Kolumbien"@de, + "Κολομβία"@el, + "Colombia"@en, + "Colombia"@es, + "Colombia"@et, + "Kolumbia"@fi, + "Colombie"@fr, + "An Cholóim"@ga, + "Kolumbija"@hr, + "Kolumbia"@hu, + "Kólumbía"@is, + "Colombia"@it, + "コロンビア"@ja, + "Kolumbien"@lb, + "Kolumbija"@lt, + "Kolumbija"@lv, + "Il-Kolombja"@mt, + "Colombia"@nl, + "Colombia"@no, + "Kolumbia"@pl, + "Colômbia"@pt, + "Columbia"@ro, + "Колумбия"@ru, + "Kolumbia"@sk, + "Kolumbija"@sl, + "Colombia"@sv, + "Kolombiya"@tr, + "Колумбія"@uk, + "哥伦比亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "COM" ; + at:deprecated "false" ; + at:op-code "COM" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "COMORES" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "KM" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "COMORES" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "KM" ; + dc:source "EurLex" ] ; + at:start.use "1975-07-06" ; + atold:op-code "COM" ; + dc:identifier "COM" ; + skos:altLabel "اتحاد جزر القمر"@ar, + "جزر القمر"@ar, + "Съюз на Коморските острови"@bg, + "Unió de les Comores"@ca, + "Komorský svaz"@cs, + "Unionen Comorerne"@da, + "Union der Komoren"@de, + "Ένωση των Κομορών"@el, + "Union of the Comoros"@en, + "Unión de las Comoras"@es, + "Komoori Liit"@et, + "Komorien liitto"@fi, + "Union des Comores"@fr, + "Aontas Oileáin Chomóra"@ga, + "Unija Komora"@hr, + "Comore-szigeteki Unió"@hu, + "Kómorsambandið"@is, + "Unione delle Comore"@it, + "コモロ連合"@ja, + "Unioun vun de Komoren"@lb, + "Komorų Sąjunga"@lt, + "Komoru Salu Savienība"@lv, + "L-Unjoni ta’ Comoros"@mt, + "Unie der Comoren"@nl, + "Unionen Komorene"@no, + "Związek Komorów"@pl, + "União das Comores"@pt, + "Uniunea Comorelor"@ro, + "Союз Коморских Островов"@ru, + "Komorský zväz"@sk, + "Zveza Komori"@sl, + "Unionen Komorerna"@sv, + "Komori"@sw, + "Komorlar Birliği"@tr, + "Союз Коморських Островів"@uk, + "科摩罗联盟"@zh ; + skos:hiddenLabel "Κομορών"@el, + "Komorų"@lt, + "Komoru Salu"@lv, + "l-Unjoni tal-Comoros"@mt, + "Comorese"@nl, + "Unija Komori"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "240"^^euvoc:EP, + "KM"^^euvoc:FD_010, + "COMORES"^^euvoc:FD_050, + "COMORES"^^euvoc:FD_400, + ".km"^^euvoc:IANA_DOMAIN, + "KM"^^euvoc:ISG_COU, + "KM"^^euvoc:ISO_3166_1_ALPHA_2, + "COM"^^euvoc:ISO_3166_1_ALPHA_3, + "174"^^euvoc:ISO_3166_1_NUM, + "COM"^^euvoc:NAC, + "269"^^euvoc:PHONE_PREFIX, + "KM"^^euvoc:TED, + "KM"^^euvoc:TED_SCHEMA, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "174"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر القمر (كوموروس)"@ar, + "Коморски острови"@bg, + "Comores, les"@ca, + "Komory"@cs, + "Comorerne"@da, + "Komoren"@de, + "Κομόρες"@el, + "Comoros"@en, + "Comoras"@es, + "Komoorid"@et, + "Komorit"@fi, + "Comores"@fr, + "Oileáin Chomóra"@ga, + "Komori"@hr, + "Comore-szigetek"@hu, + "Kómorur"@is, + "Comore"@it, + "コモロ"@ja, + "Komoren"@lb, + "Komorai"@lt, + "Komoru salas"@lv, + "Comoros"@mt, + "Comoren"@nl, + "Komorene"@no, + "Komory"@pl, + "Comores"@pt, + "Comore"@ro, + "Коморские Острова"@ru, + "Komory"@sk, + "Komori"@sl, + "Komorerna"@sv, + "Komorlar"@tr, + "Коморські Острови"@uk, + "科摩罗"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CPV" ; + at:deprecated "false" ; + at:op-code "CPV" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CV" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "CAP-VERT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CAP-VERT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CV" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1975-07-05" ; + atold:op-code "CPV" ; + dc:identifier "CPV" ; + skos:altLabel "جمهورية الرأس الأخضر"@ar, + "Република Кабо Верде"@bg, + "República de Cap Verd"@ca, + "Kapverdská republika"@cs, + "Republikken Kap Verde"@da, + "Republik Cabo Verde"@de, + "Δημοκρατία του Πράσινου Ακρωτηρίου"@el, + "Republic of Cabo Verde"@en, + "República de Cabo Verde"@es, + "Cabo Verde Vabariik"@et, + "Kap Verden tasavalta"@fi, + "République de Cabo Verde"@fr, + "Poblacht Cabo Verde"@ga, + "Republika Cabo Verde"@hr, + "Zöld-foki Köztársaság"@hu, + "Lýðveldið Cabo Verde"@is, + "Repubblica di Cabo Verde"@it, + "カーボベルデ共和国"@ja, + "Republik Cap Vert"@lb, + "Žaliojo Kyšulio Respublika"@lt, + "Kaboverdes Republika"@lv, + "Ir-Repubblika ta’ Cabo Verde"@mt, + "Republiek Kaapverdië"@nl, + "Republikken Cabo Verde"@no, + "República de Cabo Verde"@pt, + "Republica Cabo Verde"@ro, + "Республика Кабо-Верде"@ru, + "Kapverdská republika"@sk, + "Republika Zelenortski otoki"@sl, + "Republiken Kap Verde"@sv, + "Cabo Verde Cumhuriyeti"@tr, + "Республіка Кабо-Верде"@uk, + "佛得角共和国"@zh ; + skos:hiddenLabel "Πράσινου Ακρωτηρίου"@el, + "Cape Verde"@en, + "Cape Verdean"@en, + "Republic of Cape Verde"@en, + "Cap-Vert"@fr, + "République du Cap-Vert"@fr, + "cap-verdienne"@fr, + "Poblacht Rinn Verde"@ga, + "Rinn Verde"@ga, + "duine ó Rinn Verde"@ga, + "Republika Kabo Verde"@hr, + "Zelenortski Otoci"@hr, + "zöld-foki, zöld-foki-szigeteki"@hu, + "Capo Verde"@it, + "Repubblica del Capo Verde"@it, + "Cape Verde"@mt, + "Cape Verdjana"@mt, + "ir-Repubblika ta' Cape Verde"@mt, + "Republiki Zielonego Przylądka"@pl, + "Capul Verde"@ro, + "Republica Capului Verde"@ro, + "capverdiană"@ro ; + skos:inScheme atold:country, + , + , + ; + skos:notation "42"^^euvoc:EP, + "CAP-VERT"^^euvoc:FD_010, + "CAP-VERT"^^euvoc:FD_400, + ".cv"^^euvoc:IANA_DOMAIN, + "CV"^^euvoc:ISG_COU, + "CV"^^euvoc:ISO_3166_1_ALPHA_2, + "CPV"^^euvoc:ISO_3166_1_ALPHA_3, + "132"^^euvoc:ISO_3166_1_NUM, + "CPV"^^euvoc:NAC, + "238"^^euvoc:PHONE_PREFIX, + "CV"^^euvoc:TED, + "CV"^^euvoc:TED_SCHEMA, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "132"^^euvoc:UNSD_M49 ; + skos:prefLabel "الرأس الأخضر"@ar, + "Кабо Верде"@bg, + "Cap Verd"@ca, + "Kapverdy"@cs, + "Kap Verde"@da, + "Cabo Verde"@de, + "Πράσινο Ακρωτήριο"@el, + "Cabo Verde"@en, + "Cabo Verde"@es, + "Cabo Verde"@et, + "Kap Verde"@fi, + "Cabo Verde"@fr, + "Cabo Verde"@ga, + "Cabo Verde"@hr, + "Zöld-foki-szigetek"@hu, + "Cabo Verde (Grænhöfðaeyjar)"@is, + "Cabo Verde"@it, + "カーボベルデ"@ja, + "Cap Vert"@lb, + "Žaliasis Kyšulys"@lt, + "Kaboverde"@lv, + "Cabo Verde"@mt, + "Kaapverdië"@nl, + "Kapp Verde"@no, + "Republika Zielonego Przylądka"@pl, + "Cabo Verde"@pt, + "Cabo Verde"@ro, + "Кабо-Верде"@ru, + "Kapverdy"@sk, + "Zelenortski otoki"@sl, + "Kap Verde"@sv, + "Cabo Verde"@tr, + "Кабо Верде"@uk, + "佛得角"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CRI" ; + at:deprecated "false" ; + at:op-code "CRI" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "CR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CR" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "CRI" ; + dc:identifier "CRI" ; + skos:altLabel "جمهورية كوستا ريكا"@ar, + "Република Коста Рика"@bg, + "República de Costa Rica"@ca, + "Kostarická republika"@cs, + "Republikken Costa Rica"@da, + "Republik Costa Rica"@de, + "Δημοκρατία της Κόστα Ρίκα"@el, + "Republic of Costa Rica"@en, + "República de Costa Rica"@es, + "Costa Rica Vabariik"@et, + "Costa Rican tasavalta"@fi, + "République du Costa Rica"@fr, + "Poblacht Chósta Ríce"@ga, + "Republika Kostarika"@hr, + "Costa Rica Köztársaság"@hu, + "Lýðveldið Costa Rica"@is, + "Repubblica di Costa Rica"@it, + "コスタリカ共和国"@ja, + "Republik Costa Rica"@lb, + "Kosta Rikos Respublika"@lt, + "Kostarikas Republika"@lv, + "Ir-Repubblika tal-Costa Rica"@mt, + "Republiek Costa Rica"@nl, + "Republikken Costa Rica"@no, + "Republika Kostaryki"@pl, + "República da Costa Rica"@pt, + "Republica Costa Rica"@ro, + "Республика Коста-Рика"@ru, + "Kostarická republika"@sk, + "Republika Kostarika"@sl, + "Republiken Costa Rica"@sv, + "Kosta Rika Cumhuriyeti"@tr, + "Республіка Коста-Рика"@uk, + "哥斯达黎加共和国"@zh ; + skos:hiddenLabel "costa-ricienne"@fr, + "Kostarika"@hr, + "Kosta Rikos"@lt, + "Kostarikas"@lv, + "il-Costa Rica"@mt, + "ir-Repubblika tal-Costa Rica"@mt, + "costarikansk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "38"^^euvoc:EP, + "CR"^^euvoc:FD_010, + "CR"^^euvoc:FD_140, + "CR"^^euvoc:FD_400, + ".cr"^^euvoc:IANA_DOMAIN, + "CR"^^euvoc:IBAN_COU, + "CR"^^euvoc:ISG_COU, + "CR"^^euvoc:ISO_3166_1_ALPHA_2, + "CRI"^^euvoc:ISO_3166_1_ALPHA_3, + "188"^^euvoc:ISO_3166_1_NUM, + "CRI"^^euvoc:NAC, + "506"^^euvoc:PHONE_PREFIX, + "CR"^^euvoc:TED, + "CR"^^euvoc:TED_SCHEMA, + "CR"^^euvoc:TIR, + "Central America"^^euvoc:UNSD_GEOSCHEME, + "188"^^euvoc:UNSD_M49 ; + skos:prefLabel "كوستا ريكا"@ar, + "Коста Рика"@bg, + "Costa Rica"@ca, + "Kostarika"@cs, + "Costa Rica"@da, + "Costa Rica"@de, + "Κόστα Ρίκα"@el, + "Costa Rica"@en, + "Costa Rica"@es, + "Costa Rica"@et, + "Costa Rica"@fi, + "Costa Rica"@fr, + "Cósta Ríce"@ga, + "Kostarik"@hr, + "Costa Rica"@hu, + "Costa Rica"@is, + "Costa Rica"@it, + "コスタリカ"@ja, + "Costa Rica"@lb, + "Kosta Rika"@lt, + "Kostarika"@lv, + "Il-Costa Rica"@mt, + "Costa Rica"@nl, + "Costa Rica"@no, + "Kostaryka"@pl, + "Costa Rica"@pt, + "Costa Rica"@ro, + "Коста-Рика"@ru, + "Kostarika"@sk, + "Kostarika"@sl, + "Costa Rica"@sv, + "Kosta Rika"@tr, + "Коста-Рика"@uk, + "哥斯达黎加"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CUB" ; + at:deprecated "false" ; + at:op-code "CUB" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CU" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "CU" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "C" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "C" ; + dc:source "EurLex" ] ; + at:start.use "1959-01-01" ; + atold:op-code "CUB" ; + dc:identifier "CUB" ; + skos:altLabel "جمهورية كوبا"@ar, + "Република Куба"@bg, + "República de Cuba"@ca, + "Kubánská republika"@cs, + "Republikken Cuba"@da, + "Republik Kuba"@de, + "Δημοκρατία της Κούβας"@el, + "Republic of Cuba"@en, + "República de Cuba"@es, + "Kuuba Vabariik"@et, + "Kuuban tasavalta"@fi, + "République de Cuba"@fr, + "Poblacht Chúba"@ga, + "Republika Kuba"@hr, + "Kubai Köztársaság"@hu, + "Lýðveldið Kúba"@is, + "Repubblica di Cuba"@it, + "キューバ共和国"@ja, + "Republik Kuba"@lb, + "Kubos Respublika"@lt, + "Kubas Republika"@lv, + "Ir-Repubblika ta’ Kuba"@mt, + "Republiek Cuba"@nl, + "Republikken Cuba"@no, + "Republika Kuby"@pl, + "República de Cuba"@pt, + "Republica Cuba"@ro, + "Республика Куба"@ru, + "Kubánska republika"@sk, + "Republika Kuba"@sl, + "Republiken Kuba"@sv, + "Küba Cumhuriyeti"@tr, + "Республіка Куба"@uk, + "古巴共和国"@zh ; + skos:hiddenLabel "Κούβας"@el, + "Kubos"@lt, + "Kubas"@lv, + "ir-Repubblika ta' Kuba"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "41"^^euvoc:EP, + "C"^^euvoc:FD_010, + "CU"^^euvoc:FD_140, + "C"^^euvoc:FD_400, + ".cu"^^euvoc:IANA_DOMAIN, + "CU"^^euvoc:ISG_COU, + "CU"^^euvoc:ISO_3166_1_ALPHA_2, + "CUB"^^euvoc:ISO_3166_1_ALPHA_3, + "192"^^euvoc:ISO_3166_1_NUM, + "CUB"^^euvoc:NAC, + "53"^^euvoc:PHONE_PREFIX, + "CU"^^euvoc:TED, + "CU"^^euvoc:TED_SCHEMA, + "CU"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "192"^^euvoc:UNSD_M49 ; + skos:prefLabel "كوبا"@ar, + "Куба"@bg, + "Cuba"@ca, + "Kuba"@cs, + "Cuba"@da, + "Kuba"@de, + "Κούβα"@el, + "Cuba"@en, + "Cuba"@es, + "Kuuba"@et, + "Kuuba"@fi, + "Cuba"@fr, + "Cúba"@ga, + "Kuba"@hr, + "Kuba"@hu, + "Kúba"@is, + "Cuba"@it, + "キューバ"@ja, + "Kuba"@lb, + "Kuba"@lt, + "Kuba"@lv, + "Kuba"@mt, + "Cuba"@nl, + "Cuba"@no, + "Kuba"@pl, + "Cuba"@pt, + "Cuba"@ro, + "Куба"@ru, + "Kuba"@sk, + "Kuba"@sl, + "Kuba"@sv, + "Küba"@tr, + "Куба"@uk, + "古巴"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "CUW" ; + at:deprecated "false" ; + at:op-code "CUW" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "CW" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "CW" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "2010-10-10" ; + atold:op-code "CUW" ; + dc:identifier "CUW" ; + skos:altLabel "Kòrsou"@pap ; + skos:broader ; + skos:changeNote "According to Wikipedia: ‘Prior to 10 October 2010, when the Netherlands Antilles were dissolved, Curaçao was administered as the Island Territory of Curaçao, one of five island territories of the former Netherlands Antilles.’"@en ; + skos:hiddenLabel "Curacao"@en, + "alankomaalainen, curaçaolainen"@fi, + "Curaçao"@ga, + "duine ó Curaçao"@ga, + "Kraj Curaçao"@pl, + "Curaçao"@pt, + "curaçauense"@pt, + "Curaçaa"@sl, + "curaçaoisk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "289"^^euvoc:EP, + ".cw"^^euvoc:IANA_DOMAIN, + "CW"^^euvoc:ISG_COU, + "CW"^^euvoc:ISO_3166_1_ALPHA_2, + "CUW"^^euvoc:ISO_3166_1_ALPHA_3, + "531"^^euvoc:ISO_3166_1_NUM, + "CUW"^^euvoc:NAC, + "599"^^euvoc:PHONE_PREFIX, + "CW"^^euvoc:TED, + "CW"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "531"^^euvoc:UNSD_M49 ; + skos:prefLabel "كوراساو"@ar, + "Кюрасао"@bg, + "Curaçao"@ca, + "Curaçao"@cs, + "Curaçao"@da, + "Curaçao"@de, + "Κουρασάο"@el, + "Curaçao"@en, + "Curazao"@es, + "Curaçao"@et, + "Curaçao"@fi, + "Curaçao"@fr, + "Cúrasó"@ga, + "Curaçao"@hr, + "Curaçao"@hu, + "Curacao"@is, + "Curaçao"@it, + "キュラソー"@ja, + "Curaçao"@lb, + "Kiurasao"@lt, + "Kirasao"@lv, + "Curaçao"@mt, + "Curaçao"@nl, + "Curaçao"@no, + "Curaçao"@pl, + "Curaçau"@pt, + "Curaçao"@ro, + "Кюрасао"@ru, + "Curaçao"@sk, + "Curaçao"@sl, + "Curaçao"@sv, + "Curaçao"@tr, + "Кюрасао"@uk, + "库拉索"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "CYM" ; + at:deprecated "false" ; + at:op-code "CYM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "KY" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "KY" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "NCYM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "KY" ; + dc:source "EurLex" ] ; + at:start.use "1962-01-01" ; + atold:op-code "CYM" ; + dc:identifier "CYM" ; + skos:altLabel "Έδαφος των Νήσων Κέιμαν"@el, + "Kaimanisaarte asumaa"@et, + "Caymaninselen"@lb, + "Kaimanų Salos"@lt, + "Каймановы Острова"@ru ; + skos:broader ; + skos:changeNote "Междуинституционално ръководство за изготвяне на публикациите: Кайманови острови: Британска отвъдморска територия."@bg, + "Pravidla pro jednotnou úpravu dokumentů: Kajmanské ostrovy: Britské zámořské území."@cs, + "Vejledning i Udformning af EU-publikationer: Caymanøerne: Britisk oversøisk territorium."@da, + "Interinstitutionelle Regeln für Veröffentlichungen: Kaimaninseln: Britisches Überseegebiet."@de, + "Διοργανικό εγχειρίδιο σύνταξης κειμένων: Νήσοι Καϋμάν: Βρετανικό υπερπόντιο έδαφος."@el, + "Interinstitutional Style Guide: Cayman Islands: British overseas territory."@en, + "Libro de estilo interinstitucional: Islas Caimán: Territorio británico de ultramar."@es, + "Institutsioonidevaheline stiilijuhend: Kaimanisaared: Briti ülemereterritoorium."@et, + "Toimielinten yhteiset tekstinlaadinnan ohjeet: Caymansaaret: Brittiläinen merentakainen territorio."@fi, + "Code de rédaction interinstitutionnel: Îles Caïmans: territoire d’outre-mer britannique."@fr, + "An Treoir Stíle Idirinstitíuideach: Oileáin Cayman: críoch thar lear de chuid na Ríochta Aontaithe."@ga, + "Intézményközi kiadványszerkesztési útmutató: Kajmán-szigetek: Brit tengerentúli terület."@hu, + "Manuale interistituzionale di convenzioni redazionali: Isole Cayman: territorio d’oltremare britannico."@it, + "Institucijų leidinių rengimo vadovas: Kaimanai: britų užjūrio teritorija."@lt, + "Iestāžu publikāciju noformēšanas rokasgrāmata: Kaimanu Salas: britu aizjūras teritorija."@lv, + "Gwida tal-Istil Interistituzzjonali: Il-Gżejjer Kajman: Territorju lil hinn mix-xtut Brittaniċi."@mt, + "Interinstitutionele schrijfwijzer: Kaaimaneilanden: Brits overzees gebied."@nl, + "Międzyinstytucjonalny przewodnik redakcyjny: Kajmany: Brytyjskie terytorium zamorskie."@pl, + "Código de Redação Interinstitucional: Ilhas Caimão: Território ultramarino britânico."@pt, + "Ghid de redactare interinstituțional: Insulele Cayman: teritoriu britanic de peste mări."@ro, + "Medziinštitucionálna príručka úpravy dokumentov: Kajmanie ostrovy: britské zámorské územie."@sk, + "Medinstitucionalni slogovni priročnik: Kajmanski otoki: čezmorsko ozemlje Združenega kraljestva."@sl, + "Publikationshandboken: Caymanöarna: Brittiskt utomeuropeiskt territorium."@sv ; + skos:hiddenLabel "Νήσοι Κάιμαν"@el, + "Νήσων Κάιμαν"@el, + "britannialainen, caymansaarelainen"@fi, + "Îles Caïmanes"@fr, + "duine ó Oileáin Cayman"@ga, + "Kajmanskih Otoka"@hr, + "Kaimanų"@lt, + "il-Gżejer Cayman"@mt, + "från Caymanöarna"@sv ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "100"^^euvoc:EP, + "NCYM"^^euvoc:FD_050, + "KY"^^euvoc:FD_140, + ".ky"^^euvoc:IANA_DOMAIN, + "KY"^^euvoc:ISG_COU, + "KY"^^euvoc:ISO_3166_1_ALPHA_2, + "CYM"^^euvoc:ISO_3166_1_ALPHA_3, + "136"^^euvoc:ISO_3166_1_NUM, + "CYM"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "KY"^^euvoc:TED, + "KY"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "136"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر كايمان"@ar, + "Кайманови острови"@bg, + "Illes Caiman"@ca, + "Kajmanské ostrovy"@cs, + "Caymanøerne"@da, + "Kaimaninseln"@de, + "Νήσοι Κέιμαν"@el, + "Cayman Islands"@en, + "Islas Caimán"@es, + "Kaimanisaared"@et, + "Caymansaaret"@fi, + "Îles Caïmans"@fr, + "Oileáin Cayman"@ga, + "Kajmanski Otoci"@hr, + "Kajmán-szigetek"@hu, + "Cayman-eyjar"@is, + "Isole Cayman"@it, + "ケイマン諸島"@ja, + "Kaimaninselen"@lb, + "Kaimanai"@lt, + "Kaimanu Salas"@lv, + "Il-Gżejjer Cayman"@mt, + "Kaaimaneilanden"@nl, + "Caymanøyene"@no, + "Kajmany"@pl, + "Ilhas Caimão"@pt, + "Insulele Cayman"@ro, + "Острова Кайман"@ru, + "Kajmanie ostrovy"@sk, + "Kajmanji otoki"@sl, + "Caymanöarna"@sv, + "Cayman Adaları"@tr, + "Кайманові Острови"@uk, + "开曼群岛"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "DJI" ; + at:deprecated "false" ; + at:op-code "DJI" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "DJ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "DJIBOUTI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "DJ" ; + dc:source "TED" ] ; + at:start.use "1977-06-27" ; + atold:op-code "DJI" ; + dc:identifier "DJI" ; + skos:altLabel "جمهورية جيبوتي"@ar, + "جيبوتي"@ar, + "Република Джибути"@bg, + "República de Djibouti"@ca, + "Džibutská republika"@cs, + "Republikken Djibouti"@da, + "Republik Dschibuti"@de, + "Δημοκρατία του Τζιμπουτί"@el, + "Republic of Djibouti"@en, + "República de Yibuti"@es, + "Djibouti Vabariik"@et, + "Djiboutin tasavalta"@fi, + "République de Djibouti"@fr, + "Poblacht Djibouti"@ga, + "Republika Džibuti"@hr, + "Dzsibuti Köztársaság"@hu, + "Lýðveldið Djibútí"@is, + "Repubblica di Gibuti"@it, + "ジブチ共和国"@ja, + "Republik Djibouti"@lb, + "Džibučio Respublika"@lt, + "Džibutijas Republika"@lv, + "Ir-Repubblika tal-Djibouti"@mt, + "Republiek Djibouti"@nl, + "Republikken Djibouti"@no, + "Republika Dżibuti"@pl, + "República do Jibuti"@pt, + "Republica Djibouti"@ro, + "Республика Джибути"@ru, + "Džibutská republika"@sk, + "Republika Džibuti"@sl, + "Jabuuti"@so, + "Republiken Djibouti"@sv, + "Cibuti Cumhuriyeti"@tr, + "Республіка Джибуті"@uk, + "吉布提共和国"@zh ; + skos:hiddenLabel "duine ó Djibouti"@ga, + "Džibučio"@lt, + "Džibutijas"@lv, + "id-Djibouti"@mt, + "ir-Repubblika tal-Djibouti"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "46"^^euvoc:EP, + "DJIBOUTI"^^euvoc:FD_010, + ".dj"^^euvoc:IANA_DOMAIN, + "DJ"^^euvoc:ISG_COU, + "DJ"^^euvoc:ISO_3166_1_ALPHA_2, + "DJI"^^euvoc:ISO_3166_1_ALPHA_3, + "262"^^euvoc:ISO_3166_1_NUM, + "DJI"^^euvoc:NAC, + "253"^^euvoc:PHONE_PREFIX, + "DJ"^^euvoc:TED, + "DJ"^^euvoc:TED_SCHEMA, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "262"^^euvoc:UNSD_M49 ; + skos:prefLabel "دجيبوتي"@ar, + "Джибути"@bg, + "Djibouti"@ca, + "Džibutsko"@cs, + "Djibouti"@da, + "Dschibuti"@de, + "Τζιμπουτί"@el, + "Djibouti"@en, + "Yibuti"@es, + "Djibouti"@et, + "Djibouti"@fi, + "Djibouti"@fr, + "Djibouti"@ga, + "Džibuti"@hr, + "Dzsibuti"@hu, + "Djibútí"@is, + "Gibuti"@it, + "ジブチ"@ja, + "Dschibuti"@lb, + "Džibutis"@lt, + "Džibutija"@lv, + "Il-Djibouti"@mt, + "Djibouti"@nl, + "Djibouti"@no, + "Dżibuti"@pl, + "Jibuti"@pt, + "Djibouti"@ro, + "Джибути"@ru, + "Džibutsko"@sk, + "Džibuti"@sl, + "Djibouti"@sv, + "Cibuti"@tr, + "Джибуті"@uk, + "吉布提"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "DMA" ; + at:deprecated "false" ; + at:op-code "DMA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "DOM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "DOM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "DM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "DM" ; + dc:source "TED" ] ; + at:start.use "1978-11-03" ; + atold:op-code "DMA" ; + dc:identifier "DMA" ; + skos:altLabel "كومنولث دومينيكا"@ar, + "Доминикански съюз"@bg, + "Commonwealth de Dominica"@ca, + "Dominické společenství"@cs, + "Commonwealth of Dominica"@da, + "Commonwealth Dominica"@de, + "Κοινοπολιτεία της Ντομίνικας"@el, + "Commonwealth of Dominica"@en, + "Commonwealth de Dominica"@es, + "Dominica Ühendus"@et, + "Dominican yhteisö"@fi, + "Commonwealth de Dominique"@fr, + "Comhlathas Dhoiminice"@ga, + "Zajednica Dominike"@hr, + "Dominikai Közösség"@hu, + "Samveldið Dominíka"@is, + "Commonwealth di Dominica"@it, + "ドミニカ共和国"@ja, + "Commonwealth vun Dominica"@lb, + "Dominikos Sandrauga"@lt, + "Dominikas Sadraudzība"@lv, + "Il-Commonwealth ta’ Dominica"@mt, + "Gemenebest Dominica"@nl, + "Samveldet Dominica"@no, + "Wspólnota Dominiki"@pl, + "Comunidade da Domínica"@pt, + "Uniunea Dominica"@ro, + "Содружество Доминики"@ru, + "Dominické spoločenstvo"@sk, + "Skupnost Dominika"@sl, + "Samväldet Dominica"@sv, + "Dominika Milletler Topluluğu"@tr, + "Співдружність Домініки"@uk, + "多米尼克国"@zh ; + skos:hiddenLabel "Доминиканска общност"@bg, + "Commonwealth of the Dominica"@da, + "Δομίνικα"@el, + "Δομίνικας"@el, + "Κοινοπολιτεία της Δομίνικας"@el, + "dominikansko"@hr, + "Dominikos"@lt, + "Dominikas"@lv, + "Dominicana"@mt, + "il-Commonwealth ta' Dominica"@mt, + "van Dominica"@nl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "47"^^euvoc:EP, + "DOM"^^euvoc:FD_010, + "DOM"^^euvoc:FD_400, + ".dm"^^euvoc:IANA_DOMAIN, + "DM"^^euvoc:ISG_COU, + "DM"^^euvoc:ISO_3166_1_ALPHA_2, + "DMA"^^euvoc:ISO_3166_1_ALPHA_3, + "212"^^euvoc:ISO_3166_1_NUM, + "DMA"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "DM"^^euvoc:TED, + "DM"^^euvoc:TED_SCHEMA, + "WD"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "212"^^euvoc:UNSD_M49 ; + skos:prefLabel "دومينيكا"@ar, + "Доминика"@bg, + "Dominica"@ca, + "Dominika"@cs, + "Dominica"@da, + "Dominica"@de, + "Ντομίνικα"@el, + "Dominica"@en, + "Dominica"@es, + "Dominica"@et, + "Dominica"@fi, + "Dominique"@fr, + "Doiminice"@ga, + "Dominika"@hr, + "Dominika"@hu, + "Dominíka"@is, + "Dominica"@it, + "ドミニカ国"@ja, + "Dominica"@lb, + "Dominika"@lt, + "Dominika"@lv, + "Dominica"@mt, + "Dominica"@nl, + "Dominica"@no, + "Dominika"@pl, + "Domínica"@pt, + "Dominica"@ro, + "Доминика"@ru, + "Dominika"@sk, + "Dominika"@sl, + "Dominica"@sv, + "Dominik"@tr, + "Домініка"@uk, + "多米尼克"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "DOM" ; + at:deprecated "false" ; + at:op-code "DOM" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "DO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "DO" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "DO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "DO" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "DOM" ; + dc:identifier "DOM" ; + skos:altLabel "Доминиканска общност"@bg, + "Den Dominikanske Republik"@da, + "Dominikānas Republika"@lv, + "Den domenikanske republikk"@no, + "Republika Dominikańska"@pl ; + skos:hiddenLabel "dominikansk"@da, + "Δομινικανής Δημοκρατίας"@el, + "an Phoblacht Dhoiminiceach"@ga, + "Dominikos Respublikos"@lt, + "Dominikānas"@lv, + "Dominicana"@mt, + "ir-Repubblika Dominicana"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "48"^^euvoc:EP, + "DO"^^euvoc:FD_010, + "DO"^^euvoc:FD_400, + ".do"^^euvoc:IANA_DOMAIN, + "DO"^^euvoc:IBAN_COU, + "DO"^^euvoc:ISG_COU, + "DO"^^euvoc:ISO_3166_1_ALPHA_2, + "DOM"^^euvoc:ISO_3166_1_ALPHA_3, + "214"^^euvoc:ISO_3166_1_NUM, + "DOM"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "DO"^^euvoc:TED, + "DO"^^euvoc:TED_SCHEMA, + "DOM"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "214"^^euvoc:UNSD_M49 ; + skos:prefLabel "جمهورية الدومينيك"@ar, + "Доминиканска република"@bg, + "República Dominicana"@ca, + "Dominikánská republika"@cs, + "Dominikanske Republik"@da, + "Dominikanische Republik"@de, + "Δομινικανή Δημοκρατία"@el, + "Dominican Republic"@en, + "República Dominicana"@es, + "Dominikaani Vabariik"@et, + "Dominikaaninen tasavalta"@fi, + "République dominicaine"@fr, + "An Phoblacht Dhoiminiceach"@ga, + "Dominikanska Republika"@hr, + "Dominikai Köztársaság"@hu, + "Dóminíska lýðveldið"@is, + "Repubblica dominicana"@it, + "ドミニカ共和国"@ja, + "Dominikanesch Republik"@lb, + "Dominikos Respublika"@lt, + "Dominikāna"@lv, + "Ir-Repubblika Dominicana"@mt, + "Dominicaanse Republiek"@nl, + "Den dominikanske republikk"@no, + "Dominikana"@pl, + "República Dominicana"@pt, + "Republica Dominicană"@ro, + "Доминиканская Республика"@ru, + "Dominikánska republika"@sk, + "Dominikanska republika"@sl, + "Dominikanska republiken"@sv, + "Dominik Cumhuriyeti"@tr, + "Домініканська Республіка"@uk, + "多明尼加共和国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "DZA" ; + at:deprecated "false" ; + at:op-code "DZA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "DZ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "DZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "DZ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "DZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "DZ" ; + dc:source "EurLex" ] ; + at:start.use "1962-07-05" ; + atold:op-code "DZA" ; + dc:identifier "DZA" ; + skos:altLabel "جمهورية الجزائر الديمقراطية الشعبية"@ar, + "Алжирска народнодемократична република"@bg, + "República Democràtica Popular d'Algèria"@ca, + "Alžírská demokratická a lidová republika"@cs, + "Den Demokratiske Folkerepublik Algeriet"@da, + "Demokratische Volksrepublik Algerien"@de, + "Λαϊκή Δημοκρατία της Αλγερίας"@el, + "People’s Democratic Republic of Algeria"@en, + "República Argelina Democrática y Popular"@es, + "Alžeeria Demokraatlik Rahvavabariik"@et, + "Algerian demokraattinen kansantasavalta"@fi, + "République algérienne démocratique et populaire"@fr, + "Daon-Phoblacht Dhaonlathach na hAilgéire"@ga, + "Demokratska Narodna Republika Alžir"@hr, + "Algériai Demokratikus és Népi Köztársaság"@hu, + "Alþýðulýðveldið Alsír"@is, + "Repubblica algerina democratica e popolare"@it, + "アルジェリア民主人民共和国"@ja, + "Demokratesch Volleksrepublik Algerien"@lb, + "Alžyro Liaudies Demokratinė Respublika"@lt, + "Alžīrijas Tautas Demokrātiskā Republika"@lv, + "Ir-Repubblika Demokratika tal-Poplu tal-Alġerija"@mt, + "Democratische Volksrepubliek Algerije"@nl, + "Den demokratiske folkerepublikk Algerie"@no, + "Algierska Republika Ludowo-Demokratyczna"@pl, + "República Democrática e Popular da Argélia"@pt, + "Republica Algeriană Democratică şi Populară"@ro, + "Алжирская Народная Демократическая Республика"@ru, + "Alžírska demokratická ľudová republika"@sk, + "Ljudska demokratična republika Alžirija"@sl, + "Demokratiska folkrepubliken Algeriet"@sv, + "Cezayir Demokratik Halk Cumhuriyeti"@tr, + "Алжирська Народна Демократична Республіка"@uk, + "阿尔及利亚民主人民共和国"@zh ; + skos:hiddenLabel "Алжирска демократична народна република"@bg, + "People's Democratic Republic of Algeria"@en, + "an Ailgéir"@ga, + "Alžirska Narodna Demokratska Republika"@hr, + "Alžyro"@lt, + "Alžīrijas"@lv, + "ir-Repubblika Demokratika tal-Poplu tal-Alġerija"@mt, + "l-Alġerija"@mt, + "República Argelina Democrática e Popular"@pt, + "Republica Algeriană Democratică și Populară"@ro ; + skos:inScheme atold:country, + , + , + ; + skos:notation "49"^^euvoc:EP, + "DZ"^^euvoc:FD_010, + "DZ"^^euvoc:FD_050, + "DZ"^^euvoc:FD_400, + ".dz"^^euvoc:IANA_DOMAIN, + "DZ"^^euvoc:ISG_COU, + "DZ"^^euvoc:ISO_3166_1_ALPHA_2, + "DZA"^^euvoc:ISO_3166_1_ALPHA_3, + "012"^^euvoc:ISO_3166_1_NUM, + "DZA"^^euvoc:NAC, + "213"^^euvoc:PHONE_PREFIX, + "DZ"^^euvoc:TED, + "DZ"^^euvoc:TED_SCHEMA, + "DZ"^^euvoc:TIR, + "Northern Africa"^^euvoc:UNSD_GEOSCHEME, + "012"^^euvoc:UNSD_M49 ; + skos:prefLabel "الجزائر"@ar, + "Алжир"@bg, + "Algèria"@ca, + "Alžírsko"@cs, + "Algeriet"@da, + "Algerien"@de, + "Αλγερία"@el, + "Algeria"@en, + "Argelia"@es, + "Alžeeria"@et, + "Algeria"@fi, + "Algérie"@fr, + "An Ailgéir"@ga, + "Alžir"@hr, + "Algéria"@hu, + "Alsír"@is, + "Algeria"@it, + "アルジェリア"@ja, + "Algerien"@lb, + "Alžyras"@lt, + "Alžīrija"@lv, + "L-Alġerija"@mt, + "Algerije"@nl, + "Algerie"@no, + "Algieria"@pl, + "Argélia"@pt, + "Algeria"@ro, + "Алжир"@ru, + "Alžírsko"@sk, + "Alžirija"@sl, + "Algeriet"@sv, + "Cezayir"@tr, + "Алжир"@uk, + "阿尔及利亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ECU" ; + at:deprecated "false" ; + at:op-code "ECU" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "EC" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "EC" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "EC" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "EC" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ECU" ; + dc:identifier "ECU" ; + skos:altLabel "جمهورية الاكوادور"@ar, + "Република Еквадор"@bg, + "República de l'Equador"@ca, + "Ekvádorská republika"@cs, + "Republikken Ecuador"@da, + "Republik Ecuador"@de, + "Δημοκρατία του Ισημερινού"@el, + "Republic of Ecuador"@en, + "República del Ecuador"@es, + "Ecuadori Vabariik"@et, + "Ecuadorin tasavalta"@fi, + "République de l’Équateur"@fr, + "Poblacht Eacuadór"@ga, + "Republika Ekvador"@hr, + "Ecuadori Köztársaság"@hu, + "Lýðveldið Ekvador"@is, + "Repubblica dell’Ecuador"@it, + "エクアドル共和国"@ja, + "Republik Ecuador"@lb, + "Ekvadoro Respublika"@lt, + "Ekvadoras Republika"@lv, + "Ir-Repubblika tal-Ekwador"@mt, + "Republiek Ecuador"@nl, + "Republikken Ecuador"@no, + "Republika Ekwadoru"@pl, + "República do Equador"@pt, + "Ikwadur"@qu, + "Republica Ecuador"@ro, + "Республика Эквадор"@ru, + "Ekvádorská republika"@sk, + "Republika Ekvador"@sl, + "Republiken Ecuador"@sv, + "Ekvator Cumhuriyeti"@tr, + "Республіка Еквадор"@uk, + "厄瓜多尔共和国"@zh ; + skos:hiddenLabel "ecaudoriansk"@da, + "Ισημερινού"@el, + "Ecuadori"@et, + "Equateur"@fr, + "République de l'Équateur"@fr, + "Repubblica dell'Ecuador"@it, + "Ekvadoro"@lt, + "Ekvadoras"@lv, + "ir-Repubblika tal-Ekwador"@mt, + "l-Ekwador"@mt, + "ecouadoriană"@ro ; + skos:inScheme atold:country, + , + , + ; + skos:notation "272"^^euvoc:EP, + "50"^^euvoc:EP, + "EC"^^euvoc:FD_010, + "EC"^^euvoc:FD_400, + ".ec"^^euvoc:IANA_DOMAIN, + "EC"^^euvoc:ISG_COU, + "EC"^^euvoc:ISO_3166_1_ALPHA_2, + "ECU"^^euvoc:ISO_3166_1_ALPHA_3, + "218"^^euvoc:ISO_3166_1_NUM, + "ECU"^^euvoc:NAC, + "593"^^euvoc:PHONE_PREFIX, + "EC"^^euvoc:TED, + "EC"^^euvoc:TED_SCHEMA, + "EC"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "218"^^euvoc:UNSD_M49 ; + skos:prefLabel "الاكوادور"@ar, + "Еквадор"@bg, + "Equador"@ca, + "Ekvádor"@cs, + "Ecuador"@da, + "Ecuador"@de, + "Ισημερινός"@el, + "Ecuador"@en, + "Ecuador"@es, + "Ecuador"@et, + "Ecuador"@fi, + "Équateur"@fr, + "Eacuadór"@ga, + "Ekvador"@hr, + "Ecuador"@hu, + "Ekvador"@is, + "Ecuador"@it, + "エクアドル"@ja, + "Ecuador"@lb, + "Ekvadoras"@lt, + "Ekvadora"@lv, + "L-Ekwador"@mt, + "Ecuador"@nl, + "Ecuador"@no, + "Ekwador"@pl, + "Equador"@pt, + "Ecuador"@ro, + "Эквадор"@ru, + "Ekvádor"@sk, + "Ekvador"@sl, + "Ecuador"@sv, + "Ekvator"@tr, + "Еквадор"@uk, + "厄瓜多尔"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "EGY" ; + at:deprecated "false" ; + at:op-code "EGY" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "EG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "EG" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "ET" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "ET" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "EGY" ; + dc:identifier "EGY" ; + skos:altLabel "جمهورية مصر العربية"@ar, + "Арабска република Египет"@bg, + "República Àrab d'Egipte"@ca, + "Egyptská arabská republika"@cs, + "Den Arabiske Republik Egypten"@da, + "Arabische Republik Ägypten"@de, + "Αραβική Δημοκρατία της Αιγύπτου"@el, + "Arab Republic of Egypt"@en, + "República Árabe de Egipto"@es, + "Egiptuse Araabia Vabariik"@et, + "Egyptin arabitasavalta"@fi, + "République arabe d’Égypte"@fr, + "Poblacht Arabach na hÉigipte"@ga, + "Arapska Republika Egipat"@hr, + "Egyiptomi Arab Köztársaság"@hu, + "Arabalýðveldið Egyptaland"@is, + "Repubblica araba d’Egitto"@it, + "エジプト・アラブ共和国"@ja, + "Arabesch Republik Ägypten"@lb, + "Egipto Arabų Respublika"@lt, + "Ēģiptes Arābu Republika"@lv, + "Ir-Repubblika Għarbija tal-Eġittu"@mt, + "Arabische Republiek Egypte"@nl, + "Den arabiske republikken Egypt"@no, + "Arabska Republika Egiptu"@pl, + "República Árabe do Egito"@pt, + "Republica Arabă Egipt"@ro, + "Арабская Республика Египет"@ru, + "Egyptská arabská republika"@sk, + "Arabska republika Egipt"@sl, + "Arabrepubliken Egypten"@sv, + "Mısır Arap Cumhuriyeti"@tr, + "Арабська Республіка Єгипет"@uk, + "阿拉伯埃及共和国"@zh ; + skos:hiddenLabel "République arabe d'Égypte"@fr, + "an Éigipt"@ga, + "egiziana"@it, + "Egipto"@lt, + "Ēģiptes"@lv, + "ir-Repubblika Għarbija tal-Eġittu"@mt, + "l-Eġittu"@mt, + "Egipto"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "210"^^euvoc:EP, + "ET"^^euvoc:FD_010, + "ET"^^euvoc:FD_400, + ".eg"^^euvoc:IANA_DOMAIN, + "EG"^^euvoc:IBAN_COU, + "EG"^^euvoc:ISG_COU, + "EG"^^euvoc:ISO_3166_1_ALPHA_2, + "EGY"^^euvoc:ISO_3166_1_ALPHA_3, + "818"^^euvoc:ISO_3166_1_NUM, + "EGY"^^euvoc:NAC, + "20"^^euvoc:PHONE_PREFIX, + "EG"^^euvoc:TED, + "EG"^^euvoc:TED_SCHEMA, + "ET"^^euvoc:TIR, + "Northern Africa"^^euvoc:UNSD_GEOSCHEME, + "818"^^euvoc:UNSD_M49 ; + skos:prefLabel "مصر"@ar, + "Египет"@bg, + "Egipte"@ca, + "Egypt"@cs, + "Egypten"@da, + "Ägypten"@de, + "Αίγυπτος"@el, + "Egypt"@en, + "Egipto"@es, + "Egiptus"@et, + "Egypti"@fi, + "Égypte"@fr, + "An Éigipt"@ga, + "Egipat"@hr, + "Egyiptom"@hu, + "Egyptaland"@is, + "Egitto"@it, + "エジプト"@ja, + "Ägypten"@lb, + "Egiptas"@lt, + "Ēģipte"@lv, + "L-Eġittu"@mt, + "Egypte"@nl, + "Egypt"@no, + "Egipt"@pl, + "Egito"@pt, + "Egipt"@ro, + "Египет"@ru, + "Egypt"@sk, + "Egipt"@sl, + "Egypten"@sv, + "Mısır"@tr, + "Єгипет"@uk, + "埃及"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ERI" ; + at:deprecated "false" ; + at:op-code "ERI" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "ER" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "ER" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "ERI" ; + dc:source "EurLex" ] ; + at:start.use "1993-05-24" ; + atold:op-code "ERI" ; + dc:identifier "ERI" ; + skos:altLabel "إريتريا"@ar, + "دولة إريتريا"@ar, + "Държавата Еритрея"@bg, + "Estat d'Eritrea"@ca, + "Stát Eritrea"@cs, + "Staten Eritrea"@da, + "Staat Eritrea"@de, + "Κράτος της Ερυθραίας"@el, + "State of Eritrea"@en, + "Estado de Eritrea"@es, + "Eritrea Riik"@et, + "Eritrean valtio"@fi, + "État d’Érythrée"@fr, + "Stát na hEiritré"@ga, + "Država Eritreja"@hr, + "Eritrea Állam"@hu, + "Eritreuríki"@is, + "Stato di Eritrea"@it, + "エリトリア国"@ja, + "Staat Eritrea"@lb, + "Eritrėjos Valstybė"@lt, + "Eritrejas Valsts"@lv, + "L-Istat tal-Eritrea"@mt, + "Staat Eritrea"@nl, + "Staten Eritrea"@no, + "Państwo Erytrea"@pl, + "Estado da Eritreia"@pt, + "Statul Eritreea"@ro, + "Государство Эритрея"@ru, + "Eritrejský štát"@sk, + "Država Eritreja"@sl, + "Staten Eritrea"@sv, + "ኤርትራ"@ti, + "Eritre Devleti"@tr, + "Держава Еритрея"@uk, + "厄立特里亚国"@zh ; + skos:hiddenLabel "Ερυθραίας"@el, + "État d'Érythrée"@fr, + "an Eiritré"@ga, + "Eritrėjos"@lt, + "Eritrejas"@lv, + "l-Eritrea"@mt, + "l-Istat tal-Eritrea"@mt, + "Eritrese"@nl, + "eritreia"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "53"^^euvoc:EP, + "ERI"^^euvoc:FD_010, + ".er"^^euvoc:IANA_DOMAIN, + "ER"^^euvoc:ISG_COU, + "ER"^^euvoc:ISO_3166_1_ALPHA_2, + "ERI"^^euvoc:ISO_3166_1_ALPHA_3, + "232"^^euvoc:ISO_3166_1_NUM, + "ERI"^^euvoc:NAC, + "291"^^euvoc:PHONE_PREFIX, + "ER"^^euvoc:TED, + "ER"^^euvoc:TED_SCHEMA, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "232"^^euvoc:UNSD_M49 ; + skos:prefLabel "اريتريا"@ar, + "Еритрея"@bg, + "Eritrea"@ca, + "Eritrea"@cs, + "Eritrea"@da, + "Eritrea"@de, + "Ερυθραία"@el, + "Eritrea"@en, + "Eritrea"@es, + "Eritrea"@et, + "Eritrea"@fi, + "Érythrée"@fr, + "An Eiritré"@ga, + "Eritreja"@hr, + "Eritrea"@hu, + "Eritrea"@is, + "Eritrea"@it, + "エリトリア"@ja, + "Eritrea"@lb, + "Eritrėja"@lt, + "Eritreja"@lv, + "L-Eritrea"@mt, + "Eritrea"@nl, + "Eritrea"@no, + "Erytrea"@pl, + "Eritreia"@pt, + "Eritreea"@ro, + "Эритрея"@ru, + "Eritrea"@sk, + "Eritreja"@sl, + "Eritrea"@sv, + "Eritre"@tr, + "Еритрея"@uk, + "厄立特里亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ETH" ; + at:deprecated "false" ; + at:op-code "ETH" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "ET" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "ET" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "ETH" ; + dc:source "EurLex" ] ; + at:start.use "1987-02-22" ; + atold:op-code "ETH" ; + dc:identifier "ETH" ; + skos:altLabel "ኢትዮጵያ"@am, + "جمهورية إثيوبيا الديمقراطية الاتحادية"@ar, + "Федерална демократична република Етиопия"@bg, + "República Federal Democràtica d'Etiòpia"@ca, + "Etiopská federativní demokratická republika"@cs, + "Den Føderative Demokratiske Republik Etiopien"@da, + "Demokratische Bundesrepublik Äthiopien"@de, + "Ομοσπονδιακή Λαϊκή Δημοκρατία της Αιθιοπίας"@el, + "Federal Democratic Republic of Ethiopia"@en, + "República Democrática Federal de Etiopía"@es, + "Etioopia Demokraatlik Liitvabariik"@et, + "Etiopian demokraattinen liittotasavalta"@fi, + "République démocratique fédérale d’Éthiopie"@fr, + "Poblacht Dhaonlathach Chonaidhme na hAetóipe"@ga, + "Federalna Demokratska Republika Etiopija"@hr, + "Etióp Demokratikus Szövetségi Köztársaság"@hu, + "Sambandslýðstjórnarlýðveldið Eþíópía"@is, + "Repubblica federale democratica d’Etiopia"@it, + "エチオピア連邦民主共和国"@ja, + "Demokratesch Bundesrepublik Äthiopien"@lb, + "Etiopijos Federacinė Demokratinė Respublika"@lt, + "Etiopijas Federatīvā Demokrātiskā Republika"@lv, + "Ir-Repubblika Demokratika Federali tal-Etjopja"@mt, + "Federale Democratische Republiek Ethiopië"@nl, + "Den føderale demokratiske republikk Etiopia"@no, + "Federalna Demokratyczna Republika Etiopii"@pl, + "República Federal Democrática da Etiópia"@pt, + "Republica Federală Democrată Etiopia"@ro, + "Федеративная Демократическая Республика Эфиопия"@ru, + "Etiópska federatívna demokratická republika"@sk, + "Zvezna demokratična republika Etiopija"@sl, + "Demokratiska förbundsrepubliken Etiopien"@sv, + "Etiyopya Federal Demokratik Cumhuriyeti"@tr, + "Федеративна Демократична Республіка Ефіопія"@uk, + "埃塞俄比亚联邦民主共和国"@zh ; + skos:changeNote "Former acronym: PDRE"@en, + "The People’s Democratic Republic of Ethiopia came to an end in May 1991 with the Eritrean War of Independence. It splitted into the Federal Democratic Republic of Ethiopia and the State of Eritrea."@en, + "RPDE"@fr, + "RDPE"@pt ; + skos:hiddenLabel "Etiopská federativní republika"@cs, + "Αιθιοπίας"@el, + "Ethiopie"@fr, + "République démocratique fédérale d'Éthiopie"@fr, + "Poblacht Dhaonlathach Chónaidhme na hAetóipe"@ga, + "an Aetóip"@ga, + "Savezna Demokratska Republika Etiopija"@hr, + "Repubblica federale democratica di Etiopia"@it, + "Etiopijos"@lt, + "Etiopijas"@lv, + "ir-Repubblika Demokratika Federali tal-Etjopja"@mt, + "l-Etjopja"@mt, + "Federativna demokratična republika Etiopija"@sl, + "Demokratiska republiken Etiopien"@sv ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "265"^^euvoc:EP, + "ETH"^^euvoc:FD_010, + ".et"^^euvoc:IANA_DOMAIN, + "ET"^^euvoc:ISG_COU, + "ET"^^euvoc:ISO_3166_1_ALPHA_2, + "ETH"^^euvoc:ISO_3166_1_ALPHA_3, + "231"^^euvoc:ISO_3166_1_NUM, + "ETH"^^euvoc:NAC, + "251"^^euvoc:PHONE_PREFIX, + "ET"^^euvoc:TED, + "ET"^^euvoc:TED_SCHEMA, + "ETH"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "231"^^euvoc:UNSD_M49 ; + skos:prefLabel "اثيوبيا"@ar, + "Етиопия"@bg, + "Etiòpia"@ca, + "Etiopie"@cs, + "Etiopien"@da, + "Äthiopien"@de, + "Αιθιοπία"@el, + "Ethiopia"@en, + "Etiopía"@es, + "Etioopia"@et, + "Etiopia"@fi, + "Éthiopie"@fr, + "An Aetóip"@ga, + "Etiopija"@hr, + "Etiópia"@hu, + "Eþíópía"@is, + "Etiopia"@it, + "エチオピア"@ja, + "Äthiopien"@lb, + "Etiopija"@lt, + "Etiopija"@lv, + "L-Etjopja"@mt, + "Ethiopië"@nl, + "Etiopia"@no, + "Etiopia"@pl, + "Etiópia"@pt, + "Etiopia"@ro, + "Эфиопия"@ru, + "Etiópia"@sk, + "Etiopija"@sl, + "Etiopien"@sv, + "Etiyopya"@tr, + "Ефіопія"@uk, + "埃塞俄比亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "FJI" ; + at:deprecated "false" ; + at:op-code "FJI" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "FJI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "FJ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "FJ" ; + dc:source "TED" ] ; + at:start.use "1970-10-10" ; + atold:op-code "FJI" ; + dc:identifier "FJI" ; + skos:altLabel "جمهورية فيجي"@ar, + "Република Фиджи"@bg, + "Република острови Фиджи"@bg, + "República de Fiji"@ca, + "Fidžijská republika"@cs, + "Republika Fidžijské ostrovy"@cs, + "Republikken Fiji"@da, + "Republikken Fijiøerne"@da, + "Republik Fidschi"@de, + "Republik Fidschi-Inseln"@de, + "Δημοκρατία των Νήσων Φίτζι"@el, + "Δημοκρατία των Φίτζι"@el, + "Republic of Fiji"@en, + "República de Fiyi"@es, + "República de las Islas Fiyi"@es, + "Fidži Saarte Vabariik"@et, + "Fidži Vabariik"@et, + "Fidžin tasavalta"@fi, + "Fidžisaarten tasavalta"@fi, + "Viti"@fj, + "République des Fidji"@fr, + "République des Îles Fidji"@fr, + "Poblacht Fhidsí"@ga, + "फ़िजी"@hif, + "Republika Fidži"@hr, + "Fidzsi Köztársaság"@hu, + "Fidzsi-szigetek"@hu, + "Fidzsi-szigeteki Köztársaság"@hu, + "Lýðveldið Fiji"@is, + "Repubblica delle Isole Figi"@it, + "Repubblica di Figi"@it, + "フィジー共和国"@ja, + "Republik Fidschi"@lb, + "Fidžio Respublika"@lt, + "Fidžio Salų Respublika"@lt, + "Fidži Republika"@lv, + "Ir-Repubblika tal-Gżejjer Fiġi"@mt, + "Ir-Repubblika ta’ Fiġi"@mt, + "Republiek Fiji"@nl, + "Republiek Fiji-eilanden"@nl, + "Republikken Fiji"@no, + "Republika Fidżi"@pl, + "Republika Wysp Fidżi"@pl, + "República das Fiji"@pt, + "República das Ilhas Fiji"@pt, + "Republica Fiji"@ro, + "Republica Insulelor Fiji"@ro, + "Республика Фиджи"@ru, + "Fidžijská republika"@sk, + "Republika Fidžijských ostrovov"@sk, + "Republika Fidži"@sl, + "Republika otokov Fidži"@sl, + "Republiken Fiji"@sv, + "Republiken Fijiöarna"@sv, + "Fiji Cumhuriyeti"@tr, + "Республіка Фіджі"@uk, + "斐济共和国"@zh ; + skos:hiddenLabel "fidgienne"@fr, + "Fidžio"@lt, + "ir-Repubblika ta' Fiġi"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "56"^^euvoc:EP, + "FJI"^^euvoc:FD_010, + ".fj"^^euvoc:IANA_DOMAIN, + "FJ"^^euvoc:ISG_COU, + "FJ"^^euvoc:ISO_3166_1_ALPHA_2, + "FJI"^^euvoc:ISO_3166_1_ALPHA_3, + "242"^^euvoc:ISO_3166_1_NUM, + "FJI"^^euvoc:NAC, + "679"^^euvoc:PHONE_PREFIX, + "FJ"^^euvoc:TED, + "FJ"^^euvoc:TED_SCHEMA, + "DJI"^^euvoc:TIR, + "Melanesia"^^euvoc:UNSD_GEOSCHEME, + "242"^^euvoc:UNSD_M49 ; + skos:prefLabel "فيجي"@ar, + "Фиджи"@bg, + "Fiji"@ca, + "Fidži"@cs, + "Fiji"@da, + "Fidschi"@de, + "Φίτζι"@el, + "Fiji"@en, + "Fiyi"@es, + "Fidži"@et, + "Fidži"@fi, + "Fidji"@fr, + "Fidsí"@ga, + "Fidži"@hr, + "Fidzsi"@hu, + "Fiji"@is, + "Figi"@it, + "フィジー"@ja, + "Fidschi"@lb, + "Fidžis"@lt, + "Fidži"@lv, + "Fiġi"@mt, + "Fiji"@nl, + "Fiji"@no, + "Fidżi"@pl, + "Fiji"@pt, + "Fiji"@ro, + "Фиджи"@ru, + "Fidži"@sk, + "Fidži"@sl, + "Fiji"@sv, + "Fiji"@tr, + "Фіджі"@uk, + "斐济"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "FLK" ; + at:deprecated "false" ; + at:op-code "FLK" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "FK" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "FK" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "FLK" ; + dc:identifier "FLK" ; + skos:altLabel "Malwinen"@de, + "Falklandi saared ja sõltkonnad"@et, + "Malviini saared"@et, + "Malouines"@fr, + "Folklando Salos"@lt, + "Malvinai"@lt, + "Malvinu salas"@lv, + "Falklandské ostrovy"@sk, + "Malvini"@sl ; + skos:broader ; + skos:hiddenLabel "Falklandinseln (Malwinen)"@de, + "Νήσοι Φώκλαντ (Μαλβίνες)"@el, + "Νήσων Φώκλαντ (Μαλβίνων)"@el, + "britannialainen, falklandinsaarelainen"@fi, + "des Îles Falkland (Malvinas)"@fr, + "Îles Falkland (Malouines)"@fr, + "duine ó Oileáin Fháclainne"@ga, + "Falklandskih Otoka"@hr, + "Folklando"@lt, + "Folklenda (Malvinu) Salas"@lv, + "Folklenda (Malvinu) Salu"@lv, + "il-Gżejjer Falkland"@mt, + "falklandesa"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "57"^^euvoc:EP, + ".fk"^^euvoc:IANA_DOMAIN, + "FK"^^euvoc:ISG_COU, + "FK"^^euvoc:ISO_3166_1_ALPHA_2, + "FLK"^^euvoc:ISO_3166_1_ALPHA_3, + "238"^^euvoc:ISO_3166_1_NUM, + "FLK"^^euvoc:NAC, + "500"^^euvoc:PHONE_PREFIX, + "FK"^^euvoc:TED, + "FK"^^euvoc:TED_SCHEMA, + "South America"^^euvoc:UNSD_GEOSCHEME, + "238"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر فولكلاند"@ar, + "Фолкландски острови"@bg, + "Illes Falkland (Malvines)"@ca, + "Falklandské ostrovy"@cs, + "Falklandsøerne"@da, + "Falklandinseln"@de, + "Νήσοι Φώκλαντ"@el, + "Falkland Islands"@en, + "Islas Malvinas"@es, + "Falklandi saared"@et, + "Falklandinsaaret"@fi, + "Îles Falkland"@fr, + "Oileáin Fháclainne"@ga, + "Falklandski Otoci"@hr, + "Falkland-szigetek"@hu, + "Falklandseyjar"@is, + "Isole Falkland"@it, + "フォークランド諸島"@ja, + "Falklandinselen"@lb, + "Folklandas"@lt, + "Folklenda salas"@lv, + "Il-Gżejjer Falkland"@mt, + "Falklandeilanden"@nl, + "Falklandsøyene"@no, + "Falklandy"@pl, + "Ilhas Falkland"@pt, + "Insulele Falkland"@ro, + "Фолклендские острова"@ru, + "Falklandy"@sk, + "Falklandski otoki"@sl, + "Falklandsöarna"@sv, + "Falkland Adaları"@tr, + "Фолклендські острови"@uk, + "福克兰群岛"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "FRO" ; + at:deprecated "false" ; + at:op-code "FRO" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "FO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "FO" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "FR" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "FRO" ; + dc:identifier "FRO" ; + skos:altLabel "جزر فاراو"@ar, + "Illes Fèroe"@ca, + "Faroe Islands"@en, + "Feröer szigetek"@hu, + "フェロー諸島"@ja, + "Färöerinselen"@lb, + "Фарерские Острова"@ru, + "Фарерські острови"@uk ; + skos:broader ; + skos:changeNote "Междуинституционално ръководство за изготвяне на публикациите: Автономна част от Кралство Дания."@bg, + "Pravidla pro jednotnou úpravu dokumentů: Samosprávné území Dánska."@cs, + "Vejledning i Udformning af EU-publikationer: Danmarks territorium med selvstyre."@da, + "Interinstitutionelle Regeln für Veröffentlichungen: Autonomes Gebiet Dänemarks."@de, + "Διοργανικό εγχειρίδιο σύνταξης κειμένων: Αυτοδιοικούμενο έδαφος της Δανίας."@el, + "Interinstitutional Style Guide: Self-governing territory of Denmark."@en, + "Libro de estilo interinstitucional: Administración autónoma dependiente de Dinamarca."@es, + "Institutsioonidevaheline stiilijuhend: Taani autonoome territorium."@et, + "Toimielinten yhteiset tekstinlaadinnan ohjeet: Tanskalle kuuluva itsehallintoalue."@fi, + "Code de rédaction interinstitutionnel: territoire autonome du Danemark."@fr, + "An Treoir Stíle Idirinstitíuideach: críoch fhéinrialaithe de chuid na Danmhairge."@ga, + "Intézményközi kiadványszerkesztési útmutató: Dánia területe."@hu, + "Manuale interistituzionale di convenzioni redazionali: territorio autonomo della Danimarca."@it, + "Institucijų leidinių rengimo vadovas: Danijos autonominė teritorija."@lt, + "Iestāžu publikāciju noformēšanas rokasgrāmata: autonoma Dānijas teritorija."@lv, + "Gwida tal-Istil Interistituzzjonali: Territorju awtonomu tad-Danimarka."@mt, + "Interinstitutionele schrijfwijzer: Autonoom gebied van Denemarken."@nl, + "Międzyinstytucjonalny przewodnik redakcyjny: Autonomiczne terytorium Danii."@pl, + "Código de Redação Interinstitucional: Território autónomo da Dinamarca."@pt, + "Ghid de redactare interinstituțional: teritoriu autonom al Danemarcei."@ro, + "Medziinštitucionálna príručka úpravy dokumentov: autonómne územie Dánska."@sk, + "Medinstitucionalni slogovni priročnik: samoupravno ozemlje Danske."@sl, + "Publikationshandboken: Självstyrande del av Danmark."@sv ; + skos:hiddenLabel "Νήσων Φερόων"@el, + "Faeroese"@en, + "tanskalainen, färsaarelainen"@fi, + "Ferojski (Ovčji) Otoci"@hr, + "Ferojskih (Ovčjih) Otoka"@hr, + "Feröer-szigetek"@hu, + "Fær Øer"@it, + "Farerų"@lt, + "Farerų Salos"@lt, + "Fēru Salu"@lv, + "Faeoroejana"@mt, + "il-Gżejjer Faeroe"@mt, + "il-Gżejjer Faroe"@mt, + "Wysp Owczych"@pl, + "Faroé"@pt, + "Ilhas Faroé"@pt, + "din Insulele Feroe"@ro, + "Ostrovy Faroe"@sk ; + skos:inScheme atold:country, + , + , + ; + skos:notation "59"^^euvoc:EP, + "FR"^^euvoc:FD_010, + ".fo"^^euvoc:IANA_DOMAIN, + "FO"^^euvoc:IBAN_COU, + "FO"^^euvoc:ISG_COU, + "FO"^^euvoc:ISO_3166_1_ALPHA_2, + "FRO"^^euvoc:ISO_3166_1_ALPHA_3, + "234"^^euvoc:ISO_3166_1_NUM, + "FRO"^^euvoc:NAC, + "298"^^euvoc:PHONE_PREFIX, + "FO"^^euvoc:TED, + "FO"^^euvoc:TED_SCHEMA, + "FR"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "234"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر فارو"@ar, + "Фарэрскія астравы"@be, + "Фарьорски острови"@bg, + "Farska ostrva"@bs, + "Fèroe"@ca, + "Faerské ostrovy"@cs, + "Færøerne"@da, + "Färöer"@de, + "Νήσοι Φερόες"@el, + "Faroes"@en, + "Islas Feroe"@es, + "Fääri saared"@et, + "Faroe Uharteak"@eu, + "Färsaaret"@fi, + "Føroyar"@fo, + "Îles Féroé"@fr, + "Oileáin Fharó"@ga, + "Illas Feroe"@gl, + "Farski Otoci"@hr, + "Feröer"@hu, + "Færeyjar"@is, + "Isole Fær Øer"@it, + "フェロー"@ja, + "Färöer"@lb, + "Farerai"@lt, + "Fēru Salas"@lv, + "Фарски Острови"@mk, + "Il-Gżejjer Faeroe"@mt, + "Faeröer"@nl, + "Færøyene"@no, + "Wyspy Owcze"@pl, + "Ilhas Feroe"@pt, + "Inslas Feroe"@rm, + "Insulele Feroe"@ro, + "Фарерские острова"@ru, + "Faerské ostrovy"@sk, + "Ferski otoki"@sl, + "Ishujt Faroe"@sq, + "Фарска острва"@sr, + "Färöarna"@sv, + "Faroe Adaları"@tr, + "Фаруес"@uk, + "法罗群岛"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "FSM" ; + at:deprecated "false" ; + at:op-code "FSM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "FM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "FSM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "FM" ; + dc:source "TED" ] ; + at:start.use "1986-11-03" ; + atold:op-code "FSM" ; + dc:identifier "FSM" ; + skos:altLabel "ولايات ميكرونيزيا الموحدة"@ar, + "Федеративни щати Микронезия"@bg, + "Estats Federats de Micronèsia"@ca, + "Federativní státy Mikronésie"@cs, + "Mikronesiens Forenede Stater"@da, + "Föderierte Staaten von Mikronesien"@de, + "Ομόσπονδες Πολιτείες της Μικρονησίας"@el, + "Federated States of Micronesia"@en, + "Estados Federados de Micronesia"@es, + "Mikroneesia Liiduriigid"@et, + "Mikronesian federaatio"@fi, + "États fédérés de Micronésie"@fr, + "Stáit Chónaidhme na Micrinéise"@ga, + "Savezne Države Mikronezije"@hr, + "Mikronéziai Szövetségi Államok"@hu, + "Sambandsríki Míkrónesíu"@is, + "Stati federati di Micronesia"@it, + "ミクロネシア連邦"@ja, + "Federéiert Staate vu Mikronesien"@lb, + "Mikronezijos Federacinės Valstijos"@lt, + "Mikronēzijas Federatīvās Valstis"@lv, + "L-Istati Federali tal-Mikroneżja"@mt, + "Federale Staten van Micronesia"@nl, + "Mikronesiaføderasjonen"@no, + "Sfederowane Stany Mikronezji"@pl, + "Estados Federados da Micronésia"@pt, + "Statele Federate ale Microneziei"@ro, + "Федеративные Штаты Микронезии"@ru, + "Mikronézske federatívne štáty"@sk, + "Združene države Mikronezije"@sl, + "Mikronesiska federationen"@sv, + "Mikronezya Federe Devletleri"@tr, + "Федеративні Штати Мікронезії"@uk, + "密克罗尼西亚联邦"@zh ; + skos:hiddenLabel "Μικρονησίας"@el, + "Etats fédérés de Micronésie"@fr, + "des États fédérés de Micronésie"@fr, + "an Mhicrinéis"@ga, + "Mikronezijos"@lt, + "Mikronēzijas"@lv, + "il-Mikroneżja"@mt, + "l-Istati Federati tal-Mikroneżja"@mt, + "dos Estados Federados da Micronésia"@pt, + "Federativne države Mikronezije"@sl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "58"^^euvoc:EP, + "FSM"^^euvoc:FD_010, + ".fm"^^euvoc:IANA_DOMAIN, + "FM"^^euvoc:ISG_COU, + "FM"^^euvoc:ISO_3166_1_ALPHA_2, + "FSM"^^euvoc:ISO_3166_1_ALPHA_3, + "583"^^euvoc:ISO_3166_1_NUM, + "FSM"^^euvoc:NAC, + "691"^^euvoc:PHONE_PREFIX, + "FM"^^euvoc:TED, + "FM"^^euvoc:TED_SCHEMA, + "Micronesia"^^euvoc:UNSD_GEOSCHEME, + "583"^^euvoc:UNSD_M49 ; + skos:prefLabel "مايكرونيزيا"@ar, + "Микронезия"@bg, + "Micronèsia"@ca, + "Mikronésie"@cs, + "Mikronesien"@da, + "Mikronesien"@de, + "Μικρονησία"@el, + "Micronesia"@en, + "Micronesia"@es, + "Mikroneesia"@et, + "Mikronesia"@fi, + "Micronésie"@fr, + "An Mhicrinéis"@ga, + "Mikronezija"@hr, + "Mikronézia"@hu, + "Míkrónesía"@is, + "Micronesia"@it, + "ミクロネシア"@ja, + "Mikronesien"@lb, + "Mikronezija"@lt, + "Mikronēzija"@lv, + "Il-Mikroneżja"@mt, + "Micronesia"@nl, + "Mikronesia"@no, + "Mikronezja"@pl, + "Micronésia"@pt, + "Micronezia"@ro, + "Микронезия"@ru, + "Mikronézia"@sk, + "Mikronezija"@sl, + "Mikronesien"@sv, + "Mikronezya"@tr, + "Мікронезія"@uk, + "密克罗尼西亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GAB" ; + at:deprecated "false" ; + at:op-code "GAB" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GA" ; + dc:source "TED" ] ; + at:start.use "1960-08-17" ; + atold:op-code "GAB" ; + dc:identifier "GAB" ; + skos:altLabel "جمهورية الغابون"@ar, + "Република Габон"@bg, + "República Gabonesa"@ca, + "Gabonská republika"@cs, + "Den Gabonesiske Republik"@da, + "Gabunische Republik"@de, + "Δημοκρατία της Γκαμπόν"@el, + "Gabonese Republic"@en, + "República Gabonesa"@es, + "Gaboni Vabariik"@et, + "Gabonin tasavalta"@fi, + "République gabonaise"@fr, + "Poblacht na Gabúine"@ga, + "Gabonska Republika"@hr, + "Gaboni Köztársaság"@hu, + "Gabonska lýðveldið"@is, + "Repubblica gabonese"@it, + "ガボン共和国"@ja, + "Gabunesch Republik"@lb, + "Gabono Respublika"@lt, + "Gabonas Republika"@lv, + "Ir-Repubblika Gaboniża"@mt, + "Republiek Gabon"@nl, + "Republikken Gabon"@no, + "Republika Gabońska"@pl, + "República Gabonesa"@pt, + "Republica Gaboneză"@ro, + "Габонская Республика"@ru, + "Gabonská republika"@sk, + "Gabonska republika"@sl, + "Republiken Gabon"@sv, + "Gabon Cumhuriyeti"@tr, + "Габонська Республіка"@uk, + "加蓬共和国"@zh ; + skos:hiddenLabel "an Ghabúin"@ga, + "Gabono"@lt, + "Gabonas"@lv, + "il-Gabon"@mt, + "ir-Repubblika Gaboniża"@mt, + "Gabonese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "234"^^euvoc:EP, + "GA"^^euvoc:FD_010, + "GA"^^euvoc:FD_400, + ".ga"^^euvoc:IANA_DOMAIN, + "GA"^^euvoc:ISG_COU, + "GA"^^euvoc:ISO_3166_1_ALPHA_2, + "GAB"^^euvoc:ISO_3166_1_ALPHA_3, + "266"^^euvoc:ISO_3166_1_NUM, + "GAB"^^euvoc:NAC, + "241"^^euvoc:PHONE_PREFIX, + "GA"^^euvoc:TED, + "GA"^^euvoc:TED_SCHEMA, + "G"^^euvoc:TIR, + "Middle Africa"^^euvoc:UNSD_GEOSCHEME, + "266"^^euvoc:UNSD_M49 ; + skos:prefLabel "الغابون"@ar, + "Габон"@bg, + "Gabon"@ca, + "Gabon"@cs, + "Gabon"@da, + "Gabun"@de, + "Γκαμπόν"@el, + "Gabon"@en, + "Gabón"@es, + "Gabon"@et, + "Gabon"@fi, + "Gabon"@fr, + "An Ghabúin"@ga, + "Gabon"@hr, + "Gabon"@hu, + "Gabon"@is, + "Gabon"@it, + "ガボン"@ja, + "Gabun"@lb, + "Gabonas"@lt, + "Gabona"@lv, + "Il-Gabon"@mt, + "Gabon"@nl, + "Gabon"@no, + "Gabon"@pl, + "Gabão"@pt, + "Gabon"@ro, + "Габон"@ru, + "Gabon"@sk, + "Gabon"@sl, + "Gabon"@sv, + "Gabon"@tr, + "Габон"@uk, + "加蓬"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GEO" ; + at:deprecated "false" ; + at:op-code "GEO" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "GE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "GEORGIE" ; + dc:source "EurLex" ] ; + at:start.use "1991-04-09" ; + atold:op-code "GEO" ; + dc:identifier "GEO" ; + skos:altLabel "Georgia"@hu, + "Grúz Köztársaság"@hu, + "საქართველო"@ka, + "Republika Gruzija"@sl ; + skos:hiddenLabel "an tSeoirsia"@ga, + "Republika Gruzija"@hr, + "Gruzija"@lt, + "Gruzijos"@lt, + "Gruzijas"@lv, + "il-Georgia"@mt ; + skos:historyNote "The ‘GE’ ISO code was formerly used for ‘Gilbert and Ellice Islands’, now Tuvalu, TV."@en, + "Le code ISO «GE» a été précédemment assigné aux «Îles Gilbert et Ellice», maintenant Tuvalu, TV."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:notation "63"^^euvoc:EP, + "GG"^^euvoc:FD_010, + "GEORGIE"^^euvoc:FD_050, + ".ge"^^euvoc:IANA_DOMAIN, + "GE"^^euvoc:IBAN_COU, + "GE"^^euvoc:ISG_COU, + "GE"^^euvoc:ISO_3166_1_ALPHA_2, + "GEO"^^euvoc:ISO_3166_1_ALPHA_3, + "268"^^euvoc:ISO_3166_1_NUM, + "GEO"^^euvoc:NAC, + "995"^^euvoc:PHONE_PREFIX, + "GE"^^euvoc:TED, + "GE"^^euvoc:TED_SCHEMA, + "GE"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "268"^^euvoc:UNSD_M49 ; + skos:prefLabel "جورجيا"@ar, + "Грузия"@bg, + "Geòrgia"@ca, + "Gruzie"@cs, + "Georgien"@da, + "Georgien"@de, + "Γεωργία"@el, + "Georgia"@en, + "Georgia"@es, + "Gruusia"@et, + "Georgia"@fi, + "Géorgie"@fr, + "An tSeoirsia"@ga, + "Gruzija"@hr, + "Grúzia"@hu, + "Georgía"@is, + "Georgia"@it, + "グルジア"@ja, + "Georgien"@lb, + "Sakartvelas"@lt, + "Gruzija"@lv, + "Il-Georgia"@mt, + "Georgië"@nl, + "Georgia"@no, + "Gruzja"@pl, + "Geórgia"@pt, + "Georgia"@ro, + "Грузия"@ru, + "Gruzínsko"@sk, + "Gruzija"@sl, + "Georgien"@sv, + "Gürcistan"@tr, + "Грузія"@uk, + "格鲁吉亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GHA" ; + at:deprecated "false" ; + at:op-code "GHA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GH" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "GH" ; + dc:source "TED" ] ; + at:start.use "1957-03-05" ; + atold:op-code "GHA" ; + dc:identifier "GHA" ; + skos:altLabel "جمهورية غانا"@ar, + "Република Гана"@bg, + "República de Ghana"@ca, + "Ghanská republika"@cs, + "Republikken Ghana"@da, + "Republik Ghana"@de, + "Δημοκρατία της Γκάνας"@el, + "Republic of Ghana"@en, + "República de Ghana"@es, + "Ghana Vabariik"@et, + "Ghanan tasavalta"@fi, + "République du Ghana"@fr, + "Poblacht Ghána"@ga, + "Republika Ganaa"@hr, + "Ghánai Köztársaság"@hu, + "Lýðveldið Gana"@is, + "Repubblica del Ghana"@it, + "ガーナ共和国"@ja, + "Republik Ghana"@lb, + "Ganos Respublika"@lt, + "Ganas Republika"@lv, + "Ir-Repubblika tal-Ghana"@mt, + "Republiek Ghana"@nl, + "Republikken Ghana"@no, + "Republika Ghany"@pl, + "República do Gana"@pt, + "Republica Ghana"@ro, + "Республика Гана"@ru, + "Ghanská republika"@sk, + "Republika Gana"@sl, + "Republiken Ghana"@sv, + "Gana Cumhuriyeti"@tr, + "Республіка Гана"@uk, + "加纳共和国"@zh ; + skos:hiddenLabel "ganesa"@es, + "Republika Gana"@hr, + "Ganos"@lt, + "Ganas"@lv, + "il-Ghana"@mt, + "ir-Repubblika tal-Ghana"@mt, + "Ghanese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "65"^^euvoc:EP, + "GH"^^euvoc:FD_010, + "GH"^^euvoc:FD_400, + ".gh"^^euvoc:IANA_DOMAIN, + "GH"^^euvoc:ISG_COU, + "GH"^^euvoc:ISO_3166_1_ALPHA_2, + "GHA"^^euvoc:ISO_3166_1_ALPHA_3, + "288"^^euvoc:ISO_3166_1_NUM, + "GHA"^^euvoc:NAC, + "233"^^euvoc:PHONE_PREFIX, + "GH"^^euvoc:TED, + "GH"^^euvoc:TED_SCHEMA, + "GH"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "288"^^euvoc:UNSD_M49 ; + skos:prefLabel "غانا"@ar, + "Гана"@bg, + "Ghana"@ca, + "Ghana"@cs, + "Ghana"@da, + "Ghana"@de, + "Γκάνα"@el, + "Ghana"@en, + "Ghana"@es, + "Ghana"@et, + "Ghana"@fi, + "Ghana"@fr, + "Gána"@ga, + "Gana"@hr, + "Ghána"@hu, + "Gana"@is, + "Ghana"@it, + "ガーナ"@ja, + "Ghana"@lb, + "Gana"@lt, + "Gana"@lv, + "Il-Ghana"@mt, + "Ghana"@nl, + "Ghana"@no, + "Ghana"@pl, + "Gana"@pt, + "Ghana"@ro, + "Гана"@ru, + "Ghana"@sk, + "Gana"@sl, + "Ghana"@sv, + "Gana"@tr, + "Гана"@uk, + "加纳"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GIB" ; + at:deprecated "false" ; + at:op-code "GIB" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GI" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "GI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GIBRALTAR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GI" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "GIB" ; + dc:identifier "GIB" ; + skos:broader ; + skos:changeNote "Междуинституционално ръководство за изготвяне на публикациите: Гибралтар: Британска отвъдморска територия."@bg, + "Pravidla pro jednotnou úpravu dokumentů: Gibraltar: Britské zámořské území."@cs, + "Vejledning i Udformning af EU-publikationer: Gibraltar: Britisk oversøisk territorium."@da, + "Interinstitutionelle Regeln für Veröffentlichungen: Gibraltar: Britisches Überseegebiet."@de, + "Διοργανικό εγχειρίδιο σύνταξης κειμένων: Γιβραλτάρ: Βρετανικό υπερπόντιο έδαφος."@el, + "Interinstitutional Style guide: Gibraltar: British overseas territory."@en, + "Libro de estilo interinstitucional: Gibraltar: Territorio británico de ultramar."@es, + "Institutsioonidevaheline stiilijuhend: Gibraltar: Briti ülemereterritoorium."@et, + "Toimielinten yhteiset tekstinlaadinnan ohjeet: Gibraltar: Brittiläinen merentakainen territorio."@fi, + "Code de rédaction interinstitutionnel: Gibraltar: territoire d’outre-mer britannique."@fr, + "An Treoir Stíle Idirinstitíuideach: Giobráltar: críoch thar lear de chuid na Ríochta Aontaithe."@ga, + "Intézményközi kiadványszerkesztési útmutató: Gibraltár: Brit tengerentúli terület."@hu, + "Manuale interistituzionale di convenzioni redazionali: Gibilterra: territorio d’oltremare britannico."@it, + "Institucijų leidinių rengimo vadovas: Gibraltaras: britų užjūrio teritorija."@lt, + "Iestāžu publikāciju noformēšanas rokasgrāmata: Gibraltārs: britu aizjūras teritorija."@lv, + "Gwida tal-Istil Interistituzzjonali: Ġibiltà: Territorju lil hinn mix-xtut Brittaniċi."@mt, + "Interinstitutionele schrijfwijzer: Gibraltar: Brits overzees gebied."@nl, + "Międzyinstytucjonalny przewodnik redakcyjny: Gibraltar: Brytyjskie terytorium zamorskie."@pl, + "Código de Redação Interinstitucional: Gibraltar: Território ultramarino britânico."@pt, + "Ghid de redactare interinstituțional: Gibraltar: teritoriu britanic de peste mări."@ro, + "Medziinštitucionálna príručka úpravy dokumentov: Gibraltár: britské zámorské územie."@sk, + "Medinstitucionalni slogovni priročnik: Gibraltar: čezmorsko ozemlje Združenega kraljestva."@sl, + "Publikationshandboken: Gibraltar: Brittiskt utomeuropeiskt territorium."@sv ; + skos:hiddenLabel "britannialainen, gibraltarilainen"@fi, + "gibraltarienne"@fr, + "duine ó Ghiobráltar"@ga, + "Gibilterra"@it, + "gibilterrana"@it, + "Gibraltaro"@lt, + "Gibraltāra"@lv, + "Gibraltārs"@lv, + "Gibiltana"@mt, + "gibraltarskie"@pl, + "gibraltarina"@pt ; + skos:historyNote "The country membership classification was updated due to the withdrawal of the United Kingdom from the European Union."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "66"^^euvoc:EP, + "GI"^^euvoc:FD_140, + "GIBRALTAR"^^euvoc:FD_400, + ".gi"^^euvoc:IANA_DOMAIN, + "GI"^^euvoc:IBAN_COU, + "GI"^^euvoc:ISG_COU, + "GI"^^euvoc:ISO_3166_1_ALPHA_2, + "GIB"^^euvoc:ISO_3166_1_ALPHA_3, + "292"^^euvoc:ISO_3166_1_NUM, + "GIB"^^euvoc:NAC, + "350"^^euvoc:PHONE_PREFIX, + "GI"^^euvoc:TED, + "GI"^^euvoc:TED_SCHEMA, + "GBZ"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "292"^^euvoc:UNSD_M49 ; + skos:prefLabel "جيبرالتار"@ar, + "Гібралтар"@be, + "Гибралтар"@bg, + "Gibraltar"@bs, + "Gibraltar"@ca, + "Gibraltar"@cs, + "Gibraltar"@da, + "Gibraltar"@de, + "Γιβραλτάρ"@el, + "Gibraltar"@en, + "Gibraltar"@es, + "Gibraltar"@et, + "Gibraltar"@eu, + "Gibraltar"@fi, + "Gibraltar"@fo, + "Gibraltar"@fr, + "Giobráltar"@ga, + "Xibraltar"@gl, + "Gibraltar"@hr, + "Gibraltár"@hu, + "Gíbraltar"@is, + "Gibraltar"@it, + "ジブラルタル"@ja, + "Gibraltar"@lb, + "Gibraltaras"@lt, + "Gibraltāru"@lv, + "Гибралтар"@mk, + "Ġibiltà"@mt, + "Gibraltar"@nl, + "Gibraltar"@no, + "Gibraltar"@pl, + "Gibraltar"@pt, + "Gibraltar"@rm, + "Gibraltar"@ro, + "Гибралтар"@ru, + "Gibraltár"@sk, + "Gibraltar"@sl, + "Gjibraltari"@sq, + "Гибралтар"@sr, + "Gibraltar"@sv, + "Cebelitarık"@tr, + "Гібралтар"@uk, + "直布罗陀"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "GIN" ; + at:deprecated "false" ; + at:op-code "GIN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GN" ; + dc:source "TED" ] ; + at:start.use "1958-10-02" ; + atold:op-code "GIN" ; + dc:identifier "GIN" ; + skos:altLabel "جمهورية غينيا"@ar, + "Република Гвинея"@bg, + "República de Guinea"@ca, + "Guinejská republika"@cs, + "Republikken Guinea"@da, + "Republik Guinea"@de, + "Δημοκρατία της Γουινέας"@el, + "Republic of Guinea"@en, + "República de Guinea"@es, + "Guinea Vabariik"@et, + "Guinean tasavalta"@fi, + "République de Guinée"@fr, + "Poblacht na Guine"@ga, + "Republika Gvineja"@hr, + "Guineai Köztársaság"@hu, + "Lýðveldið Gínea"@is, + "Repubblica di Guinea"@it, + "ギニア共和国"@ja, + "Republik Guinea"@lb, + "Gvinėjos Respublika"@lt, + "Gvinejas Republika"@lv, + "Ir-Repubblika tal-Guinea"@mt, + "Republiek Guinee"@nl, + "Republikken Guinea"@no, + "Republika Gwinei"@pl, + "República da Guiné"@pt, + "Republica Guineea"@ro, + "Гвинейская Республика"@ru, + "Guinejská republika"@sk, + "Republika Gvineja"@sl, + "Republiken Guinea"@sv, + "Gine Cumhuriyeti"@tr, + "Республіка Гвінея"@uk, + "几内亚共和国"@zh ; + skos:hiddenLabel "Γουινέας"@el, + "République of Guinea"@en, + "an Ghuine"@ga, + "Gvinėjos"@lt, + "Gvinejas"@lv, + "il-Guinea"@mt, + "ir-Repubblika tal-Guinea"@mt, + "Guinese"@nl, + "da República da Guiné"@pt, + "Republliken Guinea"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "236"^^euvoc:EP, + "GN"^^euvoc:FD_010, + "GN"^^euvoc:FD_400, + ".gn"^^euvoc:IANA_DOMAIN, + "GN"^^euvoc:ISG_COU, + "GN"^^euvoc:ISO_3166_1_ALPHA_2, + "GIN"^^euvoc:ISO_3166_1_ALPHA_3, + "324"^^euvoc:ISO_3166_1_NUM, + "GIN"^^euvoc:NAC, + "224"^^euvoc:PHONE_PREFIX, + "GN"^^euvoc:TED, + "GN"^^euvoc:TED_SCHEMA, + "RG"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "324"^^euvoc:UNSD_M49 ; + skos:prefLabel "غينيا"@ar, + "Гвинея"@bg, + "Guinea"@ca, + "Guinea"@cs, + "Guinea"@da, + "Guinea"@de, + "Γουινέα"@el, + "Guinea"@en, + "Guinea"@es, + "Guinea"@et, + "Guinea"@fi, + "Guinée"@fr, + "An Ghuine"@ga, + "Gvineja"@hr, + "Guinea"@hu, + "Gínea"@is, + "Guinea"@it, + "ギニア"@ja, + "Guinea"@lb, + "Gvinėja"@lt, + "Gvineja"@lv, + "Il-Guinea"@mt, + "Guinee"@nl, + "Guinea"@no, + "Gwinea"@pl, + "Guiné"@pt, + "Guineea"@ro, + "Гвинея"@ru, + "Guinea"@sk, + "Gvineja"@sl, + "Guinea"@sv, + "Gine"@tr, + "Гвінея"@uk, + "几内亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GMB" ; + at:deprecated "false" ; + at:op-code "GMB" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "WAG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "WAG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "GAMB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GM" ; + dc:source "TED" ] ; + at:start.use "1970-04-24" ; + atold:op-code "GMB" ; + dc:identifier "GMB" ; + skos:altLabel "جمهورية الكونغو"@ar, + "Република Гамбия"@bg, + "República de Gàmbia"@ca, + "Gambijská republika"@cs, + "Republikken Gambia"@da, + "Republik Gambia"@de, + "Δημοκρατία της Γκάμπια"@el, + "Gambia"@en, + "Republic of The Gambia"@en, + "República de Gambia"@es, + "Gambia Vabariik"@et, + "Gambian tasavalta"@fi, + "République de Gambie"@fr, + "Poblacht na Gaimbia"@ga, + "Republika Gambija"@hr, + "Gambiai Köztársaság"@hu, + "Lýðveldið Gambía"@is, + "Repubblica della Gambia"@it, + "Rpublik Gambia"@lb, + "Gambijos Respublika"@lt, + "Gambijas Republika"@lv, + "Ir-Repubblika tal-Gambja"@mt, + "Republiek Gambia"@nl, + "Republikken Gambia"@no, + "Republika Gambii"@pl, + "República da Gâmbia"@pt, + "Republica Gambia"@ro, + "Республика Гамбия"@ru, + "Gambijská republika"@sk, + "Republika Gambija"@sl, + "Republiken Gambia"@sv, + "Gambiya Cumhuriyeti"@tr, + "Республіка Гамбія"@uk, + "冈比亚共和国"@zh ; + skos:hiddenLabel "Γκάμπιας"@el, + "Δημοκρατία της Γκάμπιας"@el, + "an Ghaimbia"@ga, + "Gambijos"@lt, + "Gambijas"@lv, + "il-Gambja"@mt, + "ir-Repubblika tal-Gambja"@mt, + "Republliken Gambia"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "68"^^euvoc:EP, + "WAG"^^euvoc:FD_010, + "GAMB"^^euvoc:FD_050, + "WAG"^^euvoc:FD_400, + ".gm"^^euvoc:IANA_DOMAIN, + "GM"^^euvoc:ISG_COU, + "GM"^^euvoc:ISO_3166_1_ALPHA_2, + "GMB"^^euvoc:ISO_3166_1_ALPHA_3, + "270"^^euvoc:ISO_3166_1_NUM, + "GMB"^^euvoc:NAC, + "220"^^euvoc:PHONE_PREFIX, + "GM"^^euvoc:TED, + "GM"^^euvoc:TED_SCHEMA, + "WAG"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "270"^^euvoc:UNSD_M49 ; + skos:prefLabel "غامبيا"@ar, + "Гамбия"@bg, + "Gàmbia"@ca, + "Gambie"@cs, + "Gambia"@da, + "Gambia"@de, + "Γκάμπια"@el, + "The Gambia"@en, + "Gambia"@es, + "Gambia"@et, + "Gambia"@fi, + "Gambie"@fr, + "An Ghaimbia"@ga, + "Gambija"@hr, + "Gambia"@hu, + "Gambía"@is, + "Gambia"@it, + "ガンビア共和国"@ja, + "Gambia"@lb, + "Gambija"@lt, + "Gambija"@lv, + "Il-Gambja"@mt, + "Gambia"@nl, + "Gambia"@no, + "Gambia"@pl, + "Gâmbia"@pt, + "Gambia"@ro, + "Гамбия"@ru, + "Gambia"@sk, + "Gambija"@sl, + "Gambia"@sv, + "Gambiya"@tr, + "Гамбії"@uk, + "冈比亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GNB" ; + at:deprecated "false" ; + at:op-code "GNB" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GW" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "GW" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GI" ; + dc:source "EurLex" ] ; + at:start.use "1974-09-10" ; + atold:op-code "GNB" ; + dc:identifier "GNB" ; + skos:altLabel "جمهورية غينيا-بيساو"@ar, + "Република Гвинея Бисау"@bg, + "República de Guinea-Bissau"@ca, + "Republika Guinea-Bissau"@cs, + "Republikken Guinea-Bissau"@da, + "Republik Guinea-Bissau"@de, + "Δημοκρατία της Γουινέας Μπισάου"@el, + "Republic of Guinea-Bissau"@en, + "República de Guinea-Bissau"@es, + "Guinea-Bissau Vabariik"@et, + "Guinea-Bissaun tasavalta"@fi, + "République de Guinée-Bissau"@fr, + "Poblacht Ghuine Bhissau"@ga, + "Republika Gvineja Bisau"@hr, + "Bissau-guineai Köztársaság"@hu, + "Lýðveldið Gínea-Bissaú"@is, + "Repubblica di Guinea-Bissau"@it, + "ギニアビサウ共和国"@ja, + "Republik Guinea-Bissau"@lb, + "Bisau Gvinėjos Respublika"@lt, + "Gvinejas-Bisavas Republika"@lv, + "Ir-Repubblika tal-Guinea-Bissau"@mt, + "Republiek Guinee-Bissau"@nl, + "Republikken Guinea-Bissau"@no, + "Republika Gwinei Bissau"@pl, + "República da Guiné-Bissau"@pt, + "Republica Guineea Bissau"@ro, + "Республика Гвинея-Бисау"@ru, + "Guinejsko-bissauská republika"@sk, + "Republika Gvineja Bissau"@sl, + "Republiken Guinea-Bissau"@sv, + "Gine-Bissau Cumhuriyeti"@tr, + "Республіка Гвінея-Бісау"@uk, + "几内亚比绍共和国"@zh ; + skos:hiddenLabel "Γουινέα Μπισσάου"@el, + "Γουινέα-Μπισσάου"@el, + "Γουινέας Μπισσάου"@el, + "República de Guinea-Bisáu"@es, + "de Guinea-Bisáu"@es, + "guineabissaulainen"@fi, + "bissau-guinéenne"@fr, + "Guine Bissau"@ga, + "Poblacht Ghuine Bissau"@ga, + "duine ó Ghuine Bissau"@ga, + "Bisau Gvinėjos"@lt, + "Guineana-Bissau"@mt, + "il-Guinea-Bissau"@mt, + "ir-Repubblika tal-Guinea-Bissau"@mt, + "gwinejskie"@pl, + "Republica Guineea-Bissau"@ro, + "Republliken Guinea-Bissau"@sv, + "bissauguineansk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "257"^^euvoc:EP, + "75"^^euvoc:EP, + "GI"^^euvoc:FD_010, + "GI"^^euvoc:FD_400, + ".gw"^^euvoc:IANA_DOMAIN, + "GW"^^euvoc:ISG_COU, + "GW"^^euvoc:ISO_3166_1_ALPHA_2, + "GNB"^^euvoc:ISO_3166_1_ALPHA_3, + "624"^^euvoc:ISO_3166_1_NUM, + "GNB"^^euvoc:NAC, + "245"^^euvoc:PHONE_PREFIX, + "GW"^^euvoc:TED, + "GW"^^euvoc:TED_SCHEMA, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "624"^^euvoc:UNSD_M49 ; + skos:prefLabel "غينيا بيساو"@ar, + "Гвинея Бисау"@bg, + "Guinea-Bissau"@ca, + "Guinea-Bissau"@cs, + "Guinea-Bissau"@da, + "Guinea-Bissau"@de, + "Γουινέα Μπισάου"@el, + "Guinea-Bissau"@en, + "Guinea-Bissau"@es, + "Guinea-Bissau"@et, + "Guinea-Bissau"@fi, + "Guinée-Bissau"@fr, + "Guine-Bissau"@ga, + "Gvineja Bisau"@hr, + "Bissau-Guinea"@hu, + "Gínea-Bissaú"@is, + "Guinea-Bissau"@it, + "ギニアビサウ"@ja, + "Guinea-Bissau"@lb, + "Bisau Gvinėja"@lt, + "Gvineja-Bisava"@lv, + "Il-Guinea-Bissau"@mt, + "Guinee-Bissau"@nl, + "Guinea-Bissau"@no, + "Gwinea Bissau"@pl, + "Guiné-Bissau"@pt, + "Guineea-Bissau"@ro, + "Гвинея-Бисау"@ru, + "Guinea-Bissau"@sk, + "Gvineja Bissau"@sl, + "Guinea-Bissau"@sv, + "Gine-Bissau"@tr, + "Гвінея-Бісау"@uk, + "几内亚比绍"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GNQ" ; + at:deprecated "false" ; + at:op-code "GNQ" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GQ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GQ" ; + dc:source "TED" ] ; + at:start.use "1968-10-12" ; + atold:op-code "GNQ" ; + dc:identifier "GNQ" ; + skos:altLabel "جمهورية غينيا الاستوائية"@ar, + "Република Екваториална Гвинея"@bg, + "República de Guinea Equatorial"@ca, + "Republika Rovníková Guinea"@cs, + "Republikken Ækvatorialguinea"@da, + "Republik Äquatorialguinea"@de, + "Δημοκρατία της Ισημερινής Γουινέας"@el, + "Republic of Equatorial Guinea"@en, + "República de Guinea Ecuatorial"@es, + "Ekvatoriaal-Guinea Vabariik"@et, + "Päiväntasaajan Guinean tasavalta"@fi, + "République de Guinée équatoriale"@fr, + "Poblacht na Guine Meánchiorclaí"@ga, + "Republika Ekvatorska Gvineja"@hr, + "Egyenlítői-guineai Köztársaság"@hu, + "Lýðveldið Miðbaugs-Gínea"@is, + "Repubblica della Guinea equatoriale"@it, + "赤道ギニア共和国"@ja, + "Republik vun Äquatorialguinea"@lb, + "Pusiaujo Gvinėjos Respublika"@lt, + "Ekvatoriālās Gvinejas Republika"@lv, + "Ir-Repubblika tal-Guinea Ekwatorjali"@mt, + "Republiek Equatoriaal-Guinea"@nl, + "Republikken Ekvatorial-Guinea"@no, + "Republika Gwinei Równikowej"@pl, + "República da Guiné Equatorial"@pt, + "Republica Guineea Ecuatorială"@ro, + "Республика Экваториальная Гвинея"@ru, + "Republika Rovníkovej Guiney"@sk, + "Republika Ekvatorialna Gvineja"@sl, + "Republiken Ekvatorialguinea"@sv, + "Ekvator Ginesi Cumhuriyeti"@tr, + "Республіка Екваторіальна Гвінея"@uk, + "赤道几内亚共和国"@zh ; + skos:hiddenLabel "Ισημερινή Γουϊνέα"@el, + "Ισημερινής Γουϊνέας"@el, + "an Ghuine Mheánchiorclach"@ga, + "duine ón nGuine Mheánchiorclach"@ga, + "Ekvatorske Gvineje"@hr, + "Egyenlítői Guinea"@hu, + "Guineana Ekwatorjali"@mt, + "il-Guinea Ekwatorjali"@mt, + "ir-Repubblika tal-Guinea Ekwatorjali"@mt, + "Equatoriaal-Guinese"@nl, + "gwinejskie"@pl, + "Republliken Ekvatorialguinea"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "70"^^euvoc:EP, + "GE"^^euvoc:FD_010, + "GE"^^euvoc:FD_400, + ".gq"^^euvoc:IANA_DOMAIN, + "GQ"^^euvoc:ISG_COU, + "GQ"^^euvoc:ISO_3166_1_ALPHA_2, + "GNQ"^^euvoc:ISO_3166_1_ALPHA_3, + "226"^^euvoc:ISO_3166_1_NUM, + "GNQ"^^euvoc:NAC, + "240"^^euvoc:PHONE_PREFIX, + "GQ"^^euvoc:TED, + "GQ"^^euvoc:TED_SCHEMA, + "Middle Africa"^^euvoc:UNSD_GEOSCHEME, + "226"^^euvoc:UNSD_M49 ; + skos:prefLabel "غينيا الاستوائية"@ar, + "Екваториална Гвинея"@bg, + "Guinea Equatorial"@ca, + "Rovníková Guinea"@cs, + "Ækvatorialguinea"@da, + "Äquatorialguinea"@de, + "Ισημερινή Γουινέα"@el, + "Equatorial Guinea"@en, + "Guinea Ecuatorial"@es, + "Ekvatoriaal-Guinea"@et, + "Päiväntasaajan Guinea"@fi, + "Guinée équatoriale"@fr, + "An Ghuine Mheánchiorclach"@ga, + "Ekvatorska Gvineja"@hr, + "Egyenlítői-Guinea"@hu, + "Miðbaugs-Gínea"@is, + "Guinea equatoriale"@it, + "赤道ギニア"@ja, + "Äquatorialguinea"@lb, + "Pusiaujo Gvinėja"@lt, + "Ekvatoriālā Gvineja"@lv, + "Il-Guinea Ekwatorjali"@mt, + "Equatoriaal-Guinea"@nl, + "Equatorial Guinea"@no, + "Gwinea Równikowa"@pl, + "Guiné Equatorial"@pt, + "Guineea Ecuatorială"@ro, + "Экваториальная Гвинея"@ru, + "Rovníková Guinea"@sk, + "Ekvatorialna Gvineja"@sl, + "Ekvatorialguinea"@sv, + "Ekvator Ginesi"@tr, + "Екваторіальна Гвінея"@uk, + "赤道几内亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GRD" ; + at:deprecated "false" ; + at:op-code "GRD" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GD" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "GD" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "WA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "WA" ; + dc:source "EurLex" ] ; + at:start.use "1974-02-07" ; + atold:op-code "GRD" ; + dc:identifier "GRD" ; + skos:hiddenLabel "Γρενάδας"@el, + "grenadinne"@fr, + "Grenados"@lt, + "Grenādas"@lv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "235"^^euvoc:EP, + "WA"^^euvoc:FD_010, + "WA"^^euvoc:FD_400, + ".gd"^^euvoc:IANA_DOMAIN, + "GD"^^euvoc:ISG_COU, + "GD"^^euvoc:ISO_3166_1_ALPHA_2, + "GRD"^^euvoc:ISO_3166_1_ALPHA_3, + "308"^^euvoc:ISO_3166_1_NUM, + "GRD"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "GD"^^euvoc:TED, + "GD"^^euvoc:TED_SCHEMA, + "WG"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "308"^^euvoc:UNSD_M49 ; + skos:prefLabel "غرانادا"@ar, + "Гренада"@bg, + "Grenada"@ca, + "Grenada"@cs, + "Grenada"@da, + "Grenada"@de, + "Γρενάδα"@el, + "Grenada"@en, + "Granada"@es, + "Grenada"@et, + "Grenada"@fi, + "Grenade"@fr, + "Greanáda"@ga, + "Grenada"@hr, + "Grenada"@hu, + "Grenada"@is, + "Grenada"@it, + "グレナダ"@ja, + "Grenada"@lb, + "Grenada"@lt, + "Grenāda"@lv, + "Grenada"@mt, + "Grenada"@nl, + "Grenada"@no, + "Grenada"@pl, + "Granada"@pt, + "Grenada"@ro, + "Гренада"@ru, + "Grenada"@sk, + "Grenada"@sl, + "Grenada"@sv, + "Grenada"@tr, + "Гренада"@uk, + "格林纳达"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GRL" ; + at:deprecated "false" ; + at:op-code "GRL" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GL" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "GL" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GROENLAND" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "GRL" ; + dc:identifier "GRL" ; + skos:altLabel "Kalaallit Nunaat"@kl ; + skos:broader ; + skos:changeNote "Междуинституционално ръководство за изготвяне на публикациите: Автономна част от Кралство Дания."@bg, + "Pravidla pro jednotnou úpravu dokumentů: Samosprávné území Dánska."@cs, + "Vejledning i Udformning af EU-publikationer: Danmarks territorium med selvstyre."@da, + "Interinstitutionelle Regeln für Veröffentlichungen: Autonomes Gebiet Dänemarks."@de, + "Διοργανικό εγχειρίδιο σύνταξης κειμένων: Αυτοδιοικούμενο έδαφος της Δανίας."@el, + "Interinstitutional Style Guide: Self-governing territory of Denmark."@en, + "Libro de estilo interinstitucional: Administración autónoma dependiente de Dinamarca."@es, + "Institutsioonidevaheline stiilijuhend: Taani autonoome territorium."@et, + "Toimielinten yhteiset tekstinlaadinnan ohjeet: Tanskalle kuuluva itsehallintoalue."@fi, + "Code de rédaction interinstitutionnel: territoire autonome du Danemark."@fr, + "An Treoir Stíle Idirinstitíuideach: críoch fhéinrialaithe de chuid na Danmhairge."@ga, + "Intézményközi kiadványszerkesztési útmutató: Dánia területe."@hu, + "Manuale interistituzionale di convenzioni redazionali: territorio autonomo della Danimarca."@it, + "Institucijų leidinių rengimo vadovas: Danijos autonominė teritorija."@lt, + "Iestāžu publikāciju noformēšanas rokasgrāmata: autonoma Dānijas teritorija."@lv, + "Gwida tal-Istil Interistituzzjonali: Territorju awtonomu tad-Danimarka."@mt, + "Interinstitutionele schrijfwijzer: Autonoom gebied van Denemarken."@nl, + "Międzyinstytucjonalny przewodnik redakcyjny: Autonomiczne terytorium Danii."@pl, + "Código de Redação Interinstitucional: Território autónomo da Dinamarca."@pt, + "Ghid de redactare interinstituțional: teritoriu autonom al Danemarcei."@ro, + "Medziinštitucionálna príručka úpravy dokumentov: autonómne územie Dánska."@sk, + "Medinstitucionalni slogovni priročnik: samoupravno ozemlje Danske."@sl, + "Publikationshandboken: Självstyrande del av Danmark."@sv ; + skos:hiddenLabel "Kalaallit Nunaat"@da, + "tanskalainen, grönlantilainen"@fi, + "an Ghraonlainn"@ga, + "grenlandsko"@hr, + "Grenlandijos"@lt, + "Grenlandes"@lv ; + skos:historyNote "In 1973, Greenland joined the European Economic Community (EEC) with Denmark. However, in a referendum in 1982, a majority of the population voted for Greenland to withdraw from the EEC, which was effected in 1985."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "67"^^euvoc:EP, + "GL"^^euvoc:FD_010, + "GROENLAND"^^euvoc:FD_400, + ".gl"^^euvoc:IANA_DOMAIN, + "GL"^^euvoc:IBAN_COU, + "GL"^^euvoc:ISG_COU, + "GL"^^euvoc:ISO_3166_1_ALPHA_2, + "GRL"^^euvoc:ISO_3166_1_ALPHA_3, + "304"^^euvoc:ISO_3166_1_NUM, + "GRL"^^euvoc:NAC, + "299"^^euvoc:PHONE_PREFIX, + "GL"^^euvoc:TED, + "GL"^^euvoc:TED_SCHEMA, + "Northern America"^^euvoc:UNSD_GEOSCHEME, + "304"^^euvoc:UNSD_M49 ; + skos:prefLabel "غرينلاند"@ar, + "Грэнландыя"@be, + "Гренландия"@bg, + "Grenland"@bs, + "Groenlàndia"@ca, + "Grónsko"@cs, + "Grønland"@da, + "Grönland"@de, + "Γροιλανδία"@el, + "Greenland"@en, + "Groenlandia"@es, + "Gröönimaa"@et, + "Groenlandia"@eu, + "Grönlanti"@fi, + "Grønland"@fo, + "Groenland"@fr, + "An Ghraonlainn"@ga, + "Grenlandia"@gl, + "Grenland"@hr, + "Grönland"@hu, + "Grænland"@is, + "Groenlandia"@it, + "グリーンランド"@ja, + "Grönland"@lb, + "Grenlandija"@lt, + "Grenlande"@lv, + "Гренланд"@mk, + "Greenland"@mt, + "Groenland"@nl, + "Grønland"@no, + "Grenlandia"@pl, + "Gronelândia"@pt, + "Grönlanda"@rm, + "Groenlanda"@ro, + "Гренландия"@ru, + "Grónsko"@sk, + "Grenlandija"@sl, + "Grenlanda"@sq, + "Гренланд"@sr, + "Grönland"@sv, + "Grönland"@tr, + "Гренландія"@uk, + "格陵兰"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "GTM" ; + at:deprecated "false" ; + at:op-code "GTM" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GCA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GT" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GCA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GT" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "GTM" ; + dc:identifier "GTM" ; + skos:altLabel "جمهورية غواتيمالا"@ar, + "Република Гватемала"@bg, + "República de Guatemala"@ca, + "Guatemalská republika"@cs, + "Republikken Guatemala"@da, + "Republik Guatemala"@de, + "Δημοκρατία της Γουατεμάλας"@el, + "Republic of Guatemala"@en, + "República de Guatemala"@es, + "Guatemala Vabariik"@et, + "Guatemalan tasavalta"@fi, + "République du Guatemala"@fr, + "Poblacht Ghuatamala"@ga, + "Republika Gvatemala"@hr, + "Guatemalai Köztársaság"@hu, + "Lýðveldið Gvatemala"@is, + "Repubblica del Guatemala"@it, + "グアテマラ共和国"@ja, + "Republik Guatemala"@lb, + "Gvatemalos Respublika"@lt, + "Gvatemalas Republika"@lv, + "Ir-Repubblika tal-Gwatemala"@mt, + "Republiek Guatemala"@nl, + "Republikken Guatemala"@no, + "Republika Gwatemali"@pl, + "República da Guatemala"@pt, + "Republica Guatemala"@ro, + "Республика Гватемала"@ru, + "Guatemalská republika"@sk, + "Republika Gvatemala"@sl, + "Republiken Guatemala"@sv, + "Guatemala Cumhuriyeti"@tr, + "Республіка Гватемала"@uk, + "危地马拉共和国"@zh ; + skos:hiddenLabel "Γουατεμάλας"@el, + "Gvatemalos"@lt, + "Gvatemalas"@lv, + "il-Gwatemala"@mt, + "ir-Repubblika tal-Gwatemala"@mt, + "gwatemalskie"@pl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "73"^^euvoc:EP, + "GCA"^^euvoc:FD_010, + "GCA"^^euvoc:FD_400, + ".gt"^^euvoc:IANA_DOMAIN, + "GT"^^euvoc:IBAN_COU, + "GT"^^euvoc:ISG_COU, + "GT"^^euvoc:ISO_3166_1_ALPHA_2, + "GTM"^^euvoc:ISO_3166_1_ALPHA_3, + "320"^^euvoc:ISO_3166_1_NUM, + "GTM"^^euvoc:NAC, + "502"^^euvoc:PHONE_PREFIX, + "GT"^^euvoc:TED, + "GT"^^euvoc:TED_SCHEMA, + "GCA"^^euvoc:TIR, + "Central America"^^euvoc:UNSD_GEOSCHEME, + "320"^^euvoc:UNSD_M49 ; + skos:prefLabel "غواتيمالا"@ar, + "Гватемала"@bg, + "Guatemala"@ca, + "Guatemala"@cs, + "Guatemala"@da, + "Guatemala"@de, + "Γουατεμάλα"@el, + "Guatemala"@en, + "Guatemala"@es, + "Guatemala"@et, + "Guatemala"@fi, + "Guatemala"@fr, + "Guatamala"@ga, + "Gvatemala"@hr, + "Guatemala"@hu, + "Gvatemala"@is, + "Guatemala"@it, + "グアテマラ"@ja, + "Guatemala"@lb, + "Gvatemala"@lt, + "Gvatemala"@lv, + "Il-Gwatemala"@mt, + "Guatemala"@nl, + "Guatemala"@no, + "Gwatemala"@pl, + "Guatemala"@pt, + "Guatemala"@ro, + "Гватемала"@ru, + "Guatemala"@sk, + "Gvatemala"@sl, + "Guatemala"@sv, + "Guatemala"@tr, + "Гватемала"@uk, + "危地马拉"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "GUY" ; + at:deprecated "false" ; + at:op-code "GUY" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GY" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GUY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "GY" ; + dc:source "TED" ] ; + at:start.use "1966-05-26" ; + atold:op-code "GUY" ; + dc:identifier "GUY" ; + skos:altLabel "جمهورية غيانا التعاونية"@ar, + "Кооперативна република Гвиана"@bg, + "República Cooperativa de Guyana"@ca, + "Guyanská kooperativní republika"@cs, + "Den Kooperative Republik Guyana"@da, + "Kooperative Republik Guyana"@de, + "Συνεργατική Δημοκρατία της Γουιάνας"@el, + "Cooperative Republic of Guyana"@en, + "República Cooperativa de Guyana"@es, + "Guyana Kooperatiivvabariik"@et, + "Guyanan tasavalta"@fi, + "République coopérative de Guyana"@fr, + "Comharphoblacht na Guáine"@ga, + "Republika Gvajana"@hr, + "Guyanai Szövetkezeti Köztársaság"@hu, + "Samvinnulýðveldið Gvæjana"@is, + "Repubblica cooperativistica"@it, + "ガイアナ協同共和国"@ja, + "Kooperativ Republik Guyana"@lb, + "Gajanos Kooperacinė Respublika"@lt, + "Gajānas Kooperatīvā Republika"@lv, + "Ir-Repubblika Kooperattiva tal-Guyana"@mt, + "Coöperatieve Republiek Guyana"@nl, + "Den kooperative republikk Guyana"@no, + "Kooperacyjna Republika Gujany"@pl, + "República Cooperativa da Guiana"@pt, + "Republica Cooperatistă Guyana"@ro, + "Кооперативная Республика Гайана"@ru, + "Guyanská kooperatívna republika"@sk, + "Kooperativna republika Gvajana"@sl, + "Republiken Guyana"@sv, + "Guyana Kooperatif Cumhuriyeti"@tr, + "Кооперативна Республіка Гаяна"@uk, + "圭亚那合作共和国"@zh ; + skos:hiddenLabel "Γουιάνας"@el, + "an Ghuáin"@ga, + "Repubblica cooperativistica della Guyana"@it, + "Gajanos"@lt, + "Gajānas"@lv, + "Guyaniża"@mt, + "il-Guyana"@mt, + "ir-Repubblika Kooperattiva tal-Guyana"@mt, + "da República Cooperativa da Guiana"@pt, + "guyansk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "237"^^euvoc:EP, + "GUY"^^euvoc:FD_010, + ".gy"^^euvoc:IANA_DOMAIN, + "GY"^^euvoc:ISG_COU, + "GY"^^euvoc:ISO_3166_1_ALPHA_2, + "GUY"^^euvoc:ISO_3166_1_ALPHA_3, + "328"^^euvoc:ISO_3166_1_NUM, + "GUY"^^euvoc:NAC, + "592"^^euvoc:PHONE_PREFIX, + "GY"^^euvoc:TED, + "GY"^^euvoc:TED_SCHEMA, + "GUY"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "328"^^euvoc:UNSD_M49 ; + skos:prefLabel "غيانا"@ar, + "Гвиана"@bg, + "Guyana"@ca, + "Guyana"@cs, + "Guyana"@da, + "Guyana"@de, + "Γουιάνα"@el, + "Guyana"@en, + "Guyana"@es, + "Guyana"@et, + "Guyana"@fi, + "Guyana"@fr, + "An Ghuáin"@ga, + "Gvajana"@hr, + "Guyana"@hu, + "Gvæjana"@is, + "Guyana"@it, + "ガイアナ"@ja, + "Guyana"@lb, + "Gajana"@lt, + "Gajāna"@lv, + "Il-Guyana"@mt, + "Guyana"@nl, + "Guyana"@no, + "Gujana"@pl, + "Guiana"@pt, + "Guyana"@ro, + "Гайана"@ru, + "Guyana"@sk, + "Gvajana"@sl, + "Guyana"@sv, + "Guyana"@tr, + "Гаяна"@uk, + "圭亚那"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "HND" ; + at:deprecated "false" ; + at:op-code "HND" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "HO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "HN" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "HN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "HO" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "HND" ; + dc:identifier "HND" ; + skos:altLabel "جمهورية هندوراس"@ar, + "Република Хондурас"@bg, + "República d’Hondures"@ca, + "Honduraská republika"@cs, + "Republikken Honduras"@da, + "Republik Honduras"@de, + "Δημοκρατία της Ονδούρας"@el, + "Republic of Honduras"@en, + "República de Honduras"@es, + "Hondurase Vabariik"@et, + "Hondurasin tasavalta"@fi, + "République du Honduras"@fr, + "Poblacht Hondúras"@ga, + "Republika Honduras"@hr, + "Hondurasi Köztársaság"@hu, + "Lýðveldið Hondúras"@is, + "Repubblica di Honduras"@it, + "ホンジュラス共和国"@ja, + "Republik Honduras"@lb, + "Hondūro Respublika"@lt, + "Hondurasas Republika"@lv, + "Ir-Repubblika tal-Honduras"@mt, + "Republiek Honduras"@nl, + "Republikken Honduras"@no, + "Republika Hondurasu"@pl, + "República das Honduras"@pt, + "Republica Honduras"@ro, + "Республика Гондурас"@ru, + "Honduraská republika"@sk, + "Republika Honduras"@sl, + "Republiken Honduras"@sv, + "Honduras Cumhuriyeti"@tr, + "Республіка Гондурас"@uk, + "洪都拉斯共和国"@zh ; + skos:hiddenLabel "Ονδούρας"@el, + "Hondūro"@lt, + "Hondurasas"@lv, + "il-Honduras"@mt, + "ir-Repubblika tal-Honduras"@mt, + "Hondurese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "218"^^euvoc:EP, + "HO"^^euvoc:FD_010, + "HO"^^euvoc:FD_400, + ".hn"^^euvoc:IANA_DOMAIN, + "HN"^^euvoc:ISG_COU, + "HN"^^euvoc:ISO_3166_1_ALPHA_2, + "HND"^^euvoc:ISO_3166_1_ALPHA_3, + "340"^^euvoc:ISO_3166_1_NUM, + "HND"^^euvoc:NAC, + "504"^^euvoc:PHONE_PREFIX, + "HN"^^euvoc:TED, + "HN"^^euvoc:TED_SCHEMA, + "Central America"^^euvoc:UNSD_GEOSCHEME, + "340"^^euvoc:UNSD_M49 ; + skos:prefLabel "الهندوراس"@ar, + "Хондурас"@bg, + "Hondures"@ca, + "Honduras"@cs, + "Honduras"@da, + "Honduras"@de, + "Ονδούρα"@el, + "Honduras"@en, + "Honduras"@es, + "Honduras"@et, + "Honduras"@fi, + "Honduras"@fr, + "Hondúras"@ga, + "Honduras"@hr, + "Honduras"@hu, + "Hondúras"@is, + "Honduras"@it, + "ホンジュラス"@ja, + "Honduras"@lb, + "Hondūras"@lt, + "Hondurasa"@lv, + "Il-Honduras"@mt, + "Honduras"@nl, + "Honduras"@no, + "Honduras"@pl, + "Honduras"@pt, + "Honduras"@ro, + "Гондурас"@ru, + "Honduras"@sk, + "Honduras"@sl, + "Honduras"@sv, + "Honduras"@tr, + "Гондурас"@uk, + "洪都拉斯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "HTI" ; + at:deprecated "false" ; + at:op-code "HTI" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "HT" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "HT" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RH" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "HTI" ; + dc:identifier "HTI" ; + skos:altLabel "جمهورية هايتي"@ar, + "Република Хаити"@bg, + "República d’Haití"@ca, + "Haitská republika"@cs, + "Republikken Haiti"@da, + "Republik Haiti"@de, + "Δημοκρατία της Αϊτής"@el, + "Republic of Haiti"@en, + "República de Haití"@es, + "Haiti Vabariik"@et, + "Haitin tasavalta"@fi, + "République d’Haïti"@fr, + "Poblacht Háítí"@ga, + "Republika Haiti"@hr, + "Ayiti"@ht, + "Haiti Köztársaság"@hu, + "Lýðveldið Haítí"@is, + "Repubblica di Haiti"@it, + "ハイチ共和国"@ja, + "Republik Haiti"@lb, + "Haičio Respublika"@lt, + "Haiti Republika"@lv, + "Ir-Repubblika tal-Haiti"@mt, + "Republiek Haïti"@nl, + "Republikken Haiti"@no, + "Republika Haiti"@pl, + "República do Haiti"@pt, + "Republica Haiti"@ro, + "Республика Гаити"@ru, + "Haitská republika"@sk, + "Republika Haiti"@sl, + "Republiken Haiti"@sv, + "Haiti Cumhuriyeti"@tr, + "Республіка Гаїті"@uk, + "海地共和国"@zh ; + skos:hiddenLabel "haitisk, haitiansk"@da, + "Αϊτής"@el, + "République de Haïti"@fr, + "Háítíoch"@ga, + "Haičio"@lt, + "il-Haiti"@mt, + "ir-Repubblika tal-Haiti"@mt, + "Republliken Haiti"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "79"^^euvoc:EP, + "RH"^^euvoc:FD_010, + "RH"^^euvoc:FD_400, + ".ht"^^euvoc:IANA_DOMAIN, + "HT"^^euvoc:ISG_COU, + "HT"^^euvoc:ISO_3166_1_ALPHA_2, + "HTI"^^euvoc:ISO_3166_1_ALPHA_3, + "332"^^euvoc:ISO_3166_1_NUM, + "HTI"^^euvoc:NAC, + "509"^^euvoc:PHONE_PREFIX, + "HT"^^euvoc:TED, + "HT"^^euvoc:TED_SCHEMA, + "RH"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "332"^^euvoc:UNSD_M49 ; + skos:prefLabel "هايتي"@ar, + "Хаити"@bg, + "Haití"@ca, + "Haiti"@cs, + "Haiti"@da, + "Haiti"@de, + "Αϊτή"@el, + "Haiti"@en, + "Haití"@es, + "Haiti"@et, + "Haiti"@fi, + "Haïti"@fr, + "Háítí"@ga, + "Haiti"@hr, + "Haiti"@hu, + "Haítí"@is, + "Haiti"@it, + "ハイチ"@ja, + "Haiti"@lb, + "Haitis"@lt, + "Haiti"@lv, + "Il-Haiti"@mt, + "Haïti"@nl, + "Haiti"@no, + "Haiti"@pl, + "Haiti"@pt, + "Haiti"@ro, + "Гаити"@ru, + "Haiti"@sk, + "Haiti"@sl, + "Haiti"@sv, + "Haiti"@tr, + "Гаїті"@uk, + "海地"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "IDN" ; + at:deprecated "false" ; + at:op-code "IDN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "ID" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "ID" ; + dc:source "TED" ] ; + at:start.use "1949-12-27" ; + atold:op-code "IDN" ; + dc:identifier "IDN" ; + skos:altLabel "جمهورية إندونيسيا"@ar, + "Република Индонезия"@bg, + "República d'Indonèsia"@ca, + "Indonéská republika"@cs, + "Republikken Indonesien"@da, + "Republik Indonesien"@de, + "Δημοκρατία της Ινδονησίας"@el, + "Republic of Indonesia"@en, + "República de Indonesia"@es, + "Indonesia Vabariik"@et, + "Indonesian tasavalta"@fi, + "République d’Indonésie"@fr, + "Poblacht na hIndinéise"@ga, + "Republika Indonezija"@hr, + "Indonéz Köztársaság"@hu, + "Indonesia"@id, + "Lýðveldið Indónesía"@is, + "Repubblica d’Indonesia"@it, + "インドネシア共和国"@ja, + "Republik Indonesien"@lb, + "Indonezijos Respublika"@lt, + "Indonēzijas Republika"@lv, + "Ir-Repubblika tal-Indoneżja"@mt, + "Republiek Indonesië"@nl, + "Republikken Indonesia"@no, + "Republika Indonezji"@pl, + "República da Indonésia"@pt, + "Republica Indonezia"@ro, + "Республика Индонезия"@ru, + "Indonézska republika"@sk, + "Republika Indonezija"@sl, + "Republiken Indonesien"@sv, + "Endonezya Cumhuriyeti"@tr, + "Республіка Індонезія"@uk, + "印度尼西亚共和国"@zh ; + skos:hiddenLabel "République d'Indonésie"@fr, + "an Indinéis"@ga, + "Repubblica di Indonesia"@it, + "Indonezijos"@lt, + "Indonēzijas"@lv, + "ir-Repubblika tal-Indoneżja"@mt, + "l-Indoneżja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "82"^^euvoc:EP, + "RI"^^euvoc:FD_010, + "RI"^^euvoc:FD_400, + ".id"^^euvoc:IANA_DOMAIN, + "ID"^^euvoc:ISG_COU, + "ID"^^euvoc:ISO_3166_1_ALPHA_2, + "IDN"^^euvoc:ISO_3166_1_ALPHA_3, + "360"^^euvoc:ISO_3166_1_NUM, + "IDN"^^euvoc:NAC, + "62"^^euvoc:PHONE_PREFIX, + "ID"^^euvoc:TED, + "ID"^^euvoc:TED_SCHEMA, + "RI"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "360"^^euvoc:UNSD_M49 ; + skos:prefLabel "اندونيسيا"@ar, + "Индонезия"@bg, + "Indonèsia"@ca, + "Indonésie"@cs, + "Indonesien"@da, + "Indonesien"@de, + "Ινδονησία"@el, + "Indonesia"@en, + "Indonesia"@es, + "Indoneesia"@et, + "Indonesia"@fi, + "Indonésie"@fr, + "An Indinéis"@ga, + "Indonezija"@hr, + "Indonézia"@hu, + "Indónesía"@is, + "Indonesia"@it, + "インドネシア"@ja, + "Indonesien"@lb, + "Indonezija"@lt, + "Indonēzija"@lv, + "L-Indoneżja"@mt, + "Indonesië"@nl, + "Indonesia"@no, + "Indonezja"@pl, + "Indonésia"@pt, + "Indonezia"@ro, + "Индонезия"@ru, + "Indonézia"@sk, + "Indonezija"@sl, + "Indonesien"@sv, + "Endonezya"@tr, + "Індонезія"@uk, + "印度尼西亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "IND" ; + at:deprecated "false" ; + at:op-code "IND" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "IN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "IN" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "IN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "IND" ; + dc:source "EurLex" ] ; + at:start.use "1950-01-26" ; + atold:op-code "IND" ; + dc:identifier "IND" ; + skos:altLabel "جمهورية الهند"@ar, + "Република Индия"@bg, + "República de l'Índia"@ca, + "Indická republika"@cs, + "Republikken Indien"@da, + "Republik Indien"@de, + "Δημοκρατία της Ινδίας"@el, + "Republic of India"@en, + "República de la India"@es, + "India Vabariik"@et, + "Intian tasavalta"@fi, + "République de l’Inde"@fr, + "Poblacht na hIndia"@ga, + "भारत"@hi, + "Republika Indija"@hr, + "Indiai Köztársaság"@hu, + "Lýðveldið Indland"@is, + "インド共和国"@ja, + "Republik Indien"@lb, + "Indijos Respublika"@lt, + "Indijas Republika"@lv, + "Ir-Repubblika tal-Indja"@mt, + "Republiek India"@nl, + "Republikken India"@no, + "Republika Indii"@pl, + "República da Índia"@pt, + "Republica India"@ro, + "Республика Индия"@ru, + "Indická republika"@sk, + "Republika Indija"@sl, + "Republiken Indien"@sv, + "Hindistan Cumhuriyeti"@tr, + "Республіка Індія"@uk, + "印度共和国"@zh ; + skos:changeNote "Includes ‘Sikkim’ former ISO code ‘SK’."@en, + "Inclut «Sikkim» précédent code ISO «SK»."@fr ; + skos:hiddenLabel "Républic of India"@en, + "République de l'Inde"@fr, + "an India"@ga, + "Repubblica dell'India"@it, + "Indijos"@lt, + "Indijas"@lv, + "ir-Repubblika tal-Indja"@mt, + "l-Indja"@mt, + "Indiase"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "84"^^euvoc:EP, + "IND"^^euvoc:FD_010, + "IN"^^euvoc:FD_140, + ".in"^^euvoc:IANA_DOMAIN, + "IN"^^euvoc:ISG_COU, + "IN"^^euvoc:ISO_3166_1_ALPHA_2, + "IND"^^euvoc:ISO_3166_1_ALPHA_3, + "356"^^euvoc:ISO_3166_1_NUM, + "IND"^^euvoc:NAC, + "91"^^euvoc:PHONE_PREFIX, + "IN"^^euvoc:TED, + "IN"^^euvoc:TED_SCHEMA, + "IND"^^euvoc:TIR, + "Southern Asia"^^euvoc:UNSD_GEOSCHEME, + "356"^^euvoc:UNSD_M49 ; + skos:prefLabel "الهند"@ar, + "Индия"@bg, + "Índia"@ca, + "Indie"@cs, + "Indien"@da, + "Indien"@de, + "Ινδία"@el, + "India"@en, + "India"@es, + "India"@et, + "Intia"@fi, + "Inde"@fr, + "An India"@ga, + "Indija"@hr, + "India"@hu, + "Indland"@is, + "India"@it, + "インド"@ja, + "Indien"@lb, + "Indija"@lt, + "Indija"@lv, + "L-Indja"@mt, + "India"@nl, + "India"@no, + "Indie"@pl, + "Índia"@pt, + "India"@ro, + "Индия"@ru, + "India"@sk, + "Indija"@sl, + "Indien"@sv, + "Hindistan"@tr, + "Індія"@uk, + "印度"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "IRN" ; + at:deprecated "false" ; + at:op-code "IRN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "IR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "IR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "IR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "IR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "IR" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "IRN" ; + dc:identifier "IRN" ; + skos:altLabel "جمهورية إيران الإسلامية"@ar, + "Ислямска република Иран"@bg, + "República Islàmica d’Iran"@ca, + "Íránská islámská republika"@cs, + "Den Islamiske Republik Iran"@da, + "Islamische Republik Iran"@de, + "Ισλαμική Δημοκρατία του Ιράν"@el, + "Islamic Republic of Iran"@en, + "República Islámica de Irán"@es, + "Iraani Islamivabariik"@et, + "ایران"@fa, + "Iranin islamilainen tasavalta"@fi, + "République islamique d’Iran"@fr, + "Poblacht Ioslamach na hIaráine"@ga, + "Islamska Republika Iran"@hr, + "Iráni Iszlám Köztársaság"@hu, + "Íslamska lýðveldið Íran"@is, + "Repubblica islamica dell’Iran"@it, + "イラン・イスラム共和国"@ja, + "Islamesch Republik Iran"@lb, + "Irano Islamo Respublika"@lt, + "Irānas Islāma Republika"@lv, + "Ir-Repubblika Iżlamika tal-Iran"@mt, + "Islamitische Republiek Iran"@nl, + "Den islamske republikken Iran"@no, + "Islamska Republika Iranu"@pl, + "República Islâmica do Irão"@pt, + "Republica Islamică Iran"@ro, + "Исламская Республика Иран"@ru, + "Iránska islamská republika"@sk, + "Islamska republika Iran"@sl, + "Islamiska republiken Iran"@sv, + "İran İslam Cumhuriyeti"@tr, + "Ісламська Республіка Іран"@uk, + "伊朗伊斯兰共和国"@zh ; + skos:hiddenLabel "République islamique d'Iran"@fr, + "an Iaráin"@ga, + "Repubblica islamica dell'Iran"@it, + "Irano"@lt, + "Irānas"@lv, + "ir-Repubblika Iżlamika tal-Iran"@mt, + "l-Iran"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "87"^^euvoc:EP, + "IR"^^euvoc:FD_010, + "IR"^^euvoc:FD_140, + "IR"^^euvoc:FD_400, + ".ir"^^euvoc:IANA_DOMAIN, + "IR"^^euvoc:ISG_COU, + "IR"^^euvoc:ISO_3166_1_ALPHA_2, + "IRN"^^euvoc:ISO_3166_1_ALPHA_3, + "364"^^euvoc:ISO_3166_1_NUM, + "IRN"^^euvoc:NAC, + "98"^^euvoc:PHONE_PREFIX, + "IR"^^euvoc:TED, + "IR"^^euvoc:TED_SCHEMA, + "IR"^^euvoc:TIR, + "Southern Asia"^^euvoc:UNSD_GEOSCHEME, + "364"^^euvoc:UNSD_M49 ; + skos:prefLabel "إيران"@ar, + "Иран"@bg, + "Iran"@ca, + "Írán"@cs, + "Iran"@da, + "Iran"@de, + "Ιράν"@el, + "Iran"@en, + "Irán"@es, + "Iraan"@et, + "Iran"@fi, + "Iran"@fr, + "An Iaráin"@ga, + "Iran"@hr, + "Irán"@hu, + "Íran"@is, + "Iran"@it, + "イラン"@ja, + "Iran"@lb, + "Iranas"@lt, + "Irāna"@lv, + "L-Iran"@mt, + "Iran"@nl, + "Iran"@no, + "Iran"@pl, + "Irão"@pt, + "Iran"@ro, + "Иран"@ru, + "Irán"@sk, + "Iran"@sl, + "Iran"@sv, + "İran"@tr, + "Іран"@uk, + "伊朗"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "IRQ" ; + at:deprecated "false" ; + at:op-code "IRQ" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "IRQ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "IQ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "IQ" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "IRQ" ; + dc:identifier "IRQ" ; + skos:altLabel "جمهورية العراق"@ar, + "Република Ирак"@bg, + "República de l'Iraq"@ca, + "Irácká republika"@cs, + "Republikken Irak"@da, + "Republik Irak"@de, + "Δημοκρατία του Ιράκ"@el, + "Republic of Iraq"@en, + "República de Iraq"@es, + "Iraagi Vabariik"@et, + "Irakin tasavalta"@fi, + "République d’Iraq"@fr, + "Poblacht na hIaráice"@ga, + "Republika Irak"@hr, + "Iraki Köztársaság"@hu, + "Lýðveldið Írak"@is, + "Irak"@it, + "Repubblica dell’Iraq"@it, + "イラク共和国"@ja, + "Îraq"@ku, + "Republik Irak"@lb, + "Irako Respublika"@lt, + "Irākas Republika"@lv, + "Ir-Repubblika tal-Iraq"@mt, + "Republiek Irak"@nl, + "Republikken Irak"@no, + "Republika Iraku"@pl, + "República do Iraque"@pt, + "Republica Irak"@ro, + "Республика Ирак"@ru, + "Iracká republika"@sk, + "Republika Irak"@sl, + "Republiken Irak"@sv, + "Irak Cumhuriyeti"@tr, + "Республіка Ірак"@uk, + "伊拉克共和国"@zh ; + skos:hiddenLabel "Irak"@es, + "República de Irak"@es, + "Irak"@fr, + "République d'Iraq"@fr, + "an Iaráic"@ga, + "Repubblica dell'Iraq"@it, + "Irako"@lt, + "Irākas"@lv, + "Iraqija"@mt, + "ir-Repubblika tal-Iraq"@mt, + "l-Iraq"@mt, + "iraquiana"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "86"^^euvoc:EP, + "IRQ"^^euvoc:FD_010, + ".iq"^^euvoc:IANA_DOMAIN, + "IQ"^^euvoc:IBAN_COU, + "IQ"^^euvoc:ISG_COU, + "IQ"^^euvoc:ISO_3166_1_ALPHA_2, + "IRQ"^^euvoc:ISO_3166_1_ALPHA_3, + "368"^^euvoc:ISO_3166_1_NUM, + "IRQ"^^euvoc:NAC, + "964"^^euvoc:PHONE_PREFIX, + "IQ"^^euvoc:TED, + "IQ"^^euvoc:TED_SCHEMA, + "IRQ"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "368"^^euvoc:UNSD_M49 ; + skos:prefLabel "العراق"@ar, + "Ирак"@bg, + "Iraq"@ca, + "Irák"@cs, + "Irak"@da, + "Irak"@de, + "Ιράκ"@el, + "Iraq"@en, + "Iraq"@es, + "Iraak"@et, + "Irak"@fi, + "Iraq"@fr, + "An Iaráic"@ga, + "Irak"@hr, + "Irak"@hu, + "Írak"@is, + "Iraq"@it, + "イラク"@ja, + "Irak"@lb, + "Irakas"@lt, + "Irāka"@lv, + "L-Iraq"@mt, + "Irak"@nl, + "Irak"@no, + "Irak"@pl, + "Iraque"@pt, + "Irak"@ro, + "Ирак"@ru, + "Irak"@sk, + "Irak"@sl, + "Irak"@sv, + "Irak"@tr, + "Ірак"@uk, + "伊拉克"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ISL" ; + at:deprecated "false" ; + at:op-code "ISL" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "IS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "IS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{ISL}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "IS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "IS" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "IS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "IS" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "IS" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ISL" ; + dc:identifier "ISL" ; + skos:hiddenLabel "Република Исландия"@bg, + "Islandská republika"@cs, + "Republikken Island"@da, + "Δημοκρατία της Ισλανδίας"@el, + "Islannin tasavalta"@fi, + "Poblacht na hÍoslainne"@ga, + "an Íoslainn"@ga, + "Íoslannach"@ga, + "Republika Island"@hr, + "Izlandi Köztársaság"@hu, + "Islandijos"@lt, + "Islandijos Respublika"@lt, + "Islandes"@lv, + "Islandes Republika"@lv, + "ir-Repubblika tal-Iżlanda"@mt, + "l-Iżlanda"@mt, + "Republiek IJsland"@nl, + "Republika Islandii"@pl, + "República da Islândia"@pt, + "Republica Islanda"@ro, + "Islandská republika"@sk, + "Republika Islandija"@sl, + "Republiken Island"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "88"^^euvoc:EP, + "IS"^^euvoc:FD_010, + "IS"^^euvoc:FD_050, + "IS"^^euvoc:FD_140, + "IS"^^euvoc:FD_160, + "IS"^^euvoc:FD_400, + ".is"^^euvoc:IANA_DOMAIN, + "IS"^^euvoc:IBAN_COU, + "IS"^^euvoc:ISG_COU, + "IS"^^euvoc:ISO_3166_1_ALPHA_2, + "ISL"^^euvoc:ISO_3166_1_ALPHA_3, + "352"^^euvoc:ISO_3166_1_NUM, + "ISL"^^euvoc:NAC, + "354"^^euvoc:PHONE_PREFIX, + "{ISL}"^^euvoc:PUB_LOC, + "IS"^^euvoc:TED, + "IS"^^euvoc:TED_SCHEMA, + "IS"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "352"^^euvoc:UNSD_M49 ; + skos:prefLabel "أيسلندا"@ar, + "Ісландыя"@be, + "Исландия"@bg, + "Island"@bs, + "Islàndia"@ca, + "Island"@cs, + "Island"@da, + "Island"@de, + "Ισλανδία"@el, + "Iceland"@en, + "Islandia"@es, + "Island"@et, + "Islandia"@eu, + "Islanti"@fi, + "Ísland"@fo, + "Islande"@fr, + "An Íoslainn"@ga, + "Islandia"@gl, + "Island"@hr, + "Izland"@hu, + "Ísland"@is, + "Islanda"@it, + "アイスランド"@ja, + "Island"@lb, + "Islandija"@lt, + "Islande"@lv, + "Исланд"@mk, + "L-Iżlanda"@mt, + "IJsland"@nl, + "Island"@no, + "Islandia"@pl, + "Islândia"@pt, + "Islanda"@rm, + "Islanda"@ro, + "Исландия"@ru, + "Island"@sk, + "Islandija"@sl, + "Islanda"@sq, + "Исланд"@sr, + "Island"@sv, + "İzlanda"@tr, + "Ісландія"@uk, + "冰岛"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ISR" ; + at:deprecated "false" ; + at:op-code "ISR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "IL" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "IL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "IL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "IL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "IL" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ISR" ; + dc:identifier "ISR" ; + skos:altLabel "دولة إسرائيل"@ar, + "Държавата Израел"@bg, + "Estat d'Israel"@ca, + "Stát Izrael"@cs, + "Staten Israel"@da, + "Staat Israel"@de, + "Κράτος του Ισραήλ"@el, + "State of Israel"@en, + "Estado de Israel"@es, + "Iisraeli Riik"@et, + "Israelin valtio"@fi, + "État d’Israël"@fr, + "Stát Iosrael"@ga, + "ישראל"@he, + "Država Izrael"@hr, + "Izrael Állam"@hu, + "Ísraelsríki"@is, + "Stato d’Israele"@it, + "イスラエル国"@ja, + "Staat Israel"@lb, + "Izraelio Valstybė"@lt, + "Izraēlas Valsts"@lv, + "L-Istat ta’ Iżrael"@mt, + "Staat Israël"@nl, + "Staten Israel"@no, + "Państwo Izrael"@pl, + "Estado de Israel"@pt, + "Statul Israel"@ro, + "Государство Израиль"@ru, + "Izraelský štát"@sk, + "Država Izrael"@sl, + "Staten Israel"@sv, + "İsrail Devleti"@tr, + "Держава Ізраїль"@uk, + "以色列国"@zh ; + skos:hiddenLabel "Iisraeli"@et, + "israëlienne"@fr, + "État d'Israël"@fr, + "Stato d'Israele"@it, + "isrealiana"@it, + "Izraelio"@lt, + "Izraēlas"@lv, + "l-Istat ta' Iżrael"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "270"^^euvoc:EP, + "83"^^euvoc:EP, + "IL"^^euvoc:FD_010, + "IL"^^euvoc:FD_140, + "IL"^^euvoc:FD_400, + ".il"^^euvoc:IANA_DOMAIN, + "IL"^^euvoc:IBAN_COU, + "IL"^^euvoc:ISG_COU, + "IL"^^euvoc:ISO_3166_1_ALPHA_2, + "ISR"^^euvoc:ISO_3166_1_ALPHA_3, + "376"^^euvoc:ISO_3166_1_NUM, + "ISR"^^euvoc:NAC, + "972"^^euvoc:PHONE_PREFIX, + "IL"^^euvoc:TED, + "IL"^^euvoc:TED_SCHEMA, + "IL"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "376"^^euvoc:UNSD_M49 ; + skos:prefLabel "إسرائيل"@ar, + "Израел"@bg, + "Israel"@ca, + "Izrael"@cs, + "Israel"@da, + "Israel"@de, + "Ισραήλ"@el, + "Israel"@en, + "Israel"@es, + "Iisrael"@et, + "Israel"@fi, + "Israël"@fr, + "Iosrael"@ga, + "Izrael"@hr, + "Izrael"@hu, + "Ísrael"@is, + "Israele"@it, + "イスラエル"@ja, + "Israel"@lb, + "Izraelis"@lt, + "Izraēla"@lv, + "Iżrael"@mt, + "Israël"@nl, + "Israel"@no, + "Izrael"@pl, + "Israel"@pt, + "Israel"@ro, + "Израиль"@ru, + "Izrael"@sk, + "Izrael"@sl, + "Israel"@sv, + "İsrail"@tr, + "Ізраїль"@uk, + "以色列"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "JAM" ; + at:deprecated "false" ; + at:op-code "JAM" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "JA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "JM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "JA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "JM" ; + dc:source "TED" ] ; + at:start.use "1962-08-06" ; + atold:op-code "JAM" ; + dc:identifier "JAM" ; + skos:hiddenLabel "jamajačko"@hr, + "Jamaikos"@lt, + "Jamaikas"@lv, + "il-Ġamajka"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "89"^^euvoc:EP, + "JA"^^euvoc:FD_010, + "JA"^^euvoc:FD_400, + ".jm"^^euvoc:IANA_DOMAIN, + "JM"^^euvoc:ISG_COU, + "JM"^^euvoc:ISO_3166_1_ALPHA_2, + "JAM"^^euvoc:ISO_3166_1_ALPHA_3, + "388"^^euvoc:ISO_3166_1_NUM, + "JAM"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "JM"^^euvoc:TED, + "JM"^^euvoc:TED_SCHEMA, + "JA"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "388"^^euvoc:UNSD_M49 ; + skos:prefLabel "جامايكا"@ar, + "Ямайка"@bg, + "Jamaica"@ca, + "Jamajka"@cs, + "Jamaica"@da, + "Jamaika"@de, + "Τζαμάικα"@el, + "Jamaica"@en, + "Jamaica"@es, + "Jamaica"@et, + "Jamaika"@fi, + "Jamaïque"@fr, + "Iamáice"@ga, + "Jamajka"@hr, + "Jamaica"@hu, + "Jamaíka"@is, + "Giamaica"@it, + "ジャマイカ"@ja, + "Jamaika"@lb, + "Jamaika"@lt, + "Jamaika"@lv, + "Il-Ġamajka"@mt, + "Jamaica"@nl, + "Jamaica"@no, + "Jamajka"@pl, + "Jamaica"@pt, + "Jamaica"@ro, + "Ямайка"@ru, + "Jamajka"@sk, + "Jamajka"@sl, + "Jamaica"@sv, + "Jamaika"@tr, + "Ямайка"@uk, + "牙买加"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "JOR" ; + at:deprecated "false" ; + at:op-code "JOR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "JO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "JOR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "JO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "JO" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "JOR" ; + dc:identifier "JOR" ; + skos:altLabel "المملكة الأردنية الهاشمية"@ar, + "Хашемитско кралство Йордания"@bg, + "Regne Haiximita de Jordània"@ca, + "Jordánské hášimovské království"@cs, + "Det Hashemitiske Kongerige Jordan"@da, + "Haschemitische Königreich Jordanien"@de, + "Χασεμιτικό Βασίλειο της Ιορδανίας"@el, + "Hashemite Kingdom of Jordan"@en, + "Reino Hachemí de Jordania"@es, + "Jordaania Hašimiidi Kuningriik"@et, + "Jordanian hašemiittinen kuningaskunta"@fi, + "Royaume hachémite de Jordanie"@fr, + "Ríocht Haisimíteach na hIordáine"@ga, + "Hašemitska Kraljevina Jordan"@hr, + "Jordán Hásimita Királyság"@hu, + "Hasémíska konungsríkið Jórdanía"@is, + "Regno hascemita di Giordania"@it, + "ヨルダン・ハシェミット王国"@ja, + "Hashemitescht Kinnekräich Jordanien"@lb, + "Jordanijos Hašimitų Karalystė"@lt, + "Jordānijas Hāšimītu Karaliste"@lv, + "Ir-Renju Ħaxemita tal-Ġordan"@mt, + "Hasjemitisch Koninkrijk Jordanië"@nl, + "Det hashemitiske kongeriket Jordan"@no, + "Jordańskie Królestwo Haszymidzkie"@pl, + "Reino Haxemita da Jordânia"@pt, + "Regatul Haşemit al Iordaniei"@ro, + "Иорданское Хашимитское Королевство"@ru, + "Jordánske hášimovské kráľovstvo"@sk, + "Hašemitska kraljevina Jordanija"@sl, + "Hashimitiska konungariket Jordanien"@sv, + "Ürdün Haşimi Krallığı"@tr, + "Йорданське Хашимітське Королівство"@uk, + "约旦哈希姆王国"@zh ; + skos:hiddenLabel "Haschemitisches Königreich Jordanien"@de, + "an Iordáin"@ga, + "Jordanijos"@lt, + "Jordānijas"@lv, + "il-Ġordan"@mt, + "ir-Renju Ħaxemita tal-Ġordan"@mt, + "Ġordanjana"@mt, + "Reino Hachemita da Jordânia"@pt, + "Regatul Hașemit al Iordaniei"@ro ; + skos:inScheme atold:country, + , + , + ; + skos:notation "239"^^euvoc:EP, + "JOR"^^euvoc:FD_010, + "JO"^^euvoc:FD_140, + ".jo"^^euvoc:IANA_DOMAIN, + "JO"^^euvoc:IBAN_COU, + "JO"^^euvoc:ISG_COU, + "JO"^^euvoc:ISO_3166_1_ALPHA_2, + "JOR"^^euvoc:ISO_3166_1_ALPHA_3, + "400"^^euvoc:ISO_3166_1_NUM, + "JOR"^^euvoc:NAC, + "962"^^euvoc:PHONE_PREFIX, + "JO"^^euvoc:TED, + "JO"^^euvoc:TED_SCHEMA, + "HKJ"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "400"^^euvoc:UNSD_M49 ; + skos:prefLabel "الأردن"@ar, + "Йордания"@bg, + "Jordània"@ca, + "Jordánsko"@cs, + "Jordan"@da, + "Jordanien"@de, + "Ιορδανία"@el, + "Jordan"@en, + "Jordania"@es, + "Jordaania"@et, + "Jordania"@fi, + "Jordanie"@fr, + "An Iordáin"@ga, + "Jordan"@hr, + "Jordánia"@hu, + "Jórdanía"@is, + "Giordania"@it, + "ヨルダン"@ja, + "Jordanien"@lb, + "Jordanija"@lt, + "Jordānija"@lv, + "Il-Ġordan"@mt, + "Jordanië"@nl, + "Jordan"@no, + "Jordania"@pl, + "Jordânia"@pt, + "Iordania"@ro, + "Иордания"@ru, + "Jordánsko"@sk, + "Jordanija"@sl, + "Jordanien"@sv, + "Ürdün"@tr, + "Йорданія"@uk, + "约旦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "JPN" ; + at:deprecated "false" ; + at:op-code "JPN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "JP" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "JP" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "J" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "JP" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "JPN" ; + dc:identifier "JPN" ; + skos:hiddenLabel "an tSeapáin"@ga, + "Japonijos"@lt, + "Japānas"@lv, + "il-Ġappun"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "90"^^euvoc:EP, + "J"^^euvoc:FD_010, + "JP"^^euvoc:FD_140, + ".jp"^^euvoc:IANA_DOMAIN, + "JP"^^euvoc:ISG_COU, + "JP"^^euvoc:ISO_3166_1_ALPHA_2, + "JPN"^^euvoc:ISO_3166_1_ALPHA_3, + "392"^^euvoc:ISO_3166_1_NUM, + "JPN"^^euvoc:NAC, + "81"^^euvoc:PHONE_PREFIX, + "JP"^^euvoc:TED, + "JP"^^euvoc:TED_SCHEMA, + "J"^^euvoc:TIR, + "Eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "392"^^euvoc:UNSD_M49 ; + skos:prefLabel "اليابان"@ar, + "Япония"@bg, + "Japó"@ca, + "Japonsko"@cs, + "Japan"@da, + "Japan"@de, + "Ιαπωνία"@el, + "Japan"@en, + "Japón"@es, + "Jaapan"@et, + "Japani"@fi, + "Japon"@fr, + "An tSeapáin"@ga, + "Japan"@hr, + "Japán"@hu, + "Japan"@is, + "Giappone"@it, + "日本"@ja, + "Japan"@lb, + "Japonija"@lt, + "Japāna"@lv, + "Il-Ġappun"@mt, + "Japan"@nl, + "Japan"@no, + "Japonia"@pl, + "Japão"@pt, + "Japonia"@ro, + "Япония"@ru, + "Japonsko"@sk, + "Japonska"@sl, + "Japan"@sv, + "Japonya"@tr, + "Японія"@uk, + "日本"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "KAZ" ; + at:deprecated "false" ; + at:op-code "KAZ" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "KZ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "KZ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "KZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "KAZ" ; + dc:source "EurLex" ] ; + at:start.use "1991-12-16" ; + atold:op-code "KAZ" ; + dc:identifier "KAZ" ; + skos:altLabel "جمهورية كازاخستان"@ar, + "Република Казахстан"@bg, + "República del Kazakhstan"@ca, + "Republika Kazachstán"@cs, + "Republikken Kasakhstan"@da, + "Republik Kasachstan"@de, + "Δημοκρατία του Καζακστάν"@el, + "Republic of Kazakhstan"@en, + "República de Kazajstán"@es, + "Kasahstani Vabariik"@et, + "Kazakstanin tasavalta"@fi, + "République du Kazakhstan"@fr, + "Poblacht na Casacstáine"@ga, + "Republika Kazahstan"@hr, + "Kazah Köztársaság"@hu, + "Lýðveldið Kasakstan"@is, + "Repubblica del Kazakstan"@it, + "カザフスタン共和国"@ja, + "Қазақстан"@kk, + "Republik Kasachstan"@lb, + "Kazachstano Respublika"@lt, + "Kazahstānas Republika"@lv, + "Ir-Repubblika tal-Każakistan"@mt, + "Republiek Kazachstan"@nl, + "Republikken Kasakhstan"@no, + "Republika Kazachstanu"@pl, + "República do Cazaquistão"@pt, + "Republica Kazahstan"@ro, + "Республика Казахстан"@ru, + "Kazašská republika"@sk, + "Republika Kazahstan"@sl, + "Republiken Kazakstan"@sv, + "Kazakistan Cumhuriyeti"@tr, + "Республіка Казахстан"@uk, + "哈萨克斯坦共和国"@zh ; + skos:hiddenLabel "Δημοκρατία του Καζαχστάν"@el, + "Καζαχστάν"@el, + "Kazakh"@en, + "Kazajistán"@es, + "República de Kazajistán"@es, + "kazakhstanne"@fr, + "an Chasacstáin"@ga, + "Kazachstano"@lt, + "Kazahstānas"@lv, + "Każakistana"@mt, + "il-Każakistan"@mt, + "ir-Repubblika tal-Każakistan"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "101"^^euvoc:EP, + "KAZ"^^euvoc:FD_010, + "KZ"^^euvoc:FD_140, + ".kz"^^euvoc:IANA_DOMAIN, + "KZ"^^euvoc:IBAN_COU, + "KZ"^^euvoc:ISG_COU, + "KZ"^^euvoc:ISO_3166_1_ALPHA_2, + "KAZ"^^euvoc:ISO_3166_1_ALPHA_3, + "398"^^euvoc:ISO_3166_1_NUM, + "KAZ"^^euvoc:NAC, + "7"^^euvoc:PHONE_PREFIX, + "KZ"^^euvoc:TED, + "KZ"^^euvoc:TED_SCHEMA, + "KZ"^^euvoc:TIR, + "Central Asia"^^euvoc:UNSD_GEOSCHEME, + "398"^^euvoc:UNSD_M49 ; + skos:prefLabel "كازاخستان"@ar, + "Казахстан"@bg, + "Kazakhstan"@ca, + "Kazachstán"@cs, + "Kasakhstan"@da, + "Kasachstan"@de, + "Καζακστάν"@el, + "Kazakhstan"@en, + "Kazajstán"@es, + "Kasahstan"@et, + "Kazakstan"@fi, + "Kazakhstan"@fr, + "An Chasacstáin"@ga, + "Kazahstan"@hr, + "Kazahsztán"@hu, + "Kasakstan"@is, + "Kazakstan"@it, + "カザフスタン"@ja, + "Kasachstan"@lb, + "Kazachstanas"@lt, + "Kazahstāna"@lv, + "Il-Każakistan"@mt, + "Kazachstan"@nl, + "Kasakhstan"@no, + "Kazachstan"@pl, + "Cazaquistão"@pt, + "Kazahstan"@ro, + "Казахстан"@ru, + "Kazachstan"@sk, + "Kazahstan"@sl, + "Kazakstan"@sv, + "Kazakistan"@tr, + "Казахстан"@uk, + "哈萨克斯坦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "KEN" ; + at:deprecated "false" ; + at:op-code "KEN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "EAK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "EAK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "KE" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1964-12-12" ; + atold:op-code "KEN" ; + dc:identifier "KEN" ; + skos:altLabel "جمهورية كينيا"@ar, + "Република Кения"@bg, + "República de Kenya"@ca, + "Keňská republika"@cs, + "Republikken Kenya"@da, + "Republik Kenia"@de, + "Δημοκρατία της Κένυας"@el, + "Republic of Kenya"@en, + "República de Kenia"@es, + "Keenia Vabariik"@et, + "Kenian tasavalta"@fi, + "République du Kenya"@fr, + "Poblacht na Céinia"@ga, + "Republika Kenija"@hr, + "Kenyai Köztársaság"@hu, + "Lýðveldið Kenya"@is, + "Kenia"@it, + "Repubblica del Kenya"@it, + "ケニア共和国"@ja, + "Republik Kenia"@lb, + "Kenijos Respublika"@lt, + "Kenijas Republika"@lv, + "Ir-Repubblika tal-Kenja"@mt, + "Republiek Kenia"@nl, + "Republikken Kenya"@no, + "Republika Kenii"@pl, + "República do Quénia"@pt, + "Republica Kenya"@ro, + "Республика Кения"@ru, + "Kenská republika"@sk, + "Republika Kenija"@sl, + "Republiken Kenya"@sv, + "Kenya"@sw, + "Kenya Cumhuriyeti"@tr, + "Республіка Кенія"@uk, + "肯尼亚共和国"@zh ; + skos:hiddenLabel "kényanne"@fr, + "an Chéinia"@ga, + "Kenijos"@lt, + "Kenijas"@lv, + "il-Kenja"@mt, + "ir-Repubblika tal-Kenja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "92"^^euvoc:EP, + "EAK"^^euvoc:FD_010, + "EAK"^^euvoc:FD_400, + ".ke"^^euvoc:IANA_DOMAIN, + "KE"^^euvoc:ISG_COU, + "KE"^^euvoc:ISO_3166_1_ALPHA_2, + "KEN"^^euvoc:ISO_3166_1_ALPHA_3, + "404"^^euvoc:ISO_3166_1_NUM, + "KEN"^^euvoc:NAC, + "254"^^euvoc:PHONE_PREFIX, + "KE"^^euvoc:TED, + "KE"^^euvoc:TED_SCHEMA, + "EAK"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "404"^^euvoc:UNSD_M49 ; + skos:prefLabel "كينيا"@ar, + "Кения"@bg, + "Kenya"@ca, + "Keňa"@cs, + "Kenya"@da, + "Kenia"@de, + "Κένυα"@el, + "Kenya"@en, + "Kenia"@es, + "Keenia"@et, + "Kenia"@fi, + "Kenya"@fr, + "An Chéinia"@ga, + "Kenija"@hr, + "Kenya"@hu, + "Kenya"@is, + "Kenya"@it, + "ケニア"@ja, + "Kenia"@lb, + "Kenija"@lt, + "Kenija"@lv, + "Il-Kenja"@mt, + "Kenia"@nl, + "Kenya"@no, + "Kenia"@pl, + "Quénia"@pt, + "Kenya"@ro, + "Кения"@ru, + "Keňa"@sk, + "Kenija"@sl, + "Kenya"@sv, + "Kenya"@tr, + "Кенія"@uk, + "肯尼亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "KGZ" ; + at:deprecated "false" ; + at:op-code "KGZ" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "KIR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "KG" ; + dc:source "TED" ] ; + at:start.use "1991-08-31" ; + atold:op-code "KGZ" ; + dc:identifier "KGZ" ; + skos:altLabel "جمهورية قيرغيزستان"@ar, + "Киргизка република"@bg, + "República Kirguisa"@ca, + "Kyrgyzská republika"@cs, + "Den Kirgisiske Republik"@da, + "Kirgisische Republik"@de, + "Δημοκρατία της Κιργιζίας"@el, + "Kyrgyz Republic"@en, + "República Kirguisa"@es, + "Kirgiisi Vabariik"@et, + "Kirgisian tasavalta"@fi, + "République kirghize"@fr, + "Poblacht na Cirgise"@ga, + "Kirgistanska Republika"@hr, + "Kirgiz Köztársaság"@hu, + "Kirgiska lýðveldið"@is, + "Repubblica del Kirghizistan"@it, + "キルギス共和国"@ja, + "Kırgızstan"@ky, + "Kirgisesch Republik"@lb, + "Kirgizijos Respublika"@lt, + "Kirgīzu Republika"@lv, + "Ir-Repubblika tal-Kirgistan"@mt, + "Kirgizische Republiek"@nl, + "Republikken Kirgisistan"@no, + "Republika Kirgiska"@pl, + "República do Quirguizistão"@pt, + "Republica Kârgâză"@ro, + "Киргизская Республика"@ru, + "Кыргызстан"@ru, + "Kirgizská republika"@sk, + "Kirgiška republika"@sl, + "Republiken Kirgizistan"@sv, + "Kırgız Cumhuriyeti"@tr, + "Киргизька Республіка"@uk, + "吉尔吉斯共和国"@zh ; + skos:hiddenLabel "Κιργιζίας"@el, + "Kirghizistan"@fr, + "an Chirgeastáin"@ga, + "Kirgiska Republika"@hr, + "kirgistansko"@hr, + "Kirgizijos"@lt, + "Kirgizstānas"@lv, + "Kirgiżistana"@mt, + "il-Kirgiżistan"@mt, + "ir-Repubblika Kirgiża"@mt, + "kirgistańskie"@pl, + "Quirguistão"@pt, + "República Quirguiz"@pt, + "quirguiz"@pt, + "Republika Kirgizistan"@sl, + "kirgizisk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "93"^^euvoc:EP, + "KIR"^^euvoc:FD_010, + ".kg"^^euvoc:IANA_DOMAIN, + "KG"^^euvoc:ISG_COU, + "KG"^^euvoc:ISO_3166_1_ALPHA_2, + "KGZ"^^euvoc:ISO_3166_1_ALPHA_3, + "417"^^euvoc:ISO_3166_1_NUM, + "KGZ"^^euvoc:NAC, + "996"^^euvoc:PHONE_PREFIX, + "KG"^^euvoc:TED, + "KG"^^euvoc:TED_SCHEMA, + "KS"^^euvoc:TIR, + "Central Asia"^^euvoc:UNSD_GEOSCHEME, + "417"^^euvoc:UNSD_M49 ; + skos:prefLabel "قيرغيزستان"@ar, + "Киргизстан"@bg, + "Kirguizistan"@ca, + "Kyrgyzstán"@cs, + "Kirgisistan"@da, + "Kirgisistan"@de, + "Κιργιζία"@el, + "Kyrgyzstan"@en, + "Kirguistán"@es, + "Kõrgõzstan"@et, + "Kirgisia"@fi, + "Kirghizstan"@fr, + "An Chirgeastáin"@ga, + "Kirgistan"@hr, + "Kirgizisztán"@hu, + "Kirgistan"@is, + "Kirghizistan"@it, + "キルギスタン"@ja, + "Kirgisistan"@lb, + "Kirgizija"@lt, + "Kirgizstāna"@lv, + "Il-Kirgistan"@mt, + "Kirgizië"@nl, + "Kirgisistan"@no, + "Kirgistan"@pl, + "Quirguizistão"@pt, + "Kârgâzstan"@ro, + "Киргизия"@ru, + "Kirgizsko"@sk, + "Kirgizistan"@sl, + "Kirgizistan"@sv, + "Kırgızistan"@tr, + "Киргизстан"@uk, + "吉尔吉斯斯坦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "KHM" ; + at:deprecated "false" ; + at:op-code "KHM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "KH" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CMB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "K" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "K" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KH" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1953-11-09" ; + atold:op-code "KHM" ; + dc:identifier "KHM" ; + skos:altLabel "مملكة كمبوديا"@ar, + "Кралство Камбоджа"@bg, + "Regne de Cambodja"@ca, + "Kambodžské království"@cs, + "Kongeriget Cambodja"@da, + "Königreich Kambodscha"@de, + "Βασίλειο της Καμπότζης"@el, + "Kingdom of Cambodia"@en, + "Reino de Camboya"@es, + "Kambodža Kuningriik"@et, + "Kambodžan kuningaskunta"@fi, + "Royaume du Cambodge"@fr, + "Ríocht na Cambóide"@ga, + "Kraljevina Kambodža"@hr, + "Kambodzsai Királyság"@hu, + "Konungsríkið Kambódía"@is, + "Regno di Cambogia"@it, + "カンボジア王国"@ja, + "កម្ពុជា"@km, + "Kinnekräich Cambodge"@lb, + "Kambodžos Karalystė"@lt, + "Kambodžas Karaliste"@lv, + "Ir-Renju tal-Kambodja"@mt, + "Koninkrijk Cambodja"@nl, + "Kongeriket Kambodsja"@no, + "Królestwo Kambodży"@pl, + "Reino do Camboja"@pt, + "Regatul Cambodgia"@ro, + "Королевство Камбоджа"@ru, + "Kambodžské kráľovstvo"@sk, + "Kraljevina Kambodža"@sl, + "Konungariket Kambodja"@sv, + "Kamboçya Krallığı"@tr, + "Королівство Камбоджа"@uk, + "柬埔寨王国"@zh ; + skos:hiddenLabel "Καμπότζης"@el, + "kampuchea"@fr, + "an Chambóid"@ga, + "Kambodžos"@lt, + "Kambodžas"@lv, + "il-Kambodja"@mt, + "ir-Renju tal-Kambodja"@mt, + "Regatul Cambodgiei"@ro ; + skos:historyNote "Wikipedia: Succession des „long labels“: „Königreich Kambodscha“ 9.11.1953–8.10.1970; „Khmer-Republik“ 9.10.1970–16.4.1975; „Demokratisches Kampuchea“ 17.4.1975–10.1.1979; „Volksrepublik Kambodscha“ 11.1.1979–23.9.1993; „Königreich Kambodscha“ 24.9.1993–."@de, + "Wikipedia: Democratic Kampuchea was the name of the Khmer Rouge-controlled state that, between 1975 and 1979, ruled the Southeast Asian country of Cambodia."@en, + "Wikipedia: Succession of long labels: ‘Kingdom of Cambodia’ 9.11.1953–8.10.1970; ‘Khmer Republic’ 9.10.1970–16.4.1975; ‘Democratic Kampuchea’ 17.4.1975–10.1.1979; ‘People’s Republic of Kampuchea’ 11.1.1979–23.9.1993; ‘Kingdom of Cambodia’ 24.9.1993–."@en, + "Wikipedia: Succession des «long labels»: «Royaume du Cambodge» 9.11.1953–8.10.1970; «République khmère» 9.10.1970–16.4.1975; «Kampuchéa démocratique» 17.4.1975–10.1.1979; «République populaire du Kampuchéa» 11.1.1979–23.9.1993; «Royaume du Cambodge» 24.9.1993–."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:notation "94"^^euvoc:EP, + "CMB"^^euvoc:FD_010, + "K"^^euvoc:FD_010, + "K"^^euvoc:FD_400, + ".kh"^^euvoc:IANA_DOMAIN, + "KH"^^euvoc:ISG_COU, + "KH"^^euvoc:ISO_3166_1_ALPHA_2, + "KHM"^^euvoc:ISO_3166_1_ALPHA_3, + "116"^^euvoc:ISO_3166_1_NUM, + "KHM"^^euvoc:NAC, + "855"^^euvoc:PHONE_PREFIX, + "KH"^^euvoc:TED, + "KH"^^euvoc:TED_SCHEMA, + "K"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "116"^^euvoc:UNSD_M49 ; + skos:prefLabel "كمبوديا"@ar, + "Камбоджа"@bg, + "Cambodja"@ca, + "Kambodža"@cs, + "Cambodja"@da, + "Kambodscha"@de, + "Καμπότζη"@el, + "Cambodia"@en, + "Camboya"@es, + "Kambodža"@et, + "Kambodža"@fi, + "Cambodge"@fr, + "An Chambóid"@ga, + "Kambodža"@hr, + "Kambodzsa"@hu, + "Kambódía"@is, + "Cambogia"@it, + "カンボジア"@ja, + "Cambodge"@lb, + "Kambodža"@lt, + "Kambodža"@lv, + "Il-Kambodja"@mt, + "Cambodja"@nl, + "Kambodsja"@no, + "Kambodża"@pl, + "Camboja"@pt, + "Cambodgia"@ro, + "Камбоджа"@ru, + "Kambodža"@sk, + "Kambodža"@sl, + "Kambodja"@sv, + "Kamboçya"@tr, + "Камбоджа"@uk, + "柬埔寨"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "KIR" ; + at:deprecated "false" ; + at:op-code "KIR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "KI" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "KIRIBATI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KI" ; + dc:source "TED" ] ; + at:start.use "1979-07-12" ; + atold:op-code "KIR" ; + dc:identifier "KIR" ; + skos:altLabel "جمهورية كيريباتي"@ar, + "Република Кирибати"@bg, + "República de Kiribati"@ca, + "Republika Kiribati"@cs, + "Republikken Kiribati"@da, + "Republik Kiribati"@de, + "Δημοκρατία του Κιριμπάτι"@el, + "Republic of Kiribati"@en, + "República de Kiribati"@es, + "Kiribati Vabariik"@et, + "Kiribatin tasavalta"@fi, + "République de Kiribati"@fr, + "Poblacht Chireabaití"@ga, + "Republika Kiribati"@hr, + "Kiribati Köztársaság"@hu, + "Lýðveldið Kíribatí"@is, + "Repubblica di Kiribati"@it, + "キリバス共和国"@ja, + "Republik Kiribati"@lb, + "Kiribačio Respublika"@lt, + "Kiribati Republika"@lv, + "Ir-Repubblika ta’ Kiribati"@mt, + "Republiek Kiribati"@nl, + "Republikken Kiribati"@no, + "Republika Kiribati"@pl, + "República de Quiribati"@pt, + "Republica Kiribati"@ro, + "Республика Кирибати"@ru, + "Kiribatská republika"@sk, + "Republika Kiribati"@sl, + "Republiken Kiribati"@sv, + "Kiribati Cumhuriyeti"@tr, + "Республіка Кірибаті"@uk, + "基里巴斯共和国"@zh ; + skos:hiddenLabel "Kiribačio"@lt, + "ir-Repubblika ta' Kiribati"@mt, + "Quiribáti"@pt, + "República de Quiribáti"@pt, + "Republliken Kiribati"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "95"^^euvoc:EP, + "KIRIBATI"^^euvoc:FD_010, + ".ki"^^euvoc:IANA_DOMAIN, + "KI"^^euvoc:ISG_COU, + "KI"^^euvoc:ISO_3166_1_ALPHA_2, + "KIR"^^euvoc:ISO_3166_1_ALPHA_3, + "296"^^euvoc:ISO_3166_1_NUM, + "KIR"^^euvoc:NAC, + "686"^^euvoc:PHONE_PREFIX, + "KI"^^euvoc:TED, + "KI"^^euvoc:TED_SCHEMA, + "Micronesia"^^euvoc:UNSD_GEOSCHEME, + "296"^^euvoc:UNSD_M49 ; + skos:prefLabel "كيريباتي"@ar, + "Кирибати"@bg, + "Kiribati"@ca, + "Kiribati"@cs, + "Kiribati"@da, + "Kiribati"@de, + "Κιριμπάτι"@el, + "Kiribati"@en, + "Kiribati"@es, + "Kiribati"@et, + "Kiribati"@fi, + "Kiribati"@fr, + "Cireabaití"@ga, + "Kiribati"@hr, + "Kiribati"@hu, + "Kíribatí"@is, + "Kiribati"@it, + "キリバス"@ja, + "Kiribati"@lb, + "Kiribatis"@lt, + "Kiribati"@lv, + "Kiribati"@mt, + "Kiribati"@nl, + "Kiribati"@no, + "Kiribati"@pl, + "Quiribati"@pt, + "Kiribati"@ro, + "Кирибати"@ru, + "Kiribati"@sk, + "Kiribati"@sl, + "Kiribati"@sv, + "Kiribati"@tr, + "Кірибаті"@uk, + "基里巴斯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "KNA" ; + at:deprecated "false" ; + at:op-code "KNA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "KN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "KN" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SCN" ; + dc:source "EurLex" ] ; + at:start.use "1983-09-19" ; + atold:op-code "KNA" ; + dc:identifier "KNA" ; + skos:altLabel "اتحاد سانت كيتس ونيفس"@ar, + "Федерация Сейнт Китс и Невис"@bg, + "Federació de Saint Kitts i Nevis"@ca, + "Federace Svatý Kryštof a Nevis"@cs, + "Føderationen Saint Kitts og Nevis"@da, + "Föderation St. Kitts und Nevis"@de, + "Ομοσπονδία Αγίου Χριστοφόρου και Νέβις"@el, + "Federation of Saint Kitts and Nevis"@en, + "Federación de San Cristóbal y Nieves"@es, + "Saint Kittsi ja Nevise Föderatsioon"@et, + "Fédération de Saint-Christophe-et-Niévès"@fr, + "Saint-Christophe-et-Nevis"@fr, + "Cónaidhm San Críostóir-Nimheas"@ga, + "Federacija Sveti Kristofor i Nevis"@hr, + "Saint Kitts és Nevis Államszövetség"@hu, + "Ríkjasambandið Sankti Kitts og Nevis"@is, + "Federazione di Saint Christopher e Nevis"@it, + "Saint Christopher e Nevis"@it, + "セントクリストファー・ネイビス連邦"@ja, + "Federatioun Saint Kitts an Nevis"@lb, + "Sent Kitso ir Nevio Federacija"@lt, + "Sentkitsas un Nevisas Federācija"@lv, + "Il-Federazzjoni ta’ Saint Kitts u Nevis"@mt, + "Federatie Saint Kitts en Nevis"@nl, + "Føderasjonen Saint Kitts og Nevis"@no, + "Federacja Saint Kitts i Nevis"@pl, + "Federação de São Cristóvão e Nevis"@pt, + "Federaţia Saint Kitts şi Nevis"@ro, + "Федерация Сент-Китс и Невис"@ru, + "Federácia Svätého Krištofa a Nevisu"@sk, + "Zveza Sveti Krištof in Nevis"@sl, + "Federationen Saint Kitts och Nevis"@sv, + "Saint Kitts ve Nevis Federasyonu"@tr, + "Федерація Сент-Кіттс і Невіс"@uk, + "圣基茨和尼维斯联邦"@zh ; + skos:hiddenLabel "von St. Kitts und Nevis"@de, + "Αγίου Χριστοφόρου και Νέβις"@el, + "Saint Kittsin ja Nevisin federaatio"@fi, + "Saint-Christophe-et-Nevies"@fr, + "de Saint-Kitts-et-Nevis"@fr, + "duine ó Shan Críostóir-Nimheas"@ga, + "Svetog Kristofora i Nevisa"@hr, + "Federazione di Saint Kitts e Nevis"@it, + "Kittsjana; Nevisjana"@mt, + "il-Federazzjoni ta' Saint Kitts u Nevis"@mt, + "Federatie van Saint Kitts en Nevis"@nl, + "Federação de São Cristóvão e Neves"@pt, + "de São Cristóvão e Neves"@pt, + "Federația Saint Kitts și Nevis"@ro, + "Saint Kitts și Nevis"@ro, + "din Saint Kitts și Nevis"@ro, + "Saint Kittsa in Nevisa"@sl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "96"^^euvoc:EP, + "SCN"^^euvoc:FD_010, + ".kn"^^euvoc:IANA_DOMAIN, + "KN"^^euvoc:ISG_COU, + "KN"^^euvoc:ISO_3166_1_ALPHA_2, + "KNA"^^euvoc:ISO_3166_1_ALPHA_3, + "659"^^euvoc:ISO_3166_1_NUM, + "KNA"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "KN"^^euvoc:TED, + "KN"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "659"^^euvoc:UNSD_M49 ; + skos:prefLabel "سانت كيتس ونيفس"@ar, + "Сейнт Китс и Невис"@bg, + "Saint Kitts i Nevis"@ca, + "Svatý Kryštof a Nevis"@cs, + "Saint Kitts og Nevis"@da, + "St. Kitts und Nevis"@de, + "Άγιος Χριστόφορος και Νέβις"@el, + "Saint Kitts and Nevis"@en, + "San Cristóbal y Nieves"@es, + "Saint Kitts ja Nevis"@et, + "Saint Kitts ja Nevis"@fi, + "Saint-Christophe-et-Niévès"@fr, + "San Críostóir-Nimheas"@ga, + "Sveti Kristofor i Nevis"@hr, + "Saint Kitts és Nevis"@hu, + "Sankti Kitts og Nevis"@is, + "Saint Kitts e Nevis"@it, + "セントクリストファー・ネイビス"@ja, + "Saint Kitts an Nevis"@lb, + "Sent Kitsas ir Nevis"@lt, + "Sentkitsa un Nevisa"@lv, + "Saint Kitts u Nevis"@mt, + "Saint Kitts en Nevis"@nl, + "Saint Kitts og Nevis"@no, + "Saint Kitts i Nevis"@pl, + "São Cristóvão e Nevis"@pt, + "Saint Kitts şi Nevis"@ro, + "Сент-Китс и Невис"@ru, + "Svätý Krištof a Nevis"@sk, + "Sveti Krištof in Nevis"@sl, + "Saint Kitts och Nevis"@sv, + "Saint Kitts ve Nevis"@tr, + "Сент-Кітс і Невіс"@uk, + "圣基茨和尼维斯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "KOR" ; + at:deprecated "false" ; + at:op-code "KOR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "KR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "ROK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "ROK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KR" ; + dc:source "TED" ] ; + at:start.use "1948-08-15" ; + atold:op-code "KOR" ; + dc:identifier "KOR" ; + skos:altLabel "جمهورية كوريا"@ar, + "Република Корея"@bg, + "República de Corea"@ca, + "Korejská republika"@cs, + "Republikken Korea"@da, + "Republik Korea"@de, + "Δημοκρατία της Κορέας"@el, + "ROK"@en, + "Republic of Korea"@en, + "República de Corea"@es, + "Korea Vabariik"@et, + "Korean tasavalta"@fi, + "République de Corée"@fr, + "Poblacht na Cóiré"@ga, + "Republika Koreja"@hr, + "Koreai Köztársaság"@hu, + "Lýðveldið Kórea"@is, + "Repubblica di Corea"@it, + "大韓民国"@ja, + "대한민국"@ko, + "Republik Korea"@lb, + "Korėjos Respublika"@lt, + "Korejas Republika"@lv, + "Ir-Repubblika tal-Korea"@mt, + "Republiek Korea"@nl, + "Republikken Korea"@no, + "Republika Korei"@pl, + "República da Coreia"@pt, + "Republica Coreea"@ro, + "Республика Корея"@ru, + "Kórejská republika"@sk, + "Republika Koreja"@sl, + "Republiken Korea"@sv, + "Kore Cumhuriyeti"@tr, + "Республіка Корея"@uk, + "大韩民国"@zh ; + skos:hiddenLabel "Korea, Republik"@de, + "Νότιας Κορέας"@el, + "de la República de Corea"@es, + "korealainen, eteläkorealainen"@fi, + "an Chóiré Theas"@ga, + "duine ón gCóiré Theas"@ga, + "Dienvidkorejas"@lv, + "il-Korea t’Isfel"@mt, + "ir-Repubblika tal-Korea"@mt, + "południowokoreańskie"@pl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "98"^^euvoc:EP, + "ROK"^^euvoc:FD_010, + "KR"^^euvoc:FD_140, + "ROK"^^euvoc:FD_400, + ".kr"^^euvoc:IANA_DOMAIN, + "KR"^^euvoc:ISG_COU, + "KR"^^euvoc:ISO_3166_1_ALPHA_2, + "KOR"^^euvoc:ISO_3166_1_ALPHA_3, + "410"^^euvoc:ISO_3166_1_NUM, + "KOR"^^euvoc:NAC, + "82"^^euvoc:PHONE_PREFIX, + "KR"^^euvoc:TED, + "KR"^^euvoc:TED_SCHEMA, + "ROK"^^euvoc:TIR, + "Eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "410"^^euvoc:UNSD_M49 ; + skos:prefLabel "كوريا الجنوبية"@ar, + "Южна Корея"@bg, + "Corea del Sud"@ca, + "Jižní Korea"@cs, + "Sydkorea"@da, + "Südkorea"@de, + "Νότια Κορέα"@el, + "South Korea"@en, + "Corea del Sur"@es, + "Lõuna-Korea"@et, + "Etelä-Korea"@fi, + "Corée du Sud"@fr, + "An Chóiré Theas"@ga, + "Južna Koreja"@hr, + "Dél-Korea"@hu, + "Suður-Kórea"@is, + "Corea del Sud"@it, + "韓国"@ja, + "Südkorea"@lb, + "Pietų Korėja"@lt, + "Dienvidkoreja"@lv, + "Il-Korea t’Isfel"@mt, + "Zuid-Korea"@nl, + "Sør-Korea"@no, + "Korea Południowa"@pl, + "Coreia do Sul"@pt, + "Coreea de Sud"@ro, + "Южная Корея"@ru, + "Južná Kórea"@sk, + "Južna Koreja"@sl, + "Sydkorea"@sv, + "Güney Kore"@tr, + "Південна Корея"@uk, + "韩国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "KWT" ; + at:deprecated "false" ; + at:op-code "KWT" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "KT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KW" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "KT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KW" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1961-06-19" ; + atold:op-code "KWT" ; + dc:identifier "KWT" ; + skos:altLabel "دولة الكويت"@ar, + "Държавата Кувейт"@bg, + "Estat de Kuwait"@ca, + "Stát Kuvajt"@cs, + "Staten Kuwait"@da, + "Staat Kuwait"@de, + "Κράτος του Κουβέιτ"@el, + "State of Kuwait"@en, + "Estado de Kuwait"@es, + "Kuveidi Riik"@et, + "Kuwaitin valtio"@fi, + "État du Koweït"@fr, + "Stát Chuáit"@ga, + "Država Kuvajt"@hr, + "Kuvait Állam"@hu, + "Kúveitríki"@is, + "クウェート国"@ja, + "Staat Kuwait"@lb, + "Kuveito Valstybė"@lt, + "Kuveitas valsts"@lv, + "L-Istat tal-Kuwajt"@mt, + "Staat Koeweit"@nl, + "Staten Kuwait"@no, + "Państwo Kuwejt"@pl, + "Estado do Koweit"@pt, + "Kuwait"@pt, + "Statul Kuweit"@ro, + "Государство Кувейт"@ru, + "Kuvajtský štát"@sk, + "Država Kuvajt"@sl, + "Staten Kuwait"@sv, + "Kuveyt Devleti"@tr, + "Держава Кувейт"@uk, + "科威特国"@zh ; + skos:hiddenLabel "Stato del Kuwait"@it, + "Kuveito"@lt, + "Kuveitas"@lv, + "Kuwajtija"@mt, + "il-Kuwajt"@mt, + "l-Istat tal-Kuwajt"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "99"^^euvoc:EP, + "KT"^^euvoc:FD_010, + "KT"^^euvoc:FD_400, + ".kw"^^euvoc:IANA_DOMAIN, + "KW"^^euvoc:IBAN_COU, + "KW"^^euvoc:ISG_COU, + "KW"^^euvoc:ISO_3166_1_ALPHA_2, + "KWT"^^euvoc:ISO_3166_1_ALPHA_3, + "414"^^euvoc:ISO_3166_1_NUM, + "KWT"^^euvoc:NAC, + "965"^^euvoc:PHONE_PREFIX, + "KW"^^euvoc:TED, + "KW"^^euvoc:TED_SCHEMA, + "KWT"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "414"^^euvoc:UNSD_M49 ; + skos:prefLabel "الكويت"@ar, + "Кувейт"@bg, + "Kuwait"@ca, + "Kuvajt"@cs, + "Kuwait"@da, + "Kuwait"@de, + "Κουβέιτ"@el, + "Kuwait"@en, + "Kuwait"@es, + "Kuveit"@et, + "Kuwait"@fi, + "Koweït"@fr, + "Cuáit"@ga, + "Kuvajt"@hr, + "Kuvait"@hu, + "Kúveit"@is, + "Kuwait"@it, + "クウェート"@ja, + "Kuwait"@lb, + "Kuveitas"@lt, + "Kuveita"@lv, + "Il-Kuwajt"@mt, + "Koeweit"@nl, + "Kuwait"@no, + "Kuwejt"@pl, + "Koweit"@pt, + "Kuweit"@ro, + "Кувейт"@ru, + "Kuvajt"@sk, + "Kuvajt"@sl, + "Kuwait"@sv, + "Kuveyt"@tr, + "Кувейт"@uk, + "科威特"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "LAO" ; + at:deprecated "false" ; + at:op-code "LAO" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "LAO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "LA" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "LAO" ; + dc:identifier "LAO" ; + skos:altLabel "جمهورية لاو الديمقراطية الشعبية"@ar, + "Лаоска народнодемократична република"@bg, + "República Democràtica Popular Lao"@ca, + "Laoská lidově demokratická republika"@cs, + "Den Demokratiske Folkerepublik Laos"@da, + "Demokratische Volksrepublik Laos"@de, + "Λαϊκή Δημοκρατία του Λάος"@el, + "Lao People’s Democratic Republic"@en, + "República Democrática Popular de Laos"@es, + "Laose Demokraatlik Rahvavabariik"@et, + "Laosin demokraattinen kansantasavalta"@fi, + "République démocratique populaire lao"@fr, + "Daon-Phoblacht Dhaonlathach Laoch"@ga, + "Narodna Demokratska Republika Laos"@hr, + "Laoszi Népi Demokratikus Köztársaság"@hu, + "Laoska alþýðulýðveldið"@is, + "Repubblica democratica popolare del Laos"@it, + "ラオス人民民主共和国"@ja, + "Demokratesch Volleksrepublik Laos"@lb, + "ປະເທດລາວ"@lo, + "Laoso Liaudies Demokratinė Respublika"@lt, + "Laosas Tautas Demokrātiskā Republika"@lv, + "Ir-Repubblika Demokratika tal-Poplu tal-Laos"@mt, + "Democratische Volksrepubliek Laos"@nl, + "Den demokratiske folkerepublikken Laos"@no, + "Laotańska Republika Ludowo-Demokratyczna"@pl, + "República Democrática Popular do Laos"@pt, + "Republica Democrată Populară Laos"@ro, + "Лаосская Народно-Демократическая Республика"@ru, + "Laoská ľudovodemokratická republika"@sk, + "Laoška ljudska demokratična republika"@sl, + "Demokratiska folkrepubliken Laos"@sv, + "Laos Demokratik Halk Cumhuriyeti"@tr, + "Лаоська Народно-Демократична Республіка"@uk, + "老挝人民民主共和国"@zh ; + skos:hiddenLabel "Lao; Laotian"@en, + "lao"@fr, + "Laoska Narodna Demokratska Republika"@hr, + "Laoso"@lt, + "Laosas"@lv, + "il-Laos"@mt, + "laoțiană"@ro, + "Ljudska demokratična republika Laos"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "219"^^euvoc:EP, + "LAO"^^euvoc:FD_010, + ".la"^^euvoc:IANA_DOMAIN, + "LA"^^euvoc:ISG_COU, + "LA"^^euvoc:ISO_3166_1_ALPHA_2, + "LAO"^^euvoc:ISO_3166_1_ALPHA_3, + "418"^^euvoc:ISO_3166_1_NUM, + "LAO"^^euvoc:NAC, + "856"^^euvoc:PHONE_PREFIX, + "LA"^^euvoc:TED, + "LA"^^euvoc:TED_SCHEMA, + "LAO"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "418"^^euvoc:UNSD_M49 ; + skos:prefLabel "لاوس"@ar, + "Лаос"@bg, + "Lao"@ca, + "Laos"@cs, + "Laos"@da, + "Laos"@de, + "Λάος"@el, + "Laos"@en, + "Laos"@es, + "Laos"@et, + "Laos"@fi, + "Laos"@fr, + "Laos"@ga, + "Laos"@hr, + "Laosz"@hu, + "Laos"@is, + "Laos"@it, + "ラオス"@ja, + "Laos"@lb, + "Laosas"@lt, + "Laosa"@lv, + "Il-Laos"@mt, + "Laos"@nl, + "Laos"@no, + "Laos"@pl, + "Laos"@pt, + "Laos"@ro, + "Лаос"@ru, + "Laos"@sk, + "Laos"@sl, + "Laos"@sv, + "Laos"@tr, + "Лаос"@uk, + "老挝"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "LBN" ; + at:deprecated "false" ; + at:op-code "LBN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LB" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "LB" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "LBN" ; + dc:identifier "LBN" ; + skos:altLabel "الجمهورية اللبنانية"@ar, + "Република Ливан"@bg, + "República Libanesa"@ca, + "Libanonská republika"@cs, + "Den Libanesiske Republik"@da, + "Libanesische Republik"@de, + "Δημοκρατία του Λιβάνου"@el, + "Lebanese Republic"@en, + "República Libanesa"@es, + "Liibanoni Vabariik"@et, + "Libanonin tasavalta"@fi, + "République libanaise"@fr, + "Poblacht na Liobáine"@ga, + "Republika Libanonska"@hr, + "Libanoni Köztársaság"@hu, + "Líbanska lýðveldið"@is, + "Repubblica libanese"@it, + "レバノン共和国"@ja, + "Libanesesch Republik"@lb, + "Libano Respublika"@lt, + "Libānas Republika"@lv, + "Ir-Repubblika Libaniża"@mt, + "Republiek Libanon"@nl, + "Republikken Libanon"@no, + "Republika Libańska"@pl, + "República Libanesa"@pt, + "Republica Libaneză"@ro, + "Ливанская Республика"@ru, + "Libanonská republika"@sk, + "Libanonska republika"@sl, + "Republiken Libanon"@sv, + "Lübnan Cumhuriyeti"@tr, + "Ліванська Республіка"@uk, + "黎巴嫩共和国"@zh ; + skos:hiddenLabel "Ливанска република"@bg, + "an Liobáin"@ga, + "Libanonska Republika"@hr, + "Libano"@lt, + "Libānas"@lv, + "il-Libanu"@mt, + "ir-Repubblika Libaniża"@mt, + "Libanese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "241"^^euvoc:EP, + "RL"^^euvoc:FD_010, + "RL"^^euvoc:FD_400, + ".lb"^^euvoc:IANA_DOMAIN, + "LB"^^euvoc:IBAN_COU, + "LB"^^euvoc:ISG_COU, + "LB"^^euvoc:ISO_3166_1_ALPHA_2, + "LBN"^^euvoc:ISO_3166_1_ALPHA_3, + "422"^^euvoc:ISO_3166_1_NUM, + "LBN"^^euvoc:NAC, + "961"^^euvoc:PHONE_PREFIX, + "LB"^^euvoc:TED, + "LB"^^euvoc:TED_SCHEMA, + "RL"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "422"^^euvoc:UNSD_M49 ; + skos:prefLabel "لبنان"@ar, + "Ливан"@bg, + "Líban"@ca, + "Libanon"@cs, + "Libanon"@da, + "Libanon"@de, + "Λίβανος"@el, + "Lebanon"@en, + "Líbano"@es, + "Liibanon"@et, + "Libanon"@fi, + "Liban"@fr, + "An Liobáin"@ga, + "Libanon"@hr, + "Libanon"@hu, + "Líbanon"@is, + "Libano"@it, + "レバノン"@ja, + "Libanon"@lb, + "Libanas"@lt, + "Libāna"@lv, + "Il-Libanu"@mt, + "Libanon"@nl, + "Libanon"@no, + "Liban"@pl, + "Líbano"@pt, + "Liban"@ro, + "Ливан"@ru, + "Libanon"@sk, + "Libanon"@sl, + "Libanon"@sv, + "Lübnan"@tr, + "Ліван"@uk, + "黎巴嫩"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "LBR" ; + at:deprecated "false" ; + at:op-code "LBR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "LR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "LB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "LR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "LB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "LB" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "LBR" ; + dc:identifier "LBR" ; + skos:altLabel "جمهورية ليبيريا"@ar, + "Република Либерия"@bg, + "República de Libèria"@ca, + "Liberijská republika"@cs, + "Republikken Liberia"@da, + "Republik Liberia"@de, + "Δημοκρατία της Λιβερίας"@el, + "Republic of Liberia"@en, + "República de Liberia"@es, + "Libeeria Vabariik"@et, + "Liberian tasavalta"@fi, + "République du Liberia"@fr, + "Poblacht na Libéire"@ga, + "Republika Liberija"@hr, + "Libériai Köztársaság"@hu, + "Lýðveldið Líbería"@is, + "Repubblica di Liberia"@it, + "リベリア共和国"@ja, + "Republik Liberia"@lb, + "Liberijos Respublika"@lt, + "Libērijas Republika"@lv, + "Ir-Repubblika tal-Liberja"@mt, + "Republiek Liberia"@nl, + "Republikken Liberia"@no, + "Republika Liberii"@pl, + "República da Libéria"@pt, + "Republica Liberia"@ro, + "Республика Либерия"@ru, + "Libérijská republika"@sk, + "Republika Liberija"@sl, + "Republiken Liberia"@sv, + "Liberya Cumhuriyeti"@tr, + "Республіка Ліберія"@uk, + "利比里亚共和国"@zh ; + skos:hiddenLabel "λιβερική"@el, + "an Libéir"@ga, + "Liberijos"@lt, + "Libērijas"@lv, + "il-Liberja"@mt, + "ir-Repubblika tal-Liberja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "105"^^euvoc:EP, + "LB"^^euvoc:FD_010, + "LB"^^euvoc:FD_140, + "LR"^^euvoc:FD_140, + "LB"^^euvoc:FD_400, + ".lr"^^euvoc:IANA_DOMAIN, + "LR"^^euvoc:ISG_COU, + "LR"^^euvoc:ISO_3166_1_ALPHA_2, + "LBR"^^euvoc:ISO_3166_1_ALPHA_3, + "430"^^euvoc:ISO_3166_1_NUM, + "LBR"^^euvoc:NAC, + "231"^^euvoc:PHONE_PREFIX, + "LR"^^euvoc:TED, + "LR"^^euvoc:TED_SCHEMA, + "LB"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "430"^^euvoc:UNSD_M49 ; + skos:prefLabel "ليبيريا"@ar, + "Либерия"@bg, + "Libèria"@ca, + "Libérie"@cs, + "Liberia"@da, + "Liberia"@de, + "Λιβερία"@el, + "Liberia"@en, + "Liberia"@es, + "Libeeria"@et, + "Liberia"@fi, + "Liberia"@fr, + "An Libéir"@ga, + "Liberija"@hr, + "Libéria"@hu, + "Líbería"@is, + "Liberia"@it, + "リベリア"@ja, + "Liberia"@lb, + "Liberija"@lt, + "Libērija"@lv, + "Il-Liberja"@mt, + "Liberia"@nl, + "Liberia"@no, + "Liberia"@pl, + "Libéria"@pt, + "Liberia"@ro, + "Либерия"@ru, + "Libéria"@sk, + "Liberija"@sl, + "Liberia"@sv, + "Liberya"@tr, + "Ліберія"@uk, + "利比里亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "LCA" ; + at:deprecated "false" ; + at:op-code "LCA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SAINTE-LUCIE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LC" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "LCA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LC" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1979-02-22" ; + atold:op-code "LCA" ; + dc:identifier "LCA" ; + skos:altLabel "Sainte Lucie"@en, + "Sainte Lucie"@fr ; + skos:hiddenLabel "Αγίας Λουκίας"@el, + "St. Lucia"@en, + "duine ó Saint Lucia"@ga, + "Santa Lucia"@it, + "minn Saint Lucia"@mt, + "santa-luciense"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "102"^^euvoc:EP, + "LCA"^^euvoc:FD_010, + "SAINTE-LUCIE"^^euvoc:FD_400, + ".lc"^^euvoc:IANA_DOMAIN, + "LC"^^euvoc:IBAN_COU, + "LC"^^euvoc:ISG_COU, + "LC"^^euvoc:ISO_3166_1_ALPHA_2, + "LCA"^^euvoc:ISO_3166_1_ALPHA_3, + "662"^^euvoc:ISO_3166_1_NUM, + "LCA"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "LC"^^euvoc:TED, + "LC"^^euvoc:TED_SCHEMA, + "WL"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "662"^^euvoc:UNSD_M49 ; + skos:prefLabel "سانت لوسيا"@ar, + "Сейнт Лусия"@bg, + "Saint Lucia"@ca, + "Svatá Lucie"@cs, + "Saint Lucia"@da, + "St. Lucia"@de, + "Αγία Λουκία"@el, + "Saint Lucia"@en, + "Santa Lucía"@es, + "Saint Lucia"@et, + "Saint Lucia"@fi, + "Sainte-Lucie"@fr, + "Saint Lucia"@ga, + "Sveta Lucija"@hr, + "Saint Lucia"@hu, + "Sankti Lúsía"@is, + "Saint Lucia"@it, + "セントルシア"@ja, + "Saint Lucia"@lb, + "Sent Lusija"@lt, + "Sentlūsija"@lv, + "Saint Lucia"@mt, + "Saint Lucia"@nl, + "Saint Lucia"@no, + "Saint Lucia"@pl, + "Santa Lúcia"@pt, + "Saint Lucia"@ro, + "Сент-Люсия"@ru, + "Svätá Lucia"@sk, + "Sveta Lucija"@sl, + "Saint Lucia"@sv, + "Saint Lucia"@tr, + "Сент-Люсія"@uk, + "圣卢西亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "LIE" ; + at:deprecated "false" ; + at:op-code "LIE" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "LI" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "LIE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LI" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "FL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "FL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "FL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "LI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "LCH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "LI" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "LIE" ; + dc:identifier "LIE" ; + skos:altLabel "إمارة ليختنشتاين"@ar, + "Княства Ліхтэнштэйн"@be, + "Княжество Лихтенщайн"@bg, + "Kneževina Lihtenštajn"@bs, + "Principat de Liechtenstein"@ca, + "Lichtenštejnské knížectví"@cs, + "Fyrstendømmet Liechtenstein"@da, + "Fürstentum Liechtenstein"@de, + "Πριγκηπάτο του Λιχτενστάιν"@el, + "Principality of Liechtenstein"@en, + "Principado de Liechtenstein"@es, + "Liechtensteini Vürstiriik"@et, + "Liechtensteingo Printzerria"@eu, + "Liechtensteinin ruhtinaskunta"@fi, + "Fúrstadømi Liktinstein"@fo, + "Principauté de Liechtenstein"@fr, + "Prionsacht Lichtinstéin"@ga, + "Principado do Liechtenstein"@gl, + "Kneževina Lihtenštajn"@hr, + "Liechtensteini Hercegség"@hu, + "Furstadæmið Liechtenstein"@is, + "Principato del Liechtenstein"@it, + "リヒテンシュタイン公国"@ja, + "Fürstentum Liechtenstein"@lb, + "Lichtenšteino Kunigaikštystė"@lt, + "Lihtenšteinas Firstisti"@lv, + "Кнежевство Лихтенштајн"@mk, + "Il-Prinċipat tal-Liechtenstein"@mt, + "Vorstendom Liechtenstein"@nl, + "Fyrstedømmet Liechtenstein"@no, + "Księstwo Liechtenstein"@pl, + "Principado do Liechtenstein"@pt, + "Principadi da Liechtenstein"@rm, + "Principatul Liechtenstein"@ro, + "Княжество Лихтенштейн"@ru, + "Lichtenštajnské kniežatstvo"@sk, + "Kneževina Líhtenštajn"@sl, + "Principata e Lihtenshtajnit"@sq, + "Кнежевина Лихтенштајн"@sr, + "Furstendömet Liechtenstein"@sv, + "Lihtenştayn Prensliği"@tr, + "Князівство Ліхтенштейн"@uk, + "列支敦士登公国"@zh ; + skos:hiddenLabel "Πριγκιπάτο του Λιχτενστάιν"@el, + "Lichtenšteino"@lt, + "Lihtenšteinas"@lv, + "Lihtenšteinas Firstiste"@lv, + "il-Liechtenstein"@mt, + "il-il-Prinċipat tal-Liechtenstein"@mt, + "Księstwo Liechtensteinu"@pl, + "liechtensteińskie"@pl, + "Listenstaine"@pt, + "Principado do Listenstaine"@pt, + "Lichtenštajsko"@sk, + "Kneževina Lihtenštajn"@sl, + "Lihtenštajn"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "103"^^euvoc:EP, + "FL"^^euvoc:FD_010, + "LCH"^^euvoc:FD_050, + "FL"^^euvoc:FD_140, + "LI"^^euvoc:FD_140, + "FL"^^euvoc:FD_160, + "LI"^^euvoc:FD_160, + "LIE"^^euvoc:FD_400, + ".li"^^euvoc:IANA_DOMAIN, + "LI"^^euvoc:IBAN_COU, + "LI"^^euvoc:ISG_COU, + "LI"^^euvoc:ISO_3166_1_ALPHA_2, + "LIE"^^euvoc:ISO_3166_1_ALPHA_3, + "438"^^euvoc:ISO_3166_1_NUM, + "LIE"^^euvoc:NAC, + "423"^^euvoc:PHONE_PREFIX, + "LI"^^euvoc:TED, + "LI"^^euvoc:TED_SCHEMA, + "FL"^^euvoc:TIR, + "Western Europe"^^euvoc:UNSD_GEOSCHEME, + "438"^^euvoc:UNSD_M49 ; + skos:prefLabel "ليختنشتاين"@ar, + "Ліхтэнштэйн"@be, + "Лихтенщайн"@bg, + "Lihtenštajn"@bs, + "Liechtenstein"@ca, + "Lichtenštejnsko"@cs, + "Liechtenstein"@da, + "Liechtenstein"@de, + "Λιχτενστάιν"@el, + "Liechtenstein"@en, + "Liechtenstein"@es, + "Liechtenstein"@et, + "Liechtenstein"@eu, + "Liechtenstein"@fi, + "Liktinstein"@fo, + "Liechtenstein"@fr, + "Lichtinstéin"@ga, + "Liechtenstein"@gl, + "Lihtenštajn"@hr, + "Liechtenstein"@hu, + "Liechtenstein"@is, + "Liechtenstein"@it, + "リヒテンシュタイン"@ja, + "Liechtenstein"@lb, + "Lichtenšteinas"@lt, + "Lihtenšteina"@lv, + "Лихтенштајн"@mk, + "Il-Liechtenstein"@mt, + "Liechtenstein"@nl, + "Liechtenstein"@no, + "Liechtenstein"@pl, + "Liechtenstein"@pt, + "Liechtenstein"@rm, + "Liechtenstein"@ro, + "Лихтенштейн"@ru, + "Lichtenštajnsko"@sk, + "Líhtenštajn"@sl, + "Lihtenshtajni"@sq, + "Лихтенштајн"@sr, + "Liechtenstein"@sv, + "Lihtenştayn"@tr, + "Ліхтенштейн"@uk, + "列支敦士登"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "LKA" ; + at:deprecated "false" ; + at:op-code "LKA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "CL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LK" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "LK" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CL" ; + dc:source "EurLex" ] ; + at:start.use "1972-05-22" ; + atold:op-code "LKA" ; + dc:identifier "LKA" ; + skos:altLabel "جمهورية سري لانكا الاشتراكية الديمقراطية"@ar, + "Демократична социалистическа република Шри Ланка"@bg, + "República Socialista Democràtica de Sri Lanka"@ca, + "Šrílanská demokratická socialistická republika"@cs, + "Den Demokratiske Socialistiske Republik Sri Lanka"@da, + "Demokratische Sozialistische Republik Sri Lanka"@de, + "Λαϊκή Σοσιαλιστική Δημοκρατία της Σρι Λάνκα"@el, + "Democratic Socialist Republic of Sri Lanka"@en, + "República Socialista Democrática de Sri Lanka"@es, + "Sri Lanka Demokraatlik Sotsialistlik Vabariik"@et, + "Sri Lankan demokraattinen sosialistinen tasavalta"@fi, + "République socialiste démocratique de Sri Lanka"@fr, + "Poblacht Dhaonlathach Shóisialach Shrí Lanca"@ga, + "Demokratska Socijalistička Republika Šri Lanka"@hr, + "Srí Lanka Demokratikus Szocialista Köztársaság"@hu, + "Sósíalíska lýðstjórnarlýðveldið Srí Lanka"@is, + "Repubblica democratica socialista di Sri Lanka"@it, + "スリランカ民主社会主義共和国"@ja, + "Demokratesch Sozialistesch Republik Sri Lanka"@lb, + "Šri Lankos Demokratinė Socialistinė Respublika"@lt, + "Šrilankas Demokrātiskā Sociālistiskā Republika"@lv, + "Ir-Repubblika Demokratika Soċjalista tas-Sri Lanka"@mt, + "Democratische Socialistische Republiek Sri Lanka"@nl, + "Den demokratisk sosialistiske republikken Sri Lanka"@no, + "Demokratyczno-Socjalistyczna Republika Sri Lanki"@pl, + "República Democrática Socialista do Seri Lanca"@pt, + "Republica Democratică Socialistă Sri Lanka"@ro, + "Демократическая Социалистическая Республика Шри-Ланка"@ru, + "ශ්‍රී ලංකාව"@si, + "Srílanská demokratická socialistická republika"@sk, + "Demokratična socialistična republika Šrilanka"@sl, + "Demokratiska socialistiska republiken Sri Lanka"@sv, + "இலங்கை"@ta, + "Sri Lanka Demokratik Sosyalist Cumhuriyeti"@tr, + "Демократична Соціалістична Республіка Шрі-Ланка"@uk, + "斯里兰卡民主社会主义共和国"@zh ; + skos:hiddenLabel "esrilanquesa"@es, + "di Sri Lanka"@it, + "Šri Lankos"@lt, + "Šrilankas"@lv, + "ir-Repubblika Demokratika Soċjalista tas-Sri Lanka"@mt, + "is-Sri Lanka"@mt, + "Sri Lankaanse"@nl, + "República Democrática Socialista do Sri Lanca"@pt, + "Sri Lanca"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "104"^^euvoc:EP, + "CL"^^euvoc:FD_010, + "CL"^^euvoc:FD_400, + ".lk"^^euvoc:IANA_DOMAIN, + "LK"^^euvoc:ISG_COU, + "LK"^^euvoc:ISO_3166_1_ALPHA_2, + "LKA"^^euvoc:ISO_3166_1_ALPHA_3, + "144"^^euvoc:ISO_3166_1_NUM, + "LKA"^^euvoc:NAC, + "94"^^euvoc:PHONE_PREFIX, + "LK"^^euvoc:TED, + "LK"^^euvoc:TED_SCHEMA, + "CL"^^euvoc:TIR, + "Southern Asia"^^euvoc:UNSD_GEOSCHEME, + "144"^^euvoc:UNSD_M49 ; + skos:prefLabel "سري لانكا"@ar, + "Шри Ланка"@bg, + "Sri Lanka"@ca, + "Šrí Lanka"@cs, + "Sri Lanka"@da, + "Sri Lanka"@de, + "Σρι Λάνκα"@el, + "Sri Lanka"@en, + "Sri Lanka"@es, + "Sri Lanka"@et, + "Sri Lanka"@fi, + "Sri Lanka"@fr, + "Srí Lanca"@ga, + "Šri Lanka"@hr, + "Srí Lanka"@hu, + "Srí Lanka"@is, + "Sri Lanka"@it, + "スリランカ"@ja, + "Sri Lanka"@lb, + "Šri Lanka"@lt, + "Šrilanka"@lv, + "Is-Sri Lanka"@mt, + "Sri Lanka"@nl, + "Sri Lanka"@no, + "Sri Lanka"@pl, + "Seri Lanca"@pt, + "Sri Lanka"@ro, + "Шри-Ланка"@ru, + "Srí Lanka"@sk, + "Šrilanka"@sl, + "Sri Lanka"@sv, + "Sri Lanka"@tr, + "Шрі Ланка"@uk, + "斯里兰卡"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "LSO" ; + at:deprecated "false" ; + at:op-code "LSO" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "LS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LS" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "LS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LS" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1966-10-04" ; + atold:op-code "LSO" ; + dc:identifier "LSO" ; + skos:altLabel "مملكة ليسوتو"@ar, + "Кралство Лесото"@bg, + "Regne de Lesotho"@ca, + "Království Lesotho"@cs, + "Kongeriget Lesotho"@da, + "Königreich Lesotho"@de, + "Βασίλειο του Λεσότο"@el, + "Kingdom of Lesotho"@en, + "Reino de Lesoto"@es, + "Lesotho Kuningriik"@et, + "Lesothon kuningaskunta"@fi, + "Royaume du Lesotho"@fr, + "Ríocht Leosóta"@ga, + "Kraljevina Lesoto"@hr, + "Lesothói Királyság"@hu, + "Konungsríkið Lesótó"@is, + "Regno di Lesotho"@it, + "レソト王国"@ja, + "Kinnekräich Lesotho"@lb, + "Lesoto Karalystė"@lt, + "Lesoto Karaliste"@lv, + "Ir-Renju tal-Lesoto"@mt, + "Koninkrijk Lesotho"@nl, + "Kongeriket Lesotho"@no, + "Królestwo Lesotho"@pl, + "Reino do Lesoto"@pt, + "Regatul Lesotho"@ro, + "Королевство Лесото"@ru, + "Lesothské kráľovstvo"@sk, + "Kraljevina Lesoto"@sl, + "Lesotho"@st, + "Konungariket Lesotho"@sv, + "Lesotho Krallığı"@tr, + "Королівство Лесото"@uk, + "莱索托王国"@zh ; + skos:hiddenLabel "Λεσόθο"@el, + "lesothanne"@fr, + "Lesoto"@lt, + "il-Lesoto"@mt, + "ir-Renju tal-Lesoto"@mt, + "lesotyjskie"@pl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "106"^^euvoc:EP, + "LS"^^euvoc:FD_010, + "LS"^^euvoc:FD_400, + ".ls"^^euvoc:IANA_DOMAIN, + "LS"^^euvoc:ISG_COU, + "LS"^^euvoc:ISO_3166_1_ALPHA_2, + "LSO"^^euvoc:ISO_3166_1_ALPHA_3, + "426"^^euvoc:ISO_3166_1_NUM, + "LSO"^^euvoc:NAC, + "266"^^euvoc:PHONE_PREFIX, + "LS"^^euvoc:TED, + "LS"^^euvoc:TED_SCHEMA, + "LS"^^euvoc:TIR, + "Southern Africa"^^euvoc:UNSD_GEOSCHEME, + "426"^^euvoc:UNSD_M49 ; + skos:prefLabel "ليسوتو"@ar, + "Лесото"@bg, + "Lesotho"@ca, + "Lesotho"@cs, + "Lesotho"@da, + "Lesotho"@de, + "Λεσότο"@el, + "Lesotho"@en, + "Lesoto"@es, + "Lesotho"@et, + "Lesotho"@fi, + "Lesotho"@fr, + "Leosóta"@ga, + "Lesoto"@hr, + "Lesotho"@hu, + "Lesótó"@is, + "Lesotho"@it, + "レソト"@ja, + "Lesotho"@lb, + "Lesotas"@lt, + "Lesoto"@lv, + "Il-Lesoto"@mt, + "Lesotho"@nl, + "Lesoto"@no, + "Lesotho"@pl, + "Lesoto"@pt, + "Lesotho"@ro, + "Лесото"@ru, + "Lesotho"@sk, + "Lesoto"@sl, + "Lesotho"@sv, + "Lesotho"@tr, + "Лесото"@uk, + "莱索托"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MAF" ; + at:deprecated "false" ; + at:op-code "MAF" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MF" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "MF" ; + dc:source "TED" ] ; + at:start.use "2007-07-15" ; + atold:op-code "MAF" ; + dc:identifier "MAF" ; + skos:altLabel "التجمع الإقليمي لسانت مارتن"@ar, + "Общност Сен Мартен"@bg, + "Col·lectivitat de Saint-Martin"@ca, + "Společenství Svatý Martin"@cs, + "Det Oversøiske Område Saint-Martin"@da, + "Körperschaft St. Martin"@de, + "Κοινότητα του Αγίου Μαρτίνου"@el, + "Collectivity of Saint Martin"@en, + "Colectividad de San Martín"@es, + "Saint-Martini ühendus"@et, + "Saint-Martinin yhteisö"@fi, + "Collectivité de Saint-Martin"@fr, + "Comhroinn Saint-Martin"@ga, + "Zajednica Sveti Martin"@hr, + "Saint-Martin térségi önkormányzat"@hu, + "Collettività di Saint-Martin"@it, + "サンピエール・ミクロン海外準県"@ja, + "Kierperschaft Saint-Martin"@lb, + "Sen Marteno Bendrija"@lt, + "Senmartēnas Kopiena"@lv, + "Il-Kollettività ta’ Saint Martin"@mt, + "Gemeenschap Saint-Martin"@nl, + "Saint-Martin"@no, + "Zbiorowość Saint-Martin"@pl, + "Colectividade de São Martinho"@pt, + "Colectivitatea Saint-Martin"@ro, + "Сообщество Сен-Мартен"@ru, + "Spoločenstvo Saint Martin"@sk, + "Skupnost Francoski Sveti Martin"@sl, + "Förvaltningsområdet Saint-Martin"@sv, + "Saint Martin Kolektivitesi"@tr, + "Спільнота Сен-Мартен"@uk, + "圣马丁集体"@zh ; + skos:broader ; + skos:changeNote "Wikipedia: On 22 February 2007, Saint Barthélemy and Saint Martin were broken away from the French overseas department of Guadeloupe to be formed into two new overseas collectivities. As a consequence their status was unclear for a time. While a report issued by the French parliament suggested that both islands would probably have to change from being outermost regions OMR status to overseas countries and territories OCT status, the EU Treaties as amended by the Treaty of Lisbon lists them as outermost regions see articles 349 and 355 of the consolidated version of the Treaty on the Functioning of the European Union."@en ; + skos:hiddenLabel "Άγιος Μαρτίνος (γαλλικό τμήμα)"@el, + "Αγίου Μαρτίνου (γαλλικό τμήμα)"@el, + "Saint Martin (French part)"@en, + "Saint-Martin"@en, + "Saint-Martini"@et, + "ranskalainen, saintmartinilainen"@fi, + "Saint Martin (partie française)"@fr, + "française"@fr, + "duine ó Saint-Martin"@ga, + "Saint-Martin Közösség"@hu, + "Sen Marteno"@lt, + "il-Kolletività ta' Saint Martin"@mt, + "minn Saint Martin"@mt, + "Wspólnota Saint-Martin (część francuska)"@pl, + "Coletividade de São Martinho (Saint-Martin)"@pt, + "São Martinho (Saint-Martin)"@pt, + "Svätý Martin"@sk, + "Svätý Martin (francúzska časť)"@sk, + "Saint-Martin (francoski del)"@sl, + "Saint-Martina"@sl ; + skos:historyNote """ +Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."""@en, + "ISO 3166-1 Newsletter VI-8 of 15.12.2010: ‘The island of Saint-Martin is divided into the French northern part and the Dutch southern part.’"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "287"^^euvoc:EP, + ".mf"^^euvoc:IANA_DOMAIN, + "MF"^^euvoc:ISG_COU, + "MF"^^euvoc:ISO_3166_1_ALPHA_2, + "MAF"^^euvoc:ISO_3166_1_ALPHA_3, + "663"^^euvoc:ISO_3166_1_NUM, + "MAF"^^euvoc:NAC, + "MF"^^euvoc:TED, + "MF"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "663"^^euvoc:UNSD_M49 ; + skos:prefLabel "سانت مارتن"@ar, + "Сен Мартен"@bg, + "Saint-Martin"@ca, + "Svatý Martin"@cs, + "Saint-Martin"@da, + "St. Martin"@de, + "Άγιος Μαρτίνος"@el, + "Saint Martin"@en, + "San Martín"@es, + "Saint-Martin"@et, + "Saint-Martin"@fi, + "Saint-Martin"@fr, + "Saint-Martin"@ga, + "Sveti Martin"@hr, + "Saint-Martin"@hu, + "Sankti Martin"@is, + "Saint-Martin"@it, + "サン・マルタン"@ja, + "Saint-Martin"@lb, + "Sen Martenas"@lt, + "Senmartēna"@lv, + "Saint Martin"@mt, + "Saint-Martin"@nl, + "Saint Martin"@no, + "Saint-Martin"@pl, + "São Martinho"@pt, + "Saint-Martin"@ro, + "Сен-Мартен"@ru, + "Saint Martin"@sk, + "Francoski Sveti Martin"@sl, + "Saint-Martin"@sv, + "Saint Martin"@tr, + "Сен-Мартен"@uk, + "圣马丁"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "MAR" ; + at:deprecated "false" ; + at:op-code "MAR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MA" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "MA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "MA" ; + dc:source "EurLex" ] ; + at:start.use "1956-03-02" ; + atold:op-code "MAR" ; + dc:identifier "MAR" ; + skos:altLabel "مملكة المغرب"@ar, + "Кралство Мароко"@bg, + "Regne del Marroc"@ca, + "Marocké království"@cs, + "Kongeriget Marokko"@da, + "Königreich Marokko"@de, + "Βασίλειο του Μαρόκου"@el, + "Kingdom of Morocco"@en, + "Reino de Marruecos"@es, + "Maroko Kuningriik"@et, + "Marokon kuningaskunta"@fi, + "Royaume du Maroc"@fr, + "Ríocht Mharacó"@ga, + "Kraljevina Maroko"@hr, + "Marokkói Királyság"@hu, + "Konungsríkið Marokkó"@is, + "Regno del Marocco"@it, + "モロッコ王国"@ja, + "Kinnekräich Marokko"@lb, + "Maroko Karalystė"@lt, + "Marokas Karaliste"@lv, + "Ir-Renju tal-Marokk"@mt, + "Koninkrijk Marokko"@nl, + "Kongeriket Marokko"@no, + "Królestwo Marokańskie"@pl, + "Reino de Marrocos"@pt, + "Regatul Maroc"@ro, + "Королевство Марокко"@ru, + "Marocké kráľovstvo"@sk, + "Kraljevina Maroko"@sl, + "Konungariket Marocko"@sv, + "Fas Krallığı"@tr, + "Королівство Марокко"@uk, + "摩洛哥王国"@zh ; + skos:hiddenLabel "Maroko"@lt, + "Marokas"@lv, + "il-Marokk"@mt, + "ir-Renju tal-Marokk"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "110"^^euvoc:EP, + "MA"^^euvoc:FD_010, + "MA"^^euvoc:FD_140, + "MA"^^euvoc:FD_400, + ".ma"^^euvoc:IANA_DOMAIN, + "MA"^^euvoc:ISG_COU, + "MA"^^euvoc:ISO_3166_1_ALPHA_2, + "MAR"^^euvoc:ISO_3166_1_ALPHA_3, + "504"^^euvoc:ISO_3166_1_NUM, + "MAR"^^euvoc:NAC, + "212"^^euvoc:PHONE_PREFIX, + "MA"^^euvoc:TED, + "MA"^^euvoc:TED_SCHEMA, + "MAL"^^euvoc:TIR, + "Northern Africa"^^euvoc:UNSD_GEOSCHEME, + "504"^^euvoc:UNSD_M49 ; + skos:prefLabel "المغرب"@ar, + "Мароко"@bg, + "Marroc, el"@ca, + "Maroko"@cs, + "Marokko"@da, + "Marokko"@de, + "Μαρόκο"@el, + "Morocco"@en, + "Marruecos"@es, + "Maroko"@et, + "Marokko"@fi, + "Maroc"@fr, + "Maracó"@ga, + "Maroko"@hr, + "Marokkó"@hu, + "Marokkó"@is, + "Marocco"@it, + "モロッコ"@ja, + "Marokko"@lb, + "Marokas"@lt, + "Maroka"@lv, + "Il-Marokk"@mt, + "Marokko"@nl, + "Marokko"@no, + "Maroko"@pl, + "Marrocos"@pt, + "Maroc"@ro, + "Марокко"@ru, + "Maroko"@sk, + "Maroko"@sl, + "Marocko"@sv, + "Fas"@tr, + "Марокко"@uk, + "摩洛哥"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MCO" ; + at:deprecated "false" ; + at:op-code "MCO" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MC" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MC" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MC" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "MCO" ; + dc:identifier "MCO" ; + skos:altLabel "إمارة موناكو"@ar, + "Княства Манака"@be, + "Княжество Монако"@bg, + "Kneževina Monako"@bs, + "Principat de Mònaco"@ca, + "Monacké knížectví"@cs, + "Fyrstendømmet Monaco"@da, + "Fürstentum Monaco"@de, + "Πριγκηπάτο του Μονακό"@el, + "Principality of Monaco"@en, + "Principado de Mónaco"@es, + "Monaco Vürstiriik"@et, + "Monakoko Printzerria"@eu, + "Monacon ruhtinaskunta"@fi, + "Fúrstadømi Monako"@fo, + "Principauté de Monaco"@fr, + "Prionsacht Mhonacó"@ga, + "Principado de Mónaco"@gl, + "Kneževina Monako"@hr, + "Monacói Hercegség"@hu, + "Furstadæmið Mónakó"@is, + "Principato di Monaco"@it, + "モナコ公国"@ja, + "Fürstentum Monaco"@lb, + "Monako Kunigaikštystė"@lt, + "Monako Firstiste"@lv, + "Кнежевство Монако"@mk, + "Il-Prinċipat ta’ Monaco"@mt, + "Prinsdom Monaco"@nl, + "Fyrstedømmet Monaco"@no, + "Księstwo Monako"@pl, + "Principado de Mónaco"@pt, + "Principadi dal Monaco"@rm, + "Principatul Monaco"@ro, + "Княжество Монако"@ru, + "Monacké kniežatstvo"@sk, + "Kneževína Monáko"@sl, + "Principata e Monakos"@sq, + "Кнежевина Монако"@sr, + "Furstendömet Monaco"@sv, + "Monako Prensliği"@tr, + "Князівство Монако"@uk, + "摩纳哥公国"@zh ; + skos:hiddenLabel "Πριγκιπάτο του Μονακό"@el, + "monegaško"@hr, + "Monako"@lt, + "il-Prinċipat ta' Monaco"@mt, + "Vorstendom Monaco"@nl, + "Principado do Mónaco"@pt, + "Kneževina Monako"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "111"^^euvoc:EP, + "MC"^^euvoc:FD_010, + ".mc"^^euvoc:IANA_DOMAIN, + "MC"^^euvoc:IBAN_COU, + "MC"^^euvoc:ISG_COU, + "MC"^^euvoc:ISO_3166_1_ALPHA_2, + "MCO"^^euvoc:ISO_3166_1_ALPHA_3, + "492"^^euvoc:ISO_3166_1_NUM, + "MCO"^^euvoc:NAC, + "377"^^euvoc:PHONE_PREFIX, + "MC"^^euvoc:TED, + "MC"^^euvoc:TED_SCHEMA, + "MC"^^euvoc:TIR, + "Western Europe"^^euvoc:UNSD_GEOSCHEME, + "492"^^euvoc:UNSD_M49 ; + skos:prefLabel "موناكو"@ar, + "Манака"@be, + "Монако"@bg, + "Monako"@bs, + "Mònaco"@ca, + "Monako"@cs, + "Monaco"@da, + "Monaco"@de, + "Μονακό"@el, + "Monaco"@en, + "Mónaco"@es, + "Monaco"@et, + "Monako"@eu, + "Monaco"@fi, + "Monako"@fo, + "Monaco"@fr, + "Monacó"@ga, + "Mónaco"@gl, + "Monako"@hr, + "Monaco"@hu, + "Mónakó"@is, + "Monaco"@it, + "モナコ"@ja, + "Monaco"@lb, + "Monakas"@lt, + "Monako"@lv, + "Монако"@mk, + "Monaco"@mt, + "Monaco"@nl, + "Monaco"@no, + "Monako"@pl, + "Mónaco"@pt, + "Monaco"@rm, + "Monaco"@ro, + "Монако"@ru, + "Monako"@sk, + "Monako"@sl, + "Monako"@sq, + "Монако"@sr, + "Monaco"@sv, + "Monako"@tr, + "Монако"@uk, + "摩纳哥"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MDA" ; + at:deprecated "false" ; + at:op-code "MDA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MOL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MD" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "MD" ; + dc:source "TED" ] ; + at:start.use "1991-08-27" ; + atold:op-code "MDA" ; + dc:identifier "MDA" ; + skos:altLabel "جمهورية مولدوفا"@ar, + "Рэспу́бліка Малдова"@be, + "Република Молдова"@bg, + "Republika Moldavija"@bs, + "República de Moldàvia"@ca, + "Moldavská republika"@cs, + "Republikken Moldova"@da, + "Moldawien"@de, + "Republik Moldau"@de, + "Δημοκρατία της Μολδαβίας"@el, + "Republic of Moldova"@en, + "República de Moldavia"@es, + "Moldova Vabariik"@et, + "Moldaviako Errepublika"@eu, + "Moldovan tasavalta"@fi, + "Lýðveldið Moldova"@fo, + "République de Moldavie"@fr, + "Poblacht na Moldóive"@ga, + "República Moldova"@gl, + "Republika Moldova"@hr, + "Moldovai Köztársaság"@hu, + "Lýðveldið Moldóva"@is, + "Repubblica di Moldova"@it, + "モルドバ共和国"@ja, + "Republik Moldavien"@lb, + "Moldovos Respublika"@lt, + "Moldovas republika"@lv, + "Република Молдавија"@mk, + "Ir-Repubblika tal-Moldova"@mt, + "Republiek Moldavië"@nl, + "Republikken Moldova"@no, + "Republika Mołdawii"@pl, + "República da Moldávia"@pt, + "Republica da la Moldova"@rm, + "Republica Moldova"@ro, + "Республика Молдова"@ru, + "Moldavská republika"@sk, + "Republika Moldavija"@sl, + "Republika e Moldavisë"@sq, + "Република Молдавија"@sr, + "Republiken Moldavien"@sv, + "Moldova Cumhuriyeti"@tr, + "Республіка Молдова"@uk, + "摩尔多瓦共和国"@zh ; + skos:changeNote "A strip of Moldova’s internationally recognized territory on the east bank of the river Dniester has been under the de facto control of the breakaway government of Transnistria since 1990."@en ; + skos:hiddenLabel "Μολδαβίας"@el, + "an Mholdóiv"@ga, + "Moldavija"@hr, + "Moldova"@it, + "Moldova"@lt, + "Moldovos"@lt, + "Moldovas"@lv, + "il-Moldova"@mt, + "ir-Repubblika tal-Moldova"@mt, + "moldavijsko"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "112"^^euvoc:EP, + "MOL"^^euvoc:FD_010, + ".md"^^euvoc:IANA_DOMAIN, + "MD"^^euvoc:IBAN_COU, + "MD"^^euvoc:ISG_COU, + "MD"^^euvoc:ISO_3166_1_ALPHA_2, + "MDA"^^euvoc:ISO_3166_1_ALPHA_3, + "498"^^euvoc:ISO_3166_1_NUM, + "MDA"^^euvoc:NAC, + "373"^^euvoc:PHONE_PREFIX, + "MD"^^euvoc:TED, + "MD"^^euvoc:TED_SCHEMA, + "MD"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "498"^^euvoc:UNSD_M49 ; + skos:prefLabel "مولدوفا"@ar, + "Малдова"@be, + "Молдова"@bg, + "Moldavija"@bs, + "Moldàvia"@ca, + "Moldavsko"@cs, + "Moldova"@da, + "Moldau"@de, + "Μολδαβία"@el, + "Moldova"@en, + "Moldavia"@es, + "Moldova"@et, + "Moldavia"@eu, + "Moldova"@fi, + "Moldova"@fo, + "Moldavie"@fr, + "An Mholdóiv"@ga, + "Moldova"@gl, + "Moldova"@hr, + "Moldova"@hu, + "Moldóva"@is, + "Moldavia"@it, + "モルドバ"@ja, + "Moldavien"@lb, + "Moldavija"@lt, + "Moldova"@lv, + "Молдавија"@mk, + "Il-Moldova"@mt, + "Moldavië"@nl, + "Moldova"@no, + "Mołdawia"@pl, + "Moldávia"@pt, + "Moldova"@rm, + "Moldova"@ro, + "Молдова"@ru, + "Moldavsko"@sk, + "Moldavija"@sl, + "Moldavia"@sq, + "Молдавија"@sr, + "Moldavien"@sv, + "Moldova"@tr, + "Молдова"@uk, + "摩尔多瓦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MDG" ; + at:deprecated "false" ; + at:op-code "MDG" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "MG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "RM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MG" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RM" ; + dc:source "EurLex" ] ; + at:start.use "1960-06-26" ; + atold:op-code "MDG" ; + dc:identifier "MDG" ; + skos:altLabel "جمهورية مدغشقر"@ar, + "Република Мадагаскар"@bg, + "República de Madagascar"@ca, + "Madagaskarská republika"@cs, + "Republikken Madagaskar"@da, + "Republik Madagaskar"@de, + "Δημοκρατία της Μαδαγασκάρης"@el, + "Republic of Madagascar"@en, + "República de Madagascar"@es, + "Madagaskari Vabariik"@et, + "Madagaskarin tasavalta"@fi, + "République de Madagascar"@fr, + "Poblacht Mhadagascar"@ga, + "Republika Madagaskar"@hr, + "Madagaszkári Köztársaság"@hu, + "Lýðveldið Madagaskar"@is, + "Repubblica del Madagascar"@it, + "マダガスカル共和国"@ja, + "Republik Madagaskar"@lb, + "Madagaskaro Respublika"@lt, + "Madagaskaras Republika"@lv, + "Madagasikara"@mg, + "Ir-Repubblika ta’ Madagascar"@mt, + "Republiek Madagaskar"@nl, + "Republikken Madagaskar"@no, + "Republika Madagaskaru"@pl, + "República de Madagáscar"@pt, + "Republica Madagascar"@ro, + "Республика Мадагаскар"@ru, + "Madagaskarská republika"@sk, + "Republika Madagaskar"@sl, + "Republiken Madagaskar"@sv, + "Madagaskar Cumhuriyeti"@tr, + "Республіка Мадагаскар"@uk, + "马达加斯加共和国"@zh ; + skos:hiddenLabel "Μαδαγασκάρης"@el, + "Madagaskaro"@lt, + "Madagaskaras"@lv, + "il-Madagascar"@mt, + "ir-Repubblika ta' Madagascar"@mt, + "malgașă"@ro, + "Demokratična republika Madagaskar"@sl, + "Republliken Madagaskar"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "113"^^euvoc:EP, + "RM"^^euvoc:FD_010, + "MG"^^euvoc:FD_140, + "RM"^^euvoc:FD_140, + "RM"^^euvoc:FD_400, + ".mg"^^euvoc:IANA_DOMAIN, + "MG"^^euvoc:ISG_COU, + "MG"^^euvoc:ISO_3166_1_ALPHA_2, + "MDG"^^euvoc:ISO_3166_1_ALPHA_3, + "450"^^euvoc:ISO_3166_1_NUM, + "MDG"^^euvoc:NAC, + "261"^^euvoc:PHONE_PREFIX, + "MG"^^euvoc:TED, + "MG"^^euvoc:TED_SCHEMA, + "RM"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "450"^^euvoc:UNSD_M49 ; + skos:prefLabel "ماداغشقر"@ar, + "Мадагаскар"@bg, + "Madagascar"@ca, + "Madagaskar"@cs, + "Madagaskar"@da, + "Madagaskar"@de, + "Μαδαγασκάρη"@el, + "Madagascar"@en, + "Madagascar"@es, + "Madagaskar"@et, + "Madagaskar"@fi, + "Madagascar"@fr, + "Madagascar"@ga, + "Madagaskar"@hr, + "Madagaszkár"@hu, + "Madagaskar"@is, + "Madagascar"@it, + "マダガスカル"@ja, + "Madagaskar"@lb, + "Madagaskaras"@lt, + "Madagaskara"@lv, + "Madagascar"@mt, + "Madagaskar"@nl, + "Madagaskar"@no, + "Madagaskar"@pl, + "Madagáscar"@pt, + "Madagascar"@ro, + "Мадагаскар"@ru, + "Madagaskar"@sk, + "Madagaskar"@sl, + "Madagaskar"@sv, + "Madagaskar"@tr, + "Мадагаскар"@uk, + "马达加斯加"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MDV" ; + at:deprecated "false" ; + at:op-code "MDV" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MD" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MV" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "MD" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MV" ; + dc:source "TED" ] ; + at:start.use "1965-07-26" ; + atold:op-code "MDV" ; + dc:identifier "MDV" ; + skos:altLabel "جمهورية المالديف"@ar, + "Република Малдиви"@bg, + "República de Maldives"@ca, + "Maledivská republika"@cs, + "Republikken Maldiverne"@da, + "Republik Malediven"@de, + "ދިވެހިރާއްޖެ"@dv, + "Δημοκρατία των Μαλδιβών"@el, + "Republic of Maldives"@en, + "República de Maldivas"@es, + "Maldiivi Vabariik"@et, + "Malediivien tasavalta"@fi, + "République des Maldives"@fr, + "Poblacht Oileáin Mhaildíve"@ga, + "Republika Maldivi"@hr, + "Maldív Köztársaság"@hu, + "Lýðveldið Maldívur"@is, + "Repubblica delle Maldive"@it, + "モルディブ共和国"@ja, + "Republik Malediven"@lb, + "Maldyvų Respublika"@lt, + "Maldīvijas Republika"@lv, + "Ir-Repubblika tal-Maldivi"@mt, + "Republiek der Maldiven"@nl, + "Republikken Maldivene"@no, + "Republika Malediwów"@pl, + "República das Maldivas"@pt, + "Republica Maldivelor"@ro, + "Мальдивская Республика"@ru, + "Maldivská republika"@sk, + "Republika Maldivi"@sl, + "Republiken Maldiverna"@sv, + "Maldivler Cumhuriyeti"@tr, + "Республіка Мальдіви"@uk, + "马尔代夫共和国"@zh ; + skos:hiddenLabel "Малдиви"@bg, + "Μαλδιβών"@el, + "malediivilainen"@fi, + "maldivsko"@hr, + "Maldyvų"@lt, + "Maldīvijas"@lv, + "il-Maldivi"@mt, + "ir-Repubblika tal-Maldivi"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "123"^^euvoc:EP, + "MD"^^euvoc:FD_010, + "MD"^^euvoc:FD_400, + ".mv"^^euvoc:IANA_DOMAIN, + "MV"^^euvoc:ISG_COU, + "MV"^^euvoc:ISO_3166_1_ALPHA_2, + "MDV"^^euvoc:ISO_3166_1_ALPHA_3, + "462"^^euvoc:ISO_3166_1_NUM, + "MDV"^^euvoc:NAC, + "960"^^euvoc:PHONE_PREFIX, + "MV"^^euvoc:TED, + "MV"^^euvoc:TED_SCHEMA, + "Southern Asia"^^euvoc:UNSD_GEOSCHEME, + "462"^^euvoc:UNSD_M49 ; + skos:prefLabel "المالديف"@ar, + "Малдивски острови"@bg, + "Maldives"@ca, + "Maledivy"@cs, + "Maldiverne"@da, + "Malediven"@de, + "Μαλδίβες"@el, + "Maldives"@en, + "Maldivas"@es, + "Maldiivid"@et, + "Malediivit"@fi, + "Maldives"@fr, + "Oileáin Mhaildíve"@ga, + "Maldivi"@hr, + "Maldív-szigetek"@hu, + "Maldívur"@is, + "Maldive"@it, + "モルディブ"@ja, + "Malediven"@lb, + "Maldyvai"@lt, + "Maldīvija"@lv, + "Il-Maldivi"@mt, + "Maldiven"@nl, + "Maldivene"@no, + "Malediwy"@pl, + "Maldivas"@pt, + "Maldive"@ro, + "Мальдивы"@ru, + "Maldivy"@sk, + "Maldivi"@sl, + "Maldiverna"@sv, + "Maldivler"@tr, + "Мальдіви"@uk, + "马尔代夫"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MEX" ; + at:deprecated "false" ; + at:op-code "MEX" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MEX" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MX" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "MX" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "MX" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "MEX" ; + dc:identifier "MEX" ; + skos:altLabel "الولايات المتحدة المكسيكية"@ar, + "Мексикански съединени щати"@bg, + "Estats Units Mexicans"@ca, + "Spojené státy mexické"@cs, + "De Forenede Mexicanske Stater"@da, + "Vereinigte Mexikanische Staaten"@de, + "Ηνωμένες Πολιτείες του Μεξικού"@el, + "United Mexican States"@en, + "Estados Unidos Mexicanos"@es, + "Mehhiko Ühendriigid"@et, + "Meksikon yhdysvallat"@fi, + "États-Unis mexicains"@fr, + "Stáit Aontaithe Mheicsiceo"@ga, + "Sjedinjene Meksičke Države"@hr, + "Mexikói Egyesült Államok"@hu, + "Mexíkóska ríkjasambandið"@is, + "Stati Uniti messicani"@it, + "メキシコ合衆国"@ja, + "Vereenegt Mexikanesch Staaten"@lb, + "Meksikos Jungtinės Valstijos"@lt, + "Meksikas Savienotās Valstis"@lv, + "L-Istati Uniti tal-Messiku"@mt, + "Verenigde Mexicaanse Staten"@nl, + "De forente meksikanske stater"@no, + "Meksykańskie Stany Zjednoczone"@pl, + "Estados Unidos Mexicanos"@pt, + "Statele Unite Mexicane"@ro, + "Мексиканские Соединённые Штаты"@ru, + "Spojené štáty mexické"@sk, + "Združene mehiške države"@sl, + "Mexikos förenta stater"@sv, + "Birleşik Meksika Devletleri"@tr, + "Сполучені Штати Мексики"@uk, + "墨西哥合众国"@zh ; + skos:hiddenLabel "Meksikos"@lt, + "Meksikas"@lv, + "il-Messiku"@mt, + "l-Istati Uniti tal-Messiku"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "124"^^euvoc:EP, + "MEX"^^euvoc:FD_010, + "MX"^^euvoc:FD_140, + ".mx"^^euvoc:IANA_DOMAIN, + "MX"^^euvoc:ISG_COU, + "MX"^^euvoc:ISO_3166_1_ALPHA_2, + "MEX"^^euvoc:ISO_3166_1_ALPHA_3, + "484"^^euvoc:ISO_3166_1_NUM, + "MEX"^^euvoc:NAC, + "52"^^euvoc:PHONE_PREFIX, + "MX"^^euvoc:TED, + "MX"^^euvoc:TED_SCHEMA, + "MEX"^^euvoc:TIR, + "Central America"^^euvoc:UNSD_GEOSCHEME, + "484"^^euvoc:UNSD_M49 ; + skos:prefLabel "المكسيك"@ar, + "Мексико"@bg, + "Mèxic"@ca, + "Mexiko"@cs, + "Mexico"@da, + "Mexiko"@de, + "Μεξικό"@el, + "Mexico"@en, + "México"@es, + "Mehhiko"@et, + "Meksiko"@fi, + "Mexique"@fr, + "Meicsiceo"@ga, + "Meksiko"@hr, + "Mexikó"@hu, + "Mexíkó"@is, + "Messico"@it, + "メキシコ"@ja, + "Mexiko"@lb, + "Meksika"@lt, + "Meksika"@lv, + "Il-Messiku"@mt, + "Mexico"@nl, + "Mexico"@no, + "Meksyk"@pl, + "México"@pt, + "Mexic"@ro, + "Мексика"@ru, + "Mexiko"@sk, + "Mehika"@sl, + "Mexiko"@sv, + "Meksika"@tr, + "Мексика"@uk, + "墨西哥"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MHL" ; + at:deprecated "false" ; + at:op-code "MHL" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MHL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MH" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "MH" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1986-10-21" ; + atold:op-code "MHL" ; + dc:identifier "MHL" ; + skos:altLabel "جمهورية جزر مارشال"@ar, + "Република Маршалови острови"@bg, + "República de les Illes Marshall"@ca, + "Republika Marshallovy ostrovy"@cs, + "Republikken Marshalløerne"@da, + "Republik Marshallinseln"@de, + "Δημοκρατία των Νήσων Μάρσαλ"@el, + "Republic of the Marshall Islands"@en, + "República de las Islas Marshall"@es, + "Marshalli Saarte Vabariik"@et, + "Marshallinsaarten tasavalta"@fi, + "République des Îles Marshall"@fr, + "Poblacht Oileáin Marshall"@ga, + "Republika Maršalovi Otoci"@hr, + "Marshall-szigeteki Köztársaság"@hu, + "Lýðveldið Marshall-eyjar"@is, + "Repubblica delle Isole Marshall"@it, + "マーシャル諸島共和国"@ja, + "Republik Marshallinselen"@lb, + "Maršalo Salų Respublika"@lt, + "Māršala Salu Republika"@lv, + "Aorōkin M̧ajeļ"@mh, + "Ir-Repubblika tal-Gżejjer Marshall"@mt, + "Republiek der Marshalleilanden"@nl, + "Republikken Marshalløyene"@no, + "Republika Wysp Marshalla"@pl, + "República das Ilhas Marshall"@pt, + "Republica Insulelor Marshall"@ro, + "Республика Маршалловы Острова"@ru, + "Republika Marshallových ostrovov"@sk, + "Republika Marshallovi otoki"@sl, + "Republiken Marshallöarna"@sv, + "Marşal Adaları Cumhuriyeti"@tr, + "Республіка Маршаллові Острови"@uk, + "马绍尔群岛共和国"@zh ; + skos:hiddenLabel "Νήσων Μάρσαλ"@el, + "duine ó Oileáin Marshall"@ga, + "Maršalovih Otoka"@hr, + "Maršalo Salų"@lt, + "Māršala Salu"@lv, + "il-Gżejjer Marshall"@mt, + "ir-Repubblika tal-Gżejjer Marshall"@mt, + "marshallina"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "114"^^euvoc:EP, + "MHL"^^euvoc:FD_010, + ".mh"^^euvoc:IANA_DOMAIN, + "MH"^^euvoc:ISG_COU, + "MH"^^euvoc:ISO_3166_1_ALPHA_2, + "MHL"^^euvoc:ISO_3166_1_ALPHA_3, + "584"^^euvoc:ISO_3166_1_NUM, + "MHL"^^euvoc:NAC, + "692"^^euvoc:PHONE_PREFIX, + "MH"^^euvoc:TED, + "MH"^^euvoc:TED_SCHEMA, + "Micronesia"^^euvoc:UNSD_GEOSCHEME, + "584"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر مارشال"@ar, + "Маршалови острови"@bg, + "Illes Marshall"@ca, + "Marshallovy ostrovy"@cs, + "Marshalløerne"@da, + "Marshallinseln"@de, + "Νήσοι Μάρσαλ"@el, + "Marshall Islands"@en, + "Islas Marshall"@es, + "Marshalli Saared"@et, + "Marshallinsaaret"@fi, + "Îles Marshall"@fr, + "Oileáin Marshall"@ga, + "Maršalovi Otoci"@hr, + "Marshall-szigetek"@hu, + "Marshall-eyjar"@is, + "Isole Marshall"@it, + "マーシャル諸島"@ja, + "Marshallinselen"@lb, + "Maršalo Salos"@lt, + "Māršala salas"@lv, + "Il-Gżejjer Marshall"@mt, + "Marshalleilanden"@nl, + "Marshalløyene"@no, + "Wyspy Marshalla"@pl, + "Ilhas Marshall"@pt, + "Insulele Marshall"@ro, + "Маршалловы Острова"@ru, + "Marshallove ostrovy"@sk, + "Marshallovi otoki"@sl, + "Marshallöarna"@sv, + "Marşal Adaları"@tr, + "Маршаллові Острови"@uk, + "马绍尔群岛"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MKD" ; + at:deprecated "false" ; + at:op-code "MKD" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MK" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MAC" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "MAC" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MCD" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MK" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1993-04-08" ; + atold:op-code "MKD" ; + dc:identifier "MKD" ; + skos:altLabel "جمهورية مقدونيا الشمالية"@ar, + "Република Северна Македония"@bg, + "República de Macedònia del Nord"@ca, + "Republika Severní Makedonie"@cs, + "Republikken Nordmakedonien"@da, + "Republik Nordmazedonien"@de, + "Δημοκρατία της Βόρειας Μακεδονίας"@el, + "Republic of North Macedonia"@en, + "República de Macedonia del Norte"@es, + "Põhja-Makedoonia Vabariik"@et, + "Pohjois-Makedonian tasavalta"@fi, + "République de Macédoine du Nord"@fr, + "Poblacht na Macadóine Thuaidh"@ga, + "Republika Sjeverna Makedonija"@hr, + "Észak-macedón Köztársaság"@hu, + "Lýðveldið Norður-Makedónía"@is, + "Repubblica di Macedonia del Nord"@it, + "北マケドニア共和国"@ja, + "Republik Nordmazedonien"@lb, + "Šiaurės Makedonijos Respublika"@lt, + "Ziemeļmaķedonijas Republika"@lv, + "Република Северна Македонија"@mk, + "Северна Македонија"@mk, + "Ir-Repubblika tal-Maċedonja ta’ Fuq"@mt, + "Republiek Noord-Macedonië"@nl, + "Republikken Nord-Makedonia"@no, + "Republika Macedonii Północnej"@pl, + "República da Macedónia do Norte"@pt, + "Republica Macedonia de Nord"@ro, + "Республика Северная Македония"@ru, + "Severomacedónska republika"@sk, + "Republika Severna Makedonija"@sl, + "Republiken Nordmakedonien"@sv, + "Kuzey Makedonya Cumhuriyeti"@tr, + "Республіка Північна Македонія"@uk, + "北马其顿共和国"@zh ; + skos:changeNote "Opening event: Splitting of the ‘Socialist Federal Republic of Yugoslavia’ COU0060 into Republic of Slovenia COU0051, Republic of Croatia COU0026, Federal Republic of Yugoslavia COU0061, Bosnia and Herzegovina COU0004, Former Yugoslav Republic of Macedonia COU0040."@en ; + skos:hiddenLabel "Põhja-Makedoonia Vabariigi"@et, + "an Mhacadóin Thuaidh"@ga, + "ón/as an Macadóin Thuaidh"@ga, + "il-Maċedonja ta’ Fuq"@mt, + "ir-Repubblika tal-Maċedonja ta’ Fuq"@mt, + "severomacedónsky"@sk ; + skos:historyNote "Following United Nations facilitation, Greece and the former Yugoslav Republic of Macedonia ratified a bilateral agreement according to which the latter country will be named the Republic of North Macedonia. On 15.2.2019, North Macedonia formally notified the EU about the entry into force of this agreement."@en, + "Interinstitutional Style Guide: North Macedonia: ‘the adjectival reference to the State, its official organs, and other public entities as well as private entities and actors that are related to the State, are established by law, and enjoy financial support from State for activities abroad shall be in line with its official name or its short name, that is “of the Republic of North Macedonia” or “of North Macedonia”. Other adjectival references, including “North Macedonian” and “Macedonian” may not be used in all of the above cases. Other adjectival usages, including those referring to private entities and actors, that are not related to the State and public entities, are not established by law and do not enjoy financial support from the State for activities abroad may be “Macedonian”. The adjectival usage for activities may also be “Macedonian”. This is without prejudice to the process established by the Prespa Agreement regarding commercial names, trademarks and brand names and to the compound names of cities that exist at the date of the signature of the Prespa Agreement.’"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "243"^^euvoc:EP, + "MAC"^^euvoc:FD_010, + "MCD"^^euvoc:FD_010, + "MAC"^^euvoc:FD_050, + ".mk"^^euvoc:IANA_DOMAIN, + "MK"^^euvoc:IBAN_COU, + "MK"^^euvoc:ISG_COU, + "MK"^^euvoc:ISO_3166_1_ALPHA_2, + "MKD"^^euvoc:ISO_3166_1_ALPHA_3, + "807"^^euvoc:ISO_3166_1_NUM, + "MKD"^^euvoc:NAC, + "389"^^euvoc:PHONE_PREFIX, + "MK"^^euvoc:TED, + "MK"^^euvoc:TED_SCHEMA, + "MK"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "807"^^euvoc:UNSD_M49 ; + skos:prefLabel "مقدونيا الشمالية"@ar, + "Северна Македония"@bg, + "Macedònia del Nord"@ca, + "Severní Makedonie"@cs, + "Nordmakedonien"@da, + "Nordmazedonien"@de, + "Βόρεια Μακεδονία"@el, + "North Macedonia"@en, + "Macedonia del Norte"@es, + "Põhja-Makedoonia"@et, + "Pohjois-Makedonia"@fi, + "Macédoine du Nord"@fr, + "An Mhacadóin Thuaidh"@ga, + "Sjeverna Makedonija"@hr, + "Észak-Macedónia"@hu, + "Norður-Makedónía"@is, + "Macedonia del Nord"@it, + "北マケドニア"@ja, + "Nordmazedonien"@lb, + "Šiaurės Makedonija"@lt, + "Ziemeļmaķedonija"@lv, + "Il-Maċedonja ta’ Fuq"@mt, + "Noord-Macedonië"@nl, + "Nord-Makedonia"@no, + "Macedonia Północna"@pl, + "Macedónia do Norte"@pt, + "Macedonia de Nord"@ro, + "Северная Македония"@ru, + "Severné Macedónsko"@sk, + "Severna Makedonija"@sl, + "Nordmakedonien"@sv, + "Kuzey Makedonya"@tr, + "Північна Македонія"@uk, + "北马其顿"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MLI" ; + at:deprecated "false" ; + at:op-code "MLI" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RMM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "ML" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "ML" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RMM" ; + dc:source "EurLex" ] ; + at:start.use "1960-09-22" ; + atold:op-code "MLI" ; + dc:identifier "MLI" ; + skos:altLabel "جمهورية مالي"@ar, + "Република Мали"@bg, + "República de Mali"@ca, + "Republika Mali"@cs, + "Republikken Mali"@da, + "Republik Mali"@de, + "Δημοκρατία του Μαλί"@el, + "Republic of Mali"@en, + "República de Malí"@es, + "Mali Vabariik"@et, + "Malin tasavalta"@fi, + "République du Mali"@fr, + "Poblacht Mhailí"@ga, + "Republika Mali"@hr, + "Mali Köztársaság"@hu, + "Lýðveldið Malí"@is, + "Repubblica del Mali"@it, + "マリ共和国"@ja, + "Republik Mali"@lb, + "Malio Respublika"@lt, + "Mali Republika"@lv, + "Ir-Repubblika tal-Mali"@mt, + "Republiek Mali"@nl, + "Republikken Mali"@no, + "Republika Mali"@pl, + "República do Mali"@pt, + "Republica Mali"@ro, + "Республика Мали"@ru, + "Malijská republika"@sk, + "Republika Mali"@sl, + "Republiken Mali"@sv, + "Mali Cumhuriyeti"@tr, + "Республіка Малі"@uk, + "马里共和国"@zh ; + skos:hiddenLabel "Δημοκρατία του Μάλι"@el, + "Μάλι"@el, + "Malio"@lt, + "il-Mali"@mt, + "ir-Repubblika tal-Mali"@mt, + "Malinese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "116"^^euvoc:EP, + "RMM"^^euvoc:FD_010, + "RMM"^^euvoc:FD_400, + ".ml"^^euvoc:IANA_DOMAIN, + "ML"^^euvoc:ISG_COU, + "ML"^^euvoc:ISO_3166_1_ALPHA_2, + "MLI"^^euvoc:ISO_3166_1_ALPHA_3, + "466"^^euvoc:ISO_3166_1_NUM, + "MLI"^^euvoc:NAC, + "223"^^euvoc:PHONE_PREFIX, + "ML"^^euvoc:TED, + "ML"^^euvoc:TED_SCHEMA, + "RMM"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "466"^^euvoc:UNSD_M49 ; + skos:prefLabel "مالي"@ar, + "Мали"@bg, + "Mali"@ca, + "Mali"@cs, + "Mali"@da, + "Mali"@de, + "Μαλί"@el, + "Mali"@en, + "Malí"@es, + "Mali"@et, + "Mali"@fi, + "Mali"@fr, + "Mailí"@ga, + "Mali"@hr, + "Mali"@hu, + "Malí"@is, + "Mali"@it, + "マリ"@ja, + "Mali"@lb, + "Malis"@lt, + "Mali"@lv, + "Il-Mali"@mt, + "Mali"@nl, + "Mali"@no, + "Mali"@pl, + "Mali"@pt, + "Mali"@ro, + "Мали"@ru, + "Mali"@sk, + "Mali"@sl, + "Mali"@sv, + "Mali"@tr, + "Малі"@uk, + "马里"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MMR" ; + at:deprecated "false" ; + at:op-code "MMR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "MM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MM" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BUR" ; + dc:source "EurLex" ] ; + at:start.use "1989-06-18" ; + atold:op-code "MMR" ; + dc:identifier "MMR" ; + skos:altLabel "Myanmar /Burma"@lb, + "Myanma"@my ; + skos:hiddenLabel "Republika Myanmarský svaz"@cs, + "Republikken Mayanmarunionen"@da, + "fra Myanmar/Burma, burmesisk, myanmarsk"@da, + "Myanmar"@de, + "Republik der Union Myanmar"@de, + "myanmarisch"@de, + "Δημοκρατία της Ένωσης του Μιανμάρ"@el, + "Μιανμάρ"@el, + "Myanmar"@en, + "Republic of the Union of Myanmar"@en, + "of Burma/Myanmar"@en, + "Myanmar"@fr, + "République de l'Union du Myanmar"@fr, + "du Myanmar"@fr, + "Maenmar"@ga, + "Poblacht Aontas Mhaenmar"@ga, + "duine ó Maenmar"@ga, + "Mjanmar"@hr, + "Unija Mjanmar"@hr, + "Mianmar"@hu, + "Mianmari Államszövetség Köztársasága"@hu, + "mianmari"@hu, + "Mianmaro Sąjungos Respublika"@lt, + "Mjanma"@lv, + "Mjanmas"@lv, + "Mjanmas Savienības Republika"@lv, + "il-Myanmar/Burma"@mt, + "Myanmar / Birma"@nl, + "van Myanmar / Birma"@nl, + "Mjanma"@pl, + "Republika Związku Mjanmy"@pl, + "mjanmańskie"@pl, + "República da União de Mianmar"@pt, + "Mjanmarsko"@sk, + "Mjanmarská zväzová republika"@sk, + "Mjanmar"@sl, + "Republika Mjanmar"@sl, + "mjanmarsko"@sl ; + skos:historyNote "ISO 3166-1 Newsletter VI-9 of 12.6.2011: Long name change from ‘Union of Myanmar’ to ‘Republic of the Union of Myanmar’."@en, + "Interinstitutional Style Guide: Myanmar/Burma: the United Nations uses the terms ‘Myanmar’ short name and ‘Republic of the Union of Myanmar’ full name, but it is recommended to use the form ‘Myanmar/Burma’ in EU texts."@en, + "Source for the new record: The Legal Service states that ‘The Council FAC effectively agreed in its session of 22-23 April on a new denomination by adopting Conclusions on “Myanmar/Burma”, and it was a deliberate policy choice to invert the previous denomination of “Burma/Myanmar”. Consequently, this new denomination of “Myanmar/Burma” should be used henceforth in all Council acts and documents referring to that country.’"@en, + "Code de rédaction interinstitutionnel: Myanmar/Birmanie: L’ONU utilise les appellations «Myanmar» forme courte et «République de l’Union du Myanmar» forme longue, mais il est recommandé d’utiliser la forme «le Myanmar/la Birmanie» dans les textes de l’UE."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:notation "117"^^euvoc:EP, + "BUR"^^euvoc:FD_010, + "MM"^^euvoc:FD_140, + ".mm"^^euvoc:IANA_DOMAIN, + "MM"^^euvoc:ISG_COU, + "MM"^^euvoc:ISO_3166_1_ALPHA_2, + "MMR"^^euvoc:ISO_3166_1_ALPHA_3, + "104"^^euvoc:ISO_3166_1_NUM, + "MMR"^^euvoc:NAC, + "95"^^euvoc:PHONE_PREFIX, + "MM"^^euvoc:TED, + "MM"^^euvoc:TED_SCHEMA, + "BUR"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "104"^^euvoc:UNSD_M49 ; + skos:prefLabel "ميانمار/بورما"@ar, + "Мианмар/Бирма"@bg, + "Myanmar/Birmània"@ca, + "Myanmar/Barma"@cs, + "Myanmar/Burma"@da, + "Myanmar/Birma"@de, + "Μιανμάρ/Βιρμανία"@el, + "Myanmar/Burma"@en, + "Myanmar/Birmania"@es, + "Myanmar/Birma"@et, + "Myanmar/Burma"@fi, + "Myanmar/Birmanie"@fr, + "Maenmar/Burma"@ga, + "Mjanmar/Burma"@hr, + "Mianmar/Burma"@hu, + "Myanmar"@is, + "Myanmar/Birmania"@it, + "ミャンマー/ビルマ"@ja, + "Myanmar/Burma"@lb, + "Mianmaras / Birma"@lt, + "Mjanma/Birma"@lv, + "Il-Myanmar/Burma"@mt, + "Myanmar/Birma"@nl, + "Myanmar/Burma"@no, + "Mjanma/Birma"@pl, + "Mianmar/Birmânia"@pt, + "Myanmar/Birmania"@ro, + "Мьянма/Бирма"@ru, + "Mjanmarsko/Barma"@sk, + "Mjanmar/Burma"@sl, + "Myanmar/Burma"@sv, + "Myanmar/Burma"@tr, + "М'янма/Бірма"@uk, + "缅甸"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MNE" ; + at:deprecated "false" ; + at:op-code "MNE" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MONTENEGRO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "ME" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "ME" ; + dc:source "TED" ] ; + at:start.use "2006-06-03" ; + atold:op-code "MNE" ; + dc:identifier "MNE" ; + skos:changeNote "Opening event: Splitting of the country State Union of Serbia and Montenegro COU0011 into Republic of Serbia COU0048 and Republic of Montenegro COU0039."@en, + "Oficiul pentru Publicatii: Muntenegru: în urma adoptării, la 19 octombrie 2007, a noii constituții, numele oficial al statului este Muntenegru."@ro ; + skos:hiddenLabel "Δημοκρατία του Μαυροβουνίου"@el, + "Μαυροβουνίου"@el, + "Republic of Montenegro"@en, + "Montenegro Vabariik"@et, + "République du Monténégro"@fr, + "Poblacht Mhontainéagró"@ga, + "Republika Crna Gora"@hr, + "Juodkalnijos"@lt, + "Melnkalnes"@lv, + "Melnkalnes Republika"@lv, + "il-Montenegro"@mt, + "Republika Črna gora"@sl, + "Republiken Montenegro"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "284"^^euvoc:EP, + "MONTENEGRO"^^euvoc:FD_010, + ".me"^^euvoc:IANA_DOMAIN, + "ME"^^euvoc:IBAN_COU, + "ME"^^euvoc:ISG_COU, + "ME"^^euvoc:ISO_3166_1_ALPHA_2, + "MNE"^^euvoc:ISO_3166_1_ALPHA_3, + "499"^^euvoc:ISO_3166_1_NUM, + "MNE"^^euvoc:NAC, + "382"^^euvoc:PHONE_PREFIX, + "ME"^^euvoc:TED, + "ME"^^euvoc:TED_SCHEMA, + "MNE"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "499"^^euvoc:UNSD_M49 ; + skos:prefLabel "مونتينيغرو"@ar, + "Чарнагорыя"@be, + "Черна гора"@bg, + "Crna Gora"@bs, + "Montenegro"@ca, + "Černá Hora"@cs, + "Montenegro"@da, + "Montenegro"@de, + "Μαυροβούνιο"@el, + "Montenegro"@en, + "Montenegro"@es, + "Montenegro"@et, + "Montenegro"@eu, + "Montenegro"@fi, + "Montenegro"@fo, + "Monténégro"@fr, + "Montainéagró"@ga, + "Montenegro"@gl, + "Crna Gora"@hr, + "Montenegró"@hu, + "Montenegró"@is, + "Montenegro"@it, + "モンテネグロ"@ja, + "Montenegro"@lb, + "Juodkalnija"@lt, + "Melnkalne"@lv, + "Црна Гора"@mk, + "Il-Montenegro"@mt, + "Montenegro"@nl, + "Montenegro"@no, + "Czarnogóra"@pl, + "Montenegro"@pt, + "Montenegro"@rm, + "Muntenegru"@ro, + "Черногория"@ru, + "Čierna Hora"@sk, + "Črna gora"@sl, + "Mali i Zi"@sq, + "Црна Гора"@sr, + "Montenegro"@sv, + "Karadağ"@tr, + "Чорногорія"@uk, + "黑山"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MNG" ; + at:deprecated "false" ; + at:op-code "MNG" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "MN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "MN" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MN" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "MNG" ; + dc:identifier "MNG" ; + skos:altLabel "Mongolia"@hr, + "Mongolien"@lb, + "Монгол Улс"@mn, + "Republiek Mongolië"@nl ; + skos:hiddenLabel "mongola"@es, + "mongole"@fr, + "an Mhongóil"@ga, + "Mongolijos"@lt, + "Mongolijas"@lv, + "il-Mongolja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "118"^^euvoc:EP, + "MN"^^euvoc:FD_010, + "MO"^^euvoc:FD_010, + "MN"^^euvoc:FD_400, + ".mn"^^euvoc:IANA_DOMAIN, + "MN"^^euvoc:ISG_COU, + "MN"^^euvoc:ISO_3166_1_ALPHA_2, + "MNG"^^euvoc:ISO_3166_1_ALPHA_3, + "496"^^euvoc:ISO_3166_1_NUM, + "MNG"^^euvoc:NAC, + "976"^^euvoc:PHONE_PREFIX, + "MN"^^euvoc:TED, + "MN"^^euvoc:TED_SCHEMA, + "MGL"^^euvoc:TIR, + "Eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "496"^^euvoc:UNSD_M49 ; + skos:prefLabel "منغوليا"@ar, + "Монголия"@bg, + "Mongòlia"@ca, + "Mongolsko"@cs, + "Mongoliet"@da, + "Mongolei"@de, + "Μογγολία"@el, + "Mongolia"@en, + "Mongolia"@es, + "Mongoolia"@et, + "Mongolia"@fi, + "Mongolie"@fr, + "An Mhongóil"@ga, + "Mongolija"@hr, + "Mongólia"@hu, + "Mongólía"@is, + "Mongolia"@it, + "モンゴル"@ja, + "Mongolei"@lb, + "Mongolija"@lt, + "Mongolija"@lv, + "Il-Mongolja"@mt, + "Mongolië"@nl, + "Mongolia"@no, + "Mongolia"@pl, + "Mongólia"@pt, + "Mongolia"@ro, + "Монголия"@ru, + "Mongolsko"@sk, + "Mongolija"@sl, + "Mongoliet"@sv, + "Moğolistan"@tr, + "Монголія"@uk, + "蒙古"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MOZ" ; + at:deprecated "false" ; + at:op-code "MOZ" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MZB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "MZB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MZ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "MZ" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1975-06-25" ; + atold:op-code "MOZ" ; + dc:identifier "MOZ" ; + skos:altLabel "جمهورية موزمبيق"@ar, + "Република Мозамбик"@bg, + "República de Moçambic"@ca, + "Mosambická republika"@cs, + "Republikken Mozambique"@da, + "Republik Mosambik"@de, + "Δημοκρατία της Μοζαμβίκης"@el, + "Republic of Mozambique"@en, + "República de Mozambique"@es, + "Mosambiigi Vabariik"@et, + "Mosambikin tasavalta"@fi, + "République du Mozambique"@fr, + "Poblacht Mhósaimbíc"@ga, + "Republika Mozambik"@hr, + "Mozambiki Köztársaság"@hu, + "Lýðveldið Mósambík"@is, + "Repubblica del Mozambico"@it, + "モザンビーク共和国"@ja, + "Republik Mosambik"@lb, + "Mozambiko Respublika"@lt, + "Mozambikas Republika"@lv, + "Ir-Repubblika tal-Mozambique"@mt, + "Republiek Mozambique"@nl, + "Republikken Mosambik"@no, + "Republika Mozambiku"@pl, + "República de Moçambique"@pt, + "Republica Mozambic"@ro, + "Республика Мозамбик"@ru, + "Mozambická republika"@sk, + "Republika Mozambik"@sl, + "Republiken Moçambique"@sv, + "Mozambik Cumhuriyeti"@tr, + "Республіка Мозамбік"@uk, + "莫桑比克共和国"@zh ; + skos:hiddenLabel "Μοζαμβίκης"@el, + "Mozambiko"@lt, + "Mozambikas"@lv, + "il-Mozambique"@mt, + "ir-Repubblika tal-Mozambique"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "126"^^euvoc:EP, + "MZB"^^euvoc:FD_010, + "MZB"^^euvoc:FD_400, + ".mz"^^euvoc:IANA_DOMAIN, + "MZ"^^euvoc:ISG_COU, + "MZ"^^euvoc:ISO_3166_1_ALPHA_2, + "MOZ"^^euvoc:ISO_3166_1_ALPHA_3, + "508"^^euvoc:ISO_3166_1_NUM, + "MOZ"^^euvoc:NAC, + "258"^^euvoc:PHONE_PREFIX, + "MZ"^^euvoc:TED, + "MZ"^^euvoc:TED_SCHEMA, + "MOC"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "508"^^euvoc:UNSD_M49 ; + skos:prefLabel "موزمبيق"@ar, + "Мозамбик"@bg, + "Moçambic"@ca, + "Mosambik"@cs, + "Mozambique"@da, + "Mosambik"@de, + "Μοζαμβίκη"@el, + "Mozambique"@en, + "Mozambique"@es, + "Mosambiik"@et, + "Mosambik"@fi, + "Mozambique"@fr, + "Mósaimbíc"@ga, + "Mozambik"@hr, + "Mozambik"@hu, + "Mósambík"@is, + "Mozambico"@it, + "モザンビーク"@ja, + "Mosambik"@lb, + "Mozambikas"@lt, + "Mozambika"@lv, + "Il-Mozambique"@mt, + "Mozambique"@nl, + "Mosambik"@no, + "Mozambik"@pl, + "Moçambique"@pt, + "Mozambic"@ro, + "Мозамбик"@ru, + "Mozambik"@sk, + "Mozambik"@sl, + "Moçambique"@sv, + "Mozambik"@tr, + "Мозамбік"@uk, + "莫桑比克"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MRT" ; + at:deprecated "false" ; + at:op-code "MRT" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "MR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RIM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RIM" ; + dc:source "EurLex" ] ; + at:start.use "1960-11-28" ; + atold:op-code "MRT" ; + dc:identifier "MRT" ; + skos:altLabel "جمهورية موريتانيا الإسلامية"@ar, + "Ислямска република Мавритания"@bg, + "República Islàmica de Mauritània"@ca, + "Mauritánská islámská republika"@cs, + "Den Islamiske Republik Mauretanien"@da, + "Islamische Republik Mauretanien"@de, + "Ισλαμική Δημοκρατία της Μαυριτανίας"@el, + "Islamic Republic of Mauritania"@en, + "República Islámica de Mauritania"@es, + "Mauritaania Islamivabariik"@et, + "Mauritanian islamilainen tasavalta"@fi, + "République islamique de Mauritanie"@fr, + "Poblacht Ioslamach na Máratáine"@ga, + "Islamska Republika Mauretanija"@hr, + "Mauritániai Iszlám Köztársaság"@hu, + "Íslamska lýðveldið Máritanía"@is, + "Repubblica islamica di Mauritania"@it, + "モーリタニア・イスラム共和国"@ja, + "Islamesch Republik Mauretanien"@lb, + "Mauritanijos Islamo Respublika"@lt, + "Mauritānijas Islāma Republika"@lv, + "Ir-Repubblika Iżlamika tal-Mauritania"@mt, + "Islamitische Republiek Mauritanië"@nl, + "Den islamske republikk Mauritania"@no, + "Islamska Republika Mauretańska"@pl, + "República Islâmica da Mauritânia"@pt, + "Republica Islamică Mauritania"@ro, + "Исламская Республика Мавритания"@ru, + "Mauritánska islamská republika"@sk, + "Islamska republika Mavretanija"@sl, + "Islamiska republiken Mauretanien"@sv, + "Moritanya İslam Cumhuriyeti"@tr, + "Ісламська Республіка Мавританія"@uk, + "毛里塔尼亚伊斯兰共和国"@zh ; + skos:hiddenLabel "an Mháratáin"@ga, + "Islamska Republika Mauritanija"@hr, + "Mauritanija"@hr, + "mauritansko"@hr, + "mauritana, maura"@it, + "Mauritanijos"@lt, + "Mauritānijas"@lv, + "il-Mauritania"@mt, + "ir-Repubblika Iżlamika tal-Mauritania"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "121"^^euvoc:EP, + "RIM"^^euvoc:FD_010, + "RIM"^^euvoc:FD_400, + ".mr"^^euvoc:IANA_DOMAIN, + "MR"^^euvoc:IBAN_COU, + "MR"^^euvoc:ISG_COU, + "MR"^^euvoc:ISO_3166_1_ALPHA_2, + "MRT"^^euvoc:ISO_3166_1_ALPHA_3, + "478"^^euvoc:ISO_3166_1_NUM, + "MRT"^^euvoc:NAC, + "222"^^euvoc:PHONE_PREFIX, + "MR"^^euvoc:TED, + "MR"^^euvoc:TED_SCHEMA, + "RIM"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "478"^^euvoc:UNSD_M49 ; + skos:prefLabel "موريتانيا"@ar, + "Мавритания"@bg, + "Mauritània"@ca, + "Mauritánie"@cs, + "Mauretanien"@da, + "Mauretanien"@de, + "Μαυριτανία"@el, + "Mauritania"@en, + "Mauritania"@es, + "Mauritaania"@et, + "Mauritania"@fi, + "Mauritanie"@fr, + "An Mháratáin"@ga, + "Mauretanija"@hr, + "Mauritánia"@hu, + "Máritanía"@is, + "Mauritania"@it, + "モーリタニア"@ja, + "Mauretanien"@lb, + "Mauritanija"@lt, + "Mauritānija"@lv, + "Il-Mauritania"@mt, + "Mauritanië"@nl, + "Mauritania"@no, + "Mauretania"@pl, + "Mauritânia"@pt, + "Mauritania"@ro, + "Мавритания"@ru, + "Mauritánia"@sk, + "Mavretanija"@sl, + "Mauretanien"@sv, + "Moritanya"@tr, + "Мавританія"@uk, + "毛里塔尼亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MSR" ; + at:deprecated "false" ; + at:op-code "MSR" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MS" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "MS" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "MSR" ; + dc:identifier "MSR" ; + skos:altLabel "Emerald Isle of the Caribbean"@en, + "Montserrati asumaa"@et ; + skos:broader ; + skos:hiddenLabel "Μονσεράτ"@el, + "britannialainen, montserratilainen"@fi, + "Montsarat"@ga, + "duine ó Mhontsarat"@ga, + "Montserrata"@hr, + "montserrati"@hu, + "Montserato"@lt, + "monserratense"@pt ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "244"^^euvoc:EP, + ".ms"^^euvoc:IANA_DOMAIN, + "MS"^^euvoc:ISG_COU, + "MS"^^euvoc:ISO_3166_1_ALPHA_2, + "MSR"^^euvoc:ISO_3166_1_ALPHA_3, + "500"^^euvoc:ISO_3166_1_NUM, + "MSR"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "MS"^^euvoc:TED, + "MS"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "500"^^euvoc:UNSD_M49 ; + skos:prefLabel "مونتيسيرات"@ar, + "Монтсерат"@bg, + "Montserrat"@ca, + "Montserrat"@cs, + "Montserrat"@da, + "Montserrat"@de, + "Μοντσεράτ"@el, + "Montserrat"@en, + "Montserrat"@es, + "Montserrat"@et, + "Montserrat"@fi, + "Montserrat"@fr, + "Montserrat"@ga, + "Montserrat"@hr, + "Montserrat"@hu, + "Montserrat"@is, + "Montserrat"@it, + "モントセラト"@ja, + "Montserrat"@lb, + "Montseratas"@lt, + "Montserrata"@lv, + "Montserrat"@mt, + "Montserrat"@nl, + "Montserrat"@no, + "Montserrat"@pl, + "Monserrate"@pt, + "Montserrat"@ro, + "Монсеррат"@ru, + "Montserrat"@sk, + "Monserat"@sl, + "Montserrat"@sv, + "Montserrat"@tr, + "Монтсеррат"@uk, + "蒙特塞拉特"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "MUS" ; + at:deprecated "false" ; + at:op-code "MUS" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MU" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MU" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1968-03-12" ; + atold:op-code "MUS" ; + dc:identifier "MUS" ; + skos:altLabel "جمهورية موريشيوس"@ar, + "Република Мавриций"@bg, + "República de Maurici"@ca, + "Mauricijská republika"@cs, + "Republikken Mauritius"@da, + "Republik Mauritius"@de, + "Δημοκρατία του Μαυρικίου"@el, + "Republic of Mauritius"@en, + "República de Mauricio"@es, + "Mauritiuse Vabariik"@et, + "Mauritiuksen tasavalta"@fi, + "République de Maurice"@fr, + "Poblacht Oileáin Mhuirís"@ga, + "Islamska Republika Mauretanija"@hr, + "Mauritiusi Köztársaság"@hu, + "Lýðveldið Máritíus"@is, + "Repubblica di Mauritius"@it, + "モーリシャス共和国"@ja, + "Republik Mauritius"@lb, + "Mauricijaus Respublika"@lt, + "Maurīcijas Republika"@lv, + "Ir-Repubblika ta’ Mauritius"@mt, + "Republiek Mauritius"@nl, + "Republikken Mauritius"@no, + "Republika Mauritiusu"@pl, + "República da Maurícia"@pt, + "Republica Mauritius"@ro, + "Республика Маврикий"@ru, + "Maurícijská republika"@sk, + "Republika Mavricij"@sl, + "Republiken Mauritius"@sv, + "Morityus Cumhuriyeti"@tr, + "Республіка Маврикій"@uk, + "毛里求斯共和国"@zh ; + skos:hiddenLabel "Μαυρίκιου"@el, + "Poblacht Oileán Mhuirís"@ga, + "Republika Mauricijus"@hr, + "Repubblica di Maurizio"@it, + "Mauricijaus"@lt, + "Maurīcijas"@lv, + "ir-Repubblika ta' Mauritius"@mt, + "mauricijsko"@sl, + "Republliken Mauritius"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "122"^^euvoc:EP, + "MS"^^euvoc:FD_010, + ".mu"^^euvoc:IANA_DOMAIN, + "MU"^^euvoc:IBAN_COU, + "MU"^^euvoc:ISG_COU, + "MU"^^euvoc:ISO_3166_1_ALPHA_2, + "MUS"^^euvoc:ISO_3166_1_ALPHA_3, + "480"^^euvoc:ISO_3166_1_NUM, + "MUS"^^euvoc:NAC, + "230"^^euvoc:PHONE_PREFIX, + "MU"^^euvoc:TED, + "MU"^^euvoc:TED_SCHEMA, + "MS"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "480"^^euvoc:UNSD_M49 ; + skos:prefLabel "موريشيوس"@ar, + "Мавриций"@bg, + "Maurici"@ca, + "Mauricius"@cs, + "Mauritius"@da, + "Mauritius"@de, + "Μαυρίκιος"@el, + "Mauritius"@en, + "Mauricio"@es, + "Mauritius"@et, + "Mauritius"@fi, + "Maurice"@fr, + "Oileán Mhuirís"@ga, + "Mauricijus"@hr, + "Mauritius"@hu, + "Máritíus"@is, + "Maurizio"@it, + "モーリシャス"@ja, + "Mauritius"@lb, + "Mauricijus"@lt, + "Maurīcija"@lv, + "Mauritius"@mt, + "Mauritius"@nl, + "Mauritius"@no, + "Mauritius"@pl, + "Maurícia"@pt, + "Mauritius"@ro, + "Маврикий"@ru, + "Maurícius"@sk, + "Mavricij"@sl, + "Mauritius"@sv, + "Morityus"@tr, + "Маврикій"@uk, + "毛里求斯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MWI" ; + at:deprecated "false" ; + at:op-code "MWI" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "MW" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "MW" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "MW" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MW" ; + dc:source "EurLex" ] ; + at:start.use "1964-07-06" ; + atold:op-code "MWI" ; + dc:identifier "MWI" ; + skos:altLabel "جمهورية ملاوي"@ar, + "Република Малави"@bg, + "República de Malawi"@ca, + "Republika Malawi"@cs, + "Republikken Malawi"@da, + "Republik Malawi"@de, + "Δημοκρατία του Μαλάουι"@el, + "Republic of Malawi"@en, + "República de Malaui"@es, + "Malawi Vabariik"@et, + "Malawin tasavalta"@fi, + "République du Malawi"@fr, + "Poblacht na Maláive"@ga, + "Republika Malavi"@hr, + "Malawi Köztársaság"@hu, + "Lýðveldið Malaví"@is, + "Repubblica del Malawi"@it, + "マラウイ共和国"@ja, + "Republik Malawi"@lb, + "Malavio Respublika"@lt, + "Malāvijas Republika"@lv, + "Ir-Repubblika tal-Malawi"@mt, + "Republiek Malawi"@nl, + "Republikken Malawi"@no, + "Malaŵi"@ny, + "Republika Malawi"@pl, + "República do Malavi"@pt, + "Republica Malawi"@ro, + "Республика Малави"@ru, + "Malawijská republika"@sk, + "Republika Malavi"@sl, + "Republiken Malawi"@sv, + "Malavi Cumhuriyeti"@tr, + "Республіка Малаві"@uk, + "马拉维共和国"@zh ; + skos:hiddenLabel "an Mhaláiv"@ga, + "malavsko"@hr, + "Malavio"@lt, + "Malāvijas"@lv, + "il-Malawi"@mt, + "ir-Repubblika tal-Malawi"@mt, + "Maláui"@pt, + "República do Maláui"@pt, + "malauiana"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "245"^^euvoc:EP, + "MW"^^euvoc:FD_010, + "MW"^^euvoc:FD_400, + ".mw"^^euvoc:IANA_DOMAIN, + "MW"^^euvoc:ISG_COU, + "MW"^^euvoc:ISO_3166_1_ALPHA_2, + "MWI"^^euvoc:ISO_3166_1_ALPHA_3, + "454"^^euvoc:ISO_3166_1_NUM, + "MWI"^^euvoc:NAC, + "265"^^euvoc:PHONE_PREFIX, + "MW"^^euvoc:TED, + "MW"^^euvoc:TED_SCHEMA, + "MW"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "454"^^euvoc:UNSD_M49 ; + skos:prefLabel "مالاوي"@ar, + "Малави"@bg, + "Malawi"@ca, + "Malawi"@cs, + "Malawi"@da, + "Malawi"@de, + "Μαλάουι"@el, + "Malawi"@en, + "Malaui"@es, + "Malawi"@et, + "Malawi"@fi, + "Malawi"@fr, + "An Mhaláiv"@ga, + "Malavi"@hr, + "Malawi"@hu, + "Malaví"@is, + "Malawi"@it, + "マラウイ"@ja, + "Malawi"@lb, + "Malavis"@lt, + "Malāvija"@lv, + "Il-Malawi"@mt, + "Malawi"@nl, + "Malawi"@no, + "Malawi"@pl, + "Malavi"@pt, + "Malawi"@ro, + "Малави"@ru, + "Malawi"@sk, + "Malavi"@sl, + "Malawi"@sv, + "Malavi"@tr, + "Малаві"@uk, + "马拉维"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "MYS" ; + at:deprecated "false" ; + at:op-code "MYS" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "MAL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MY" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "MY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MY" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "MAL" ; + dc:source "EurLex" ] ; + at:start.use "1957-08-31" ; + atold:op-code "MYS" ; + dc:identifier "MYS" ; + skos:altLabel "Malaysia"@ms ; + skos:hiddenLabel "an Mhalaeisia"@ga, + "Malaizijos"@lt, + "Malaizijas"@lv, + "Malasjana"@mt, + "il-Malasja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "125"^^euvoc:EP, + "MAL"^^euvoc:FD_010, + "MY"^^euvoc:FD_140, + "MAL"^^euvoc:FD_400, + ".my"^^euvoc:IANA_DOMAIN, + "MY"^^euvoc:ISG_COU, + "MY"^^euvoc:ISO_3166_1_ALPHA_2, + "MYS"^^euvoc:ISO_3166_1_ALPHA_3, + "458"^^euvoc:ISO_3166_1_NUM, + "MYS"^^euvoc:NAC, + "60"^^euvoc:PHONE_PREFIX, + "MY"^^euvoc:TED, + "MY"^^euvoc:TED_SCHEMA, + "MAL"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "458"^^euvoc:UNSD_M49 ; + skos:prefLabel "ماليزيا"@ar, + "Малайзия"@bg, + "Malàisia"@ca, + "Malajsie"@cs, + "Malaysia"@da, + "Malaysia"@de, + "Μαλαισία"@el, + "Malaysia"@en, + "Malasia"@es, + "Malaisia"@et, + "Malesia"@fi, + "Malaisie"@fr, + "An Mhalaeisia"@ga, + "Malezija"@hr, + "Malajzia"@hu, + "Malasía"@is, + "Malaysia"@it, + "マレーシア"@ja, + "Malaysia"@lb, + "Malaizija"@lt, + "Malaizija"@lv, + "Il-Malażja"@mt, + "Maleisië"@nl, + "Malaysia"@no, + "Malezja"@pl, + "Malásia"@pt, + "Malaysia"@ro, + "Малайзия"@ru, + "Malajzia"@sk, + "Malezija"@sl, + "Malaysia"@sv, + "Malezya"@tr, + "Малайзія"@uk, + "马来西亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "NAM" ; + at:deprecated "false" ; + at:op-code "NAM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "NA" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SWA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SWA" ; + dc:source "EurLex" ] ; + at:start.use "1990-03-21" ; + atold:op-code "NAM" ; + dc:identifier "NAM" ; + skos:altLabel "جمهورية ناميبيا"@ar, + "Република Намибия"@bg, + "República de Namíbia"@ca, + "Namibijská republika"@cs, + "Republikken Namibia"@da, + "Republik Namibia"@de, + "Δημοκρατία της Ναμίμπιας"@el, + "Republic of Namibia"@en, + "República de Namibia"@es, + "Namiibia Vabariik"@et, + "Namibian tasavalta"@fi, + "République de Namibie"@fr, + "Poblacht na Namaibe"@ga, + "Republika Namibija"@hr, + "Namíbiai Köztársaság"@hu, + "Lýðveldið Namibía"@is, + "Repubblica di Namibia"@it, + "ナミビア共和国"@ja, + "Republik Namibia"@lb, + "Namibijos Respublika"@lt, + "Namībijas Republika"@lv, + "Ir-Repubblika tan-Namibja"@mt, + "Republiek Namibië"@nl, + "Republikken Namibia"@no, + "Republika Namibii"@pl, + "República da Namíbia"@pt, + "Republica Namibia"@ro, + "Республика Намибия"@ru, + "Namíbijská republika"@sk, + "Republika Namibija"@sl, + "Republiken Namibia"@sv, + "Namibya Cumhuriyeti"@tr, + "Республіка Намібія"@uk, + "纳米比亚共和国"@zh ; + skos:hiddenLabel "Namíbie"@cs, + "Ναμίμπιας"@el, + "an Namaib"@ga, + "Namibijos"@lt, + "Namībijas"@lv, + "in-Namibja"@mt, + "ir-Repubblika tan-Namibja"@mt, + "namibijskie"@pl, + "Republliken Namibia"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "127"^^euvoc:EP, + "SWA"^^euvoc:FD_010, + "SWA"^^euvoc:FD_400, + ".na"^^euvoc:IANA_DOMAIN, + "NA"^^euvoc:ISG_COU, + "NA"^^euvoc:ISO_3166_1_ALPHA_2, + "NAM"^^euvoc:ISO_3166_1_ALPHA_3, + "516"^^euvoc:ISO_3166_1_NUM, + "NAM"^^euvoc:NAC, + "264"^^euvoc:PHONE_PREFIX, + "NA"^^euvoc:TED, + "NA"^^euvoc:TED_SCHEMA, + "Southern Africa"^^euvoc:UNSD_GEOSCHEME, + "516"^^euvoc:UNSD_M49 ; + skos:prefLabel "ناميبيا"@ar, + "Намибия"@bg, + "Namíbia"@ca, + "Namibie"@cs, + "Namibia"@da, + "Namibia"@de, + "Ναμίμπια"@el, + "Namibia"@en, + "Namibia"@es, + "Namiibia"@et, + "Namibia"@fi, + "Namibie"@fr, + "An Namaib"@ga, + "Namibija"@hr, + "Namíbia"@hu, + "Namibía"@is, + "Namibia"@it, + "ナミビア"@ja, + "Namibia"@lb, + "Namibija"@lt, + "Namībija"@lv, + "In-Namibja"@mt, + "Namibië"@nl, + "Namibia"@no, + "Namibia"@pl, + "Namíbia"@pt, + "Namibia"@ro, + "Намибия"@ru, + "Namíbia"@sk, + "Namibija"@sl, + "Namibia"@sv, + "Namibya"@tr, + "Намібія"@uk, + "纳米比亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "NCL" ; + at:deprecated "false" ; + at:op-code "NCL" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "NC" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "NC" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "NCL" ; + dc:identifier "NCL" ; + skos:altLabel "Ny Caledonia"@no, + "Nova Kaledónia"@sk ; + skos:broader ; + skos:changeNote "Wikipedia: New Caledonia is a ‘sui generis collectivity’ of France. The Noumea Accord signed May 5, 1998, set the groundwork for a 20-year transitional period that will gradually transfer competences to the local government."@en, + "Wikipedia: La Nouvelle Calédonie dispose d’un statut particulier de large autonomie sui generis ou «de son propre genre» instauré par l'accord de Nouméa 5.5.1998, différent des collectivités d’outre-mer COM. Un nouveau référendum local portant sur son indépendance ou son maintien au sein de la République française est prévu au cours de la quatrième mandature du Congrès, soit entre 2014 et 2018."@fr ; + skos:hiddenLabel "Νέας Καληδονίας"@el, + "ranskalainen, uusikaledonialainen"@fi, + "française"@fr, + "Nua-Chaladónach"@ga, + "an Nua-Chaladóin"@ga, + "novokaledonsko"@hr, + "Jaunkaledonijas"@lv, + "Caledonjana"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "221"^^euvoc:EP, + ".nc"^^euvoc:IANA_DOMAIN, + "NC"^^euvoc:ISG_COU, + "NC"^^euvoc:ISO_3166_1_ALPHA_2, + "NCL"^^euvoc:ISO_3166_1_ALPHA_3, + "540"^^euvoc:ISO_3166_1_NUM, + "NCL"^^euvoc:NAC, + "687"^^euvoc:PHONE_PREFIX, + "NC"^^euvoc:TED, + "NC"^^euvoc:TED_SCHEMA, + "Melanesia"^^euvoc:UNSD_GEOSCHEME, + "540"^^euvoc:UNSD_M49 ; + skos:prefLabel "كاليدونيا الجديدة"@ar, + "Нова Каледония"@bg, + "Nova Caledònia"@ca, + "Nová Kaledonie"@cs, + "Ny Kaledonien"@da, + "Neukaledonien"@de, + "Νέα Καληδονία"@el, + "New Caledonia"@en, + "Nueva Caledonia"@es, + "Uus-Kaledoonia"@et, + "Uusi-Kaledonia"@fi, + "Nouvelle-Calédonie"@fr, + "An Nua-Chaladóin"@ga, + "Nova Kaledonija"@hr, + "Új-Kaledónia"@hu, + "Nýja-Kaledónía"@is, + "Nuova Caledonia"@it, + "ニューカレドニア"@ja, + "Neikaledonien"@lb, + "Naujoji Kaledonija"@lt, + "Jaunkaledonija"@lv, + "New Caledonia"@mt, + "Nieuw-Caledonië"@nl, + "Ny-Caledonia"@no, + "Nowa Kaledonia"@pl, + "Nova Caledónia"@pt, + "Noua Caledonie"@ro, + "Новая Каледония"@ru, + "Nová Kaledónia"@sk, + "Nova Kaledonija"@sl, + "Nya Kaledonien"@sv, + "Yeni Kaledonya"@tr, + "Нова Каледонія"@uk, + "新喀里多尼亚"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "NER" ; + at:deprecated "false" ; + at:op-code "NER" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "NE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "NIG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "NIG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NE" ; + dc:source "TED" ] ; + at:start.use "1968-08-03" ; + atold:op-code "NER" ; + dc:identifier "NER" ; + skos:altLabel "جمهورية النيجر"@ar, + "Република Нигер"@bg, + "República del Níger"@ca, + "Nigerská republika"@cs, + "Republikken Niger"@da, + "Republik Niger"@de, + "Δημοκρατία του Νίγηρα"@el, + "Republic of Niger"@en, + "República de Níger"@es, + "Nigeri Vabariik"@et, + "Nigerin tasavalta"@fi, + "République du Niger"@fr, + "Poblacht na Nígire"@ga, + "Republika Niger"@hr, + "Nigeri Köztársaság"@hu, + "Lýðveldið Níger"@is, + "Repubblica del Niger"@it, + "ニジェール共和国"@ja, + "Republik Nigeria"@lb, + "Nigerio Respublika"@lt, + "Nigēras Republika"@lv, + "Ir-Repubblika tan-Niġer"@mt, + "Republiek Niger"@nl, + "Republikken Niger"@no, + "Republika Nigru"@pl, + "República do Níger"@pt, + "Republica Niger"@ro, + "Республика Нигер"@ru, + "Nigerská republika"@sk, + "Republika Niger"@sl, + "Republiken Niger"@sv, + "Nijer Cumhuriyeti"@tr, + "Республіка Нігер"@uk, + "尼日尔共和国"@zh ; + skos:hiddenLabel "Νίγηρα"@el, + "an Nígir"@ga, + "Nigerio"@lt, + "in-Niġer"@mt, + "ir-Repubblika tan-Niġer"@mt, + "Nigerese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "128"^^euvoc:EP, + "NIG"^^euvoc:FD_010, + "NIG"^^euvoc:FD_400, + ".ne"^^euvoc:IANA_DOMAIN, + "NE"^^euvoc:ISG_COU, + "NE"^^euvoc:ISO_3166_1_ALPHA_2, + "NER"^^euvoc:ISO_3166_1_ALPHA_3, + "562"^^euvoc:ISO_3166_1_NUM, + "NER"^^euvoc:NAC, + "227"^^euvoc:PHONE_PREFIX, + "NE"^^euvoc:TED, + "NE"^^euvoc:TED_SCHEMA, + "RN"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "562"^^euvoc:UNSD_M49 ; + skos:prefLabel "النيجر"@ar, + "Нигер"@bg, + "Níger"@ca, + "Niger"@cs, + "Niger"@da, + "Niger"@de, + "Νίγηρας"@el, + "Niger"@en, + "Níger"@es, + "Niger"@et, + "Niger"@fi, + "Niger"@fr, + "An Nígir"@ga, + "Niger"@hr, + "Niger"@hu, + "Níger"@is, + "Niger"@it, + "ニジェール"@ja, + "Niger"@lb, + "Nigeris"@lt, + "Nigēra"@lv, + "In-Niġer"@mt, + "Niger"@nl, + "Niger"@no, + "Niger"@pl, + "Níger"@pt, + "Niger"@ro, + "Нигер"@ru, + "Niger"@sk, + "Niger"@sl, + "Niger"@sv, + "Nijer"@tr, + "Нігер"@uk, + "尼日尔"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "NGA" ; + at:deprecated "false" ; + at:op-code "NGA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "NG" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "WAN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "WAN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NG" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1960-10-01" ; + atold:op-code "NGA" ; + dc:identifier "NGA" ; + skos:altLabel "جمهورية نيجيريا الاتحادية"@ar, + "Федерална република Нигерия"@bg, + "República Federal de Nigèria"@ca, + "Nigerijská federativní republika"@cs, + "Forbundsrepublikken Nigeria"@da, + "Bundesrepublik Nigeria"@de, + "Ομοσπονδιακή Δημοκρατία της Νιγηρίας"@el, + "Federal Republic of Nigeria"@en, + "República Federal de Nigeria"@es, + "Nigeeria Liitvabariik"@et, + "Nigerian liittotasavalta"@fi, + "République fédérale du Nigeria"@fr, + "Poblacht Chónaidhme na Nigéire"@ga, + "Savezna Republika Nigerija"@hr, + "Nigériai Szövetségi Köztársaság"@hu, + "Sambandslýðveldið Nígería"@is, + "Repubblica federale della Nigeria"@it, + "ナイジェリア連邦共和国"@ja, + "Bundesrepublik Nigeria"@lb, + "Nigerijos Federacinė Respublika"@lt, + "Nigērijas Federatīvā Republika"@lv, + "Ir-Repubblika Federali tan-Niġerja"@mt, + "Federale Republiek Nigeria"@nl, + "Forbundsrepublikken Nigeria"@no, + "Federalna Republika Nigerii"@pl, + "República Federal da Nigéria"@pt, + "Republica Federală Nigeria"@ro, + "Федеративная Республика Нигерия"@ru, + "Nigérijská federatívna republika"@sk, + "Zvezna republika Nigerija"@sl, + "Förbundsrepubliken Nigeria"@sv, + "Nijerya Federal Cumhuriyeti"@tr, + "Федеративна Республіка Нігерія"@uk, + "尼日利亚联邦共和国"@zh ; + skos:hiddenLabel "Νιγηρίας"@el, + "Nigéria"@fr, + "République fédérale du Nigéria"@fr, + "an Nigéir"@ga, + "Nigerijos"@lt, + "in-Niġerja"@mt, + "ir-Repubblika Federali tan-Niġerja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "130"^^euvoc:EP, + "WAN"^^euvoc:FD_010, + "WAN"^^euvoc:FD_400, + ".ng"^^euvoc:IANA_DOMAIN, + "NG"^^euvoc:ISG_COU, + "NG"^^euvoc:ISO_3166_1_ALPHA_2, + "NGA"^^euvoc:ISO_3166_1_ALPHA_3, + "566"^^euvoc:ISO_3166_1_NUM, + "NGA"^^euvoc:NAC, + "234"^^euvoc:PHONE_PREFIX, + "NG"^^euvoc:TED, + "NG"^^euvoc:TED_SCHEMA, + "WAN"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "566"^^euvoc:UNSD_M49 ; + skos:prefLabel "نيجيريا"@ar, + "Нигерия"@bg, + "Nigèria"@ca, + "Nigérie"@cs, + "Nigeria"@da, + "Nigeria"@de, + "Νιγηρία"@el, + "Nigeria"@en, + "Nigeria"@es, + "Nigeeria"@et, + "Nigeria"@fi, + "Nigeria"@fr, + "An Nigéir"@ga, + "Nigerija"@hr, + "Nigéria"@hu, + "Nígería"@is, + "Nigeria"@it, + "ナイジェリア"@ja, + "Nigeria"@lb, + "Nigerija"@lt, + "Nigērija"@lv, + "In-Niġerja"@mt, + "Nigeria"@nl, + "Nigeria"@no, + "Nigeria"@pl, + "Nigéria"@pt, + "Nigeria"@ro, + "Нигерия"@ru, + "Nigéria"@sk, + "Nigerija"@sl, + "Nigeria"@sv, + "Nijerya"@tr, + "Нігерія"@uk, + "尼日利亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "NIC" ; + at:deprecated "false" ; + at:op-code "NIC" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "NIC" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NI" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "NI" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "NIC" ; + dc:identifier "NIC" ; + skos:altLabel "جمهورية نيكاراغوا"@ar, + "Република Никарагуа"@bg, + "República de Nicaragua"@ca, + "Nikaragujská republika"@cs, + "Republikken Nicaragua"@da, + "Republik Nicaragua"@de, + "Δημοκρατία της Νικαράγουας"@el, + "Republic of Nicaragua"@en, + "República de Nicaragua"@es, + "Nicaragua Vabariik"@et, + "Nicaraguan tasavalta"@fi, + "République du Nicaragua"@fr, + "Poblacht Nicearagua"@ga, + "Republika Nikaragva"@hr, + "Nicaraguai Köztársaság"@hu, + "Lýðveldið Níkaragva"@is, + "Repubblica di Nicaragua"@it, + "ニカラグア共和国"@ja, + "Republik Nicaragua"@lb, + "Nikaragvos Respublika"@lt, + "Nikaragvas Republika"@lv, + "Ir-Repubblika tan-Nikaragwa"@mt, + "Republiek Nicaragua"@nl, + "Republikken Nicaragua"@no, + "Republika Nikaragui"@pl, + "República da Nicarágua"@pt, + "Republica Nicaragua"@ro, + "Республика Никарагуа"@ru, + "Nikaragujská republika"@sk, + "Republika Nikaragva"@sl, + "Republiken Nicaragua"@sv, + "Nikaragua Cumhuriyeti"@tr, + "Республіка Нікарагуа"@uk, + "尼加拉瓜共和国"@zh ; + skos:hiddenLabel "Νικαράγουας"@el, + "nicaraguense, nicaraguegna"@it, + "Nikaragvos"@lt, + "Nikaragvas"@lv, + "in-Nikaragwa"@mt, + "ir-Repubblika tan-Nikaragwa"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "246"^^euvoc:EP, + "NIC"^^euvoc:FD_010, + ".ni"^^euvoc:IANA_DOMAIN, + "NI"^^euvoc:ISG_COU, + "NI"^^euvoc:ISO_3166_1_ALPHA_2, + "NIC"^^euvoc:ISO_3166_1_ALPHA_3, + "558"^^euvoc:ISO_3166_1_NUM, + "NIC"^^euvoc:NAC, + "505"^^euvoc:PHONE_PREFIX, + "NI"^^euvoc:TED, + "NI"^^euvoc:TED_SCHEMA, + "NIC"^^euvoc:TIR, + "Central America"^^euvoc:UNSD_GEOSCHEME, + "558"^^euvoc:UNSD_M49 ; + skos:prefLabel "نيكاراغوا"@ar, + "Никарагуа"@bg, + "Nicaragua"@ca, + "Nikaragua"@cs, + "Nicaragua"@da, + "Nicaragua"@de, + "Νικαράγουα"@el, + "Nicaragua"@en, + "Nicaragua"@es, + "Nicaragua"@et, + "Nicaragua"@fi, + "Nicaragua"@fr, + "Nicearagua"@ga, + "Nikaragva"@hr, + "Nicaragua"@hu, + "Níkaragva"@is, + "Nicaragua"@it, + "ニカラグア"@ja, + "Nicaragua"@lb, + "Nikaragva"@lt, + "Nikaragva"@lv, + "In-Nikaragwa"@mt, + "Nicaragua"@nl, + "Nicaragua"@no, + "Nikaragua"@pl, + "Nicarágua"@pt, + "Nicaragua"@ro, + "Никарагуа"@ru, + "Nikaragua"@sk, + "Nikaragva"@sl, + "Nicaragua"@sv, + "Nikaragua"@tr, + "Нікарагуа"@uk, + "尼加拉瓜"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "NPL" ; + at:deprecated "false" ; + at:op-code "NPL" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "NP" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "NP" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NP" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "NP" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "NPL" ; + dc:identifier "NPL" ; + skos:altLabel "नेपाल"@ne ; + skos:hiddenLabel "Königreich Nepal"@de, + "Βασίλειο του Νεπάλ"@el, + "Kingdom of Nepal"@en, + "Ríocht Neipeal"@ga, + "Kraljevina Nepal"@hr, + "Nepalo"@lt, + "Nepālas"@lv, + "Nepālas Karaliste"@lv, + "in-Nepal"@mt, + "Nepalese"@nl, + "Kraljevina Nepal"@sl ; + skos:historyNote "Pursuant to the note verbale dated 16 November 2020 from the Permanent Mission of Nepal addressed to the United Nations and all permanent and observer missions, the country name was changed from ‘Federal Democratic Republic of Nepal’ to ‘Nepal’. Effective date: 14 December 2020 (date of communication from the Protocol and Liaison Service)."@en, + "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "133"^^euvoc:EP, + "NP"^^euvoc:FD_010, + "NP"^^euvoc:FD_400, + ".np"^^euvoc:IANA_DOMAIN, + "NP"^^euvoc:ISG_COU, + "NP"^^euvoc:ISO_3166_1_ALPHA_2, + "NPL"^^euvoc:ISO_3166_1_ALPHA_3, + "NPL"^^euvoc:NAC, + "977"^^euvoc:PHONE_PREFIX, + "NP"^^euvoc:TED, + "NP"^^euvoc:TED_SCHEMA, + "NEP"^^euvoc:TIR, + "Southern Asia"^^euvoc:UNSD_GEOSCHEME, + "524"^^euvoc:UNSD_M49 ; + skos:prefLabel "نيبال"@ar, + "Непал"@bg, + "Nepal"@ca, + "Nepál"@cs, + "Nepal"@da, + "Nepal"@de, + "Νεπάλ"@el, + "Nepal"@en, + "Nepal"@es, + "Nepal"@et, + "Nepal"@fi, + "Népal"@fr, + "Neipeal"@ga, + "Nepal"@hr, + "Nepál"@hu, + "Nepal"@is, + "Nepal"@it, + "ネパール"@ja, + "Nepal"@lb, + "Nepalas"@lt, + "Nepāla"@lv, + "In-Nepal"@mt, + "Nepal"@nl, + "Nepal"@no, + "Nepal"@pl, + "Nepal"@pt, + "Nepal"@ro, + "Непал"@ru, + "Nepál"@sk, + "Nepal"@sl, + "Nepal"@sv, + "Nepal"@tr, + "Непал"@uk, + "尼泊尔"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "NRU" ; + at:deprecated "false" ; + at:op-code "NRU" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "NR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "NU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "NU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NR" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1968-01-31" ; + atold:op-code "NRU" ; + dc:identifier "NRU" ; + skos:altLabel "جمهورية ناورو"@ar, + "Република Науру"@bg, + "República de Nauru"@ca, + "Republika Nauru"@cs, + "Republikken Nauru"@da, + "Republik Nauru"@de, + "Δημοκρατία του Ναούρου"@el, + "Pleasant Island"@en, + "Republic of Nauru"@en, + "República de Nauru"@es, + "Nauru Vabariik"@et, + "Naurun tasavalta"@fi, + "République de Nauru"@fr, + "Poblacht Nárú"@ga, + "Republika Nauru"@hr, + "Naurui Köztársaság"@hu, + "Lýðveldið Naúrú"@is, + "Repubblica di Nauru"@it, + "ナウル共和国"@ja, + "Republik Nauru"@lb, + "Nauru Respublika"@lt, + "Nauru Republika"@lv, + "Ir-Repubblika ta’ Nauru"@mt, + "Naoero"@na, + "Republiek Nauru"@nl, + "Republikken Nauru"@no, + "Republika Nauru"@pl, + "República de Nauru"@pt, + "Republica Nauru"@ro, + "Республика Науру"@ru, + "Nauruská republika"@sk, + "Republika Nauru"@sl, + "Republiken Nauru"@sv, + "Nauru Cumhuriyeti"@tr, + "Республіка Науру"@uk, + "瑙鲁共和国"@zh ; + skos:hiddenLabel "Δημοκρατία του Ναουρού"@el, + "Ναουρού"@el, + "Naurua"@hr, + "ir-Repubblika ta' Nauru"@mt, + "Republliken Nauru"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "135"^^euvoc:EP, + "NU"^^euvoc:FD_010, + "NU"^^euvoc:FD_400, + ".nr"^^euvoc:IANA_DOMAIN, + "NR"^^euvoc:ISG_COU, + "NR"^^euvoc:ISO_3166_1_ALPHA_2, + "NRU"^^euvoc:ISO_3166_1_ALPHA_3, + "520"^^euvoc:ISO_3166_1_NUM, + "NRU"^^euvoc:NAC, + "674"^^euvoc:PHONE_PREFIX, + "NR"^^euvoc:TED, + "NR"^^euvoc:TED_SCHEMA, + "NAU"^^euvoc:TIR, + "Micronesia"^^euvoc:UNSD_GEOSCHEME, + "520"^^euvoc:UNSD_M49 ; + skos:prefLabel "ناورو"@ar, + "Науру"@bg, + "Nauru"@ca, + "Nauru"@cs, + "Nauru"@da, + "Nauru"@de, + "Ναούρου"@el, + "Nauru"@en, + "Nauru"@es, + "Nauru"@et, + "Nauru"@fi, + "Nauru"@fr, + "Nárú"@ga, + "Nauru"@hr, + "Nauru"@hu, + "Naúrú"@is, + "Nauru"@it, + "ナウル"@ja, + "Nauru"@lb, + "Nauru"@lt, + "Nauru"@lv, + "Nauru"@mt, + "Nauru"@nl, + "Nauru"@no, + "Nauru"@pl, + "Nauru"@pt, + "Nauru"@ro, + "Науру"@ru, + "Nauru"@sk, + "Nauru"@sl, + "Nauru"@sv, + "Nauru"@tr, + "Науру"@uk, + "瑙鲁"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "OMN" ; + at:deprecated "false" ; + at:op-code "OMN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "AO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "OM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "AO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "OM" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "OMN" ; + dc:identifier "OMN" ; + skos:altLabel "سلطنة عمان"@ar, + "Султанат Оман"@bg, + "Sultanat d'Oman"@ca, + "Sultanát Omán"@cs, + "Sultanatet Oman"@da, + "Magan"@de, + "Sultanat Oman"@de, + "Σουλτανάτο του Ομάν"@el, + "Magan"@en, + "Sultanate of Oman"@en, + "Sultanato de Omán"@es, + "Omaani Sultaniriik"@et, + "Omanin sulttaanikunta"@fi, + "Magan"@fr, + "Sultanat d’Oman"@fr, + "Sabhdánacht Óman"@ga, + "Sultanat Oman"@hr, + "Ománi Szultánság"@hu, + "Soldánsveldið Óman"@is, + "Sultanato dell’Oman"@it, + "オマーン国"@ja, + "Sultanat Oman"@lb, + "Omano Sultonatas"@lt, + "Omānas Sultanāts"@lv, + "Is-Saltna tal-Oman"@mt, + "Sultanaat Oman"@nl, + "Sultanatet Oman"@no, + "Sułtanat Omanu"@pl, + "Sultanado de Omã"@pt, + "Sultanatul Oman"@ro, + "Султанат Оман"@ru, + "Ománsky sultanát"@sk, + "Sultanat Oman"@sl, + "Sultanatet Oman"@sv, + "Umman Sultanlığı"@tr, + "Султанат Оман"@uk, + "阿曼苏丹国"@zh ; + skos:hiddenLabel "Sultanat d'Oman"@fr, + "Omano"@lt, + "Omānas"@lv, + "Omanija"@mt, + "is-Saltna tal-Oman"@mt, + "l-Oman"@mt, + "omańskie"@pl, + "Sultanato de Omã"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "247"^^euvoc:EP, + "AO"^^euvoc:FD_010, + "AO"^^euvoc:FD_400, + ".om"^^euvoc:IANA_DOMAIN, + "OM"^^euvoc:ISG_COU, + "OM"^^euvoc:ISO_3166_1_ALPHA_2, + "OMN"^^euvoc:ISO_3166_1_ALPHA_3, + "512"^^euvoc:ISO_3166_1_NUM, + "OMN"^^euvoc:NAC, + "968"^^euvoc:PHONE_PREFIX, + "OM"^^euvoc:TED, + "OM"^^euvoc:TED_SCHEMA, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "512"^^euvoc:UNSD_M49 ; + skos:prefLabel "عمان"@ar, + "Оман"@bg, + "Oman"@ca, + "Omán"@cs, + "Oman"@da, + "Oman"@de, + "Ομάν"@el, + "Oman"@en, + "Omán"@es, + "Omaan"@et, + "Oman"@fi, + "Oman"@fr, + "Óman"@ga, + "Oman"@hr, + "Omán"@hu, + "Óman"@is, + "Oman"@it, + "オマーン"@ja, + "Oman"@lb, + "Omanas"@lt, + "Omāna"@lv, + "L-Oman"@mt, + "Oman"@nl, + "Oman"@no, + "Oman"@pl, + "Omã"@pt, + "Oman"@ro, + "Оман"@ru, + "Omán"@sk, + "Oman"@sl, + "Oman"@sv, + "Umman"@tr, + "Оман"@uk, + "阿曼"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PAK" ; + at:deprecated "false" ; + at:op-code "PAK" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "PK" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "PK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PK" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "PAK" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "PAK" ; + dc:identifier "PAK" ; + skos:altLabel "جمهورية باكستان الإسلامية"@ar, + "Ислямска република Пакистан"@bg, + "República Islàmica de Pakistan"@ca, + "Pákistánská islámská republika"@cs, + "Den Islamiske Republik Pakistan"@da, + "Islamische Republik Pakistan"@de, + "Ισλαμική Δημοκρατία του Πακιστάν"@el, + "Islamic Republic of Pakistan"@en, + "República Islámica de Pakistán"@es, + "Pakistani Islamivabariik"@et, + "Pakistanin islamilainen tasavalta"@fi, + "République islamique du Pakistan"@fr, + "Poblacht Ioslamach na Pacastáine"@ga, + "Islamska Republika Pakistan"@hr, + "Pakisztáni Iszlám Köztársaság"@hu, + "Íslamska lýðveldið Pakistan"@is, + "Repubblica islamica del Pakistan"@it, + "パキスタン・イスラム共和国"@ja, + "Islamesch Republik Pakistan"@lb, + "Pakistano Islamo Respublika"@lt, + "Pakistānas Islāma Republika"@lv, + "Ir-Repubblika Iżlamika tal-Pakistan"@mt, + "Islamitische Republiek Pakistan"@nl, + "Den islamske republikken Pakistan"@no, + "Islamska Republika Pakistanu"@pl, + "República Islâmica do Paquistão"@pt, + "Republica Islamică Pakistan"@ro, + "Исламская Республика Пакистан"@ru, + "Pakistanská islamská republika"@sk, + "Islamska republika Pakistan"@sl, + "Islamiska republiken Pakistan"@sv, + "Pakistan İslam Cumhuriyeti"@tr, + "Ісламська Республіка Пакистан"@uk, + "پاكستان"@ur, + "巴基斯坦伊斯兰共和国"@zh ; + skos:hiddenLabel "République islamique de Pakistan"@fr, + "an Phacastáin"@ga, + "Pakistano"@lt, + "Pakistānas"@lv, + "il-Pakistan"@mt, + "ir-Repubblika Iżlamika tal-Pakistan"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "144"^^euvoc:EP, + "PAK"^^euvoc:FD_010, + "PK"^^euvoc:FD_140, + ".pk"^^euvoc:IANA_DOMAIN, + "PK"^^euvoc:IBAN_COU, + "PK"^^euvoc:ISG_COU, + "PK"^^euvoc:ISO_3166_1_ALPHA_2, + "PAK"^^euvoc:ISO_3166_1_ALPHA_3, + "586"^^euvoc:ISO_3166_1_NUM, + "PAK"^^euvoc:NAC, + "92"^^euvoc:PHONE_PREFIX, + "PK"^^euvoc:TED, + "PK"^^euvoc:TED_SCHEMA, + "Southern Asia"^^euvoc:UNSD_GEOSCHEME, + "586"^^euvoc:UNSD_M49 ; + skos:prefLabel "باكستان"@ar, + "Пакистан"@bg, + "Pakistan"@ca, + "Pákistán"@cs, + "Pakistan"@da, + "Pakistan"@de, + "Πακιστάν"@el, + "Pakistan"@en, + "Pakistán"@es, + "Pakistan"@et, + "Pakistan"@fi, + "Pakistan"@fr, + "An Phacastáin"@ga, + "Pakistan"@hr, + "Pakisztán"@hu, + "Pakistan"@is, + "Pakistan"@it, + "パキスタン"@ja, + "Pakistan"@lb, + "Pakistanas"@lt, + "Pakistāna"@lv, + "Il-Pakistan"@mt, + "Pakistan"@nl, + "Pakistan"@no, + "Pakistan"@pl, + "Paquistão"@pt, + "Pakistan"@ro, + "Пакистан"@ru, + "Pakistan"@sk, + "Pakistan"@sl, + "Pakistan"@sv, + "Pakistan"@tr, + "Пакистан"@uk, + "巴基斯坦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PAN" ; + at:deprecated "false" ; + at:op-code "PAN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "PA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "PA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "PA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PA" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "PAN" ; + dc:identifier "PAN" ; + skos:altLabel "جمهورية بنما"@ar, + "Република Панама"@bg, + "República de Panamà"@ca, + "Panamská republika"@cs, + "Republikken Panama"@da, + "Republik Panama"@de, + "Δημοκρατία του Παναμά"@el, + "Republic of Panama"@en, + "República de Panamá"@es, + "Panama Vabariik"@et, + "Panaman tasavalta"@fi, + "République du Panama"@fr, + "Poblacht Phanama"@ga, + "Republika Panama"@hr, + "Panamai Köztársaság"@hu, + "Lýðveldið Panama"@is, + "Repubblica del Panama"@it, + "Repubblica di Panama"@it, + "パナマ共和国"@ja, + "Republik Panama"@lb, + "Panamos Respublika"@lt, + "Panamas Republika"@lv, + "Ir-Repubblika tal-Panama"@mt, + "Republiek Panama"@nl, + "Republikken Panama"@no, + "Republika Panamy"@pl, + "República do Panamá"@pt, + "Republica Panama"@ro, + "Республика Панама"@ru, + "Panamská republika"@sk, + "Republika Panama"@sl, + "Republiken Panama"@sv, + "Panama Cumhuriyeti"@tr, + "Республіка Панама"@uk, + "巴拿马共和国"@zh ; + skos:hiddenLabel "Παναμά"@el, + "Panamos"@lt, + "Panamas"@lv, + "il-Panama"@mt, + "ir-Repubblika tal-Panama"@mt, + "Panamese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "139"^^euvoc:EP, + "266"^^euvoc:EP, + "PA"^^euvoc:FD_010, + "PA"^^euvoc:FD_140, + "PA"^^euvoc:FD_400, + ".pa"^^euvoc:IANA_DOMAIN, + "PA"^^euvoc:ISG_COU, + "PA"^^euvoc:ISO_3166_1_ALPHA_2, + "PAN"^^euvoc:ISO_3166_1_ALPHA_3, + "591"^^euvoc:ISO_3166_1_NUM, + "PAN"^^euvoc:NAC, + "507"^^euvoc:PHONE_PREFIX, + "PA"^^euvoc:TED, + "PA"^^euvoc:TED_SCHEMA, + "PA"^^euvoc:TIR, + "Central America"^^euvoc:UNSD_GEOSCHEME, + "591"^^euvoc:UNSD_M49 ; + skos:prefLabel "بنما"@ar, + "Панама"@bg, + "Panamà"@ca, + "Panama"@cs, + "Panama"@da, + "Panama"@de, + "Παναμάς"@el, + "Panama"@en, + "Panamá"@es, + "Panama"@et, + "Panama"@fi, + "Panama"@fr, + "Panama"@ga, + "Panama"@hr, + "Panama"@hu, + "Panama"@is, + "Panama"@it, + "パナマ"@ja, + "Panama"@lb, + "Panama"@lt, + "Panama"@lv, + "Il-Panama"@mt, + "Panama"@nl, + "Panama"@no, + "Panama"@pl, + "Panamá"@pt, + "Panama"@ro, + "Панама"@ru, + "Panama"@sk, + "Panama"@sl, + "Panama"@sv, + "Panama"@tr, + "Панама"@uk, + "巴拿马"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PCN" ; + at:deprecated "false" ; + at:op-code "PCN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "PN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "PN" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "PCN" ; + dc:identifier "PCN" ; + skos:altLabel "Pitcairnovy ostrovy"@cs, + "Pitcairn, Henderson, Ducie and Oeno Islands"@en, + "Pitcairn ja sõltkonnad"@et, + "Pitkerno Salos"@lt, + "Pitkērnas salas"@lv, + "Pitcairnøyene"@no, + "Pitkern Ailen"@pih, + "Wyspy Pitcairn"@pl ; + skos:broader ; + skos:hiddenLabel "Острови Питкерн"@bg, + "Νήσοι Πίτκερν"@el, + "Νήσων Πίτκερν"@el, + "britannialainen, pitcairnilainen"@fi, + "pitcairnaise"@fr, + "Oileán Pitcairn"@ga, + "duine ó Oileáin Pitcairn"@ga, + "Otoka Pitcairn"@hr, + "Pitkerno"@lt, + "il-Gżejjer Pitcairn"@mt, + "Pitcairnu"@pl, + "Wyspy Pitcairn, Henderson, Ducie i Oeno"@pl, + "Ilhas Pitcairn"@pt, + "pitcairnesa"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "146"^^euvoc:EP, + ".pn"^^euvoc:IANA_DOMAIN, + "PN"^^euvoc:ISG_COU, + "PN"^^euvoc:ISO_3166_1_ALPHA_2, + "PCN"^^euvoc:ISO_3166_1_ALPHA_3, + "612"^^euvoc:ISO_3166_1_NUM, + "PCN"^^euvoc:NAC, + "67"^^euvoc:PHONE_PREFIX, + "PN"^^euvoc:TED, + "PN"^^euvoc:TED_SCHEMA, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "612"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر بيتكيرن"@ar, + "Oстрови Питкерн"@bg, + "Pitcairn"@ca, + "Pitcairn"@cs, + "Pitcairn"@da, + "Pitcairninseln"@de, + "Νήσοι Πίτκαιρν"@el, + "Pitcairn Islands"@en, + "Islas Pitcairn"@es, + "Pitcairn"@et, + "Pitcairn"@fi, + "Îles Pitcairn"@fr, + "Oileáin Pitcairn"@ga, + "Otoci Pitcairn"@hr, + "Pitcairn-szigetek"@hu, + "Pitcairn"@is, + "Isole Pitcairn"@it, + "ピトケアン諸島"@ja, + "Pitcairninselen"@lb, + "Pitkernas"@lt, + "Pitkērna"@lv, + "Il-Gżejjer Pitcairn"@mt, + "Pitcairneilanden"@nl, + "Pitcairn"@no, + "Pitcairn"@pl, + "Pitcairn"@pt, + "Insulele Pitcairn"@ro, + "Острова Питкерн"@ru, + "Pitcairnove ostrovy"@sk, + "Pitcairn"@sl, + "Pitcairnöarna"@sv, + "Pitcairn Adaları"@tr, + "Острови Піткерн"@uk, + "皮特凯恩群岛"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "PER" ; + at:deprecated "false" ; + at:op-code "PER" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "PE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "PEROU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "PE" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "PER" ; + dc:identifier "PER" ; + skos:altLabel "جمهورية بيرو"@ar, + "Piruw"@ay, + "Република Перу"@bg, + "República del Perú"@ca, + "Peruánská republika"@cs, + "Republikken Peru"@da, + "Republik Peru"@de, + "Δημοκρατία του Περού"@el, + "Republic of Peru"@en, + "República del Perú"@es, + "Peruu Vabariik"@et, + "Perun tasavalta"@fi, + "République du Pérou"@fr, + "Poblacht Pheiriú"@ga, + "Republika Peru"@hr, + "Perui Köztársaság"@hu, + "Lýðveldið Perú"@is, + "Repubblica del Perù"@it, + "ペルー共和国"@ja, + "Republik Peru"@lb, + "Peru Respublika"@lt, + "Peru Republika"@lv, + "Ir-Repubblika tal-Perù"@mt, + "Republiek Peru"@nl, + "Republikken Peru"@no, + "Republika Peru"@pl, + "República do Peru"@pt, + "Piruw"@qu, + "Republica Peru"@ro, + "Республика Перу"@ru, + "Peruánska republika"@sk, + "Republika Peru"@sl, + "Republiken Peru"@sv, + "Peru Cumhuriyeti"@tr, + "Республіка Перу"@uk, + "秘鲁共和国"@zh ; + skos:hiddenLabel "Republikken Peur"@da, + "Perú"@it, + "Repubblica del Perú"@it, + "preuviana"@it, + "il-Perù"@mt, + "ir-Repubblika tal-Perù"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "141"^^euvoc:EP, + "PEROU"^^euvoc:FD_010, + "PE"^^euvoc:FD_400, + ".pe"^^euvoc:IANA_DOMAIN, + "PE"^^euvoc:ISG_COU, + "PE"^^euvoc:ISO_3166_1_ALPHA_2, + "PER"^^euvoc:ISO_3166_1_ALPHA_3, + "604"^^euvoc:ISO_3166_1_NUM, + "PER"^^euvoc:NAC, + "51"^^euvoc:PHONE_PREFIX, + "PE"^^euvoc:TED, + "PE"^^euvoc:TED_SCHEMA, + "PE"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "604"^^euvoc:UNSD_M49 ; + skos:prefLabel "بيرو"@ar, + "Перу"@bg, + "Perú"@ca, + "Peru"@cs, + "Peru"@da, + "Peru"@de, + "Περού"@el, + "Peru"@en, + "Perú"@es, + "Peruu"@et, + "Peru"@fi, + "Pérou"@fr, + "Peiriú"@ga, + "Peru"@hr, + "Peru"@hu, + "Perú"@is, + "Perù"@it, + "ペルー"@ja, + "Peru"@lb, + "Peru"@lt, + "Peru"@lv, + "Il-Perù"@mt, + "Peru"@nl, + "Peru"@no, + "Peru"@pl, + "Peru"@pt, + "Peru"@ro, + "Перу"@ru, + "Peru"@sk, + "Peru"@sl, + "Peru"@sv, + "Peru"@tr, + "Перу"@uk, + "秘鲁"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PHL" ; + at:deprecated "false" ; + at:op-code "PHL" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "PH" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RP" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PH" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RP" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "PH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "RP" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "PHL" ; + dc:identifier "PHL" ; + skos:altLabel "جمهورية الفلبين"@ar, + "Република Филипини"@bg, + "República de les Filipines"@ca, + "Filipínská republika"@cs, + "Republikken Filippinerne"@da, + "Republik der Philippinen"@de, + "Δημοκρατία των Φιλιππινών"@el, + "Republic of the Philippines"@en, + "República de Filipinas"@es, + "Filipiini Vabariik"@et, + "Filippiinien tasavalta"@fi, + "Pilipinas"@fil, + "République des Philippines"@fr, + "Poblacht na nOileán Filipíneach"@ga, + "Republika Filipini"@hr, + "Fülöp-szigeteki Köztársaság"@hu, + "Lýðveldið Filippseyjar"@is, + "Repubblica delle Filippine"@it, + "フィリピン共和国"@ja, + "Republik vun de Philipinnen"@lb, + "Filipinų Respublika"@lt, + "Filipīnu Republika"@lv, + "Ir-Repubblika tal-Filippini"@mt, + "Republiek der Filipijnen"@nl, + "Republikken Filippinene"@no, + "Republika Filipin"@pl, + "República das Filipinas"@pt, + "Republica Filipine"@ro, + "Республика Филиппины"@ru, + "Filipínska republika"@sk, + "Republika Filipini"@sl, + "Republiken Filippinerna"@sv, + "Filipinler Cumhuriyeti"@tr, + "Республіка Філіппіни"@uk, + "菲律宾共和国"@zh ; + skos:hiddenLabel "na hOileáin Fhilipíneacha"@ga, + "Filipinų"@lt, + "Filipīnu"@lv, + "il-Filippini"@mt, + "ir-Repubblika tal-Filippini"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "222"^^euvoc:EP, + "RP"^^euvoc:FD_010, + "PH"^^euvoc:FD_140, + "RP"^^euvoc:FD_140, + "RP"^^euvoc:FD_400, + ".ph"^^euvoc:IANA_DOMAIN, + "PH"^^euvoc:ISG_COU, + "PH"^^euvoc:ISO_3166_1_ALPHA_2, + "PHL"^^euvoc:ISO_3166_1_ALPHA_3, + "608"^^euvoc:ISO_3166_1_NUM, + "PHL"^^euvoc:NAC, + "63"^^euvoc:PHONE_PREFIX, + "PH"^^euvoc:TED, + "PH"^^euvoc:TED_SCHEMA, + "RP"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "608"^^euvoc:UNSD_M49 ; + skos:prefLabel "الفلبين"@ar, + "Филипини"@bg, + "Filipines"@ca, + "Filipíny"@cs, + "Filippinerne"@da, + "Philippinen"@de, + "Φιλιππίνες"@el, + "Philippines"@en, + "Filipinas"@es, + "Filipiinid"@et, + "Filippiinit"@fi, + "Philippines"@fr, + "Na hOileáin Fhilipíneacha"@ga, + "Filipini"@hr, + "Fülöp-szigetek"@hu, + "Filippseyjar"@is, + "Filippine"@it, + "フィリピン"@ja, + "Philippinnen"@lb, + "Filipinai"@lt, + "Filipīnas"@lv, + "Il-Filippini"@mt, + "Filipijnen"@nl, + "Filippinene"@no, + "Filipiny"@pl, + "Filipinas"@pt, + "Filipine"@ro, + "Филиппины"@ru, + "Filipíny"@sk, + "Filipini"@sl, + "Filippinerna"@sv, + "Filipinler"@tr, + "Філіппіни"@uk, + "菲律宾"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PLW" ; + at:deprecated "false" ; + at:op-code "PLW" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "PW" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "PLW" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PW" ; + dc:source "TED" ] ; + at:start.use "1994-10-01" ; + atold:op-code "PLW" ; + dc:identifier "PLW" ; + skos:altLabel "جمهورية بالاو"@ar, + "Република Палау"@bg, + "República de Palau"@ca, + "Republika Palau"@cs, + "Republikken Palau"@da, + "Republik Palau"@de, + "Δημοκρατία του Παλάου"@el, + "Republic of Palau"@en, + "República de Palaos"@es, + "Belau Vabariik"@et, + "Palaun tasavalta"@fi, + "Palau"@fr, + "République de Palau"@fr, + "République des Palaos"@fr, + "Poblacht Oileáin Palau"@ga, + "Republika Palau"@hr, + "Palaui Köztársaság"@hu, + "Lýðveldið Palaú"@is, + "Repubblica di Palau"@it, + "パラオ共和国"@ja, + "Republik Palau"@lb, + "Palau Respublika"@lt, + "Palau Republika"@lv, + "Ir-Repubblika ta’ Palau"@mt, + "Republiek Palau"@nl, + "Republikken Palau"@no, + "Belau"@pau, + "Republika Palau"@pl, + "República de Palau"@pt, + "Republica Palau"@ro, + "Республика Палау"@ru, + "Palauská republika"@sk, + "Republika Palav"@sl, + "Republiken Palau"@sv, + "Palau Cumhuriyeti"@tr, + "Республіка Палау"@uk, + "帕劳共和国"@zh ; + skos:hiddenLabel "Δημοκρατίας του Παλάου"@el, + "palaosienne"@fr, + "duine ó Oileáin Palau"@ga, + "Palaua"@hr, + "ir-Repubblika ta' Palau"@mt, + "palauskie"@pl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "149"^^euvoc:EP, + "PLW"^^euvoc:FD_010, + ".pw"^^euvoc:IANA_DOMAIN, + "PW"^^euvoc:ISG_COU, + "PW"^^euvoc:ISO_3166_1_ALPHA_2, + "PLW"^^euvoc:ISO_3166_1_ALPHA_3, + "585"^^euvoc:ISO_3166_1_NUM, + "PLW"^^euvoc:NAC, + "680"^^euvoc:PHONE_PREFIX, + "PW"^^euvoc:TED, + "PW"^^euvoc:TED_SCHEMA, + "PK"^^euvoc:TIR, + "Micronesia"^^euvoc:UNSD_GEOSCHEME, + "585"^^euvoc:UNSD_M49 ; + skos:prefLabel "بالاو"@ar, + "Палау"@bg, + "Palau"@ca, + "Palau"@cs, + "Palau"@da, + "Palau"@de, + "Παλάου"@el, + "Palau"@en, + "Palaos"@es, + "Belau"@et, + "Palau"@fi, + "Palaos"@fr, + "Oileáin Palau"@ga, + "Palau"@hr, + "Palau"@hu, + "Palaú"@is, + "Palau"@it, + "パラオ"@ja, + "Palau"@lb, + "Palau"@lt, + "Palau"@lv, + "Palau"@mt, + "Palau"@nl, + "Palau"@no, + "Palau"@pl, + "Palau"@pt, + "Palau"@ro, + "Палау"@ru, + "Palau"@sk, + "Palav"@sl, + "Palau"@sv, + "Palau"@tr, + "Палау"@uk, + "帕劳"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PNG" ; + at:deprecated "false" ; + at:op-code "PNG" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "PG" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "PG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PG" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1973-12-01" ; + atold:op-code "PNG" ; + dc:identifier "PNG" ; + skos:altLabel "دولة بابوا غينيا الجديدة المستقلة"@ar, + "Независима държава Папуа-Нова Гвинея"@bg, + "Estat Independent de Papua Nova Guinea"@ca, + "Nezávislý stát Papua­Nová Guinea"@cs, + "Den Uafhængige Stat Papua Ny Guinea"@da, + "Unabhängige Staat Papua-Neuguinea"@de, + "Ανεξάρτητο Κράτος της Παπούας-Νέας Γουινέας"@el, + "Independent State of Papua New Guinea"@en, + "Estado Independiente de Papúa Nueva Guinea"@es, + "Paapua Uus-Guinea Iseseisvusriik"@et, + "Papua-Uuden-Guinean itsenäinen valtio"@fi, + "État indépendant de Papouasie - Nouvelle-Guinée"@fr, + "Stát Neamhspléach Nua-Ghuine Phapua"@ga, + "Papua Niu Gini"@ho, + "Nezavisna Država Papua Nova Gvineja"@hr, + "Pápua Új-Guinea Független Állam"@hu, + "Sjálfstæða ríkið Papúa Nýja-Gínea"@is, + "Stato indipendente di Papua Nuova Guinea"@it, + "パプアニューギニア独立国"@ja, + "Onofhängege Staat Papua-Neuguinea"@lb, + "Papua Naujosios Gvinėjos Nepriklausomoji Valstybė"@lt, + "Papua-Jaungvinejas Neatkarīgā Valsts"@lv, + "L-Istat Indipendenti ta’ Papua New Guinea"@mt, + "Onafhankelijke Staat Papoea-Nieuw-Guinea"@nl, + "Den uavhengige staten Papua Ny-Guinea"@no, + "Niezależne Państwo Papui-Nowej Gwinei"@pl, + "Estado Independente da Papuásia-Nova Guiné"@pt, + "Statul Independent Papua-Noua Guinee"@ro, + "Независимое Государство Папуа Новая Гвинея"@ru, + "Nezávislý štát Papua-Nová Guinea"@sk, + "Neodvisna država Papua Nova Gvineja"@sl, + "Den oberoende staten Papua Nya Guinea"@sv, + "Papua Niugini"@tpi, + "Papua Yeni Gine Bağımsız Devleti"@tr, + "Незалежна Держава Папуа Нова Гвінея"@uk, + "巴布亚新几内亚独立国"@zh ; + skos:hiddenLabel "Nezávislý stát Papua-Nová Guinea"@cs, + "Unabhängiger Staat Papua-Neuguinea"@de, + "Ανεξάρτητο Κράτος της Παπουασίας-Νέας Γουινέας"@el, + "Παπουασίας-Νέας Γουινέας"@el, + "Παπούα Νέα Γουινέα"@el, + "papouasienne"@fr, + "duine ó Nua-Ghuine Phapua"@ga, + "Papue Nove Gvineje"@hr, + "Pápua Új-guineai Független Állam"@hu, + "l-Istat Indipendenti ta' Papua New Guinea"@mt, + "Papoea-Nieuw-Guinese"@nl, + "Estado Independente da Papua-Nova Guiné"@pt, + "Papua-Nova Guiné"@pt, + "från Papua Nya Guinea"@sv ; + skos:historyNote "Source ISO 3166-1 Newsletter VI-15: Includes Bismarck Archipelago, Northern Solomon Islands principal island: Bougainville."@en, + "Source ISO 3166-1 Newsletter VI-15: Y compris: l’Archipel des Bismarck, les Îles Salomon du Nord île principale: Bougainville."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:notation "143"^^euvoc:EP, + "PG"^^euvoc:FD_010, + ".pg"^^euvoc:IANA_DOMAIN, + "PG"^^euvoc:ISG_COU, + "PG"^^euvoc:ISO_3166_1_ALPHA_2, + "PNG"^^euvoc:ISO_3166_1_ALPHA_3, + "598"^^euvoc:ISO_3166_1_NUM, + "PNG"^^euvoc:NAC, + "675"^^euvoc:PHONE_PREFIX, + "PG"^^euvoc:TED, + "PG"^^euvoc:TED_SCHEMA, + "PNG"^^euvoc:TIR, + "Melanesia"^^euvoc:UNSD_GEOSCHEME, + "598"^^euvoc:UNSD_M49 ; + skos:prefLabel "بابوا غينيا الجديدة"@ar, + "Папуа-Нова Гвинея"@bg, + "Papua Nova Guinea"@ca, + "Papua-Nová Guinea"@cs, + "Papua Ny Guinea"@da, + "Papua-Neuguinea"@de, + "Παπούα-Νέα Γουινέα"@el, + "Papua New Guinea"@en, + "Papúa Nueva Guinea"@es, + "Paapua Uus-Guinea"@et, + "Papua-Uusi-Guinea"@fi, + "Papouasie - Nouvelle-Guinée"@fr, + "Nua-Ghuine Phapua"@ga, + "Papua Nova Gvineja"@hr, + "Pápua Új-Guinea"@hu, + "Papúa Nýja-Gínea"@is, + "Papua Nuova Guinea"@it, + "パプアニューギニア"@ja, + "Papua-Neuguinea"@lb, + "Papua Naujoji Gvinėja"@lt, + "Papua-Jaungvineja"@lv, + "Papua New Guinea"@mt, + "Papoea-Nieuw-Guinea"@nl, + "Papua New Guinea"@no, + "Papua-Nowa Gwinea"@pl, + "Papuásia-Nova Guiné"@pt, + "Papua-Noua Guinee"@ro, + "Папуа Новая Гвинея"@ru, + "Papua-Nová Guinea"@sk, + "Papua Nova Gvineja"@sl, + "Papua Nya Guinea"@sv, + "Papua Yeni Gine"@tr, + "Папуа Нова Гвінея"@uk, + "巴布亚新几内亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PRK" ; + at:deprecated "false" ; + at:op-code "PRK" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "KP" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "KD" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "KP" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1948-09-09" ; + atold:op-code "PRK" ; + dc:identifier "PRK" ; + skos:altLabel "جمهورية كوريا الشعبية الديمقراطية"@ar, + "КНДР"@bg, + "Корейска народнодемократична република"@bg, + "República Popular Democràtica de Corea"@ca, + "KLDR"@cs, + "Korejská lidově demokratická republika"@cs, + "Den Demokratiske Folkerepublik Korea"@da, + "Demokratische Volksrepublik Korea"@de, + "Λαοκρατική Δημοκρατία της Κορέας"@el, + "DPRK"@en, + "Democratic People’s Republic of Korea"@en, + "RPDC"@es, + "República Popular Democrática de Corea"@es, + "Korea Rahvademokraatlik Vabariik"@et, + "Korean demokraattinen kansantasavalta"@fi, + "RPDC"@fr, + "République populaire démocratique de Corée"@fr, + "Daon-Phoblacht Dhaonlathach na Cóiré"@ga, + "Demokratska Narodna Republika Koreja"@hr, + "KNDK"@hu, + "Koreai Népi Demokratikus Köztársaság"@hu, + "Alþýðulýðveldið Kórea"@is, + "Repubblica popolare democratica di Corea"@it, + "朝鮮民主主義人民共和国"@ja, + "조선민주주의인민공화국"@ko, + "Demokratesch Volleksrepublik Korea"@lb, + "Korėjos Liaudies Demokratinė Respublika"@lt, + "Korejas Tautas Demokrātiskā Republika"@lv, + "Ir-Repubblika Demokratika tal-Poplu tal-Korea"@mt, + "Democratische Volksrepubliek Korea"@nl, + "Den demokratiske folkerepublikken Korea"@no, + "KRLD"@pl, + "Koreańska Republika Ludowo-Demokratyczna"@pl, + "República Popular Democrática da Coreia"@pt, + "Republica Populară Democrată Coreeană"@ro, + "Корейская Народно-Демократическая Республика"@ru, + "Kórejská ľudovodemokratická republika"@sk, + "DLRK"@sl, + "Demokratična ljudska republika Koreja"@sl, + "Demokratiska folkrepubliken Korea"@sv, + "Kore Demokratik Halk Cumhuriyeti"@tr, + "Корейська Народно-Демократична Республіка"@uk, + "朝鲜民主主义人民共和国"@zh ; + skos:hiddenLabel "Βόρειας Κορέας"@el, + "Democratic People's Republic of Korea"@en, + "de la República Popular Democrática de Corea"@es, + "korealainen, pohjoiskorealainen"@fi, + "an Chóiré Thuaidh"@ga, + "duine ón gCóiré Thuaidh"@ga, + "Ziemeļkorejas"@lv, + "il-Korea ta’ Fuq"@mt, + "ir-Repubblika Demokratika tal-Poplu tal-Korea"@mt, + "północnokoreańskie"@pl, + "Kórejská ľudovodemokratická republika (KĽDR)"@sk, + "Demokratiska folkrepubliken Nordkorea"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "97"^^euvoc:EP, + "KD"^^euvoc:FD_010, + ".kp"^^euvoc:IANA_DOMAIN, + "KP"^^euvoc:ISG_COU, + "KP"^^euvoc:ISO_3166_1_ALPHA_2, + "PRK"^^euvoc:ISO_3166_1_ALPHA_3, + "408"^^euvoc:ISO_3166_1_NUM, + "PRK"^^euvoc:NAC, + "850"^^euvoc:PHONE_PREFIX, + "KP"^^euvoc:TED, + "KP"^^euvoc:TED_SCHEMA, + "Eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "408"^^euvoc:UNSD_M49 ; + skos:prefLabel "كوريا الشمالية"@ar, + "Северна Корея"@bg, + "Corea del Nord"@ca, + "Severní Korea"@cs, + "Nordkorea"@da, + "Nordkorea"@de, + "Βόρεια Κορέα"@el, + "North Korea"@en, + "Corea del Norte"@es, + "Põhja-Korea"@et, + "Pohjois-Korea"@fi, + "Corée du Nord"@fr, + "An Chóiré Thuaidh"@ga, + "Sjeverna Koreja"@hr, + "Észak-Korea"@hu, + "Norður-Kórea"@is, + "Corea del Nord"@it, + "北朝鮮"@ja, + "Nordkorea"@lb, + "Šiaurės Korėja"@lt, + "Ziemeļkoreja"@lv, + "Il-Korea ta’ Fuq"@mt, + "Noord-Korea"@nl, + "Nord-Korea"@no, + "Korea Północna"@pl, + "Coreia do Norte"@pt, + "Coreea de Nord"@ro, + "Северная Корея"@ru, + "Severná Kórea"@sk, + "Severna Koreja"@sl, + "Nordkorea"@sv, + "Kuzey Kore"@tr, + "Північна Корея"@uk, + "朝鲜"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PRY" ; + at:deprecated "false" ; + at:op-code "PRY" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "PY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "PY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PY" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "PY" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "PRY" ; + dc:identifier "PRY" ; + skos:altLabel "حمهورية باراغواي"@ar, + "Република Парагвай"@bg, + "República del Paraguai"@ca, + "Paraguayská republika"@cs, + "Republikken Paraguay"@da, + "Republik Paraguay"@de, + "Δημοκρατία της Παραγουάης"@el, + "Republic of Paraguay"@en, + "República del Paraguay"@es, + "Paraguay Vabariik"@et, + "Paraguayn tasavalta"@fi, + "République du Paraguay"@fr, + "Poblacht Pharagua"@ga, + "Paraguái"@gug, + "Republika Paragvaj"@hr, + "Paraguayi Köztársaság"@hu, + "Lýðveldið Paragvæ"@is, + "Repubblica del Paraguay"@it, + "パラグアイ共和国"@ja, + "Republik Paraguay"@lb, + "Paragvajaus Respublika"@lt, + "Paragvajas Republika"@lv, + "Ir-Repubblika tal-Paragwaj"@mt, + "Republiek Paraguay"@nl, + "Republikken Paraguay"@no, + "Republika Paragwaju"@pl, + "República do Paraguai"@pt, + "Republica Paraguay"@ro, + "Республика Парагвай"@ru, + "Paraguajská republika"@sk, + "Republika Paragvaj"@sl, + "Republiken Paraguay"@sv, + "Paraguay Cumhuriyeti"@tr, + "Республіка Парагвай"@uk, + "巴拉圭共和国"@zh ; + skos:hiddenLabel "Παραγουάης"@el, + "Paragvajaus"@lt, + "Paragvajas"@lv, + "il-Paragwaj"@mt, + "ir-Repubblika tal-Paragwaj"@mt, + "Paragayaanse"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "150"^^euvoc:EP, + "PY"^^euvoc:FD_010, + "PY"^^euvoc:FD_400, + ".py"^^euvoc:IANA_DOMAIN, + "PY"^^euvoc:ISG_COU, + "PY"^^euvoc:ISO_3166_1_ALPHA_2, + "PRY"^^euvoc:ISO_3166_1_ALPHA_3, + "600"^^euvoc:ISO_3166_1_NUM, + "PRY"^^euvoc:NAC, + "595"^^euvoc:PHONE_PREFIX, + "PY"^^euvoc:TED, + "PY"^^euvoc:TED_SCHEMA, + "PY"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "600"^^euvoc:UNSD_M49 ; + skos:prefLabel "باراغواي"@ar, + "Парагвай"@bg, + "Paraguai"@ca, + "Paraguay"@cs, + "Paraguay"@da, + "Paraguay"@de, + "Παραγουάη"@el, + "Paraguay"@en, + "Paraguay"@es, + "Paraguay"@et, + "Paraguay"@fi, + "Paraguay"@fr, + "Paragua"@ga, + "Paragvaj"@hr, + "Paraguay"@hu, + "Paragvæ"@is, + "Paraguay"@it, + "パラグアイ"@ja, + "Paraguay"@lb, + "Paragvajus"@lt, + "Paragvaja"@lv, + "Il-Paragwaj"@mt, + "Paraguay"@nl, + "Paraguay"@no, + "Paragwaj"@pl, + "Paraguai"@pt, + "Paraguay"@ro, + "Парагвай"@ru, + "Paraguaj"@sk, + "Paragvaj"@sl, + "Paraguay"@sv, + "Paraguay"@tr, + "Парагвай"@uk, + "巴拉圭"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PSE" ; + at:deprecated "false" ; + at:op-code "PSE" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "PSE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PS" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "PS" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "PSE" ; + dc:identifier "PSE" ; + skos:altLabel "فلسطين"@ar, + "Палестина"@bg, + "Palestina"@cs, + "Palæstina"@da, + "Palästina"@de, + "Παλαιστίνη"@el, + "Palestine"@en, + "Palestina"@es, + "Palestiina"@et, + "Palestiina"@fi, + "Palestine"@fr, + "An Phalaistín"@ga, + "Palestina"@hr, + "Palesztina"@hu, + "Palestina"@it, + "Palestina"@lt, + "Palestīna"@lv, + "Il-Palestina"@mt, + "Palestina"@nl, + "Palestyna"@pl, + "Palestina"@pt, + "Palestina"@ro, + "Palestína"@sk, + "Palestina"@sl, + "Palestina"@sv ; + skos:changeNote "Comprises the Gaza Strip and the West Bank, including East Jerusalem."@en, + "Comprend la bande de Gaza et la Cisjordanie, y compris Jérusalem-Est."@fr ; + skos:hiddenLabel "палестински територии"@bg, + "Besatte palæstinensiske områder"@da, + "fra de besatte palæstinensiske områder"@da, + "Palästinensische Gebiete"@de, + "der Palästinensischen Gebiete"@de, + "Παλαιστινιακά εδάφη"@el, + "Παλαιστινιακών εδαφών"@el, + "Palestinian territories"@en, + "Territorios Palestinos"@es, + "Palestiina okupeeritud ala"@et, + "Miehitetty palestiinalaisalue"@fi, + "Palestiinalaisalue"@fi, + "Territoire palestinien occupé"@fr, + "na Críocha Palaistíneacha"@ga, + "Palestinska područja"@hr, + "Palestinskih područja"@hr, + "megszállt palesztin területek"@hu, + "Territori palestinesi"@it, + "Okupuotoji Palestinos Teritorija"@lt, + "Okupuotosios Palestinos Teritorijos"@lt, + "okupēto palestīniešu teritoriju"@lv, + "okupētās palestīniešu teritorijas"@lv, + "it-Territorju Palestinjan Okkupat"@mt, + "Palestijnse Gebieden"@nl, + "Okupowane terytoria palestyńskie"@pl, + "Território Palestiniano Ocupado"@pt, + "palestiniana"@pt, + "din teritoriile palestiniene ocupate"@ro, + "teritoriile palestiniene ocupate"@ro, + "Palestínske okupované územia"@sk, + "Zasedeno palestinsko ozemlje"@sl, + "palestinsko"@sl, + "de ockuperade palestinska områdena"@sv, + "från de ockuperade palestinska områdena"@sv ; + skos:historyNote "List of countries recognised by the European Union – EU_REC use-context – revised based on Annex A5 of the Interinstitutional Style Guide."@en, + "The label and long label in all official languages follow the practice adopted by EEAS in its note of 27.3.2013 entitled ‘Denomination of Palestine’. Ref. Ares(2013)518519 - 27/03/2013."@en, + "Utilisation of the denomination ‘Palestine’ instead of ‘Palestinian National Authority’ or ‘occupied Palestinian territory’: ‘This designation shall not be construed as recognition of a State of Palestine and is without prejudice to the individual positions of the Member States on this issue.’ Ref. Ares(2012)314502 - 11/07/2014."@en ; + skos:inScheme atold:country, + , + ; + skos:narrower ; + skos:notation "271"^^euvoc:EP, + "PSE"^^euvoc:FD_010, + ".ps"^^euvoc:IANA_DOMAIN, + "PS"^^euvoc:IBAN_COU, + "PS"^^euvoc:ISO_3166_1_ALPHA_2, + "PSE"^^euvoc:ISO_3166_1_ALPHA_3, + "275"^^euvoc:ISO_3166_1_NUM, + "PSE"^^euvoc:NAC, + "970"^^euvoc:PHONE_PREFIX, + "PS"^^euvoc:TED, + "PS"^^euvoc:TED_SCHEMA, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "275"^^euvoc:UNSD_M49 ; + skos:prefLabel "*فلسطين"@ar, + "Палестина*"@bg, + "Palestina*"@ca, + "Palestina*"@cs, + "Palæstina*"@da, + "Palästina*"@de, + "Παλαιστίνη*"@el, + "Palestine*"@en, + "Palestina*"@es, + "Palestiina*"@et, + "Palestiina*"@fi, + "Palestine*"@fr, + "An Phalaistín*"@ga, + "Palestina*"@hr, + "Palesztina*"@hu, + "Palestína*"@is, + "Palestina*"@it, + "パレスチナ*"@ja, + "Palästina*"@lb, + "Palestina*"@lt, + "Palestīna*"@lv, + "Il-Palestina*"@mt, + "Palestina*"@nl, + "Palestina*"@no, + "Palestyna*"@pl, + "Palestina*"@pt, + "Palestina*"@ro, + "Палестина*"@ru, + "Palestína*"@sk, + "Palestina*"@sl, + "Palestina*"@sv, + "Filistin*"@tr, + "Палестина*"@uk, + "巴勒斯坦*"@zh ; + skos:topConceptOf atold:country, + , + . + + a skos:Concept ; + at:authority-code "PYF" ; + at:deprecated "false" ; + at:op-code "PYF" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "PF" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "PF" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "PYF" ; + dc:identifier "PYF" ; + skos:broader ; + skos:hiddenLabel "Έδαφος της Γαλλικής Πολυνησίας"@el, + "Γαλλικής Πολυνησίας"@el, + "Territory of French Polynesia"@en, + "ranskalainen, ranskanpolynesialainen"@fi, + "Territoire de Polynésie Française"@fr, + "française"@fr, + "Críoch Pholainéis na Fraince"@ga, + "Francuske Polinezije"@hr, + "Francijas Polinēzijas"@lv, + "Francijas Polinēzijas Teritorija"@lv, + "il-Polineżja Franċiża"@mt, + "da Polinésia Francesa"@pt, + "Ozemlje Francoske Polinezije"@sl ; + skos:historyNote "ISO 3166-1 Newsletter VI-1 of 21.9.2007: Comprises Austral Islands, Gambier Islands, Marquesas Islands, Society Archipelago principal island: Tahiti, Tuamotu Islands."@en, + "ISO 3166-1 Newsletter VI-1 du 21.9.2007: Comprend: les Îles Australes, les Îles Gambier, les Îles Marquises, l’Archipel de la Société île principale: Tahiti, les Îles Tuamotu."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:notation "142"^^euvoc:EP, + ".pf"^^euvoc:IANA_DOMAIN, + "PF"^^euvoc:ISG_COU, + "PF"^^euvoc:ISO_3166_1_ALPHA_2, + "PYF"^^euvoc:ISO_3166_1_ALPHA_3, + "258"^^euvoc:ISO_3166_1_NUM, + "PYF"^^euvoc:NAC, + "689"^^euvoc:PHONE_PREFIX, + "PF"^^euvoc:TED, + "PF"^^euvoc:TED_SCHEMA, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "258"^^euvoc:UNSD_M49 ; + skos:prefLabel "بولينيزيا الفرنسية"@ar, + "Френска Полинезия"@bg, + "Polinèsia Francesa"@ca, + "Francouzská Polynésie"@cs, + "Fransk Polynesien"@da, + "Französisch-Polynesien"@de, + "Γαλλική Πολυνησία"@el, + "French Polynesia"@en, + "Polinesia Francesa"@es, + "Prantsuse Polüneesi"@et, + "Ranskan Polynesia"@fi, + "Polynésie française"@fr, + "Polainéis na Fraince"@ga, + "Francuska Polinezija"@hr, + "Francia Polinézia"@hu, + "Franska Pólýnesía"@is, + "Polinesia francese"@it, + "フランス領ポリネシア"@ja, + "Franséisch-Polynesien"@lb, + "Prancūzijos Polinezija"@lt, + "Francijas Polinēzija"@lv, + "Il-Polineżja Franċiża"@mt, + "Frans-Polynesië"@nl, + "Fransk Polynesia"@no, + "Polinezja Francuska"@pl, + "Polinésia Francesa"@pt, + "Polinezia Franceză"@ro, + "Французская Полинезия"@ru, + "Francúzska Polynézia"@sk, + "Francoska Polinezija"@sl, + "Franska Polynesien"@sv, + "Fransız Polinezyası"@tr, + "Французька Полінезія"@uk, + "法属波利尼西亚"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "QAT" ; + at:deprecated "false" ; + at:op-code "QAT" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "QA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SQ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SQ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "QA" ; + dc:source "TED" ] ; + at:start.use "1971-09-03" ; + atold:op-code "QAT" ; + dc:identifier "QAT" ; + skos:altLabel "دولة قطر"@ar, + "Държавата Катар"@bg, + "Estat de Qatar"@ca, + "Stát Katar"@cs, + "Staten Qatar"@da, + "Staat Katar"@de, + "Κράτος του Κατάρ"@el, + "State of Qatar"@en, + "Estado de Qatar"@es, + "Katari Riik"@et, + "Qatarin valtio"@fi, + "État du Qatar"@fr, + "Stát Chatar"@ga, + "Država Katar"@hr, + "Katari Állam"@hu, + "Katarríki"@is, + "Stato del Qatar"@it, + "カタール国"@ja, + "Staat Katar"@lb, + "Kataro Valstybė"@lt, + "Kataras Valsts"@lv, + "L-Istat tal-Qatar"@mt, + "Staat Qatar"@nl, + "Staten Qatar"@no, + "Państwo Katar"@pl, + "Estado do Catar"@pt, + "Statul Qatar"@ro, + "Государство Катар"@ru, + "Katarský štát"@sk, + "Država Katar"@sl, + "Staten Qatar"@sv, + "Katar Devleti"@tr, + "Держава Катар"@uk, + "卡塔尔国"@zh ; + skos:hiddenLabel "Kataro"@lt, + "Kataras"@lv, + "Qatarija"@mt, + "il-Qatar"@mt, + "l-Istat tal-Qatar"@mt, + "Qatarese"@nl, + "catariana"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "151"^^euvoc:EP, + "SQ"^^euvoc:FD_010, + "SQ"^^euvoc:FD_400, + ".qa"^^euvoc:IANA_DOMAIN, + "QA"^^euvoc:IBAN_COU, + "QA"^^euvoc:ISG_COU, + "QA"^^euvoc:ISO_3166_1_ALPHA_2, + "QAT"^^euvoc:ISO_3166_1_ALPHA_3, + "634"^^euvoc:ISO_3166_1_NUM, + "QAT"^^euvoc:NAC, + "974"^^euvoc:PHONE_PREFIX, + "QA"^^euvoc:TED, + "QA"^^euvoc:TED_SCHEMA, + "Q"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "634"^^euvoc:UNSD_M49 ; + skos:prefLabel "قطر"@ar, + "Катар"@bg, + "Qatar"@ca, + "Katar"@cs, + "Qatar"@da, + "Katar"@de, + "Κατάρ"@el, + "Qatar"@en, + "Qatar"@es, + "Katar"@et, + "Qatar"@fi, + "Qatar"@fr, + "Catar"@ga, + "Katar"@hr, + "Katar"@hu, + "Katar"@is, + "Qatar"@it, + "カタール"@ja, + "Katar"@lb, + "Kataras"@lt, + "Katara"@lv, + "Il-Qatar"@mt, + "Qatar"@nl, + "Qatar"@no, + "Katar"@pl, + "Catar"@pt, + "Qatar"@ro, + "Катар"@ru, + "Katar"@sk, + "Katar"@sl, + "Qatar"@sv, + "Katar"@tr, + "Катар"@uk, + "卡塔尔"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "RUS" ; + at:deprecated "false" ; + at:op-code "RUS" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "RU" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RUS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "RU" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "RU" ; + dc:source "EurLex" ] ; + at:start.use "1991-12-26" ; + atold:op-code "RUS" ; + dc:identifier "RUS" ; + skos:altLabel "الفيدرالية الروسية"@ar, + "Расійская Федэрацыя"@be, + "Руска федерация"@bg, + "Ruska Federacija"@bs, + "Federació Russa"@ca, + "Ruská federace"@cs, + "Den Russiske Føderation"@da, + "Russische Föderation"@de, + "Ρωσική Ομοσπονδία"@el, + "Russian Federation"@en, + "Federación Rusa"@es, + "Venemaa Föderatsioon"@et, + "Errusiar Federazioa"@eu, + "Venäjän federaatio"@fi, + "Sambandsríki Russland"@fo, + "Fédération de Russie"@fr, + "Cónaidhm na Rúise"@ga, + "Federación Rusa"@gl, + "Ruska Federacija"@hr, + "Oroszországi Föderáció"@hu, + "Rússneska sambandsríkið"@is, + "Federazione Russa"@it, + "ロシア連邦"@ja, + "Russesch Federatioun"@lb, + "Rusijos Federacija"@lt, + "Krievijas Federācija"@lv, + "Руската Федерација"@mk, + "Il-Federazzjoni Russa"@mt, + "Russische Federatie"@nl, + "Den russiske føderasjonen"@no, + "Federacja Rosyjska"@pl, + "Federação da Rússia"@pt, + "Federaziun russa"@rm, + "Federaţia Rusă"@ro, + "Российская Федерация"@ru, + "Ruská federácia"@sk, + "Ruska federacija"@sl, + "Federata Ruse"@sq, + "Руска Федерација"@sr, + "Ryska federationen"@sv, + "Rusya Federasyonu"@tr, + "Російська Федерація"@uk, + "俄罗斯联邦"@zh ; + skos:hiddenLabel "Federación de Rusia"@es, + "an Rúis"@ga, + "Rusijos"@lt, + "Krievijas"@lv, + "il-Federazzjoni Russa"@mt, + "ir-Russja"@mt, + "Federația Rusă"@ro ; + skos:inScheme atold:country, + , + , + ; + skos:notation "153"^^euvoc:EP, + "RUS"^^euvoc:FD_010, + "RU"^^euvoc:FD_140, + ".ru"^^euvoc:IANA_DOMAIN, + "RU"^^euvoc:ISG_COU, + "RU"^^euvoc:ISO_3166_1_ALPHA_2, + "RUS"^^euvoc:ISO_3166_1_ALPHA_3, + "643"^^euvoc:ISO_3166_1_NUM, + "RUS"^^euvoc:NAC, + "7"^^euvoc:PHONE_PREFIX, + "RU"^^euvoc:TED, + "RU"^^euvoc:TED_SCHEMA, + "RUS"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "643"^^euvoc:UNSD_M49 ; + skos:prefLabel "روسيا"@ar, + "Расія"@be, + "Русия"@bg, + "Rusija"@bs, + "Rússia"@ca, + "Rusko"@cs, + "Rusland"@da, + "Russland"@de, + "Ρωσία"@el, + "Russia"@en, + "Rusia"@es, + "Venemaa"@et, + "Errusia"@eu, + "Venäjä"@fi, + "Russland"@fo, + "Russie"@fr, + "An Rúis"@ga, + "Rusia"@gl, + "Rusija"@hr, + "Oroszország"@hu, + "Rússland"@is, + "Russia"@it, + "ロシア"@ja, + "Russland"@lb, + "Rusija"@lt, + "Krievija"@lv, + "Русија"@mk, + "Ir-Russja"@mt, + "Rusland"@nl, + "Russland"@no, + "Rosja"@pl, + "Rússia"@pt, + "Russia"@rm, + "Rusia"@ro, + "Россия"@ru, + "Rusko"@sk, + "Rusija"@sl, + "Rusia"@sq, + "Русија"@sr, + "Ryssland"@sv, + "Rusya"@tr, + "Росія"@uk, + "俄罗斯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "RWA" ; + at:deprecated "false" ; + at:op-code "RWA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "RW" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "RW" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RWA" ; + dc:source "EurLex" ] ; + at:start.use "1962-07-01" ; + atold:op-code "RWA" ; + dc:identifier "RWA" ; + skos:altLabel "جمهورية رواندا"@ar, + "Република Руанда"@bg, + "República de Ruanda"@ca, + "Republika Rwanda"@cs, + "Republikken Rwanda"@da, + "Republik Ruanda"@de, + "Δημοκρατία της Ρουάντας"@el, + "Republic of Rwanda"@en, + "República de Ruanda"@es, + "Rwanda Vabariik"@et, + "Ruandan tasavalta"@fi, + "République du Rwanda"@fr, + "Poblacht Ruanda"@ga, + "Republika Ruanda"@hr, + "Ruandai Köztársaság"@hu, + "Lýðveldið Rúanda"@is, + "Repubblica del Ruanda"@it, + "ルワンダ共和国"@ja, + "Republik Ruanda"@lb, + "Ruandos Respublika"@lt, + "Ruandas Republika"@lv, + "Ir-Repubblika tar-Rwanda"@mt, + "Republiek Rwanda"@nl, + "Republikken Rwanda"@no, + "Republika Rwandy"@pl, + "República do Ruanda"@pt, + "Republica Rwanda"@ro, + "Руандийская Республика"@ru, + "Rwanda"@rw, + "Rwandská republika"@sk, + "Republika Ruanda"@sl, + "Republiken Rwanda"@sv, + "Ruanda Cumhuriyeti"@tr, + "Республіка Руанда"@uk, + "卢旺达共和国"@zh ; + skos:hiddenLabel "Rwandan; Rwandese"@en, + "ruandaise"@fr, + "Ruandos"@lt, + "Ruandas"@lv, + "ir-Repubblika tar-Rwanda"@mt, + "ir-Rwanda"@mt, + "Rwandese"@nl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "250"^^euvoc:EP, + "RWA"^^euvoc:FD_010, + ".rw"^^euvoc:IANA_DOMAIN, + "RW"^^euvoc:ISG_COU, + "RW"^^euvoc:ISO_3166_1_ALPHA_2, + "RWA"^^euvoc:ISO_3166_1_ALPHA_3, + "646"^^euvoc:ISO_3166_1_NUM, + "RWA"^^euvoc:NAC, + "250"^^euvoc:PHONE_PREFIX, + "RW"^^euvoc:TED, + "RW"^^euvoc:TED_SCHEMA, + "RWA"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "646"^^euvoc:UNSD_M49 ; + skos:prefLabel "رواندا"@ar, + "Руанда"@bg, + "Ruanda"@ca, + "Rwanda"@cs, + "Rwanda"@da, + "Ruanda"@de, + "Ρουάντα"@el, + "Rwanda"@en, + "Ruanda"@es, + "Rwanda"@et, + "Ruanda"@fi, + "Rwanda"@fr, + "Ruanda"@ga, + "Ruanda"@hr, + "Ruanda"@hu, + "Rúanda"@is, + "Ruanda"@it, + "ルワンダ"@ja, + "Ruanda"@lb, + "Ruanda"@lt, + "Ruanda"@lv, + "Ir-Rwanda"@mt, + "Rwanda"@nl, + "Rwanda"@no, + "Rwanda"@pl, + "Ruanda"@pt, + "Rwanda"@ro, + "Руанда"@ru, + "Rwanda"@sk, + "Ruanda"@sl, + "Rwanda"@sv, + "Ruanda"@tr, + "Руанда"@uk, + "卢旺达"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SAU" ; + at:deprecated "false" ; + at:op-code "SAU" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "SA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SA" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "SA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SA" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "SAU" ; + dc:identifier "SAU" ; + skos:altLabel "السعودية"@ar, + "المملكة العربية السعودية"@ar, + "Кралство Саудитска Арабия"@bg, + "Regne d'Aràbia Saudita"@ca, + "Království Saúdská Arábie"@cs, + "Kongeriget Saudi-Arabien"@da, + "Königreich Saudi-Arabien"@de, + "Βασίλειο της Σαουδικής Αραβίας"@el, + "KSA"@en, + "Kingdom of Saudi Arabia"@en, + "Reino de Arabia Saudí"@es, + "Saudi Araabia Kuningriik"@et, + "Saudi-Arabian kuningaskunta"@fi, + "Royaume d’Arabie saoudite"@fr, + "Ríocht na hAraibe Sádaí"@ga, + "Kraljevina Saudijska Arabija"@hr, + "Szaúd-arábiai Királyság"@hu, + "Konungsríkið Sádi-Arabía"@is, + "Regno dell’Arabia Saudita"@it, + "サウジアラビア王国"@ja, + "Kinnekräich Saudiarabien"@lb, + "Saudo Arabijos Karalystė"@lt, + "Saūda Arābijas Karaliste"@lv, + "Ir-Renju tal-Arabja Sawdija"@mt, + "Koninkrijk Saudi-Arabië"@nl, + "Kongeriket Saudi-Arabia"@no, + "Królestwo Arabii Saudyjskiej"@pl, + "Reino da Arábia Saudita"@pt, + "Regatul Arabiei Saudite"@ro, + "Королевство Саудовская Аравия"@ru, + "Saudskoarabské kráľovstvo"@sk, + "Kraljevina Saudova Arabija"@sl, + "Konungariket Saudiarabien"@sv, + "Suudi Arabistan Krallığı"@tr, + "Королівство Саудівська Аравія"@uk, + "沙特阿拉伯王国"@zh ; + skos:hiddenLabel "Saudská Arábie"@cs, + "saudiarabisk, saudisk"@da, + "Σαουδικής Αραβίας"@el, + "Royaume d'Arabie Saoudite"@fr, + "an Araib Shádach"@ga, + "duine ón Araib Shádach"@ga, + "Saudijske Arabije"@hr, + "Regno dell'Arabia Saudita"@it, + "Saūda Arābijas"@lv, + "Sawdija"@mt, + "ir-Renju tal-Arabja Sawdija"@mt, + "l-Arabja Sawdija"@mt ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "154"^^euvoc:EP, + "SA"^^euvoc:FD_010, + "SA"^^euvoc:FD_050, + "SA"^^euvoc:FD_140, + "SA"^^euvoc:FD_400, + ".sa"^^euvoc:IANA_DOMAIN, + "SA"^^euvoc:IBAN_COU, + "SA"^^euvoc:ISG_COU, + "SA"^^euvoc:ISO_3166_1_ALPHA_2, + "SAU"^^euvoc:ISO_3166_1_ALPHA_3, + "682"^^euvoc:ISO_3166_1_NUM, + "SAU"^^euvoc:NAC, + "966"^^euvoc:PHONE_PREFIX, + "SA"^^euvoc:TED, + "SA"^^euvoc:TED_SCHEMA, + "SA"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "682"^^euvoc:UNSD_M49 ; + skos:prefLabel "العربية السعودية"@ar, + "Саудитска Арабия"@bg, + "Aràbia Saudita"@ca, + "Saúdská Arábie"@cs, + "Saudi-Arabien"@da, + "Saudi-Arabien"@de, + "Σαουδική Αραβία"@el, + "Saudi Arabia"@en, + "Arabia Saudí"@es, + "Saudi Araabia"@et, + "Saudi-Arabia"@fi, + "Arabie saoudite"@fr, + "An Araib Shádach"@ga, + "Saudijska Arabija"@hr, + "Szaúd-Arábia"@hu, + "Sádi-Arabía"@is, + "Arabia Saudita"@it, + "サウジアラビア"@ja, + "Saudiarabien"@lb, + "Saudo Arabija"@lt, + "Saūda Arābija"@lv, + "L-Arabja Sawdija"@mt, + "Saudi-Arabië"@nl, + "Saudi Arabia"@no, + "Arabia Saudyjska"@pl, + "Arábia Saudita"@pt, + "Arabia Saudită"@ro, + "Саудовская Аравия"@ru, + "Saudská Arábia"@sk, + "Saudova Arabija"@sl, + "Saudiarabien"@sv, + "Suudi Arabistan"@tr, + "Саудівська Аравія"@uk, + "沙特阿拉伯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SDN" ; + at:deprecated "false" ; + at:op-code "SDN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SND" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SD" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "SD" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SND" ; + dc:source "EurLex" ] ; + at:start.use "1956-01-01" ; + atold:op-code "SDN" ; + dc:identifier "SDN" ; + skos:altLabel "جمهورية السودان"@ar, + "Република Судан"@bg, + "República del Sudan"@ca, + "Súdánská republika"@cs, + "Republikken Sudan"@da, + "Republik Sudan"@de, + "Δημοκρατία του Σουδάν"@el, + "Republic of the Sudan"@en, + "República de Sudán"@es, + "Sudaani Vabariik"@et, + "Sudanin tasavalta"@fi, + "République du Soudan"@fr, + "Poblacht na Súdáine"@ga, + "Republika Sudan"@hr, + "Szudáni Köztársaság"@hu, + "Lýðveldið Súdan"@is, + "Repubblica del Sudan"@it, + "スーダン共和国"@ja, + "Republik Sudan"@lb, + "Sudano Respublika"@lt, + "Sudānas Republika"@lv, + "Ir-Repubblika tas-Sudan"@mt, + "Republiek Sudan"@nl, + "Republikken Sudan"@no, + "Republika Sudanu"@pl, + "República do Sudão"@pt, + "Republica Sudan"@ro, + "Республика Судан"@ru, + "Sudánska republika"@sk, + "Republika Sudan"@sl, + "Republiken Sudan"@sv, + "Sudan Cumhuriyeti"@tr, + "Республіка Судан"@uk, + "苏丹共和国"@zh ; + skos:hiddenLabel "Republic of Sudan"@en, + "Sudaani"@et, + "soudannaise"@fr, + "an tSúdáin"@ga, + "Sudano"@lt, + "Sudānas"@lv, + "ir-Repubblika tas-Sudan"@mt, + "is-Sudan"@mt, + "Sudanese"@nl ; + skos:historyNote "ISO 3166-1 Newsletter VI-10 of 9.8.2011: ‘Split of Sudan into Sudan north part and South Sudan south part’."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "157"^^euvoc:EP, + "292"^^euvoc:EP, + "SND"^^euvoc:FD_010, + "SND"^^euvoc:FD_400, + ".sd"^^euvoc:IANA_DOMAIN, + "SD"^^euvoc:IBAN_COU, + "SD"^^euvoc:ISG_COU, + "SD"^^euvoc:ISO_3166_1_ALPHA_2, + "SDN"^^euvoc:ISO_3166_1_ALPHA_3, + "729"^^euvoc:ISO_3166_1_NUM, + "SDN"^^euvoc:NAC, + "249"^^euvoc:PHONE_PREFIX, + "SD"^^euvoc:TED, + "SD"^^euvoc:TED_SCHEMA, + "SUD"^^euvoc:TIR, + "Northern Africa"^^euvoc:UNSD_GEOSCHEME, + "729"^^euvoc:UNSD_M49 ; + skos:prefLabel "السودان"@ar, + "Судан"@bg, + "Sudan, el"@ca, + "Súdán"@cs, + "Sudan"@da, + "Sudan"@de, + "Σουδάν"@el, + "Sudan"@en, + "Sudán"@es, + "Sudaan"@et, + "Sudan"@fi, + "Soudan"@fr, + "An tSúdáin"@ga, + "Sudan"@hr, + "Szudán"@hu, + "Súdan"@is, + "Sudan"@it, + "スーダン"@ja, + "Sudan"@lb, + "Sudanas"@lt, + "Sudāna"@lv, + "Is-Sudan"@mt, + "Sudan"@nl, + "Sudan"@no, + "Sudan"@pl, + "Sudão"@pt, + "Sudan"@ro, + "Судан"@ru, + "Sudán"@sk, + "Sudan"@sl, + "Sudan"@sv, + "Sudan"@tr, + "Судан"@uk, + "苏丹"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SEN" ; + at:deprecated "false" ; + at:op-code "SEN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SN" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "SN" ; + dc:source "EurLex" ] ; + at:start.use "1960-04-04" ; + atold:op-code "SEN" ; + dc:identifier "SEN" ; + skos:altLabel "جمهورية السنغال"@ar, + "Република Сенегал"@bg, + "República del Senegal"@ca, + "Senegalská republika"@cs, + "Republikken Senegal"@da, + "Republik Senegal"@de, + "Δημοκρατία της Σενεγάλης"@el, + "Republic of Senegal"@en, + "República de Senegal"@es, + "Senegali Vabariik"@et, + "Senegalin tasavalta"@fi, + "République du Sénégal"@fr, + "Poblacht na Seineagáile"@ga, + "Republika Senegal"@hr, + "Szenegáli Köztársaság"@hu, + "Lýðveldið Senegal"@is, + "Repubblica del Senegal"@it, + "セネガル共和国"@ja, + "Republik Senegal"@lb, + "Senegalo Respublika"@lt, + "Senegālas Republika"@lv, + "Ir-Repubblika tas-Senegal"@mt, + "Republiek Senegal"@nl, + "Republikken Senegal"@no, + "Republika Senegalu"@pl, + "República do Senegal"@pt, + "Republica Senegal"@ro, + "Республика Сенегал"@ru, + "Senegalská republika"@sk, + "Republika Senegal"@sl, + "Republiken Senegal"@sv, + "Senegal Cumhuriyeti"@tr, + "Республіка Сенегал"@uk, + "塞内加尔共和国"@zh ; + skos:hiddenLabel "Σενεγάλης"@el, + "an tSeineagáil"@ga, + "Senegalo"@lt, + "Senegālas"@lv, + "ir-Repubblika tas-Senegal"@mt, + "is-Senegal"@mt, + "Senegalese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "164"^^euvoc:EP, + "SN"^^euvoc:FD_010, + "SN"^^euvoc:FD_140, + "SN"^^euvoc:FD_400, + ".sn"^^euvoc:IANA_DOMAIN, + "SN"^^euvoc:ISG_COU, + "SN"^^euvoc:ISO_3166_1_ALPHA_2, + "SEN"^^euvoc:ISO_3166_1_ALPHA_3, + "686"^^euvoc:ISO_3166_1_NUM, + "SEN"^^euvoc:NAC, + "221"^^euvoc:PHONE_PREFIX, + "SN"^^euvoc:TED, + "SN"^^euvoc:TED_SCHEMA, + "SN"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "686"^^euvoc:UNSD_M49 ; + skos:prefLabel "السنغال"@ar, + "Сенегал"@bg, + "Senegal"@ca, + "Senegal"@cs, + "Senegal"@da, + "Senegal"@de, + "Σενεγάλη"@el, + "Senegal"@en, + "Senegal"@es, + "Senegal"@et, + "Senegal"@fi, + "Sénégal"@fr, + "An tSeineagáil"@ga, + "Senegal"@hr, + "Szenegál"@hu, + "Senegal"@is, + "Senegal"@it, + "セネガル"@ja, + "Senegal"@lb, + "Senegalas"@lt, + "Senegāla"@lv, + "Is-Senegal"@mt, + "Senegal"@nl, + "Senegal"@no, + "Senegal"@pl, + "Senegal"@pt, + "Senegal"@ro, + "Сенегал"@ru, + "Senegal"@sk, + "Senegal"@sl, + "Senegal"@sv, + "Senegal"@tr, + "Сенегал"@uk, + "塞内加尔"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SGP" ; + at:deprecated "false" ; + at:op-code "SGP" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "SG" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SGP" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "SG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SG" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1965-08-09" ; + atold:op-code "SGP" ; + dc:identifier "SGP" ; + skos:altLabel "جمهورية سنغافورة"@ar, + "Република Сингапур"@bg, + "República de Singapur"@ca, + "新加坡"@cmn, + "Singapurská republika"@cs, + "Republikken Singapore"@da, + "Republik Singapur"@de, + "Δημοκρατία της Σιγκαπούρης"@el, + "Republic of Singapore"@en, + "República de Singapur"@es, + "Singapuri Vabariik"@et, + "Singaporen tasavalta"@fi, + "République de Singapour"@fr, + "Poblacht Shingeapór"@ga, + "Republika Singapur"@hr, + "Szingapúri Köztársaság"@hu, + "Lýðveldið Singapúr"@is, + "Repubblica di Singapore"@it, + "シンガポール共和国"@ja, + "Republik Singapur"@lb, + "Singapūro Respublika"@lt, + "Singapūras Republika"@lv, + "Singapura"@ms, + "Ir-Repubblika ta’ Singapore"@mt, + "Republiek Singapore"@nl, + "Republikken Singapore"@no, + "Republika Singapuru"@pl, + "República de Singapura"@pt, + "Republica Singapore"@ro, + "Республика Сингапур"@ru, + "Singapurská republika"@sk, + "Republika Singapur"@sl, + "Republiken Singapore"@sv, + "சிங்கப்பூர்"@ta, + "Singapur Cumhuriyeti"@tr, + "Республіка Сінгапур"@uk, + "新加坡共和国"@zh ; + skos:hiddenLabel "Δημοκρατία της Σινγκαπούρης"@el, + "Σιγκαπούρης"@el, + "Singapūro"@lt, + "Singapūras"@lv, + "ir-Repubblika ta' Singapore"@mt, + "Singaporese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "223"^^euvoc:EP, + "SGP"^^euvoc:FD_010, + "SG"^^euvoc:FD_140, + ".sg"^^euvoc:IANA_DOMAIN, + "SG"^^euvoc:ISG_COU, + "SG"^^euvoc:ISO_3166_1_ALPHA_2, + "SGP"^^euvoc:ISO_3166_1_ALPHA_3, + "702"^^euvoc:ISO_3166_1_NUM, + "SGP"^^euvoc:NAC, + "65"^^euvoc:PHONE_PREFIX, + "SG"^^euvoc:TED, + "SG"^^euvoc:TED_SCHEMA, + "SGP"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "702"^^euvoc:UNSD_M49 ; + skos:prefLabel "سنغافورة"@ar, + "Сингапур"@bg, + "Singapur"@ca, + "Singapur"@cs, + "Singapore"@da, + "Singapur"@de, + "Σιγκαπούρη"@el, + "Singapore"@en, + "Singapur"@es, + "Singapur"@et, + "Singapore"@fi, + "Singapour"@fr, + "Singeapór"@ga, + "Singapur"@hr, + "Szingapúr"@hu, + "Singapúr"@is, + "Singapore"@it, + "シンガポール"@ja, + "Singapur"@lb, + "Singapūras"@lt, + "Singapūra"@lv, + "Singapore"@mt, + "Singapore"@nl, + "Singapore"@no, + "Singapur"@pl, + "Singapura"@pt, + "Singapore"@ro, + "Сингапур"@ru, + "Singapur"@sk, + "Singapur"@sl, + "Singapore"@sv, + "Singapur"@tr, + "Сінгапур"@uk, + "新加坡"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SHN" ; + at:deprecated "false" ; + at:op-code "SHN" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "SH" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "SH" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "SHN" ; + dc:identifier "SHN" ; + skos:altLabel "Αγία Ελένη, Ασένσιον και Τριστάν ντα Κούνια"@el, + "San Héilin, Oileáin na Deascabhála agus Tristan da Cunha"@ga, + "Sankt-Helena, Ascension an Tristan da Cunha"@lb, + "Svētās Helēnas, Debesbraukšanas un Tristana da Kuņas salas"@lv, + "Sfânta Elena, Ascension şi Tristan da Cunha"@ro ; + skos:broader ; + skos:hiddenLabel "St. Helena"@de, + "von St. Helena"@de, + "Αγία Ελένη"@el, + "Αγίας Ελένης"@el, + "Saint Helena and Dependencies"@en, + "Saint Helenian"@en, + "St. Helena"@en, + "britannialainen, Saint Helenan, Ascensionin ja Tristan da Cunhan kansalainen"@fi, + "Sainte-Hélène"@fr, + "Sainte-Hélène et dépendances"@fr, + "de Sainte-Hélène"@fr, + "San Héilin"@ga, + "San Héilin agus a Spleáchríocha"@ga, + "duine ó Shan Héilin"@ga, + "Svete Helene, Ascensiona i Tristana Da Cunhae"@hr, + "Szent Ilona"@hu, + "Szent Ilona és kapcsolt területei"@hu, + "Szent Ilona-i"@hu, + "Sv. Helēnas Sala"@lv, + "Sv. Helēnas Sala un piederīgās teritorijas"@lv, + "Sv. Helēnas Salas"@lv, + "minn Saint Helena, Ascension u Tristan da Cunha"@mt, + "Wyspa Świętej Heleny, Wyspa Wniebowstąpienia i Tristan da Cunha"@pl, + "Wyspy Świętej Heleny, Wyspy Wniebowstąpienia i Tristan da Cunha"@pl, + "Svätá Helena"@sk, + "Sveta Helena"@sl, + "Sveta Helena in odvisna ozemlja"@sl, + "Svete Helene"@sl, + "Sankt Helena"@sv, + "från Sankt Helena"@sv ; + skos:historyNote "ISO 3166-1 Newsletter VI-7 of 22.2.2010: ‘Comprises: Saint Helena Island, Ascension Island, Tristan da Cunha Archipelago Gough Island, Inaccessible Island, Nightingale Island and Stoltenhoff Island’."@en, + "ISO 3166-1 Newsletter VI-7 du 22.2.2010: «Comprend: l’Île Sainte-Hélène, l’Île de l’Ascension et l’Archipel Tristan da Cunha, Île de Gough, Île Inaccessible, Île Nightingale et Île Stoltenhoff»."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:notation "159"^^euvoc:EP, + ".sh"^^euvoc:IANA_DOMAIN, + "SH"^^euvoc:ISG_COU, + "SH"^^euvoc:ISO_3166_1_ALPHA_2, + "SHN"^^euvoc:ISO_3166_1_ALPHA_3, + "SHN"^^euvoc:NAC, + "247"^^euvoc:PHONE_PREFIX, + "290"^^euvoc:PHONE_PREFIX, + "SH"^^euvoc:TED, + "SH"^^euvoc:TED_SCHEMA, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "654"^^euvoc:UNSD_M49 ; + skos:prefLabel "سانت هيلانة وأسنسيون وتريستان دا كونيا"@ar, + "Света Елена, Възнесение и Тристан да Куня"@bg, + "Santa Helena, Ascensió i Tristan da Cunha"@ca, + "Svatá Helena, Ascension a Tristan da Cunha"@cs, + "Saint Helena, Ascension og Tristan da Cunha"@da, + "St. Helena, Ascension und Tristan da Cunha"@de, + "Αγία Ελένη, Ασένσιον και Τριστάν ντα Κούνα"@el, + "Saint Helena, Ascension and Tristan da Cunha"@en, + "Santa Elena, Ascensión y Tristán da Cunha"@es, + "Saint Helena, Ascension ja Tristan da Cunha"@et, + "Saint Helena, Ascension ja Tristan da Cunha"@fi, + "Sainte-Hélène, Ascension et Tristan da Cunha"@fr, + "San Héilin, Oileán na Deascabhála agus Tristan da Cunha"@ga, + "Sveta Helena, Ascension i Tristan da Cunha"@hr, + "Szent Ilona, Ascension és Tristan da Cunha"@hu, + "Saint Helena, Ascension og Tristan da Cunha"@is, + "Sant’Elena, Ascensione e Tristan da Cunha"@it, + "セントヘレナ・アセンションおよびトリスタンダクーニャ"@ja, + "Saint Helena, Ascension an Tristan da Cunha"@lb, + "Šv. Elenos, Dangun Žengimo ir Tristano da Kunjos Salos"@lt, + "Svētās Helēnas, Debesbraukšanas un Tristana da Kuņas Salas"@lv, + "Saint Helena, Ascension u Tristan da Cunha"@mt, + "Sint-Helena, Ascension en Tristan da Cunha"@nl, + "St. Helena, Ascension og Tristan da Cunha"@no, + "Wyspa Świętej Heleny, Wyspa Wniebowstąpienia i Tristan da Cunha"@pl, + "Santa Helena, Ascensão e Tristão da Cunha"@pt, + "Sfânta Elena, Ascension și Tristan da Cunha"@ro, + "Острова Святой Елены, Вознесения и Тристан-да-Кунья"@ru, + "Svätá Helena, Ascension a Tristan da Cunha"@sk, + "Sveta Helena, Ascension in Tristan da Cunha"@sl, + "Sankt Helena, Ascension och Tristan da Cunha"@sv, + "Saint Helena, Ascension ve Tristan da Cunha"@tr, + "Острови Святої Єлени, Вознесіння і Тристан-да-Кунья"@uk, + "圣赫勒拿、阿森松和特里斯坦达库尼亚"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "SLB" ; + at:deprecated "false" ; + at:op-code "SLB" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SOLOIS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "SALOMON" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SB" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "SB" ; + dc:source "TED" ] ; + at:start.use "1978-07-07" ; + atold:op-code "SLB" ; + dc:identifier "SLB" ; + skos:altLabel "Solomoninselen"@lb, + "Solomonøyene"@no ; + skos:hiddenLabel "Νήσων Σολομώντος"@el, + "duine ó Oileáin Sholomón"@ga, + "Salamunovi Otoci"@hr, + "Salamunovih Otoka"@hr, + "Zālamana Salu"@lv, + "il-Gżejjer Solomon"@mt, + "Wysp Salomona"@pl, + "din Insulele Solomon"@ro ; + skos:inScheme atold:country, + , + , + ; + skos:notation "155"^^euvoc:EP, + "SOLOIS"^^euvoc:FD_010, + "SALOMON"^^euvoc:FD_050, + ".sb"^^euvoc:IANA_DOMAIN, + "SB"^^euvoc:ISG_COU, + "SB"^^euvoc:ISO_3166_1_ALPHA_2, + "SLB"^^euvoc:ISO_3166_1_ALPHA_3, + "090"^^euvoc:ISO_3166_1_NUM, + "SLB"^^euvoc:NAC, + "677"^^euvoc:PHONE_PREFIX, + "SB"^^euvoc:TED, + "SB"^^euvoc:TED_SCHEMA, + "Melanesia"^^euvoc:UNSD_GEOSCHEME, + "090"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر سالومون"@ar, + "Соломонови острови"@bg, + "Illes Salomó"@ca, + "Šalomounovy ostrovy"@cs, + "Salomonøerne"@da, + "Salomonen"@de, + "Νήσοι Σολομώντος"@el, + "Solomon Islands"@en, + "Islas Salomón"@es, + "Saalomoni Saared"@et, + "Salomonsaaret"@fi, + "Îles Salomon"@fr, + "Oileáin Sholomón"@ga, + "Salomonski Otoci"@hr, + "Salamon-szigetek"@hu, + "Salómonseyjar"@is, + "Isole Salomone"@it, + "ソロモン諸島"@ja, + "Salomonen"@lb, + "Saliamono Salos"@lt, + "Zālamana salas"@lv, + "Il-Gżejjer Solomon"@mt, + "Salomonseilanden"@nl, + "Salomonøyene"@no, + "Wyspy Salomona"@pl, + "Ilhas Salomão"@pt, + "Insulele Solomon"@ro, + "Соломоновы Острова"@ru, + "Šalamúnove ostrovy"@sk, + "Salomonovi otoki"@sl, + "Salomonöarna"@sv, + "Solomon Adaları"@tr, + "Соломонові Острови"@uk, + "所罗门群岛"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SLE" ; + at:deprecated "false" ; + at:op-code "SLE" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "WAL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "WAL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SL" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "SL" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1961-04-27" ; + atold:op-code "SLE" ; + dc:identifier "SLE" ; + skos:altLabel "جمهورية سيراليون"@ar, + "Република Сиера Леоне"@bg, + "República de Sierra Leone"@ca, + "Republika Sierra Leone"@cs, + "Republikken Sierra Leone"@da, + "Republik Sierra Leone"@de, + "Δημοκρατία της Σιέρρα Λεόνε"@el, + "Republic of Sierra Leone"@en, + "República de Sierra Leona"@es, + "Sierra Leone Vabariik"@et, + "Sierra Leonen tasavalta"@fi, + "République de Sierra Leone"@fr, + "Poblacht Shiarra Leon"@ga, + "Republika Sijera Leone"@hr, + "Sierra Leone Köztársaság"@hu, + "Lýðveldið Síerra Leóne"@is, + "Repubblica di Sierra Leone"@it, + "シエラレオネ共和国"@ja, + "Republik Sierra Leone"@lb, + "Siera Leonės Respublika"@lt, + "Sjerraleones Republika"@lv, + "Ir-Repubblika ta’ Sierra Leone"@mt, + "Republiek Sierra Leone"@nl, + "Republikken Sierra Leone"@no, + "Republika Sierra Leone"@pl, + "República da Serra Leoa"@pt, + "Republica Sierra Leone"@ro, + "Республика Сьерра-Леоне"@ru, + "Sierraleonská republika"@sk, + "Republika Sierra Leone"@sl, + "Republiken Sierra Leone"@sv, + "Sierra Leone Cumhuriyeti"@tr, + "Республіка Сьєрра-Леоне"@uk, + "塞拉利昂共和国"@zh ; + skos:hiddenLabel "Σιέρρας Λεόνε"@el, + "sierra-léonienne"@fr, + "Sijere Leonea"@hr, + "Siera Leonės"@lt, + "Sjerraleones"@lv, + "ir-Repubblika ta' Sierra Leone"@mt, + "Sierra Leoonse"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "162"^^euvoc:EP, + "WAL"^^euvoc:FD_010, + "WAL"^^euvoc:FD_400, + ".sl"^^euvoc:IANA_DOMAIN, + "SL"^^euvoc:ISG_COU, + "SL"^^euvoc:ISO_3166_1_ALPHA_2, + "SLE"^^euvoc:ISO_3166_1_ALPHA_3, + "694"^^euvoc:ISO_3166_1_NUM, + "SLE"^^euvoc:NAC, + "232"^^euvoc:PHONE_PREFIX, + "SL"^^euvoc:TED, + "SL"^^euvoc:TED_SCHEMA, + "WAL"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "694"^^euvoc:UNSD_M49 ; + skos:prefLabel "سيراليون"@ar, + "Сиера Леоне"@bg, + "Sierra Leone"@ca, + "Sierra Leone"@cs, + "Sierra Leone"@da, + "Sierra Leone"@de, + "Σιέρρα Λεόνε"@el, + "Sierra Leone"@en, + "Sierra Leona"@es, + "Sierra Leone"@et, + "Sierra Leone"@fi, + "Sierra Leone"@fr, + "Siarra Leon"@ga, + "Sijera Leone"@hr, + "Sierra Leone"@hu, + "Síerra Leóne"@is, + "Sierra Leone"@it, + "シエラレオネ"@ja, + "Sierra Leone"@lb, + "Siera Leonė"@lt, + "Sjerraleone"@lv, + "Sierra Leone"@mt, + "Sierra Leone"@nl, + "Sierra Leone"@no, + "Sierra Leone"@pl, + "Serra Leoa"@pt, + "Sierra Leone"@ro, + "Сьерра-Леоне"@ru, + "Sierra Leone"@sk, + "Sierra Leone"@sl, + "Sierra Leone"@sv, + "Sierra Leone"@tr, + "Сьєрра-Леоне"@uk, + "塞拉利昂"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SLV" ; + at:deprecated "false" ; + at:op-code "SLV" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "SV" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "ES" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SV" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "ES" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "SLV" ; + dc:identifier "SLV" ; + skos:altLabel "جمهورية السلفادور"@ar, + "Република Ел Салвадор"@bg, + "República de El Salvador"@ca, + "Salvadorská republika"@cs, + "Republikken El Salvador"@da, + "Republik El Salvador"@de, + "Δημοκρατία του Ελ Σαλβαδόρ"@el, + "Republic of El Salvador"@en, + "República de El Salvador"@es, + "El Salvadori Vabariik"@et, + "El Salvadorin tasavalta"@fi, + "République d’El Salvador"@fr, + "Poblacht na Salvadóire"@ga, + "Republika Salvador"@hr, + "Salvadori Köztársaság"@hu, + "Lýðveldið El Salvador"@is, + "Repubblica di El Salvador"@it, + "エルサルバドル共和国"@ja, + "Republik El Salvador"@lb, + "Salvadoro Respublika"@lt, + "Salvadoras Republika"@lv, + "Ir-Repubblika ta’ El Salvador"@mt, + "Republiek El Salvador"@nl, + "Republikken El Salvador"@no, + "Republika Salwadoru"@pl, + "República do Salvador"@pt, + "Republica El Salvador"@ro, + "Республика Эль-Сальвадор"@ru, + "Salvádorská republika"@sk, + "Republika Salvador"@sl, + "Republiken El Salvador"@sv, + "El Salvador Cumhuriyeti"@tr, + "Республіка Сальвадор"@uk, + "萨尔瓦多共和国"@zh ; + skos:hiddenLabel "Salvadorian; Salvadoran"@en, + "elsalvadorilainen"@fi, + "République d'El Salvador"@fr, + "an tSalvadóir"@ga, + "El Salvador"@hr, + "Republika El Salvador"@hr, + "Salvadoro"@lt, + "Salvadoras"@lv, + "ir-Repubblika ta' El Salvador"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "168"^^euvoc:EP, + "ES"^^euvoc:FD_010, + "ES"^^euvoc:FD_400, + ".sv"^^euvoc:IANA_DOMAIN, + "SV"^^euvoc:IBAN_COU, + "SV"^^euvoc:ISG_COU, + "SV"^^euvoc:ISO_3166_1_ALPHA_2, + "SLV"^^euvoc:ISO_3166_1_ALPHA_3, + "222"^^euvoc:ISO_3166_1_NUM, + "SLV"^^euvoc:NAC, + "503"^^euvoc:PHONE_PREFIX, + "SV"^^euvoc:TED, + "SV"^^euvoc:TED_SCHEMA, + "ES"^^euvoc:TIR, + "Central America"^^euvoc:UNSD_GEOSCHEME, + "222"^^euvoc:UNSD_M49 ; + skos:prefLabel "السلفادور"@ar, + "Ел Салвадор"@bg, + "El Salvador"@ca, + "Salvador"@cs, + "El Salvador"@da, + "El Salvador"@de, + "Ελ Σαλβαδόρ"@el, + "El Salvador"@en, + "El Salvador"@es, + "El Salvador"@et, + "El Salvador"@fi, + "El Salvador"@fr, + "An tSalvadóir"@ga, + "Salvador"@hr, + "Salvador"@hu, + "El Salvador"@is, + "El Salvador"@it, + "エルサルバドル"@ja, + "El Salvador"@lb, + "Salvadoras"@lt, + "Salvadora"@lv, + "El Salvador"@mt, + "El Salvador"@nl, + "El Salvador"@no, + "Salwador"@pl, + "Salvador"@pt, + "El Salvador"@ro, + "Эль-Сальвадор"@ru, + "Salvádor"@sk, + "Salvador"@sl, + "El Salvador"@sv, + "El Salvador"@tr, + "Сальвадор"@uk, + "萨尔瓦多"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SMR" ; + at:deprecated "false" ; + at:op-code "SMR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RSM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RSM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SM" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "SM" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "SMR" ; + dc:identifier "SMR" ; + skos:altLabel "جمهورية سان مارينو"@ar, + "Рэспу́бліка Сан-Марына"@be, + "Република Сан Марино"@bg, + "Republika San Marino"@bs, + "República de San Marino"@ca, + "Republika San Marino"@cs, + "Republikken San Marino"@da, + "Republik San Marino"@de, + "Δημοκρατία του Αγίου Μαρίνου"@el, + "Republic of San Marino"@en, + "República de San Marino"@es, + "San Marino Vabariik"@et, + "San Marinoko Errepublika"@eu, + "San Marinon tasavalta"@fi, + "République de Saint-Marin"@fr, + "Poblacht San Mairíne"@ga, + "República de San Mariño"@gl, + "Republika San Marino"@hr, + "San Marino Köztársaság"@hu, + "Lýðveldið San Marínó"@is, + "Repubblica di San Marino"@it, + "サンマリノ共和国"@ja, + "Republik San Marino"@lb, + "San Marino Respublika"@lt, + "Sanmarīno Republika"@lv, + "Република Сан Марино"@mk, + "Ir-Repubblika ta’ San Marino"@mt, + "Republiek San Marino"@nl, + "Republikken San Marino"@no, + "Republika San Marino"@pl, + "República de San Marino"@pt, + "Republica da San Marino"@rm, + "Republica San Marino"@ro, + "Республика Сан-Марино"@ru, + "Sanmarínska republika"@sk, + "Republika San Marino"@sl, + "Republika San Marino"@sq, + "Republik San Marino"@sv, + "San Marino Cumhuriyeti"@tr, + "Республіка Сан-Марино"@uk, + "圣马力诺共和国"@zh ; + skos:hiddenLabel "Αγίου Μαρίνου"@el, + "sanmarinsko"@hr, + "San Marinas"@lt, + "ir-Repubblika ta' San Marino"@mt, + "San Marinese"@nl, + "República de São Marinho"@pt, + "São Marinho"@pt, + "Republica San-Marino"@ro, + "San-Marino"@ro, + "Republiken San Marino"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "163"^^euvoc:EP, + "RSM"^^euvoc:FD_010, + "RSM"^^euvoc:FD_400, + ".sm"^^euvoc:IANA_DOMAIN, + "SM"^^euvoc:IBAN_COU, + "SM"^^euvoc:ISG_COU, + "SM"^^euvoc:ISO_3166_1_ALPHA_2, + "SMR"^^euvoc:ISO_3166_1_ALPHA_3, + "674"^^euvoc:ISO_3166_1_NUM, + "SMR"^^euvoc:NAC, + "378"^^euvoc:PHONE_PREFIX, + "SM"^^euvoc:TED, + "SM"^^euvoc:TED_SCHEMA, + "RSM"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "674"^^euvoc:UNSD_M49 ; + skos:prefLabel "سان مارينو"@ar, + "Сан-Марына"@be, + "Сан Марино"@bg, + "San Marino"@bs, + "San Marino"@ca, + "San Marino"@cs, + "San Marino"@da, + "San Marino"@de, + "Άγιος Μαρίνος"@el, + "San Marino"@en, + "San Marino"@es, + "San Marino"@et, + "San Marino"@eu, + "San Marino"@fi, + "San Marino"@fo, + "Saint-Marin"@fr, + "San Mairíne"@ga, + "San Mariño"@gl, + "San Marino"@hr, + "San Marino"@hu, + "San Marínó"@is, + "San Marino"@it, + "サンマリノ"@ja, + "San Marino"@lb, + "San Marino"@lt, + "Sanmarīno"@lv, + "Сан Марино"@mk, + "San Marino"@mt, + "San Marino"@nl, + "San Marino"@no, + "San Marino"@pl, + "San Marino"@pt, + "San Marino"@ro, + "Сан-Марино"@ru, + "San Maríno"@sk, + "San Marino"@sl, + "San Marino"@sq, + "San Marino"@sv, + "San Marino"@tr, + "Сан-Марино"@uk, + "圣马力诺"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SPM" ; + at:deprecated "false" ; + at:op-code "SPM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "PM" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "PM" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "SPM" ; + dc:identifier "SPM" ; + skos:altLabel "التجمع الإقليمي لسانت بيير وميكلون"@ar, + "Териториална общност Сен Пиер и Микелон"@bg, + "Col·lectivitat Territorial de Saint-Pierre-et-Miquelon"@ca, + "Územní společenství Saint-Pierre a Miquelon"@cs, + "Det Oversøiske Område Saint-Pierre og Miquelon"@da, + "Gebietskörperschaft St. Pierre und Miquelon"@de, + "Εδαφική Κοινότητα Σεν Πιέρ και Μικελόν"@el, + "Territorial Collectivity of Saint Pierre and Miquelon"@en, + "Colectividad Territorial de San Pedro y Miquelón"@es, + "Saint-Pierre’i ja Miqueloni territoriaalühendus"@et, + "Saint-Pierren ja Miquelonin alueellinen yhteisö"@fi, + "Collectivité territoriale de Saint-Pierre-et-Miquelon"@fr, + "Comhroinn Chríochach San Pierre agus Miquelon"@ga, + "Teritorijalna Zajednica Sveti Petar i Mikelon"@hr, + "Saint-Pierre és Miquelon Területi Közösség"@hu, + "Sameiginlegu landsvæðin Sankti Pierre og Miquelon"@is, + "Collettività territoriale di Saint Pierre e Miquelon"@it, + "セントビンセントおよびグレナディーン諸島"@ja, + "Gebittskierperschaft Saint-Pierre a Miquelon"@lb, + "Sen Pjero ir Mikelono Teritorinė Bendrija"@lt, + "Senpjēras un Mikelonas teritoriālā vienība"@lv, + "Il-Kollettività Territorjali ta’ Saint Pierre u Miquelon"@mt, + "Territoriale Gemeenschap Saint-Pierre en Miquelon"@nl, + "Territorielt kollektiv av Saint Pierre og Miquelon"@no, + "Autarquia Territorial de São Pedro e Miquelon"@pt, + "Colectivitatea Teritorială Saint Pierre şi Miquelon"@ro, + "Территориальное сообщество Сен-Пьер и Микелон"@ru, + "Ostrovy Saint Pierre a Miquelon"@sk, + "Ozemeljska skupnost Sveta Peter in Mihael"@sl, + "Territorialområdet Saint-Pierre och Miquelon"@sv, + "Saint-Pierre ve Miquelon Bölgesel Kolektivitesi"@tr, + "Територіальна спільнота Сен-П'єр і Мікелон"@uk, + "圣皮埃尔和密克隆领土集体"@zh ; + skos:broader ; + skos:hiddenLabel "St. Pierre a Miquelon"@cs, + "Εδαφική Κοινότητα του Σαιν Πιερ και Μικελόν"@el, + "Σαιν Πιερ και Μικελόν"@el, + "ranskalainen, Saint-Pierren ja Miquelonin asukas"@fi, + "française"@fr, + "duine ó Shan Pierre agus Miquelon"@ga, + "Saint-Pierre-et-Miquelona"@hr, + "Teritorijalna Zajednica Saint-Pierre-et-Miquelon"@hr, + "Saint Pierre és Miquelon"@hu, + "Senpjēras un Mikelonas Teritoriālā Kopiena"@lv, + "il-Kollettività Territorjali ta' Saint Pierre u Miquelon"@mt, + "minn Saint Pierre u Miquelon"@mt, + "Wspólnota Terytorialna Saint-Pierre i Miquelon"@pl, + "Coletividade Territorial de São Pedro e MiquelãoSão Pedro e Miquelão"@pt, + "São Pedro e Miquelão"@pt, + "de São Pedro e Miquelão"@pt, + "Colectivitatea teritorială Saint-Pierre și Miquelon"@ro, + "Saint-Pierre și Miquelon"@ro, + "din Saint-Pierre și Miquelon"@ro, + "Ozemeljska skupnost Saint Pierre in Miquelon"@sl, + "Saint Pierra in Miquelona"@sl, + "Saint-Pierre-et-Miquelon"@sv, + "Territorialområdet Saint-Pierre-et-Miquelon"@sv ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "248"^^euvoc:EP, + ".pm"^^euvoc:IANA_DOMAIN, + "PM"^^euvoc:ISG_COU, + "PM"^^euvoc:ISO_3166_1_ALPHA_2, + "SPM"^^euvoc:ISO_3166_1_ALPHA_3, + "666"^^euvoc:ISO_3166_1_NUM, + "SPM"^^euvoc:NAC, + "508"^^euvoc:PHONE_PREFIX, + "PM"^^euvoc:TED, + "PM"^^euvoc:TED_SCHEMA, + "Northern America"^^euvoc:UNSD_GEOSCHEME, + "666"^^euvoc:UNSD_M49 ; + skos:prefLabel "سانت بيير وميكلون"@ar, + "Сен Пиер и Микелон"@bg, + "Saint-Pierre-et-Miquelon"@ca, + "Saint-Pierre a Miquelon"@cs, + "Saint-Pierre og Miquelon"@da, + "St. Pierre und Miquelon"@de, + "Σεν Πιέρ και Μικελόν"@el, + "Saint Pierre and Miquelon"@en, + "San Pedro y Miquelón"@es, + "Saint-Pierre ja Miquelon"@et, + "Saint-Pierre ja Miquelon"@fi, + "Saint-Pierre-et-Miquelon"@fr, + "San Pierre agus Miquelon"@ga, + "Sveti Petar i Mikelon"@hr, + "Saint-Pierre és Miquelon"@hu, + "Sankti Pierre og Miquelon"@is, + "Saint Pierre e Miquelon"@it, + "サンピエール・ミクロン"@ja, + "Saint-Pierre a Miquelon"@lb, + "Sen Pjeras ir Mikelonas"@lt, + "Senpjēra un Mikelona"@lv, + "Saint Pierre u Miquelon"@mt, + "Saint-Pierre en Miquelon"@nl, + "Saint Pierre og Miquelon"@no, + "Saint-Pierre i Miquelon"@pl, + "São Pedro e Miquelon"@pt, + "Saint Pierre şi Miquelon"@ro, + "Сен-Пьер и Микелон"@ru, + "Saint Pierre a Miquelon"@sk, + "Sveta Peter in Mihael"@sl, + "Saint-Pierre och Miquelon"@sv, + "Saint Pierre ve Miquelon"@tr, + "Сен-П'єр і Мікелон"@uk, + "圣皮埃尔和密克隆"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "SRB" ; + at:deprecated "false" ; + at:op-code "SRB" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "RS" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "REPSER" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "RS" ; + dc:source "TED" ] ; + at:start.use "2006-06-05" ; + atold:op-code "SRB" ; + dc:identifier "SRB" ; + skos:altLabel "جمهورية صربيا"@ar, + "Рэспу́бліка Сербія"@be, + "Република Сърбия"@bg, + "Republika Srbija"@bs, + "República de Sèrbia"@ca, + "Republika Srbsko"@cs, + "Republikken Serbien"@da, + "Republik Serbien"@de, + "Δημοκρατία της Σερβίας"@el, + "Republic of Serbia"@en, + "República de Serbia"@es, + "Serbia Vabariik"@et, + "Serbiako Errepublika"@eu, + "Serbian tasavalta"@fi, + "Lýðveldið Serbia"@fo, + "République de Serbie"@fr, + "Poblacht na Seirbia"@ga, + "República de Serbia"@gl, + "Republika Srbija"@hr, + "Szerb Köztársaság"@hu, + "Lýðveldið Serbía"@is, + "Repubblica di Serbia"@it, + "セルビア共和国"@ja, + "Republik Serbien"@lb, + "Serbijos Respublika"@lt, + "Serbijas Republika"@lv, + "Република Србија"@mk, + "Ir-Repubblika tas-Serbja"@mt, + "Republiek Servië"@nl, + "Republikken Serbia"@no, + "Republika Serbii"@pl, + "República da Sérvia"@pt, + "Republica da la Serbia"@rm, + "Republica Serbia"@ro, + "Республика Сербия"@ru, + "Srbská republika"@sk, + "Republika Srbija"@sl, + "Republika e Serbisë"@sq, + "Република Србија"@sr, + "Republiken Serbien"@sv, + "Sırbistan Cumhuriyeti"@tr, + "Республіка Сербія"@uk, + "塞尔维亚共和国"@zh ; + skos:changeNote "Opening event: Splitting of the country State Union of Serbia and Montenegro COU0011 into Republic of Serbia COU0048 and Republic of Montenegro COU0039."@en ; + skos:hiddenLabel "an tSeirbia"@ga, + "srbijansko"@hr, + "Serbijos"@lt, + "Serbijas"@lv, + "ir-Repubblika tas-Serbja"@mt, + "is-Serbja"@mt, + "Srbija"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "285"^^euvoc:EP, + "REPSER"^^euvoc:FD_010, + ".rs"^^euvoc:IANA_DOMAIN, + "RS"^^euvoc:IBAN_COU, + "RS"^^euvoc:ISG_COU, + "RS"^^euvoc:ISO_3166_1_ALPHA_2, + "SRB"^^euvoc:ISO_3166_1_ALPHA_3, + "688"^^euvoc:ISO_3166_1_NUM, + "SRB"^^euvoc:NAC, + "381"^^euvoc:PHONE_PREFIX, + "RS"^^euvoc:TED, + "RS"^^euvoc:TED_SCHEMA, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "688"^^euvoc:UNSD_M49 ; + skos:prefLabel "صربيا"@ar, + "Сербія"@be, + "Сърбия"@bg, + "Srbija"@bs, + "Sèrbia"@ca, + "Srbsko"@cs, + "Serbien"@da, + "Serbien"@de, + "Σερβία"@el, + "Serbia"@en, + "Serbia"@es, + "Serbia"@et, + "Serbia"@eu, + "Serbia"@fi, + "Serbia"@fo, + "Serbie"@fr, + "An tSeirbia"@ga, + "Serbia"@gl, + "Srbija"@hr, + "Szerbia"@hu, + "Serbía"@is, + "Serbia"@it, + "セルビア"@ja, + "Serbien"@lb, + "Serbija"@lt, + "Serbija"@lv, + "Србија"@mk, + "Is-Serbja"@mt, + "Servië"@nl, + "Serbia"@no, + "Serbia"@pl, + "Sérvia"@pt, + "Serbia"@rm, + "Serbia"@ro, + "Сербия"@ru, + "Srbsko"@sk, + "Sŕbija"@sl, + "Serbia"@sq, + "Србија"@sr, + "Serbien"@sv, + "Sırbistan"@tr, + "Сербія"@uk, + "塞尔维亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SSD" ; + at:deprecated "false" ; + at:op-code "SSD" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "SS" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "SS" ; + dc:source "TED" ] ; + at:start.use "2011-07-09" ; + atold:op-code "SSD" ; + dc:identifier "SSD" ; + skos:altLabel "جمهورية جنوب السودان"@ar, + "Република Южен Судан"@bg, + "República del Sudan del Sud"@ca, + "Jihosúdánská republika"@cs, + "Republikken Sydsudan"@da, + "Republik Südsudan"@de, + "Δημοκρατία του Νότιου Σουδάν"@el, + "Republic of South Sudan"@en, + "República de Sudán del Sur"@es, + "Lõuna-Sudaani Vabariik"@et, + "Etelä-Sudanin tasavalta"@fi, + "République du Soudan du Sud"@fr, + "Poblacht na Súdáine Theas"@ga, + "Republika Južni Sudan"@hr, + "Dél-szudáni Köztársaság"@hu, + "Lýðveldið Suður-Súdan"@is, + "Repubblica del Sud Sudan"@it, + "南スーダン共和国"@ja, + "Republik Südsudan"@lb, + "Pietų Sudano Respublika"@lt, + "Dienvidsudānas Republika"@lv, + "Ir-Repubblika tas-Sudan t’Isfel"@mt, + "Republiek Zuid-Sudan"@nl, + "Republikken Sør-Sudan"@no, + "Republika Sudanu Południowego"@pl, + "República do Sudão do Sul"@pt, + "Republica Sudanul de Sud"@ro, + "Республика Южный Судан"@ru, + "Juhosudánska republika"@sk, + "Republika Južni Sudan"@sl, + "Republiken Sydsudan"@sv, + "Güney Sudan Cumhuriyeti"@tr, + "Республіка Південний Судан"@uk, + "南苏丹共和国"@zh ; + skos:hiddenLabel "Δημοκρατία του Νοτίου Σουδάν"@el, + "Νοτίου Σουδάν"@el, + "Lõuna-Sudaani"@et, + "an tSúdáin Theas"@ga, + "duine ón tSúdáin Theas"@ga, + "Pietų Sudano"@lt, + "Dienvidsudānas"@lv, + "ir-Repubblika tas-Sudan t’Isfel"@mt, + "is-Sudan t’Isfel"@mt, + "Zuid-Sudanese"@nl ; + skos:historyNote "ISO 3166-1 Newsletter VI-10 of 9.8.2011: ‘Split of Sudan into Sudan north part and South Sudan south part’."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "291"^^euvoc:EP, + ".ss"^^euvoc:IANA_DOMAIN, + "SS"^^euvoc:ISG_COU, + "SS"^^euvoc:ISO_3166_1_ALPHA_2, + "SSD"^^euvoc:ISO_3166_1_ALPHA_3, + "728"^^euvoc:ISO_3166_1_NUM, + "SSD"^^euvoc:NAC, + "211"^^euvoc:PHONE_PREFIX, + "SS"^^euvoc:TED, + "SS"^^euvoc:TED_SCHEMA, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "728"^^euvoc:UNSD_M49 ; + skos:prefLabel "جنوب السودان"@ar, + "Южен Судан"@bg, + "Sudan del Sud"@ca, + "Jižní Súdán"@cs, + "Sydsudan"@da, + "Südsudan"@de, + "Νότιο Σουδάν"@el, + "South Sudan"@en, + "Sudán del Sur"@es, + "Lõuna-Sudaan"@et, + "Etelä-Sudan"@fi, + "Soudan du Sud"@fr, + "An tSúdáin Theas"@ga, + "Južni Sudan"@hr, + "Dél-Szudán"@hu, + "Suður-Súdan"@is, + "Sud Sudan"@it, + "南スーダン"@ja, + "Südsudan"@lb, + "Pietų Sudanas"@lt, + "Dienvidsudāna"@lv, + "Is-Sudan t’Isfel"@mt, + "Zuid-Sudan"@nl, + "Sør-Sudan"@no, + "Sudan Południowy"@pl, + "Sudão do Sul"@pt, + "Sudanul de Sud"@ro, + "Южный Судан"@ru, + "Južný Sudán"@sk, + "Južni Sudan"@sl, + "Sydsudan"@sv, + "Güney Sudan"@tr, + "Південний Судан"@uk, + "南苏丹"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "STP" ; + at:deprecated "false" ; + at:op-code "STP" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "STP" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "ST" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "ST" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1975-07-12" ; + atold:op-code "STP" ; + dc:identifier "STP" ; + skos:altLabel "جمهورية سان تومي وبرينسيبي الديمقراطية"@ar, + "Демократична република Сао Томе и Принсипи"@bg, + "República Democràtica de São Tomé i Príncipe"@ca, + "Demokratická republika Svatý Tomáš a Princův ostrov"@cs, + "Den Demokratiske Republik São Tomé og Príncipe"@da, + "Demokratische Republik São Tomé und Príncipe"@de, + "Λαϊκή Δημοκρατία του Σάο Τομέ και Πρίνσιπε"@el, + "Democratic Republic of São Tomé and Príncipe"@en, + "República Democrática de Santo Tomé y Príncipe"@es, + "São Tomé ja Príncipe Demokraatlik Vabariik"@et, + "São Tomén ja Príncipen demokraattinen tasavalta"@fi, + "République démocratique de Sao Tomé-et-Principe"@fr, + "São Tomé e Príncipe"@fr, + "Poblacht Dhaonlathach São Tomé agus Príncipe"@ga, + "Demokratska Republika Sveti Toma i Princ"@hr, + "São Tomé és Príncipe Demokratikus Köztársaság"@hu, + "Lýðstjórnarlýðveldið Saó Tóme og Prinsípe"@is, + "Repubblica democratica di São Tomé e Príncipe"@it, + "サントメ・プリンシペ民主共和国"@ja, + "Demokratesch Republik vu São Tomé a Príncipe"@lb, + "San Tomė ir Prinsipės Demokratinė Respublika"@lt, + "Santomes un Prinsipi Demokrātiskā Republika"@lv, + "Ir-Repubblika Demokratika ta’ São Tomé u Príncipe"@mt, + "Democratische Republiek Sao Tomé en Principe"@nl, + "Den demokratiske republikk São Tomé og Príncipe"@no, + "Republika Demokratyczna Wysp Świętego Tomasza i Książęcej"@pl, + "República Democrática de São Tomé e Príncipe"@pt, + "Republica Democratică São Tomé şi Principe"@ro, + "Демократическая Республика Сан-Томе и Принсипи"@ru, + "Demokratická republika Svätého Tomáša a Princovho ostrova"@sk, + "Demokratična republika Sveti Tomaž in Princ"@sl, + "Demokratiska republiken São Tomé och Príncipe"@sv, + "Sao Tome ve Principe Demokratik Cumhuriyeti"@tr, + "Демократична Республіка Сан-Томе і Принсіпі"@uk, + "圣多美和普林西比民主共和国"@zh ; + skos:hiddenLabel "fra São Tomé og Príncipe, saotomesisk"@da, + "Democratic Republic of São Tomé e Príncipe"@en, + "Sao Tome and Principe"@en, + "République démocratique de São Tomé e Príncipe"@fr, + "Sao Tomé agus Príncipe"@ga, + "duine ó São Tomé agus Príncipe"@ga, + "Demokratska Republika Sveti Toma i Prinsipe"@hr, + "Sveti Toma i Prinsipe"@hr, + "Svetog Tome i Prinsipea"@hr, + "ir-Repubblika Demokratika ta' São Tomé u Príncipe"@mt, + "minn São Tomé u Príncipe"@mt, + "Demokratyczna Republika Wysp Świętego Tomasza i Książęcej"@pl, + "Wysp Świętego Tomasza i Książęcej"@pl, + "são-tomense"@pt, + "Republica Democratică São Tomé și Principe"@ro, + "São Tomé și Principe"@ro, + "din São Tomé și Principe"@ro, + "sãotomejsko"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "252"^^euvoc:EP, + "STP"^^euvoc:FD_010, + ".st"^^euvoc:IANA_DOMAIN, + "ST"^^euvoc:IBAN_COU, + "ST"^^euvoc:ISG_COU, + "ST"^^euvoc:ISO_3166_1_ALPHA_2, + "STP"^^euvoc:ISO_3166_1_ALPHA_3, + "678"^^euvoc:ISO_3166_1_NUM, + "STP"^^euvoc:NAC, + "239"^^euvoc:PHONE_PREFIX, + "ST"^^euvoc:TED, + "ST"^^euvoc:TED_SCHEMA, + "Middle Africa"^^euvoc:UNSD_GEOSCHEME, + "678"^^euvoc:UNSD_M49 ; + skos:prefLabel "سان تومي وبرينسيبي"@ar, + "Сао Томе и Принсипи"@bg, + "São Tomé i Príncipe"@ca, + "Svatý Tomáš a Princův ostrov"@cs, + "São Tomé og Príncipe"@da, + "São Tomé und Príncipe"@de, + "Σάο Τομέ και Πρίνσιπε"@el, + "São Tomé and Príncipe"@en, + "Santo Tomé y Príncipe"@es, + "São Tomé ja Príncipe"@et, + "São Tomé ja Príncipe"@fi, + "Sao Tomé-et-Principe"@fr, + "São Tomé agus Príncipe"@ga, + "Sveti Toma i Princ"@hr, + "São Tomé és Príncipe"@hu, + "Saó Tóme og Prinsípe"@is, + "São Tomé e Príncipe"@it, + "サントメ・プリンシペ"@ja, + "São Tomé a Príncipe"@lb, + "San Tomė ir Prinsipė"@lt, + "Santome un Prinsipi"@lv, + "São Tomé u Príncipe"@mt, + "Sao Tomé en Principe"@nl, + "São Tomé og Príncipe"@no, + "Wyspy Świętego Tomasza i Książęca"@pl, + "São Tomé e Príncipe"@pt, + "São Tomé și Príncipe"@ro, + "Сан-Томе и Принсипи"@ru, + "Svätý Tomáš a Princov ostrov"@sk, + "Sveti Tomaž in Princ"@sl, + "São Tomé och Príncipe"@sv, + "Sao Tome ve Principe"@tr, + "Сан-Томе і Принсіпі"@uk, + "圣多美和普林西比"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SUR" ; + at:deprecated "false" ; + at:op-code "SUR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SME" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SME" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "SR" ; + dc:source "TED" ] ; + at:start.use "1975-11-25" ; + atold:op-code "SUR" ; + dc:identifier "SUR" ; + skos:altLabel "جمهورية سورينام"@ar, + "Република Суринам"@bg, + "República de Surinam"@ca, + "Surinamská republika"@cs, + "Republikken Surinam"@da, + "Republik Suriname"@de, + "Δημοκρατία του Σουρινάμ"@el, + "Republic of Suriname"@en, + "República de Surinam"@es, + "Suriname Vabariik"@et, + "Surinamen tasavalta"@fi, + "République du Suriname"@fr, + "Poblacht Shuranam"@ga, + "Republika Surinam"@hr, + "Suriname Köztársaság"@hu, + "Lýðveldið Súrínam"@is, + "Repubblica di Suriname"@it, + "スリナム共和国"@ja, + "Republik Surinam"@lb, + "Surinamo Respublika"@lt, + "Surinamas Republika"@lv, + "Ir-Repubblika tas-Suriname"@mt, + "Republiek Suriname"@nl, + "Republikken Surinam"@no, + "Republika Surinamu"@pl, + "República do Suriname"@pt, + "Republica Suriname"@ro, + "Республика Суринам"@ru, + "Surinamská republika"@sk, + "Republika Surinam"@sl, + "Republiken Surinam"@sv, + "Surinam Cumhuriyeti"@tr, + "Республіка Суринам"@uk, + "苏里南共和国"@zh ; + skos:hiddenLabel "Surinamo"@lt, + "Surinamas"@lv, + "ir-Repubblika tas-Suriname"@mt, + "is-Suriname"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "166"^^euvoc:EP, + "SME"^^euvoc:FD_010, + "SME"^^euvoc:FD_400, + ".sr"^^euvoc:IANA_DOMAIN, + "SR"^^euvoc:ISG_COU, + "SR"^^euvoc:ISO_3166_1_ALPHA_2, + "SUR"^^euvoc:ISO_3166_1_ALPHA_3, + "740"^^euvoc:ISO_3166_1_NUM, + "SUR"^^euvoc:NAC, + "597"^^euvoc:PHONE_PREFIX, + "SR"^^euvoc:TED, + "SR"^^euvoc:TED_SCHEMA, + "SME"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "740"^^euvoc:UNSD_M49 ; + skos:prefLabel "سورينام"@ar, + "Суринам"@bg, + "Surinam"@ca, + "Surinam"@cs, + "Surinam"@da, + "Suriname"@de, + "Σουρινάμ"@el, + "Suriname"@en, + "Surinam"@es, + "Suriname"@et, + "Suriname"@fi, + "Suriname"@fr, + "Suranam"@ga, + "Surinam"@hr, + "Suriname"@hu, + "Súrínam"@is, + "Suriname"@it, + "スリナム"@ja, + "Surinam"@lb, + "Surinamas"@lt, + "Surinama"@lv, + "Is-Suriname"@mt, + "Suriname"@nl, + "Suriname"@no, + "Surinam"@pl, + "Suriname"@pt, + "Suriname"@ro, + "Суринам"@ru, + "Surinam"@sk, + "Surinam"@sl, + "Surinam"@sv, + "Surinam"@tr, + "Суринам"@uk, + "苏里南"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SWZ" ; + at:deprecated "false" ; + at:op-code "SWZ" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "SZ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "SZ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SD" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SD" ; + dc:source "EurLex" ] ; + at:start.use "1968-09-06" ; + atold:op-code "SWZ" ; + dc:identifier "SWZ" ; + skos:altLabel "مملكة اسواتيني"@ar, + "Кралство Есватини"@bg, + "Regne d'Eswatini"@ca, + "Svazijské království"@cs, + "Kongeriget Eswatini"@da, + "Königreich Eswatini"@de, + "Βασίλειο του Εσουατίνι"@el, + "Kingdom of Eswatini"@en, + "Reino de Esuatini"@es, + "Eswatini Kuningriik"@et, + "Eswatini"@fi, + "Eswatinin kuningaskunta"@fi, + "Royaume d’Eswatini"@fr, + "Ríocht Eswatini"@ga, + "Kraljevina Eswatini"@hr, + "Szváziföldi Királyság"@hu, + "Konungsríkið Esvatíní"@is, + "Regno di Eswatini"@it, + "エスワティニ王国"@ja, + "Kinnekräich Eswatini"@lb, + "Esvatinio Karalystė"@lt, + "Svatini Karaliste"@lv, + "Кралство еСватини"@mk, + "Ir-Renju tal-Eswatini"@mt, + "Koninkrijk Eswatini"@nl, + "Kongeriket Eswatini"@no, + "Królestwo Eswatini"@pl, + "Reino de Essuatíni"@pt, + "Regatul Eswatini"@ro, + "Королевство Эсватини"@ru, + "Eswatinské kráľovstvo"@sk, + "Kraljevina Esvatini"@sl, + "Краљевина Есватини"@sr, + "Swatini"@ss, + "Konungariket Eswatini"@sv, + "Esvatini Krallığı"@tr, + "Королівство Есватіні"@uk, + "斯威士兰王国"@zh ; + skos:hiddenLabel "Кралство Свазиленд"@bg, + "Свазиленд"@bg, + "Kongeriget Swaziland"@da, + "Swaziland"@da, + "Königreich Swasiland"@de, + "Swasiland"@de, + "Βασίλειο της Σουαζιλάνδης"@el, + "Σουαζιλάνδη"@el, + "Σουαζιλάνδης"@el, + "Kingdom of Swaziland"@en, + "Swaziland"@en, + "Reino de Suazilandia"@es, + "Suazilandia"@es, + "suazi"@es, + "Swazimaan kuningaskunta"@fi, + "Royaume du Swaziland"@fr, + "Swaziland"@fr, + "Ríocht na Suasalainne"@ga, + "an tSuasalainn"@ga, + "Kraljevina Svazi"@hr, + "Svazi"@hr, + "Regno dello Swaziland"@it, + "Swaziland"@it, + "swazi"@it, + "Svazilandas"@lt, + "Svazilando"@lt, + "Svazilando Karalystė"@lt, + "Svazilenda"@lv, + "Svazilendas"@lv, + "Svazilendas Karaliste"@lv, + "Swazilandiża"@mt, + "ir-Renju tas-Swaziland"@mt, + "is-Swaziland"@mt, + "Koninkrijk Swaziland"@nl, + "Swaziland"@nl, + "Swazische"@nl, + "Królestwo Suazi"@pl, + "Suazi"@pl, + "Reino da Suazilândia"@pt, + "Suazilândia"@pt, + "suazilandesa"@pt, + "Regatul Swaziland"@ro, + "Swaziland"@ro, + "Svazijsko"@sk, + "Svazijské kráľovstvo"@sk, + "Kraljevina Svazi"@sl, + "Svazi"@sl, + "svazijsko"@sl, + "Konungariket Swaziland"@sv, + "Swaziland"@sv, + "swaziländsk"@sv ; + skos:historyNote "According to the IATE file 861172 for Finnish it is also possible to use the short form ‘Eswatini’."@en, + "Interinstitutional Style Guide: Czech and Hungarian labels stay unchanged."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "170"^^euvoc:EP, + "SD"^^euvoc:FD_010, + "SD"^^euvoc:FD_400, + ".sz"^^euvoc:IANA_DOMAIN, + "SZ"^^euvoc:ISG_COU, + "SZ"^^euvoc:ISO_3166_1_ALPHA_2, + "SWZ"^^euvoc:ISO_3166_1_ALPHA_3, + "748"^^euvoc:ISO_3166_1_NUM, + "SWZ"^^euvoc:NAC, + "268"^^euvoc:PHONE_PREFIX, + "SZ"^^euvoc:TED, + "SZ"^^euvoc:TED_SCHEMA, + "SD"^^euvoc:TIR, + "Southern Africa"^^euvoc:UNSD_GEOSCHEME, + "748"^^euvoc:UNSD_M49 ; + skos:prefLabel "إسواتيني"@ar, + "Есватини"@bg, + "Eswatini"@ca, + "Svazijsko"@cs, + "Eswatini"@da, + "Eswatini"@de, + "Εσουατίνι"@el, + "Eswatini"@en, + "Esuatini"@es, + "Eswatini"@et, + "Swazimaa"@fi, + "Eswatini"@fr, + "Eswatini"@ga, + "Esvatini"@hr, + "Szváziföld"@hu, + "Esvatíní"@is, + "Eswatini"@it, + "エスワティニ"@ja, + "Eswatini"@lb, + "Esvatinis"@lt, + "Svatini"@lv, + "L-Eswatini"@mt, + "Eswatini"@nl, + "Eswatini"@no, + "Eswatini"@pl, + "Essuatíni"@pt, + "Eswatini"@ro, + "Эсватини"@ru, + "Eswatini"@sk, + "Esvatini"@sl, + "Есватини"@sr, + "Eswatini"@sv, + "Esvatini"@tr, + "Есватіні"@uk, + "斯威士兰"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SXM" ; + at:deprecated "false" ; + at:op-code "SXM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "SX" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "SX" ; + dc:source "TED" ] ; + at:start.use "2010-10-10" ; + atold:op-code "SXM" ; + dc:identifier "SXM" ; + skos:altLabel "Общност Сен Мартен"@bg, + "Sint Maarten"@nl ; + skos:broader ; + skos:hiddenLabel "St. Martin (niederländischer Teil)"@de, + "von St. Martin"@de, + "Άγιος Μαρτίνος (ολλανδικό τμήμα)"@el, + "Αγίου Μαρτίνου (ολλανδικό τμήμα)"@el, + "San Martín (Estado autónomo del Reino de los Países Bajos )"@es, + "Sint Maarten"@et, + "Sint Maarteni"@et, + "alankomaalainen, sintmaartenilainen"@fi, + "Saint-Martin (partie néerlandaise)"@fr, + "saint-martinois"@fr, + "Saint-Martin (cuid na hÍsiltíre)"@ga, + "duine ó Saint-Martin (cuid na hÍsiltíre)"@ga, + "Sint Maarten (parte olandese)"@it, + "di Sint Maarten"@it, + "Sentmartēnas"@lv, + "minn Sint Maarten"@mt, + "Sint Maarten (część niderlandzka)"@pl, + "São Martinho (Sint Maarten)"@pt, + "Svätý Martin (holandská časť)"@sk ; + skos:historyNote "ISO 3166-1 Newsletter VI-8 of 15.12.2010: ‘The island of Saint-Martin is divided into the French northern part and the Dutch southern part.’"@en, + "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "290"^^euvoc:EP, + ".sx"^^euvoc:IANA_DOMAIN, + "SX"^^euvoc:ISG_COU, + "SX"^^euvoc:ISO_3166_1_ALPHA_2, + "SXM"^^euvoc:ISO_3166_1_ALPHA_3, + "534"^^euvoc:ISO_3166_1_NUM, + "SXM"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "SX"^^euvoc:TED, + "SX"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "534"^^euvoc:UNSD_M49 ; + skos:prefLabel "سانت مارتن"@ar, + "Синт Мартен"@bg, + "Sint Maarten"@ca, + "Sint Maarten"@cs, + "Sint-Maarten"@da, + "Sint Maarten"@de, + "Άγιος Μαρτίνος"@el, + "Sint Maarten"@en, + "San Martín"@es, + "Sint-Maarten"@et, + "Sint Maarten"@fi, + "Sint-Maarten"@fr, + "Sint Maarten"@ga, + "Sint Maarten"@hr, + "Sint Maarten"@hu, + "Sankti Maarten"@is, + "Sint Maarten"@it, + "シント・マールテン"@ja, + "Sint Maarten"@lb, + "Sint Martenas"@lt, + "Sentmartēna"@lv, + "Sint Maarten"@mt, + "Sint-Maarten"@nl, + "Sint Maarten"@no, + "Sint Maarten"@pl, + "São Martinho"@pt, + "Sint-Maarten"@ro, + "Сен-Мартен"@ru, + "Svätý Martin"@sk, + "Nizozemski Sveti Martin"@sl, + "Sint-Maarten"@sv, + "Sint Maarten"@tr, + "Сінт-Мартен"@uk, + "圣马丁"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "SYC" ; + at:deprecated "false" ; + at:op-code "SYC" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "SC" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SEY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SC" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SEY" ; + dc:source "EurLex" ] ; + at:start.use "1976-06-29" ; + atold:op-code "SYC" ; + dc:identifier "SYC" ; + skos:altLabel "جمهورية السيشيل"@ar, + "Република Сейшели"@bg, + "República de Seychelles"@ca, + "Sesel"@crs, + "Seychelská republika"@cs, + "Republikken Seychellerne"@da, + "Republik Seychellen"@de, + "Δημοκρατία των Σεϋχελλών"@el, + "Republic of Seychelles"@en, + "República de Seychelles"@es, + "Seišelli Vabariik"@et, + "Seychellien tasavalta"@fi, + "République des Seychelles"@fr, + "Poblacht na Séiséal"@ga, + "Republika Sejšeli"@hr, + "Seychelle Köztársaság"@hu, + "Lýðveldið Seychelles-eyjar"@is, + "Repubblica delle Seychelles"@it, + "セーシェル共和国"@ja, + "Republik Seychellen"@lb, + "Seišelių Respublika"@lt, + "Seišela Salu Republika"@lv, + "Ir-Repubblika tas-Seychelles"@mt, + "Republiek der Seychellen"@nl, + "Republikken Seychellene"@no, + "Republika Seszeli"@pl, + "República das Seicheles"@pt, + "Republica Seychelles"@ro, + "Республика Сейшельские Острова"@ru, + "Seychelská republika"@sk, + "Republika Sejšeli"@sl, + "Republiken Seychellerna"@sv, + "Seyşeller Cumhuriyeti"@tr, + "Республіка Сейшельські Острови"@uk, + "塞舌尔共和国"@zh ; + skos:hiddenLabel "Republikken Sychellerne"@da, + "Σεϋχελλών"@el, + "na Séiséil"@ga, + "sješelsko"@hr, + "Seišelių"@lt, + "Seišelas"@lv, + "Seišelu Republika"@lv, + "ir-Repubblika tas-Seychelles"@mt, + "is-Seychelles"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "156"^^euvoc:EP, + "SEY"^^euvoc:FD_010, + "SEY"^^euvoc:FD_400, + ".sc"^^euvoc:IANA_DOMAIN, + "SC"^^euvoc:IBAN_COU, + "SC"^^euvoc:ISG_COU, + "SC"^^euvoc:ISO_3166_1_ALPHA_2, + "SYC"^^euvoc:ISO_3166_1_ALPHA_3, + "690"^^euvoc:ISO_3166_1_NUM, + "SYC"^^euvoc:NAC, + "248"^^euvoc:PHONE_PREFIX, + "SC"^^euvoc:TED, + "SC"^^euvoc:TED_SCHEMA, + "SY"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "690"^^euvoc:UNSD_M49 ; + skos:prefLabel "سيشيل"@ar, + "Сейшелски острови"@bg, + "Seychelles"@ca, + "Seychely"@cs, + "Seychellerne"@da, + "Seychellen"@de, + "Σεϋχέλλες"@el, + "Seychelles"@en, + "Seychelles"@es, + "Seišellid"@et, + "Seychellit"@fi, + "Seychelles"@fr, + "Na Séiséil"@ga, + "Sejšeli"@hr, + "Seychelle-szigetek"@hu, + "Seychelles-eyjar"@is, + "Seychelles"@it, + "セーシェル"@ja, + "Seychellen"@lb, + "Seišeliai"@lt, + "Seišela salas"@lv, + "Is-Seychelles"@mt, + "Seychellen"@nl, + "Seychellene"@no, + "Seszele"@pl, + "Seicheles"@pt, + "Seychelles"@ro, + "Сейшелы"@ru, + "Seychely"@sk, + "Sejšeli"@sl, + "Seychellerna"@sv, + "Seyşeller"@tr, + "Сейшельські Острови"@uk, + "塞舌尔"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SYR" ; + at:deprecated "false" ; + at:op-code "SYR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SYR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SY" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "SY" ; + dc:source "TED" ] ; + at:start.use "1946-04-07" ; + atold:op-code "SYR" ; + dc:identifier "SYR" ; + skos:altLabel "الجمهورية العربية السورية"@ar, + "Сирийска арабска република"@bg, + "República Àrab Siriana"@ca, + "Syrská arabská republika"@cs, + "Den Syriske Arabiske Republik"@da, + "Arabische Republik Syrien"@de, + "Αραβική Δημοκρατία της Συρίας"@el, + "Syrian Arab Republic"@en, + "República Árabe Siria"@es, + "Süüria Araabia Vabariik"@et, + "Syyrian arabitasavalta"@fi, + "République arabe syrienne"@fr, + "Poblacht Arabach na Siria"@ga, + "Sirijska Arapska Republika"@hr, + "Szíriai Arab Köztársaság"@hu, + "Sýrlenska arabalýðveldið"@is, + "Repubblica araba siriana"@it, + "シリア・アラブ共和国"@ja, + "Arabesch Republik Syrien"@lb, + "Sirijos Arabų Respublika"@lt, + "Sīrijas Arābu Republika"@lv, + "Ir-Repubblika Għarbija Sirjana"@mt, + "Arabische Republiek Syrië"@nl, + "Den arabiske republikk Syria"@no, + "Syryjska Republika Arabska"@pl, + "República Árabe Síria"@pt, + "Republica Arabă Siriană"@ro, + "Сирийская Арабская Республика"@ru, + "Sýrska arabská republika"@sk, + "Sirska arabska republika"@sl, + "Arabrepubliken Syrien"@sv, + "Suriye Arap Cumhuriyeti"@tr, + "Сирійська Арабська Республіка"@uk, + "阿拉伯叙利亚共和国"@zh ; + skos:hiddenLabel "an tSiria"@ga, + "Sirijos"@lt, + "Sīrijas"@lv, + "ir-Repubblika Għarbija Sirjana"@mt, + "is-Sirja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "169"^^euvoc:EP, + "SYR"^^euvoc:FD_010, + ".sy"^^euvoc:IANA_DOMAIN, + "SY"^^euvoc:ISG_COU, + "SY"^^euvoc:ISO_3166_1_ALPHA_2, + "SYR"^^euvoc:ISO_3166_1_ALPHA_3, + "760"^^euvoc:ISO_3166_1_NUM, + "SYR"^^euvoc:NAC, + "963"^^euvoc:PHONE_PREFIX, + "SY"^^euvoc:TED, + "SY"^^euvoc:TED_SCHEMA, + "SYR"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "760"^^euvoc:UNSD_M49 ; + skos:prefLabel "سوريا"@ar, + "Сирия"@bg, + "Síria"@ca, + "Sýrie"@cs, + "Syrien"@da, + "Syrien"@de, + "Συρία"@el, + "Syria"@en, + "Siria"@es, + "Süüria"@et, + "Syyria"@fi, + "Syrie"@fr, + "An tSiria"@ga, + "Sirija"@hr, + "Szíria"@hu, + "Sýrland"@is, + "Siria"@it, + "シリア"@ja, + "Syrien"@lb, + "Sirija"@lt, + "Sīrija"@lv, + "Is-Sirja"@mt, + "Syrië"@nl, + "Syria"@no, + "Syria"@pl, + "Síria"@pt, + "Siria"@ro, + "Сирия"@ru, + "Sýria"@sk, + "Sirija"@sl, + "Syrien"@sv, + "Suriye"@tr, + "Сирія"@uk, + "叙利亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TCA" ; + at:deprecated "false" ; + at:op-code "TCA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "TC" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "TC" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "TCA" ; + dc:identifier "TCA" ; + skos:altLabel "Turksi ja Caicose saarte asumaa"@et, + "Terkso ir Kaikoso Salos"@lt, + "Ostrovy Turks a Caicos"@sk ; + skos:broader ; + skos:hiddenLabel "Νήσων Τερκ και Κάικος"@el, + "britannialainen, Turks- ja Caicossaarten asukas"@fi, + "des îles Turks-et-Caicos"@fr, + "Îles Turques-et-Caïques"@fr, + "Oileáin na dTurcach agus Caicos"@ga, + "duine ó Oileáin na dTurcach agus Caicos"@ga, + "Otoka Turks i Caicos"@hr, + "Terkso ir Kaikoso"@lt, + "Tērksas un Kaikosas Salu"@lv, + "il-Gżejjer Turks u Caicos"@mt, + "mill-Gżejjer Turks u Caicos"@mt, + "Insulele Turks și Caicos"@ro, + "din Insulele Turks și Caicos"@ro, + "Otokov Turks in Caicos"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "171"^^euvoc:EP, + ".tc"^^euvoc:IANA_DOMAIN, + "TC"^^euvoc:ISG_COU, + "TC"^^euvoc:ISO_3166_1_ALPHA_2, + "TCA"^^euvoc:ISO_3166_1_ALPHA_3, + "796"^^euvoc:ISO_3166_1_NUM, + "TCA"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "TC"^^euvoc:TED, + "TC"^^euvoc:TED_SCHEMA, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "796"^^euvoc:UNSD_M49 ; + skos:prefLabel "جزر تركس وكايكوس"@ar, + "Търкс и Кайкос"@bg, + "Illes Turks i Caicos"@ca, + "Ostrovy Turks a Caicos"@cs, + "Turks- og Caicosøerne"@da, + "Turks- und Caicosinseln"@de, + "Νήσοι Τερκς και Κάικος"@el, + "Turks and Caicos Islands"@en, + "Islas Turcas y Caicos"@es, + "Turks ja Caicos"@et, + "Turks- ja Caicossaaret"@fi, + "Îles Turks-et-Caïcos"@fr, + "Oileáin Turks-et-Caicos"@ga, + "Otoci Turks i Caicos"@hr, + "Turks- és Caicos-szigetek"@hu, + "Turks- og Caicos-eyjar"@is, + "Isole Turks e Caicos"@it, + "タークス・カイコス諸島"@ja, + "Turks- a Caicosinselen"@lb, + "Terksas ir Kaikosas"@lt, + "Tērksas un Kaikosas salas"@lv, + "Il-Gżejjer Turks u Caicos"@mt, + "Turks- en Caicoseilanden"@nl, + "Turks og Caicosøyene"@no, + "Turks i Caicos"@pl, + "Ilhas Turcas e Caicos"@pt, + "Insulele Turks şi Caicos"@ro, + "Острова Тёркс и Кайкос"@ru, + "Turks a Caicos"@sk, + "Otoki Turks in Caicos"@sl, + "Turks- och Caicosöarna"@sv, + "Turks ve Caicos Adaları"@tr, + "Острови Теркс і Кайкос"@uk, + "特克斯和凯科斯群岛"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "TCD" ; + at:deprecated "false" ; + at:op-code "TCD" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "TCH" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "CD" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CD" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TD" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "TD" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1960-08-11" ; + atold:op-code "TCD" ; + dc:identifier "TCD" ; + skos:altLabel "جمهورية تشاد"@ar, + "Република Чад"@bg, + "República del Txad"@ca, + "Čadská republika"@cs, + "Republikken Tchad"@da, + "Republik Tschad"@de, + "Δημοκρατία του Τσαντ"@el, + "Republic of Chad"@en, + "República de Chad"@es, + "Tšaadi Vabariik"@et, + "Tšadin tasavalta"@fi, + "République du Tchad"@fr, + "Poblacht Shead"@ga, + "Republika Čad"@hr, + "Csádi Köztársaság"@hu, + "Lýðveldið Chad"@is, + "Repubblica del Ciad"@it, + "チャド共和国"@ja, + "Republik Tschad"@lb, + "Čado Respublika"@lt, + "Čadas Republika"@lv, + "Ir-Repubblika taċ-Chad"@mt, + "Republiek Tsjaad"@nl, + "Republikken Tsjad"@no, + "Republika Czadu"@pl, + "República do Chade"@pt, + "Republica Ciad"@ro, + "Республика Чад"@ru, + "Čadská republika"@sk, + "Republika Čad"@sl, + "Republiken Tchad"@sv, + "Çad Cumhuriyeti"@tr, + "Республіка Чад"@uk, + "乍得共和国"@zh ; + skos:hiddenLabel "Čado"@lt, + "Čadas"@lv, + "ir-Repubblika taċ-Chad"@mt, + "iċ-Chad"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "172"^^euvoc:EP, + "CD"^^euvoc:FD_010, + "TCH"^^euvoc:FD_050, + "CD"^^euvoc:FD_400, + ".td"^^euvoc:IANA_DOMAIN, + "TD"^^euvoc:ISG_COU, + "TD"^^euvoc:ISO_3166_1_ALPHA_2, + "TCD"^^euvoc:ISO_3166_1_ALPHA_3, + "148"^^euvoc:ISO_3166_1_NUM, + "TCD"^^euvoc:NAC, + "235"^^euvoc:PHONE_PREFIX, + "TD"^^euvoc:TED, + "TD"^^euvoc:TED_SCHEMA, + "TCH"^^euvoc:TIR, + "Middle Africa"^^euvoc:UNSD_GEOSCHEME, + "148"^^euvoc:UNSD_M49 ; + skos:prefLabel "تشاد"@ar, + "Чад"@bg, + "Txad"@ca, + "Čad"@cs, + "Tchad"@da, + "Tschad"@de, + "Τσαντ"@el, + "Chad"@en, + "Chad"@es, + "Tšaad"@et, + "Tšad"@fi, + "Tchad"@fr, + "Sead"@ga, + "Čad"@hr, + "Csád"@hu, + "Chad"@is, + "Ciad"@it, + "チャド"@ja, + "Tschad"@lb, + "Čadas"@lt, + "Čada"@lv, + "Iċ-Chad"@mt, + "Tsjaad"@nl, + "Tsjad"@no, + "Czad"@pl, + "Chade"@pt, + "Ciad"@ro, + "Чад"@ru, + "Čad"@sk, + "Čad"@sl, + "Tchad"@sv, + "Çad"@tr, + "Чад"@uk, + "乍得"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TGO" ; + at:deprecated "false" ; + at:op-code "TGO" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "TG" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "TG" ; + dc:source "EurLex" ] ; + at:start.use "1960-04-27" ; + atold:op-code "TGO" ; + dc:identifier "TGO" ; + skos:altLabel "الجمهورية التوغولية"@ar, + "Тогоанска република"@bg, + "República Togolesa"@ca, + "Tožská republika"@cs, + "Den Togolesiske Republik"@da, + "Republik Togo"@de, + "Δημοκρατία του Τόγκο"@el, + "Siam"@en, + "Togolese Republic"@en, + "República Togolesa"@es, + "Togo Vabariik"@et, + "Togon tasavalta"@fi, + "République togolaise"@fr, + "Poblacht Thóga"@ga, + "Republika Togo"@hr, + "Togói Köztársaság"@hu, + "Tógóska lýðveldið"@is, + "Repubblica del Togo"@it, + "トーゴ共和国"@ja, + "Republik Togo"@lb, + "Togo Respublika"@lt, + "Togo Republika"@lv, + "Ir-Repubblika Togoliża"@mt, + "Republiek Togo"@nl, + "Republikken Togo"@no, + "Republika Togijska"@pl, + "República Togolesa"@pt, + "Republica Togoleză"@ro, + "Тоголезская Республика"@ru, + "Togská republika"@sk, + "Togovska republika"@sl, + "Republiken Togo"@sv, + "Togo Cumhuriyeti"@tr, + "Тоголезька Республіка"@uk, + "多哥共和国"@zh ; + skos:hiddenLabel "Република Того"@bg, + "Togoanska Republika"@hr, + "Togo"@lt, + "ir-Repubblika Togoliża"@mt, + "it-Togo"@mt, + "Togolese"@nl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "224"^^euvoc:EP, + "TG"^^euvoc:FD_010, + "TG"^^euvoc:FD_400, + ".tg"^^euvoc:IANA_DOMAIN, + "TG"^^euvoc:ISG_COU, + "TG"^^euvoc:ISO_3166_1_ALPHA_2, + "TGO"^^euvoc:ISO_3166_1_ALPHA_3, + "768"^^euvoc:ISO_3166_1_NUM, + "TGO"^^euvoc:NAC, + "228"^^euvoc:PHONE_PREFIX, + "TG"^^euvoc:TED, + "TG"^^euvoc:TED_SCHEMA, + "TG"^^euvoc:TIR, + "Western Africa"^^euvoc:UNSD_GEOSCHEME, + "768"^^euvoc:UNSD_M49 ; + skos:prefLabel "توغو"@ar, + "Того"@bg, + "Togo"@ca, + "Togo"@cs, + "Togo"@da, + "Togo"@de, + "Τόγκο"@el, + "Togo"@en, + "Togo"@es, + "Togo"@et, + "Togo"@fi, + "Togo"@fr, + "Tóga"@ga, + "Togo"@hr, + "Togo"@hu, + "Tógó"@is, + "Togo"@it, + "トーゴ"@ja, + "Togo"@lb, + "Togas"@lt, + "Togo"@lv, + "It-Togo"@mt, + "Togo"@nl, + "Togo"@no, + "Togo"@pl, + "Togo"@pt, + "Togo"@ro, + "Того"@ru, + "Togo"@sk, + "Togo"@sl, + "Togo"@sv, + "Togo"@tr, + "Того"@uk, + "多哥"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "THA" ; + at:deprecated "false" ; + at:op-code "THA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "TH" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "T" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TH" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TAI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "TH" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "THA" ; + dc:identifier "THA" ; + skos:altLabel "مملكة تايلاند"@ar, + "Кралство Тайланд"@bg, + "Regne de Tailàndia"@ca, + "Thajské království"@cs, + "Kongeriget Thailand"@da, + "Königreich Thailand"@de, + "Βασίλειο της Ταϊλάνδης"@el, + "Kingdom of Thailand"@en, + "Reino de Tailandia"@es, + "Tai Kuningriik"@et, + "Thaimaan kuningaskunta"@fi, + "Royaume de Thaïlande"@fr, + "Ríocht na Téalainne"@ga, + "Kraljevina Tajland"@hr, + "Thaiföldi Királyság"@hu, + "Konungsríkið Taíland"@is, + "Regno di Thailandia"@it, + "Tailandia"@it, + "タイ王国"@ja, + "Kinnekräich Thailand"@lb, + "Tailando Karalystė"@lt, + "Taizemes Karaliste"@lv, + "Ir-Renju tat-Tajlandja"@mt, + "Koninkrijk Thailand"@nl, + "Kongeriket Thailand"@no, + "Królestwo Tajlandii"@pl, + "Reino da Tailândia"@pt, + "Regatul Thailandei"@ro, + "Королевство Таиланд"@ru, + "Thajské kráľovstvo"@sk, + "Kraljevina Tajska"@sl, + "Konungariket Thailand"@sv, + "ประเทศไทย"@th, + "Tayland Krallığı"@tr, + "Королівство Таїланд"@uk, + "泰王国"@zh ; + skos:hiddenLabel "ταϊλανδέζικη"@el, + "thailandaise"@fr, + "an Téalainn"@ga, + "thai, thaiföldi"@hu, + "Tailando"@lt, + "Taizemes"@lv, + "ir-Renju tat-Tajlandja"@mt, + "it-Tajlandja"@mt, + "Koninkrijk Thaïland"@nl, + "Thaïland"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "253"^^euvoc:EP, + "TAI"^^euvoc:FD_010, + "TH"^^euvoc:FD_140, + "T"^^euvoc:FD_400, + ".th"^^euvoc:IANA_DOMAIN, + "TH"^^euvoc:ISG_COU, + "TH"^^euvoc:ISO_3166_1_ALPHA_2, + "THA"^^euvoc:ISO_3166_1_ALPHA_3, + "764"^^euvoc:ISO_3166_1_NUM, + "THA"^^euvoc:NAC, + "66"^^euvoc:PHONE_PREFIX, + "TH"^^euvoc:TED, + "TH"^^euvoc:TED_SCHEMA, + "T"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "764"^^euvoc:UNSD_M49 ; + skos:prefLabel "تايلند"@ar, + "Тайланд"@bg, + "Tailàndia"@ca, + "Thajsko"@cs, + "Thailand"@da, + "Thailand"@de, + "Ταϊλάνδη"@el, + "Thailand"@en, + "Tailandia"@es, + "Tai"@et, + "Thaimaa"@fi, + "Thaïlande"@fr, + "An Téalainn"@ga, + "Tajland"@hr, + "Thaiföld"@hu, + "Taíland"@is, + "Thailandia"@it, + "タイ"@ja, + "Thailand"@lb, + "Tailandas"@lt, + "Taizeme"@lv, + "It-Tajlandja"@mt, + "Thailand"@nl, + "Thailand"@no, + "Tajlandia"@pl, + "Tailândia"@pt, + "Thailanda"@ro, + "Таиланд"@ru, + "Thajsko"@sk, + "Tajska"@sl, + "Thailand"@sv, + "Tayland"@tr, + "Таїланд"@uk, + "泰国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TJK" ; + at:deprecated "false" ; + at:op-code "TJK" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TAJ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TJ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "TJ" ; + dc:source "TED" ] ; + at:start.use "1991-12-26" ; + atold:op-code "TJK" ; + dc:identifier "TJK" ; + skos:altLabel "جمهورية طاجيكستان"@ar, + "Република Таджикистан"@bg, + "República del Tadjikistan"@ca, + "Republika Tádžikistán"@cs, + "Republikken Tadsjikistan"@da, + "Republik Tadschikistan"@de, + "Δημοκρατία του Τατζικιστάν"@el, + "Republic of Tajikistan"@en, + "República de Tayikistán"@es, + "Tadžikistani Vabariik"@et, + "Tadžikistanin tasavalta"@fi, + "République du Tadjikistan"@fr, + "Poblacht na Táidsíceastáine"@ga, + "Republika Tadžikistan"@hr, + "Tádzsik Köztársaság"@hu, + "Lýðveldið Tadsíkistan"@is, + "Repubblica del Tagikistan"@it, + "タジキスタン共和国"@ja, + "Republik Tadjikistan"@lb, + "Tadžikistano Respublika"@lt, + "Tadžikistānas Republika"@lv, + "Ir-Repubblika tat-Taġikistan"@mt, + "Republiek Tadzjikistan"@nl, + "Republikken Tadsjikistan"@no, + "Republika Tadżykistanu"@pl, + "República do Tajiquistão"@pt, + "Republica Tadjikistan"@ro, + "Республика Таджикистан"@ru, + "Tadžická republika"@sk, + "Republika Tadžikistan"@sl, + "Republiken Tadzjikistan"@sv, + "Тоҷикистон"@tg, + "Tacikistan Cumhuriyeti"@tr, + "Республіка Таджикистан"@uk, + "塔吉克斯坦共和国"@zh ; + skos:hiddenLabel "Tadžikistani"@et, + "an Táidsíceastáin"@ga, + "Tadžikistano"@lt, + "Tadžikistānas"@lv, + "ir-Repubblika tat-Taġikistan"@mt, + "it-Taġikistan"@mt, + "tadżykistańskie"@pl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "174"^^euvoc:EP, + "273"^^euvoc:EP, + "TAJ"^^euvoc:FD_010, + ".tj"^^euvoc:IANA_DOMAIN, + "TJ"^^euvoc:ISG_COU, + "TJ"^^euvoc:ISO_3166_1_ALPHA_2, + "TJK"^^euvoc:ISO_3166_1_ALPHA_3, + "762"^^euvoc:ISO_3166_1_NUM, + "TJK"^^euvoc:NAC, + "992"^^euvoc:PHONE_PREFIX, + "TJ"^^euvoc:TED, + "TJ"^^euvoc:TED_SCHEMA, + "TJ"^^euvoc:TIR, + "Central Asia"^^euvoc:UNSD_GEOSCHEME, + "762"^^euvoc:UNSD_M49 ; + skos:prefLabel "طاجيكستان"@ar, + "Таджикистан"@bg, + "Tadjikistan"@ca, + "Tádžikistán"@cs, + "Tadsjikistan"@da, + "Tadschikistan"@de, + "Τατζικιστάν"@el, + "Tajikistan"@en, + "Tayikistán"@es, + "Tadžikistan"@et, + "Tadžikistan"@fi, + "Tadjikistan"@fr, + "An Táidsíceastáin"@ga, + "Tadžikistan"@hr, + "Tádzsikisztán"@hu, + "Tadsíkistan"@is, + "Tagikistan"@it, + "タジキスタン"@ja, + "Tadjikistan"@lb, + "Tadžikistanas"@lt, + "Tadžikistāna"@lv, + "It-Taġikistan"@mt, + "Tadzjikistan"@nl, + "Tadsjikistan"@no, + "Tadżykistan"@pl, + "Tajiquistão"@pt, + "Tadjikistan"@ro, + "Таджикистан"@ru, + "Tadžikistan"@sk, + "Tadžikistan"@sl, + "Tadzjikistan"@sv, + "Tacikistan"@tr, + "Таджикистан"@uk, + "塔吉克斯坦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TKM" ; + at:deprecated "false" ; + at:op-code "TKM" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TRM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "TM" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TM" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "TM" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1991-12-26" ; + atold:op-code "TKM" ; + dc:identifier "TKM" ; + skos:altLabel "Turkmenia"@en, + "Repubblica del Turkmenistan"@it, + "Türkmenistan"@tk ; + skos:hiddenLabel "an Tuircméanastáin"@ga, + "turkmenistansko"@hr, + "Turkmėnistano"@lt, + "Turkmenistānas"@lv, + "it-Turkmenistan"@mt, + "turkmenistańskie"@pl, + "turkmensko"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "176"^^euvoc:EP, + "TRM"^^euvoc:FD_010, + "TM"^^euvoc:FD_140, + ".tm"^^euvoc:IANA_DOMAIN, + "TM"^^euvoc:ISG_COU, + "TM"^^euvoc:ISO_3166_1_ALPHA_2, + "TKM"^^euvoc:ISO_3166_1_ALPHA_3, + "795"^^euvoc:ISO_3166_1_NUM, + "TKM"^^euvoc:NAC, + "993"^^euvoc:PHONE_PREFIX, + "TM"^^euvoc:TED, + "TM"^^euvoc:TED_SCHEMA, + "TM"^^euvoc:TIR, + "Central Asia"^^euvoc:UNSD_GEOSCHEME, + "795"^^euvoc:UNSD_M49 ; + skos:prefLabel "تركمنستان"@ar, + "Туркменистан"@bg, + "Turkmenistan"@ca, + "Turkmenistán"@cs, + "Turkmenistan"@da, + "Turkmenistan"@de, + "Τουρκμενιστάν"@el, + "Turkmenistan"@en, + "Turkmenistán"@es, + "Türkmenistan"@et, + "Turkmenistan"@fi, + "Turkménistan"@fr, + "An Tuircméanastáin"@ga, + "Turkmenistan"@hr, + "Türkmenisztán"@hu, + "Túrkmenistan"@is, + "Turkmenistan"@it, + "トルクメニスタン"@ja, + "Turkmenistan"@lb, + "Turkmėnistanas"@lt, + "Turkmenistāna"@lv, + "It-Turkmenistan"@mt, + "Turkmenistan"@nl, + "Turkmenistan"@no, + "Turkmenistan"@pl, + "Turquemenistão"@pt, + "Turkmenistan"@ro, + "Туркмения"@ru, + "Turkménsko"@sk, + "Turkmenistan"@sl, + "Turkmenistan"@sv, + "Türkmenistan"@tr, + "Туркменістан"@uk, + "土库曼斯坦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TLS" ; + at:deprecated "false" ; + at:op-code "TLS" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TLS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TL" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "TL" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "2002-05-20" ; + atold:op-code "TLS" ; + dc:identifier "TLS" ; + skos:altLabel "جمهورية تيمور - ليشتي (تيمور الشرقية) الديمقراطية"@ar, + "Демократична република Източен Тимор"@bg, + "República Democràtica de Timor-Leste"@ca, + "Demokratická republika Východní Timor"@cs, + "Den Demokratiske Republik Timor-Leste"@da, + "Østtimor"@da, + "Demokratische Republik Timor-Leste"@de, + "Λαϊκή Δημοκρατία του Ανατολικού Τιμόρ"@el, + "Democratic Republic of Timor-Leste"@en, + "East Timor"@en, + "República Democrática de Timor Oriental"@es, + "Timor-Leste Demokraatlik Vabariik"@et, + "Itä-Timorin demokraattinen tasavalta"@fi, + "République démocratique du Timor-Leste"@fr, + "République démocratique du Timor-Oriental"@fr, + "Timor-Leste"@fr, + "Poblacht Dhaonlathach Thíomór Thoir"@ga, + "Demokratska Republika Timor-Leste"@hr, + "Kelet-timori Demokratikus Köztársaság"@hu, + "Lýðstjórnarlýðveldið Tímor-Leste"@is, + "Repubblica democratica del Timor orientale"@it, + "東ティモール民主共和国"@ja, + "Demokratesch Republik Timor-Leste"@lb, + "Rytų Timoro Demokratinė Respublika"@lt, + "Austrumtimoras Demokrātiskā Republika"@lv, + "Ir-Repubblika Demokratika ta’ Timor Leste"@mt, + "Democratische Republiek Oost-Timor"@nl, + "Den demokratiske republikken Øst-Timor"@no, + "Demokratyczna Republika Timoru Wschodniego"@pl, + "República Democrática de Timor-Leste"@pt, + "Republica Democratică a Timorului de Est"@ro, + "Демократическая Республика Тимор-Лешти"@ru, + "Východotimorská demokratická republika"@sk, + "Demokratična republika Vzhodni Timor"@sl, + "Demokratiska republiken Östtimor"@sv, + "Timor Lorosae"@tet, + "Doğu Timor Demokratik Cumhuriyeti"@tr, + "Демократична Республіка Східний Тимор"@uk, + "东帝汶民主共和国"@zh ; + skos:hiddenLabel "Timor-Leste, Østtimor"@da, + "fra Timor-Leste, fra Østtimor, østtimorisk"@da, + "von Timor-Leste"@de, + "Ανατολικού Τιμόρ"@el, + "Democratic Republic of East Timor"@en, + "Ida-Timori"@et, + "Timor oriental"@fr, + "du Timor-Leste"@fr, + "duine ó Thíomór Thoir"@ga, + "Repubblica democratica di Timor Leste"@it, + "Timor Leste"@it, + "di Timor Leste"@it, + "Rytų Timoro"@lt, + "Austrumtimoras"@lv, + "ir-Repubblika Demokratika ta' Timor Leste"@mt, + "Oost-Timorese"@nl, + "timorense"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "280"^^euvoc:EP, + "TLS"^^euvoc:FD_010, + ".tl"^^euvoc:IANA_DOMAIN, + "TL"^^euvoc:IBAN_COU, + "TL"^^euvoc:ISG_COU, + "TL"^^euvoc:ISO_3166_1_ALPHA_2, + "TLS"^^euvoc:ISO_3166_1_ALPHA_3, + "626"^^euvoc:ISO_3166_1_NUM, + "TLS"^^euvoc:NAC, + "670"^^euvoc:PHONE_PREFIX, + "TL"^^euvoc:TED, + "TL"^^euvoc:TED_SCHEMA, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "626"^^euvoc:UNSD_M49 ; + skos:prefLabel "تيمور-ليشتي (تيمور الشرقية)"@ar, + "Източен Тимор"@bg, + "Timor-Leste"@ca, + "Východní Timor"@cs, + "Timor-Leste"@da, + "Timor-Leste"@de, + "Ανατολικό Τιμόρ"@el, + "Timor-Leste"@en, + "Timor Oriental"@es, + "Ida-Timor"@et, + "Itä-Timor"@fi, + "Timor-Oriental"@fr, + "Tíomór Thoir"@ga, + "Timor-Leste"@hr, + "Kelet-Timor"@hu, + "Timor-Leste"@is, + "Timor orientale"@it, + "東ティモール"@ja, + "Timor-Leste"@lb, + "Rytų Timoras"@lt, + "Austrumtimora"@lv, + "Timor Leste"@mt, + "Oost-Timor"@nl, + "Timor-Leste"@no, + "Timor Wschodni"@pl, + "Timor-Leste"@pt, + "Timorul de Est"@ro, + "Тимор-Лешти"@ru, + "Východný Timor"@sk, + "Vzhodni Timor"@sl, + "Östtimor"@sv, + "Doğu Timor"@tr, + "Східний Тимор"@uk, + "东帝汶"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TON" ; + at:deprecated "false" ; + at:op-code "TON" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "TO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "TO" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TO" ; + dc:source "EurLex" ] ; + at:start.use "1970-06-04" ; + atold:op-code "TON" ; + dc:identifier "TON" ; + skos:altLabel "مملكة تونغا"@ar, + "Кралство Тонга"@bg, + "Regne de Tonga"@ca, + "Království Tonga"@cs, + "Kongeriget Tonga"@da, + "Königreich Tonga"@de, + "Βασίλειο της Τόνγκα"@el, + "Kingdom of Tonga"@en, + "Reino de Tonga"@es, + "Tonga Kuningriik"@et, + "Tongan kuningaskunta"@fi, + "Royaume de Tonga"@fr, + "Ríocht Tonga"@ga, + "Kraljevina Tonga"@hr, + "Tongai Királyság"@hu, + "Konungsríkið Tonga"@is, + "Regno di Tonga"@it, + "トンガ王国"@ja, + "Kinnekräich Tonga"@lb, + "Tongos Karalystė"@lt, + "Tongas Karaliste"@lv, + "Ir-Renju ta’ Tonga"@mt, + "Koninkrijk Tonga"@nl, + "Kongeriket Tonga"@no, + "Królestwo Tonga"@pl, + "Reino de Tonga"@pt, + "Regatul Tonga"@ro, + "Королевство Тонга"@ru, + "Tongské kráľovstvo"@sk, + "Kraljevina Tonga"@sl, + "Konungariket Tonga"@sv, + "Tonga"@to, + "Tonga Krallığı"@tr, + "Королівство Тонга"@uk, + "汤加王国"@zh ; + skos:hiddenLabel "Τόγκα"@el, + "Τόγκας"@el, + "tonganne"@fr, + "Ríocht Thonga"@ga, + "Tongos"@lt, + "Tongas"@lv, + "ir-Renju ta' Tonga"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "255"^^euvoc:EP, + "TO"^^euvoc:FD_010, + "TO"^^euvoc:FD_400, + ".to"^^euvoc:IANA_DOMAIN, + "TO"^^euvoc:ISG_COU, + "TO"^^euvoc:ISO_3166_1_ALPHA_2, + "TON"^^euvoc:ISO_3166_1_ALPHA_3, + "776"^^euvoc:ISO_3166_1_NUM, + "TON"^^euvoc:NAC, + "676"^^euvoc:PHONE_PREFIX, + "TO"^^euvoc:TED, + "TO"^^euvoc:TED_SCHEMA, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "776"^^euvoc:UNSD_M49 ; + skos:prefLabel "تونغا"@ar, + "Тонга"@bg, + "Tonga"@ca, + "Tonga"@cs, + "Tonga"@da, + "Tonga"@de, + "Τόνγκα"@el, + "Tonga"@en, + "Tonga"@es, + "Tonga"@et, + "Tonga"@fi, + "Tonga"@fr, + "Tonga"@ga, + "Tonga"@hr, + "Tonga"@hu, + "Tonga"@is, + "Tonga"@it, + "トンガ"@ja, + "Tonga"@lb, + "Tonga"@lt, + "Tonga"@lv, + "Tonga"@mt, + "Tonga"@nl, + "Tonga"@no, + "Tonga"@pl, + "Tonga"@pt, + "Tonga"@ro, + "Тонга"@ru, + "Tonga"@sk, + "Tonga"@sl, + "Tonga"@sv, + "Tonga"@tr, + "Тонга"@uk, + "汤加"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TTO" ; + at:deprecated "false" ; + at:op-code "TTO" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "TT" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "TT" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "TT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TT" ; + dc:source "EurLex" ] ; + at:start.use "1962-08-31" ; + atold:op-code "TTO" ; + dc:identifier "TTO" ; + skos:altLabel "جمهورية ترينيداد وتوباغو"@ar, + "Република Тринидад и Тобаго"@bg, + "República de Trinidad i Tobago"@ca, + "Republika Trinidad a Tobago"@cs, + "Republikken Trinidad og Tobago"@da, + "Republik Trinidad und Tobago"@de, + "Δημοκρατία Τρίνινταντ και Τομπέιγκο"@el, + "Republic of Trinidad and Tobago"@en, + "República de Trinidad y Tobago"@es, + "Trinidadi ja Tobago Vabariik"@et, + "Trinidadin ja Tobagon tasavalta"@fi, + "République de Trinité-et-Tobago"@fr, + "Poblacht Oileán na Tríonóide agus Tobága"@ga, + "Republika Trinidad i Tobago"@hr, + "Trinidad és Tobago Köztársaság"@hu, + "Lýðveldið Trínidad og Tóbagó"@is, + "トリニダード・トバゴ共和国"@ja, + "Republik Trinidad an Tobago"@lb, + "Trinidado ir Tobago Respublika"@lt, + "Trinidādas un Tobāgo Republika"@lv, + "Ir-Repubblika ta’ Trinidad u Tobago"@mt, + "Republiek Trinidad en Tobago"@nl, + "Republikken Trinidad og Tobago"@no, + "Republika Trynidadu i Tobago"@pl, + "República de Trindade e Tobago"@pt, + "Republica Trinidad şi Tobago"@ro, + "Республика Тринидад и Тобаго"@ru, + "Republika Trinidadu a Tobaga"@sk, + "Republika Trinidad in Tobago"@sl, + "Republiken Trinidad och Tobago"@sv, + "Trinidad ve Tobago Cumhuriyeti"@tr, + "Республіка Тринідад і Тобаго"@uk, + "特立尼达和多巴哥共和国"@zh ; + skos:hiddenLabel "Τρινιδάδ και Τομπάγκο"@el, + "duine ó Oileán na Tríonóide agus Tobága"@ga, + "Trinidad i Tobago"@hr, + "Trinidada i Tobaga"@hr, + "Repubblica di Trinidad e Tobago"@it, + "Trinidado ir Tobago"@lt, + "Trinidāda un Tobago"@lv, + "Trinidādas un Tobago"@lv, + "Trinidādas un Tobago Republika"@lv, + "Trinidadjana; Tobagana"@mt, + "ir-Repubblika ta' Trinidad u Tobago"@mt, + "Republica Trinidad și Tobago"@ro, + "Trinidad și Tobago"@ro, + "din Trinidad și Tobago"@ro, + "från Trinidad och Tobago"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "254"^^euvoc:EP, + "TT"^^euvoc:FD_010, + "TT"^^euvoc:FD_400, + ".tt"^^euvoc:IANA_DOMAIN, + "TT"^^euvoc:ISG_COU, + "TT"^^euvoc:ISO_3166_1_ALPHA_2, + "TTO"^^euvoc:ISO_3166_1_ALPHA_3, + "780"^^euvoc:ISO_3166_1_NUM, + "TTO"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "TT"^^euvoc:TED, + "TT"^^euvoc:TED_SCHEMA, + "TT"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "780"^^euvoc:UNSD_M49 ; + skos:prefLabel "ترينيداد وتوباغو"@ar, + "Тринидад и Тобаго"@bg, + "Trinidad i Tobago"@ca, + "Trinidad a Tobago"@cs, + "Trinidad og Tobago"@da, + "Trinidad und Tobago"@de, + "Τρίνινταντ και Τομπέιγκο"@el, + "Trinidad and Tobago"@en, + "Trinidad y Tobago"@es, + "Trinidad ja Tobago"@et, + "Trinidad ja Tobago"@fi, + "Trinité-et-Tobago"@fr, + "Oileán na Tríonóide agus Tobága"@ga, + "Trinidad and Tobago"@hr, + "Trinidad és Tobago"@hu, + "Trínidad og Tóbagó"@is, + "Trinidad e Tobago"@it, + "トリニダード・トバゴ"@ja, + "Trinidad an Tobago"@lb, + "Trinidadas ir Tobagas"@lt, + "Trinidāda un Tobāgo"@lv, + "Trinidad u Tobago"@mt, + "Trinidad en Tobago"@nl, + "Trinidad og Tobago"@no, + "Trynidad i Tobago"@pl, + "Trindade e Tobago"@pt, + "Trinidad şi Tobago"@ro, + "Тринидад и Тобаго"@ru, + "Trinidad a Tobago"@sk, + "Trinidad in Tobago"@sl, + "Trinidad och Tobago"@sv, + "Trinidad ve Tobago"@tr, + "Тринідад і Тобаго"@uk, + "特立尼达和多巴哥"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TUN" ; + at:deprecated "false" ; + at:op-code "TUN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TN" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "TN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TN" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1956-03-20" ; + atold:op-code "TUN" ; + dc:identifier "TUN" ; + skos:altLabel "جمهورية تونس"@ar, + "Република Тунис"@bg, + "República de Tunísia"@ca, + "Tuniská republika"@cs, + "Den Tunesiske Republik"@da, + "Tunesische Republik"@de, + "Δημοκρατία της Τυνησίας"@el, + "Republic of Tunisia"@en, + "República de Túnez"@es, + "Tuneesia Vabariik"@et, + "Tunisian tasavalta"@fi, + "République tunisienne"@fr, + "Poblacht na Túinéise"@ga, + "Republika Tunis"@hr, + "Tunéziai Köztársaság"@hu, + "Lýðveldið Túnis"@is, + "Repubblica tunisina"@it, + "チュニジア共和国"@ja, + "Republik Tunesien"@lb, + "Tuniso Respublika"@lt, + "Tunisijas Republika"@lv, + "Ir-Repubblika tat-Tuneżija"@mt, + "Republiek Tunesië"@nl, + "Republikken Tunisia"@no, + "Republika Tunezyjska"@pl, + "República da Tunísia"@pt, + "Republica Tunisiană"@ro, + "Тунисская Республика"@ru, + "Tuniská republika"@sk, + "Republika Tunizija"@sl, + "Republiken Tunisien"@sv, + "Tunus Cumhuriyeti"@tr, + "Туніська Республіка"@uk, + "突尼斯共和国"@zh ; + skos:hiddenLabel "Тунизийска република"@bg, + "an Túinéis"@ga, + "tuniško"@hr, + "Tuniso"@lt, + "Tunisijas"@lv, + "ir-Repubblika tat-Tuneżija"@mt, + "it-Tuneżija"@mt, + "República Tunisina"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "177"^^euvoc:EP, + "TN"^^euvoc:FD_010, + "TN"^^euvoc:FD_400, + ".tn"^^euvoc:IANA_DOMAIN, + "TN"^^euvoc:IBAN_COU, + "TN"^^euvoc:ISG_COU, + "TN"^^euvoc:ISO_3166_1_ALPHA_2, + "TUN"^^euvoc:ISO_3166_1_ALPHA_3, + "788"^^euvoc:ISO_3166_1_NUM, + "TUN"^^euvoc:NAC, + "216"^^euvoc:PHONE_PREFIX, + "TN"^^euvoc:TED, + "TN"^^euvoc:TED_SCHEMA, + "TN"^^euvoc:TIR, + "Northern Africa"^^euvoc:UNSD_GEOSCHEME, + "788"^^euvoc:UNSD_M49 ; + skos:prefLabel "تونس"@ar, + "Тунис"@bg, + "Tunísia"@ca, + "Tunisko"@cs, + "Tunesien"@da, + "Tunesien"@de, + "Τυνησία"@el, + "Tunisia"@en, + "Túnez"@es, + "Tuneesia"@et, + "Tunisia"@fi, + "Tunisie"@fr, + "An Túinéis"@ga, + "Tunis"@hr, + "Tunézia"@hu, + "Túnis"@is, + "Tunisia"@it, + "チュニジア"@ja, + "Tunesien"@lb, + "Tunisas"@lt, + "Tunisija"@lv, + "It-Tuneżija"@mt, + "Tunesië"@nl, + "Tunisia"@no, + "Tunezja"@pl, + "Tunísia"@pt, + "Tunisia"@ro, + "Тунис"@ru, + "Tunisko"@sk, + "Tunizija"@sl, + "Tunisien"@sv, + "Tunus"@tr, + "Туніс"@uk, + "突尼斯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TUR" ; + at:deprecated "false" ; + at:op-code "TUR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "TR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "TR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "TR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "TR" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "TUR" ; + dc:identifier "TUR" ; + skos:altLabel "جمهورية تركيا"@ar, + "Рэспу́бліка Турцыя"@be, + "Република Турция"@bg, + "Republika Turska"@bs, + "República de Turquia"@ca, + "Turecká republika"@cs, + "Republikken Tyrkiet"@da, + "Republik Türkei"@de, + "Δημοκρατία της Τουρκίας"@el, + "Republic of Turkey"@en, + "Republic of Türkiye"@en, + "Turkey"@en, + "República de Turquía"@es, + "Türgi Vabariik"@et, + "Turkiako Errepublika"@eu, + "Turkin tasavalta"@fi, + "Lýðveldið Turkaland"@fo, + "République de Turquie"@fr, + "Poblacht na Tuirce"@ga, + "República de Turquía"@gl, + "Republika Turska"@hr, + "Török Köztársaság"@hu, + "Lýðveldið Tyrkland"@is, + "Repubblica di Turchia"@it, + "トルコ共和国"@ja, + "Republik Tierkei"@lb, + "Turkijos Respublika"@lt, + "Turcijas Republika"@lv, + "Република Турција"@mk, + "Ir-Repubblika tat-Turkija"@mt, + "Republiek Turkije"@nl, + "Republikken Tyrkia"@no, + "Republika Turcji"@pl, + "República da Turquia"@pt, + "Republica da la Tirchia"@rm, + "Republica Turcia"@ro, + "Турецкая Республика"@ru, + "Turecká republika"@sk, + "Republika Turčija"@sl, + "Republika e Turqisë"@sq, + "Република Турска"@sr, + "Republiken Turkiet"@sv, + "Türkiye Cumhuriyeti"@tr, + "Турецька Республіка"@uk, + "土耳其共和国"@zh ; + skos:hiddenLabel "Турция"@bg, + "an Tuirc"@ga, + "Turkijos"@lt, + "Turcijas"@lv, + "ir-Repubblika tat-Turkija"@mt, + "it-Turkija"@mt, + "Turčija"@sl ; + skos:historyNote "Country name in English modified according to the Interinstitutional Style Guide. Following the name change notified by the Republic of Türkiye in June 2022, ‘Türkiye’ is the preferred short form and ‘Republic of Türkiye’ is the preferred full form in English in EU documents and texts."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "179"^^euvoc:EP, + "TR"^^euvoc:FD_010, + "TR"^^euvoc:FD_050, + "TR"^^euvoc:FD_140, + "TR"^^euvoc:FD_400, + ".tr"^^euvoc:IANA_DOMAIN, + "TR"^^euvoc:IBAN_COU, + "TR"^^euvoc:ISG_COU, + "TR"^^euvoc:ISO_3166_1_ALPHA_2, + "TUR"^^euvoc:ISO_3166_1_ALPHA_3, + "792"^^euvoc:ISO_3166_1_NUM, + "TUR"^^euvoc:NAC, + "90"^^euvoc:PHONE_PREFIX, + "TR"^^euvoc:TED, + "TR"^^euvoc:TED_SCHEMA, + "TR"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "792"^^euvoc:UNSD_M49 ; + skos:prefLabel "تركيا"@ar, + "Турцыя"@be, + "Typция"@bg, + "Turska"@bs, + "Turquia"@ca, + "Turecko"@cs, + "Tyrkiet"@da, + "Türkei"@de, + "Τουρκία"@el, + "Türkiye"@en, + "Turquía"@es, + "Türgi"@et, + "Turkia"@eu, + "Turkki"@fi, + "Turkaland"@fo, + "Turquie"@fr, + "An Tuirc"@ga, + "Turquía"@gl, + "Turska"@hr, + "Törökország"@hu, + "Tyrkland"@is, + "Turchia"@it, + "トルコ"@ja, + "Tierkei"@lb, + "Turkija"@lt, + "Turcija"@lv, + "Турција"@mk, + "It-Turkija"@mt, + "Turkije"@nl, + "Tyrkia"@no, + "Turcja"@pl, + "Turquia"@pt, + "Tirchia"@rm, + "Turcia"@ro, + "Турция"@ru, + "Turecko"@sk, + "Turčja"@sl, + "Turqia"@sq, + "Турска"@sr, + "Turkiet"@sv, + "Türkiye"@tr, + "Туреччина"@uk, + "土耳其"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TUV" ; + at:deprecated "false" ; + at:op-code "TUV" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "TUV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TV" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "TV" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1978-10-01" ; + atold:op-code "TUV" ; + dc:identifier "TUV" ; + skos:altLabel "Ellice Islands"@en, + "República de Tuvalu"@pt, + "Tuvalu"@tvl ; + skos:hiddenLabel "duine ó Tuvalu"@ga, + "Tuvalua"@hr, + "tuvaluana"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "180"^^euvoc:EP, + "TUV"^^euvoc:FD_010, + ".tv"^^euvoc:IANA_DOMAIN, + "TV"^^euvoc:ISG_COU, + "TV"^^euvoc:ISO_3166_1_ALPHA_2, + "TUV"^^euvoc:ISO_3166_1_ALPHA_3, + "798"^^euvoc:ISO_3166_1_NUM, + "TUV"^^euvoc:NAC, + "688"^^euvoc:PHONE_PREFIX, + "TV"^^euvoc:TED, + "TV"^^euvoc:TED_SCHEMA, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "798"^^euvoc:UNSD_M49 ; + skos:prefLabel "توفالو"@ar, + "Тувалу"@bg, + "Tuvalu"@ca, + "Tuvalu"@cs, + "Tuvalu"@da, + "Tuvalu"@de, + "Τουβαλού"@el, + "Tuvalu"@en, + "Tuvalu"@es, + "Tuvalu"@et, + "Tuvalu"@fi, + "Tuvalu"@fr, + "Tuvalu"@ga, + "Tuvalu"@hr, + "Tuvalu"@hu, + "Túvalú"@is, + "Tuvalu"@it, + "ツバル"@ja, + "Tuvalu"@lb, + "Tuvalu"@lt, + "Tuvalu"@lv, + "Tuvalu"@mt, + "Tuvalu"@nl, + "Tuvalu"@no, + "Tuvalu"@pl, + "Tuvalu"@pt, + "Tuvalu"@ro, + "Тувалу"@ru, + "Tuvalu"@sk, + "Tuvalu"@sl, + "Tuvalu"@sv, + "Tuvalu"@tr, + "Тувалу"@uk, + "图瓦卢"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "TZA" ; + at:deprecated "false" ; + at:op-code "TZA" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "TZ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "EAT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "EAT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "TZ" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1964-04-26" ; + atold:op-code "TZA" ; + dc:identifier "TZA" ; + skos:altLabel "جمهورية تنزانيا المتحدة"@ar, + "Обединена република Танзания"@bg, + "República Unida de Tanzània"@ca, + "Sjednocená republika Tanzanie"@cs, + "Den Forenede Republik Tanzania"@da, + "Vereinigte Republik Tansania"@de, + "Ενωμένη Δημοκρατία της Τανζανίας"@el, + "United Republic of Tanzania"@en, + "República Unida de Tanzania"@es, + "Tansaania Ühendvabariik"@et, + "Tansanian yhdistynyt tasavalta"@fi, + "République unie de Tanzanie"@fr, + "Poblacht Aontaithe na Tansáine"@ga, + "Ujedinjena Republika Tanzanija"@hr, + "Tanzániai Egyesült Köztársaság"@hu, + "Sambandslýðveldið Tansanía"@is, + "Repubblica unita della Tanzania"@it, + "タンザニア連合共和国"@ja, + "Vereenegt Republik Tanzania"@lb, + "Tanzanijos Jungtinė Respublika"@lt, + "Tanzānijas Savienotā Republika"@lv, + "Ir-Repubblika Magħquda tat-Tanzanija"@mt, + "Verenigde Republiek Tanzania"@nl, + "Den forente republikken Tanzania"@no, + "Zjednoczona Republika Tanzanii"@pl, + "República Unida da Tanzânia"@pt, + "Republica Unită Tanzania"@ro, + "Объединенная Республика Танзания"@ru, + "Tanzánijská zjednotená republika"@sk, + "Združena republika Tanzanija"@sl, + "Förenade republiken Tanzania"@sv, + "Tanzania"@swh, + "Tanzanya Birleşik Cumhuriyeti"@tr, + "Об'єднана Республіка Танзанія"@uk, + "坦桑尼亚联合共和国"@zh ; + skos:hiddenLabel "an Tansáin"@ga, + "tanzanijski"@hr, + "Tanzanijos"@lt, + "Tanzānijas"@lv, + "Tanzānijas Apvienotā Republika"@lv, + "Tanzanija"@mt, + "ir-Repubblika Magħquda tat-Tanzanija"@mt, + "it-Tanzanija"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "182"^^euvoc:EP, + "EAT"^^euvoc:FD_010, + "EAT"^^euvoc:FD_400, + ".tz"^^euvoc:IANA_DOMAIN, + "TZ"^^euvoc:ISG_COU, + "TZ"^^euvoc:ISO_3166_1_ALPHA_2, + "TZA"^^euvoc:ISO_3166_1_ALPHA_3, + "834"^^euvoc:ISO_3166_1_NUM, + "TZA"^^euvoc:NAC, + "255"^^euvoc:PHONE_PREFIX, + "TZ"^^euvoc:TED, + "TZ"^^euvoc:TED_SCHEMA, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "834"^^euvoc:UNSD_M49 ; + skos:prefLabel "تنزانيا"@ar, + "Танзания"@bg, + "Tanzània"@ca, + "Tanzanie"@cs, + "Tanzania"@da, + "Tansania"@de, + "Τανζανία"@el, + "Tanzania"@en, + "Tanzania"@es, + "Tansaania"@et, + "Tansania"@fi, + "Tanzanie"@fr, + "An Tansáin"@ga, + "Tanzanija"@hr, + "Tanzánia"@hu, + "Tansanía"@is, + "Tanzania"@it, + "タンザニア"@ja, + "Tansania"@lb, + "Tanzanija"@lt, + "Tanzānija"@lv, + "It-Tanzanija"@mt, + "Tanzania"@nl, + "Tanzania"@no, + "Tanzania"@pl, + "Tanzânia"@pt, + "Tanzania"@ro, + "Танзания"@ru, + "Tanzánia"@sk, + "Tanzanija"@sl, + "Tanzania"@sv, + "Tanzanya"@tr, + "Танзанія"@uk, + "坦桑尼亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "UGA" ; + at:deprecated "false" ; + at:op-code "UGA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "UG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "EAU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "EAU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "UG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "UG" ; + dc:source "TED" ] ; + at:start.use "1962-10-09" ; + atold:op-code "UGA" ; + dc:identifier "UGA" ; + skos:altLabel "جمهورية أوغندا"@ar, + "Република Уганда"@bg, + "República d'Uganda"@ca, + "Ugandská republika"@cs, + "Republikken Uganda"@da, + "Republik Uganda"@de, + "Δημοκρατία της Ουγκάντας"@el, + "Republic of Uganda"@en, + "República de Uganda"@es, + "Uganda Vabariik"@et, + "Ugandan tasavalta"@fi, + "République d’Ouganda"@fr, + "Poblacht Uganda"@ga, + "Republika Uganda"@hr, + "Ugandai Köztársaság"@hu, + "Lýðveldið Úganda"@is, + "Repubblica dell’Uganda"@it, + "ウガンダ共和国"@ja, + "Republik Uganda"@lb, + "Ugandos Respublika"@lt, + "Ugandas Republika"@lv, + "Ir-Repubblika tal-Uganda"@mt, + "Republiek Uganda"@nl, + "Republikken Uganda"@no, + "Republika Ugandy"@pl, + "República do Uganda"@pt, + "Republica Uganda"@ro, + "Республика Уганда"@ru, + "Ugandská republika"@sk, + "Republika Uganda"@sl, + "Republiken Uganda"@sv, + "Uganda"@sw, + "Uganda Cumhuriyeti"@tr, + "Республіка Уганда"@uk, + "乌干达共和国"@zh ; + skos:hiddenLabel "Ουγκάντας"@el, + "République d'Ouganda"@fr, + "Repubblica dell'Uganda"@it, + "Ugandos"@lt, + "Ugandas"@lv, + "ir-Repubblika tal-Uganda"@mt, + "l-Uganda"@mt, + "Ugandese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "184"^^euvoc:EP, + "EAU"^^euvoc:FD_010, + "UG"^^euvoc:FD_140, + "EAU"^^euvoc:FD_400, + ".ug"^^euvoc:IANA_DOMAIN, + "UG"^^euvoc:ISG_COU, + "UG"^^euvoc:ISO_3166_1_ALPHA_2, + "UGA"^^euvoc:ISO_3166_1_ALPHA_3, + "800"^^euvoc:ISO_3166_1_NUM, + "UGA"^^euvoc:NAC, + "256"^^euvoc:PHONE_PREFIX, + "UG"^^euvoc:TED, + "UG"^^euvoc:TED_SCHEMA, + "EAU"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "800"^^euvoc:UNSD_M49 ; + skos:prefLabel "أوغندا"@ar, + "Уганда"@bg, + "Uganda"@ca, + "Uganda"@cs, + "Uganda"@da, + "Uganda"@de, + "Ουγκάντα"@el, + "Uganda"@en, + "Uganda"@es, + "Uganda"@et, + "Uganda"@fi, + "Ouganda"@fr, + "Uganda"@ga, + "Uganda"@hr, + "Uganda"@hu, + "Úganda"@is, + "Uganda"@it, + "ウガンダ"@ja, + "Uganda"@lb, + "Uganda"@lt, + "Uganda"@lv, + "L-Uganda"@mt, + "Uganda"@nl, + "Uganda"@no, + "Uganda"@pl, + "Uganda"@pt, + "Uganda"@ro, + "Уганда"@ru, + "Uganda"@sk, + "Uganda"@sl, + "Uganda"@sv, + "Uganda"@tr, + "Уганда"@uk, + "乌干达"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "UKR" ; + at:deprecated "false" ; + at:op-code "UKR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "UA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "UKR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "UA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "UA" ; + dc:source "TED" ] ; + at:start.use "1991-08-24" ; + atold:op-code "UKR" ; + dc:identifier "UKR" ; + skos:hiddenLabel "an Úcráin"@ga, + "Ukrainos"@lt, + "Ukrainas"@lv, + "l-Ukrajna"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "183"^^euvoc:EP, + "UKR"^^euvoc:FD_010, + "UA"^^euvoc:FD_140, + ".ua"^^euvoc:IANA_DOMAIN, + "UA"^^euvoc:IBAN_COU, + "UA"^^euvoc:ISG_COU, + "UA"^^euvoc:ISO_3166_1_ALPHA_2, + "UKR"^^euvoc:ISO_3166_1_ALPHA_3, + "804"^^euvoc:ISO_3166_1_NUM, + "UKR"^^euvoc:NAC, + "380"^^euvoc:PHONE_PREFIX, + "UA"^^euvoc:TED, + "UA"^^euvoc:TED_SCHEMA, + "UA"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "804"^^euvoc:UNSD_M49 ; + skos:prefLabel "أوكرانيا"@ar, + "Украі́на"@be, + "Украйна"@bg, + "Ukrajina"@bs, + "Ucraïna"@ca, + "Ukrajina"@cs, + "Ukraine"@da, + "Ukraine"@de, + "Ουκρανία"@el, + "Ukraine"@en, + "Ucrania"@es, + "Ukraina"@et, + "Ukraina"@eu, + "Ukraina"@fi, + "Ukraina"@fo, + "Ukraine"@fr, + "An Úcráin"@ga, + "Ucraína"@gl, + "Ukrajina"@hr, + "Ukrajna"@hu, + "Úkraína"@is, + "Ucraina"@it, + "ウクライナ"@ja, + "Ukrain"@lb, + "Ukraina"@lt, + "Ukraina"@lv, + "Украина"@mk, + "L-Ukrajna"@mt, + "Oekraïne"@nl, + "Ukraina"@no, + "Ukraina"@pl, + "Ucrânia"@pt, + "Ucraina"@rm, + "Ucraina"@ro, + "Украина"@ru, + "Ukrajina"@sk, + "Ukrajina"@sl, + "Ukraina"@sq, + "Украјина"@sr, + "Ukraina"@sv, + "Ukrayna"@tr, + "Україна"@uk, + "乌克兰"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "URY" ; + at:deprecated "false" ; + at:op-code "URY" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "UY" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "U" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "UY" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "U" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "URY" ; + dc:identifier "URY" ; + skos:altLabel "جمهورية أوروغواي الشرقية"@ar, + "Източна република Уругвай"@bg, + "República Oriental de l'Uruguai"@ca, + "Uruguayská východní republika"@cs, + "Den Østlige Republik Uruguay"@da, + "Republik Östlich des Uruguay"@de, + "Ανατολική Δημοκρατία της Ουρουγουάης"@el, + "Eastern Republic of Uruguay"@en, + "República Oriental del Uruguay"@es, + "Uruguay Idavabariik"@et, + "Uruguayn itäinen tasavalta"@fi, + "République orientale de l’Uruguay"@fr, + "Poblacht Oirthearach Uragua"@ga, + "Istočna Republika Urugvaj"@hr, + "Uruguayi Keleti Köztársaság"@hu, + "Austræna lýðveldið Úrúgvæ"@is, + "Repubblica orientale dell’Uruguay"@it, + "ウルグアイ東方共和国"@ja, + "Ëstlech Republik Uruguay"@lb, + "Urugvajaus Rytų Respublika"@lt, + "Urugvajas Austrumu Republika"@lv, + "Ir-Repubblika Orjentali tal-Urugwaj"@mt, + "Republiek ten oosten van de Uruguay"@nl, + "Republikken øst for Uruguay"@no, + "Wschodnia Republika Urugwaju"@pl, + "República Oriental do Uruguai"@pt, + "Republica Orientală a Uruguayului"@ro, + "Восточная Республика Уругвай"@ru, + "Uruguajská východná republika"@sk, + "Vzhodna republika Urugvaj"@sl, + "Republiken Uruguay"@sv, + "Uruguay Doğu Cumhuriyeti"@tr, + "Східна Республіка Уругвай"@uk, + "乌拉圭东岸共和国"@zh ; + skos:hiddenLabel "uruguayansk"@da, + "Ουρουγουάης"@el, + "République orientale de l'Uruguay"@fr, + "Repubblica orientale dell'Uruguay"@it, + "Urugvajaus"@lt, + "Urugvajas"@lv, + "ir-Repubblika Orjentali tal-Urugwaj"@mt, + "l-Urugwaj"@mt, + "Uruguese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "187"^^euvoc:EP, + "U"^^euvoc:FD_010, + "U"^^euvoc:FD_400, + ".uy"^^euvoc:IANA_DOMAIN, + "UY"^^euvoc:ISG_COU, + "UY"^^euvoc:ISO_3166_1_ALPHA_2, + "URY"^^euvoc:ISO_3166_1_ALPHA_3, + "858"^^euvoc:ISO_3166_1_NUM, + "URY"^^euvoc:NAC, + "598"^^euvoc:PHONE_PREFIX, + "UY"^^euvoc:TED, + "UY"^^euvoc:TED_SCHEMA, + "South America"^^euvoc:UNSD_GEOSCHEME, + "858"^^euvoc:UNSD_M49 ; + skos:prefLabel "أوروغواي"@ar, + "Уругвай"@bg, + "Uruguai"@ca, + "Uruguay"@cs, + "Uruguay"@da, + "Uruguay"@de, + "Ουρουγουάη"@el, + "Uruguay"@en, + "Uruguay"@es, + "Uruguay"@et, + "Uruguay"@fi, + "Uruguay"@fr, + "Uragua"@ga, + "Urugvaj"@hr, + "Uruguay"@hu, + "Úrúgvæ"@is, + "Uruguay"@it, + "ウルグアイ"@ja, + "Uruguay"@lb, + "Urugvajus"@lt, + "Urugvaja"@lv, + "L-Urugwaj"@mt, + "Uruguay"@nl, + "Uruguay"@no, + "Urugwaj"@pl, + "Uruguai"@pt, + "Uruguay"@ro, + "Уругвай"@ru, + "Uruguaj"@sk, + "Urugvaj"@sl, + "Uruguay"@sv, + "Uruguay"@tr, + "Уругвай"@uk, + "乌拉圭"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "UZB" ; + at:deprecated "false" ; + at:op-code "UZB" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "UZ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "UZB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "UZ" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1991-08-31" ; + atold:op-code "UZB" ; + dc:identifier "UZB" ; + skos:altLabel "جمهورية أوزبكستان"@ar, + "Република Узбекистан"@bg, + "República d'Uzbekistan"@ca, + "Republika Uzbekistán"@cs, + "Republikken Usbekistan"@da, + "Republik Usbekistan"@de, + "Δημοκρατία του Ουζμπεκιστάν"@el, + "Republic of Uzbekistan"@en, + "República de Uzbekistán"@es, + "Usbekistani Vabariik"@et, + "Uzbekistanin tasavalta"@fi, + "République d’Ouzbékistan"@fr, + "Poblacht na hÚisbéiceastáine"@ga, + "Republika Uzbekistan"@hr, + "Üzbég Köztársaság"@hu, + "Lýðveldið Úsbekistan"@is, + "Repubblica dell’Uzbekistan"@it, + "ウズベキスタン共和国"@ja, + "Republik Usbekistan"@lb, + "Uzbekistano Respublika"@lt, + "Uzbekistānas Republika"@lv, + "Ir-Repubblika tal-Użbekistan"@mt, + "Republiek Oezbekistan"@nl, + "Republikken Usbekistan"@no, + "Republika Uzbekistanu"@pl, + "República do Usbequistão"@pt, + "Republica Uzbekistan"@ro, + "Республика Узбекистан"@ru, + "Uzbecká republika"@sk, + "Republika Uzbekistan"@sl, + "Republiken Uzbekistan"@sv, + "Özbekistan Cumhuriyeti"@tr, + "Республіка Узбекистан"@uk, + "Узбекистан"@uz, + "乌兹别克斯坦共和国"@zh ; + skos:hiddenLabel "République d'Ouzbékistan"@fr, + "an Úisbéiceastáin"@ga, + "uzbekistansko"@hr, + "Repubblica dell'Uzbekistan"@it, + "Uzbekistano"@lt, + "Uzbekistānas"@lv, + "ir-Repubblika tal-Użbekistan"@mt, + "l-Użbekistan"@mt, + "uzbekistańskie"@pl, + "uzbeško"@sl, + "uzbekisk"@sv ; + skos:inScheme atold:country, + , + , + ; + skos:notation "188"^^euvoc:EP, + "UZB"^^euvoc:FD_010, + ".uz"^^euvoc:IANA_DOMAIN, + "UZ"^^euvoc:ISG_COU, + "UZ"^^euvoc:ISO_3166_1_ALPHA_2, + "UZB"^^euvoc:ISO_3166_1_ALPHA_3, + "860"^^euvoc:ISO_3166_1_NUM, + "UZB"^^euvoc:NAC, + "998"^^euvoc:PHONE_PREFIX, + "UZ"^^euvoc:TED, + "UZ"^^euvoc:TED_SCHEMA, + "UZ"^^euvoc:TIR, + "Central Asia"^^euvoc:UNSD_GEOSCHEME, + "860"^^euvoc:UNSD_M49 ; + skos:prefLabel "أوزبكستان"@ar, + "Узбекистан"@bg, + "Uzbekistan"@ca, + "Uzbekistán"@cs, + "Usbekistan"@da, + "Usbekistan"@de, + "Ουζμπεκιστάν"@el, + "Uzbekistan"@en, + "Uzbekistán"@es, + "Usbekistan"@et, + "Uzbekistan"@fi, + "Ouzbékistan"@fr, + "An Úisbéiceastáin"@ga, + "Uzbekistan"@hr, + "Üzbegisztán"@hu, + "Úsbekistan"@is, + "Uzbekistan"@it, + "ウズベキスタン"@ja, + "Usbekistan"@lb, + "Uzbekistanas"@lt, + "Uzbekistāna"@lv, + "L-Użbekistan"@mt, + "Oezbekistan"@nl, + "Usbekistan"@no, + "Uzbekistan"@pl, + "Usbequistão"@pt, + "Uzbekistan"@ro, + "Узбекистан"@ru, + "Uzbekistan"@sk, + "Uzbekistan"@sl, + "Uzbekistan"@sv, + "Özbekistan"@tr, + "Узбекистан"@uk, + "乌兹别克斯坦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "VCT" ; + at:deprecated "false" ; + at:op-code "VCT" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "WV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "VC" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "VC" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "VC" ; + dc:source "TED" ] ; + at:start.use "1979-10-27" ; + atold:op-code "VCT" ; + dc:identifier "VCT" ; + skos:altLabel "Saint Vincent ja Grenadiinid"@et ; + skos:hiddenLabel "sanktvincentisk"@da, + "Αγίου Βικεντίου και Γρεναδινών"@el, + "Vincentian; of Saint Vincent and the Grenadines"@en, + "Saint Vincent ja Grenadiinien kansalainen"@fi, + "saint vincentaise et grenadine"@fr, + "duine ó Shan Uinseann agus na Greanáidíní"@ga, + "Svetog Vincenta i Grenadinija"@hr, + "Saint Vincent és a Grenadine-szigetek"@hu, + "Saint Vincent és a Grenadine-szigeteki"@hu, + "minn Saint Vincent u l-Grenadini"@mt, + "Saint Vincent i Grenadynów"@pl, + "din Saint Vincent și Grenadine"@ro, + "Saint Vincenta in Grenadina"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "190"^^euvoc:EP, + "VC"^^euvoc:FD_010, + "WV"^^euvoc:FD_400, + ".vc"^^euvoc:IANA_DOMAIN, + "VC"^^euvoc:ISG_COU, + "VC"^^euvoc:ISO_3166_1_ALPHA_2, + "VCT"^^euvoc:ISO_3166_1_ALPHA_3, + "670"^^euvoc:ISO_3166_1_NUM, + "VCT"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "VC"^^euvoc:TED, + "VC"^^euvoc:TED_SCHEMA, + "WV"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "670"^^euvoc:UNSD_M49 ; + skos:prefLabel "سانت فنسنت وجزر غرينادين"@ar, + "Сейнт Винсънт и Гренадини"@bg, + "Saint Vincent i les Grenadines"@ca, + "Svatý Vincenc a Grenadiny"@cs, + "Saint Vincent og Grenadinerne"@da, + "St. Vincent und die Grenadinen"@de, + "Άγιος Βικέντιος και Γρεναδίνες"@el, + "Saint Vincent and the Grenadines"@en, + "San Vicente y las Granadinas"@es, + "Saint Vincent"@et, + "Saint Vincent ja Grenadiinit"@fi, + "Saint-Vincent-et-les-Grenadines"@fr, + "San Uinseann agus na Greanáidíní"@ga, + "Sveti Vincent i Grenadini"@hr, + "Saint Vincent és Grenadine-szigetek"@hu, + "Sankti Vinsent og Grenadínur"@is, + "Saint Vincent e Grenadine"@it, + "セントビンセント・グレナディーン"@ja, + "Saint Vincent an d’Grenadinnen"@lb, + "Sent Vinsentas ir Grenadinai"@lt, + "Sentvinsenta un Grenadīnas"@lv, + "Saint Vincent u l-Grenadini"@mt, + "Saint Vincent en de Grenadines"@nl, + "Saint Vincent og Grenadinene"@no, + "Saint Vincent i Grenadyny"@pl, + "São Vicente e Granadinas"@pt, + "Saint Vincent și Grenadinele"@ro, + "Сент-Винсент и Гренадины"@ru, + "Svätý Vincent a Grenadíny"@sk, + "Sveti Vincencij in Grenadine"@sl, + "Saint Vincent och Grenadinerna"@sv, + "Saint Vincent ve Grenadinler"@tr, + "Сент-Вінсент і Гренадини"@uk, + "圣文森特和格林纳丁斯"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "VEN" ; + at:deprecated "false" ; + at:op-code "VEN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "YV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "VE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "YV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "VE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "YV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "VE" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "VEN" ; + dc:identifier "VEN" ; + skos:altLabel "جمهورية فنزويلا البوليفارية"@ar, + "Боливарска република Венесуела"@bg, + "República Bolivariana de Veneçuela"@ca, + "Bolívarovská republika Venezuela"@cs, + "Den Bolivariske Republik Venezuela"@da, + "Bolivarische Republik Venezuela"@de, + "Μπολιβαριανή Δημοκρατία της Βενεζουέλας"@el, + "Bolivarian Republic of Venezuela"@en, + "República Bolivariana de Venezuela"@es, + "Venezuela Bolivari Vabariik"@et, + "Venezuelan bolivariaaninen tasavalta"@fi, + "République bolivarienne du Venezuela"@fr, + "Poblacht Bholavarach Veiniséala"@ga, + "Bolivarijanska Republika Venezuela"@hr, + "Venezuelai Bolivári Köztársaság"@hu, + "Bólívarska lýðveldið Venesúela"@is, + "Repubblica bolivariana del Venezuela"@it, + "ベネズエラ・ボリバル共和国"@ja, + "Bolivaresch Republik Venezuela"@lb, + "Venesuelos Bolivaro Respublika"@lt, + "Venecuēlas Bolivāra Republika"@lv, + "Ir-Repubblika Bolivarjana tal-Venezwela"@mt, + "Bolivariaanse Republiek Venezuela"@nl, + "Den bolivariske republikken Venezuela"@no, + "Boliwariańska Republika Wenezueli"@pl, + "República Bolivariana da Venezuela"@pt, + "Republica Bolivariană a Venezuelei"@ro, + "Боливарианская Республика Венесуэла"@ru, + "Venezuelská bolívarovská republika"@sk, + "Bolivarska republika Venezuela"@sl, + "Bolivarianska republiken Venezuela"@sv, + "Bolivarcı Venezuala Cumhuriyeti"@tr, + "Боліваріанська Республіка Венесуела"@uk, + "委内瑞拉玻利瓦尔共和国"@zh ; + skos:hiddenLabel "Боливарска република Венецуела"@bg, + "Венецуела"@bg, + "Βενεζουέλας"@el, + "Venesuelos"@lt, + "Venecuēlas"@lv, + "Venezwelana"@mt, + "il-Venezwela"@mt, + "ir-Repubblika Bolivarjana tal-Venezwela"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "191"^^euvoc:EP, + "YV"^^euvoc:FD_010, + "VE"^^euvoc:FD_140, + "YV"^^euvoc:FD_140, + "YV"^^euvoc:FD_400, + ".ve"^^euvoc:IANA_DOMAIN, + "VE"^^euvoc:ISG_COU, + "VE"^^euvoc:ISO_3166_1_ALPHA_2, + "VEN"^^euvoc:ISO_3166_1_ALPHA_3, + "862"^^euvoc:ISO_3166_1_NUM, + "VEN"^^euvoc:NAC, + "58"^^euvoc:PHONE_PREFIX, + "VE"^^euvoc:TED, + "VE"^^euvoc:TED_SCHEMA, + "YV"^^euvoc:TIR, + "South America"^^euvoc:UNSD_GEOSCHEME, + "862"^^euvoc:UNSD_M49 ; + skos:prefLabel "فنزويلا"@ar, + "Венесуела"@bg, + "Veneçuela"@ca, + "Venezuela"@cs, + "Venezuela"@da, + "Venezuela"@de, + "Βενεζουέλα"@el, + "Venezuela"@en, + "Venezuela"@es, + "Venezuela"@et, + "Venezuela"@fi, + "Venezuela"@fr, + "Veiniséala"@ga, + "Venezuela"@hr, + "Venezuela"@hu, + "Venesúela"@is, + "Venezuela"@it, + "ベネズエラ"@ja, + "Venezuela"@lb, + "Venesuela"@lt, + "Venecuēla"@lv, + "Il-Venezwela"@mt, + "Venezuela"@nl, + "Venezuela"@no, + "Wenezuela"@pl, + "Venezuela"@pt, + "Venezuela"@ro, + "Венесуэла"@ru, + "Venezuela"@sk, + "Venezuela"@sl, + "Venezuela"@sv, + "Venezuela"@tr, + "Венесуела"@uk, + "委内瑞拉"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "VGB" ; + at:deprecated "false" ; + at:op-code "VGB" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "VG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "VG" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "VGB" ; + dc:identifier "VGB" ; + skos:altLabel "De Britiske Jomfruøer"@da, + "Briti Neitsisaarte asumaa"@et, + "Didžiosios Britanijos Mergelių Salos"@lt, + "Britu Virdžīnu salas"@lv, + "Jomfruøyene"@no ; + skos:broader ; + skos:hiddenLabel "Βρετανικών Παρθένων Νήσων"@el, + "britannialainen, Brittiläisten Neitsytsaarten asukas"@fi, + "Oileáin Bhriotanacha na Maighdean"@ga, + "duine ó Oileáin Bhriotanacha na Maighdean"@ga, + "Britanskih Djevičanskih Otoka"@hr, + "Mergelių Salų (Didžioji Britanija)"@lt, + "il-Gżejjer Verġni Brittaniċi"@mt, + "mill-Gżejjer Verġni Brittaniċi"@mt, + "Brytyjskich Wysp Dziewiczych"@pl, + "Britanskih Deviških otokov"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "192"^^euvoc:EP, + ".vg"^^euvoc:IANA_DOMAIN, + "VG"^^euvoc:IBAN_COU, + "VG"^^euvoc:ISG_COU, + "VG"^^euvoc:ISO_3166_1_ALPHA_2, + "VGB"^^euvoc:ISO_3166_1_ALPHA_3, + "092"^^euvoc:ISO_3166_1_NUM, + "VGB"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "VG"^^euvoc:TED, + "VG"^^euvoc:TED_SCHEMA, + "BVI"^^euvoc:TIR, + "Caribbean"^^euvoc:UNSD_GEOSCHEME, + "092"^^euvoc:UNSD_M49 ; + skos:prefLabel "الجزر العذراء البريطانية"@ar, + "Британски Вирджински острови"@bg, + "Illes Verges Britàniques"@ca, + "Britské Panenské ostrovy"@cs, + "Britiske Jomfruøer"@da, + "Britische Jungferninseln"@de, + "Βρετανικές Παρθένες Νήσοι"@el, + "British Virgin Islands"@en, + "Islas Vírgenes Británicas"@es, + "Briti Neitsisaared"@et, + "Brittiläiset Neitsytsaaret"@fi, + "Îles Vierges britanniques"@fr, + "Ógh-Oileáin na Breataine"@ga, + "Britanski Djevičanski Otoci"@hr, + "Brit Virgin-szigetek"@hu, + "Bresku Jómfrúareyjar"@is, + "Isole Vergini britanniche"@it, + "イギリス領ヴァージン諸島"@ja, + "Brittesch Joffereninselen"@lb, + "Mergelių Salos (Didžioji Britanija)"@lt, + "Britu Virdžīnas"@lv, + "Il-Gżejjer Verġni Brittaniċi"@mt, + "Britse Maagdeneilanden"@nl, + "De britiske jomfruøyene"@no, + "Brytyjskie Wyspy Dziewicze"@pl, + "Ilhas Virgens Britânicas"@pt, + "Insulele Virgine Britanice"@ro, + "Британские Виргинские Острова"@ru, + "Britské Panenské ostrovy"@sk, + "Britanski Deviški otoki"@sl, + "Brittiska Jungfruöarna"@sv, + "Britanya Virjin Adaları"@tr, + "Британські Віргінські Острови"@uk, + "英属维尔京群岛"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "VNM" ; + at:deprecated "false" ; + at:op-code "VNM" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "VN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "VN" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "VN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "VN" ; + dc:source "TED" ] ; + at:start.use "1955-10-27" ; + atold:op-code "VNM" ; + dc:identifier "VNM" ; + skos:altLabel "جمهورية فيتنام الاشتراكية"@ar, + "Социалистическа република Виетнам"@bg, + "República Socialista de Vietnam"@ca, + "Vietnamská socialistická republika"@cs, + "Den Socialistiske Republik Vietnam"@da, + "Sozialistische Republik Vietnam"@de, + "Σοσιαλιστική Δημοκρατία του Βιετνάμ"@el, + "Socialist Republic of Viet Nam"@en, + "República Socialista de Vietnam"@es, + "Vietnami Sotsialistlik Vabariik"@et, + "Vietnamin sosialistinen tasavalta"@fi, + "République socialiste du Viêt Nam"@fr, + "Poblacht Shóisialach Vítneam"@ga, + "Socijalistička Republika Vijetnam"@hr, + "Vietnámi Szocialista Köztársaság"@hu, + "Alþýðulýðveldið Víetnam"@is, + "Repubblica socialista del Vietnam"@it, + "ベトナム社会主義共和国"@ja, + "Sozialistesch Republik Vietnam"@lb, + "Vietnamo Socialistinė Respublika"@lt, + "Vjetnamas Sociālistiskā Republika"@lv, + "Ir-Repubblika Soċjalista tal-Vjetnam"@mt, + "Socialistische Republiek Vietnam"@nl, + "Den sosialistiske republikken Vietnam"@no, + "Socjalistyczna Republika Wietnamu"@pl, + "República Socialista do Vietname"@pt, + "Republica Socialistă Vietnam"@ro, + "Социалистическая Республика Вьетнам"@ru, + "Vietnamská socialistická republika"@sk, + "Socialistična republika Vietnam"@sl, + "Socialistiska republiken Vietnam"@sv, + "Vietnam Sosyalist Cumhuriyeti"@tr, + "Соціалістична Республіка В'єтнам"@uk, + "Việt Nam"@vi, + "越南社会主义共和国"@zh ; + skos:hiddenLabel "Vietnam"@hu, + "Vietnami Szocialista Köztársaság"@hu, + "vietnami"@hu, + "vitenamita"@it, + "Vietnamo"@lt, + "Vjetnamas"@lv, + "il-Vjetnam"@mt, + "ir-Repubblika Soċjalista tal-Vjetnam"@mt, + "Viernamese"@nl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "194"^^euvoc:EP, + "VN"^^euvoc:FD_010, + "VN"^^euvoc:FD_400, + ".vn"^^euvoc:IANA_DOMAIN, + "VN"^^euvoc:ISG_COU, + "VN"^^euvoc:ISO_3166_1_ALPHA_2, + "VNM"^^euvoc:ISO_3166_1_ALPHA_3, + "704"^^euvoc:ISO_3166_1_NUM, + "VNM"^^euvoc:NAC, + "84"^^euvoc:PHONE_PREFIX, + "VN"^^euvoc:TED, + "VN"^^euvoc:TED_SCHEMA, + "VN"^^euvoc:TIR, + "South-eastern Asia"^^euvoc:UNSD_GEOSCHEME, + "704"^^euvoc:UNSD_M49 ; + skos:prefLabel "فيتنام"@ar, + "Виетнам"@bg, + "Vietnam"@ca, + "Vietnam"@cs, + "Vietnam"@da, + "Vietnam"@de, + "Βιετνάμ"@el, + "Viet Nam"@en, + "Vietnam"@es, + "Vietnam"@et, + "Vietnam"@fi, + "Viêt Nam"@fr, + "Vítneam"@ga, + "Vijetnam"@hr, + "Vietnám"@hu, + "Víetnam"@is, + "Vietnam"@it, + "ベトナム"@ja, + "Vietnam"@lb, + "Vietnamas"@lt, + "Vjetnama"@lv, + "Il-Vjetnam"@mt, + "Vietnam"@nl, + "Vietnam"@no, + "Wietnam"@pl, + "Vietname"@pt, + "Vietnam"@ro, + "Вьетнам"@ru, + "Vietnam"@sk, + "Vietnam"@sl, + "Vietnam"@sv, + "Vietnam"@tr, + "В'єтнам"@uk, + "越南"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "VUT" ; + at:deprecated "false" ; + at:op-code "VUT" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "VANUATU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "VU" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "VU" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1980-07-30" ; + atold:op-code "VUT" ; + dc:identifier "VUT" ; + skos:altLabel "جمهورية فانواتو"@ar, + "Република Вануату"@bg, + "Vanuatu"@bi, + "República de Vanuatu"@ca, + "Vanuatská republika"@cs, + "Republikken Vanuatu"@da, + "Republik Vanuatu"@de, + "Δημοκρατία του Βανουάτου"@el, + "Republic of Vanuatu"@en, + "República de Vanuatu"@es, + "Vanuatu Vabariik"@et, + "Vanuatun tasavalta"@fi, + "République de Vanuatu"@fr, + "Poblacht Vanuatú"@ga, + "Republika Vanatu"@hr, + "Vanuatui Köztársaság"@hu, + "Lýðveldið Vanúatú"@is, + "Repubblica di Vanuatu"@it, + "バヌアツ共和国"@ja, + "Republik Vanuatu"@lb, + "Vanuatu Respublika"@lt, + "Vanuatu Republika"@lv, + "Ir-Repubblika ta’ Vanuatu"@mt, + "Republiek Vanuatu"@nl, + "Republikken Vanuatu"@no, + "Republika Vanuatu"@pl, + "República de Vanuatu"@pt, + "Republica Vanuatu"@ro, + "Республика Вануату"@ru, + "Vanuatská republika"@sk, + "Republika Vanuatu"@sl, + "Republiken Vanuatu"@sv, + "Vanuatu Cumhuriyeti"@tr, + "Республіка Вануату"@uk, + "瓦努阿图共和国"@zh ; + skos:hiddenLabel "Republika Vanuatu"@hr, + "Vanuatua"@hr, + "ir-Repubblika tal-Vanuatu"@mt, + "Vanuataanse"@nl, + "vanuackie"@pl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "195"^^euvoc:EP, + "VANUATU"^^euvoc:FD_010, + ".vu"^^euvoc:IANA_DOMAIN, + "VU"^^euvoc:ISG_COU, + "VU"^^euvoc:ISO_3166_1_ALPHA_2, + "VUT"^^euvoc:ISO_3166_1_ALPHA_3, + "548"^^euvoc:ISO_3166_1_NUM, + "VUT"^^euvoc:NAC, + "678"^^euvoc:PHONE_PREFIX, + "VU"^^euvoc:TED, + "VU"^^euvoc:TED_SCHEMA, + "Melanesia"^^euvoc:UNSD_GEOSCHEME, + "548"^^euvoc:UNSD_M49 ; + skos:prefLabel "فانواتو"@ar, + "Вануату"@bg, + "Vanuatu"@ca, + "Vanuatu"@cs, + "Vanuatu"@da, + "Vanuatu"@de, + "Βανουάτου"@el, + "Vanuatu"@en, + "Vanuatu"@es, + "Vanuatu"@et, + "Vanuatu"@fi, + "Vanuatu"@fr, + "Vanuatú"@ga, + "Vanuatu"@hr, + "Vanuatu"@hu, + "Vanúatú"@is, + "Vanuatu"@it, + "バヌアツ"@ja, + "Vanuatu"@lb, + "Vanuatu"@lt, + "Vanuatu"@lv, + "Vanuatu"@mt, + "Vanuatu"@nl, + "Vanuatu"@no, + "Vanuatu"@pl, + "Vanuatu"@pt, + "Vanuatu"@ro, + "Вануату"@ru, + "Vanuatu"@sk, + "Vanuatu"@sl, + "Vanuatu"@sv, + "Vanuatu"@tr, + "Вануату"@uk, + "瓦努阿图"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "WLF" ; + at:deprecated "false" ; + at:op-code "WLF" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "WF" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "WF" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "WLF" ; + dc:identifier "WLF" ; + skos:altLabel "إقليم جزر واليس وفوتونا"@ar, + "Територия Уолис и Футуна"@bg, + "Territori de les Illes Wallis i Futuna"@ca, + "Teritorium ostrovů Wallis a Futuna"@cs, + "Territoriet Wallis og Futuna"@da, + "Territorium Wallis und Futuna"@de, + "Έδαφος των Νήσων Ουάλις και Φουτούνα"@el, + "Territory of the Wallis and Futuna Islands"@en, + "Territorio de Wallis y Futuna"@es, + "Wallise ja Futuna ala"@et, + "Wallis ja Futunan territorio"@fi, + "Ouvea"@fr, + "Territoire des îles Wallis et Futuna"@fr, + "Oileáin Wallis agus Futuna"@ga, + "Područje Wallisa i Futune"@hr, + "Wallis- és Futuna-szigeteki Terület"@hu, + "Territorio delle isole Wallis e Futuna"@it, + "ウォリス・フテュナ諸島海外準県"@ja, + "Territoire vun de Wallis- a Futunainselen"@lb, + "Voliso ir Futūnos Salų Teritorija"@lt, + "Volisa un Futunas Salu Teritorija"@lv, + "It-Territorju tal-Gżejjer Wallis u Futuna"@mt, + "Territorium Wallis en Futuna"@nl, + "Wallis- og Futunaøyene"@no, + "Terytorium Wysp Wallis i Futuna"@pl, + "Território das Ilhas Wallis e Futuna"@pt, + "Teritoriul Insulelor Wallis și Futuna"@ro, + "Территория острова Уоллис и Футуна"@ru, + "Územie ostrovov Wallis a Futuna"@sk, + "Otoki Wallis in Futuna"@sl, + "Territoriet Wallis- och Futunaöarna"@sv, + "Wallis ve Futuna Adaları Bölgesi"@tr, + "Територія островів Уолліс і Футуна"@uk, + "瓦利斯和富图纳群岛领土"@zh ; + skos:broader ; + skos:hiddenLabel "Ostrovy Wallis a Futuna"@cs, + "Έδαφος των Νήσων Ουαλίς και Φουτουνά"@el, + "Νήσοι Ουαλίς και Φουτουνά"@el, + "Νήσων Ουαλίς και Φουτουνά"@el, + "Wallis ja Futunan yhteisö"@fi, + "ranskalainen, wallisfutunalainen"@fi, + "Territoire des Iles Wallis et Futuna"@fr, + "française"@fr, + "Críoch Oileáin Vailís agus Futúna"@ga, + "duine ó Vailís agus Futúna"@ga, + "Wallisa i Futune"@hr, + "Voliso ir Futūno"@lt, + "Volisa un Futunas Salas Teritorija"@lv, + "Volisa un Futunas Salu"@lv, + "Wallisjana; Futunana"@mt, + "Wallis i Futuny"@pl, + "Wallis și Futuna"@ro, + "din Wallis și Futuna"@ro, + "Ozemlje otokov Wallis in Futuna"@sl ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "196"^^euvoc:EP, + ".wf"^^euvoc:IANA_DOMAIN, + "WF"^^euvoc:ISG_COU, + "WF"^^euvoc:ISO_3166_1_ALPHA_2, + "WLF"^^euvoc:ISO_3166_1_ALPHA_3, + "876"^^euvoc:ISO_3166_1_NUM, + "WLF"^^euvoc:NAC, + "681"^^euvoc:PHONE_PREFIX, + "WF"^^euvoc:TED, + "WF"^^euvoc:TED_SCHEMA, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "876"^^euvoc:UNSD_M49 ; + skos:prefLabel "واليس وفوتونا"@ar, + "Уолис и Футуна"@bg, + "Wallis i Futuna"@ca, + "Wallis a Futuna"@cs, + "Wallis og Futuna"@da, + "Wallis und Futuna"@de, + "Ουάλις και Φουτούνα"@el, + "Wallis and Futuna"@en, + "Wallis y Futuna"@es, + "Wallis ja Futuna"@et, + "Wallis ja Futuna"@fi, + "Wallis-et-Futuna"@fr, + "Wallis agus Futuna"@ga, + "Wallis i Futuna"@hr, + "Wallis és Futuna"@hu, + "Wallis- og Fútúnaeyjar"@is, + "Wallis e Futuna"@it, + "ウォリス・フツナ"@ja, + "Wallis a Futuna"@lb, + "Volisas ir Futūna"@lt, + "Volisa un Futunas salas"@lv, + "Wallis u Futuna"@mt, + "Wallis en Futuna"@nl, + "Wallis og Futuna"@no, + "Wallis i Futuna"@pl, + "Wallis e Futuna"@pt, + "Wallis şi Futuna"@ro, + "Уоллис и Футуна"@ru, + "Wallis a Futuna"@sk, + "Wallis in Futuna"@sl, + "Wallis och Futuna"@sv, + "Wallis ve Futuna"@tr, + "Волліс і Футуна"@uk, + "瓦利斯和富图纳"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "WSM" ; + at:deprecated "false" ; + at:op-code "WSM" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "WS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "WS" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "WS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "WS" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1962-01-01" ; + atold:op-code "WSM" ; + dc:identifier "WSM" ; + skos:altLabel "دولة ساموا المستقلة"@ar, + "Независима държава Самоа"@bg, + "Estat Independent de Samoa"@ca, + "Nezávislý stát Samoa"@cs, + "Den Uafhængige Stat Samoa"@da, + "Unabhängige Staat Samoa"@de, + "Ανεξάρτητο Κράτος της Σαμόας"@el, + "Independent State of Samoa"@en, + "Estado Independiente de Samoa"@es, + "Samoa Iseseisvusriik"@et, + "Samoan itsenäinen valtio"@fi, + "État indépendant du Samoa"@fr, + "Stát Neamhspléach Shamó"@ga, + "Nezavisna Država Samoa"@hr, + "Szamoai Független Állam"@hu, + "Sjálfstæða ríkið Samóa"@is, + "Stato indipendente di Samoa"@it, + "サモア独立国"@ja, + "Onofhängege Staat Samoa"@lb, + "Samoa Neprikausomoji Valstybė"@lt, + "Samoa Neatkarīgā Valsts"@lv, + "L-Istat Indipendenti ta’ Samoa"@mt, + "Onafhankelijke Staat Samoa"@nl, + "Den selvstendige staten Samoa"@no, + "Niezależne Państwo Samoa"@pl, + "Estado Independente de Samoa"@pt, + "Statul Independent Samoa"@ro, + "Независимое Государство Самоа"@ru, + "Samojský nezávislý štát"@sk, + "Neodvisna država Samoa"@sl, + "Sāmoa"@sm, + "Självständiga staten Samoa"@sv, + "Samoa Bağımsız Devleti"@tr, + "Незалежна Держава Самоа"@uk, + "萨摩亚独立国"@zh ; + skos:hiddenLabel "Ανεξάρτητο Κράτος των Σαμόα"@el, + "Western Samoa"@en, + "Länsi-Samoa"@fi, + "Länsi-Samoan itsenäinen valtio"@fi, + "samoalainen, länsisamoalainen"@fi, + "Etat indépendant du Samoa-Occidental"@fr, + "Samó Thiar"@ga, + "Stát Neamhspleách Shamó Thiar"@ga, + "duine ó Shamó Thiar"@ga, + "Samoe"@hr, + "Nyugat-Szamoa"@hu, + "Nyugat-Szamoai Független Állam"@hu, + "nyugat-szamoai"@hu, + "Samoa Nepriklausomoji Valstybė"@lt, + "Rietumsamoa"@lv, + "Rietumsamoas"@lv, + "l-Istat Indipendenti tas-Samoa tal-Punent"@mt, + "do Estado Independente de Samoa"@pt, + "Statul Independent Samoa de Vest"@ro, + "din Statul Independent Samoa de Vest"@ro, + "Neodvisna država Zahodna Samoa"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "198"^^euvoc:EP, + "269"^^euvoc:EP, + "WS"^^euvoc:FD_010, + "WS"^^euvoc:FD_400, + ".ws"^^euvoc:IANA_DOMAIN, + "WS"^^euvoc:ISG_COU, + "WS"^^euvoc:ISO_3166_1_ALPHA_2, + "WSM"^^euvoc:ISO_3166_1_ALPHA_3, + "882"^^euvoc:ISO_3166_1_NUM, + "WSM"^^euvoc:NAC, + "685"^^euvoc:PHONE_PREFIX, + "WS"^^euvoc:TED, + "WS"^^euvoc:TED_SCHEMA, + "WS"^^euvoc:TIR, + "Polynesia"^^euvoc:UNSD_GEOSCHEME, + "882"^^euvoc:UNSD_M49 ; + skos:prefLabel "ساموا"@ar, + "Самоа"@bg, + "Samoa"@ca, + "Samoa"@cs, + "Samoa"@da, + "Samoa"@de, + "Σαμόα"@el, + "Samoa"@en, + "Samoa"@es, + "Samoa"@et, + "Samoa"@fi, + "Samoa"@fr, + "Samó"@ga, + "Samoa"@hr, + "Szamoa"@hu, + "Samóa"@is, + "Samoa"@it, + "サモア"@ja, + "Samoa"@lb, + "Samoa"@lt, + "Samoa"@lv, + "Samoa"@mt, + "Samoa"@nl, + "Samoa"@no, + "Samoa"@pl, + "Samoa"@pt, + "Samoa"@ro, + "Самоа"@ru, + "Samoa"@sk, + "Samoa"@sl, + "Samoa"@sv, + "Samoa"@tr, + "Самоа"@uk, + "萨摩亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "XXO" ; + at:deprecated "false" ; + at:op-code "XXO" ; + at:start.use "2022-12-09" ; + atold:op-code "XXO" ; + dc:identifier "XXO" ; + skos:altLabel "Scattered Islands in the Indian Ocean"@en ; + skos:broader , + ; + skos:definition "islands in the Indian Ocean, part of the French Southern and Antarctic Lands"@en ; + skos:inScheme atold:country, + , + ; + skos:notation "XXO"^^euvoc:NAC ; + skos:prefLabel "Juan de Nova, Glorioso, Europa, Tromelin, Bassas da India"@en ; + skos:topConceptOf , + . + + a skos:Concept ; + at:authority-code "YEM" ; + at:deprecated "false" ; + at:op-code "YEM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "YE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "YE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RY" ; + dc:source "EurLex" ] ; + at:start.use "1967-11-30" ; + atold:op-code "YEM" ; + dc:identifier "YEM" ; + skos:altLabel "جمهورية اليمن"@ar, + "Република Йемен"@bg, + "República del Iemen"@ca, + "Jemenská republika"@cs, + "Republikken Yemen"@da, + "Republik Jemen"@de, + "Δημοκρατία της Υεμένης"@el, + "Republic of Yemen"@en, + "República de Yemen"@es, + "Jeemeni Vabariik"@et, + "Jemenin tasavalta"@fi, + "République du Yémen"@fr, + "Poblacht Éimin"@ga, + "Republika Jemen"@hr, + "Jemeni Köztársaság"@hu, + "Lýðveldið Jemen"@is, + "Repubblica dello Yemen"@it, + "イエメン共和国"@ja, + "Republik Yemen"@lb, + "Jemeno Respublika"@lt, + "Jemenas Republika"@lv, + "Ir-Repubblika tal-Jemen"@mt, + "Republiek Jemen"@nl, + "Republikken Jemen"@no, + "Republika Jemeńska"@pl, + "República do Iémen"@pt, + "Republica Yemen"@ro, + "Йеменская Республика"@ru, + "Jemenská republika"@sk, + "Republika Jemen"@sl, + "Republiken Jemen"@sv, + "Yemen Cumhuriyeti"@tr, + "Республіка Ємен"@uk, + "也门共和国"@zh ; + skos:hiddenLabel "Υεμένης"@el, + "Jemeno"@lt, + "Jemenas"@lv, + "il-Jemen"@mt, + "ir-Repubblika tal-Jemen"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "202"^^euvoc:EP, + "RY"^^euvoc:FD_010, + ".ye"^^euvoc:IANA_DOMAIN, + "YE"^^euvoc:ISG_COU, + "YE"^^euvoc:ISO_3166_1_ALPHA_2, + "YEM"^^euvoc:ISO_3166_1_ALPHA_3, + "887"^^euvoc:ISO_3166_1_NUM, + "YEM"^^euvoc:NAC, + "967"^^euvoc:PHONE_PREFIX, + "YE"^^euvoc:TED, + "YE"^^euvoc:TED_SCHEMA, + "YAR"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "887"^^euvoc:UNSD_M49 ; + skos:prefLabel "اليمن"@ar, + "Йемен"@bg, + "Iemen, el"@ca, + "Jemen"@cs, + "Yemen"@da, + "Jemen"@de, + "Υεμένη"@el, + "Yemen"@en, + "Yemen"@es, + "Jeemen"@et, + "Jemen"@fi, + "Yémen"@fr, + "Éimin"@ga, + "Jemen"@hr, + "Jemen"@hu, + "Jemen"@is, + "Yemen"@it, + "イエメン"@ja, + "Jemen"@lb, + "Jemenas"@lt, + "Jemena"@lv, + "Il-Jemen"@mt, + "Jemen"@nl, + "Yemen"@no, + "Jemen"@pl, + "Iémen"@pt, + "Yemen"@ro, + "Йемен"@ru, + "Jemen"@sk, + "Jemen"@sl, + "Jemen"@sv, + "Yemen"@tr, + "Ємен"@uk, + "也门"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ZAF" ; + at:deprecated "false" ; + at:op-code "ZAF" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "ZA" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "ZA" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "ZA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "ZA" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ZAF" ; + dc:identifier "ZAF" ; + skos:altLabel "Suid-Afrika"@af, + "جمهورية جنوب أفريقيا"@ar, + "Република Южна Африка"@bg, + "República de Sud-àfrica"@ca, + "Jihoafrická republika"@cs, + "Den Sydafrikanske Republik"@da, + "Republik Südafrika"@de, + "Δημοκρατία της Νότιας Αφρικής"@el, + "Republic of South Africa"@en, + "República de Sudáfrica"@es, + "Lõuna-Aafrika Vabariik"@et, + "Etelä-Afrikan tasavalta"@fi, + "République d’Afrique du Sud"@fr, + "Poblacht na hAfraice Theas"@ga, + "Dél-afrikai Köztársaság"@hu, + "Lýðveldið Suður-Afríka"@is, + "Repubblica del Sud Africa"@it, + "Republik Südafrika"@lb, + "Pietų Afrikos Respublika"@lt, + "Dienvidāfrikas Republika"@lv, + "Ir-Repubblika tal-Afrika t’Isfel"@mt, + "Republiek Zuid-Afrika"@nl, + "Republikken Sør-Afrika"@no, + "Sewula Afrika"@nr, + "Afrika-Borwa"@nso, + "República da África do Sul"@pt, + "Republica Africa de Sud"@ro, + "Южно-Африканская Республика"@ru, + "Juhoafrická republika"@sk, + "Republika Južna Afrika"@sl, + "Ningizimu Afrika"@ss, + "Afrika-Borwa"@st, + "Republiken Sydafrika"@sv, + "Aforika Borwa"@tn, + "Güney Afrika Cumhuriyeti"@tr, + "Afrika Dzonga"@ts, + "Південно-Африканська Республіка"@uk, + "Afurika Tshipembe"@ve, + "Mzantsi Afrika"@xh, + "南非共和国"@zh, + "Ningizimu Afrika"@zu ; + skos:hiddenLabel "Νότιας Αφρικής"@el, + "République d'Afrique du Sud"@fr, + "sud africaine"@fr, + "an Afraic Theas"@ga, + "duine ón Afraic Theas"@ga, + "Južna Afrika"@hr, + "Republika Južna Afrika"@hr, + "Pietų Afrikos"@lt, + "Dienvidāfrikas"@lv, + "ir-Repubblika tal-Afrika t’Isfel"@mt, + "l-Afrika t’Isfel"@mt, + "Repulbiek Zuid-Afrika"@nl, + "południowoafrykańskie"@pl ; + skos:inScheme atold:country, + , + , + ; + skos:notation "205"^^euvoc:EP, + "ZA"^^euvoc:FD_010, + "ZA"^^euvoc:FD_140, + ".za"^^euvoc:IANA_DOMAIN, + "ZA"^^euvoc:ISG_COU, + "ZA"^^euvoc:ISO_3166_1_ALPHA_2, + "ZAF"^^euvoc:ISO_3166_1_ALPHA_3, + "710"^^euvoc:ISO_3166_1_NUM, + "ZAF"^^euvoc:NAC, + "27"^^euvoc:PHONE_PREFIX, + "ZA"^^euvoc:TED, + "ZA"^^euvoc:TED_SCHEMA, + "ZA"^^euvoc:TIR, + "Southern Africa"^^euvoc:UNSD_GEOSCHEME, + "710"^^euvoc:UNSD_M49 ; + skos:prefLabel "جنوب أفريقيا"@ar, + "Южна Африка"@bg, + "Sud-àfrica"@ca, + "Jižní Afrika"@cs, + "Sydafrika"@da, + "Südafrika"@de, + "Νότια Αφρική"@el, + "South Africa"@en, + "Sudáfrica"@es, + "Lõuna-Aafrika"@et, + "Etelä-Afrikka"@fi, + "Afrique du Sud"@fr, + "An Afraic Theas"@ga, + "Južnoafrička Republika"@hr, + "Dél-Afrika"@hu, + "Suður-Afríka"@is, + "Sud Africa"@it, + "南アフリカ共和国"@ja, + "Südafrika"@lb, + "Pietų Afrika"@lt, + "Dienvidāfrika"@lv, + "L-Afrika t’Isfel"@mt, + "Zuid-Afrika"@nl, + "Sør-Afrika"@no, + "Republika Południowej Afryki"@pl, + "África do Sul"@pt, + "Africa de Sud"@ro, + "Южная Африка"@ru, + "Južná Afrika"@sk, + "Južna Afrika"@sl, + "Sydafrika"@sv, + "Güney Afrika"@tr, + "Південна Африка"@uk, + "南非"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ZMB" ; + at:deprecated "false" ; + at:op-code "ZMB" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "Z" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "ZM" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "Z" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "ZM" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1964-10-24" ; + atold:op-code "ZMB" ; + dc:identifier "ZMB" ; + skos:altLabel "جمهورية زامبيا"@ar, + "Република Замбия"@bg, + "República de Zàmbia"@ca, + "Zambijská republika"@cs, + "Republikken Zambia"@da, + "Republik Sambia"@de, + "Δημοκρατία της Ζάμπιας"@el, + "Republic of Zambia"@en, + "República de Zambia"@es, + "Sambia Vabariik"@et, + "Sambian tasavalta"@fi, + "République de Zambie"@fr, + "Poblacht na Saimbia"@ga, + "Republika Zambija"@hr, + "Zambiai Köztársaság"@hu, + "Lýðveldið Zambia"@is, + "Repubblica dello Zambia"@it, + "ザンビア共和国"@ja, + "Republik Sambia"@lb, + "Zambijos Respublika"@lt, + "Zambijas Republika"@lv, + "Ir-Repubblika taż-Żambja"@mt, + "Republiek Zambia"@nl, + "Republikken Zambia"@no, + "Republika Zambii"@pl, + "República da Zâmbia"@pt, + "Republica Zambia"@ro, + "Республика Замбия"@ru, + "Zambijská republika"@sk, + "Republika Zambija"@sl, + "Republiken Zambia"@sv, + "Zambiya Cumhuriyeti"@tr, + "Республіка Замбія"@uk, + "赞比亚共和国"@zh ; + skos:hiddenLabel "Ζάμπιας"@el, + "an tSaimbia"@ga, + "Zambija"@hr, + "Zambijos"@lt, + "Zambijas"@lv, + "ir-Repubblika taż-Żambja"@mt, + "iż-Żambja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "206"^^euvoc:EP, + "Z"^^euvoc:FD_010, + "Z"^^euvoc:FD_400, + ".zm"^^euvoc:IANA_DOMAIN, + "ZM"^^euvoc:ISG_COU, + "ZM"^^euvoc:ISO_3166_1_ALPHA_2, + "ZMB"^^euvoc:ISO_3166_1_ALPHA_3, + "894"^^euvoc:ISO_3166_1_NUM, + "ZMB"^^euvoc:NAC, + "260"^^euvoc:PHONE_PREFIX, + "ZM"^^euvoc:TED, + "ZM"^^euvoc:TED_SCHEMA, + "RNR"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "894"^^euvoc:UNSD_M49 ; + skos:prefLabel "زامبيا"@ar, + "Замбия"@bg, + "Zàmbia"@ca, + "Zambie"@cs, + "Zambia"@da, + "Sambia"@de, + "Ζάμπια"@el, + "Zambia"@en, + "Zambia"@es, + "Sambia"@et, + "Sambia"@fi, + "Zambie"@fr, + "An tSaimbia"@ga, + "Zambia"@hr, + "Zambia"@hu, + "Zambia"@is, + "Zambia"@it, + "ザンビア"@ja, + "Sambia"@lb, + "Zambija"@lt, + "Zambija"@lv, + "Iż-Żambja"@mt, + "Zambia"@nl, + "Zambia"@no, + "Zambia"@pl, + "Zâmbia"@pt, + "Zambia"@ro, + "Замбия"@ru, + "Zambia"@sk, + "Zambija"@sl, + "Zambia"@sv, + "Zambiya"@tr, + "Замбії"@uk, + "赞比亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ZWE" ; + at:deprecated "false" ; + at:op-code "ZWE" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "ZW" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "RSR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "RSR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "ZW" ; + dc:source "TED" ] ; + at:start.use "1980-04-18" ; + atold:op-code "ZWE" ; + dc:identifier "ZWE" ; + skos:altLabel "جمهورية زيمبابوي"@ar, + "Република Зимбабве"@bg, + "República de Zimbàbue"@ca, + "Republika Zimbabwe"@cs, + "Republikken Zimbabwe"@da, + "Republik Simbabwe"@de, + "Δημοκρατία της Ζιμπάμπουε"@el, + "Republic of Zimbabwe"@en, + "República de Zimbabue"@es, + "Zimbabwe Vabariik"@et, + "Zimbabwen tasavalta"@fi, + "République du Zimbabwe"@fr, + "Poblacht na Siombáibe"@ga, + "Republika Zimbabve"@hr, + "Zimbabwei Köztársaság"@hu, + "Lýðveldið Zimbabwe"@is, + "Repubblica dello Zimbabwe"@it, + "ジンバブエ共和国"@ja, + "Republik Simbabwe"@lb, + "Zimbabvės Respublika"@lt, + "Zimbabves Republika"@lv, + "Ir-Repubblika taż-Żimbabwe"@mt, + "Republiek Zimbabwe"@nl, + "Republikken Zimbabwe"@no, + "Republika Zimbabwe"@pl, + "República do Zimbabué"@pt, + "Republica Zimbabwe"@ro, + "Республика Зимбабве"@ru, + "Zimbabwianska republika"@sk, + "Republika Zimbabve"@sl, + "Republiken Zimbabwe"@sv, + "Zimbabve Cumhuriyeti"@tr, + "Республіка Зімбабве"@uk, + "津巴布韦共和国"@zh ; + skos:hiddenLabel "an tSiombáib"@ga, + "Zimbabvės"@lt, + "Zimbabves"@lv, + "ir-Repubblika taż-Żimbabwe"@mt, + "iż-Żimbabwe"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:notation "208"^^euvoc:EP, + "RSR"^^euvoc:FD_010, + "RSR"^^euvoc:FD_400, + ".zw"^^euvoc:IANA_DOMAIN, + "ZW"^^euvoc:ISG_COU, + "ZW"^^euvoc:ISO_3166_1_ALPHA_2, + "ZWE"^^euvoc:ISO_3166_1_ALPHA_3, + "716"^^euvoc:ISO_3166_1_NUM, + "ZWE"^^euvoc:NAC, + "263"^^euvoc:PHONE_PREFIX, + "ZW"^^euvoc:TED, + "ZW"^^euvoc:TED_SCHEMA, + "ZW"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "716"^^euvoc:UNSD_M49 ; + skos:prefLabel "زيمبابوي"@ar, + "Зимбабве"@bg, + "Zimbàbue"@ca, + "Zimbabwe"@cs, + "Zimbabwe"@da, + "Simbabwe"@de, + "Ζιμπάμπουε"@el, + "Zimbabwe"@en, + "Zimbabue"@es, + "Zimbabwe"@et, + "Zimbabwe"@fi, + "Zimbabwe"@fr, + "An tSiombáib"@ga, + "Zimbabve"@hr, + "Zimbabwe"@hu, + "Zimbabwe"@is, + "Zimbabwe"@it, + "ジンバブエ"@ja, + "Simbabwe"@lb, + "Zimbabvė"@lt, + "Zimbabve"@lv, + "Iż-Żimbabwe"@mt, + "Zimbabwe"@nl, + "Zimbabwe"@no, + "Zimbabwe"@pl, + "Zimbabué"@pt, + "Zimbabwe"@ro, + "Зимбабве"@ru, + "Zimbabwe"@sk, + "Zimbabve"@sl, + "Zimbabwe"@sv, + "Zimbabve"@tr, + "Зімбабве"@uk, + "津巴布韦"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "ATF" ; + at:deprecated "false" ; + at:op-code "ATF" ; + at:start.use "1955-08-05" ; + atold:op-code "ATF" ; + dc:identifier "ATF" ; + skos:altLabel "Французские Южные территории"@ru ; + skos:broader ; + skos:hiddenLabel "De franske besiddelser i det sydlige Indiske Ocean"@da, + "der Französischen Süd- und Antarktisgebiete"@de, + "Γαλλικά Νότια και Ανταρκτικά Εδάφη"@el, + "Γαλλικών Νοτίων και Ανταρκτικών Εδαφών"@el, + "of the French Southern and Antarctic Lands"@en, + "Territorios Australes Franceses"@es, + "de los Territorios Australes Franceses"@es, + "ranskalainen"@fi, + "Terres australes françaises"@fr, + "française"@fr, + "duine ó Chríocha an Deiscirt agus an Antartaigh de chuid na Fraince"@ga, + "Francuske Južne i Antarktičke Zemlje"@hr, + "Francuskih Južnih i Antarktičkih Zemalja"@hr, + "francia déli és antarktiszi területi"@hu, + "delle Terre australi e antartiche francesi"@it, + "Prancūzijos Pietų ir Antarkties Sričių"@lt, + "Francijas Dienvidjūru un Antarktikas Zemju"@lv, + "it-Territorji Franċiżi tan-Nofsinhar u tal-Antartika"@mt, + "mit-Territorji Franċiżi tan-Nofsinhar u tal-Antartika"@mt, + "van de Franse Zuidelijke en Zuidpoolgebieden"@nl, + "Francuskich Terytoriów Południowych i Antarktycznych"@pl, + "das Terras Austrais e Antárticas Francesas"@pt, + "din Teritoriile Australe și Antarctice Franceze"@ro, + "Francúzske južné a antarktické územie"@sk, + "Francúzske južné územie"@sk, + "Francoskih južnih in antarktičnih ozemelj"@sl, + "från de franska territorierna i södra Indiska oceanen och Antarktis"@sv ; + skos:historyNote "No permanent inhabitants."@en, + "The ISO 3166-3 codes ‘FQ, ATF, 260’ are valid from 1974 to 1981, and have been divided into: Antarctica codes ‘AQ, ATA, 010’ and French Southern Territories codes ‘TF, ATF, 260’."@en, + "Aucun habitant permanent."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:narrower ; + skos:notation "173"^^euvoc:EP, + ".tf"^^euvoc:IANA_DOMAIN, + "TF"^^euvoc:ISG_COU, + "TF"^^euvoc:ISO_3166_1_ALPHA_2, + "ATF"^^euvoc:ISO_3166_1_ALPHA_3, + "260"^^euvoc:ISO_3166_1_NUM, + "FQHH"^^euvoc:ISO_3166_3, + "ATF"^^euvoc:NAC, + "TF"^^euvoc:TED, + "TF"^^euvoc:TED_SCHEMA, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "260"^^euvoc:UNSD_M49 ; + skos:prefLabel "إقليم الأراضي الفرنسية الجنوبية والقطبية الجنوبية"@ar, + "Френски южни и антарктически територии"@bg, + "Terres Australs i Antàrtiques Franceses"@ca, + "Francouzská jižní a antarktická území"@cs, + "De Franske Besiddelser i Det Sydlige Indiske Ocean og Antarktis"@da, + "Französische Süd- und Antarktisgebiete"@de, + "Γαλλικές περιοχές του νότιου ημισφαιρίου και της Ανταρκτικής"@el, + "French Southern and Antarctic Lands"@en, + "Territorios Australes y Antárticas Franceses"@es, + "Prantsuse Antarktilised ja Lõunaalad"@et, + "Ranskan eteläiset ja antarktiset alueet"@fi, + "Terres australes et antarctiques françaises"@fr, + "Críocha an Deiscirt agus an Antartaigh de chuid na Fraince"@ga, + "Francuska Južna i Antarktička Područja"@hr, + "Francia Déli és Antarktiszi Területek"@hu, + "Frönsku suðlægu landsvæðin"@is, + "Terre australi e antartiche francesi"@it, + "フランス領南方・南極地域"@ja, + "Franséisch Süd- an Antarktisgebidder"@lb, + "Prancūzijos Pietų ir Antarkties Sritys"@lt, + "Francijas Dienvidjūru un Antarktikas Zemes"@lv, + "It-Territorji Franċiżi tan-Nofsinhar u tal-Antartika"@mt, + "Franse Zuidelijke en Zuidpoolgebieden"@nl, + "Fransk sørlig og antarktisk territorium"@no, + "Francuskie Terytoria Południowe i Antarktyczne"@pl, + "Terras Austrais e Antárticas Francesas"@pt, + "Teritoriile Australe și Antarctice Franceze"@ro, + "Французские Южные и Антарктические территории"@ru, + "Francúzske južné a antarktické územia"@sk, + "Francoska južna in antarktična ozemlja"@sl, + "De franska territorierna i södra Indiska oceanen och Antarktis"@sv, + "Fransız Güney ve Antarktik Bölgesi"@tr, + "Французькі Південні і Антарктичні Території"@uk, + "法属南部和南极土地"@zh ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "AUT" ; + at:deprecated "false" ; + at:op-code "AUT" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "AT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "A" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AT" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "AT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "A" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "AT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "AT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "AT" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "AT" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{AUT}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:legacy-code "AT" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "A" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_040" ; + at:legacy-code "AT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "AT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "AT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "A" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-20" ; + at:protocol.order "EU-20" ; + at:protocol.ordering "EU-20" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-20" ; + atold:op-code "AUT" ; + dc:identifier "AUT" ; + skos:altLabel "جمهورية النمسا"@ar, + "Аўстрыйская Рэспубліка"@be, + "Република Австрия"@bg, + "Republika Austrija"@bs, + "República d'Àustria"@ca, + "Rakouská republika"@cs, + "Republikken Østrig"@da, + "Republik Österreich"@de, + "Δημοκρατία της Αυστρίας"@el, + "Republic of Austria"@en, + "República de Austria"@es, + "Austria Vabariik"@et, + "Austriako Errepublika"@eu, + "Itävallan tasavalta"@fi, + "Lýðveldið Eysturríki"@fo, + "République d’Autriche"@fr, + "Poblacht na hOstaire"@ga, + "República da Austria"@gl, + "Republika Austrija"@hr, + "Osztrák Köztársaság"@hu, + "Lýðveldið Austurríki"@is, + "Repubblica d’Austria"@it, + "オーストリア共和国"@ja, + "Republik Éisträich"@lb, + "Austrijos Respublika"@lt, + "Austrijas Republika"@lv, + "Република Австрија"@mk, + "Ir-Repubblika tal-Awstrija"@mt, + "Republiek Oostenrijk"@nl, + "Republikken Østerrike"@no, + "Republika Austrii"@pl, + "República da Áustria"@pt, + "Republica da l’Austria"@rm, + "Republica Austria"@ro, + "Австрийская Республика"@ru, + "Rakúska republika"@sk, + "Republika Avstrija"@sl, + "Republika e Austrisë"@sq, + "Република Аустрија"@sr, + "Republiken Österrike"@sv, + "Avusturya Cumhuriyeti"@tr, + "Республіка Австрія"@uk, + "奥地利共和国"@zh ; + skos:hiddenLabel "Австрия"@bg, + "République d'Autriche"@fr, + "an Ostair"@ga, + "Repubblica d'Austria"@it, + "Austrijos"@lt, + "Austrijas"@lv, + "ir-Repubblika tal-Awstrija"@mt, + "l-Awstrija"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "10"^^euvoc:EP, + "A"^^euvoc:FD_010, + "AT"^^euvoc:FD_040, + "A"^^euvoc:FD_050, + "AT"^^euvoc:FD_110, + "AT"^^euvoc:FD_140, + "AT"^^euvoc:FD_160, + "A"^^euvoc:FD_290, + "A"^^euvoc:FD_361, + "AT"^^euvoc:FD_375, + "AT"^^euvoc:FD_380, + "AT"^^euvoc:FD_400, + ".at"^^euvoc:IANA_DOMAIN, + "AT"^^euvoc:IBAN_COU, + "AT"^^euvoc:ISG_COU, + "AT"^^euvoc:ISO_3166_1_ALPHA_2, + "AUT"^^euvoc:ISO_3166_1_ALPHA_3, + "040"^^euvoc:ISO_3166_1_NUM, + "AT"^^euvoc:MNE, + "AUT"^^euvoc:NAC, + "43"^^euvoc:PHONE_PREFIX, + "AT"^^euvoc:PUB_LOC, + "{AUT}"^^euvoc:PUB_LOC, + "AT"^^euvoc:TED, + "AT"^^euvoc:TED_SCHEMA, + "A"^^euvoc:TIR, + "Western Europe"^^euvoc:UNSD_GEOSCHEME, + "040"^^euvoc:UNSD_M49 ; + skos:prefLabel "النمسا"@ar, + "Аўстрыя"@be, + "Aвcтpия"@bg, + "Austrija"@bs, + "Àustria"@ca, + "Rakousko"@cs, + "Østrig"@da, + "Österreich"@de, + "Αυστρία"@el, + "Austria"@en, + "Austria"@es, + "Austria"@et, + "Austria"@eu, + "Itävalta"@fi, + "Eysturríki"@fo, + "Autriche"@fr, + "An Ostair"@ga, + "Austria"@gl, + "Austrija"@hr, + "Ausztria"@hu, + "Austurríki"@is, + "Austria"@it, + "オーストリア"@ja, + "Éisträich"@lb, + "Austrija"@lt, + "Austrija"@lv, + "Австрија"@mk, + "L-Awstrija"@mt, + "Oostenrijk"@nl, + "Østerrike"@no, + "Austria"@pl, + "Áustria"@pt, + "Austria"@rm, + "Austria"@ro, + "Австрия"@ru, + "Rakúsko"@sk, + "Avstrija"@sl, + "Austria"@sq, + "Аустрија"@sr, + "Österrike"@sv, + "Avusturya"@tr, + "Австрія"@uk, + "奥地利"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "BEL" ; + at:deprecated "false" ; + at:op-code "BEL" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "B" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "BE" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "BE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "B" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "B" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "BE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "BE" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "B" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "B" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "B" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_040" ; + at:legacy-code "B" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{BEL}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "BE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "BE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "BE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BE" ; + dc:source "TED" ] ; + at:protocol-order "EU-01" ; + at:protocol.order "EU-01" ; + at:protocol.ordering "EU-01" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-01" ; + atold:op-code "BEL" ; + dc:identifier "BEL" ; + skos:altLabel "مملكة بلجيكا"@ar, + "Каралеўства Бельгія"@be, + "Кралство Белгия"@bg, + "Kraljevina Belgija"@bs, + "Regne de Bèlgica"@ca, + "Belgické království"@cs, + "Kongeriget Belgien"@da, + "Königreich Belgien"@de, + "Βασίλειο του Βελγίου"@el, + "Kingdom of Belgium"@en, + "Reino de Bélgica"@es, + "Belgia Kuningriik"@et, + "Belgikako Erresuma"@eu, + "Belgian kuningaskunta"@fi, + "Kongsríki Belgia"@fo, + "Royaume de Belgique"@fr, + "Ríocht na Beilge"@ga, + "Reino da Bélxica"@gl, + "Kraljevina Belgija"@hr, + "Belga Királyság"@hu, + "Konungsríkið Belgía"@is, + "Regno del Belgio"@it, + "ベルギー王国"@ja, + "Kinnekräich Belsch"@lb, + "Belgijos Karalystė"@lt, + "Beļģijas Karaliste"@lv, + "Кралство Белгија"@mk, + "Ir-Renju tal-Belġju"@mt, + "Koninkrijk België"@nl, + "Kongeriket Belgia"@no, + "Królestwo Belgii"@pl, + "Reino da Bélgica"@pt, + "Reginavel da la Belgia"@rm, + "Regatul Belgiei"@ro, + "Королевство Бельгия"@ru, + "Belgické kráľovstvo"@sk, + "Kraljevina Belgija"@sl, + "Mbretëria Belge"@sq, + "Краљевина Белгија"@sr, + "Konungariket Belgien"@sv, + "Belçika Krallığı"@tr, + "Королівство Бельгія"@uk, + "比利时王国"@zh ; + skos:hiddenLabel "Белгия"@bg, + "an Bheilg"@ga, + "Belgijos"@lt, + "Beļģijas"@lv, + "il-Belġju"@mt, + "ir-Renju tal-Belġju"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "16"^^euvoc:EP, + "B"^^euvoc:FD_010, + "B"^^euvoc:FD_040, + "B"^^euvoc:FD_050, + "BE"^^euvoc:FD_110, + "BE"^^euvoc:FD_140, + "BE"^^euvoc:FD_160, + "B"^^euvoc:FD_290, + "B"^^euvoc:FD_361, + "B"^^euvoc:FD_375, + "BE"^^euvoc:FD_375, + "BE"^^euvoc:FD_380, + "B"^^euvoc:FD_400, + ".be"^^euvoc:IANA_DOMAIN, + "BE"^^euvoc:IBAN_COU, + "BE"^^euvoc:ISG_COU, + "BE"^^euvoc:ISO_3166_1_ALPHA_2, + "BEL"^^euvoc:ISO_3166_1_ALPHA_3, + "056"^^euvoc:ISO_3166_1_NUM, + "BE"^^euvoc:MNE, + "BEL"^^euvoc:NAC, + "32"^^euvoc:PHONE_PREFIX, + "BE"^^euvoc:PUB_LOC, + "{BEL}"^^euvoc:PUB_LOC, + "BE"^^euvoc:TED, + "BE"^^euvoc:TED_SCHEMA, + "B"^^euvoc:TIR, + "Western Europe"^^euvoc:UNSD_GEOSCHEME, + "056"^^euvoc:UNSD_M49 ; + skos:prefLabel "بلجيكا"@ar, + "Бельгія"@be, + "Бeлгия"@bg, + "Belgija"@bs, + "Bèlgica"@ca, + "Belgie"@cs, + "Belgien"@da, + "Belgien"@de, + "Βέλγιο"@el, + "Belgium"@en, + "Bélgica"@es, + "Belgia"@et, + "Belgika"@eu, + "Belgia"@fi, + "Belgia"@fo, + "Belgique"@fr, + "An Bheilg"@ga, + "Bélxica"@gl, + "Belgija"@hr, + "Belgium"@hu, + "Belgía"@is, + "Belgio"@it, + "ベルギー"@ja, + "Belsch"@lb, + "Belgija"@lt, + "Beļģija"@lv, + "Белгија"@mk, + "Il-Belġju"@mt, + "België"@nl, + "Belgia"@no, + "Belgia"@pl, + "Bélgica"@pt, + "Belgia"@rm, + "Belgia"@ro, + "Бельгия"@ru, + "Belgicko"@sk, + "Belgija"@sl, + "Belgjika"@sq, + "Белгија"@sr, + "Belgien"@sv, + "Belçika"@tr, + "Бельгія"@uk, + "比利时"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "BGR" ; + at:deprecated "false" ; + at:op-code "BGR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{BUL}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "BG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "BG" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "BG" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "BG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "BG" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "BG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "BG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "BG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "BG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "BG" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "BGR_N" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-02" ; + at:protocol.order "EU-02" ; + at:protocol.ordering "EU-02" ; + at:start.use "1946-09-01" ; + euvoc:order "EU-02" ; + atold:op-code "BGR" ; + dc:identifier "BGR" ; + skos:altLabel "جمهورية بلغاريا"@ar, + "Рэспу́бліка Балгарыя"@be, + "Република България"@bg, + "Republika Bugarska"@bs, + "República de Bulgària"@ca, + "Bulharská republika"@cs, + "Republikken Bulgarien"@da, + "Republik Bulgarien"@de, + "Δημοκρατία της Βουλγαρίας"@el, + "Republic of Bulgaria"@en, + "República de Bulgaria"@es, + "Bulgaaria Vabariik"@et, + "Bulgariako Errepublika"@eu, + "Bulgarian tasavalta"@fi, + "Lýðveldið Bulgaria"@fo, + "République de Bulgarie"@fr, + "Poblacht na Bulgáire"@ga, + "República da Bulgaria"@gl, + "Republika Bugarska"@hr, + "Bolgár Köztársaság"@hu, + "Lýðveldið Búlgaría"@is, + "Repubblica di Bulgaria"@it, + "ブルガリア共和国"@ja, + "Republik Bulgarien"@lb, + "Bulgarijos Respublika"@lt, + "Bulgārijas Republika"@lv, + "Република Бъгария"@mk, + "Ir-Repubblika tal-Bulgarija"@mt, + "Republiek Bulgarije"@nl, + "Republikken Bulgaria"@no, + "Republika Bułgarii"@pl, + "República da Bulgária"@pt, + "Republica da la Bulgaria"@rm, + "Republica Bulgaria"@ro, + "Республика Болгария"@ru, + "Bulharská republika"@sk, + "Republika Bolgarija"@sl, + "Republika e Bullgarisë"@sq, + "Република Бугарска"@sr, + "Republiken Bulgarien"@sv, + "Bulgaristan Cumhuriyeti"@tr, + "Республіка Болгарія"@uk, + "保加利亚共和国"@zh ; + skos:changeNote "Closing event: long name change. Successor ‘Republic of Bulgaria’ COU0066."@en, + "Opening event: long name change. Predecessor ‘People's Republic of Bulgaria’ COU0006."@en, + "Satellite state of the Soviet Union 1946-1990 in the Warsaw Pact. Source: Wikipedia."@en ; + skos:hiddenLabel "an Bhulgáir"@ga, + "Bulgarijos"@lt, + "Bulgārijas"@lv, + "il-Bulgarija"@mt, + "ir-Repubblika tal-Bulgarija"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "18"^^euvoc:EP, + "BG"^^euvoc:FD_010, + "BG"^^euvoc:FD_050, + "BG"^^euvoc:FD_110, + "BG"^^euvoc:FD_140, + "BG"^^euvoc:FD_160, + "BGR_N"^^euvoc:FD_290, + "BG"^^euvoc:FD_375, + "BG"^^euvoc:FD_380, + ".bg"^^euvoc:IANA_DOMAIN, + "BG"^^euvoc:IBAN_COU, + "BG"^^euvoc:ISG_COU, + "BG"^^euvoc:ISO_3166_1_ALPHA_2, + "BGR"^^euvoc:ISO_3166_1_ALPHA_3, + "100"^^euvoc:ISO_3166_1_NUM, + "BG"^^euvoc:MNE, + "BGR"^^euvoc:NAC, + "359"^^euvoc:PHONE_PREFIX, + "{BUL}"^^euvoc:PUB_LOC, + "BG"^^euvoc:TED, + "BG"^^euvoc:TED_SCHEMA, + "BG"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "100"^^euvoc:UNSD_M49 ; + skos:prefLabel "بلغاريا"@ar, + "Балгарыя"@be, + "България"@bg, + "Bugarska"@bs, + "Bulgària"@ca, + "Bulharsko"@cs, + "Bulgarien"@da, + "Bulgarien"@de, + "Βουλγαρία"@el, + "Bulgaria"@en, + "Bulgaria"@es, + "Bulgaaria"@et, + "Bulgaria"@eu, + "Bulgaria"@fi, + "Bulgaria"@fo, + "Bulgarie"@fr, + "An Bhulgáir"@ga, + "Bulgaria"@gl, + "Bugarska"@hr, + "Bulgária"@hu, + "Búlgaría"@is, + "Bulgaria"@it, + "ブルガリア"@ja, + "Bulgarien"@lb, + "Bulgarija"@lt, + "Bulgārija"@lv, + "Бъгария"@mk, + "Il-Bulgarija"@mt, + "Bulgarije"@nl, + "Bulgaria"@no, + "Bułgaria"@pl, + "Bulgária"@pt, + "Bulgaria"@rm, + "Bulgaria"@ro, + "Болгария"@ru, + "Bulharsko"@sk, + "Bolgarija"@sl, + "Bullgaria"@sq, + "Бугарска"@sr, + "Bulgarien"@sv, + "Bulgaristan"@tr, + "Болгарія"@uk, + "保加利亚"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "CZE" ; + at:deprecated "false" ; + at:op-code "CZE" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "CZE_N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CZ" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "CZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CZ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "CZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "CZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "CZ" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "CZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "CZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "CZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "CZ" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{CZE}" ; + dc:source "PUB" ] ; + at:protocol-order "EU-03" ; + at:protocol.order "EU-03" ; + at:protocol.ordering "EU-03" ; + at:start.use "1993-01-01" ; + euvoc:order "EU-03" ; + atold:op-code "CZE" ; + dc:identifier "CZE" ; + skos:altLabel "جمهورية التشيك"@ar, + "Чэшская рэспубліка"@be, + "Чешка република"@bg, + "Češka republika"@bs, + "República Txeca"@ca, + "Česká republika"@cs, + "Den Tjekkiske Republik"@da, + "Tschechische Republik"@de, + "Τσεχική Δημοκρατία"@el, + "Czech Republic"@en, + "República Checa"@es, + "Tšehhi Vabariik"@et, + "Txekiar Errepublika"@eu, + "Tšekin tasavalta"@fi, + "Lýðveldið Kekkia"@fo, + "République tchèque"@fr, + "Poblacht na Seice"@ga, + "República Checa"@gl, + "Češka Republika"@hr, + "Cseh Köztársaság"@hu, + "Tékkneska lýðveldið"@is, + "Repubblica ceca"@it, + "チェコ共和国"@ja, + "Tschechesch Republik"@lb, + "Čekijos Respublika"@lt, + "Čehijas Republika"@lv, + "Чешка Република"@mk, + "Ir-Repubblika Ċeka"@mt, + "Tsjechische Republiek"@nl, + "Den tsjekkiske republikk"@no, + "Republika Czeska"@pl, + "República Checa"@pt, + "Republica da la Tschechia"@rm, + "Republica Cehă"@ro, + "Чешская Республика"@ru, + "Česká republika"@sk, + "Češka republika"@sl, + "Republika Çeke"@sq, + "Чешка Република"@sr, + "Republiken Tjeckien"@sv, + "Çek Cumhuriyeti"@tr, + "Чеська Республіка"@uk, + "捷克共和国"@zh ; + skos:changeNote "Change of the short name to ‘Czechia’: Ares(2018)4992941"@en, + "Opening event: Splitting of Czechoslovakia into Czech Republic and Slovakia. Long name change. Predecessor ‘Czech and Slovak Federative Republic’ COU0063."@en ; + skos:hiddenLabel "an tSeicia"@ga, + "Čekijos"@lt, + "Čehijas"@lv, + "ir-Repubblika Ċeka"@mt, + "iċ-Ċekja"@mt, + "češko"@sl ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "217"^^euvoc:EP, + "CZ"^^euvoc:FD_010, + "CZ"^^euvoc:FD_050, + "CZ"^^euvoc:FD_110, + "CZ"^^euvoc:FD_140, + "CZ"^^euvoc:FD_160, + "CZE_N"^^euvoc:FD_290, + "CZ"^^euvoc:FD_361, + "CZ"^^euvoc:FD_375, + "CZ"^^euvoc:FD_380, + ".cz"^^euvoc:IANA_DOMAIN, + "CZ"^^euvoc:IBAN_COU, + "CZ"^^euvoc:ISG_COU, + "CZ"^^euvoc:ISO_3166_1_ALPHA_2, + "CZE"^^euvoc:ISO_3166_1_ALPHA_3, + "203"^^euvoc:ISO_3166_1_NUM, + "CZ"^^euvoc:MNE, + "CZE"^^euvoc:NAC, + "420"^^euvoc:PHONE_PREFIX, + "CZ"^^euvoc:PUB_LOC, + "{CZE}"^^euvoc:PUB_LOC, + "CZ"^^euvoc:TED, + "CZ"^^euvoc:TED_SCHEMA, + "CZ"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "203"^^euvoc:UNSD_M49 ; + skos:prefLabel "التشيك"@ar, + "Чэхія"@be, + "Чехия"@bg, + "Češka"@bs, + "Txèquia"@ca, + "Česko"@cs, + "Tjekkiet"@da, + "Tschechien"@de, + "Τσεχία"@el, + "Czechia"@en, + "Chequia"@es, + "Tšehhi"@et, + "Txekia"@eu, + "Tšekki"@fi, + "Kekkia"@fo, + "Tchéquie"@fr, + "An tSeicia"@ga, + "Chequia"@gl, + "Češka"@hr, + "Csehország"@hu, + "Tékkland"@is, + "Cechia"@it, + "チェコ"@ja, + "Tschechien"@lb, + "Čekija"@lt, + "Čehija"@lv, + "Чешка"@mk, + "Iċ-Ċekja"@mt, + "Tsjechië"@nl, + "Tsjekkia"@no, + "Czechy"@pl, + "Chéquia"@pt, + "Tschechia"@rm, + "Cehia"@ro, + "Чехия"@ru, + "Česko"@sk, + "Češka"@sl, + "Çekia"@sq, + "Чешка"@sr, + "Tjeckien"@sv, + "Çekya"@tr, + "Чехія"@uk, + "捷克"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "ESH" ; + at:deprecated "false" ; + at:op-code "ESH" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "EH" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "EH" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "ESH" ; + dc:identifier "ESH" ; + skos:definition "territory disputed between Morocco and the Polisario Front; in 1976, the latter proclaimed the Sahrawi Arab Democratic Republic (SADR), but this is not officially recognised by the European Union; the United Nations (UN) is currently supervising negotiations"@en ; + skos:hiddenLabel "Δυτικής Σαχάρας"@el, + "an Sahára Thiar"@ga, + "duine ón Sahára Thiar"@ga, + "zapadnosaharsko"@hr, + "Saharyjska Arabska Republika Demokratyczna"@pl, + "västsaharisk"@sv ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "52"^^euvoc:EP, + ".eh"^^euvoc:IANA_DOMAIN, + "EH"^^euvoc:ISG_COU, + "EH"^^euvoc:ISO_3166_1_ALPHA_2, + "ESH"^^euvoc:ISO_3166_1_ALPHA_3, + "732"^^euvoc:ISO_3166_1_NUM, + "ESH"^^euvoc:NAC, + "EH"^^euvoc:TED, + "EH"^^euvoc:TED_SCHEMA, + "Northern Africa"^^euvoc:UNSD_GEOSCHEME, + "732"^^euvoc:UNSD_M49 ; + skos:prefLabel "الصحراء الغربية"@ar, + "Западна Сахара"@bg, + "Sàhara Occidental"@ca, + "Západní Sahara"@cs, + "Vestsahara"@da, + "Westsahara"@de, + "Δυτική Σαχάρα"@el, + "Western Sahara"@en, + "Sáhara Occidental"@es, + "Lääne-Sahara"@et, + "Länsi-Sahara"@fi, + "Sahara occidental"@fr, + "An Sahára Thiar"@ga, + "Zapadna Sahara"@hr, + "Nyugat-Szahara"@hu, + "Vestur-Sahara"@is, + "Sahara occidentale"@it, + "西サハラ"@ja, + "Westsahara"@lb, + "Vakarų Sachara"@lt, + "Rietumsahāra"@lv, + "Is-Saħara tal-Punent"@mt, + "Westelijke Sahara"@nl, + "Vest-Sahara"@no, + "Sahara Zachodnia"@pl, + "Sara Ocidental"@pt, + "Sahara Occidentală"@ro, + "Западная Сахара"@ru, + "Západná Sahara"@sk, + "Zahodna Sahara"@sl, + "Västsahara"@sv, + "Batı Sahra"@tr, + "Західна Сахара"@uk, + "西撒哈拉"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "EST" ; + at:deprecated "false" ; + at:op-code "EST" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "EE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "EST_N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{EST}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:legacy-code "EE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "EE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "EW" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "EE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "EE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "EE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "EE" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "EE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "EE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "EW" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-06" ; + at:protocol.order "EU-06" ; + at:protocol.ordering "EU-06" ; + at:start.use "1991-08-20" ; + euvoc:order "EU-06" ; + atold:op-code "EST" ; + dc:identifier "EST" ; + skos:altLabel "جمهورية استونيا"@ar, + "Рэспу́бліка Эстонія"@be, + "Република Естония"@bg, + "Republika Estonija"@bs, + "República d'Estònia"@ca, + "Estonská republika"@cs, + "Republikken Estland"@da, + "Republik Estland"@de, + "Δημοκρατία της Εσθονίας"@el, + "Republic of Estonia"@en, + "República de Estonia"@es, + "Eesti Vabariik"@et, + "Estoniako Errepublika"@eu, + "Viron tasavalta"@fi, + "Lýðveldið Estland"@fo, + "République d’Estonie"@fr, + "Poblacht na hEastóine"@ga, + "República de Estonia"@gl, + "Republika Estonija"@hr, + "Észt Köztársaság"@hu, + "Lýðveldið Eistland"@is, + "Repubblica di Estonia"@it, + "エストニア共和国"@ja, + "Republik Estland"@lb, + "Estijos Respublika"@lt, + "Igaunijas Republika"@lv, + "Република Естонија"@mk, + "Ir-Repubblika tal-Estonja"@mt, + "Republiek Estland"@nl, + "Republikken Estland"@no, + "Republika Estońska"@pl, + "República da Estónia"@pt, + "Republica da l’Estonia"@rm, + "Republica Estonia"@ro, + "Эстонская Республика"@ru, + "Estónska republika"@sk, + "Republika Estonija"@sl, + "Republika Estoneze"@sq, + "Република Естонија"@sr, + "Republiken Estland"@sv, + "Estonya Cumhuriyeti"@tr, + "Республіка Естонія"@uk, + "爱沙尼亚共和国"@zh ; + skos:hiddenLabel "Естония"@bg, + "an Eastóin"@ga, + "Estijos"@lt, + "Igaunijas"@lv, + "ir-Repubblika tal-Estonja"@mt, + "l-Estonja"@mt, + "estonă"@ro, + "estländsk, estnisk"@sv ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "51"^^euvoc:EP, + "EW"^^euvoc:FD_010, + "EW"^^euvoc:FD_050, + "EE"^^euvoc:FD_110, + "EE"^^euvoc:FD_140, + "EE"^^euvoc:FD_160, + "EE"^^euvoc:FD_290, + "EST_N"^^euvoc:FD_290, + "EE"^^euvoc:FD_375, + "EE"^^euvoc:FD_380, + ".ee"^^euvoc:IANA_DOMAIN, + "EE"^^euvoc:IBAN_COU, + "EE"^^euvoc:ISG_COU, + "EE"^^euvoc:ISO_3166_1_ALPHA_2, + "EST"^^euvoc:ISO_3166_1_ALPHA_3, + "233"^^euvoc:ISO_3166_1_NUM, + "EE"^^euvoc:MNE, + "EST"^^euvoc:NAC, + "372"^^euvoc:PHONE_PREFIX, + "{EST}"^^euvoc:PUB_LOC, + "EE"^^euvoc:TED, + "EE"^^euvoc:TED_SCHEMA, + "EST"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "233"^^euvoc:UNSD_M49 ; + skos:prefLabel "استونيا"@ar, + "Эстонія"@be, + "Ecтoния"@bg, + "Estonija"@bs, + "Estònia"@ca, + "Estonsko"@cs, + "Estland"@da, + "Estland"@de, + "Εσθονία"@el, + "Estonia"@en, + "Estonia"@es, + "Eesti"@et, + "Estonia"@eu, + "Viro"@fi, + "Estland"@fo, + "Estonie"@fr, + "An Eastóin"@ga, + "Estonia"@gl, + "Estonija"@hr, + "Észtország"@hu, + "Eistland"@is, + "Estonia"@it, + "エストニア"@ja, + "Estland"@lb, + "Estija"@lt, + "Igaunija"@lv, + "Естонија"@mk, + "L-Estonja"@mt, + "Estland"@nl, + "Estland"@no, + "Estonia"@pl, + "Estónia"@pt, + "Estonia"@rm, + "Estonia"@ro, + "Эстония"@ru, + "Estónsko"@sk, + "Estonija"@sl, + "Estonia"@sq, + "Естонија"@sr, + "Estland"@sv, + "Estonya"@tr, + "Естонія"@uk, + "爱沙尼亚"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "HRV" ; + at:deprecated "false" ; + at:op-code "HRV" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "HR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CRO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "HRV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "HR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "HR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "HR" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "HR" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-11" ; + at:protocol.order "EU-11" ; + at:protocol.ordering "EU-11" ; + at:start.use "1991-10-08" ; + euvoc:order "EU-11" ; + atold:op-code "HRV" ; + dc:identifier "HRV" ; + skos:altLabel "حمهورية كرواتيا"@ar, + "Рэспу́бліка Харватыя"@be, + "Република Хърватия"@bg, + "Republika Hrvatska"@bs, + "República de Croàcia"@ca, + "Chorvatská republika"@cs, + "Republikken Kroatien"@da, + "Republik Kroatien"@de, + "Δημοκρατία της Κροατίας"@el, + "Republic of Croatia"@en, + "República de Croacia"@es, + "Horvaatia Vabariik"@et, + "Kroaziako Errepublika"@eu, + "Kroatian tasavalta"@fi, + "Lýðveldið Kroatia"@fo, + "République de Croatie"@fr, + "Poblacht na Cróite"@ga, + "República de Croacia"@gl, + "Republika Hrvatska"@hr, + "Horvát Köztársaság"@hu, + "Lýðveldið Króatía"@is, + "Repubblica di Croazia"@it, + "クロアチア共和国"@ja, + "Republik Kroatien"@lb, + "Kroatijos Respublika"@lt, + "Horvātijas Republika"@lv, + "Република Хрватска"@mk, + "Ir-Repubblika tal-Kroazja"@mt, + "Republiek Kroatië"@nl, + "Republikken Kroatia"@no, + "Republika Chorwacka"@pl, + "República da Croácia"@pt, + "Republica da la Croazia"@rm, + "Republica Croaţia"@ro, + "Республика Хорватия"@ru, + "Chorvátska republika"@sk, + "Republika Hrvaška"@sl, + "Republika e Kroacisë"@sq, + "Република Хрватска"@sr, + "Republiken Kroatien"@sv, + "Hırvatistan Cumhuriyeti"@tr, + "Республіка Хорватія"@uk, + "克罗地亚共和国"@zh ; + skos:changeNote "Opening event: Splitting of the \"Socialist Federal Republic of Yugoslavia\" COU0060 into Republic of Slovenia COU0051, Republic of Croatia COU0026, Federal Republic of Yugoslavia COU0061, Bosnia and Herzegovina COU0004, Former Yugoslav Republic of Macedonia COU0040."@en ; + skos:hiddenLabel "Κροατίας"@el, + "an Chróit"@ga, + "Kroatijos"@lt, + "Horvātijas"@lv, + "il-Kroazja"@mt, + "ir-Repubblika tal-Kroazja"@mt, + "Republika Chorwacji"@pl, + "Croația"@ro, + "Republica Croația"@ro ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "78"^^euvoc:EP, + "CRO"^^euvoc:FD_010, + "HR"^^euvoc:FD_050, + "HRV"^^euvoc:FD_110, + "HR"^^euvoc:FD_160, + ".hr"^^euvoc:IANA_DOMAIN, + "HR"^^euvoc:IBAN_COU, + "HR"^^euvoc:ISG_COU, + "HR"^^euvoc:ISO_3166_1_ALPHA_2, + "HRV"^^euvoc:ISO_3166_1_ALPHA_3, + "191"^^euvoc:ISO_3166_1_NUM, + "HR"^^euvoc:MNE, + "HRV"^^euvoc:NAC, + "385"^^euvoc:PHONE_PREFIX, + "HR"^^euvoc:TED, + "HR"^^euvoc:TED_SCHEMA, + "HR"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "191"^^euvoc:UNSD_M49 ; + skos:prefLabel "كرواتيا"@ar, + "Харватыя"@be, + "Хърватия"@bg, + "Hrvatska"@bs, + "Croàcia"@ca, + "Chorvatsko"@cs, + "Kroatien"@da, + "Kroatien"@de, + "Κροατία"@el, + "Croatia"@en, + "Croacia"@es, + "Horvaatia"@et, + "Kroazia"@eu, + "Kroatia"@fi, + "Kroatia"@fo, + "Croatie"@fr, + "An Chróit"@ga, + "Croacia"@gl, + "Hrvatska"@hr, + "Horvátország"@hu, + "Króatía"@is, + "Croazia"@it, + "クロアチア"@ja, + "Kroatien"@lb, + "Kroatija"@lt, + "Horvātija"@lv, + "Хрватска"@mk, + "Il-Kroazja"@mt, + "Kroatië"@nl, + "Kroatia"@no, + "Chorwacja"@pl, + "Croácia"@pt, + "Croazia"@rm, + "Croaţia"@ro, + "Хорватия"@ru, + "Chorvátsko"@sk, + "Hrvaška"@sl, + "Kroacia"@sq, + "Хрватска"@sr, + "Kroatien"@sv, + "Hırvatistan"@tr, + "Хорватія"@uk, + "克罗地亚"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "HUN" ; + at:deprecated "false" ; + at:op-code "HUN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "HU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "HU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "HU" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "HU" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "HU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "H" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "HUN_N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "HU" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "HU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "HU" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "HU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "H" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "HU" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-17" ; + at:protocol.order "EU-17" ; + at:protocol.ordering "EU-17" ; + at:start.use "1949-08-18" ; + euvoc:order "EU-17" ; + atold:op-code "HUN" ; + dc:identifier "HUN" ; + skos:changeNote "Closing event: long name change. Successor \"Hungary\" COU0514"@en, + "Closing event: long name change. Successor ‘Republic of Hungary’ COU0027."@en, + "Opening event: long name change. Predecessor \"People's Republic of Hungary\" COU0069"@en, + "Opening event: long name change. Predecessor ‘Republic of Hungary’ COU0027."@en, + "Satellite state of the Soviet Union 1949-1990 in the Warsaw Pact. Source: Wikipedia."@en ; + skos:hiddenLabel "Унгария"@bg, + "ουγγρική"@el, + "an Ungáir"@ga, + "Vengrijos"@lt, + "Ungārijas"@lv, + "l-Ungerija"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "80"^^euvoc:EP, + "H"^^euvoc:FD_010, + "H"^^euvoc:FD_050, + "HU"^^euvoc:FD_110, + "HU"^^euvoc:FD_140, + "HU"^^euvoc:FD_160, + "HUN_N"^^euvoc:FD_290, + "HU"^^euvoc:FD_361, + "HU"^^euvoc:FD_375, + "HU"^^euvoc:FD_380, + ".hu"^^euvoc:IANA_DOMAIN, + "HU"^^euvoc:IBAN_COU, + "HU"^^euvoc:ISG_COU, + "HU"^^euvoc:ISO_3166_1_ALPHA_2, + "HUN"^^euvoc:ISO_3166_1_ALPHA_3, + "348"^^euvoc:ISO_3166_1_NUM, + "HU"^^euvoc:MNE, + "HUN"^^euvoc:NAC, + "36"^^euvoc:PHONE_PREFIX, + "HU"^^euvoc:PUB_LOC, + "HU"^^euvoc:TED, + "HU"^^euvoc:TED_SCHEMA, + "H"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "348"^^euvoc:UNSD_M49 ; + skos:prefLabel "المجر"@ar, + "Венгрыя"@be, + "Унгapия"@bg, + "Mađarska"@bs, + "Hongria"@ca, + "Maďarsko"@cs, + "Ungarn"@da, + "Ungarn"@de, + "Ουγγαρία"@el, + "Hungary"@en, + "Hungría"@es, + "Ungari"@et, + "Hungaria"@eu, + "Unkari"@fi, + "Ungarn"@fo, + "Hongrie"@fr, + "An Ungáir"@ga, + "Hungría"@gl, + "Mađarska"@hr, + "Magyarország"@hu, + "Ungverjaland"@is, + "Ungheria"@it, + "ハンガリー"@ja, + "Ungarn"@lb, + "Vengrija"@lt, + "Ungārija"@lv, + "Унгарија"@mk, + "L-Ungerija"@mt, + "Hongarije"@nl, + "Ungarn"@no, + "Węgry"@pl, + "Hungria"@pt, + "Ungaria"@rm, + "Ungaria"@ro, + "Венгрия"@ru, + "Maďarsko"@sk, + "Madžarska"@sl, + "Hungaria"@sq, + "Мађарска"@sr, + "Ungern"@sv, + "Macaristan"@tr, + "Угорщина"@uk, + "匈牙利"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "IRL" ; + at:deprecated "false" ; + at:op-code "IRL" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "IR" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{IRL}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:legacy-code "IE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "IE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "IE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "IE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "IRL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "IE" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "IRL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "IE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "IRL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "IE" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-07" ; + at:protocol.order "EU-07" ; + at:protocol.ordering "EU-07" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-07" ; + atold:op-code "IRL" ; + dc:identifier "IRL" ; + skos:changeNote "Vejledning i Udformning af EU-publikationer: Irland: Benævnelsen »Republikken Irland« er ikke anerkendt af de irske myndigheder."@da, + "Interinstitutional Style Guide: Ireland: do not use ‘Republic of Ireland’ nor ‘Irish Republic’."@en, + "Libro de estilo interinstitucional: Irlanda: Aunque ciertos documentos hablen de la «República de Irlanda», esta denominación no tiene carácter oficial."@es, + "Toimielinten yhteiset tekstinlaadinnan ohjeet: Irlanti: Irlannin viranomaiset eivät hyväksy kirjoitusasua ”Irlannin tasavalta”."@fi, + "Code de rédaction interinstitutionnel: Irlande: la forme «République d’Irlande» n’est pas admise par les autorités irlandaises."@fr, + "An Treoir Stíle Idirinstitíuideach: Éire: ní cheadaíonn Údaráis na hÉireann an fhoirm “Poblacht na hÉireann”."@ga, + "Intézményközi kiadványszerkesztési útmutató: Írorszag: Az Ír Köztársaság megnevezés nem használatos."@hu, + "Institucijų leidinių rengimo vadovas: Airija: Airijos valdžios institucijos neleidžia vartoti formos „Airijos Respublika“."@lt, + "Gwida tal-Istil Interistituzzjonali: L-Irlanda: L-espressjoni “ir-Repubblika tal-Irlanda” mhijiex rikonoxxuta mill-awtoritajiet Irlandiżi bħala isem uffiċjali hija meqjusa bħala deskrizzjoni."@mt, + "Código de Redação Interinstitucional: Irlanda: As autoridades irlandesas não admitem a expressão «República da Irlanda»."@pt, + "Ghid de redactare interinstituțional: Irlanda: nu se folosesc denumirile „Republica Irlanda” sau „Republica Irlandeză”."@ro ; + skos:hiddenLabel "Ирландия"@bg, + "Iiri"@et, + "Irlannin tasavalta"@fi, + "Republika Irska"@hr, + "Airijos"@lt, + "Īrijas"@lv, + "l-Irlanda"@mt, + "Republika Irska"@sl ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "238"^^euvoc:EP, + "IRL"^^euvoc:FD_010, + "IE"^^euvoc:FD_110, + "IRL"^^euvoc:FD_110, + "IE"^^euvoc:FD_140, + "IE"^^euvoc:FD_160, + "IRL"^^euvoc:FD_290, + "IE"^^euvoc:FD_375, + ".ie"^^euvoc:IANA_DOMAIN, + "IE"^^euvoc:IBAN_COU, + "IE"^^euvoc:ISG_COU, + "IE"^^euvoc:ISO_3166_1_ALPHA_2, + "IRL"^^euvoc:ISO_3166_1_ALPHA_3, + "372"^^euvoc:ISO_3166_1_NUM, + "IR"^^euvoc:MNE, + "IRL"^^euvoc:NAC, + "353"^^euvoc:PHONE_PREFIX, + "IE"^^euvoc:PUB_LOC, + "{IRL}"^^euvoc:PUB_LOC, + "IE"^^euvoc:TED, + "IE"^^euvoc:TED_SCHEMA, + "IRL"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "372"^^euvoc:UNSD_M49 ; + skos:prefLabel "أيرلندا"@ar, + "Ірландыя"@be, + "Иpлaндия"@bg, + "Irska"@bs, + "Irlanda"@ca, + "Irsko"@cs, + "Irland"@da, + "Irland"@de, + "Ιρλανδία"@el, + "Ireland"@en, + "Irlanda"@es, + "Iirimaa"@et, + "Irlanda"@eu, + "Irlanti"@fi, + "Írland"@fo, + "Irlande"@fr, + "Éire"@ga, + "Irska"@gl, + "Irska"@hr, + "Írország"@hu, + "Írland"@is, + "Irlanda"@it, + "アイルランド"@ja, + "Irland"@lb, + "Airija"@lt, + "Īrija"@lv, + "Ирска"@mk, + "L-Irlanda"@mt, + "Ierland"@nl, + "Irland"@no, + "Irlandia"@pl, + "Irlanda"@pt, + "Irlanda"@rm, + "Irlanda"@ro, + "Ирландия"@ru, + "Írsko"@sk, + "Irska"@sl, + "Irlanda"@sq, + "Ирска"@sr, + "Irland"@sv, + "İrlanda"@tr, + "Ірландія"@uk, + "爱尔兰"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "LBY" ; + at:deprecated "false" ; + at:op-code "LBY" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "LY" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "LAR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LY" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "LAR" ; + dc:source "EurLex" ] ; + at:start.use "1951-12-24" ; + atold:op-code "LBY" ; + dc:identifier "LBY" ; + skos:altLabel "جمهورية ليبيا"@ar, + "Държавата Либия"@bg, + "Estat de Líbia"@ca, + "Libyjský stát"@cs, + "Staten Libyen"@da, + "Staat Libyen"@de, + "Κράτος της Λιβύης"@el, + "State of Libya"@en, + "Estado de Libia"@es, + "Liibüa Riik"@et, + "Libyan valtio"@fi, + "État de Libye"@fr, + "Stát na Libia"@ga, + "Država Libija"@hr, + "Líbiai Állam"@hu, + "Líbíuríki"@is, + "Stato di Libia"@it, + "リビア国"@ja, + "Staat Libyen"@lb, + "Libijos Valstybė"@lt, + "Lībijas Valsts"@lv, + "L-Istat tal-Libja"@mt, + "Staat Libië"@nl, + "Staten Libya"@no, + "Państwo Libia"@pl, + "Estado da Líbia"@pt, + "Statul Libia"@ro, + "Государство Ливия"@ru, + "Líbyjský štát"@sk, + "Država Libija"@sl, + "Staten Libyen"@sv, + "Libya Devleti"@tr, + "Держава Лівія"@uk, + "利比亚国"@zh ; + skos:changeNote "Closing event: long name change. Successor ‘Libya’ COU0512."@en, + "Opening event: long name change. Predecessor ‘Great Socialist People’s Libyan Arab Jamahiriya’ COU0275."@en ; + skos:hiddenLabel "Μεγάλη Σοσιαλιστική Λαϊκή Λιβυκή Αραβική Τζαμαχιρίγια"@el, + "Great Socialist People's Libyan Arab Jamahiriya"@en, + "Jamahiriya arabe libyenne populaire et socialiste"@fr, + "Seamaithír Mhór Shóisialach Arabach na Libia"@ga, + "an Libia"@ga, + "Socijalistička Narodna Libijska Arapska Džamahirija"@hr, + "Líbiai Arab Szocialista Népi Közösség"@hu, + "Libijos"@lt, + "Lībijas"@lv, + "Lībijas Sociālistiskā Arābu Tautas Džamahīrija"@lv, + "il-Libja"@mt, + "Velika socialistična ljudska libijska arabska džamahirija"@sl ; + skos:inScheme atold:country, + , + , + ; + skos:narrower ; + skos:notation "109"^^euvoc:EP, + "LAR"^^euvoc:FD_010, + "LAR"^^euvoc:FD_400, + ".ly"^^euvoc:IANA_DOMAIN, + "LY"^^euvoc:IBAN_COU, + "LY"^^euvoc:ISG_COU, + "LY"^^euvoc:ISO_3166_1_ALPHA_2, + "LBY"^^euvoc:ISO_3166_1_ALPHA_3, + "434"^^euvoc:ISO_3166_1_NUM, + "LBY"^^euvoc:NAC, + "218"^^euvoc:PHONE_PREFIX, + "LY"^^euvoc:TED, + "LY"^^euvoc:TED_SCHEMA, + "LAR"^^euvoc:TIR, + "Northern Africa"^^euvoc:UNSD_GEOSCHEME, + "434"^^euvoc:UNSD_M49 ; + skos:prefLabel "ليبيا"@ar, + "Либия"@bg, + "Líbia"@ca, + "Libye"@cs, + "Libyen"@da, + "Libyen"@de, + "Λιβύη"@el, + "Libya"@en, + "Libia"@es, + "Liibüa"@et, + "Libya"@fi, + "Libye"@fr, + "An Libia"@ga, + "Libija"@hr, + "Líbia"@hu, + "Líbía"@is, + "Libia"@it, + "リビア"@ja, + "Libyen"@lb, + "Libija"@lt, + "Lībija"@lv, + "Il-Libja"@mt, + "Libië"@nl, + "Libya"@no, + "Libia"@pl, + "Líbia"@pt, + "Libia"@ro, + "Ливия"@ru, + "Líbya"@sk, + "Libija"@sl, + "Libyen"@sv, + "Libya"@tr, + "Лівія"@uk, + "利比亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "LTU" ; + at:deprecated "false" ; + at:op-code "LTU" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{LTU}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "LT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LT" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "LT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LT" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "LT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "LTU_N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "LT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "LT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "LT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "LT" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "LT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "LT" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-15" ; + at:protocol.order "EU-15" ; + at:protocol.ordering "EU-15" ; + at:start.use "1991-03-11" ; + euvoc:order "EU-15" ; + atold:op-code "LTU" ; + dc:identifier "LTU" ; + skos:altLabel "جمهورية ليتوانيا"@ar, + "Літо́ўская Рэспу́бліка"@be, + "Република Литва"@bg, + "Republika Litvanija"@bs, + "República de Lituània"@ca, + "Litevská republika"@cs, + "Republikken Litauen"@da, + "Republik Litauen"@de, + "Δημοκρατία της Λιθουανίας"@el, + "Republic of Lithuania"@en, + "República de Lituania"@es, + "Leedu Vabariik"@et, + "Lituaniako Errepublika"@eu, + "Liettuan tasavalta"@fi, + "Lýðveldið Litava"@fo, + "République de Lituanie"@fr, + "Poblacht na Liotuáine"@ga, + "República da Lituania"@gl, + "Republika Litva"@hr, + "Litván Köztársaság"@hu, + "Lýðveldið Litáen"@is, + "Repubblica di Lituania"@it, + "リトアニア共和国"@ja, + "Republik Litauen"@lb, + "Lietuvos Respublika"@lt, + "Lietuvas Republika"@lv, + "Република Литванија"@mk, + "Ir-Repubblika tal-Litwanja"@mt, + "Republiek Litouwen"@nl, + "Republikken Litauen"@no, + "Republika Litewska"@pl, + "República da Lituânia"@pt, + "Republica da la Lituania"@rm, + "Republica Lituania"@ro, + "Литовская Республика"@ru, + "Litovská republika"@sk, + "Republika Litva"@sl, + "Republika e Lituanisë"@sq, + "Република Литванија"@sr, + "Republiken Litauen"@sv, + "Litvanya Cumhuriyeti"@tr, + "Литовська Республіка"@uk, + "立陶宛共和国"@zh ; + skos:hiddenLabel "Литва"@bg, + "lithuanienne"@fr, + "an Liotuáin"@ga, + "Lietuvos"@lt, + "Lietuvas"@lv, + "il-Litwanja"@mt, + "ir-Repubblika tal-Litwanja"@mt, + "Republliken Litauen"@sv ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "107"^^euvoc:EP, + "LT"^^euvoc:FD_010, + "LT"^^euvoc:FD_050, + "LT"^^euvoc:FD_110, + "LT"^^euvoc:FD_140, + "LT"^^euvoc:FD_160, + "LTU_N"^^euvoc:FD_290, + "LT"^^euvoc:FD_361, + "LT"^^euvoc:FD_375, + "LT"^^euvoc:FD_380, + ".lt"^^euvoc:IANA_DOMAIN, + "LT"^^euvoc:IBAN_COU, + "LT"^^euvoc:ISG_COU, + "LT"^^euvoc:ISO_3166_1_ALPHA_2, + "LTU"^^euvoc:ISO_3166_1_ALPHA_3, + "440"^^euvoc:ISO_3166_1_NUM, + "LT"^^euvoc:MNE, + "LTU"^^euvoc:NAC, + "370"^^euvoc:PHONE_PREFIX, + "{LTU}"^^euvoc:PUB_LOC, + "LT"^^euvoc:TED, + "LT"^^euvoc:TED_SCHEMA, + "LT"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "440"^^euvoc:UNSD_M49 ; + skos:prefLabel "ليتوانيا"@ar, + "Літва"@be, + "Литвa"@bg, + "Litvanija"@bs, + "Lituània"@ca, + "Litva"@cs, + "Litauen"@da, + "Litauen"@de, + "Λιθουανία"@el, + "Lithuania"@en, + "Lituania"@es, + "Leedu"@et, + "Lituania"@eu, + "Liettua"@fi, + "Litava"@fo, + "Lituanie"@fr, + "An Liotuáin"@ga, + "Lituania"@gl, + "Litva"@hr, + "Litvánia"@hu, + "Litáen"@is, + "Lituania"@it, + "リトアニア"@ja, + "Litauen"@lb, + "Lietuva"@lt, + "Lietuva"@lv, + "Литванија"@mk, + "Il-Litwanja"@mt, + "Litouwen"@nl, + "Litauen"@no, + "Litwa"@pl, + "Lituânia"@pt, + "Lituania"@rm, + "Lituania"@ro, + "Литва"@ru, + "Litva"@sk, + "Litva"@sl, + "Lituania"@sq, + "Литванија"@sr, + "Litauen"@sv, + "Litvanya"@tr, + "Литва"@uk, + "立陶宛"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "LUX" ; + at:deprecated "false" ; + at:op-code "LUX" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "LU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "LU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "LU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{GDL}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "L" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LU" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "LU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "L" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "LU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "L" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "LU" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "L" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "L" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "L" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LU" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "LU" ; + dc:source "PUB" ] ; + at:protocol-order "EU-16" ; + at:protocol.order "EU-16" ; + at:protocol.ordering "EU-16" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-16" ; + atold:op-code "LUX" ; + dc:identifier "LUX" ; + skos:altLabel "دوقية لوكسمبورغ الكبرى"@ar, + "Вялікае Княства Люксембург"@be, + "Велико херцогство Люксембург"@bg, + "Veliko Vojvodstvo Luksemburg"@bs, + "Gran Ducat de Luxemburg"@ca, + "Lucemburské velkovévodství"@cs, + "Storhertugdømmet Luxembourg"@da, + "Großherzogtum Luxemburg"@de, + "Μεγάλο Δουκάτο του Λουξεμβούργου"@el, + "Grand Duchy of Luxembourg"@en, + "Gran Ducado de Luxemburgo"@es, + "Luksemburgi Suurhertsogiriik"@et, + "Luxenburgoko Dukerri Handi"@eu, + "Luxemburgin suurherttuakunta"@fi, + "Grand-Duché de Luxembourg"@fr, + "Ard-Diúcacht Lucsamburg"@ga, + "Gran-Ducado do Luxemburgo"@gl, + "Veliko Vojvodstvo Luksemburg"@hr, + "Luxemburgi Nagyhercegség"@hu, + "Stórhertogadæmið Lúxemborg"@is, + "Granducato del Lussemburgo"@it, + "ルクセンブルク大公国"@ja, + "Groussherzogtum Lëtzebuerg"@lb, + "Liuksemburgo Didžioji Hercogystė"@lt, + "Luksemburgas Lielhercogiste"@lv, + "Големо Војводство Луксембург"@mk, + "Il-Gran Dukat tal-Lussemburgu"@mt, + "Groothertogdom Luxemburg"@nl, + "Storhertugdømmet Luxembourg"@no, + "Wielkie Księstwo Luksemburga"@pl, + "Grão-Ducado do Luxemburgo"@pt, + "Gran Ducado dal Luxemburg"@rm, + "Marele Ducat al Luxemburgului"@ro, + "Великое Герцогство Люксембург"@ru, + "Luxemburské veľkovojvodstvo"@sk, + "Veliko vojvodstvo Luksemburg"@sl, + "Dukatit të Madh të Luksemburgut"@sq, + "Велико Војводство Луксембург"@sr, + "Storhertigdömet Luxemburg"@sv, + "Lüksemburg Büyük Dükalığı"@tr, + "Велике Герцогство Люксембург"@uk, + "卢森堡大公国"@zh ; + skos:hiddenLabel "λουξεμβουργική"@el, + "Luksemburgi"@et, + "Granducato di Lussemburgo"@it, + "Liuksemburgo"@lt, + "Luksemburgas"@lv, + "il-Gran Dukat tal-Lussemburgu"@mt, + "il-Lussemburgu"@mt, + "luxemburgisk"@sv ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "108"^^euvoc:EP, + "L"^^euvoc:FD_010, + "L"^^euvoc:FD_050, + "LU"^^euvoc:FD_110, + "LU"^^euvoc:FD_140, + "LU"^^euvoc:FD_160, + "L"^^euvoc:FD_290, + "L"^^euvoc:FD_361, + "L"^^euvoc:FD_375, + "LU"^^euvoc:FD_375, + "LU"^^euvoc:FD_380, + "L"^^euvoc:FD_400, + ".lu"^^euvoc:IANA_DOMAIN, + "LU"^^euvoc:IBAN_COU, + "LU"^^euvoc:ISG_COU, + "LU"^^euvoc:ISO_3166_1_ALPHA_2, + "LUX"^^euvoc:ISO_3166_1_ALPHA_3, + "442"^^euvoc:ISO_3166_1_NUM, + "LU"^^euvoc:MNE, + "LUX"^^euvoc:NAC, + "352"^^euvoc:PHONE_PREFIX, + "LU"^^euvoc:PUB_LOC, + "{GDL}"^^euvoc:PUB_LOC, + "LU"^^euvoc:TED, + "LU"^^euvoc:TED_SCHEMA, + "L"^^euvoc:TIR, + "Western Europe"^^euvoc:UNSD_GEOSCHEME, + "442"^^euvoc:UNSD_M49 ; + skos:prefLabel "لوكسمبورغ"@ar, + "Люксембург"@be, + "Люксембург"@bg, + "Luksembourg"@bs, + "Luxemburg"@ca, + "Lucembursko"@cs, + "Luxembourg"@da, + "Luxemburg"@de, + "Λουξεμβούργο"@el, + "Luxembourg"@en, + "Luxemburgo"@es, + "Luksemburg"@et, + "Luxenburgo"@eu, + "Luxemburg"@fi, + "Luksemburg"@fo, + "Luxembourg"@fr, + "Lucsamburg"@ga, + "Luxemburgo"@gl, + "Luksemburg"@hr, + "Luxemburg"@hu, + "Lúxemborg"@is, + "Lussemburgo"@it, + "ルクセンブルク"@ja, + "Lëtzebuerg"@lb, + "Liuksemburgas"@lt, + "Luksemburga"@lv, + "Луксембург"@mk, + "Il-Lussemburgu"@mt, + "Luxemburg"@nl, + "Luxembourg"@no, + "Luksemburg"@pl, + "Luxemburgo"@pt, + "Luxemburg"@rm, + "Luxemburg"@ro, + "Люксембург"@ru, + "Luxembursko"@sk, + "Luksemburg"@sl, + "Luksemburgu"@sq, + "Луксембург"@sr, + "Luxemburg"@sv, + "Lüksemburg"@tr, + "Люксембург"@uk, + "卢森堡"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "LVA" ; + at:deprecated "false" ; + at:op-code "LVA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "LV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "LV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "LV" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "LV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "LV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{LVA}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:legacy-code "LV" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "LV" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "LVA_N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "LV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "LV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "LV" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "LV" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-14" ; + at:protocol.order "EU-14" ; + at:protocol.ordering "EU-14" ; + at:start.use "1991-09-06" ; + euvoc:order "EU-14" ; + atold:op-code "LVA" ; + dc:identifier "LVA" ; + skos:altLabel "جمهورية لاتفيا"@ar, + "Латвійская Рэспу́бліка"@be, + "Република Латвия"@bg, + "Republika Latvija"@bs, + "República de Letònia"@ca, + "Lotyšská republika"@cs, + "Republikken Letland"@da, + "Republik Lettland"@de, + "Δημοκρατία της Λετονίας"@el, + "Republic of Latvia"@en, + "República de Letonia"@es, + "Läti Vabariik"@et, + "Letoniako Errepublika"@eu, + "Latvian tasavalta"@fi, + "Lýðveldið Lettland"@fo, + "République de Lettonie"@fr, + "Poblacht na Laitvia"@ga, + "República de Letonia"@gl, + "Republika Latvija"@hr, + "Lett Köztársaság"@hu, + "Lýðveldið Lettland"@is, + "Repubblica di Lettonia"@it, + "ラトビア共和国"@ja, + "Republik Lettland"@lb, + "Latvijos Respublika"@lt, + "Latvijas Republika"@lv, + "Република Латвија"@mk, + "Ir-Repubblika tal-Latvja"@mt, + "Republiek Letland"@nl, + "Republikken Latvia"@no, + "Republika Łotewska"@pl, + "República da Letónia"@pt, + "Republica da la Lettonia"@rm, + "Republica Letonia"@ro, + "Латвийская Республика"@ru, + "Lotyšská republika"@sk, + "Republika Latvija"@sl, + "Republika e Letonisë"@sq, + "Република Летонија"@sr, + "Republiken Lettland"@sv, + "Letonya Cumhuriyeti"@tr, + "Латвійська Республіка"@uk, + "拉脱维亚共和国"@zh ; + skos:hiddenLabel "Латвия"@bg, + "lettonienne"@fr, + "an Laitvia"@ga, + "Latvijos"@lt, + "Latvijas"@lv, + "il-Latvja"@mt, + "ir-Repubblika tal-Latvja"@mt, + "Republliken Lettland"@sv ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "242"^^euvoc:EP, + "LV"^^euvoc:FD_010, + "LV"^^euvoc:FD_050, + "LV"^^euvoc:FD_110, + "LV"^^euvoc:FD_140, + "LV"^^euvoc:FD_160, + "LVA_N"^^euvoc:FD_290, + "LV"^^euvoc:FD_361, + "LV"^^euvoc:FD_375, + "LV"^^euvoc:FD_380, + ".lv"^^euvoc:IANA_DOMAIN, + "LV"^^euvoc:IBAN_COU, + "LV"^^euvoc:ISG_COU, + "LV"^^euvoc:ISO_3166_1_ALPHA_2, + "LVA"^^euvoc:ISO_3166_1_ALPHA_3, + "428"^^euvoc:ISO_3166_1_NUM, + "LV"^^euvoc:MNE, + "LVA"^^euvoc:NAC, + "371"^^euvoc:PHONE_PREFIX, + "{LVA}"^^euvoc:PUB_LOC, + "LV"^^euvoc:TED, + "LV"^^euvoc:TED_SCHEMA, + "LV"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "428"^^euvoc:UNSD_M49 ; + skos:prefLabel "لاتفيا"@ar, + "Ла́твія"@be, + "Лaтвия"@bg, + "Latvija"@bs, + "Letònia"@ca, + "Lotyšsko"@cs, + "Letland"@da, + "Lettland"@de, + "Λετονία"@el, + "Latvia"@en, + "Letonia"@es, + "Läti"@et, + "Letonia"@eu, + "Latvia"@fi, + "Lettland"@fo, + "Lettonie"@fr, + "An Laitvia"@ga, + "Letonia"@gl, + "Latvija"@hr, + "Lettország"@hu, + "Lettland"@is, + "Lettonia"@it, + "ラトビア"@ja, + "Lettland"@lb, + "Latvija"@lt, + "Latvija"@lv, + "Латвија"@mk, + "Il-Latvja"@mt, + "Letland"@nl, + "Latvia"@no, + "Łotwa"@pl, + "Letónia"@pt, + "Lettonia"@rm, + "Letonia"@ro, + "Латвия"@ru, + "Lotyšsko"@sk, + "Latvija"@sl, + "Letonia"@sq, + "Летонија"@sr, + "Lettland"@sv, + "Letonya"@tr, + "Латвія"@uk, + "拉脱维亚"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "MLT" ; + at:deprecated "false" ; + at:op-code "MLT" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "M" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "M" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "M" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "MT" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "MT" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "MT" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "MT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{MLT}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "MT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "MT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "MT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "MT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "MT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "MLT_N" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-18" ; + at:protocol.order "EU-18" ; + at:protocol.ordering "EU-18" ; + at:start.use "1964-09-21" ; + euvoc:order "EU-18" ; + atold:op-code "MLT" ; + dc:identifier "MLT" ; + skos:altLabel "جمهورية مالطة"@ar, + "Рэспу́бліка Мальта"@be, + "Република Малта"@bg, + "Republika Malta"@bs, + "República de Malta"@ca, + "Maltská republika"@cs, + "Republikken Malta"@da, + "Republik Malta"@de, + "Δημοκρατία της Μάλτας"@el, + "Republic of Malta"@en, + "República de Malta"@es, + "Malta Vabariik"@et, + "Maltako Errepublika"@eu, + "Maltan tasavalta"@fi, + "Lýðveldið Malta"@fo, + "République de Malte"@fr, + "Poblacht Mhálta"@ga, + "República de Malta"@gl, + "Republika Malta"@hr, + "Máltai Köztársaság"@hu, + "Lýðveldið Malta"@is, + "Repubblica di Malta"@it, + "マルタ共和国"@ja, + "Republik Malta"@lb, + "Maltos Respublika"@lt, + "Maltas Republika"@lv, + "Република Малта"@mk, + "Ir-Repubblika ta’ Malta"@mt, + "Republiek Malta"@nl, + "Republikken Malta"@no, + "Republika Malty"@pl, + "República de Malta"@pt, + "Republica dal Malta"@rm, + "Republica Malta"@ro, + "Республика Мальта"@ru, + "Maltská republika"@sk, + "Republika Malta"@sl, + "Republika e Maltës"@sq, + "Република Малта"@sr, + "Republiken Malta"@sv, + "Malta Cumhuriyeti"@tr, + "Республіка Мальта"@uk, + "马耳他共和国"@zh ; + skos:changeNote "Between 1964 and 1974, Malta was independent and had as long label ‘State of Malta’."@en, + "Closing event: Independence from British administration. Successor ‘Republic of Malta’ COU0041, whose long name changed only 1974."@en, + "Opening event: long name change. Predecessor ‘Malta’ and ‘State of Malta’ COU0071."@en ; + skos:hiddenLabel "Republika Malta"@cs, + "Maltos"@lt, + "Maltas"@lv, + "Maltija"@mt, + "ir-Repubblika ta' Malta"@mt, + "Maltese"@nl, + "Republliken Malta"@sv ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "220"^^euvoc:EP, + "M"^^euvoc:FD_010, + "M"^^euvoc:FD_050, + "MT"^^euvoc:FD_110, + "MT"^^euvoc:FD_140, + "MT"^^euvoc:FD_160, + "MLT_N"^^euvoc:FD_290, + "MT"^^euvoc:FD_361, + "MT"^^euvoc:FD_375, + "MT"^^euvoc:FD_380, + "M"^^euvoc:FD_400, + ".mt"^^euvoc:IANA_DOMAIN, + "MT"^^euvoc:IBAN_COU, + "MT"^^euvoc:ISG_COU, + "MT"^^euvoc:ISO_3166_1_ALPHA_2, + "MLT"^^euvoc:ISO_3166_1_ALPHA_3, + "470"^^euvoc:ISO_3166_1_NUM, + "MT"^^euvoc:MNE, + "MLT"^^euvoc:NAC, + "356"^^euvoc:PHONE_PREFIX, + "{MLT}"^^euvoc:PUB_LOC, + "MT"^^euvoc:TED, + "MT"^^euvoc:TED_SCHEMA, + "M"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "470"^^euvoc:UNSD_M49 ; + skos:prefLabel "مالطة"@ar, + "Мальта"@be, + "Малта"@bg, + "Malta"@bs, + "Malta"@ca, + "Malta"@cs, + "Malta"@da, + "Malta"@de, + "Μάλτα"@el, + "Malta"@en, + "Malta"@es, + "Malta"@et, + "Malta"@eu, + "Malta"@fi, + "Malta"@fo, + "Malte"@fr, + "Málta"@ga, + "Malta"@gl, + "Malta"@hr, + "Málta"@hu, + "Malta"@is, + "Malta"@it, + "マルタ"@ja, + "Malta"@lb, + "Malta"@lt, + "Malta"@lv, + "Малта"@mk, + "Malta"@mt, + "Malta"@nl, + "Malta"@no, + "Malta"@pl, + "Malta"@pt, + "Malta"@rm, + "Malta"@ro, + "Мальта"@ru, + "Malta"@sk, + "Malta"@sl, + "Malta"@sq, + "Малта"@sr, + "Malta"@sv, + "Malta"@tr, + "Мальта"@uk, + "马耳他"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "POL" ; + at:deprecated "false" ; + at:op-code "POL" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "PL" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "POL_N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "PL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "PL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "PL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "PL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PL" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "PL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "PL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "PL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PL" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{POL}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "PL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "PL" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-21" ; + at:protocol.order "EU-21" ; + at:protocol.ordering "EU-21" ; + at:start.use "1945-04-08" ; + euvoc:order "EU-21" ; + atold:op-code "POL" ; + dc:identifier "POL" ; + skos:altLabel "جمهورية بولندا"@ar, + "Рэспу́бліка Польшча"@be, + "Република Полша"@bg, + "Republika Poljska"@bs, + "República de Polònia"@ca, + "Polská republika"@cs, + "Republikken Polen"@da, + "Republik Polen"@de, + "Δημοκρατία της Πολωνίας"@el, + "Republic of Poland"@en, + "República de Polonia"@es, + "Poola Vabariik"@et, + "Poloniako Errepublika"@eu, + "Puolan tasavalta"@fi, + "Lýðveldið Pólland"@fo, + "République de Pologne"@fr, + "Poblacht na Polainne"@ga, + "República da Polania"@gl, + "Republika Poljska"@hr, + "Lengyel Köztársaság"@hu, + "Lýðveldið Pólland"@is, + "Repubblica di Polonia"@it, + "ポーランド共和国"@ja, + "Republik Polen"@lb, + "Lenkijos Respublika"@lt, + "Polijas Republika"@lv, + "Република Полска"@mk, + "Ir-Repubblika tal-Polonja"@mt, + "Republiek Polen"@nl, + "Republikken Polen"@no, + "Rzeczpospolita Polska"@pl, + "República da Polónia"@pt, + "Republica da la Pologna"@rm, + "Republica Polonă"@ro, + "Республика Польша"@ru, + "Poľská republika"@sk, + "Republika Poljska"@sl, + "Republika Polake"@sq, + "Република Пољска"@sr, + "Republiken Polen"@sv, + "Polonya Cumhuriyeti"@tr, + "Республіка Польща"@uk, + "波兰共和国"@zh ; + skos:changeNote "Closing event: long name change. Successor ‘Republic of Poland’ COU0045."@en, + "Opening event: long name change. Predecessor ‘People's Republic of Poland’ COU0064."@en, + "Satellite state of the Soviet Union 1944-1989 in the Warsaw Pact. Source: Wikipedia."@en ; + skos:hiddenLabel "an Pholainn"@ga, + "Lenkijos"@lt, + "Polijas"@lv, + "il-Polonja"@mt, + "ir-Repubblika tal-Polonja"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "145"^^euvoc:EP, + "PL"^^euvoc:FD_010, + "PL"^^euvoc:FD_050, + "PL"^^euvoc:FD_110, + "PL"^^euvoc:FD_140, + "PL"^^euvoc:FD_160, + "POL_N"^^euvoc:FD_290, + "PL"^^euvoc:FD_361, + "PL"^^euvoc:FD_375, + "PL"^^euvoc:FD_380, + "PL"^^euvoc:FD_400, + ".pl"^^euvoc:IANA_DOMAIN, + "PL"^^euvoc:IBAN_COU, + "PL"^^euvoc:ISG_COU, + "PL"^^euvoc:ISO_3166_1_ALPHA_2, + "POL"^^euvoc:ISO_3166_1_ALPHA_3, + "616"^^euvoc:ISO_3166_1_NUM, + "PL"^^euvoc:MNE, + "POL"^^euvoc:NAC, + "48"^^euvoc:PHONE_PREFIX, + "{POL}"^^euvoc:PUB_LOC, + "PL"^^euvoc:TED, + "PL"^^euvoc:TED_SCHEMA, + "PL"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "616"^^euvoc:UNSD_M49 ; + skos:prefLabel "بولندا"@ar, + "Польшча"@be, + "Полша"@bg, + "Poljska"@bs, + "Polònia"@ca, + "Polsko"@cs, + "Polen"@da, + "Polen"@de, + "Πολωνία"@el, + "Poland"@en, + "Polonia"@es, + "Poola"@et, + "Polonia"@eu, + "Puola"@fi, + "Pólland"@fo, + "Pologne"@fr, + "An Pholainn"@ga, + "Polonia"@gl, + "Poljska"@hr, + "Lengyelország"@hu, + "Pólland"@is, + "Polonia"@it, + "ポーランド"@ja, + "Polen"@lb, + "Lenkija"@lt, + "Polija"@lv, + "Полска"@mk, + "Il-Polonja"@mt, + "Polen"@nl, + "Polen"@no, + "Polska"@pl, + "Polónia"@pt, + "Pologna"@rm, + "Polonia"@ro, + "Польша"@ru, + "Poľsko"@sk, + "Poljska"@sl, + "Polonia"@sq, + "Пољска"@sr, + "Polen"@sv, + "Polonya"@tr, + "Польща"@uk, + "波兰"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "ROU" ; + at:deprecated "false" ; + at:op-code "ROU" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "RO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "RO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "RO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "ROU_N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "RO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "RO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "RO" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "RO" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:legacy-code "RO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "R" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "RO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{ROM}" ; + dc:source "PUB" ] ; + at:protocol-order "EU-23" ; + at:protocol.order "EU-23" ; + at:protocol.ordering "EU-23" ; + at:start.use "1947-12-30" ; + euvoc:order "EU-23" ; + atold:op-code "ROU" ; + dc:identifier "ROU" ; + skos:altLabel "Romănia"@ro ; + skos:changeNote "Closing event: long name change. Successor ‘Romania’ COU0047."@en, + "Closing event: long name change. Successor ‘Socialist Republic of Romania’ COU0511."@en, + "Opening event: long name change. Predecessor ‘Romanian People’s Republic’ COU0510."@en, + "Opening event: long name change. Predecessor ‘Socialist Republic of Romania’ COU0511."@en, + "Satellite state of the Soviet Union 1947-1989 in the Warsaw Pact. Source: Wikipedia."@en ; + skos:hiddenLabel "Румъния"@bg, + "an Rómáin"@ga, + "Rumunijos"@lt, + "Rumānijas"@lv, + "ir-Rumanija"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "152"^^euvoc:EP, + "R"^^euvoc:FD_010, + "RO"^^euvoc:FD_050, + "RO"^^euvoc:FD_110, + "RO"^^euvoc:FD_140, + "RO"^^euvoc:FD_160, + "ROU_N"^^euvoc:FD_290, + "RO"^^euvoc:FD_375, + "RO"^^euvoc:FD_380, + ".ro"^^euvoc:IANA_DOMAIN, + "RO"^^euvoc:IBAN_COU, + "RO"^^euvoc:ISG_COU, + "RO"^^euvoc:ISO_3166_1_ALPHA_2, + "ROU"^^euvoc:ISO_3166_1_ALPHA_3, + "642"^^euvoc:ISO_3166_1_NUM, + "RO"^^euvoc:MNE, + "ROU"^^euvoc:NAC, + "40"^^euvoc:PHONE_PREFIX, + "{ROM}"^^euvoc:PUB_LOC, + "RO"^^euvoc:TED, + "RO"^^euvoc:TED_SCHEMA, + "RO"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "642"^^euvoc:UNSD_M49 ; + skos:prefLabel "رومانيا"@ar, + "Румынія"@be, + "Pyмъния"@bg, + "Rumunija"@bs, + "Romania"@ca, + "Rumunsko"@cs, + "Rumænien"@da, + "Rumänien"@de, + "Ρουμανία"@el, + "Romania"@en, + "Rumanía"@es, + "Rumeenia"@et, + "Errumania"@eu, + "Romania"@fi, + "Rumenia"@fo, + "Roumanie"@fr, + "An Rómáin"@ga, + "Romanía"@gl, + "Rumunjska"@hr, + "Románia"@hu, + "Rúmenía"@is, + "Romania"@it, + "ルーマニア"@ja, + "Rumänien"@lb, + "Rumunija"@lt, + "Rumānija"@lv, + "Романија"@mk, + "Ir-Rumanija"@mt, + "Roemenië"@nl, + "Romania"@no, + "Rumunia"@pl, + "Roménia"@pt, + "Rumenia"@rm, + "România"@ro, + "Румыния"@ru, + "Rumunsko"@sk, + "Romunija"@sl, + "Rumania"@sq, + "Румунија"@sr, + "Rumänien"@sv, + "Romanya"@tr, + "Румунія"@uk, + "罗马尼亚"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "SOM" ; + at:deprecated "false" ; + at:op-code "SOM" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "SO" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "SO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SO" ; + dc:source "EurLex" ] ; + at:start.use "1960-01-01" ; + atold:op-code "SOM" ; + dc:identifier "SOM" ; + skos:altLabel "جمهورية الصومال الاتحادية"@ar, + "Федерална република Сомалия"@bg, + "República Federal de Somàlia"@ca, + "Somálská federativní republika"@cs, + "Den Føderale Republik Somalia"@da, + "Bundesrepublik Somalia"@de, + "Ομοσπονδιακή Δημοκρατία της Σομαλίας"@el, + "Federal Republic of Somalia"@en, + "República Federal de Somalia"@es, + "Somaali Liitvabariik"@et, + "Somalian liittotasavalta"@fi, + "République fédérale de Somalie"@fr, + "Poblacht Chónaidhme na Somáile"@ga, + "Savezna Republika Somalija"@hr, + "Szomáli Szövetségi Köztársaság"@hu, + "Sambandslýðveldið Sómalía"@is, + "Repubblica federale di Somalia"@it, + "ソマリア連邦共和国"@ja, + "Bundesrepublik Somalia"@lb, + "Somalio Federacinė Respublika"@lt, + "Somālijas Federatīvā Republika"@lv, + "Ir-Repubblika Federali tas-Somalja"@mt, + "Federale Republiek Somalië"@nl, + "Forbundsrepublikken Somalia"@no, + "Federalna Republika Somalii"@pl, + "República Federal da Somália"@pt, + "Republica Federală Somalia"@ro, + "Федеративная Республика Сомали"@ru, + "Somálska federatívna republika"@sk, + "Zvezna republika Somalija"@sl, + "Soomaaliya"@so, + "Förbundsrepubliken Somalia"@sv, + "Somali Federal Cumhuriyeti"@tr, + "Федеративна Республіка Сомалі"@uk, + "索马里联邦共和国"@zh ; + skos:changeNote "Wikipedia: The Provisional Constitution adopted 1.8.2012 designates Somalia as a federation."@en ; + skos:hiddenLabel "Република Сомалия"@bg, + "Somali; Somalian"@en, + "Somalian tasavalta"@fi, + "an tSomáil"@ga, + "somalsko"@hr, + "Szomáliai Szövetségi Köztársaság"@hu, + "Somalio"@lt, + "Somālijas"@lv, + "ir-Repubblika Federali tas-Somalja"@mt, + "is-Somalja"@mt, + "somali"@pt ; + skos:inScheme atold:country, + , + , + ; + skos:narrower ; + skos:notation "165"^^euvoc:EP, + "SO"^^euvoc:FD_010, + "SO"^^euvoc:FD_400, + ".so"^^euvoc:IANA_DOMAIN, + "SO"^^euvoc:ISG_COU, + "SO"^^euvoc:ISO_3166_1_ALPHA_2, + "SOM"^^euvoc:ISO_3166_1_ALPHA_3, + "706"^^euvoc:ISO_3166_1_NUM, + "SOM"^^euvoc:NAC, + "252"^^euvoc:PHONE_PREFIX, + "SO"^^euvoc:TED, + "SO"^^euvoc:TED_SCHEMA, + "SO"^^euvoc:TIR, + "Eastern Africa"^^euvoc:UNSD_GEOSCHEME, + "706"^^euvoc:UNSD_M49 ; + skos:prefLabel "الصومال"@ar, + "Сомалия"@bg, + "Somàlia"@ca, + "Somálsko"@cs, + "Somalia"@da, + "Somalia"@de, + "Σομαλία"@el, + "Somalia"@en, + "Somalia"@es, + "Somaalia"@et, + "Somalia"@fi, + "Somalie"@fr, + "An tSomáil"@ga, + "Somalija"@hr, + "Szomália"@hu, + "Sómalía"@is, + "Somalia"@it, + "ソマリア"@ja, + "Somalia"@lb, + "Somalis"@lt, + "Somālija"@lv, + "Is-Somalja"@mt, + "Somalië"@nl, + "Somalia"@no, + "Somalia"@pl, + "Somália"@pt, + "Somalia"@ro, + "Сомали"@ru, + "Somálsko"@sk, + "Somalija"@sl, + "Somalia"@sv, + "Somali"@tr, + "Сомалі"@uk, + "索马里"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "SVK" ; + at:deprecated "false" ; + at:op-code "SVK" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "SK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "SK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "SK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SK" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "SK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "SK" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "SK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SK" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{SVK}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "SVK_N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "SK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "SK" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-25" ; + at:protocol.order "EU-25" ; + at:protocol.ordering "EU-25" ; + at:start.use "1993-01-01" ; + euvoc:order "EU-25" ; + atold:op-code "SVK" ; + dc:identifier "SVK" ; + skos:altLabel "جمهورية سلوفاكيا"@ar, + "Рэспу́бліка Славакія"@be, + "Словашка република"@bg, + "Slovačka republika"@bs, + "República d’Eslovàquia"@ca, + "Slovenská republika"@cs, + "Den Slovakiske Republik"@da, + "Slowakische Republik"@de, + "Σλοβακική Δημοκρατία"@el, + "Slovak Republic"@en, + "República Eslovaca"@es, + "Slovaki Vabariik"@et, + "Eslovakiako Errepublika"@eu, + "Slovakian tasavalta"@fi, + "Lýðveldið Slovakia"@fo, + "République slovaque"@fr, + "Poblacht na Slóvaice"@ga, + "República Eslovaca"@gl, + "Republika Slovačka"@hr, + "Szlovák Köztársaság"@hu, + "Slóvakíska lýðveldið"@is, + "Repubblica slovacca"@it, + "スロバキア共和国"@ja, + "Slowakesch Republik"@lb, + "Slovakijos Respublika"@lt, + "Slovākijas Republika"@lv, + "Република Словачка"@mk, + "Ir-Repubblika Slovakka"@mt, + "Slowaakse Republiek"@nl, + "Republikken Slovakia"@no, + "Republika Słowacka"@pl, + "República Eslovaca"@pt, + "Republica da la Slovachia"@rm, + "Republica Slovacă"@ro, + "Словацкая Республика"@ru, + "Slovenská republika"@sk, + "Slovaška republika"@sl, + "Republika e Sllovakisë"@sq, + "Словачка Република"@sr, + "Republiken Slovakien"@sv, + "Slovensko"@svk, + "Slovak Cumhuriyeti"@tr, + "Словацька Республіка"@uk, + "斯洛伐克共和国"@zh ; + skos:changeNote "Opening event: Splitting of Czechoslovakia into Czech Republic and Slovakia. Long name change. Predecessor ‘Czech and Slovak Federative Republic’ COU0063."@en, + "The ‘SK’ code was formerly used for ‘Sikkim’, merged into India IN."@en, + "Le code ISO «SK» a été utilisé précédemment pour «Sikkim», fusionné avec Inde IN."@fr ; + skos:hiddenLabel "Slovak; Slovakian"@en, + "an tSlóvaic"@ga, + "Slovačka Republika"@hr, + "Slovakijos"@lt, + "Slovākijas"@lv, + "is-Slovakkja"@mt ; + skos:historyNote "The ‘SK’ ISO code was formerly used for Sikkim, now a state of India, ISO 3166-3 code: SKIN."@en, + "Le code ISO «SK» a été précédemment assigné à Sikkim, maintenant un État de l’Inde, code ISO 3166-3: SKIN."@fr ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "161"^^euvoc:EP, + "SK"^^euvoc:FD_010, + "SK"^^euvoc:FD_050, + "SK"^^euvoc:FD_110, + "SK"^^euvoc:FD_140, + "SK"^^euvoc:FD_160, + "SVK_N"^^euvoc:FD_290, + "SK"^^euvoc:FD_361, + "SK"^^euvoc:FD_375, + "SK"^^euvoc:FD_380, + ".sk"^^euvoc:IANA_DOMAIN, + "SK"^^euvoc:IBAN_COU, + "SK"^^euvoc:ISG_COU, + "SK"^^euvoc:ISO_3166_1_ALPHA_2, + "SVK"^^euvoc:ISO_3166_1_ALPHA_3, + "703"^^euvoc:ISO_3166_1_NUM, + "SK"^^euvoc:MNE, + "SVK"^^euvoc:NAC, + "421"^^euvoc:PHONE_PREFIX, + "{SVK}"^^euvoc:PUB_LOC, + "SK"^^euvoc:TED, + "SK"^^euvoc:TED_SCHEMA, + "SK"^^euvoc:TIR, + "Eastern Europe"^^euvoc:UNSD_GEOSCHEME, + "703"^^euvoc:UNSD_M49 ; + skos:prefLabel "سلوفاكيا"@ar, + "Славакія"@be, + "Словакия"@bg, + "Slovačka"@bs, + "Eslovàquia"@ca, + "Slovensko"@cs, + "Slovakiet"@da, + "Slowakei"@de, + "Σλοβακία"@el, + "Slovakia"@en, + "Eslovaquia"@es, + "Slovakkia"@et, + "Eslovakia"@eu, + "Slovakia"@fi, + "Slovakia"@fo, + "Slovaquie"@fr, + "An tSlóvaic"@ga, + "Eslovaquia"@gl, + "Slovačka"@hr, + "Szlovákia"@hu, + "Slóvakía"@is, + "Slovacchia"@it, + "スロバキア"@ja, + "Slowakei"@lb, + "Slovakija"@lt, + "Slovākija"@lv, + "Словачка"@mk, + "Is-Slovakkja"@mt, + "Slowakije"@nl, + "Slovakia"@no, + "Słowacja"@pl, + "Eslováquia"@pt, + "Slovachia"@rm, + "Slovacia"@ro, + "Словакия"@ru, + "Slovensko"@sk, + "Slovaška"@sl, + "Sllovakia"@sq, + "Словачка"@sr, + "Slovakien"@sv, + "Slovakya"@tr, + "Словаччина"@uk, + "斯洛伐克"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "SVN" ; + at:deprecated "false" ; + at:op-code "SVN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "SI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "SLO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "SI" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "SI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "SVN_N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "SI" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SLO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "SI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SI" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "SI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "SI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SI" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{SVN}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "SI" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-24" ; + at:protocol.order "EU-24" ; + at:protocol.ordering "EU-24" ; + at:start.use "1991-06-25" ; + euvoc:order "EU-24" ; + atold:op-code "SVN" ; + dc:identifier "SVN" ; + skos:altLabel "جمهورية سلوفينيا"@ar, + "Рэспу́бліка Славенія"@be, + "Република Словения"@bg, + "Republika Slovenija"@bs, + "República d’Eslovènia"@ca, + "Republika Slovinsko"@cs, + "Republikken Slovenien"@da, + "Republik Slowenien"@de, + "Δημοκρατία της Σλοβενίας"@el, + "Republic of Slovenia"@en, + "República de Eslovenia"@es, + "Sloveenia Vabariik"@et, + "Esloveniako Errepublika"@eu, + "Slovenian tasavalta"@fi, + "Lýðveldið Slovenia"@fo, + "République de Slovénie"@fr, + "Poblacht na Slóivéine"@ga, + "República de Eslovenia"@gl, + "Republika Slovenija"@hr, + "Szlovén Köztársaság"@hu, + "Lýðveldið Slóvenía"@is, + "Repubblica di Slovenia"@it, + "スロベニア共和国"@ja, + "Republik Slowenien"@lb, + "Slovėnijos Respublika"@lt, + "Slovānijas Republika"@lv, + "Република Словенија"@mk, + "Ir-Repubblika tas-Slovenja"@mt, + "Republiek Slovenië"@nl, + "Republikken Slovenia"@no, + "Republika Słowenii"@pl, + "República da Eslovénia"@pt, + "Republica da la Slovenia"@rm, + "Republica Slovenia"@ro, + "Республика Словения"@ru, + "Slovinská republika"@sk, + "Republika Slovenija"@sl, + "Slovinsko"@sl, + "Republika e Sllovenisë"@sq, + "Република Словенија"@sr, + "Republiken Slovenien"@sv, + "Slovenya Cumhuriyeti"@tr, + "Республіка Словенія"@uk, + "斯洛文尼亚共和国"@zh ; + skos:changeNote "Opening event: Splitting of the ‘Socialist Federal Republic of Yugoslavia’ COU0060 into Republic of Slovenia COU0051, Republic of Croatia COU0026, Federal Republic of Yugoslavia COU0061, Bosnia and Herzegovina COU0004, Former Yugoslav Republic of Macedonia COU0040."@en ; + skos:hiddenLabel "Словения"@bg, + "an tSlóivéin"@ga, + "Slovėnijos"@lt, + "Slovēnija"@lv, + "Slovēnijas"@lv, + "Slovēnijas Republika"@lv, + "is-Slovenja"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "251"^^euvoc:EP, + "SLO"^^euvoc:FD_010, + "SLO"^^euvoc:FD_050, + "SI"^^euvoc:FD_110, + "SI"^^euvoc:FD_140, + "SI"^^euvoc:FD_160, + "SVN_N"^^euvoc:FD_290, + "SI"^^euvoc:FD_361, + "SI"^^euvoc:FD_375, + "SI"^^euvoc:FD_380, + ".si"^^euvoc:IANA_DOMAIN, + "SI"^^euvoc:IBAN_COU, + "SI"^^euvoc:ISG_COU, + "SI"^^euvoc:ISO_3166_1_ALPHA_2, + "SVN"^^euvoc:ISO_3166_1_ALPHA_3, + "705"^^euvoc:ISO_3166_1_NUM, + "SI"^^euvoc:MNE, + "SVN"^^euvoc:NAC, + "386"^^euvoc:PHONE_PREFIX, + "SI"^^euvoc:PUB_LOC, + "{SVN}"^^euvoc:PUB_LOC, + "SI"^^euvoc:TED, + "SI"^^euvoc:TED_SCHEMA, + "SLO"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "705"^^euvoc:UNSD_M49 ; + skos:prefLabel "سلوفينيا"@ar, + "Славенія"@be, + "Cлoвeния"@bg, + "Slovenija"@bs, + "Eslovènia"@ca, + "Slovinsko"@cs, + "Slovenien"@da, + "Slowenien"@de, + "Σλοβενία"@el, + "Slovenia"@en, + "Eslovenia"@es, + "Sloveenia"@et, + "Eslovenia"@eu, + "Slovenia"@fi, + "Slovenia"@fo, + "Slovénie"@fr, + "An tSlóivéin"@ga, + "Eslovenia"@gl, + "Slovenija"@hr, + "Szlovénia"@hu, + "Slóvenía"@is, + "Slovenia"@it, + "スロベニア"@ja, + "Slowenien"@lb, + "Slovėnija"@lt, + "Slovānija"@lv, + "Словенија"@mk, + "Is-Slovenja"@mt, + "Slovenië"@nl, + "Slovenia"@no, + "Słowenia"@pl, + "Eslovénia"@pt, + "Slovenia"@rm, + "Slovenia"@ro, + "Словения"@ru, + "Slovinsko"@sk, + "Slovenija"@sl, + "Sllovenia"@sq, + "Словенија"@sr, + "Slovenien"@sv, + "Slovenya"@tr, + "Словенія"@uk, + "斯洛文尼亚"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "SWE" ; + at:deprecated "false" ; + at:op-code "SWE" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "S" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "SE" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "SE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "SE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "SE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "SE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "SE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "SV" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "S" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "S" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{SWE}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "S" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "SE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "S" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-27" ; + at:protocol.order "EU-27" ; + at:protocol.ordering "EU-27" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-27" ; + atold:op-code "SWE" ; + dc:identifier "SWE" ; + skos:altLabel "مملكة السويد"@ar, + "Каралеўства Швецыя"@be, + "Кралство Швеция"@bg, + "Kraljevina Švedska"@bs, + "Regne de Suècia"@ca, + "Švédské království"@cs, + "Kongeriget Sverige"@da, + "Königreich Schweden"@de, + "Βασίλειο της Σουηδίας"@el, + "Kingdom of Sweden"@en, + "Reino de Suecia"@es, + "Rootsi Kuningriik"@et, + "Suediako Erresuma"@eu, + "Ruotsin kuningaskunta"@fi, + "Kongsríki Svøríki"@fo, + "Royaume de Suède"@fr, + "Ríocht na Sualainne"@ga, + "Reino de Suecia"@gl, + "Kraljevina Švedska"@hr, + "Svéd Királyság"@hu, + "Konungsríkið Svíþjóð"@is, + "Regno di Svezia"@it, + "スウェーデン王国"@ja, + "Kinnekräich Schweden"@lb, + "Švedijos Karalystė"@lt, + "Zviedrijas Karaliste"@lv, + "Кралство Шведска"@mk, + "Ir-Renju tal-Iżvezja"@mt, + "Koninkrijk Zweden"@nl, + "Kongeriket Sverige"@no, + "Królestwo Szwecji"@pl, + "Reino da Suécia"@pt, + "Reginavel da la Svezia"@rm, + "Regatul Suediei"@ro, + "Королевство Швеция"@ru, + "Švédske kráľovstvo"@sk, + "Kraljevina Švedska"@sl, + "Mbretëria e Suedisë"@sq, + "Краљевина Шведска"@sr, + "Konungariket Sverige"@sv, + "İsveç Krallığı"@tr, + "Королівство Швеція"@uk, + "瑞典王国"@zh ; + skos:hiddenLabel "Швеция"@bg, + "an tSualainn"@ga, + "Švedijos"@lt, + "Zviedrijas"@lv, + "ir-Renju tal-Iżvezja"@mt, + "l-Iżvezja"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:notation "158"^^euvoc:EP, + "S"^^euvoc:FD_010, + "S"^^euvoc:FD_050, + "SE"^^euvoc:FD_110, + "SE"^^euvoc:FD_140, + "SE"^^euvoc:FD_160, + "S"^^euvoc:FD_290, + "S"^^euvoc:FD_361, + "SE"^^euvoc:FD_375, + "SE"^^euvoc:FD_380, + "S"^^euvoc:FD_400, + ".se"^^euvoc:IANA_DOMAIN, + "SE"^^euvoc:IBAN_COU, + "SE"^^euvoc:ISG_COU, + "SE"^^euvoc:ISO_3166_1_ALPHA_2, + "SWE"^^euvoc:ISO_3166_1_ALPHA_3, + "752"^^euvoc:ISO_3166_1_NUM, + "SV"^^euvoc:MNE, + "SWE"^^euvoc:NAC, + "46"^^euvoc:PHONE_PREFIX, + "SE"^^euvoc:PUB_LOC, + "{SWE}"^^euvoc:PUB_LOC, + "SE"^^euvoc:TED, + "SE"^^euvoc:TED_SCHEMA, + "S"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "752"^^euvoc:UNSD_M49 ; + skos:prefLabel "السويد"@ar, + "Швецыя"@be, + "Швeция"@bg, + "Švedska"@bs, + "Suècia"@ca, + "Švédsko"@cs, + "Sverige"@da, + "Schweden"@de, + "Σουηδία"@el, + "Sweden"@en, + "Suecia"@es, + "Rootsi"@et, + "Suedia"@eu, + "Ruotsi"@fi, + "Svøríki"@fo, + "Suède"@fr, + "An tSualainn"@ga, + "Suecia"@gl, + "Švedska"@hr, + "Svédország"@hu, + "Svíþjóð"@is, + "Svezia"@it, + "スウェーデン"@ja, + "Schweden"@lb, + "Švedija"@lt, + "Zviedrija"@lv, + "Шведска"@mk, + "L-Iżvezja"@mt, + "Zweden"@nl, + "Sverige"@no, + "Szwecja"@pl, + "Suécia"@pt, + "Svezia"@rm, + "Suedia"@ro, + "Швеция"@ru, + "Švédsko"@sk, + "Švedska"@sl, + "Suedia"@sq, + "Шведска"@sr, + "Sverige"@sv, + "İsveç"@tr, + "Швеція"@uk, + "瑞典"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "XXA" ; + at:deprecated "false" ; + at:op-code "XXA" ; + at:start.use "2022-12-09" ; + atold:op-code "XXA" ; + dc:identifier "XXA" ; + skos:broader , + ; + skos:definition "disputed territory between Taiwan, China and Viet Nam"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "XXA"^^euvoc:NAC ; + skos:prefLabel "Paracel Islands (disputed territory)"@en ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "XXB" ; + at:deprecated "false" ; + at:op-code "XXB" ; + at:start.use "2022-12-09" ; + atold:op-code "XXB" ; + dc:identifier "XXB" ; + skos:broader , + ; + skos:definition "disputed territory between China, the Philippines, Taiwan, Malaysia, Viet Nam, and Brunei"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "XXB"^^euvoc:NAC ; + skos:prefLabel "Spratly Islands (disputed territory)"@en ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "XXJ" ; + at:deprecated "false" ; + at:op-code "XXJ" ; + at:start.use "2022-12-09" ; + atold:op-code "XXJ" ; + dc:identifier "XXJ" ; + skos:broader , + ; + skos:definition "disputed territory between Japan and South Korea"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "XXJ"^^euvoc:NAC ; + skos:prefLabel "Liancourt Rocks (disputed territory)"@en ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "XXL" ; + at:deprecated "false" ; + at:op-code "XXL" ; + at:start.use "2022-12-09" ; + atold:op-code "XXL" ; + dc:identifier "XXL" ; + skos:broader , + ; + skos:definition "disputed territory between Haiti and the USA"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "XXL"^^euvoc:NAC ; + skos:prefLabel "Navassa Island (disputed territory)"@en ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "XXM" ; + at:deprecated "false" ; + at:op-code "XXM" ; + at:start.use "2022-12-09" ; + atold:op-code "XXM" ; + dc:identifier "XXM" ; + skos:broader , + ; + skos:definition "disputed territory between Philippines and China"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "XXM"^^euvoc:NAC ; + skos:prefLabel "Scarborough Reef (disputed territory)"@en ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "XXN" ; + at:deprecated "false" ; + at:op-code "XXN" ; + at:start.use "2022-12-09" ; + atold:op-code "XXN" ; + dc:identifier "XXN" ; + skos:broader , + ; + skos:definition "disputed territory between China, Taiwan and Japan"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "XXN"^^euvoc:NAC ; + skos:prefLabel "Senkaku Islands (disputed territory)"@en ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "XXP" ; + at:deprecated "false" ; + at:op-code "XXP" ; + at:start.use "2022-12-09" ; + atold:op-code "XXP" ; + dc:identifier "XXP" ; + skos:broader , + ; + skos:definition "disputed territory between a range of disputed areas in South China sea, which are parent to more specific disputes"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "XXP"^^euvoc:NAC ; + skos:prefLabel "China/Philippines/Viet Nam/Taiwan/Malaysia (disputed territory)"@en ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "XXZ" ; + at:deprecated "false" ; + at:op-code "XXZ" ; + at:start.use "2022-12-09" ; + atold:op-code "XXZ" ; + dc:identifier "XXZ" ; + skos:broader , + ; + skos:definition "disputed territory between Japan and Russia"@en ; + skos:inScheme atold:country, + , + , + ; + skos:notation "XXZ"^^euvoc:NAC ; + skos:prefLabel "Kuril Islands (disputed territory)"@en ; + skos:topConceptOf , + , + . + + a skos:Concept ; + at:authority-code "CYP" ; + at:deprecated "false" ; + at:op-code "CYP" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "CY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "CY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "CY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "CY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "CY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{CYP}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:legacy-code "CY" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "CY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "CY" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "CY" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "CY" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "CY" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-13" ; + at:protocol.order "EU-13" ; + at:protocol.ordering "EU-13" ; + at:start.use "1960-08-16" ; + euvoc:order "EU-13" ; + atold:op-code "CYP" ; + dc:identifier "CYP" ; + skos:altLabel "جمهورية قبرص"@ar, + "Рэспу́бліка Кіпр"@be, + "Република Кипър"@bg, + "Republika Kipar"@bs, + "República de Xipre"@ca, + "Kyperská republika"@cs, + "Republikken Cypern"@da, + "Republik Zypern"@de, + "Κυπριακή Δημοκρατία"@el, + "Republic of Cyprus"@en, + "República de Chipre"@es, + "Küprose Vabariik"@et, + "Zipreko Errepublika"@eu, + "Kyproksen tasavalta"@fi, + "Lýðveldið Kýpros"@fo, + "République de Chypre"@fr, + "Poblacht na Cipire"@ga, + "República de Chipre"@gl, + "Republika Cipar"@hr, + "Ciprusi Köztársaság"@hu, + "Lýðveldið Kýpur"@is, + "Repubblica di Cipro"@it, + "キプロス共和国"@ja, + "Republik Zypern"@lb, + "Kipro Respublika"@lt, + "Kipras Republika"@lv, + "Република Кипар"@mk, + "Ir-Repubblika ta’ Ċipru"@mt, + "Republiek Cyprus"@nl, + "Republikken Kypros"@no, + "Republika Cypryjska"@pl, + "República de Chipre"@pt, + "Republica da la Cipra"@rm, + "Republica Cipru"@ro, + "Республика Кипр"@ru, + "Cyperská republika"@sk, + "Republika Ciper"@sl, + "Republika e Qipros"@sq, + "Република Кипар"@sr, + "Republiken Cypern"@sv, + "Kıbrıs Cumhuriyeti"@tr, + "Республіка Кіпр"@uk, + "塞浦路斯共和国"@zh ; + skos:changeNote "Opening event: Independence from British administration."@en, + "Wikipedia: Cyprus was placed under British administration in 1878 until it was granted independence in 1960, becoming a member of the Commonwealth the following year."@en ; + skos:hiddenLabel "Кипър"@bg, + "Küprose"@et, + "an Chipir"@ga, + "Kipro"@lt, + "Kipras"@lv, + "ir-Repubblika ta' Ċipru"@mt, + "Republilken Cypern"@sv ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower ; + skos:notation "44"^^euvoc:EP, + "CY"^^euvoc:FD_010, + "CY"^^euvoc:FD_050, + "CY"^^euvoc:FD_110, + "CY"^^euvoc:FD_140, + "CY"^^euvoc:FD_160, + "CY"^^euvoc:FD_361, + "CY"^^euvoc:FD_380, + "CY"^^euvoc:FD_400, + ".cy"^^euvoc:IANA_DOMAIN, + "CY"^^euvoc:IBAN_COU, + "CY"^^euvoc:ISG_COU, + "CY"^^euvoc:ISO_3166_1_ALPHA_2, + "CYP"^^euvoc:ISO_3166_1_ALPHA_3, + "196"^^euvoc:ISO_3166_1_NUM, + "CY"^^euvoc:MNE, + "CYP"^^euvoc:NAC, + "357"^^euvoc:PHONE_PREFIX, + "{CYP}"^^euvoc:PUB_LOC, + "CY"^^euvoc:TED, + "CY"^^euvoc:TED_SCHEMA, + "CY"^^euvoc:TIR, + "Western Asia"^^euvoc:UNSD_GEOSCHEME, + "196"^^euvoc:UNSD_M49 ; + skos:prefLabel "قبرص"@ar, + "Кіпр"@be, + "Кипъp"@bg, + "Kipar"@bs, + "Xipre"@ca, + "Kypr"@cs, + "Cypern"@da, + "Zypern"@de, + "Κύπρος"@el, + "Cyprus"@en, + "Chipre"@es, + "Küpros"@et, + "Zipre"@eu, + "Kypros"@fi, + "Kýpros"@fo, + "Chypre"@fr, + "An Chipir"@ga, + "Chipre"@gl, + "Cipar"@hr, + "Ciprus"@hu, + "Kýpur"@is, + "Cipro"@it, + "キプロス"@ja, + "Zypern"@lb, + "Kipras"@lt, + "Kipra"@lv, + "Кипар"@mk, + "Ċipru"@mt, + "Cyprus"@nl, + "Kypros"@no, + "Cypr"@pl, + "Chipre"@pt, + "Cipra"@rm, + "Cipru"@ro, + "Кипр"@ru, + "Cyprus"@sk, + "Ciper"@sl, + "Qipro"@sq, + "Кипар"@sr, + "Cypern"@sv, + "Kıbrıs"@tr, + "Кіпр"@uk, + "塞浦路斯"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "FIN" ; + at:deprecated "false" ; + at:op-code "FIN" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "FI" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "FI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "FI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "FIN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "SF" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "SF" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "FI" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "FI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "FIN" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "FI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "SF" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "FI" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "FI" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "FI" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{FIN}" ; + dc:source "PUB" ] ; + at:protocol-order "EU-26" ; + at:protocol.order "EU-26" ; + at:protocol.ordering "EU-26" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-26" ; + atold:op-code "FIN" ; + dc:identifier "FIN" ; + skos:altLabel "جمهورية فنلندا"@ar, + "Рэспу́бліка Фінляндыя"@be, + "Република Финландия"@bg, + "Republika Finska"@bs, + "República de Finlàndia"@ca, + "Finská republika"@cs, + "Republikken Finland"@da, + "Republik Finnland"@de, + "Δημοκρατία της Φινλανδίας"@el, + "Republic of Finland"@en, + "República de Finlandia"@es, + "Soome Vabariik"@et, + "Finlandiako Errepublika"@eu, + "Suomen tasavalta"@fi, + "Lýðveldið Finnland"@fo, + "République de Finlande"@fr, + "Poblacht na Fionlainne"@ga, + "República Finlandesa"@gl, + "Republika Finska"@hr, + "Finn Köztársaság"@hu, + "Lýðveldið Finnland"@is, + "Repubblica di Finlandia"@it, + "フィンランド共和国"@ja, + "Republik Finnland"@lb, + "Suomijos Respublika"@lt, + "Somijas Republika"@lv, + "Република Финска"@mk, + "Ir-Repubblika tal-Finlandja"@mt, + "Republiek Finland"@nl, + "Republikken Finland"@no, + "Republika Finlandii"@pl, + "República da Finlândia"@pt, + "Republica da la Finlanda"@rm, + "Republica Finlanda"@ro, + "Финляндская Республика"@ru, + "Fínska republika"@sk, + "Republika Finska"@sl, + "Republika Finlandeze"@sq, + "Република Финска"@sr, + "Republiken Finland"@sv, + "Finlandiya Cumhuriyeti"@tr, + "Фінляндська Республіка"@uk, + "芬兰共和国"@zh ; + skos:hiddenLabel "Финландия"@bg, + "an Fhionlainn"@ga, + "Suomijos"@lt, + "Somijas"@lv, + "il-Finlandja"@mt, + "ir-Repubblika tal-Finlandja"@mt, + "finsk"@sv ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower ; + skos:notation "55"^^euvoc:EP, + "FIN"^^euvoc:FD_010, + "SF"^^euvoc:FD_010, + "FI"^^euvoc:FD_110, + "SF"^^euvoc:FD_110, + "FI"^^euvoc:FD_140, + "FI"^^euvoc:FD_160, + "FIN"^^euvoc:FD_290, + "FI"^^euvoc:FD_375, + "FI"^^euvoc:FD_380, + "SF"^^euvoc:FD_400, + ".fi"^^euvoc:IANA_DOMAIN, + "FI"^^euvoc:IBAN_COU, + "FI"^^euvoc:ISG_COU, + "FI"^^euvoc:ISO_3166_1_ALPHA_2, + "FIN"^^euvoc:ISO_3166_1_ALPHA_3, + "246"^^euvoc:ISO_3166_1_NUM, + "FI"^^euvoc:MNE, + "FIN"^^euvoc:NAC, + "358"^^euvoc:PHONE_PREFIX, + "FI"^^euvoc:PUB_LOC, + "{FIN}"^^euvoc:PUB_LOC, + "FI"^^euvoc:TED, + "FI"^^euvoc:TED_SCHEMA, + "FIN"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "246"^^euvoc:UNSD_M49 ; + skos:prefLabel "فنلندا"@ar, + "Фінляндыя"@be, + "Финлaндия"@bg, + "Finska"@bs, + "Finlàndia"@ca, + "Finsko"@cs, + "Finland"@da, + "Finnland"@de, + "Φινλανδία"@el, + "Finland"@en, + "Finlandia"@es, + "Soome"@et, + "Finlandia"@eu, + "Suomi"@fi, + "Finnland"@fo, + "Finlande"@fr, + "An Fhionlainn"@ga, + "Finlandia"@gl, + "Finska"@hr, + "Finnország"@hu, + "Finnland"@is, + "Finlandia"@it, + "フィンランド"@ja, + "Finnland"@lb, + "Suomija"@lt, + "Somija"@lv, + "Финска"@mk, + "Il-Finlandja"@mt, + "Finland"@nl, + "Finnland"@no, + "Finlandia"@pl, + "Finlândia"@pt, + "Finlanda"@rm, + "Finlanda"@ro, + "Финляндия"@ru, + "Fínsko"@sk, + "Finska"@sl, + "Finlanda"@sq, + "Финска"@sr, + "Finland"@sv, + "Finlandiya"@tr, + "Фінляндія"@uk, + "芬兰"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "GRC" ; + at:deprecated "false" ; + at:op-code "GRC" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "GR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "GR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "GR" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "EL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "GR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "EL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{GRC}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:legacy-code "GR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "EL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "GR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "GR" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "EL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "GR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GR" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-08" ; + at:protocol.order "EU-08" ; + at:protocol.ordering "EU-08" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-08" ; + atold:op-code "GRC" ; + dc:identifier "GRC" ; + skos:altLabel "الجمهورية اليونانية"@ar, + "Рэспу́бліка Грэцыя"@be, + "Република Гърция"@bg, + "Helenska republika"@bs, + "República Hel·lènica"@ca, + "Řecká republika"@cs, + "Den Hellenske Republik"@da, + "Republik Griechenland"@de, + "Ελληνική Δημοκρατία"@el, + "Hellenic Republic"@en, + "República Helénica"@es, + "Kreeka Vabariik"@et, + "Greziako Errepublika"@eu, + "Helleenien tasavalta"@fi, + "Lýðveldið Grikkaland"@fo, + "République hellénique"@fr, + "An Phoblacht Heilléanach"@ga, + "República Helénica"@gl, + "Helenska Republika"@hr, + "Görög Köztársaság"@hu, + "Hellenska lýðveldið"@is, + "Repubblica ellenica"@it, + "ギリシャ共和国"@ja, + "Hellenesch Republik"@lb, + "Graikijos Respublika"@lt, + "Grieķijas Republika"@lv, + "Република Грција"@mk, + "Ir-Repubblika Ellenika"@mt, + "Helleense Republiek"@nl, + "Den hellenske republik"@no, + "Republika Grecka"@pl, + "República Helénica"@pt, + "Republica da la Grezia"@rm, + "Republica Elenă"@ro, + "Греческая Республика"@ru, + "Helénska republika"@sk, + "Helenska republika"@sl, + "Republika Helene"@sq, + "Република Грчка"@sr, + "Republiken Grekland"@sv, + "Yunanistan Cumhuriyeti"@tr, + "Грецька Республіка"@uk, + "希腊共和国"@zh ; + skos:changeNote "Closing event: long name change. Successor ‘Hellenic Republic’ COU0018."@en, + "Opening event: long name change. Predecessor ‘Kingdom of Greece’ COU0068."@en, + "Gwida tal-Istil Interistituzzjonali: L-aġġettiv “Elleniku” jintuża biss b’referenza għad-denominazzjoni uffiċjali tal-Istat; f’każijiet oħra jintuża l-aġġettiv “Grieg”."@mt, + "Ghid de redactare interinstituțional: se folosește adjectivul „elen” pentru tot ceea ce ține de exercitarea puterii de stat: autoritățile elene, guvernul elen etc."@ro ; + skos:hiddenLabel "Гърция"@bg, + "Hellenische Republik"@de, + "ελληvική"@el, + "Kreikan tasavalta"@fi, + "Gréigeach"@ga, + "an Ghréig"@ga, + "an Phoblacht Heilléanach"@ga, + "Graikijos"@lt, + "Grieķijas"@lv, + "il-Greċja"@mt, + "ir-Repubblika Ellenika"@mt, + "greacă"@ro, + "Grécka republika"@sk ; + skos:historyNote "The Interinstitutional Style Guide generally uses the code ISO 3166 alpha-2 see element ‘code-3166-1-alpha-2’, except for Greece where it uses ‘EL’ instead of ‘GR’ see element ‘op-styleguide’."@en, + "Le Code de rédaction interinstitutionnel utilise généralement le code ISO 3166 alpha-2 voir élément «code-3166-1-alpha-2», sauf pour la Grèce où il utilise le code «EL» au lieu du code «GR» voir élément «op-styleguide»."@fr ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower ; + skos:notation "71"^^euvoc:EP, + "GR"^^euvoc:FD_010, + "GR"^^euvoc:FD_050, + "EL"^^euvoc:FD_110, + "EL"^^euvoc:FD_140, + "EL"^^euvoc:FD_160, + "GR"^^euvoc:FD_290, + "GR"^^euvoc:FD_361, + "GR"^^euvoc:FD_375, + "EL"^^euvoc:FD_380, + "GR"^^euvoc:FD_400, + ".gr"^^euvoc:IANA_DOMAIN, + "GR"^^euvoc:IBAN_COU, + "EL"^^euvoc:ISG_COU, + "GR"^^euvoc:ISO_3166_1_ALPHA_2, + "GRC"^^euvoc:ISO_3166_1_ALPHA_3, + "300"^^euvoc:ISO_3166_1_NUM, + "GR"^^euvoc:MNE, + "GRC"^^euvoc:NAC, + "30"^^euvoc:PHONE_PREFIX, + "GR"^^euvoc:PUB_LOC, + "{GRC}"^^euvoc:PUB_LOC, + "GR"^^euvoc:TED, + "GR"^^euvoc:TED_SCHEMA, + "GR"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "300"^^euvoc:UNSD_M49 ; + skos:prefLabel "اليونان"@ar, + "Грэцыя"@be, + "Гъpция"@bg, + "Grčka"@bs, + "Grècia"@ca, + "Řecko"@cs, + "Grækenland"@da, + "Griechenland"@de, + "Ελλάδα"@el, + "Greece"@en, + "Grecia"@es, + "Kreeka"@et, + "Grezia"@eu, + "Kreikka"@fi, + "Grikkaland"@fo, + "Grèce"@fr, + "An Ghréig"@ga, + "Grecia"@gl, + "Grčka"@hr, + "Görögország"@hu, + "Grikkland"@is, + "Grecia"@it, + "ギリシャ"@ja, + "Griicheland"@lb, + "Graikija"@lt, + "Grieķija"@lv, + "Грција"@mk, + "Il-Greċja"@mt, + "Griekenland"@nl, + "Hellas"@no, + "Grecja"@pl, + "Grécia"@pt, + "Grezia"@rm, + "Grecia"@ro, + "Греция"@ru, + "Grécko"@sk, + "Grčija"@sl, + "Greqia"@sq, + "Грчка"@sr, + "Grekland"@sv, + "Yunanistan"@tr, + "Греція"@uk, + "希腊"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "DEU" ; + at:deprecated "false" ; + at:op-code "DEU" ; + at:op-mapped-code [ a at:MappedCode ; + at:legacy-code "DE" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "D" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "DE" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "DE" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "D" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "DE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "D" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "D" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{DEU}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "DE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "DE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "D" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "DE" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "DE" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "DE" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-05" ; + at:protocol.order "EU-05" ; + at:protocol.ordering "EU-05" ; + at:start.use "1949-05-23" ; + euvoc:order "EU-05" ; + atold:op-code "DEU" ; + dc:identifier "DEU" ; + skos:altLabel "جمهورية ألمانيا الاتحادية"@ar, + "Федэратыўная Рэспу́бліка Германія"@be, + "ФРГ"@bg, + "Федерална република Германия"@bg, + "Savezna Republika Njemačka"@bs, + "República Federal d'Alemanya"@ca, + "SRN"@cs, + "Spolková republika Německo"@cs, + "BRD"@da, + "Forbundsrepublikken Tyskland"@da, + "BRD"@de, + "Bundesrepublik Deutschland"@de, + "ΟΔΓ"@el, + "Ομοσπονδιακή Δημοκρατία της Γερμανίας"@el, + "FRG"@en, + "Federal Republic of Germany"@en, + "RFA"@es, + "República Federal de Alemania"@es, + "Saksa LV"@et, + "Saksamaa Liitvabariik"@et, + "Alemaniako Errepublika Federal"@eu, + "SLS"@fi, + "Saksan liittotasavalta"@fi, + "Samveldislýðveldið Týskland"@fo, + "RFA"@fr, + "République fédérale d’Allemagne"@fr, + "Poblacht Chónaidhme na Gearmáine"@ga, + "República Federal de Alemaña"@gl, + "SRN"@hr, + "Savezna Republika Njemačka"@hr, + "NSZK"@hu, + "Németországi Szövetségi Köztársaság"@hu, + "Sambandslýðveldið Þýskaland"@is, + "RFG"@it, + "Repubblica federale di Germania"@it, + "ドイツ連邦共和国"@ja, + "Bundesrepublik Däitschland"@lb, + "VFR"@lt, + "Vokietijos Federacinė Respublika"@lt, + "VFR"@lv, + "Vācijas Federatīvā Republika"@lv, + "Сојузна Република Германија"@mk, + "Ir-Repubblika Federali tal-Ġermanja"@mt, + "RFĠ"@mt, + "BRD"@nl, + "Bondsrepubliek Duitsland"@nl, + "Forbundsrepublikken Tyskland"@no, + "RFN"@pl, + "Republika Federalna Niemiec"@pl, + "RFA"@pt, + "República Federal da Alemanha"@pt, + "Republica federal da la Germania"@rm, + "RFG"@ro, + "Republica Federală Germania"@ro, + "Федеративная Республика Германия"@ru, + "SRN"@sk, + "Spolková republika Nemecko"@sk, + "ZRN"@sl, + "Zvezna republika Nemčija"@sl, + "Republika Federale e Gjermanisë"@sq, + "Савезна Република Немачка"@sr, + "BRD"@sv, + "Förbundsrepubliken Tyskland"@sv, + "Almanya Federal Cumhuriyeti"@tr, + "Федеративна Республіка Німеччина"@uk, + "德意志联邦共和国"@zh ; + skos:changeNote "Wikipedia: At German reunification on October 3, 1990, the Länder states of East Germany were integrated as new federal states to the Federal Republic of Germany FRG."@en ; + skos:hiddenLabel "Германия"@bg, + "Saksa"@et, + "République Fédérale d'Allemagne"@fr, + "an Ghearmáin"@ga, + "Német Szövetségi Köztársaság"@hu, + "Vokietijos"@lt, + "Vācijas"@lv, + "il-Ġermanja"@mt, + "ir-Repubblika Federali tal-Ġermanja"@mt, + "Republica Federală Germană"@ro, + "Nemecká spolková republika"@sk ; + skos:historyNote "The authority code DEU covers two periods of time: from 23.5.1949 to 2.10.1990: Federal Republic of Germany, with Bonn as its capital; from 3.10.1990: Federal Republic of Germany after the reunification, with Berlin as its capital."@en ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower , + ; + skos:notation "263"^^euvoc:EP, + "D"^^euvoc:FD_010, + "DE"^^euvoc:FD_010, + "D"^^euvoc:FD_050, + "DE"^^euvoc:FD_110, + "DE"^^euvoc:FD_140, + "DE"^^euvoc:FD_160, + "D"^^euvoc:FD_290, + "D"^^euvoc:FD_361, + "DE"^^euvoc:FD_380, + "D"^^euvoc:FD_400, + ".de"^^euvoc:IANA_DOMAIN, + "DE"^^euvoc:IBAN_COU, + "DE"^^euvoc:ISG_COU, + "DE"^^euvoc:ISO_3166_1_ALPHA_2, + "DEU"^^euvoc:ISO_3166_1_ALPHA_3, + "276"^^euvoc:ISO_3166_1_NUM, + "DE"^^euvoc:MNE, + "DEU"^^euvoc:NAC, + "49"^^euvoc:PHONE_PREFIX, + "DE"^^euvoc:PUB_LOC, + "{DEU}"^^euvoc:PUB_LOC, + "DE"^^euvoc:TED, + "DE"^^euvoc:TED_SCHEMA, + "D"^^euvoc:TIR, + "Western Europe"^^euvoc:UNSD_GEOSCHEME, + "276"^^euvoc:UNSD_M49 ; + skos:prefLabel "ألمانيا"@ar, + "Германія"@be, + "Гepмaния"@bg, + "Njemačka"@bs, + "Alemanya"@ca, + "Německo"@cs, + "Tyskland"@da, + "Deutschland"@de, + "Γερμανία"@el, + "Germany"@en, + "Alemania"@es, + "Saksamaa"@et, + "Alemania"@eu, + "Saksa"@fi, + "Týskland"@fo, + "Allemagne"@fr, + "An Ghearmáin"@ga, + "Alemaña"@gl, + "Njemačka"@hr, + "Németország"@hu, + "Þýskaland"@is, + "Germania"@it, + "ドイツ"@ja, + "Däitschland"@lb, + "Vokietija"@lt, + "Vācija"@lv, + "Германија"@mk, + "Il-Ġermanja"@mt, + "Duitsland"@nl, + "Tyskland"@no, + "Niemcy"@pl, + "Alemanha"@pt, + "Germania"@rm, + "Germania"@ro, + "Германия"@ru, + "Nemecko"@sk, + "Nemčija"@sl, + "Gjermania"@sq, + "Немачка"@sr, + "Tyskland"@sv, + "Almanya"@tr, + "Німеччина"@uk, + "德国"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "DNK" ; + at:deprecated "false" ; + at:op-code "DNK" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{DNK}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "DK" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "DK" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "DK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "DK" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "DK" ; + dc:source "PUB" ] ; + at:protocol-order "EU-04" ; + at:protocol.order "EU-04" ; + at:protocol.ordering "EU-04" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-04" ; + atold:op-code "DNK" ; + dc:identifier "DNK" ; + skos:altLabel "مملكة الدانمرك"@ar, + "Каралеўства Данія"@be, + "Кралство Дания"@bg, + "Kraljevina Danska"@bs, + "Regne de Dinamarca"@ca, + "Dánské království"@cs, + "Kongeriget Danmark"@da, + "Königreich Dänemark"@de, + "Βασίλειο της Δανίας"@el, + "Kingdom of Denmark"@en, + "Reino de Dinamarca"@es, + "Taani Kuningriik"@et, + "Danimarkako Erresuma"@eu, + "Tanskan kuningaskunta"@fi, + "Kongsríki Danmarkar"@fo, + "Royaume de Danemark"@fr, + "Ríocht na Danmhairge"@ga, + "Reine da Dinamarca"@gl, + "Kraljevina Danska"@hr, + "Dán Királyság"@hu, + "Konungsríkið Danmörk"@is, + "Regno di Danimarca"@it, + "デンマーク王国"@ja, + "Kinnekräich Dänemark"@lb, + "Danijos Karalystė"@lt, + "Dānijas Karaliste"@lv, + "Кралство Данска"@mk, + "Ir-Renju tad-Danimarka"@mt, + "Koninkrijk Denemarken"@nl, + "Kongeriket Danmark"@no, + "Królestwo Danii"@pl, + "Reino da Dinamarca"@pt, + "Reginavel dal Danemarc"@rm, + "Regatul Danemarcei"@ro, + "Королевство Дания"@ru, + "Dánske kráľovstvo"@sk, + "Kraljevina Danska"@sl, + "Mbretëria Daneze"@sq, + "Краљевина Данска"@sr, + "Konungariket Danmark"@sv, + "Danimarka Krallığı"@tr, + "Королівство Данія"@uk, + "丹麦王国"@zh ; + skos:hiddenLabel "Дания"@bg, + "Royaume du Danemark"@fr, + "an Danmhairg"@ga, + "Danijos"@lt, + "Dānijas"@lv, + "id-Danimarka"@mt, + "ir-Renju tad-Danimarka"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower , + ; + skos:notation "232"^^euvoc:EP, + "DK"^^euvoc:FD_010, + "DK"^^euvoc:FD_050, + "DK"^^euvoc:FD_110, + "DK"^^euvoc:FD_140, + "DK"^^euvoc:FD_160, + "DK"^^euvoc:FD_290, + "DK"^^euvoc:FD_361, + "DK"^^euvoc:FD_375, + "DK"^^euvoc:FD_380, + "DK"^^euvoc:FD_400, + ".dk"^^euvoc:IANA_DOMAIN, + "DK"^^euvoc:IBAN_COU, + "DK"^^euvoc:ISG_COU, + "DK"^^euvoc:ISO_3166_1_ALPHA_2, + "DNK"^^euvoc:ISO_3166_1_ALPHA_3, + "208"^^euvoc:ISO_3166_1_NUM, + "DK"^^euvoc:MNE, + "DNK"^^euvoc:NAC, + "45"^^euvoc:PHONE_PREFIX, + "DK"^^euvoc:PUB_LOC, + "{DNK}"^^euvoc:PUB_LOC, + "DK"^^euvoc:TED, + "DK"^^euvoc:TED_SCHEMA, + "DK"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "208"^^euvoc:UNSD_M49 ; + skos:prefLabel "الدانمرك"@ar, + "Данія"@be, + "Дaния"@bg, + "Danska"@bs, + "Dinamarca"@ca, + "Dánsko"@cs, + "Danmark"@da, + "Dänemark"@de, + "Δανία"@el, + "Denmark"@en, + "Dinamarca"@es, + "Taani"@et, + "Danimarka"@eu, + "Tanska"@fi, + "Danmark"@fo, + "Danemark"@fr, + "An Danmhairg"@ga, + "Dinamarca"@gl, + "Danska"@hr, + "Dánia"@hu, + "Danmörk"@is, + "Danimarca"@it, + "デンマーク"@ja, + "Dänemark"@lb, + "Danija"@lt, + "Dānija"@lv, + "Данска"@mk, + "Id-Danimarka"@mt, + "Denemarken"@nl, + "Danmark"@no, + "Dania"@pl, + "Dinamarca"@pt, + "Danemarc"@rm, + "Danemarca"@ro, + "Дания"@ru, + "Dánsko"@sk, + "Danska"@sl, + "Danimarka"@sq, + "Данска"@sr, + "Danmark"@sv, + "Danimarka"@tr, + "Данія"@uk, + "丹麦"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "NOR" ; + at:deprecated "false" ; + at:op-code "NOR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "NO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "NO" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{NOR}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "NO" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NO" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "N" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NO" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "NOR" ; + dc:identifier "NOR" ; + skos:altLabel "مملكة النرويج"@ar, + "Скандынаўскім паўвостраве"@be, + "Кралство Норвегия"@bg, + "Kraljevina Norveška"@bs, + "Regne de Noruega"@ca, + "Norské království"@cs, + "Kongeriget Norge"@da, + "Königreich Norwegen"@de, + "Βασίλειο της Νορβηγίας"@el, + "Kingdom of Norway"@en, + "Reino de Noruega"@es, + "Norra Kuningriik"@et, + "Norvegiako Erresuma"@eu, + "Norjan kunungaskunta"@fi, + "Kongsríki Noreg"@fo, + "Royaume de Norvège"@fr, + "Ríocht na hIorua"@ga, + "Reino de Noruega"@gl, + "Kraljevina Norveška"@hr, + "Norvég Királyság"@hu, + "Konungsríkið Noregur"@is, + "Repubblica di Norvegia"@it, + "ノルウェー王国"@ja, + "Kinnekräich Norwegen"@lb, + "Norvegijos Karalystė"@lt, + "Norvēģijas Karaliste"@lv, + "Кралство Норвешка"@mk, + "Ir-Renju tan-Norveġja"@mt, + "Noreg"@nb, + "Koninkrijk Noorwegen"@nl, + "Norga"@nn, + "Kongeriket Norge"@no, + "Królestwo Norwegii"@pl, + "Reino da Noruega"@pt, + "Reginavel da la Norvegia"@rm, + "Regatul Norvegiei"@ro, + "Королевство Норвегия"@ru, + "Nórske kraľovstvo"@sk, + "Kraljevina Norveška"@sl, + "Mbretëria e Norvegjisë"@sq, + "Краљевина Норвешка"@sr, + "Konungariket Norge"@sv, + "Norveç Krallığı"@tr, + "Королівство Норвегія"@uk, + "挪威王国"@zh ; + skos:hiddenLabel "Norjan kuningaskunta"@fi, + "an Iorua"@ga, + "Regno di Norvegia"@it, + "Norvegijos"@lt, + "Norvēģijas"@lv, + "in-Norveġja"@mt, + "ir-Renju tan-Norveġja"@mt, + "Nórske kráľovstvo"@sk ; + skos:inScheme atold:country, + , + , + ; + skos:narrower , + , + ; + skos:notation "132"^^euvoc:EP, + "N"^^euvoc:FD_010, + "N"^^euvoc:FD_050, + "NO"^^euvoc:FD_140, + "NO"^^euvoc:FD_160, + "N"^^euvoc:FD_400, + ".no"^^euvoc:IANA_DOMAIN, + "NO"^^euvoc:IBAN_COU, + "NO"^^euvoc:ISG_COU, + "NO"^^euvoc:ISO_3166_1_ALPHA_2, + "NOR"^^euvoc:ISO_3166_1_ALPHA_3, + "578"^^euvoc:ISO_3166_1_NUM, + "NOR"^^euvoc:NAC, + "47"^^euvoc:PHONE_PREFIX, + "NO"^^euvoc:PUB_LOC, + "{NOR}"^^euvoc:PUB_LOC, + "NO"^^euvoc:TED, + "NO"^^euvoc:TED_SCHEMA, + "N"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "578"^^euvoc:UNSD_M49 ; + skos:prefLabel "النرويج"@ar, + "Нарвегі"@be, + "Норвегия"@bg, + "Norveška"@bs, + "Noruega"@ca, + "Norsko"@cs, + "Norge"@da, + "Norwegen"@de, + "Νορβηγία"@el, + "Norway"@en, + "Noruega"@es, + "Norra"@et, + "Norvegia"@eu, + "Norja"@fi, + "Noreg"@fo, + "Norvège"@fr, + "An Iorua"@ga, + "Noruega"@gl, + "Norveška"@hr, + "Norvégia"@hu, + "Noregur"@is, + "Norvegia"@it, + "ノルウェー"@ja, + "Norwegen"@lb, + "Norvegija"@lt, + "Norvēģija"@lv, + "Норвешка"@mk, + "In-Norveġja"@mt, + "Noorwegen"@nl, + "Norge"@no, + "Norwegia"@pl, + "Noruega"@pt, + "Norvegia"@rm, + "Norvegia"@ro, + "Норвегия"@ru, + "Nórsko"@sk, + "Norveška"@sl, + "Norvegjia"@sq, + "Норвешка"@sr, + "Norge"@sv, + "Norveç"@tr, + "Норвегія"@uk, + "挪威"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "PRT" ; + at:deprecated "false" ; + at:op-code "PRT" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "PT" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:legacy-code "PT" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "PT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{PRT}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "PT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "P" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "PT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "PT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "P" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "PT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "P" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "PT" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "P" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "P" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "PT" ; + dc:source "TED" ] ; + at:protocol-order "EU-22" ; + at:protocol.order "EU-22" ; + at:protocol.ordering "EU-22" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-22" ; + atold:op-code "PRT" ; + dc:identifier "PRT" ; + skos:altLabel "الجمهورية البرتغالية"@ar, + "Рэспу́бліка Партугалія"@be, + "Португалска република"@bg, + "Republika Portugal"@bs, + "República Portuguesa"@ca, + "Portugalská republika"@cs, + "Den Portugisiske Republik"@da, + "Portugiesische Republik"@de, + "Πορτογαλική Δημοκρατία"@el, + "Portuguese Republic"@en, + "República Portuguesa"@es, + "Portugali Vabariik"@et, + "Portugalgo Errepublika"@eu, + "Portugalin tasavalta"@fi, + "Portuguesa Lýðveldið"@fo, + "République portugaise"@fr, + "Poblacht na Portaingéile"@ga, + "República Portuguesa"@gl, + "Republika Portugal"@hr, + "Portugál Köztársaság"@hu, + "Portúgalska lýðveldið"@is, + "Repubblica del Portogallo"@it, + "ポルトガル共和国"@ja, + "Portugisesch Republik"@lb, + "Portugalijos Respublika"@lt, + "Portugāles Republika"@lv, + "Португалска Република"@mk, + "Ir-Repubblika Portugiża"@mt, + "Portugese Republiek"@nl, + "Republikken Portugal"@no, + "Republika Portugalska"@pl, + "República Portuguesa"@pt, + "Republica dal Portugal"@rm, + "Republica Portugheză"@ro, + "Португальская Республика"@ru, + "Portugalská republika"@sk, + "Portugalska republika"@sl, + "Republika Portugeze"@sq, + "Португалска Република"@sr, + "Republiken Portugal"@sv, + "Portekiz Cumhuriyeti"@tr, + "Португальська Республіка"@uk, + "葡萄牙共和国"@zh ; + skos:changeNote "Portugal is ‘related to’ Azores and Madeira, 2 outermost regions OMR which have no ISO code."@en ; + skos:hiddenLabel "Португалия"@bg, + "Portugali"@et, + "Portaingéileach"@ga, + "an Phortaingéil"@ga, + "Portugalska Republika"@hr, + "Repubblica portoghese"@it, + "Portugalijos"@lt, + "Portugāles"@lv, + "il-Portugall"@mt, + "ir-Repubblika Portugiża"@mt, + "Portugese"@nl ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower , + ; + skos:notation "148"^^euvoc:EP, + "P"^^euvoc:FD_010, + "P"^^euvoc:FD_050, + "PT"^^euvoc:FD_110, + "PT"^^euvoc:FD_140, + "PT"^^euvoc:FD_160, + "P"^^euvoc:FD_290, + "P"^^euvoc:FD_361, + "PT"^^euvoc:FD_375, + "PT"^^euvoc:FD_380, + "P"^^euvoc:FD_400, + ".pt"^^euvoc:IANA_DOMAIN, + "PT"^^euvoc:IBAN_COU, + "PT"^^euvoc:ISG_COU, + "PT"^^euvoc:ISO_3166_1_ALPHA_2, + "PRT"^^euvoc:ISO_3166_1_ALPHA_3, + "620"^^euvoc:ISO_3166_1_NUM, + "PT"^^euvoc:MNE, + "PRT"^^euvoc:NAC, + "351"^^euvoc:PHONE_PREFIX, + "PT"^^euvoc:PUB_LOC, + "{PRT}"^^euvoc:PUB_LOC, + "PT"^^euvoc:TED, + "PT"^^euvoc:TED_SCHEMA, + "P"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "620"^^euvoc:UNSD_M49 ; + skos:prefLabel "البرتغال"@ar, + "Партугалія"@be, + "Пopтyгaлия"@bg, + "Portugal"@bs, + "Portugal"@ca, + "Portugalsko"@cs, + "Portugal"@da, + "Portugal"@de, + "Πορτογαλία"@el, + "Portugal"@en, + "Portugal"@es, + "Portugal"@et, + "Portugal"@eu, + "Portugali"@fi, + "Portugal"@fo, + "Portugal"@fr, + "An Phortaingéil"@ga, + "Portugal"@gl, + "Portugal"@hr, + "Portugália"@hu, + "Portúgal"@is, + "Portogallo"@it, + "ポルトガル"@ja, + "Portugal"@lb, + "Portugalija"@lt, + "Portugāle"@lv, + "Португалија"@mk, + "Il-Portugall"@mt, + "Portugal"@nl, + "Portugal"@no, + "Portugalia"@pl, + "Portugal"@pt, + "Portugal"@rm, + "Portugalia"@ro, + "Португалия"@ru, + "Portugalsko"@sk, + "Portugalska"@sl, + "Portugalia"@sq, + "Португал"@sr, + "Portugal"@sv, + "Portekiz"@tr, + "Португалія"@uk, + "葡萄牙"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "ESP" ; + at:deprecated "false" ; + at:op-code "ESP" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "ES" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "ES" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "E" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "ES" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "E" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "ES" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "ES" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "ES" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "E" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{ESP}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "E" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "ES" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "E" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "ES" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "ES" ; + dc:source "PROCAT" ] ; + at:protocol-order "EU-09" ; + at:protocol.order "EU-09" ; + at:protocol.ordering "EU-09" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-09" ; + atold:op-code "ESP" ; + dc:identifier "ESP" ; + skos:altLabel "مملكة أسبانيا"@ar, + "Каралеўства Іспанія"@be, + "Кралство Испания"@bg, + "Kraljevina Španija"@bs, + "Regne d'Espanya"@ca, + "Španělské království"@cs, + "Kongeriget Spanien"@da, + "Königreich Spanien"@de, + "Βασίλειο της Ισπανίας"@el, + "Kingdom of Spain"@en, + "Reino de España"@es, + "Hispaania Kuningriik"@et, + "Espaniako Erresuma"@eu, + "Espanjan kuningaskunta"@fi, + "Kongsríki Spania"@fo, + "Royaume d’Espagne"@fr, + "Ríocht na Spáinne"@ga, + "Reino de España"@gl, + "Kraljevina Španjolska"@hr, + "Spanyol Királyság"@hu, + "Konungsríkið Spánn"@is, + "Regno di Spagna"@it, + "スペイン王国"@ja, + "Kinnekräich Spuenien"@lb, + "Ispanijos Karalystė"@lt, + "Spānijas Karaliste"@lv, + "Кралство Шпанија"@mk, + "Ir-Renju ta’ Spanja"@mt, + "Koninkrijk Spanje"@nl, + "Kongeriket Spania"@no, + "Królestwo Hiszpanii"@pl, + "Reino de Espanha"@pt, + "Reginavel da la Spagna"@rm, + "Regatul Spaniei"@ro, + "Королевство Испания"@ru, + "Španielske kráľovstvo"@sk, + "Kraljevina Španija"@sl, + "Mbretëria Spanjolle"@sq, + "Краљевина Шпанија"@sr, + "Konungariket Spanien"@sv, + "İspanya Krallığı"@tr, + "Королівство Іспанія"@uk, + "西班牙王国"@zh ; + skos:changeNote "Closing event: long name change. Successor ‘Kingdom of Spain’ COU0019."@en, + "Opening event: long name change. Predecessor ‘State of Spain’ COU0070."@en ; + skos:hiddenLabel "Испания"@bg, + "an Spáinn"@ga, + "Ispanijos"@lt, + "Spānijas"@lv, + "ir-Renju ta' Spanja"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower , + , + ; + skos:notation "233"^^euvoc:EP, + "E"^^euvoc:FD_010, + "E"^^euvoc:FD_050, + "ES"^^euvoc:FD_110, + "ES"^^euvoc:FD_140, + "ES"^^euvoc:FD_160, + "E"^^euvoc:FD_290, + "E"^^euvoc:FD_361, + "ES"^^euvoc:FD_375, + "ES"^^euvoc:FD_380, + "E"^^euvoc:FD_400, + ".es"^^euvoc:IANA_DOMAIN, + "ES"^^euvoc:IBAN_COU, + "ES"^^euvoc:ISG_COU, + "ES"^^euvoc:ISO_3166_1_ALPHA_2, + "ESP"^^euvoc:ISO_3166_1_ALPHA_3, + "724"^^euvoc:ISO_3166_1_NUM, + "ES"^^euvoc:MNE, + "ESP"^^euvoc:NAC, + "34"^^euvoc:PHONE_PREFIX, + "ES"^^euvoc:PUB_LOC, + "{ESP}"^^euvoc:PUB_LOC, + "ES"^^euvoc:TED, + "ES"^^euvoc:TED_SCHEMA, + "E"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "724"^^euvoc:UNSD_M49 ; + skos:prefLabel "اسبانيا"@ar, + "Іспанія"@be, + "Иcпaния"@bg, + "Španija"@bs, + "Espanya"@ca, + "Španělsko"@cs, + "Spanien"@da, + "Spanien"@de, + "Ισπανία"@el, + "Spain"@en, + "España"@es, + "Hispaania"@et, + "Espainia"@eu, + "Espanja"@fi, + "Spania"@fo, + "Espagne"@fr, + "An Spáinn"@ga, + "España"@gl, + "Španjolska"@hr, + "Spanyolország"@hu, + "Spánn"@is, + "Spagna"@it, + "スペイン"@ja, + "Spuenien"@lb, + "Ispanija"@lt, + "Spānija"@lv, + "Шпанија"@mk, + "Spanja"@mt, + "Spanje"@nl, + "Spania"@no, + "Hiszpania"@pl, + "Espanha"@pt, + "Spagna"@rm, + "Spania"@ro, + "Испания"@ru, + "Španielsko"@sk, + "Španija"@sl, + "Spanja"@sq, + "Шпанија"@sr, + "Spanien"@sv, + "İspanya"@tr, + "Іспанія"@uk, + "西班牙"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "ITA" ; + at:deprecated "false" ; + at:op-code "ITA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "IT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "IT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "I" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "IT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "I" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{ITA}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "I" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "IT" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "I" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "IT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "I" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "IT" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:legacy-code "IT" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "IT" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "IT" ; + dc:source "PROCAT" ] ; + at:protocol-order "EU-12" ; + at:protocol.order "EU-12" ; + at:protocol.ordering "EU-12" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-12" ; + atold:op-code "ITA" ; + dc:identifier "ITA" ; + skos:altLabel "الجمهورية الإيطالية"@ar, + "Італьянская Рэспу́бліка"@be, + "Италианска република"@bg, + "Republika Italija"@bs, + "República Italiana"@ca, + "Italská republika"@cs, + "Den Italienske Republik"@da, + "Italienische Republik"@de, + "Ιταλική Δημοκρατία"@el, + "Italian Republic"@en, + "República Italiana"@es, + "Itaalia Vabariik"@et, + "Italiako Errepublika"@eu, + "Italian tasavalta"@fi, + "Lýðveldið Italia"@fo, + "République italienne"@fr, + "Poblacht na hIodáile"@ga, + "República Italiana"@gl, + "Talijanska Republika"@hr, + "Olasz Köztársaság"@hu, + "Ítalska lýðveldið"@is, + "Repubblica italiana"@it, + "イタリア共和国"@ja, + "Republik Italien"@lb, + "Italijos Respublika"@lt, + "Itālijas Republika"@lv, + "Република Италија"@mk, + "Ir-Repubblika Taljana"@mt, + "Italiaanse Republiek"@nl, + "Republikken Italia"@no, + "Republika Włoska"@pl, + "República Italiana"@pt, + "Republica da l’Italia"@rm, + "Republica Italiană"@ro, + "Итальянская Республика"@ru, + "Talianska republika"@sk, + "Italijanska republika"@sl, + "Republika e Italisë"@sq, + "Република Италија"@sr, + "Republiken Italien"@sv, + "İtalya Cumhuriyeti"@tr, + "Італійська Республіка"@uk, + "意大利共和国"@zh ; + skos:hiddenLabel "Италия"@bg, + "an Iodáil"@ga, + "Italijos"@lt, + "Itālija"@lv, + "Itālijas"@lv, + "ir-Repubblika Taljana"@mt, + "l-Italja"@mt ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower , + , + ; + skos:notation "213"^^euvoc:EP, + "I"^^euvoc:FD_010, + "I"^^euvoc:FD_050, + "IT"^^euvoc:FD_110, + "IT"^^euvoc:FD_140, + "IT"^^euvoc:FD_160, + "I"^^euvoc:FD_290, + "I"^^euvoc:FD_361, + "IT"^^euvoc:FD_375, + "IT"^^euvoc:FD_380, + "I"^^euvoc:FD_400, + ".it"^^euvoc:IANA_DOMAIN, + "IT"^^euvoc:IBAN_COU, + "IT"^^euvoc:ISG_COU, + "IT"^^euvoc:ISO_3166_1_ALPHA_2, + "ITA"^^euvoc:ISO_3166_1_ALPHA_3, + "380"^^euvoc:ISO_3166_1_NUM, + "IT"^^euvoc:MNE, + "ITA"^^euvoc:NAC, + "39"^^euvoc:PHONE_PREFIX, + "IT"^^euvoc:PUB_LOC, + "{ITA}"^^euvoc:PUB_LOC, + "IT"^^euvoc:TED, + "IT"^^euvoc:TED_SCHEMA, + "I"^^euvoc:TIR, + "Southern Europe"^^euvoc:UNSD_GEOSCHEME, + "380"^^euvoc:UNSD_M49 ; + skos:prefLabel "إيطاليا"@ar, + "Італія"@be, + "Итaлия"@bg, + "Italija"@bs, + "Itàlia"@ca, + "Itálie"@cs, + "Italien"@da, + "Italien"@de, + "Ιταλία"@el, + "Italy"@en, + "Italia"@es, + "Itaalia"@et, + "Italia"@eu, + "Italia"@fi, + "Italia"@fo, + "Italie"@fr, + "An Iodáil"@ga, + "Italia"@gl, + "Italija"@hr, + "Olaszország"@hu, + "Ítalía"@is, + "Italia"@it, + "イタリア"@ja, + "Italien"@lb, + "Italija"@lt, + "Itāija"@lv, + "Италија"@mk, + "L-Italja"@mt, + "Italië"@nl, + "Italia"@no, + "Włochy"@pl, + "Itália"@pt, + "Italia"@rm, + "Italia"@ro, + "Италия"@ru, + "Taliansko"@sk, + "Italija"@sl, + "Italia"@sq, + "Италија"@sr, + "Italien"@sv, + "İtalya"@tr, + "Італія"@uk, + "意大利"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "NZL" ; + at:deprecated "false" ; + at:op-code "NZL" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "NZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NZ" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "NZ" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NZ" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "NZL" ; + dc:identifier "NZL" ; + skos:altLabel "Aotearoa"@mi ; + skos:hiddenLabel "Νέας Ζηλανδίας"@el, + "an Nua-Shéalainn"@ga, + "Jaunzēlandes"@lv ; + skos:inScheme atold:country, + , + , + ; + skos:narrower , + , + , + ; + skos:notation "138"^^euvoc:EP, + "NZ"^^euvoc:FD_010, + "NZ"^^euvoc:FD_140, + ".nz"^^euvoc:IANA_DOMAIN, + "NZ"^^euvoc:ISG_COU, + "NZ"^^euvoc:ISO_3166_1_ALPHA_2, + "NZL"^^euvoc:ISO_3166_1_ALPHA_3, + "554"^^euvoc:ISO_3166_1_NUM, + "NZL"^^euvoc:NAC, + "64"^^euvoc:PHONE_PREFIX, + "NZ"^^euvoc:TED, + "NZ"^^euvoc:TED_SCHEMA, + "NZ"^^euvoc:TIR, + "Australia and New Zealand"^^euvoc:UNSD_GEOSCHEME, + "554"^^euvoc:UNSD_M49 ; + skos:prefLabel "نيوزيلندا"@ar, + "Нова Зеландия"@bg, + "Nova Zelanda"@ca, + "Nový Zéland"@cs, + "New Zealand"@da, + "Neuseeland"@de, + "Νέα Ζηλανδία"@el, + "New Zealand"@en, + "Nueva Zelanda"@es, + "Uus-Meremaa"@et, + "Uusi-Seelanti"@fi, + "Nouvelle-Zélande"@fr, + "An Nua-Shéalainn"@ga, + "Novi Zeland"@hr, + "Új-Zéland"@hu, + "Nýja-Sjáland"@is, + "Nuova Zelanda"@it, + "ニュージーランド"@ja, + "Neuseeland"@lb, + "Naujoji Zelandija"@lt, + "Jaunzēlande"@lv, + "New Zealand"@mt, + "Nieuw-Zeeland"@nl, + "Ny-Zealand"@no, + "Nowa Zelandia"@pl, + "Nova Zelândia"@pt, + "Noua Zeelandă"@ro, + "Новая Зеландия"@ru, + "Nový Zéland"@sk, + "Nova Zelandija"@sl, + "Nya Zeeland"@sv, + "Yeni Zelanda"@tr, + "Нова Зеландія"@uk, + "新西兰"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "AUS" ; + at:deprecated "false" ; + at:op-code "AUS" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "AU" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AU" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "AUS" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "AU" ; + dc:source "TED" ] ; + at:start.use "1950-05-09" ; + atold:op-code "AUS" ; + dc:identifier "AUS" ; + skos:altLabel "كومنولث استراليا"@ar, + "Австралийски съюз"@bg, + "Commonwealth d'Austràlia"@ca, + "Australské společenství"@cs, + "Forbundsstaten Australien"@da, + "Australischer Bund"@de, + "Κοινοπολιτεία της Αυστραλίας"@el, + "Commonwealth of Australia"@en, + "Commonwealth de Australia"@es, + "Austraalia Liit"@et, + "Australian yhteisö"@fi, + "Commonwealth d’Australie"@fr, + "Comhlathas na hAstráile"@ga, + "Australska Zajednica"@hr, + "Ausztrál Államszövetség"@hu, + "Samveldið Ástralía"@is, + "Commonwealth dell’Australia"@it, + "オーストラリア連邦"@ja, + "Australesche Commonwealth"@lb, + "Australijos Sandrauga"@lt, + "Austrālijas Savienība"@lv, + "Il-Commonwealth tal-Awstralja"@mt, + "Gemenebest Australië"@nl, + "Commonwealth of Australia"@no, + "Związek Australijski"@pl, + "Comunidade da Austrália"@pt, + "Uniunea Australiană"@ro, + "Содружество Австралии"@ru, + "Austrálsky zväz"@sk, + "Skupnost Avstralija"@sl, + "Samväldet Australien"@sv, + "Avustralya Federal Devleti"@tr, + "Співдружність Австралії"@uk, + "澳大利亚联邦"@zh ; + skos:hiddenLabel "Commonwealth d'Australie"@fr, + "an Astráil"@ga, + "Australijos"@lt, + "Austrālijas"@lv, + "il-Commonwealth tal-Awstralja"@mt, + "l-Awstralja"@mt ; + skos:inScheme atold:country, + , + , + ; + skos:narrower , + , + , + , + ; + skos:notation "11"^^euvoc:EP, + "AUS"^^euvoc:FD_010, + "AU"^^euvoc:FD_140, + ".au"^^euvoc:IANA_DOMAIN, + "AU"^^euvoc:ISG_COU, + "AU"^^euvoc:ISO_3166_1_ALPHA_2, + "AUS"^^euvoc:ISO_3166_1_ALPHA_3, + "036"^^euvoc:ISO_3166_1_NUM, + "AUS"^^euvoc:NAC, + "61"^^euvoc:PHONE_PREFIX, + "AU"^^euvoc:TED, + "AU"^^euvoc:TED_SCHEMA, + "AUS"^^euvoc:TIR, + "Australia and New Zealand"^^euvoc:UNSD_GEOSCHEME, + "036"^^euvoc:UNSD_M49 ; + skos:prefLabel "أستراليا"@ar, + "Австралия"@bg, + "Austràlia"@ca, + "Austrálie"@cs, + "Australien"@da, + "Australien"@de, + "Αυστραλία"@el, + "Australia"@en, + "Australia"@es, + "Austraalia"@et, + "Australia"@fi, + "Australie"@fr, + "An Astráil"@ga, + "Australija"@hr, + "Ausztrália"@hu, + "Ástralía"@is, + "Australia"@it, + "オーストラリア"@ja, + "Australien"@lb, + "Australija"@lt, + "Austrālija"@lv, + "L-Awstralja"@mt, + "Australië"@nl, + "Australia"@no, + "Australia"@pl, + "Austrália"@pt, + "Australia"@ro, + "Австралия"@ru, + "Austrália"@sk, + "Avstralija"@sl, + "Australien"@sv, + "Avustralya"@tr, + "Австралія"@uk, + "澳大利亚"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:Concept ; + at:authority-code "NLD" ; + at:deprecated "false" ; + at:op-code "NLD" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "NL" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{NLD}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NL" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "NL" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "NL" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "NL" ; + dc:source "TED" ] ; + at:protocol-order "EU-19" ; + at:protocol.order "EU-19" ; + at:protocol.ordering "EU-19" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-19" ; + atold:op-code "NLD" ; + dc:identifier "NLD" ; + skos:altLabel "مملكة هولندا"@ar, + "Каралеўства Нідэрланды"@be, + "Кралство Нидерландия"@bg, + "Холандия"@bg, + "Kraljevina Holandija"@bs, + "Regne dels Països Baixos"@ca, + "Nizozemské království"@cs, + "Kongeriget Nederlandene"@da, + "Königreich der Niederlande"@de, + "Βασίλειο των Κάτω Χωρών"@el, + "Kingdom of the Netherlands"@en, + "Reino de los Países Bajos"@es, + "Madalmaade Kuningriik"@et, + "Herbereetako Erresuma"@eu, + "Alankomaiden kuningaskunta"@fi, + "Kongsríki Niðurlond"@fo, + "Royaume des Pays-Bas"@fr, + "Ríocht na hÍsiltíre"@ga, + "Reino dos Países Baixos"@gl, + "Kraljevina Nizozemska"@hr, + "Holland Királyság"@hu, + "Konungsríki Niðurlanda"@is, + "Regno dei Paesi Bassi"@it, + "オランダ王国"@ja, + "Kinnekräich Holland"@lb, + "Nyderlandų Karalystė"@lt, + "Nīderlandes Karaliste"@lv, + "Кралство Холандија"@mk, + "Ir-Renju tan-Netherlands"@mt, + "Koninkrijk der Nederlanden"@nl, + "Kongeriket Nederland"@no, + "Królestwo Niderlandów"@pl, + "Reino dos Países Baixos"@pt, + "Reginavel dals Pajais-Bass"@rm, + "Regatul Ţărilor de Jos"@ro, + "Королевство Нидерландов"@ru, + "Holandské kráľovstvo"@sk, + "Kraljevina Nizozemska"@sl, + "Mbretëria Holandeze"@sq, + "Краљевина Холандија"@sr, + "Konungariket Nederländerna"@sv, + "Hollanda Krallığı"@tr, + "Королівство Нідерланди"@uk, + "荷兰王国"@zh ; + skos:changeNote "Source Wikipedia: From 29.12.1954 until 31.12.1985, the Kingdom of the Netherlands was constituted of two constituent countries: the Netherlands and the Netherlands Antilles. From 1.1.1986 until 9.10.2010, it was constituted of three constituent countries: the Netherlands, Aruba and the Netherlands Antilles. From 10.10.2010, the Netherlands Antilles were dissolved, resulting in two new constituent countries, Curaçao and Sint Maarten, with the other islands joining the Netherlands as ‘special municipalities’, officially public bodies."@en ; + skos:hiddenLabel "Madalmaade"@et, + "Ollannach"@ga, + "an Ísiltír"@ga, + "Nyderlandų"@lt, + "Nīderlandes"@lv, + "in-Netherlands"@mt, + "ir-Renju tan-Netherlands"@mt, + "Holandia"@pl, + "holenderskie"@pl, + "Regatul Țărilor de Jos"@ro, + "neerlandeză"@ro, + "Țările de Jos"@ro ; + skos:historyNote "Country name and adjective in Maltese corrected according to the Interinstitutional Style Guide."@en ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower , + , + , + , + ; + skos:notation "131"^^euvoc:EP, + "NL"^^euvoc:FD_010, + "NL"^^euvoc:FD_050, + "NL"^^euvoc:FD_110, + "NL"^^euvoc:FD_140, + "NL"^^euvoc:FD_160, + "NL"^^euvoc:FD_290, + "NL"^^euvoc:FD_361, + "NL"^^euvoc:FD_375, + "NL"^^euvoc:FD_380, + "NL"^^euvoc:FD_400, + ".nl"^^euvoc:IANA_DOMAIN, + "NL"^^euvoc:IBAN_COU, + "NL"^^euvoc:ISG_COU, + "NL"^^euvoc:ISO_3166_1_ALPHA_2, + "NLD"^^euvoc:ISO_3166_1_ALPHA_3, + "528"^^euvoc:ISO_3166_1_NUM, + "NL"^^euvoc:MNE, + "NLD"^^euvoc:NAC, + "31"^^euvoc:PHONE_PREFIX, + "NL"^^euvoc:PUB_LOC, + "{NLD}"^^euvoc:PUB_LOC, + "NL"^^euvoc:TED, + "NL"^^euvoc:TED_SCHEMA, + "NL"^^euvoc:TIR, + "Western Europe"^^euvoc:UNSD_GEOSCHEME, + "528"^^euvoc:UNSD_M49 ; + skos:prefLabel "هولندا"@ar, + "Нідэрланды"@be, + "Нидерландия"@bg, + "Holandija"@bs, + "Països Baixos"@ca, + "Nizozemsko"@cs, + "Nederlandene"@da, + "Niederlande"@de, + "Κάτω Χώρες"@el, + "Netherlands"@en, + "Países Bajos"@es, + "Madalmaad"@et, + "Herbehereak"@eu, + "Alankomaat"@fi, + "Niðurlond"@fo, + "Pays-Bas"@fr, + "An Ísiltír"@ga, + "Países Baixos"@gl, + "Nizozemska"@hr, + "Hollandia"@hu, + "Holland"@is, + "Paesi Bassi"@it, + "オランダ"@ja, + "Holland"@lb, + "Nyderlandai"@lt, + "Nīderlande"@lv, + "Холандија"@mk, + "In-Netherlands"@mt, + "Nederland"@nl, + "Nederland"@no, + "Niderlandy"@pl, + "Países Baixos"@pt, + "Pajais-Bass"@rm, + "Ţările de Jos"@ro, + "Нидерланды"@ru, + "Holandsko"@sk, + "Nizozemska"@sl, + "Holanda"@sq, + "Холандија"@sr, + "Nederländerna"@sv, + "Hollanda"@tr, + "Нідерланди"@uk, + "荷兰"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "OP_DATPRO" ; + at:deprecated "false" ; + at:op-code "OP_DATPRO" ; + at:start.use "1952-07-23" ; + atold:op-code "OP_DATPRO" ; + dc:identifier "OP_DATPRO" ; + skos:inScheme atold:country, + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Неокончателни данни"@bg, + "Předběžné údaje"@cs, + "Midlertidige data"@da, + "Vorläufige Daten"@de, + "Προσωρινά δεδομένα"@el, + "Provisional data"@en, + "Datos provisionales"@es, + "Esialgsed andmed"@et, + "Alustavat tiedot"@fi, + "Données provisoires"@fr, + "Sonraí sealadacha"@ga, + "Privremeni podaci"@hr, + "Ideiglenes adatok"@hu, + "Dati provvisori"@it, + "Laikinieji duomenys"@lt, + "Provizoriski dati"@lv, + "Dejta provviżorja"@mt, + "Voorlopige gegevens"@nl, + "Dane tymczasowe"@pl, + "Dados provisórios"@pt, + "Date provizorii"@ro, + "Predbežné údaje"@sk, + "Začasni podatki"@sl, + "Tillfälliga uppgifter"@sv ; + skos:topConceptOf atold:country, + , + , + , + , + , + , + , + , + . + + a skos:Concept ; + at:authority-code "USA" ; + at:deprecated "false" ; + at:op-code "USA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "USA" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "US" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "US" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:legacy-code "US" ; + dc:source "TED_SCHEMA" ] ; + at:start.use "1950-05-09" ; + atold:op-code "USA" ; + dc:identifier "USA" ; + skos:altLabel "САЩ"@bg, + "Съединени американски щати"@bg, + "Estats Units d'Amèrica"@ca, + "Spojené státy americké"@cs, + "USA"@cs, + "Amerikas Forenede Stater"@da, + "USA"@da, + "USA"@de, + "Vereinigte Staaten von Amerika"@de, + "ΗΠΑ"@el, + "Ηνωμένες Πολιτείες της Αμερικής"@el, + "US"@en, + "USA"@en, + "United States of America"@en, + "EEUU"@es, + "Estados Unidos de América"@es, + "USA"@et, + "Amerikan yhdysvallat"@fi, + "USA"@fi, + "USA"@fr, + "États-Unis d’Amérique"@fr, + "Stáit Aontaithe Mheiriceá"@ga, + "SAD"@hr, + "Sjedinjene Američke Države"@hr, + "Amerikai Egyesült Államok"@hu, + "USA"@hu, + "Bandaríki Ameríku"@is, + "Stati Uniti d’America"@it, + "Vereenegt Staate vun Amerika"@lb, + "JAV"@lt, + "Jungtinės Amerikos Valstijos"@lt, + "Amerikas Savienotās Valstis"@lv, + "L-Istati Uniti tal-Amerika"@mt, + "VS"@nl, + "Stany Zjednoczone Ameryki"@pl, + "USA"@pl, + "EUA"@pt, + "Estados Unidos da América"@pt, + "SUA"@ro, + "Statele Unite ale Americii"@ro, + "Соединённые Штаты Америки"@ru, + "Spojené štáty americké"@sk, + "USA"@sk, + "ZDA"@sl, + "Združene države Amerike"@sl, + "Amerikas förenta stater"@sv, + "USA"@sv, + "Amerika Birleşik Devletleri"@tr, + "Сполучені Штати Америки"@uk, + "美利坚合众国"@zh ; + skos:hiddenLabel "amerikanisch / der Vereinigten Staaten"@de, + "Ηνωμένων Πολιτειών της Αμερικής"@el, + "American; of the United States"@en, + "États-Unis d'Amérique"@fr, + "na Stáit Aontaithe"@ga, + "amerikai"@hu, + "Stati Uniti d'America"@it, + "Jungtinių Valstijų"@lt, + "Amerikas Savienoto Valstu"@lv, + "l-Istati Uniti"@mt, + "l-Istati Uniti tal-Amerka"@mt, + "Verenigde Staten van Amerika"@nl, + "norte-americana"@pt, + "Spojené štáty, USA"@sk ; + skos:inScheme atold:country, + , + , + ; + skos:narrower , + , + , + , + , + , + , + ; + skos:notation "186"^^euvoc:EP, + "USA"^^euvoc:FD_010, + "US"^^euvoc:FD_140, + ".us"^^euvoc:IANA_DOMAIN, + "US"^^euvoc:ISG_COU, + "US"^^euvoc:ISO_3166_1_ALPHA_2, + "USA"^^euvoc:ISO_3166_1_ALPHA_3, + "840"^^euvoc:ISO_3166_1_NUM, + "USA"^^euvoc:NAC, + "1"^^euvoc:PHONE_PREFIX, + "US"^^euvoc:TED, + "US"^^euvoc:TED_SCHEMA, + "USA"^^euvoc:TIR, + "Northern America"^^euvoc:UNSD_GEOSCHEME, + "840"^^euvoc:UNSD_M49 ; + skos:prefLabel "الولايات المتحدة الأمريكية"@ar, + "Съединени щати"@bg, + "Estats Units"@ca, + "Spojené státy"@cs, + "Forenede Stater"@da, + "Vereinigte Staaten"@de, + "Ηνωμένες Πολιτείες"@el, + "United States"@en, + "Estados Unidos"@es, + "Ameerika Ühendriigid"@et, + "Yhdysvallat"@fi, + "États-Unis"@fr, + "Na Stáit Aontaithe"@ga, + "Sjedinjene Države"@hr, + "Egyesült Államok"@hu, + "Bandaríkin"@is, + "Stati Uniti"@it, + "アメリカ合衆国"@ja, + "Vereenegt Staaten"@lb, + "Jungtinės Valstijos"@lt, + "ASV"@lv, + "L-Istati Uniti"@mt, + "Verenigde Staten"@nl, + "USA"@no, + "Stany Zjednoczone"@pl, + "Estados Unidos"@pt, + "Statele Unite"@ro, + "Соединённые Штаты"@ru, + "Spojené štáty"@sk, + "Združene države"@sl, + "Förenta staterna"@sv, + "Birleşik Devletler"@tr, + "США"@uk, + "美国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:ConceptScheme ; + rdfs:label "Outermost regions associated with EU"@en ; + at:prefLabel "Outermost regions associated with EU"@en ; + at:table.id "0007" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + ; + skos:prefLabel "Outermost regions associated with EU"@en . + + a skos:Concept ; + at:authority-code "FRA" ; + at:deprecated "false" ; + at:op-code "FRA" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "F" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{FRA}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "FR" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "FR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "FR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "F" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "F" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "F" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "FR" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "FR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "FR" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "F" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "F" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "FR" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "FR" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "FR" ; + dc:source "EurLex" ] ; + at:protocol-order "EU-10" ; + at:protocol.order "EU-10" ; + at:protocol.ordering "EU-10" ; + at:start.use "1950-05-09" ; + euvoc:order "EU-10" ; + atold:op-code "FRA" ; + dc:identifier "FRA" ; + skos:altLabel "الجمهورية الفرنسية"@ar, + "Рэспу́бліка Францыя"@be, + "Френска република"@bg, + "Republika Francuska"@bs, + "República Francesa"@ca, + "Francouzská republika"@cs, + "Den Franske Republik"@da, + "Französische Republik"@de, + "Γαλλική Δημοκρατία"@el, + "French Republic"@en, + "República Francesa"@es, + "Prantsuse Vabariik"@et, + "Frantziako Errepublika"@eu, + "Ranskan tasavalta"@fi, + "Lýðveldið Frakland"@fo, + "République française"@fr, + "Poblacht na Fraince"@ga, + "República Francesa"@gl, + "Republika Francuska"@hr, + "Francia Köztársaság"@hu, + "Franska lýðveldið"@is, + "Repubblica francese"@it, + "フランス共和国"@ja, + "Republik Frankräich"@lb, + "Prancūzijos Respublika"@lt, + "Francijas Republika"@lv, + "Република Франција"@mk, + "Ir-Repubblika Franċiża"@mt, + "Franse Republiek"@nl, + "Republikken Frankrike"@no, + "Republika Francuska"@pl, + "República Francesa"@pt, + "Republica da la Frantscha"@rm, + "Republica Franceză"@ro, + "Французская Республика"@ru, + "Francúzska republika"@sk, + "Francoska republika"@sl, + "Republika Franceze"@sq, + "Република Француска"@sr, + "Republiken Frankrike"@sv, + "Fransa Cumhuriyeti"@tr, + "Французька Республіка"@uk, + "法兰西共和国"@zh ; + skos:changeNote "Includes the former ‘FX’ ‘FXX’ used for ‘Metropolitan France’."@en, + "Inclut l’ancien ‘FX’ ‘FXX’ used for ‘Metropolitan France‘."@fr ; + skos:hiddenLabel "Франция"@bg, + "Prantsuse"@et, + "an Fhrainc"@ga, + "Francuska Republika"@hr, + "Prancūzijos"@lt, + "Francijas"@lv, + "ir-Repubblika Franċiża"@mt, + "Franța"@ro ; + skos:historyNote "ISO 3166-1 Newsletter VI-1 of 21.9.2007: Comprises Metropolitan France, French Guiana, Guadeloupe, Martinique, La Réunion, Mayotte, Saint Barthélemy, Saint Martin, Saint Pierre and Miquelon, French Polynesia, French Southern Territories, New Caledonia, Wallis and Futuna. Includes Clipperton Island."@en, + "ISO 3166-1 Newsletter VI-1 du 21.9.2007: Comprenant: France métropolitaine, Guadeloupe, Guyane, Martinique, La Réunion, Mayotte, Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon, Nouvelle-Calédonie, Polynésie française, Terres australes françaises, Wallis-et-Futuna. Y compris l’Île Clipperton."@fr ; + skos:inScheme atold:country, + , + , + , + ; + skos:narrower , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:notation "60"^^euvoc:EP, + "F"^^euvoc:FD_010, + "F"^^euvoc:FD_050, + "FR"^^euvoc:FD_110, + "FR"^^euvoc:FD_140, + "FR"^^euvoc:FD_160, + "F"^^euvoc:FD_290, + "F"^^euvoc:FD_361, + "F"^^euvoc:FD_375, + "FR"^^euvoc:FD_375, + "FR"^^euvoc:FD_380, + "F"^^euvoc:FD_400, + ".fr"^^euvoc:IANA_DOMAIN, + "FR"^^euvoc:IBAN_COU, + "FR"^^euvoc:ISG_COU, + "FR"^^euvoc:ISO_3166_1_ALPHA_2, + "FRA"^^euvoc:ISO_3166_1_ALPHA_3, + "250"^^euvoc:ISO_3166_1_NUM, + "FR"^^euvoc:MNE, + "FRA"^^euvoc:NAC, + "33"^^euvoc:PHONE_PREFIX, + "FR"^^euvoc:PUB_LOC, + "{FRA}"^^euvoc:PUB_LOC, + "FR"^^euvoc:TED, + "FR"^^euvoc:TED_SCHEMA, + "F"^^euvoc:TIR, + "Western Europe"^^euvoc:UNSD_GEOSCHEME, + "250"^^euvoc:UNSD_M49 ; + skos:prefLabel "فرنسا"@ar, + "Францыя"@be, + "Фpaнция"@bg, + "Francuska"@bs, + "França"@ca, + "Francie"@cs, + "Frankrig"@da, + "Frankreich"@de, + "Γαλλία"@el, + "France"@en, + "Francia"@es, + "Prantsusmaa"@et, + "Frantzia"@eu, + "Ranska"@fi, + "Frakland"@fo, + "France"@fr, + "An Fhrainc"@ga, + "Francia"@gl, + "Francuska"@hr, + "Franciaország"@hu, + "Frakkland"@is, + "Francia"@it, + "フランス"@ja, + "Frankräich"@lb, + "Prancūzija"@lt, + "Francija"@lv, + "Франција"@mk, + "Franza"@mt, + "Frankrijk"@nl, + "Frankrike"@no, + "Francja"@pl, + "França"@pt, + "Frantscha"@rm, + "Franţa"@ro, + "Франция"@ru, + "Francúzsko"@sk, + "Francija"@sl, + "Franca"@sq, + "Француска"@sr, + "Frankrike"@sv, + "Fransa"@tr, + "Франція"@uk, + "法国"@zh ; + skos:topConceptOf atold:country, + , + , + , + . + + a skos:Concept ; + at:authority-code "XDST" ; + at:deprecated "false" ; + at:op-code "XDST" ; + at:start.use "2023-06-14" ; + atold:op-code "XDST" ; + dc:identifier "XDST" ; + skos:inScheme atold:country ; + skos:narrower , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:notation "XDST"^^euvoc:NAC ; + skos:prefLabel "Disputed region"@en ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "XMAZ" ; + at:deprecated "false" ; + at:op-code "XMAZ" ; + at:start.use "2023-06-14" ; + atold:op-code "XMAZ" ; + dc:identifier "XMAZ" ; + skos:inScheme atold:country ; + skos:narrower , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:notation "XMAZ"^^euvoc:NAC ; + skos:prefLabel "Marine zone"@en ; + skos:topConceptOf atold:country . + + a skos:Concept ; + at:authority-code "GBR" ; + at:deprecated "false" ; + at:op-code "GBR" ; + at:op-mapped-code [ a at:MappedCode ; + at:affected-table "FD_361" ; + at:legacy-code "GB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_380" ; + at:legacy-code "UK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "UK" ; + dc:source "TED" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "UK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:legacy-code "UK" ; + dc:source "TED_SCHEMA" ], + [ a at:MappedCode ; + at:affected-table "VOLET_MNE" ; + at:legacy-code "UK" ; + dc:source "PROCAT" ], + [ a at:MappedCode ; + at:affected-table "FD_050" ; + at:legacy-code "GB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_110" ; + at:legacy-code "UK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "{GBR}" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_400" ; + at:legacy-code "GB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_290" ; + at:legacy-code "GB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_140" ; + at:legacy-code "UK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_160" ; + at:legacy-code "UK" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "PUB_LOC" ; + at:legacy-code "UK" ; + dc:source "PUB" ], + [ a at:MappedCode ; + at:affected-table "FD_010" ; + at:legacy-code "GB" ; + dc:source "EurLex" ], + [ a at:MappedCode ; + at:affected-table "FD_375" ; + at:legacy-code "GB" ; + dc:source "EurLex" ] ; + at:start.use "1950-05-09" ; + atold:op-code "GBR" ; + dc:identifier "GBR" ; + skos:altLabel "المملكة المتحدة لبريطانيا العظمى و أيرلندا الشمالية"@ar, + "Злучанае Каралеўства Вялікабрытаніі і Паўночнай Ірландыі"@be, + "Обединено кралство Великобритания и Северна Ирландия"@bg, + "Ujedinjeno Kraljevstvo Velike Britanije i Sjeverne Irske"@bs, + "Regne Unit de la Gran Bretanya i Irlanda del Nord"@ca, + "Spojené království Velké Británie a Severního Irska"@cs, + "Det Forenede Kongerige Storbritannien og Nordirland"@da, + "Vereinigtes Königreich Großbritanien und Nordirland"@de, + "Ηνωμένο Βασίλειο της Μεγάλης Βρετανίας και της Βόρειας Ιρλανδίας"@el, + "UK"@en, + "United Kingdom of Great Britain and Northern Ireland"@en, + "Reino Unido de Gran Bretaña e Irlanda del Norte"@es, + "Suurbritannia ja Põhja-Iiri Ühendkuningriik"@et, + "ÜK"@et, + "Britainia Handiko eta Ipar Iralndako Erresuma Batu"@eu, + "Ison-Britannian ja Pohjois-Irlannin yhdistynyt kuningaskunta"@fi, + "Hitt Sameinada Kongsríki Bretlands og Norðurírlands"@fo, + "Royaume-Uni de Grande-Bretagne et d’Irlande du Nord"@fr, + "RA"@ga, + "Ríocht Aontaithe na Breataine Móire agus Thuaisceart Éireann"@ga, + "Reino Unido da Gran Bretaña e Irlanda do Norte"@gl, + "Ujedinjena Kraljevina Velike Britanije i Sjeverne Irske"@hr, + "Nagy-Britannia és Észak-Írország Egyesült Királysága"@hu, + "Sameinaða konungsríkið Stóra-Bretland og Norður-Írland"@is, + "Regno Unito di Gran Bretagna e Irlanda del Nord"@it, + "グレートブリテン及びアイルランド連合王国"@ja, + "Vereenegt Kinnekräich vu Groussbritannien an Nordirland"@lb, + "Jungtinė Didžiosios Britanijos ir Šiaurės Airijos Karalystė"@lt, + "Lielbritānijas un Ziemeļīrijas Apvienotā Karaliste"@lv, + "Обединето Кралство на Велика Британија и Северна Ирска"@mk, + "Ir-Renju Unit tal-Gran Brittanja u l-Irlanda ta’ Fuq"@mt, + "Verenigd Koninkrijk van Groot-Brittannië en Noord-Ierland"@nl, + "Storbritannia og Nord-Irland"@no, + "Zjednoczone Królestwo Wielkiej Brytanii i Irlandii Północnej"@pl, + "Reino Unido da Grã-Bretanha e da Irlanda do Norte"@pt, + "Reginavel Unì da la Gronda Britannia ed Irlanda dal Nord"@rm, + "Regatul Unit al Marii Britanii şi Irlandei de Nord"@ro, + "Соединённое Королевство Великобритании и Северной Ирландии"@ru, + "Spojené kráľovstvo Veľkej Británie a Severného Írska"@sk, + "Združeno kraljestvo Velike Britanije in Severne Irske"@sl, + "Mbretëria e Bashkuar e Britanisë së Madhe dhe Irlandës Veriore"@sq, + "Уједињено Краљевство Велике Британије и Северне Ирске"@sr, + "Förenade konungariket Storbritannien och Nordirland"@sv, + "Büyük Britanya ve Kuzey İrlanda Birleşik Krallığı"@tr, + "Сполучене Королівство Великої Британії та Північної Ірландії"@uk, + "大不列颠及北爱尔兰联合王国"@zh ; + skos:hiddenLabel "Vereinigtes Königreich Großbritannien und Nordirland"@de, + "Ühendkuningriigi"@et, + "britti"@fi, + "an Ríocht Aontaithe"@ga, + "brit"@hu, + "Jungtinės Karalystės"@lt, + "Brittanika"@mt, + "ir-Renju Unit"@mt, + "ir-Renju Unit tal-Gran Brittanja u l-Irlanda ta' Fuq"@mt, + "Wielka Brytania"@pl, + "Regatul Unit al Marii Britanii și al Irlandei de Nord"@ro, + "britanică/din Marea Britanie"@ro ; + skos:historyNote "Slovene entries have been aligned with the latest Slovene standard (KSZI 2023) and the Interinstitutional Style Guide and IATE."@en, + "The Interinstitutional Style Guide generally uses the code ISO 3166 alpha-2 see element ‘code-3166-1-alpha-2’, except for United Kingdom where it uses ‘UK’ instead of ‘GB’ see element ‘op-styleguide’."@en, + "The country membership classification was updated due to the withdrawal of the United Kingdom from the European Union."@en, + "Le code de rédaction interinstitutionnel utilise généralement le code ISO 3166 alpha-2 voir élément «code-3166-1-alpha-2», sauf pour le Royaume-Uni où il utilise le code «UK» au lieu du code «GB» voir élément «op-styleguide»."@fr ; + skos:inScheme atold:country, + , + , + ; + skos:narrower , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:notation "62"^^euvoc:EP, + "GB"^^euvoc:FD_010, + "GB"^^euvoc:FD_050, + "UK"^^euvoc:FD_110, + "UK"^^euvoc:FD_140, + "UK"^^euvoc:FD_160, + "GB"^^euvoc:FD_290, + "GB"^^euvoc:FD_361, + "GB"^^euvoc:FD_375, + "UK"^^euvoc:FD_375, + "UK"^^euvoc:FD_380, + "GB"^^euvoc:FD_400, + ".gb"^^euvoc:IANA_DOMAIN, + "GB"^^euvoc:IBAN_COU, + "UK"^^euvoc:ISG_COU, + "GB"^^euvoc:ISO_3166_1_ALPHA_2, + "GBR"^^euvoc:ISO_3166_1_ALPHA_3, + "826"^^euvoc:ISO_3166_1_NUM, + "UK"^^euvoc:MNE, + "GBR"^^euvoc:NAC, + "44"^^euvoc:PHONE_PREFIX, + "UK"^^euvoc:PUB_LOC, + "{GBR}"^^euvoc:PUB_LOC, + "UK"^^euvoc:TED, + "UK"^^euvoc:TED_SCHEMA, + "GB"^^euvoc:TIR, + "Northern Europe"^^euvoc:UNSD_GEOSCHEME, + "826"^^euvoc:UNSD_M49 ; + skos:prefLabel "المملكة المتحدة"@ar, + "Вялікабрытанія"@be, + "Обединено кралство"@bg, + "Ujedinjeno Kraljevstvo"@bs, + "Regne Unit"@ca, + "Spojené království"@cs, + "Det Forenede Kongerige"@da, + "Vereinigtes Königreich"@de, + "Ηνωμένο Βασίλειο"@el, + "United Kingdom"@en, + "Reino Unido"@es, + "Ühendkuningriik"@et, + "Erresuma Batu"@eu, + "Yhdistynyt kuningaskunta"@fi, + "Stóra Bretland"@fo, + "Royaume-Uni"@fr, + "An Ríocht Aontaithe"@ga, + "Reino Unido"@gl, + "Ujedinjena Kraljevina"@hr, + "Egyesült Királyság"@hu, + "Bretland"@is, + "Regno Unito"@it, + "イギリス"@ja, + "Groussbritannien"@lb, + "Jungtinė Karalystė"@lt, + "Apvienotā Karaliste"@lv, + "Обединето кралство"@mk, + "Ir-Renju Unit"@mt, + "Verenigd Koninkrijk"@nl, + "Storbritannia"@no, + "Zjednoczone Królestwo"@pl, + "Reino Unido"@pt, + "Reginavel Unì"@rm, + "Regatul Unit"@ro, + "Соединённое Королевство"@ru, + "Spojené kráľovstvo"@sk, + "Združeno kraljestvo"@sl, + "Britania e Madhe"@sq, + "Уједињено Краљевство"@sr, + "Förenade kungariket"@sv, + "Birleşik Krallık"@tr, + "Сполучене Королівство"@uk, + "英国"@zh ; + skos:topConceptOf atold:country, + , + , + . + + a skos:ConceptScheme ; + rdfs:label "Marine areas"@en ; + at:prefLabel "Marine areas"@en ; + at:table.id "0002" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Marine areas"@en . + + a skos:ConceptScheme ; + rdfs:label "Disputed territories"@en ; + at:prefLabel "Disputed territories"@en ; + at:table.id "0004" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Disputed territories"@en . + + a skos:ConceptScheme ; + rdfs:label "Current EU members"@en ; + at:prefLabel "Current EU members"@en ; + at:table.id "0005" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Current EU members"@en . + + a skos:ConceptScheme ; + rdfs:label "Overseas countries and territories"@en ; + at:prefLabel "Overseas countries and territories"@en ; + at:table.id "0006" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Overseas countries and territories"@en . + + a skos:ConceptScheme ; + rdfs:label "Territories"@en ; + at:prefLabel "Territories"@en ; + at:table.id "0003" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Territories"@en . + + a skos:ConceptScheme ; + rdfs:label "Current UN members"@en ; + at:prefLabel "Current UN members"@en ; + at:table.id "0009" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Current UN members"@en . + + a skos:ConceptScheme ; + rdfs:label "Current countries and territories issuing citizenship"@en ; + at:prefLabel "Current countries and territories issuing citizenship"@en ; + at:table.id "0001" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Current countries and territories issuing citizenship"@en . + + a skos:ConceptScheme ; + rdfs:label "Current countries and territories of birth"@en ; + at:prefLabel "Current countries and territories of birth"@en ; + at:table.id "0008" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Current countries and territories of birth"@en . + +atold:country a skos:ConceptScheme ; + rdfs:label "Countries and territories"@en ; + at:prefLabel "Countries and territories"@en ; + at:table.id "country" ; + at:table.version.number "20250319-0" ; + owl:versionInfo "20250319-0" ; + skos:hasTopConcept , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + skos:prefLabel "Countries and territories"@en . diff --git a/sparql-101/notebooks/sample.ttl b/sparql-101/notebooks/sample.ttl new file mode 100644 index 0000000..4448431 --- /dev/null +++ b/sparql-101/notebooks/sample.ttl @@ -0,0 +1,35 @@ +# +# Turtle file with a simple FOAF example. +# +@prefix foaf: . + + a foaf:Person ; + foaf:name "Roberto" ; + foaf:mbox ; + foaf:knows , + +. + + a foaf:Person ; + foaf:name "Jon" ; + foaf:mbox ; + foaf:knows +. + + a foaf:Person ; + foaf:name "Danilo" ; + foaf:mbox ; + foaf:knows +. + + a foaf:Person ; + foaf:name "Moin" ; + foaf:mbox ; + foaf:knows +. + + + a foaf:Person ; + foaf:name "Hermit" ; + foaf:mbox +. diff --git a/sparql-101/notebooks/simpsons.ttl b/sparql-101/notebooks/simpsons.ttl new file mode 100644 index 0000000..a33c122 --- /dev/null +++ b/sparql-101/notebooks/simpsons.ttl @@ -0,0 +1,15 @@ +# I simpsons. + +@prefix : . +@prefix schema: . + +:Homer a schema:Person . +:Homer schema:givenName "Homer" . +:Homer schema:familyName "Simpsons" . +:Homer schema:spouse :Marge . + +:Marge a schema:Person . +:Marge schema:givenName "Marge" . +:Marge schema:familyName "Simpsons" . +:Marge schema:children :Bart . +:Marge schema:children :Lisa . diff --git a/sparql-101/notebooks/tools.py b/sparql-101/notebooks/tools.py index 44584d7..f14557e 100644 --- a/sparql-101/notebooks/tools.py +++ b/sparql-101/notebooks/tools.py @@ -48,6 +48,8 @@ def plot_graph( for x in g: if pattern and not pattern.match(str(x[2])): continue + if x[1] == label_property: + continue f.add(x) count += 1 if limit and count > limit: diff --git a/sparql-101/requirements.txt b/sparql-101/requirements.txt new file mode 100644 index 0000000..ef50a3d --- /dev/null +++ b/sparql-101/requirements.txt @@ -0,0 +1,9 @@ +bokeh +ipython +jupyter +matplotlib +networkx +oxrdflib +pandas +rdflib +scipy diff --git a/sparql-101/tox.ini b/sparql-101/tox.ini index cee54b2..67ddfd4 100644 --- a/sparql-101/tox.ini +++ b/sparql-101/tox.ini @@ -3,7 +3,9 @@ envlist = py3 skipsdist = True [testenv] +# XXX: Update notedown so we don't need setuptools. deps = + setuptools git+https://github.com/ioggstream/notedown allowlist_externals = make From 1aed9fff62a97383ca9e4568cd208eb8c80e10ac Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Sun, 25 May 2025 18:16:32 +0200 Subject: [PATCH 45/52] Fix: #92. Move enrichment to sparql (#93) * Fix: #92. Move enrich to sparql. --- sparql-101/01-knowledge.md | 127 +++- sparql-101/02-semantics.md | 198 +++--- sparql-101/05-sparql.md | 282 ++++++++- sparql-101/07-jsonld.md | 2 +- sparql-101/10-rdf.md | 50 +- sparql-101/12-enriching-data.md | 17 +- ...tax-semantic.md => _09-syntax-semantic.md} | 2 +- sparql-101/notebooks/00-jupyter-intro.ipynb | 28 +- sparql-101/notebooks/00-teaser.ipynb | 76 +-- sparql-101/notebooks/01-knowledge.ipynb | 358 +++++++---- sparql-101/notebooks/02-semantics.ipynb | 372 ++++++------ sparql-101/notebooks/05-sparql.ipynb | 567 +++++++++++++++--- sparql-101/notebooks/07-jsonld.ipynb | 74 +-- sparql-101/notebooks/09-syntax-semantic.ipynb | 405 ------------- sparql-101/notebooks/10-rdf.ipynb | 161 +---- sparql-101/notebooks/11-sparql-metadata.ipynb | 54 +- sparql-101/notebooks/12-enriching-data.ipynb | 58 +- sparql-101/notebooks/d3fend.ttl | 6 +- sparql-101/notebooks/simpsons.ttl | 33 +- 19 files changed, 1650 insertions(+), 1220 deletions(-) rename sparql-101/{09-syntax-semantic.md => _09-syntax-semantic.md} (99%) delete mode 100644 sparql-101/notebooks/09-syntax-semantic.ipynb diff --git a/sparql-101/01-knowledge.md b/sparql-101/01-knowledge.md index 30859c1..6d2eb40 100644 --- a/sparql-101/01-knowledge.md +++ b/sparql-101/01-knowledge.md @@ -112,7 +112,7 @@ monty_python -->|is a| comedy_group[comedy group] There are various encyclopedias on the web, such as Wikipedia and dbpedia. -##### Exercise: web encyclopedias +💪 Exercise: web encyclopedias 1. open the "Python" page on dbpedia: @@ -202,7 +202,9 @@ But it is also the basis of the Web itself Encyclopedia voices on Wikipedia and dbpedia are expressed in [Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/). -It is a W3C formal language to represent knowledge in a machine-readable format +It is a W3C formal language to +represent knowledge on the web +in a machine-readable format using triples subject-predicate-object. RDF has different serialization formats, @@ -211,11 +213,9 @@ such as [Turtle](https://www.w3.org/TR/turtle/), and [XML](https://www.w3.org/TR/rdf-syntax-grammar/). We'll use the Turtle format in this course, -where a sentence is expressed as a +where a sentence is expressed as a tripe: -```raw -subject predicate object . -``` +`subject predicate object .` :exclamation: note the dot at the end of the sentence :exclamation: @@ -223,16 +223,74 @@ subject predicate object . ## RDF: Machine Readable Knowledge -Subjects and predicates are uniquely identified by [URIs](https://www.w3.org/TR/rdf11-concepts/#section-uris). +RDF uses [URIs](https://www.w3.org/TR/rdf11-concepts/#section-uris) +to disambiguate the meaning of terms and provide semantics. + +Every term is identified by an absolute URI enclosed by `<>`. + +The prefix identifies the source of the term definition +(that we'll call **vocabulary**), +and the suffix identifies the term. + +```python +from rdflib import URIRef +dog_uri = URIRef("https://dbpedia.org/data/Dog") +print(dog_uri.n3()) +``` + +RDF is based on: + +- **elements** (IRIs, blank nodes and literals); +- **triples** (subject-predicate-object); +- **graphs** (sets of triples). +- **vocabularies** (graphs containing terms and their definitions). + +### Elements + +Subjects and predicates are uniquely identified by URIs. Objects can be either URIs or literals (strings, numbers, dates, etc.). -URIs provide a definition context for subjects and predicates, -and allow to disambiguate their meaning depending on the -definition provided by a given vocabulary. +```python +from rdflib import URIRef, Literal, BNode + +iri = URIRef("mailto:mr@test") +predicate_iri = URIRef("https://schema.org/name") +blank_node = BNode("anon") +literal = Literal("Mario Rossi") + +# Serialize in the N3 format +# (Notation 3 is a compact, human-readable format for RDF) +print(iri.n3(), blank_node.n3(), literal.n3(), sep="\n") +``` -Every term is identified by an absolute URI -enclosed by `<>`. +#### Exercise: RDF elements + +In the cell below, create a literal with the following values +and look at its [Notation 3 (N3)](https://www.w3.org/TeamSubmission/n3/) serialization. + +- `42` (integer), `42.0` (float), `"42"` (string); +- `datetime.now()` (date); + +```python +from datetime import datetime +... +for value in (42, 42.0, "42", datetime.now()): + literal = Literal(value) + print(literal.n3()) +``` + +### Triples + +A triple represents a statement about a resource; +remember: the second element is the predicate! + +```python +triple = (iri, predicate_iri, literal) +print(triple) +``` + +Another triple serialized in the N3 format: ```python sentences = """ @@ -240,19 +298,47 @@ sentences = """ """ ``` ----- +The `a` keyword is a shorthand for the `rdf:type` predicate, +which is used to indicate the type of a resource. -Let's parse our first RDF sentence using the [rdflib](https://rdflib.readthedocs.io/en/stable/) library. +The following statements are equivalent: + +```python +# Serialized on multiple lines... +same_sentences = """ + + + +. +""" +``` + +### Graphs + +A graph is a set of triples. ```python from rdflib import Graph +g = Graph() +g.add(triple) +print(g.serialize(format="turtle")) +``` +---- + +```python +# Create a new graph and parse the above sentences. g = Graph() g.parse(data=sentences, format="turtle") print(*g, sep="\n") ``` +💪 Exercise: parse sentences + +Parse the `same_sentences` variable +and check the content of the graph. + ---- We can also represent the same sentence in JSON-LD. @@ -262,13 +348,13 @@ json_text = g.serialize(format="application/ld+json") print(json_text) ``` -##### Exercise: take 2 minutes to map the JSON-LD format to the Turtle format. +💪 Exercise: take 2 minutes to map the JSON-LD format to the Turtle format. We'll see JSON-LD in detail later. --- -## RDF: Namespaces and cURIe +## Graphs: Namespaces and cURIe RDF use namespace prefixes to shorten URIs (the [cURIe](https://www.w3.org/TR/curie/) syntax). @@ -434,8 +520,8 @@ print(_type) ``` ```python -from tools import plot_graph -plot_graph(g, limit=30) +import tools +tools.plot_graph(g, limit=30) ``` #### Exercise: extending graphs @@ -451,7 +537,7 @@ tortellini_n3 = Path("Tortellini.n3") g = Graph() g.parse(tortellini_n3, format="n3") -plot_graph(g, limit=30, pattern=".*/dbpedia.org") +tools.plot_graph(g, limit=30, pattern=".*/dbpedia.org") ``` And we can connect them together @@ -473,5 +559,6 @@ Plot the graph again to see the new nodes and their relations. ```python -plot_graph(g, label_property=RDFS.label, limit=50, pattern=".*/dbpedia.org") +import tools +tools.plot_graph(g, label_property=RDFS.label, limit=50, pattern=".*/dbpedia.org") ``` diff --git a/sparql-101/02-semantics.md b/sparql-101/02-semantics.md index 5e236c0..e658d21 100644 --- a/sparql-101/02-semantics.md +++ b/sparql-101/02-semantics.md @@ -96,74 +96,14 @@ relatives: --- -## Vocabularies to the rescue: Controlled vocabularies - -Controlled Vocabularies use URIs to disambiguate the meaning of terms and provide semantics. - -Every term is identified by an absolute URI. - -The prefix identifies the vocabulary name, -and the suffix identifies the term. - -```python -from rdflib import URIRef -dog_uri = URIRef("https://dbpedia.org/data/Dog") -``` - ## Vocabularies to the rescue: RDF -RDF: Resource Description Framework - -It allows to represent information on the web based on: +RDF (Resource Description Framework) is a standard for representing information about resources in the web. +See [01-knowledge.ipynb](01-knowledge.ipynb). -- **elements** (IRIs, blank nodes and literals); +Vocabularies contain a set of terms (IRIs) and their relationships +that can be used to describe the meaning of data. -```python -from rdflib import URIRef, Literal, BNode - -iri = URIRef("mailto:mr@test") -iri2 = URIRef("https://schema.org/name") -blank_node = BNode("anon") -literal = Literal("Mario Rossi") - -# Serialize in the N3 format -# (Notation 3 is a compact, human-readable format for RDF) -print(iri.n3(), blank_node.n3(), literal.n3(), sep="\n") -``` - -Exercise: RDF elements - -In the cell below, create a literal with the following values -and look at its [Notation 3 (N3)](https://www.w3.org/TeamSubmission/n3/) serialization. - -- `42` (integer), `42.0` (float), `"42"` (string); -- `datetime.now()` (date); - -```python -from datetime import datetime -... -for value in (42, 42.0, "42", datetime.now()): - literal = Literal(value) - print(literal.n3()) -``` - -- **triples** (subject-predicate-object); - -```python -triple = (iri, iri2, literal) -print(triple) -``` - -- **graphs** (sets of triples). - -```python -from rdflib import Graph -g = Graph() -g.add(triple) -print(g.serialize(format="turtle")) -``` - -and on **vocabularies** of elements identified by IRIs and namespaces. ---- @@ -172,29 +112,39 @@ An RDF dataset is a set of **graphs**. ```mermaid graph LR +classDef pad fill:none,stroke:none; + subgraph Dataset - subgraph Graph1["Graph <https\://example.org/graph1>"] + subgraph Graph1["Graph
<https\://example.org/graph1>"] + subgraph p1[ ] t1[ subject predicate object . subject predicate object . subject predicate object . ] + end end - subgraph Graph2[Graph <urn:example:graph2>] + subgraph Graph2[Graph
<urn:example:graph2>] + subgraph p2[ ] t2[ subject predicate object . subject predicate object . subject predicate object . ] end - subgraph Graph3[Graph <_:anonymous_graph>] + end + subgraph Graph3[Graph
<_:anonymous_graph>] + subgraph p3[ ] t3[ subject predicate object . subject predicate object . subject predicate object . ] end + end end + +class p1,p2,p3 pad; ``` ```python @@ -210,7 +160,7 @@ d = Dataset() - add a graph to the dataset. ```python -simpsons = d.graph(identifier="urn:example:simpsons") +simpsons = d.graph(identifier="_:simpsons") simpsons.parse("simpsons.ttl", format="turtle") ``` @@ -224,6 +174,16 @@ simpsons.parse("simpsons.ttl", format="turtle") + +Now list the graphs in the dataset: +note that the default graph does not contain triples. + +```python +print( + {k.identifier.n3(): len(k) for k in d.graphs()} +) +``` + ---- To semantically standardize data, services and their content, @@ -253,7 +213,7 @@ sentences = """ """ # Create a new named graph in the dataset. -g = d.graph(identifier="urn:my_dbpedia") +g = d.graph(identifier="_:my_dbpedia") ... ``` @@ -266,7 +226,8 @@ g = d.graph(identifier="urn:my_dbpedia") # Deduplicate subjects using set() subjects = set( ... ) objects = set( ... ) -print(subjects | objects) +items = subjects | objects +print(*items, sep="\n") ``` - what's the namespace of the `Tortellini` URI? @@ -279,12 +240,15 @@ print(subjects | objects) Ontologies are used to standardize the semantics of digital content. -- **Ontology**: an ontology is a set of logical axioms that conceptualize a domain of interest by defining concepts and the semantics of relationships between them. +- **Ontology**: a set of logical axioms + that conceptualize a domain of interest + by defining concepts (e.g., a `Person`) + and the semantics of relationships (e.g., `isParentOf`) between them. Example: the Italian ontology for person defines: - the concept of person; -- its properties (e.g., givenName, familyName, hasChildren); +- its properties (e.g., givenName, familyName, isParentOf); - the range of each property (e.g., string, date, person); - the domain of each property (e.g., person, organization, place); - See also . @@ -296,22 +260,28 @@ subgraph CPV["CPV Ontology"] Person familyName([familyName]) givenName([givenName]) - hasChildren([hasChildren]) + isParentOf([isParentOf]) + + givenName_description>"The given name of a person. E.g. 'Mario' is the given name of the person 'Mario Rossi'."] + isParentOf_description>"Has a parental relationship with."] end subgraph xsd[XMLSchema] xsd:string end -givenName & familyName & hasChildren -.-o|domain| Person +givenName_description -.-|description| givenName +isParentOf_description +-.-|description| +isParentOf +givenName & familyName & isParentOf -.-o|domain| Person familyName & givenName ---->|range| xsd:string -hasChildren -->|range| Person +isParentOf -->|range| Person ``` - - **Controlled vocabulary**: a vocabulary where the terms are validated by a designated authority. It can be of different types - e.g., a list (codelist), a hierarchical structure (taxonomy), a glossary and a thesaurus (which adds further constraints to a taxonomy). @@ -319,13 +289,64 @@ Examples of European controlled vocabularies are here . +@prefix ex: . + +# The ex:Person Resource classifies a group of Resources. +ex:Person rdf:type rdfs:Class . + +# ex:Alive classifies a group of ex:Person +ex:Alive rdf:type rdfs:Class ; + rdfs:subClassOf ex:Person ; + . + +ex:givenName rdf:type rdf:Property ; + rdfs:domain ex:Person ; + rdfs:range xsd:string ; + +``` + +You can see vocabularies as a set of globally unique labels +that can be used to describe data in a standardized way. + +These labels may or may not overlap (e.g., I can use labels +from different vocabularies to describe the same data), +like in the following example: + +```raw +@prefix ex: . + +ex:Person a rdfs:Class ; + # Using RDFS vocabulary... + rdfs:label "Person"@en, "Persona"@it ; + rdfs:comment "A human being."@en, "Un essere umano."@it ; + + # Using SKOS vocabulary... + a skos:Concept ; + skos:prefLabel "Person"@en, "Persona"@it ; + skos:definition "A human being."@en, "Un essere umano."@it +. +``` + ## Ontologies in Italy -In Italy, there's , a National Data Catalog for Semantic Interoperatbility -containing the official ontology for person -(Common Person Vocabulary) that we can use to uniquely describe someone. +In Italy, is the National Data Catalog for Semantic Interoperability. -```text +It contains Controlled Vocabularies and Ontologies, +including the Italian Ontology for Person (CPV), +that we can use to uniquely describe someone. + +```raw @prefix CPV: . @@ -344,6 +365,9 @@ from rdflib import Graph sentences = """ @prefix xsd: . @prefix dct: . +@prefix rdfs: . +@prefix owl: . + dct:modified "2020-04-27"^^xsd:date ; @@ -351,10 +375,18 @@ sentences = """ dct:title "Person Ontology"@en, "Ontologia delle persone"@it . + + a rdfs:Class ; + rdfs:isDefinedBy ; + rdfs:comment "An individual human being .."@en . + # An ontology defines the meaning of predicates. + a owl:DatatypeProperty ; + rdfs:isDefinedBy ; rdfs:comment "The given name of a person. E.g. 'Mario' is the given name of the person 'Mario Rossi'."@en ; rdfs:label "given name"@en ; + rdfs:domain ; rdfs:range xsd:string . """ @@ -366,3 +398,9 @@ sentences = """ Exercise: how many triples are in the graph? + +```python +import tools + +tools.plot_graph(g) +``` diff --git a/sparql-101/05-sparql.md b/sparql-101/05-sparql.md index a1f7004..c6f3d2e 100644 --- a/sparql-101/05-sparql.md +++ b/sparql-101/05-sparql.md @@ -3,6 +3,11 @@ ## Agenda - Storing and retrieving triples +- Using the `rdflib.Dataset` class +- A dataset with multiple graphs +- Querying graphs +- Enriching graphs with UPDATE +- Traversing graphs with SparQL (`*` and `/` modifiers) *Beware*: commands contain small typos. You must fix them to properly complete the course! @@ -18,47 +23,92 @@ Prerequisites: ## Querying graphs with SparQL -An RDF graph is an (unordered) set of triples. +A triple consists of a $(subject, predicate, object)$. -Each triple consists of a `subject`, `predicate`, `object`. +An RDF graph is an (unordered) set of triples: -SparQL is a query language for RDF graphs. +$G = \{(s_1, p_1, o_1), (s_2, p_2, o_2), \ldots\}$. + +An RDF dataset is a collection of graphs, including a $default$ graph. + +$D = \{G_{default}, G_1, \ldots\}$. + +$ Resources < Triples < Graph < Dataset $ + +SparQL is a query language for RDF datasets and graphs. + +This lesson provides a non-exhaustive introduction to SparQL. + +See: https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.html#dataset + +```python +from rdflib import Dataset +d = Dataset() +``` + +Exercise: list the graphs in the dataset. ---- A sparql query retrieves all entries -matching one or more sentences +matching one or more sentences. -```raw -SELECT * +```python +q = """SELECT * WHERE { ?subject ?predicate ?object . # ... more sentences ... } +""" + +# The Dataset is still empty :) +d.query(q).bindings ``` -This workshop provides a non-exhaustive introduction to SparQL. + ---- + + +### Sparql: adding graphs: _:sample + Open [sample.ttl](sample.ttl) in another tab and see its content. +Now load into the dataset +creating a new graph. + ```python -from rdflib import Graph -g = Graph() +# Create hte _:sample graph +g = d.graph("_:sample") + +# Add triples from sample.ttl g.parse("sample.ttl", format="text/turtle") ``` Use our utility function to print the graph. ```python -from tools import plot_graph -plot_graph(g, label_property=FOAF.name) +from rdflib import FOAF +import tools +tools.plot_graph(g, label_property=FOAF.name) ``` +That's what we have + +```mermaid +graph -List all entries +subgraph d["d"] + def_graph[("default graph")] + g_graph[("_:sample")] +end + +g[[g variable]] -->|references| g_graph +``` + +List all entries from th `_:sample` graph. ```python q = """ @@ -76,6 +126,8 @@ Exercise: - Remove the `LIMIT` clause. How many triples are in the graph? +- Replace the `*` with `?subject ?predicate ?object`. + What happens? ```python # Use this cell for the exercise. @@ -89,17 +141,149 @@ for r in result: - Replace `?subject` with `?foo`: what happens? +### Serializing datasets + +The [Trig](https://www.w3.org/TR/2013/REC-trig-20130321/) format +extends Turtle to support multiple graphs. + +```python +# Serialize the dataset in Trig format +print(d.serialize(format="trig")) +``` + + + +### Sparql: querying graphs: _:simpsons + +Let's add another graph to the dataset. + +```python +simpsons = d.graph("_:simpsons") +simpsons.parse("simpsons.ttl", format="text/turtle") +``` + +That's what we have + +```mermaid +graph + +subgraph d["d"] + def_graph[("default graph")] + g_graph[("_:sample")] + simpsons_graph[("_:simpsons")] +end + +g[[g variable]] -->|references| g_graph +simpsons[[simpsons variable]] -->|references| simpsons_graph +``` + +Now use the extended syntax with the `GRAPH` keyword. + +```python +q = """ +SELECT * +WHERE { + GRAPH ?g {} +} +""" +result = d.query(q) +{str(r.g): len(r) for r in result} +``` + +Query the classes used in the dataset. + +```python +q = """ +SELECT DISTINCT + ?g ?Class +WHERE { + GRAPH ?g { + [] a ?Class . + } +} +""" +result = d.query(q) +list(result) +``` + +Exercise: + +- replace `?g` with `_:sample`: + what happens? + + ---- +### Enriching graphs: UPDATE + +The SparQL `UPDATE` command allows to modify a graph. +See https://www.w3.org/TR/sparql11-update/ + + +```python +q = """ +PREFIX schema: + +INSERT { + # Insert a new triple + ?s schema:name ?name . +} +WHERE { + # Match existing triples + ?s a schema:Person ; + schema:givenName ?givenName ; + schema:familyName ?familyName . + + # Create a new variable + # that concatenates the givenName and familyName + # into a single name. + BIND(CONCAT(?givenName, " ", ?familyName) AS ?name) +} +""" + +result = simpsons.update(q) +``` + +💪: check the graph + +```python +assert "Homer Simpson" in simpsons.serialize(format="turtle") +``` + +Update the <_:sample> graph +with the following sentence. + +> foaf:topic_interest + + +Use `INSERT DATA` to add a new triple, +and read the rdflib documentation https://rdflib.readthedocs.io/en/7.1.1/intro_to_sparql.html + +````python +q = """ +INSERT DATA { + GRAPH <_:sample> { + foaf:topic_interest . + } +} +""" + +result = d.update(q) +assert "Homer" in g.serialize(format="turtle") + +``` + + +### The `/` and the `*` predicate modifiers SparQL can correlate entries using semantically defined -vocabularies such as FOAF. +vocabularies such as [FOAF](http://xmlns.com/foaf/0.1/). :warning: The `PREFIX` statement in a sparql query must not have a trailing dot, because it is not a sentence. This is different from the `@prefix` statement -in turtle. +in Turtle. ```python q = """ @@ -229,8 +413,78 @@ ignoring the way data is stored. --- +### Querying the whole dataset + + +What happens if I query the whole dataset? + +```python +q = """SELECT DISTINCT * +WHERE { + [] a ?Class +} +LIMIT 10 +""" +d.query(q).bindings +``` + +Now, try to query each graph + +```python +for g in d.graphs(): + print({g.identifier.n3(): g.query(q).bindings}) +``` + +There's a `Dataset` attribute that allows to query all the graphs in the dataset. + +```python +# By default, sparql does not query all the graphs. +assert d.default_union == False + +# .. but you can change this behaviour... +d.default_union = True + +# ... and now you can query all the graphs. +d.query(q).bindings +``` + +I can also query all the graphs in the dataset + +```python +q = """SELECT DISTINCT * +WHERE { + GRAPH ?g {} +} +""" +result = d.query(q) +{str(r.g): len(r) for r in result} +``` + +Or querying triples in a specific graph: + +```python +q = """SELECT DISTINCT * +WHERE { + GRAPH <_:simpsons> { + ?p a foaf:Person . + } +} +""" +result = d.query(q) +{str(r.p): r.p for r in result} +``` + +💪 Exercise: querying the dataset + +- Query the `_:sample` graph + to list all the `foaf:Person`s in it. + + + # Querying DBPedia +:warning: DBPedia may rate limit your queries. + [DBPedia](https://dbpedia.org/sparql) is a graph database with a lot of data inside. We can use it to learn sparql. diff --git a/sparql-101/07-jsonld.md b/sparql-101/07-jsonld.md index fe6c9cd..45bc9cf 100644 --- a/sparql-101/07-jsonld.md +++ b/sparql-101/07-jsonld.md @@ -129,7 +129,7 @@ Annotate it with schema.org. ```python context = { - "sdo": "http://schema.org/", + "sdo": "https://schema.org/", "nome": "sdo:name", "nome_proprio": "sdo:givenName", "titolo": "sdo:jobTitle", diff --git a/sparql-101/10-rdf.md b/sparql-101/10-rdf.md index 66de428..4832daa 100644 --- a/sparql-101/10-rdf.md +++ b/sparql-101/10-rdf.md @@ -107,54 +107,6 @@ See also: - -Now create another graph - -```python -simpsons = d.graph(identifier="urn:example:simpsons") -simpsons.parse("simpsons.ttl", format="ox-turtle") -``` - -Now list the graphs in the dataset: -note that the default graph does not contain triples. - -```python -print( - {k.identifier.n3(): len(k) for k in d.graphs()} -) -``` - -What happens if I query the dataset? - -```python -q = """SELECT DISTINCT * -WHERE { - [] a ?Class -} -LIMIT 10 -""" -d.query(q).bindings -``` - -Now, try to query each graph - -```python -for g in d.graphs(): - print({g.identifier.n3(): g.query(q).bindings}) -``` - -There's a Dataset flag that allows to query all the graphs in the dataset. - -```python -# By default, sparql does not query all the graphs. -assert d.default_union == False - -# .. but you can change this behaviour... -d.default_union = True - -# ... and now you can query all the graphs. -d.query(q).bindings -``` - --- ## SparQL practice @@ -223,7 +175,7 @@ The `*` operator is not supported by all graph databases. SparQL can create new graphs from an existing one. -```sparql +```python q = """ PREFIX country: diff --git a/sparql-101/12-enriching-data.md b/sparql-101/12-enriching-data.md index bf9c520..7a7de56 100644 --- a/sparql-101/12-enriching-data.md +++ b/sparql-101/12-enriching-data.md @@ -7,7 +7,16 @@ ## Graphs vs Tables -Storing data in tables requires to have a fixed schema. +When we store data in tables, +whe have a fixed schema. + +Constraints have advantages: + +- performance; +- data integrity; +- consistency. + +---- Column meaning is defined outside the table, or where possible, in the table header. @@ -18,9 +27,9 @@ usually indexed. | id | name | surname | spouse | |----|-------|---------|----------------| -| 1 | Homer | Simpson || -| 2 | Marge | Simpson || -| 3 | Bart | Simpson | || +| 1 | Homer | Simpson | ... | +| 2 | Marge | Simpson | ... | +| 3 | Bart | Simpson | ... | Another database related to the same entity may have a different schema. diff --git a/sparql-101/09-syntax-semantic.md b/sparql-101/_09-syntax-semantic.md similarity index 99% rename from sparql-101/09-syntax-semantic.md rename to sparql-101/_09-syntax-semantic.md index dfaa6b4..3f57932 100644 --- a/sparql-101/09-syntax-semantic.md +++ b/sparql-101/_09-syntax-semantic.md @@ -113,7 +113,7 @@ Customer:   properties: "@context": const: - "@vocab": "http://schema.org/" + "@vocab": "https://schema.org/" pet: null email: {type: string}     pet: {type: string} diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb index 773710f..b445235 100644 --- a/sparql-101/notebooks/00-jupyter-intro.ipynb +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "b505bce6", + "id": "2efbeaaf", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "3133db54", + "id": "9c3177d4", "metadata": { "slideshow": { "slide_type": "slide" @@ -38,7 +38,7 @@ }, { "cell_type": "markdown", - "id": "aa4c9bd3", + "id": "2df859d9", "metadata": { "slideshow": { "slide_type": "slide" @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "b61b3dbc", + "id": "3f9f0546", "metadata": { "slideshow": { "slide_type": "slide" @@ -74,7 +74,7 @@ }, { "cell_type": "markdown", - "id": "237233ec", + "id": "2db004b5", "metadata": { "slideshow": { "slide_type": "slide" @@ -98,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "64d017cc", + "id": "5849bc6b", "metadata": { "slideshow": { "slide_type": "slide" @@ -112,7 +112,7 @@ }, { "cell_type": "markdown", - "id": "4e31124a", + "id": "a8b7bdd5", "metadata": { "slideshow": { "slide_type": "subslide" @@ -127,7 +127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "36ab4c9c", + "id": "4d3d6059", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +136,7 @@ }, { "cell_type": "markdown", - "id": "b3a7bab3", + "id": "863b1b25", "metadata": { "slideshow": { "slide_type": "slide" @@ -154,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9f48faef", + "id": "14ef7278", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "d9c5530d", + "id": "ac721489", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -174,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8e84cd06", + "id": "e7319435", "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ }, { "cell_type": "markdown", - "id": "c5331858", + "id": "46ddaa5e", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "880ea870", + "id": "fb9b774f", "metadata": {}, "source": [ "----" diff --git a/sparql-101/notebooks/00-teaser.ipynb b/sparql-101/notebooks/00-teaser.ipynb index abd914b..612c18b 100644 --- a/sparql-101/notebooks/00-teaser.ipynb +++ b/sparql-101/notebooks/00-teaser.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "aa1e4e17", + "id": "5ed52847", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "86d4bc31", + "id": "81b03bbd", "metadata": { "slideshow": { "slide_type": "slide" @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "28139a01", + "id": "3cbbca49", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "24a247c9", + "id": "3d243282", "metadata": {}, "source": [ "(and some graph libraries)" @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9015b33d", + "id": "237491bf", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b961e951", + "id": "63d5bc72", "metadata": {}, "outputs": [], "source": [ @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "66b79eab", + "id": "b86a7da7", "metadata": {}, "source": [ "For example network of persons:" @@ -94,7 +94,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cf78e7ed", + "id": "57a9371b", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "f6104109", + "id": "f3c57113", "metadata": {}, "source": [ "... eventually rendered as a graph ..." @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "791d4528", + "id": "fa441af4", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "4db88682", + "id": "7ced0817", "metadata": {}, "source": [ "Convert it in [JSON-LD](https://json-ld.org/) format:" @@ -149,7 +149,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fba3b778", + "id": "2b348fb5", "metadata": {}, "outputs": [], "source": [ @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "b71e5988", + "id": "bdea67cb", "metadata": {}, "source": [ "There's plenty of knowledge in the web!" @@ -168,7 +168,7 @@ { "cell_type": "code", "execution_count": null, - "id": "71f44701", + "id": "db073c41", "metadata": {}, "outputs": [], "source": [ @@ -187,7 +187,7 @@ }, { "cell_type": "markdown", - "id": "20d5f71a", + "id": "ee07057b", "metadata": {}, "source": [ "And we can connect them together" @@ -196,7 +196,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c158f157", + "id": "dc446974", "metadata": {}, "outputs": [], "source": [ @@ -211,7 +211,7 @@ }, { "cell_type": "markdown", - "id": "c02d1e09", + "id": "d8975bcd", "metadata": {}, "source": [ "Graphs contain a lot of senteces" @@ -220,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "47cd6fa8", + "id": "bf7d1dd4", "metadata": {}, "outputs": [], "source": [ @@ -229,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "1bee9a22", + "id": "250c581a", "metadata": {}, "source": [ "but we can query them (e.g., for Italian food)" @@ -238,7 +238,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d2cd58a3", + "id": "c324a8f0", "metadata": {}, "outputs": [], "source": [ @@ -258,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "02786c9d", + "id": "9690cd82", "metadata": {}, "source": [ "and see if two resources have something in common..." @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d47c8ee1", + "id": "8cb6143e", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "ff9d8192", + "id": "c885222f", "metadata": {}, "source": [ "We can query remote graphs (e.g., DBPedia):" @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "533acf2c", + "id": "ff0b6efc", "metadata": {}, "outputs": [], "source": [ @@ -319,7 +319,7 @@ }, { "cell_type": "markdown", - "id": "2480e557", + "id": "dca4f08f", "metadata": {}, "source": [ "Provided by different organizations" @@ -328,7 +328,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6b767bdf", + "id": "c6896cfb", "metadata": {}, "outputs": [], "source": [ @@ -358,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "3427d90e", + "id": "ed074698", "metadata": {}, "source": [ "And their relations" @@ -367,7 +367,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5efe6a8c", + "id": "aa129192", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "6a96821f", + "id": "abadc78f", "metadata": {}, "source": [ "More relations" @@ -406,7 +406,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ffc61dd1", + "id": "b336ee8f", "metadata": {}, "outputs": [], "source": [ @@ -437,7 +437,7 @@ }, { "cell_type": "markdown", - "id": "68dcc425", + "id": "26b68d11", "metadata": { "slideshow": { "slide_type": "slide" @@ -452,7 +452,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1e1bd0da", + "id": "e09390eb", "metadata": {}, "outputs": [], "source": [ @@ -461,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "5bff3431", + "id": "295cb9f0", "metadata": { "slideshow": { "slide_type": "slide" @@ -476,7 +476,7 @@ { "cell_type": "code", "execution_count": null, - "id": "38074a08", + "id": "62952e03", "metadata": {}, "outputs": [], "source": [ @@ -500,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "fb01e09f", + "id": "1925d826", "metadata": {}, "source": [ "Get security insights from the NSA knowledge graph." @@ -509,7 +509,7 @@ { "cell_type": "code", "execution_count": null, - "id": "17b63ccb", + "id": "f7f616ab", "metadata": {}, "outputs": [], "source": [ @@ -526,7 +526,7 @@ }, { "cell_type": "markdown", - "id": "eed21151", + "id": "b34f2033", "metadata": {}, "source": [ "and apply this stuff to our infrastructure." @@ -535,7 +535,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2e082bd6", + "id": "4d429c3b", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/01-knowledge.ipynb b/sparql-101/notebooks/01-knowledge.ipynb index 0fe66b8..40a3425 100644 --- a/sparql-101/notebooks/01-knowledge.ipynb +++ b/sparql-101/notebooks/01-knowledge.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "e368654f", + "id": "7237acef", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -18,7 +18,7 @@ }, { "cell_type": "markdown", - "id": "3a86cea5", + "id": "df076873", "metadata": { "slideshow": { "slide_type": "subslide" @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "adc2732e", + "id": "5e4cc9dc", "metadata": {}, "outputs": [], "source": [ @@ -47,7 +47,7 @@ }, { "cell_type": "markdown", - "id": "d2fbcd47", + "id": "ffcfd662", "metadata": { "slideshow": { "slide_type": "slide" @@ -68,7 +68,7 @@ }, { "cell_type": "markdown", - "id": "821006e3", + "id": "829b6ddd", "metadata": { "slideshow": { "slide_type": "subslide" @@ -86,7 +86,7 @@ }, { "cell_type": "markdown", - "id": "0d529263", + "id": "a9578c83", "metadata": { "slideshow": { "slide_type": "subslide" @@ -107,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "8b574b09", + "id": "884a1044", "metadata": { "slideshow": { "slide_type": "subslide" @@ -128,7 +128,7 @@ }, { "cell_type": "markdown", - "id": "650bb0c8", + "id": "fbda97ba", "metadata": {}, "source": [ "```mermaid\n", @@ -139,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "e6ea63d5", + "id": "3f02314d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -157,7 +157,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cf27797b", + "id": "1653fdfd", "metadata": {}, "outputs": [], "source": [ @@ -167,7 +167,7 @@ }, { "cell_type": "markdown", - "id": "3a64a168", + "id": "32ce1dec", "metadata": {}, "source": [ "We'll see how to use URIs to express knowledge." @@ -175,7 +175,7 @@ }, { "cell_type": "markdown", - "id": "c6ef4fb2", + "id": "28c4e2ff", "metadata": { "slideshow": { "slide_type": "subslide" @@ -194,7 +194,7 @@ }, { "cell_type": "markdown", - "id": "bafe3d7a", + "id": "ae3196e6", "metadata": { "slideshow": { "slide_type": "subslide" @@ -213,7 +213,7 @@ }, { "cell_type": "markdown", - "id": "71df0b36", + "id": "c5d90448", "metadata": {}, "source": [ "```mermaid\n", @@ -227,7 +227,7 @@ }, { "cell_type": "markdown", - "id": "2c3e257e", + "id": "5ba87853", "metadata": { "slideshow": { "slide_type": "subslide" @@ -239,7 +239,7 @@ "There are various encyclopedias on the web,\n", "such as Wikipedia and dbpedia.\n", "\n", - "##### Exercise: web encyclopedias\n", + "💪 Exercise: web encyclopedias\n", "\n", "1. open the \"Python\" page on dbpedia:\n", "\n", @@ -260,7 +260,7 @@ }, { "cell_type": "markdown", - "id": "9724a8a0", + "id": "74ee2de3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -279,7 +279,7 @@ }, { "cell_type": "markdown", - "id": "bc469e2b", + "id": "7cceeae2", "metadata": {}, "source": [ "```mermaid\n", @@ -296,7 +296,7 @@ }, { "cell_type": "markdown", - "id": "f7f2e0fb", + "id": "e81c83f3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -310,7 +310,7 @@ }, { "cell_type": "markdown", - "id": "1ee7760a", + "id": "ea2e42c2", "metadata": {}, "source": [ "```mermaid\n", @@ -324,7 +324,7 @@ }, { "cell_type": "markdown", - "id": "693e0c37", + "id": "4252d863", "metadata": { "slideshow": { "slide_type": "subslide" @@ -342,7 +342,7 @@ }, { "cell_type": "markdown", - "id": "e8f7dbc7", + "id": "3f2a175a", "metadata": {}, "source": [ "```mermaid\n", @@ -367,7 +367,7 @@ }, { "cell_type": "markdown", - "id": "41c61763", + "id": "b8ac61fc", "metadata": {}, "source": [ "This is the basis of the Semantic Web,\n", @@ -379,7 +379,7 @@ }, { "cell_type": "markdown", - "id": "c6bf4d49", + "id": "c4c03ef6", "metadata": { "slideshow": { "slide_type": "subslide" @@ -393,7 +393,9 @@ "Encyclopedia voices on Wikipedia and dbpedia are expressed in\n", "[Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/).\n", "\n", - "It is a W3C formal language to represent knowledge in a machine-readable format\n", + "It is a W3C formal language to\n", + "represent knowledge on the web\n", + "in a machine-readable format\n", "using triples subject-predicate-object.\n", "\n", "RDF has different serialization formats,\n", @@ -402,63 +404,148 @@ "and [XML](https://www.w3.org/TR/rdf-syntax-grammar/).\n", "\n", "We'll use the Turtle format in this course,\n", - "where a sentence is expressed as a" + "where a sentence is expressed as a tripe:\n", + "\n", + "`subject predicate object .`\n", + "\n", + ":exclamation: note the dot at the end of the sentence :exclamation:" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "bd9e5a04", + "cell_type": "markdown", + "id": "0175ec1a", "metadata": { - "attributes": { - "classes": [ - "raw" - ], - "id": "" + "slideshow": { + "slide_type": "subslide" } }, + "source": [ + "----\n", + "\n", + "## RDF: Machine Readable Knowledge\n", + "\n", + "RDF uses [URIs](https://www.w3.org/TR/rdf11-concepts/#section-uris)\n", + "to disambiguate the meaning of terms and provide semantics.\n", + "\n", + "Every term is identified by an absolute URI enclosed by `<>`.\n", + "\n", + "The prefix identifies the source of the term definition\n", + "(that we'll call **vocabulary**),\n", + "and the suffix identifies the term." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6470cd38", + "metadata": {}, "outputs": [], "source": [ - "subject predicate object ." + "from rdflib import URIRef\n", + "dog_uri = URIRef(\"https://dbpedia.org/data/Dog/")\n", + "print(dog_uri.n3())" ] }, { "cell_type": "markdown", - "id": "3ed9dd69", + "id": "ca1b6452", "metadata": {}, "source": [ - ":exclamation: note the dot at the end of the sentence :exclamation:" + "RDF is based on:\n", + "\n", + "- **elements** (IRIs, blank nodes and literals);\n", + "- **triples** (subject-predicate-object);\n", + "- **graphs** (sets of triples).\n", + "- **vocabularies** (graphs containing terms and their definitions).\n", + "\n", + "### Elements\n", + "\n", + "Subjects and predicates are uniquely identified by URIs.\n", + "\n", + "Objects can be either URIs or literals (strings, numbers, dates, etc.)." ] }, { - "cell_type": "markdown", - "id": "0daa7dcb", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "cell_type": "code", + "execution_count": null, + "id": "d5918ece", + "metadata": {}, + "outputs": [], "source": [ - "----\n", + "from rdflib import URIRef, Literal, BNode\n", "\n", - "## RDF: Machine Readable Knowledge\n", + "iri = URIRef(\"mailto:mr@test\")\n", + "predicate_iri = URIRef(\"https://schema.org/name/")\n", + "blank_node = BNode(\"anon\")\n", + "literal = Literal(\"Mario Rossi\")\n", "\n", - "Subjects and predicates are uniquely identified by [URIs](https://www.w3.org/TR/rdf11-concepts/#section-uris).\n", + "# Serialize in the N3 format\n", + "# (Notation 3 is a compact, human-readable format for RDF)\n", + "print(iri.n3(), blank_node.n3(), literal.n3(), sep=\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "fc53efc5", + "metadata": {}, + "source": [ + "#### Exercise: RDF elements\n", "\n", - "Objects can be either URIs or literals (strings, numbers, dates, etc.).\n", + "In the cell below, create a literal with the following values\n", + "and look at its [Notation 3 (N3)](https://www.w3.org/TeamSubmission/n3/) serialization.\n", "\n", - "URIs provide a definition context for subjects and predicates,\n", - "and allow to disambiguate their meaning depending on the\n", - "definition provided by a given vocabulary.\n", + "- `42` (integer), `42.0` (float), `\"42\"` (string);\n", + "- `datetime.now()` (date);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5979d9b5", + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import datetime\n", + "...\n", + "for value in (42, 42.0, \"42\", datetime.now()):\n", + " literal = Literal(value)\n", + " print(literal.n3())" + ] + }, + { + "cell_type": "markdown", + "id": "a6186e1f", + "metadata": {}, + "source": [ + "### Triples\n", "\n", - "Every term is identified by an absolute URI\n", - "enclosed by `<>`." + "A triple represents a statement about a resource;\n", + "remember: the second element is the predicate!" ] }, { "cell_type": "code", "execution_count": null, - "id": "0e3f8bcd", + "id": "7a44fc73", + "metadata": {}, + "outputs": [], + "source": [ + "triple = (iri, predicate_iri, literal)\n", + "print(triple)" + ] + }, + { + "cell_type": "markdown", + "id": "2bfc2eb4", + "metadata": {}, + "source": [ + "Another triple serialized in the N3 format:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ef3cc03", "metadata": {}, "outputs": [], "source": [ @@ -469,27 +556,70 @@ }, { "cell_type": "markdown", - "id": "33e262ab", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, + "id": "7036656d", + "metadata": {}, "source": [ - "----\n", + "The `a` keyword is a shorthand for the `rdf:type` predicate,\n", + "which is used to indicate the type of a resource.\n", "\n", - "Let's parse our first RDF sentence using the [rdflib](https://rdflib.readthedocs.io/en/stable/) library." + "The following statements are equivalent:" ] }, { "cell_type": "code", "execution_count": null, - "id": "921a883f", + "id": "f63318d2", "metadata": {}, "outputs": [], "source": [ - "from rdflib import Graph\n", + "# Serialized on multiple lines...\n", + "same_sentences = \"\"\"\n", + "\n", + " \n", + " \n", + ".\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "3ad875f7", + "metadata": {}, + "source": [ + "### Graphs\n", "\n", + "A graph is a set of triples." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8fca6982", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "g = Graph()\n", + "g.add(triple)\n", + "print(g.serialize(format=\"turtle\"))" + ] + }, + { + "cell_type": "markdown", + "id": "ef461608", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "450c9a35", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a new graph and parse the above sentences.\n", "g = Graph()\n", "g.parse(data=sentences, format=\"turtle\")\n", "\n", @@ -498,7 +628,18 @@ }, { "cell_type": "markdown", - "id": "86c97a05", + "id": "c9c80315", + "metadata": {}, + "source": [ + "💪 Exercise: parse sentences\n", + "\n", + "Parse the `same_sentences` variable\n", + "and check the content of the graph." + ] + }, + { + "cell_type": "markdown", + "id": "a899acfe", "metadata": { "slideshow": { "slide_type": "subslide" @@ -513,7 +654,7 @@ { "cell_type": "code", "execution_count": null, - "id": "db64425f", + "id": "5bb35e53", "metadata": {}, "outputs": [], "source": [ @@ -523,17 +664,17 @@ }, { "cell_type": "markdown", - "id": "ca5e6d2f", + "id": "e642a745", "metadata": {}, "source": [ - "##### Exercise: take 2 minutes to map the JSON-LD format to the Turtle format.\n", + "💪 Exercise: take 2 minutes to map the JSON-LD format to the Turtle format.\n", "\n", "We'll see JSON-LD in detail later." ] }, { "cell_type": "markdown", - "id": "a03371b2", + "id": "e5a420ae", "metadata": { "slideshow": { "slide_type": "slide" @@ -542,7 +683,7 @@ "source": [ "---\n", "\n", - "## RDF: Namespaces and cURIe\n", + "## Graphs: Namespaces and cURIe\n", "\n", "RDF use namespace prefixes to shorten URIs\n", "(the [cURIe](https://www.w3.org/TR/curie/) syntax)." @@ -551,7 +692,7 @@ { "cell_type": "code", "execution_count": null, - "id": "75c6255b", + "id": "69d5aeda", "metadata": {}, "outputs": [], "source": [ @@ -571,7 +712,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8ffa9876", + "id": "f9934190", "metadata": {}, "outputs": [], "source": [ @@ -583,7 +724,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a94f619d", + "id": "cf375f44", "metadata": {}, "outputs": [], "source": [ @@ -593,7 +734,7 @@ }, { "cell_type": "markdown", - "id": "fe22b8a7", + "id": "67d40862", "metadata": { "slideshow": { "slide_type": "subslide" @@ -609,7 +750,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e6e419ce", + "id": "e4dbb04c", "metadata": {}, "outputs": [], "source": [ @@ -621,7 +762,7 @@ }, { "cell_type": "markdown", - "id": "1e8fce7c", + "id": "0408e9e0", "metadata": { "slideshow": { "slide_type": "subslide" @@ -644,7 +785,7 @@ { "cell_type": "code", "execution_count": null, - "id": "baee1dbd", + "id": "f8704d3d", "metadata": {}, "outputs": [], "source": [ @@ -662,7 +803,7 @@ }, { "cell_type": "markdown", - "id": "d980e884", + "id": "11034619", "metadata": {}, "source": [ "#### Exercise: parse the sentences using rdflib and answer the following questions\n", @@ -675,7 +816,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f412bed0", + "id": "03d71b87", "metadata": {}, "outputs": [], "source": [ @@ -688,7 +829,7 @@ }, { "cell_type": "markdown", - "id": "68e8fc01", + "id": "a450d0dc", "metadata": {}, "source": [ "#### Exercise: use `Graph.namespaces` to get the namespaces added by the sentences above" @@ -697,7 +838,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0bd74d5c", + "id": "f704b1c6", "metadata": {}, "outputs": [], "source": [ @@ -710,7 +851,7 @@ }, { "cell_type": "markdown", - "id": "9adefd34", + "id": "d7e5d335", "metadata": {}, "source": [ "#### Exercise: serialize the above graph in JSON-LD format" @@ -719,7 +860,7 @@ { "cell_type": "code", "execution_count": null, - "id": "022e82e6", + "id": "9148a958", "metadata": {}, "outputs": [], "source": [ @@ -729,7 +870,7 @@ }, { "cell_type": "markdown", - "id": "6e3d9cb5", + "id": "b91aa20c", "metadata": {}, "source": [ "#### Exercise: Load the JSON-LD object in a variable\n", @@ -741,7 +882,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c8079541", + "id": "a70610ec", "metadata": {}, "outputs": [], "source": [ @@ -753,7 +894,7 @@ }, { "cell_type": "markdown", - "id": "cdc3e4e7", + "id": "fe62d797", "metadata": {}, "source": [ "#### Exercise: Get a voice from dbpedia\n", @@ -764,7 +905,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9abbc8c6", + "id": "1f6c01c4", "metadata": {}, "outputs": [], "source": [ @@ -780,7 +921,7 @@ }, { "cell_type": "markdown", - "id": "5bebfdd5", + "id": "d78e434d", "metadata": {}, "source": [ "We get a graph with the information about Tortellini." @@ -788,7 +929,7 @@ }, { "cell_type": "markdown", - "id": "3f3083d7", + "id": "9b6640d8", "metadata": {}, "source": [ "```mermaid\n", @@ -804,7 +945,7 @@ }, { "cell_type": "markdown", - "id": "7c1b4210", + "id": "2c6d9d37", "metadata": {}, "source": [ "An encyclopedia voice contains a list of sentences :)" @@ -813,7 +954,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fcc5d966", + "id": "78347674", "metadata": {}, "outputs": [], "source": [ @@ -825,7 +966,7 @@ }, { "cell_type": "markdown", - "id": "c9d103d6", + "id": "66c2b48c", "metadata": {}, "source": [ "#### Exercise: counting sentences\n", @@ -837,7 +978,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cbd09932", + "id": "fbe69f38", "metadata": {}, "outputs": [], "source": [ @@ -846,7 +987,7 @@ }, { "cell_type": "markdown", - "id": "b55c2e67", + "id": "4ebc06c1", "metadata": {}, "source": [ "----" @@ -855,7 +996,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cf711e48", + "id": "652258c3", "metadata": {}, "outputs": [], "source": [ @@ -869,17 +1010,17 @@ { "cell_type": "code", "execution_count": null, - "id": "2bacc031", + "id": "1e55f507", "metadata": {}, "outputs": [], "source": [ - "from tools import plot_graph\n", - "plot_graph(g, limit=30)" + "import tools\n", + "tools.plot_graph(g, limit=30)" ] }, { "cell_type": "markdown", - "id": "8404e1b9", + "id": "6f296ec1", "metadata": {}, "source": [ "#### Exercise: extending graphs\n", @@ -890,7 +1031,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3e08195e", + "id": "f5aaf96d", "metadata": {}, "outputs": [], "source": [ @@ -902,12 +1043,12 @@ "\n", "g = Graph()\n", "g.parse(tortellini_n3, format=\"n3\")\n", - "plot_graph(g, limit=30, pattern=\".*/dbpedia.org\")" + "tools.plot_graph(g, limit=30, pattern=\".*/dbpedia.org\")" ] }, { "cell_type": "markdown", - "id": "38c1a731", + "id": "ed87cc7a", "metadata": {}, "source": [ "And we can connect them together" @@ -916,7 +1057,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f16d365e", + "id": "86bd8679", "metadata": {}, "outputs": [], "source": [ @@ -928,7 +1069,7 @@ }, { "cell_type": "markdown", - "id": "d007370a", + "id": "bb99cb82", "metadata": {}, "source": [ "Exercise: how many sentences are there now?" @@ -937,7 +1078,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5ad41a4e", + "id": "dcc59e6e", "metadata": {}, "outputs": [], "source": [ @@ -946,7 +1087,7 @@ }, { "cell_type": "markdown", - "id": "28b6a1f2", + "id": "b19017a2", "metadata": {}, "source": [ "Plot the graph again to see the new nodes and\n", @@ -956,11 +1097,12 @@ { "cell_type": "code", "execution_count": null, - "id": "d1cd8c96", + "id": "837473e8", "metadata": {}, "outputs": [], "source": [ - "plot_graph(g, label_property=RDFS.label, limit=50, pattern=\".*/dbpedia.org\")" + "import tools\n", + "tools.plot_graph(g, label_property=RDFS.label, limit=50, pattern=\".*/dbpedia.org\")" ] } ], diff --git a/sparql-101/notebooks/02-semantics.ipynb b/sparql-101/notebooks/02-semantics.ipynb index 3895a62..511f9d8 100644 --- a/sparql-101/notebooks/02-semantics.ipynb +++ b/sparql-101/notebooks/02-semantics.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "bf26561a", + "id": "2741cf01", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -20,7 +20,7 @@ }, { "cell_type": "markdown", - "id": "0e905a3a", + "id": "c4bcd145", "metadata": { "slideshow": { "slide_type": "subslide" @@ -41,7 +41,7 @@ }, { "cell_type": "markdown", - "id": "26d31a03", + "id": "939b777e", "metadata": {}, "source": [ "```yaml\n", @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "e39f6218", + "id": "6c01d34b", "metadata": {}, "source": [ "Is this a given name or a full name?\n", @@ -62,7 +62,7 @@ }, { "cell_type": "markdown", - "id": "97892ecc", + "id": "605eab7f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -76,7 +76,7 @@ }, { "cell_type": "markdown", - "id": "5f2c4406", + "id": "6c8e5c99", "metadata": {}, "source": [ "```mermaid\n", @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "63aaaa68", + "id": "239bddc7", "metadata": { "slideshow": { "slide_type": "subslide" @@ -107,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "37e48758", + "id": "e28cf37b", "metadata": {}, "source": [ "```mermaid\n", @@ -123,7 +123,7 @@ }, { "cell_type": "markdown", - "id": "9149bc84", + "id": "27036a85", "metadata": { "slideshow": { "slide_type": "subslide" @@ -143,7 +143,7 @@ }, { "cell_type": "markdown", - "id": "448590cb", + "id": "df4e6c30", "metadata": {}, "source": [ "```json\n", @@ -155,7 +155,7 @@ }, { "cell_type": "markdown", - "id": "6091534d", + "id": "9339685a", "metadata": { "slideshow": { "slide_type": "subslide" @@ -169,7 +169,7 @@ }, { "cell_type": "markdown", - "id": "617f7120", + "id": "6649a454", "metadata": {}, "source": [ "```yaml\n", @@ -184,7 +184,7 @@ }, { "cell_type": "markdown", - "id": "907b2d49", + "id": "c1bdb2c2", "metadata": {}, "source": [ "```yaml\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "30a8fe50", + "id": "0093b265", "metadata": { "slideshow": { "slide_type": "slide" @@ -205,139 +205,18 @@ "source": [ "---\n", "\n", - "## Vocabularies to the rescue: Controlled vocabularies\n", - "\n", - "Controlled Vocabularies use URIs to disambiguate the meaning of terms and provide semantics.\n", - "\n", - "Every term is identified by an absolute URI.\n", - "\n", - "The prefix identifies the vocabulary name,\n", - "and the suffix identifies the term." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7b41c241", - "metadata": {}, - "outputs": [], - "source": [ - "from rdflib import URIRef\n", - "dog_uri = URIRef(\"https://dbpedia.org/data/Dog/")" - ] - }, - { - "cell_type": "markdown", - "id": "a48d6179", - "metadata": {}, - "source": [ "## Vocabularies to the rescue: RDF\n", "\n", - "RDF: Resource Description Framework\n", - "\n", - "It allows to represent information on the web based on:\n", + "RDF (Resource Description Framework) is a standard for representing information about resources in the web.\n", + "See [01-knowledge.ipynb](01-knowledge.ipynb).\n", "\n", - "- **elements** (IRIs, blank nodes and literals);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bd4650f6", - "metadata": {}, - "outputs": [], - "source": [ - "from rdflib import URIRef, Literal, BNode\n", - "\n", - "iri = URIRef(\"mailto:mr@test\")\n", - "iri2 = URIRef(\"https://schema.org/name/")\n", - "blank_node = BNode(\"anon\")\n", - "literal = Literal(\"Mario Rossi\")\n", - "\n", - "# Serialize in the N3 format\n", - "# (Notation 3 is a compact, human-readable format for RDF)\n", - "print(iri.n3(), blank_node.n3(), literal.n3(), sep=\"\\n\")" + "Vocabularies contain a set of terms (IRIs) and their relationships\n", + "that can be used to describe the meaning of data." ] }, { "cell_type": "markdown", - "id": "94633b8c", - "metadata": {}, - "source": [ - "Exercise: RDF elements\n", - "\n", - "In the cell below, create a literal with the following values\n", - "and look at its [Notation 3 (N3)](https://www.w3.org/TeamSubmission/n3/) serialization.\n", - "\n", - "- `42` (integer), `42.0` (float), `\"42\"` (string);\n", - "- `datetime.now()` (date);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0ab3fd2c", - "metadata": {}, - "outputs": [], - "source": [ - "from datetime import datetime\n", - "...\n", - "for value in (42, 42.0, \"42\", datetime.now()):\n", - " literal = Literal(value)\n", - " print(literal.n3())" - ] - }, - { - "cell_type": "markdown", - "id": "53cbb521", - "metadata": {}, - "source": [ - "- **triples** (subject-predicate-object);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "26f54d6c", - "metadata": {}, - "outputs": [], - "source": [ - "triple = (iri, iri2, literal)\n", - "print(triple)" - ] - }, - { - "cell_type": "markdown", - "id": "90392664", - "metadata": {}, - "source": [ - "- **graphs** (sets of triples)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d8295353", - "metadata": {}, - "outputs": [], - "source": [ - "from rdflib import Graph\n", - "g = Graph()\n", - "g.add(triple)\n", - "print(g.serialize(format=\"turtle\"))" - ] - }, - { - "cell_type": "markdown", - "id": "47356d3c", - "metadata": {}, - "source": [ - "and on **vocabularies** of elements identified by IRIs and namespaces." - ] - }, - { - "cell_type": "markdown", - "id": "93948419", + "id": "410982aa", "metadata": { "slideshow": { "slide_type": "subslide" @@ -351,42 +230,52 @@ }, { "cell_type": "markdown", - "id": "3fc0989c", + "id": "041d79ea", "metadata": {}, "source": [ "```mermaid\n", "graph LR\n", "\n", + "classDef pad fill:none,stroke:none;\n", + "\n", "subgraph Dataset\n", - " subgraph Graph1[\"Graph <https\\://example.org/graph1>\"]\n", + " subgraph Graph1[\"Graph
<https\\://example.org/graph1>\"]\n", + " subgraph p1[ ]\n", " t1[\n", " subject predicate object .\n", " subject predicate object .\n", " subject predicate object .\n", " ]\n", + " end\n", " end\n", - " subgraph Graph2[Graph <urn:example:graph2>]\n", + " subgraph Graph2[Graph
<urn:example:graph2>]\n", + " subgraph p2[ ]\n", " t2[\n", " subject predicate object .\n", " subject predicate object .\n", " subject predicate object .\n", " ]\n", " end\n", - " subgraph Graph3[Graph <_:anonymous_graph>]\n", + " end\n", + " subgraph Graph3[Graph
<_:anonymous_graph>]\n", + " subgraph p3[ ]\n", " t3[\n", " subject predicate object .\n", " subject predicate object .\n", " subject predicate object .\n", " ]\n", " end\n", + " end\n", "end\n", + "\n", + "class p1,p2,p3 pad;\n", "```" ] }, { "cell_type": "code", "execution_count": null, - "id": "a759d42a", + "id": "f509f5ba", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +286,7 @@ }, { "cell_type": "markdown", - "id": "c2164b14", + "id": "00c2fcff", "metadata": {}, "source": [ "#### Exercise: dataset\n", @@ -410,17 +299,17 @@ { "cell_type": "code", "execution_count": null, - "id": "fcdfd698", + "id": "3618dc32", "metadata": {}, "outputs": [], "source": [ - "simpsons = d.graph(identifier=\"urn:example:simpsons\")\n", + "simpsons = d.graph(identifier=\"_:simpsons\")\n", "simpsons.parse(\"simpsons.ttl\", format=\"turtle\")\n" ] }, { "cell_type": "markdown", - "id": "bd8d51d0", + "id": "4e31365d", "metadata": {}, "source": [ "- list the graphs in the dataset again, together with their identifiers.\n", @@ -431,12 +320,27 @@ "- get the `identifier` of one graph. What's its type?\n", "\n", "\n", - "" + "\n", + "\n", + "Now list the graphs in the dataset:\n", + "note that the default graph does not contain triples." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "568de8ba", + "metadata": {}, + "outputs": [], + "source": [ + "print(\n", + " {k.identifier.n3(): len(k) for k in d.graphs()}\n", + ")" ] }, { "cell_type": "markdown", - "id": "55fac132", + "id": "3deae72b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -458,7 +362,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0425f5d9", + "id": "3b62d44d", "metadata": {}, "outputs": [], "source": [ @@ -479,13 +383,13 @@ "\"\"\"\n", "\n", "# Create a new named graph in the dataset.\n", - "g = d.graph(identifier=\"urn:my_dbpedia\")\n", + "g = d.graph(identifier=\"_:my_dbpedia\")\n", "...\n" ] }, { "cell_type": "markdown", - "id": "0467e0ef", + "id": "16e95036", "metadata": {}, "source": [ "- Get the URIs representing Tortellini and Food using the `Graph.subjects` and `Graph.objects` methods." @@ -494,19 +398,20 @@ { "cell_type": "code", "execution_count": null, - "id": "d69e0607", + "id": "96b34445", "metadata": {}, "outputs": [], "source": [ "# Deduplicate subjects using set()\n", "subjects = set( ... )\n", "objects = set( ... )\n", - "print(subjects | objects)" + "items = subjects | objects\n", + "print(*items, sep=\"\\n\")" ] }, { "cell_type": "markdown", - "id": "66ffff26", + "id": "cc293ba4", "metadata": {}, "source": [ "\n", @@ -520,12 +425,15 @@ "\n", "Ontologies are used to standardize the semantics of digital content.\n", "\n", - "- **Ontology**: an ontology is a set of logical axioms that conceptualize a domain of interest by defining concepts and the semantics of relationships between them.\n", + "- **Ontology**: a set of logical axioms\n", + " that conceptualize a domain of interest\n", + " by defining concepts (e.g., a `Person`)\n", + " and the semantics of relationships (e.g., `isParentOf`) between them.\n", "\n", "Example: the Italian ontology for person defines:\n", "\n", "- the concept of person;\n", - "- its properties (e.g., givenName, familyName, hasChildren);\n", + "- its properties (e.g., givenName, familyName, isParentOf);\n", "- the range of each property (e.g., string, date, person);\n", "- the domain of each property (e.g., person, organization, place);\n", "- See also ." @@ -533,7 +441,7 @@ }, { "cell_type": "markdown", - "id": "beefa870", + "id": "e9608bae", "metadata": {}, "source": [ "```mermaid\n", @@ -543,17 +451,24 @@ " Person\n", " familyName([familyName])\n", " givenName([givenName])\n", - " hasChildren([hasChildren])\n", + " isParentOf([isParentOf])\n", + "\n", + " givenName_description>\"The given name of a person. E.g. 'Mario' is the given name of the person 'Mario Rossi'.\"]\n", + " isParentOf_description>\"Has a parental relationship with.\"]\n", "end\n", "\n", "subgraph xsd[XMLSchema]\n", " xsd:string\n", "end\n", "\n", - "givenName & familyName & hasChildren -.-o|domain| Person\n", + "givenName_description -.-|description| givenName\n", + "isParentOf_description\n", + "-.-|description|\n", + "isParentOf\n", + "givenName & familyName & isParentOf -.-o|domain| Person\n", "\n", "familyName & givenName ---->|range| xsd:string\n", - "hasChildren -->|range| Person\n", + "isParentOf -->|range| Person\n", "\n", "\n", "```" @@ -561,7 +476,7 @@ }, { "cell_type": "markdown", - "id": "13b89b85", + "id": "2e52be82", "metadata": {}, "source": [ "- **Controlled vocabulary**: a vocabulary where the terms are validated by a designated authority.\n", @@ -572,7 +487,7 @@ }, { "cell_type": "markdown", - "id": "475f43b2", + "id": "a1f1a9ea", "metadata": { "slideshow": { "slide_type": "subslide" @@ -581,21 +496,109 @@ "source": [ "----\n", "\n", + "## Standard vocabularies\n", + "\n", + "Standard vocabularies that are used to semantically describe data\n", + "are the RDF Schema (RDFS) vocabulary,\n", + "the Web Ontology Language (OWL) vocabulary,\n", + "and the Simple Knowledge Organization System (SKOS) vocabulary.\n", + "\n", + "Here are some example IRIs described using RDFS:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5853b349", + "metadata": { + "attributes": { + "classes": [ + "raw" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix rdfs: .\n", + "@prefix ex: .\n", + "\n", + "# The ex:Person Resource classifies a group of Resources.\n", + "ex:Person rdf:type rdfs:Class .\n", + "\n", + "# ex:Alive classifies a group of ex:Person\n", + "ex:Alive rdf:type rdfs:Class ;\n", + " rdfs:subClassOf ex:Person ;\n", + " .\n", + "\n", + "ex:givenName rdf:type rdf:Property ;\n", + " rdfs:domain ex:Person ;\n", + " rdfs:range xsd:string ;\n" + ] + }, + { + "cell_type": "markdown", + "id": "4f542b4d", + "metadata": {}, + "source": [ + "You can see vocabularies as a set of globally unique labels\n", + "that can be used to describe data in a standardized way.\n", + "\n", + "These labels may or may not overlap (e.g., I can use labels\n", + "from different vocabularies to describe the same data),\n", + "like in the following example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5e54afa", + "metadata": { + "attributes": { + "classes": [ + "raw" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "@prefix ex: .\n", + "\n", + "ex:Person a rdfs:Class ;\n", + " # Using RDFS vocabulary...\n", + " rdfs:label \"Person\"@en, \"Persona\"@it ;\n", + " rdfs:comment \"A human being.\"@en, \"Un essere umano.\"@it ;\n", + "\n", + " # Using SKOS vocabulary...\n", + " a skos:Concept ;\n", + " skos:prefLabel \"Person\"@en, \"Persona\"@it ;\n", + " skos:definition \"A human being.\"@en, \"Un essere umano.\"@it\n", + "." + ] + }, + { + "cell_type": "markdown", + "id": "25a9f94d", + "metadata": {}, + "source": [ "## Ontologies in Italy\n", "\n", - "In Italy, there's , a National Data Catalog for Semantic Interoperatbility\n", - "containing the official ontology for person\n", - "(Common Person Vocabulary) that we can use to uniquely describe someone." + "In Italy, is the National Data Catalog for Semantic Interoperability.\n", + "\n", + "It contains Controlled Vocabularies and Ontologies,\n", + "including the Italian Ontology for Person (CPV),\n", + "that we can use to uniquely describe someone." ] }, { "cell_type": "code", "execution_count": null, - "id": "3a6b3d4f", + "id": "ac81b186", "metadata": { "attributes": { "classes": [ - "text" + "raw" ], "id": "" } @@ -611,7 +614,7 @@ }, { "cell_type": "markdown", - "id": "cbc4f9aa", + "id": "39647c67", "metadata": { "slideshow": { "slide_type": "subslide" @@ -626,7 +629,7 @@ { "cell_type": "code", "execution_count": null, - "id": "208b5897", + "id": "0dca8ec9", "metadata": {}, "outputs": [], "source": [ @@ -635,6 +638,9 @@ "sentences = \"\"\"\n", "@prefix xsd: .\n", "@prefix dct: .\n", + "@prefix rdfs: .\n", + "@prefix owl: .\n", + "\n", "\n", "\n", " dct:modified \"2020-04-27\"^^xsd:date ;\n", @@ -642,10 +648,18 @@ " dct:title \"Person Ontology\"@en,\n", " \"Ontologia delle persone\"@it .\n", "\n", + "\n", + " a rdfs:Class ;\n", + " rdfs:isDefinedBy ;\n", + " rdfs:comment \"An individual human being ..\"@en .\n", + "\n", "# An ontology defines the meaning of predicates.\n", "\n", + " a owl:DatatypeProperty ;\n", + " rdfs:isDefinedBy ;\n", " rdfs:comment \"The given name of a person. E.g. 'Mario' is the given name of the person 'Mario Rossi'.\"@en ;\n", " rdfs:label \"given name\"@en ;\n", + " rdfs:domain ;\n", " rdfs:range xsd:string .\n", "\n", "\"\"\"\n" @@ -653,7 +667,7 @@ }, { "cell_type": "markdown", - "id": "be7559e1", + "id": "5d097c53", "metadata": {}, "source": [ "\n", @@ -663,6 +677,18 @@ "\n", "Exercise: how many triples are in the graph?" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "81695080", + "metadata": {}, + "outputs": [], + "source": [ + "import tools\n", + "\n", + "tools.plot_graph(g)" + ] } ], "metadata": {}, diff --git a/sparql-101/notebooks/05-sparql.ipynb b/sparql-101/notebooks/05-sparql.ipynb index b375b52..ced08d8 100644 --- a/sparql-101/notebooks/05-sparql.ipynb +++ b/sparql-101/notebooks/05-sparql.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "430d7ec4", + "id": "64fafda7", "metadata": {}, "source": [ "# SparQL 101\n", @@ -10,13 +10,18 @@ "## Agenda\n", "\n", "- Storing and retrieving triples\n", + "- Using the `rdflib.Dataset` class\n", + "- A dataset with multiple graphs\n", + "- Querying graphs\n", + "- Enriching graphs with UPDATE\n", + "- Traversing graphs with SparQL (`*` and `/` modifiers)\n", "\n", "*Beware*: commands contain small typos. You must fix them to properly complete the course!" ] }, { "cell_type": "markdown", - "id": "03df0e12", + "id": "8451ab6a", "metadata": { "slideshow": { "slide_type": "slide" @@ -34,7 +39,7 @@ }, { "cell_type": "markdown", - "id": "71108fbe", + "id": "c99c6667", "metadata": { "slideshow": { "slide_type": "slide" @@ -45,16 +50,47 @@ "\n", "## Querying graphs with SparQL\n", "\n", - "An RDF graph is an (unordered) set of triples.\n", + "A triple consists of a $(subject, predicate, object)$.\n", "\n", - "Each triple consists of a `subject`, `predicate`, `object`.\n", + "An RDF graph is an (unordered) set of triples:\n", "\n", - "SparQL is a query language for RDF graphs." + "$G = \\{(s_1, p_1, o_1), (s_2, p_2, o_2), \\ldots\\}$.\n", + "\n", + "An RDF dataset is a collection of graphs, including a $default$ graph.\n", + "\n", + "$D = \\{G_{default}, G_1, \\ldots\\}$.\n", + "\n", + "$ Resources < Triples < Graph < Dataset $\n", + "\n", + "SparQL is a query language for RDF datasets and graphs.\n", + "\n", + "This lesson provides a non-exhaustive introduction to SparQL.\n", + "\n", + "See: https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.html#dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31ec6ff8", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Dataset\n", + "d = Dataset()" ] }, { "cell_type": "markdown", - "id": "06e469b8", + "id": "37bb6075", + "metadata": {}, + "source": [ + "Exercise: list the graphs in the dataset." + ] + }, + { + "cell_type": "markdown", + "id": "3a0030d4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -64,41 +100,30 @@ "----\n", "\n", "A sparql query retrieves all entries\n", - "matching one or more sentences" + "matching one or more sentences." ] }, { "cell_type": "code", "execution_count": null, - "id": "7abe2b5d", - "metadata": { - "attributes": { - "classes": [ - "raw" - ], - "id": "" - } - }, + "id": "bfdc6b36", + "metadata": {}, "outputs": [], "source": [ - "SELECT *\n", + "q = \"\"\"SELECT *\n", "WHERE {\n", " ?subject ?predicate ?object .\n", " # ... more sentences ...\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "3c813b3b", - "metadata": {}, - "source": [ - "This workshop provides a non-exhaustive introduction to SparQL." + "}\n", + "\"\"\"\n", + "\n", + "# The Dataset is still empty :)\n", + "d.query(q).bindings" ] }, { "cell_type": "markdown", - "id": "03916d73", + "id": "24e473fe", "metadata": { "slideshow": { "slide_type": "subslide" @@ -107,25 +132,34 @@ "source": [ "----\n", "\n", + "\n", + "\n", + "### Sparql: adding graphs: _:sample\n", + "\n", "Open [sample.ttl](sample.ttl) in another tab\n", - "and see its content." + "and see its content.\n", + "\n", + "Now load into the dataset\n", + "creating a new graph." ] }, { "cell_type": "code", "execution_count": null, - "id": "57f3a76e", + "id": "1423a02e", "metadata": {}, "outputs": [], "source": [ - "from rdflib import Graph\n", - "g = Graph()\n", + "# Create hte _:sample graph\n", + "g = d.graph(\"_:sample\")\n", + "\n", + "# Add triples from sample.ttl\n", "g.parse(\"sample.ttl\", format=\"text/turtle\")" ] }, { "cell_type": "markdown", - "id": "1c84f013", + "id": "e1ef2dc4", "metadata": {}, "source": [ "Use our utility function to print the graph." @@ -134,26 +168,52 @@ { "cell_type": "code", "execution_count": null, - "id": "ad515c08", + "id": "1cfbfce2", "metadata": {}, "outputs": [], "source": [ - "from tools import plot_graph\n", - "plot_graph(g, label_property=FOAF.name)" + "from rdflib import FOAF\n", + "import tools\n", + "tools.plot_graph(g, label_property=FOAF.name)" ] }, { "cell_type": "markdown", - "id": "229465ed", + "id": "af72ca6e", "metadata": {}, "source": [ - "List all entries" + "That's what we have" + ] + }, + { + "cell_type": "markdown", + "id": "3a7966e2", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph\n", + "\n", + "subgraph d[\"d\"]\n", + " def_graph[(\"default graph\")]\n", + " g_graph[(\"_:sample\")]\n", + "end\n", + "\n", + "g[[g variable]] -->|references| g_graph\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "46a47c87", + "metadata": {}, + "source": [ + "List all entries from th `_:sample` graph." ] }, { "cell_type": "code", "execution_count": null, - "id": "4837038c", + "id": "b6b8a3a9", "metadata": {}, "outputs": [], "source": [ @@ -170,19 +230,21 @@ }, { "cell_type": "markdown", - "id": "fb11c835", + "id": "108bdaf8", "metadata": {}, "source": [ "Exercise:\n", "\n", "- Remove the `LIMIT` clause.\n", - " How many triples are in the graph?" + " How many triples are in the graph?\n", + "- Replace the `*` with `?subject ?predicate ?object`.\n", + " What happens?" ] }, { "cell_type": "code", "execution_count": null, - "id": "0c1ba415", + "id": "63619976", "metadata": {}, "outputs": [], "source": [ @@ -195,16 +257,144 @@ }, { "cell_type": "markdown", - "id": "f2a704ea", + "id": "d395759b", "metadata": {}, "source": [ "- Replace `?subject` with `?foo`:\n", + " what happens?\n", + "\n", + "### Serializing datasets\n", + "\n", + "The [Trig](https://www.w3.org/TR/2013/REC-trig-20130321/) format\n", + "extends Turtle to support multiple graphs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1735cba0", + "metadata": {}, + "outputs": [], + "source": [ + "# Serialize the dataset in Trig format\n", + "print(d.serialize(format=\"trig\"))" + ] + }, + { + "cell_type": "markdown", + "id": "a1f2d1d0", + "metadata": {}, + "source": [ + "### Sparql: querying graphs: _:simpsons\n", + "\n", + "Let's add another graph to the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31d09b09", + "metadata": {}, + "outputs": [], + "source": [ + "simpsons = d.graph(\"_:simpsons\")\n", + "simpsons.parse(\"simpsons.ttl\", format=\"text/turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "92a5e256", + "metadata": {}, + "source": [ + "That's what we have" + ] + }, + { + "cell_type": "markdown", + "id": "1a4fdaac", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph\n", + "\n", + "subgraph d[\"d\"]\n", + " def_graph[(\"default graph\")]\n", + " g_graph[(\"_:sample\")]\n", + " simpsons_graph[(\"_:simpsons\")]\n", + "end\n", + "\n", + "g[[g variable]] -->|references| g_graph\n", + "simpsons[[simpsons variable]] -->|references| simpsons_graph\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "1d94b0aa", + "metadata": {}, + "source": [ + "Now use the extended syntax with the `GRAPH` keyword." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec97c471", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT *\n", + "WHERE {\n", + " GRAPH ?g {}\n", + "}\n", + "\"\"\"\n", + "result = d.query(q)\n", + "{str(r.g): len(r) for r in result}" + ] + }, + { + "cell_type": "markdown", + "id": "0591b22b", + "metadata": {}, + "source": [ + "Query the classes used in the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9c043360", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?g ?Class\n", + "WHERE {\n", + " GRAPH ?g {\n", + " [] a ?Class .\n", + " }\n", + "}\n", + "\"\"\"\n", + "result = d.query(q)\n", + "list(result)" + ] + }, + { + "cell_type": "markdown", + "id": "45ef3be5", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- replace `?g` with `_:sample`:\n", " what happens?" ] }, { "cell_type": "markdown", - "id": "dac922b6", + "id": "a38a84da", "metadata": { "slideshow": { "slide_type": "subslide" @@ -213,21 +403,122 @@ "source": [ "----\n", "\n", + "### Enriching graphs: UPDATE\n", + "\n", + "The SparQL `UPDATE` command allows to modify a graph.\n", + "See https://www.w3.org/TR/sparql11-update/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "afc71080", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX schema: \n", + "\n", + "INSERT {\n", + " # Insert a new triple\n", + " ?s schema:name ?name .\n", + "}\n", + "WHERE {\n", + " # Match existing triples\n", + " ?s a schema:Person ;\n", + " schema:givenName ?givenName ;\n", + " schema:familyName ?familyName .\n", + "\n", + " # Create a new variable\n", + " # that concatenates the givenName and familyName\n", + " # into a single name.\n", + " BIND(CONCAT(?givenName, \" \", ?familyName) AS ?name)\n", + "}\n", + "\"\"\"\n", + "\n", + "result = simpsons.update(q)" + ] + }, + { + "cell_type": "markdown", + "id": "f8cc9ac3", + "metadata": {}, + "source": [ + "💪: check the graph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "804a7ca8", + "metadata": {}, + "outputs": [], + "source": [ + "assert \"Homer Simpson\" in simpsons.serialize(format=\"turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "336669c0", + "metadata": {}, + "source": [ + "Update the <_:sample> graph\n", + "with the following sentence.\n", + "\n", + "> foaf:topic_interest \n", + "\n", + "\n", + "Use `INSERT DATA` to add a new triple,\n", + "and read the rdflib documentation https://rdflib.readthedocs.io/en/7.1.1/intro_to_sparql.html" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3733f69b", + "metadata": { + "attributes": { + "classes": [ + "`python" + ], + "id": "" + } + }, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "INSERT DATA {\n", + " GRAPH <_:sample> {\n", + " foaf:topic_interest .\n", + " }\n", + "}\n", + "\"\"\"\n", + "\n", + "result = d.update(q)\n", + "assert \"Homer\" in g.serialize(format=\"turtle\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ad87cd34", + "metadata": {}, + "source": [ + "### The `/` and the `*` predicate modifiers\n", "\n", "SparQL can correlate\n", "entries using semantically defined\n", - "vocabularies such as FOAF.\n", + "vocabularies such as [FOAF](http://xmlns.com/foaf/0.1/).\n", "\n", ":warning: The `PREFIX` statement in a sparql query\n", "must not have a trailing dot, because it is not a sentence.\n", "This is different from the `@prefix` statement\n", - "in turtle." + "in Turtle." ] }, { "cell_type": "code", "execution_count": null, - "id": "072ab7e5", + "id": "11369f77", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +536,7 @@ }, { "cell_type": "markdown", - "id": "5e691016", + "id": "42340039", "metadata": {}, "source": [ "In this case `foaf:name` has a very specific meaning.\n", @@ -260,7 +551,7 @@ }, { "cell_type": "markdown", - "id": "9f3b0220", + "id": "442abeca", "metadata": { "slideshow": { "slide_type": "subslide" @@ -276,7 +567,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5fcf96e6", + "id": "4d4847d9", "metadata": {}, "outputs": [], "source": [ @@ -296,7 +587,7 @@ }, { "cell_type": "markdown", - "id": "eb463dbe", + "id": "5c372fa1", "metadata": {}, "source": [ "The `*` operator matches a predicate\n", @@ -315,7 +606,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cefa4629", + "id": "663edabc", "metadata": {}, "outputs": [], "source": [ @@ -339,7 +630,7 @@ }, { "cell_type": "markdown", - "id": "129a47a2", + "id": "d5a094b4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -355,7 +646,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f964d6ee", + "id": "345daa86", "metadata": {}, "outputs": [], "source": [ @@ -381,7 +672,7 @@ }, { "cell_type": "markdown", - "id": "25aac0e3", + "id": "f5b10a62", "metadata": {}, "source": [ "Since we are not interested in the `user2` variable,\n", @@ -392,7 +683,7 @@ { "cell_type": "code", "execution_count": null, - "id": "44ad5679", + "id": "c6d938d2", "metadata": {}, "outputs": [], "source": [ @@ -415,7 +706,7 @@ }, { "cell_type": "markdown", - "id": "c59075dd", + "id": "69e617e4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -430,7 +721,7 @@ }, { "cell_type": "markdown", - "id": "a8d2941d", + "id": "3ec572f4", "metadata": { "slideshow": { "slide_type": "slide" @@ -439,8 +730,138 @@ "source": [ "---\n", "\n", + "### Querying the whole dataset\n", + "\n", + "\n", + "What happens if I query the whole dataset?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1223c06a", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"SELECT DISTINCT *\n", + "WHERE {\n", + " [] a ?Class\n", + "}\n", + "LIMIT 10\n", + "\"\"\"\n", + "d.query(q).bindings" + ] + }, + { + "cell_type": "markdown", + "id": "ff2c1b32", + "metadata": {}, + "source": [ + "Now, try to query each graph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c31d7e05", + "metadata": {}, + "outputs": [], + "source": [ + "for g in d.graphs():\n", + " print({g.identifier.n3(): g.query(q).bindings})" + ] + }, + { + "cell_type": "markdown", + "id": "8af04548", + "metadata": {}, + "source": [ + "There's a `Dataset` attribute that allows to query all the graphs in the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cdc51969", + "metadata": {}, + "outputs": [], + "source": [ + "# By default, sparql does not query all the graphs.\n", + "assert d.default_union == False\n", + "\n", + "# .. but you can change this behaviour...\n", + "d.default_union = True\n", + "\n", + "# ... and now you can query all the graphs.\n", + "d.query(q).bindings" + ] + }, + { + "cell_type": "markdown", + "id": "4e927a3f", + "metadata": {}, + "source": [ + "I can also query all the graphs in the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "459bc2a8", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"SELECT DISTINCT *\n", + "WHERE {\n", + " GRAPH ?g {}\n", + "}\n", + "\"\"\"\n", + "result = d.query(q)\n", + "{str(r.g): len(r) for r in result}" + ] + }, + { + "cell_type": "markdown", + "id": "57fee037", + "metadata": {}, + "source": [ + "Or querying triples in a specific graph:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f969f6f", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"SELECT DISTINCT *\n", + "WHERE {\n", + " GRAPH <_:simpsons> {\n", + " ?p a foaf:Person .\n", + " }\n", + "}\n", + "\"\"\"\n", + "result = d.query(q)\n", + "{str(r.p): r.p for r in result}" + ] + }, + { + "cell_type": "markdown", + "id": "8b348d3b", + "metadata": {}, + "source": [ + "💪 Exercise: querying the dataset\n", + "\n", + "- Query the `_:sample` graph\n", + " to list all the `foaf:Person`s in it.\n", + "\n", + "\n", + "\n", "# Querying DBPedia\n", "\n", + ":warning: DBPedia may rate limit your queries.\n", + "\n", "[DBPedia](https://dbpedia.org/sparql) is a graph database with a lot of data inside.\n", "\n", "We can use it to learn sparql.\n", @@ -451,7 +872,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a8022feb", + "id": "4a908617", "metadata": { "attributes": { "classes": [ @@ -472,7 +893,7 @@ }, { "cell_type": "markdown", - "id": "3690bc72", + "id": "86b1a1d4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -487,7 +908,7 @@ { "cell_type": "code", "execution_count": null, - "id": "26dd4f10", + "id": "1469aa15", "metadata": { "attributes": { "classes": [ @@ -510,7 +931,7 @@ }, { "cell_type": "markdown", - "id": "d40dbc06", + "id": "31c8835f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -525,7 +946,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a6909c0f", + "id": "deb2dc46", "metadata": { "attributes": { "classes": [ @@ -551,7 +972,7 @@ }, { "cell_type": "markdown", - "id": "00f2c1d1", + "id": "a243a0bc", "metadata": {}, "source": [ "... with their deathplaces" @@ -560,7 +981,7 @@ { "cell_type": "code", "execution_count": null, - "id": "68dc8630", + "id": "a1a0e244", "metadata": { "attributes": { "classes": [ @@ -588,7 +1009,7 @@ }, { "cell_type": "markdown", - "id": "b05d64f8", + "id": "289e41ed", "metadata": { "slideshow": { "slide_type": "subslide" @@ -603,7 +1024,7 @@ { "cell_type": "code", "execution_count": null, - "id": "05edb225", + "id": "030f489e", "metadata": { "attributes": { "classes": [ @@ -630,7 +1051,7 @@ }, { "cell_type": "markdown", - "id": "981b76f9", + "id": "f967088c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -649,7 +1070,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d41a9fec", + "id": "8d2b28ca", "metadata": { "attributes": { "classes": [ @@ -679,7 +1100,7 @@ }, { "cell_type": "markdown", - "id": "f66d126a", + "id": "75c338ba", "metadata": { "slideshow": { "slide_type": "subslide" @@ -696,7 +1117,7 @@ { "cell_type": "code", "execution_count": null, - "id": "882feefb", + "id": "da4586f0", "metadata": { "attributes": { "classes": [ @@ -728,7 +1149,7 @@ }, { "cell_type": "markdown", - "id": "9d6d054f", + "id": "ab46cae9", "metadata": { "slideshow": { "slide_type": "subslide" @@ -743,7 +1164,7 @@ { "cell_type": "code", "execution_count": null, - "id": "086e4214", + "id": "6bf5941e", "metadata": { "attributes": { "classes": [ diff --git a/sparql-101/notebooks/07-jsonld.ipynb b/sparql-101/notebooks/07-jsonld.ipynb index 496d6eb..cf8107c 100644 --- a/sparql-101/notebooks/07-jsonld.ipynb +++ b/sparql-101/notebooks/07-jsonld.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "384d8485", + "id": "387059a8", "metadata": {}, "source": [ "# Agenda\n", @@ -22,7 +22,7 @@ }, { "cell_type": "markdown", - "id": "ad8329a1", + "id": "13ff29be", "metadata": {}, "source": [ "```yaml\n", @@ -35,7 +35,7 @@ }, { "cell_type": "markdown", - "id": "4094059a", + "id": "c2be4bac", "metadata": {}, "source": [ "We can then add identifiers (such as UUIDs or email), to be sure that cross references\n", @@ -44,7 +44,7 @@ }, { "cell_type": "markdown", - "id": "009856a6", + "id": "9d263ea3", "metadata": {}, "source": [ "```yaml\n", @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "3982fbf9", + "id": "21a847c8", "metadata": {}, "source": [ "Now we may have different datasets, such as the Springfield Elementary\n", @@ -67,7 +67,7 @@ }, { "cell_type": "markdown", - "id": "53bb6e2f", + "id": "b001dee0", "metadata": {}, "source": [ "```yaml\n", @@ -80,7 +80,7 @@ }, { "cell_type": "markdown", - "id": "e37eace6", + "id": "0a2e351e", "metadata": {}, "source": [ "So we actually store data, but we lack knowledge.\n", @@ -95,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "a6738316", + "id": "220c3ecc", "metadata": {}, "source": [ "----" @@ -104,7 +104,7 @@ { "cell_type": "code", "execution_count": null, - "id": "64d8797b", + "id": "b974a25d", "metadata": {}, "outputs": [], "source": [ @@ -118,7 +118,7 @@ }, { "cell_type": "markdown", - "id": "c1918357", + "id": "e9614fc9", "metadata": {}, "source": [ "JSON-LD associates it with a context that disambiguates information" @@ -127,7 +127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "672265e9", + "id": "26ca6b0a", "metadata": {}, "outputs": [], "source": [ @@ -148,7 +148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "39b957bd", + "id": "ce5a32bd", "metadata": {}, "outputs": [], "source": [ @@ -160,7 +160,7 @@ }, { "cell_type": "markdown", - "id": "b571bacf", + "id": "dd4ccc50", "metadata": {}, "source": [ "Exercise:\n", @@ -172,7 +172,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d60e6e84", + "id": "285ab293", "metadata": {}, "outputs": [], "source": [ @@ -181,7 +181,7 @@ }, { "cell_type": "markdown", - "id": "5e805734", + "id": "18ba0ecc", "metadata": {}, "source": [ "\n", @@ -191,7 +191,7 @@ }, { "cell_type": "markdown", - "id": "e1f3e7e6", + "id": "8e7ce3c3", "metadata": { "slideshow": { "slide_type": "slide" @@ -213,7 +213,7 @@ }, { "cell_type": "markdown", - "id": "2c090b72", + "id": "0053df67", "metadata": { "slideshow": { "slide_type": "slide" @@ -228,7 +228,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c921c440", + "id": "1744be69", "metadata": {}, "outputs": [], "source": [ @@ -242,7 +242,7 @@ }, { "cell_type": "markdown", - "id": "0b69fe7d", + "id": "70ec7264", "metadata": {}, "source": [ "Annotate it with schema.org." @@ -251,12 +251,12 @@ { "cell_type": "code", "execution_count": null, - "id": "94d53a5b", + "id": "9fd683cd", "metadata": {}, "outputs": [], "source": [ "context = {\n", - " \"sdo\": \"http://schema.org//",\n", + " \"sdo\": \"https://schema.org//",\n", " \"nome\": \"sdo:name\",\n", " \"nome_proprio\": \"sdo:givenName\",\n", " \"titolo\": \"sdo:jobTitle\",\n", @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9454cf55", + "id": "a46cb6e4", "metadata": {}, "outputs": [], "source": [ @@ -282,7 +282,7 @@ }, { "cell_type": "markdown", - "id": "0c39ed51", + "id": "02fcddf4", "metadata": {}, "source": [ "Exercise:\n", @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e79fb5c9", + "id": "c6e92c20", "metadata": {}, "outputs": [], "source": [ @@ -303,7 +303,7 @@ }, { "cell_type": "markdown", - "id": "67e71f22", + "id": "c81615a8", "metadata": { "slideshow": { "slide_type": "slide" @@ -320,7 +320,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9cfb4e7f", + "id": "f3d579be", "metadata": {}, "outputs": [], "source": [ @@ -344,7 +344,7 @@ }, { "cell_type": "markdown", - "id": "ad333619", + "id": "b5b6deb6", "metadata": {}, "source": [ "Now we can serialize the graph." @@ -353,7 +353,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5524f85b", + "id": "d723bd96", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ }, { "cell_type": "markdown", - "id": "43e11363", + "id": "39e300d0", "metadata": {}, "source": [ "Another localization mechanism allows\n", @@ -375,7 +375,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9cec6010", + "id": "1bb01d0b", "metadata": {}, "outputs": [], "source": [ @@ -394,7 +394,7 @@ }, { "cell_type": "markdown", - "id": "534931c7", + "id": "eb658906", "metadata": { "slideshow": { "slide_type": "slide" @@ -417,7 +417,7 @@ }, { "cell_type": "markdown", - "id": "1f3b1a16", + "id": "a7937358", "metadata": {}, "source": [ "```yaml\n", @@ -429,7 +429,7 @@ }, { "cell_type": "markdown", - "id": "1fb83e7a", + "id": "510f42c9", "metadata": {}, "source": [ "Someone altering the \n", @@ -438,7 +438,7 @@ }, { "cell_type": "markdown", - "id": "183da940", + "id": "9bb7f6d3", "metadata": {}, "source": [ "```yaml\n", @@ -451,7 +451,7 @@ }, { "cell_type": "markdown", - "id": "eb052a91", + "id": "2718bca9", "metadata": {}, "source": [ "->" @@ -459,7 +459,7 @@ }, { "cell_type": "markdown", - "id": "cc24dd62", + "id": "65b836d7", "metadata": {}, "source": [ "```yaml\n", @@ -472,7 +472,7 @@ }, { "cell_type": "markdown", - "id": "94498462", + "id": "ad120fd1", "metadata": { "slideshow": { "slide_type": "subslide" diff --git a/sparql-101/notebooks/09-syntax-semantic.ipynb b/sparql-101/notebooks/09-syntax-semantic.ipynb deleted file mode 100644 index d7007f0..0000000 --- a/sparql-101/notebooks/09-syntax-semantic.ipynb +++ /dev/null @@ -1,405 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "3a42dde6", - "metadata": {}, - "source": [ - "# Modeling Semantic APIs\n", - "\n", - "## Agenda\n", - "\n", - "- API e Semantica\n", - "- json-schema e json-ld" - ] - }, - { - "cell_type": "markdown", - "id": "c2cacd15", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## API e Semantica\n", - "\n", - "Quando scambiamo informazioni tramite API\n", - "la semantica non è sempre chiara:\n", - "\n", - "- è implicita;\n", - "- è in qualche pdf/xls;\n", - "- non è machine readable.\n", - "\n", - "Descrivendo un'API con un IDL (wsdl o OAS3)\n", - "possiamo descrivere la semantica includendola\n", - "nell'IDL." - ] - }, - { - "cell_type": "markdown", - "id": "a27295d6", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "### Semantica e Sintassi\n", - "\n", - "La descrizione semantica di un'API\n", - "non abilita necessariamente delle comunicazioni\n", - "efficienti e sicure.\n", - "\n", - "Per validare un oggetto json-ld, serve risolverne\n", - "ricorsivamente tutte le referenze:\n", - "è complesso farlo in maniera sincrona.\n", - "\n", - "La possibilità di validare sintatticamente\n", - "i dati inoltre semplifica molto il quadro di interoperabilità.\n", - "\n", - "Definendo inoltre la semantica va\n", - "definita in fase di specifica\n", - "evita di dover risolvere a runtime\n", - "referenze ricorsive\n", - "ed evita problemi di \"@context mangling\"." - ] - }, - { - "cell_type": "markdown", - "id": "15e088aa", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "#### Collegare context e dati\n", - "\n", - "Le specifiche json-ld definiscono un meccanismo per\n", - "per descrivere il contesto di un content json tramite `Link` header." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a921a056", - "metadata": { - "attributes": { - "classes": [ - "http" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "HTTP/1.1 200 OK\n", - "Content-Type: application/json\n", - "Link: ;\n", - " rel=\"http://www.w3.org/ns/json-ld#context\"; type=\"application/ld+json\"\n", - "\n", - "{ \"given_name\": \"Roberto\", \"family_name\": \"Polli\" }" - ] - }, - { - "cell_type": "markdown", - "id": "014874b9", - "metadata": {}, - "source": [ - "Ma non un meccanismo per associare queste informazioni ad uno schema." - ] - }, - { - "cell_type": "markdown", - "id": "8d886a11", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "#### Collegare context e schema\n", - "\n", - "RDF non permette sempre di associare uno schema univoco agli\n", - "elementi di un grafo.\n", - "\n", - "Anche associando una `Location` al luogo di nascita\n", - "di una persona tramite `rdfs:range` con" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b5abf24a", - "metadata": { - "attributes": { - "classes": [ - "turtle" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "prefix cpv: .\n", - "prefix l0: .\n", - "\n", - "cpv:hasBirthPlace rdfs:range l0:Location" - ] - }, - { - "cell_type": "markdown", - "id": "93af78e8", - "metadata": {}, - "source": [ - "non è detto che sia semplice associare una sintassi\n", - "a `Location` che, in questo caso potrebbe essere ad esempio:\n", - "\n", - "- un indirizzo\n", - "- una coppia di coordinate\n", - "- l'URI di un luogo" - ] - }, - { - "cell_type": "markdown", - "id": "4ff65249", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Uno scambio efficiente di informazioni in tempo reale\n", - "richiede una sintassi ben definita\n", - "validabile a runtime in modo efficiente.\n", - "\n", - "La sintassi può essere validata con specifiche quali\n", - "[json-schema]() e [xmlschema]().\n", - "\n", - "json-schema può essere usato anche per validare\n", - "la sintassi di un file json-ld." - ] - }, - { - "cell_type": "markdown", - "id": "b52da7d7", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Per dichiarare il @context associandolo ad uno schema\n", - "possiamo integrarlo nella definizione attraverso\n", - "un valore `const`.\n", - "Se una property è esterna al vocabolario,\n", - "basta\n", - "[disassociarla dal vocabolario](https://w3c.github.io/json-ld-syntax/#example-25-using-the-null-keyword-to-ignore-data)\n", - "assegnandole il valore `null`." - ] - }, - { - "cell_type": "markdown", - "id": "b2bdf902", - "metadata": {}, - "source": [ - "```yaml\n", - "# Associate a json-ld context to a schema\n", - "Customer:\n", - "  type: object\n", - "  required: [email]\n", - "  properties:\n", - " \"@context\":\n", - " const:\n", - " \"@vocab\": \"http://schema.org/"\n", - " pet: null\n", - " email: {type: string}\n", - "    pet: {type: string}\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "fa65a21c", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "E' anche possibile indicare un link,\n", - "evitando però di usarlo per poi alterare\n", - "la semantica dei dati." - ] - }, - { - "cell_type": "markdown", - "id": "10965c44", - "metadata": {}, - "source": [ - "```yaml\n", - "# Associate a json-ld context to a schema\n", - "Customer:\n", - "  type: object\n", - "  required: [email]\n", - "  properties:\n", - " \"@context\":\n", - " const: \"https://api.example/customer-context.jsonld/"\n", - " email: {type: string}\n", - "    pet: {type: string}\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "3fe6d8af", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Descrivendo un'API in formato OAS3 possiamo\n", - "descrivere i diversi formati usando i meccanismi\n", - "di content-negotiation." - ] - }, - { - "cell_type": "markdown", - "id": "7fc4de4c", - "metadata": {}, - "source": [ - "```yaml\n", - "openapi: 3.0.1\n", - "...\n", - "paths:\n", - " /users:\n", - " get:\n", - " ...\n", - " responses:\n", - " \"200\":\n", - " content:\n", - " application/json:\n", - " schema:\n", - " $ref: \"#/components/schemas/Person\"\n", - " application/ld+json:\n", - " schema:\n", - " allOf:\n", - " - type: object\n", - " properties:\n", - " \"@context\":\n", - " const:\n", - " \"@vocab\": \"https://w3id.org/italia/onto/CPV//"\n", - " given_name: givenName\n", - " family_name: familyName\n", - " - $ref: \"#/components/schemas/Person\"\n", - "\n", - "\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "0654deae", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "### Vocabolario per la semantica\n", - "\n", - "Un altro meccanismo per collegare @context\n", - "e schema, è quello di utilizzare un vocabolario\n", - "e delle parole chiavi all'interno dello schema.\n", - "\n", - "Questo meccanismo è più semplice, ma richiede\n", - "di generare il @context a partire da un vocabolario esterno." - ] - }, - { - "cell_type": "markdown", - "id": "63a021ca", - "metadata": {}, - "source": [ - "```yaml\n", - "Person:\n", - " type: object\n", - " properties:\n", - " givenName:\n", - " type: string\n", - " x-refersTo: https://w3id.org/italia/onto/CPV/givenName\n", - " familyName:\n", - " x-refersTo: https://w3id.org/italia/onto/CPV/familyName\n", - " type: string\n", - "\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "ace30271", - "metadata": {}, - "source": [ - "### Ontologia per json-schema\n", - "\n", - "Il progetto [Web of Things](https://w3.org/ns/td.jsonld) definisce invece\n", - "un vocabolario per \"Thing description\" in formato json-ld dove ad ogni property viene associato\n", - "sia un valore semantico che uno sintattico tramite il vocabolario\n", - "[json-schema](https://w3.org/ns/json-schema/).\n", - "\n", - "## Trasformare dati semantici\n", - "\n", - "E' possibile trasformare dei dati semanticamente definiti in diversi formati\n", - "usando una serie di specifiche.\n", - "\n", - "- https://www.w3.org/2013/csvw/wiki/CSV-LD\n", - "- https://www.w3.org/TR/json-ld-framing/ force a specific tree layout to a JSON-LD document." - ] - }, - { - "cell_type": "markdown", - "id": "b6abad78", - "metadata": {}, - "source": [ - "```mermaid\n", - "flowchart\n", - "\n", - " RDF--Framing--> JSON --context--> RDF\n", - " CSV --csv-ld--> RDF\n", - "\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "9479b3d7", - "metadata": {}, - "source": [ - "---" - ] - } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/sparql-101/notebooks/10-rdf.ipynb b/sparql-101/notebooks/10-rdf.ipynb index 6b667eb..7b94188 100644 --- a/sparql-101/notebooks/10-rdf.ipynb +++ b/sparql-101/notebooks/10-rdf.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "9cffa82c", + "id": "f74b921c", "metadata": {}, "source": [ "# Graph databases & SparQL\n", @@ -18,7 +18,7 @@ }, { "cell_type": "markdown", - "id": "01e544e8", + "id": "8f61b780", "metadata": { "slideshow": { "slide_type": "subslide" @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b8ab1bc7", + "id": "5c6c8905", "metadata": {}, "outputs": [], "source": [ @@ -46,7 +46,7 @@ }, { "cell_type": "markdown", - "id": "4bf1396f", + "id": "60757d17", "metadata": { "slideshow": { "slide_type": "slide" @@ -76,7 +76,7 @@ }, { "cell_type": "markdown", - "id": "a6ffcbb9", + "id": "becc956f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -99,7 +99,7 @@ }, { "cell_type": "markdown", - "id": "7c9a105a", + "id": "28850f34", "metadata": { "slideshow": { "slide_type": "subslide" @@ -125,7 +125,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ae7427ae", + "id": "603c873f", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +136,7 @@ }, { "cell_type": "markdown", - "id": "71c72e8a", + "id": "7c66f0cd", "metadata": {}, "source": [ "Exercise:\n", @@ -149,7 +149,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7b03243d", + "id": "52ee750c", "metadata": {}, "outputs": [], "source": [ @@ -161,7 +161,7 @@ { "cell_type": "code", "execution_count": null, - "id": "31ebab4c", + "id": "6fa662f8", "metadata": {}, "outputs": [], "source": [ @@ -174,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "212b8e76", + "id": "a3d517dd", "metadata": {}, "outputs": [], "source": [ @@ -187,119 +187,17 @@ }, { "cell_type": "markdown", - "id": "7ebdadc0", + "id": "6d19c94f", "metadata": {}, "source": [ "See also:\n", "\n", - "- \n", - "\n", - "Now create another graph" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3906f4f0", - "metadata": {}, - "outputs": [], - "source": [ - "simpsons = d.graph(identifier=\"urn:example:simpsons\")\n", - "simpsons.parse(\"simpsons.ttl\", format=\"ox-turtle\")" - ] - }, - { - "cell_type": "markdown", - "id": "9d4e51aa", - "metadata": {}, - "source": [ - "Now list the graphs in the dataset:\n", - "note that the default graph does not contain triples." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8cc286ad", - "metadata": {}, - "outputs": [], - "source": [ - "print(\n", - " {k.identifier.n3(): len(k) for k in d.graphs()}\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "f124709b", - "metadata": {}, - "source": [ - "What happens if I query the dataset?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ab811073", - "metadata": {}, - "outputs": [], - "source": [ - "q = \"\"\"SELECT DISTINCT *\n", - "WHERE {\n", - " [] a ?Class\n", - "}\n", - "LIMIT 10\n", - "\"\"\"\n", - "d.query(q).bindings" + "- " ] }, { "cell_type": "markdown", - "id": "820b4943", - "metadata": {}, - "source": [ - "Now, try to query each graph" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "71cf57c9", - "metadata": {}, - "outputs": [], - "source": [ - "for g in d.graphs():\n", - " print({g.identifier.n3(): g.query(q).bindings})" - ] - }, - { - "cell_type": "markdown", - "id": "7f65e49f", - "metadata": {}, - "source": [ - "There's a Dataset flag that allows to query all the graphs in the dataset." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2613d4a9", - "metadata": {}, - "outputs": [], - "source": [ - "# By default, sparql does not query all the graphs.\n", - "assert d.default_union == False\n", - "\n", - "# .. but you can change this behaviour...\n", - "d.default_union = True\n", - "\n", - "# ... and now you can query all the graphs.\n", - "d.query(q).bindings" - ] - }, - { - "cell_type": "markdown", - "id": "d2b40d6d", + "id": "17bafc46", "metadata": { "slideshow": { "slide_type": "slide" @@ -320,7 +218,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d39c7160", + "id": "a84e58f7", "metadata": {}, "outputs": [], "source": [ @@ -336,7 +234,7 @@ }, { "cell_type": "markdown", - "id": "78c49046", + "id": "9cc2c275", "metadata": { "slideshow": { "slide_type": "slide" @@ -353,7 +251,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a5fd9dc5", + "id": "9bc2d6c9", "metadata": {}, "outputs": [], "source": [ @@ -378,7 +276,7 @@ }, { "cell_type": "markdown", - "id": "ba8de546", + "id": "3221f9b2", "metadata": {}, "source": [ "Exercise:\n", @@ -403,15 +301,8 @@ { "cell_type": "code", "execution_count": null, - "id": "99294a86", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, + "id": "526155ac", + "metadata": {}, "outputs": [], "source": [ "q = \"\"\"\n", @@ -442,7 +333,7 @@ }, { "cell_type": "markdown", - "id": "5c1f8d21", + "id": "27674fe5", "metadata": {}, "source": [ "Let's visualize the graph." @@ -451,7 +342,7 @@ { "cell_type": "code", "execution_count": null, - "id": "404ea94f", + "id": "c755f9df", "metadata": {}, "outputs": [], "source": [ @@ -463,7 +354,7 @@ }, { "cell_type": "markdown", - "id": "8b00e217", + "id": "4e4fd383", "metadata": {}, "source": [ "#### More metadata\n", @@ -475,7 +366,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c474cc66", + "id": "95137392", "metadata": {}, "outputs": [], "source": [ @@ -508,7 +399,7 @@ }, { "cell_type": "markdown", - "id": "ddc65b42", + "id": "e5e24831", "metadata": { "slideshow": { "slide_type": "slide" @@ -525,7 +416,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fcd1d493", + "id": "aea18c26", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/11-sparql-metadata.ipynb b/sparql-101/notebooks/11-sparql-metadata.ipynb index f4db06e..e28e875 100644 --- a/sparql-101/notebooks/11-sparql-metadata.ipynb +++ b/sparql-101/notebooks/11-sparql-metadata.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "66959832", + "id": "ad108b64", "metadata": {}, "source": [ "# Agenda\n", @@ -22,7 +22,7 @@ { "cell_type": "code", "execution_count": null, - "id": "63209b60", + "id": "ac6d8963", "metadata": {}, "outputs": [], "source": [ @@ -34,7 +34,7 @@ }, { "cell_type": "markdown", - "id": "cfe66ec1", + "id": "ea27adb4", "metadata": {}, "source": [ "And query the simplest metadata." @@ -43,7 +43,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c67c74b6", + "id": "1f4b5bcb", "metadata": {}, "outputs": [], "source": [ @@ -61,7 +61,7 @@ }, { "cell_type": "markdown", - "id": "69200742", + "id": "9f68640e", "metadata": {}, "source": [ "We can simplify the above query\n", @@ -73,7 +73,7 @@ { "cell_type": "code", "execution_count": null, - "id": "29cf8d79", + "id": "dc5d9058", "metadata": {}, "outputs": [], "source": [ @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "1c633bcd", + "id": "f6b5708e", "metadata": {}, "source": [ "Exercise:\n", @@ -103,7 +103,7 @@ }, { "cell_type": "markdown", - "id": "7470f6a6", + "id": "d93833b9", "metadata": { "slideshow": { "slide_type": "subslide" @@ -119,7 +119,7 @@ { "cell_type": "code", "execution_count": null, - "id": "eb23ac8c", + "id": "45d95389", "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "5920a054", + "id": "9aac48e0", "metadata": {}, "source": [ "Exercise:\n", @@ -152,7 +152,7 @@ }, { "cell_type": "markdown", - "id": "9dd2f7ed", + "id": "42593695", "metadata": { "slideshow": { "slide_type": "subslide" @@ -169,7 +169,7 @@ { "cell_type": "code", "execution_count": null, - "id": "afc6662f", + "id": "81af1964", "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ }, { "cell_type": "markdown", - "id": "582a2e6e", + "id": "402db08f", "metadata": {}, "source": [ "Exercise:\n", @@ -200,7 +200,7 @@ { "cell_type": "code", "execution_count": null, - "id": "50f20648", + "id": "e072bcf2", "metadata": {}, "outputs": [], "source": [ @@ -219,7 +219,7 @@ }, { "cell_type": "markdown", - "id": "86b9f2c3", + "id": "681ccc37", "metadata": { "slideshow": { "slide_type": "slide" @@ -237,7 +237,7 @@ }, { "cell_type": "markdown", - "id": "ffad2759", + "id": "ee488964", "metadata": {}, "source": [ "```mermaid\n", @@ -259,7 +259,7 @@ }, { "cell_type": "markdown", - "id": "8058ee1d", + "id": "0fe94b3a", "metadata": { "slideshow": { "slide_type": "slide" @@ -275,7 +275,7 @@ { "cell_type": "code", "execution_count": null, - "id": "97e4a24d", + "id": "b152b031", "metadata": {}, "outputs": [], "source": [ @@ -298,7 +298,7 @@ }, { "cell_type": "markdown", - "id": "507895d4", + "id": "71ec1503", "metadata": {}, "source": [ "Exercise:\n", @@ -312,7 +312,7 @@ }, { "cell_type": "markdown", - "id": "a30b5c0f", + "id": "7161c4d9", "metadata": { "slideshow": { "slide_type": "slide" @@ -328,7 +328,7 @@ }, { "cell_type": "markdown", - "id": "cb83e676", + "id": "4aa9cb2c", "metadata": { "slideshow": { "slide_type": "slide" @@ -348,7 +348,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ea87517c", + "id": "15f81dd4", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ { "cell_type": "code", "execution_count": null, - "id": "056bd8ec", + "id": "4538693e", "metadata": {}, "outputs": [], "source": [ @@ -389,7 +389,7 @@ }, { "cell_type": "markdown", - "id": "ecfe7550", + "id": "f9c21cfd", "metadata": {}, "source": [ "Now we will infer how countries are modeled\n", @@ -408,7 +408,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9044c973", + "id": "d681e3eb", "metadata": {}, "outputs": [], "source": [ @@ -428,7 +428,7 @@ }, { "cell_type": "markdown", - "id": "7eac1dfb", + "id": "17f12003", "metadata": {}, "source": [ "The data model extracted from the graph:\n", @@ -439,7 +439,7 @@ }, { "cell_type": "markdown", - "id": "131b6b32", + "id": "ae5477e6", "metadata": {}, "source": [ "```mermaid\n", diff --git a/sparql-101/notebooks/12-enriching-data.ipynb b/sparql-101/notebooks/12-enriching-data.ipynb index b75c068..122e0b2 100644 --- a/sparql-101/notebooks/12-enriching-data.ipynb +++ b/sparql-101/notebooks/12-enriching-data.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "0e54704d", + "id": "1dc100cf", "metadata": {}, "source": [ "# Agenda\n", @@ -45,7 +45,7 @@ }, { "cell_type": "markdown", - "id": "459a9f7c", + "id": "9ad27853", "metadata": {}, "source": [ "```mermaid\n", @@ -78,7 +78,7 @@ }, { "cell_type": "markdown", - "id": "0ba8e8a8", + "id": "01bf2e74", "metadata": {}, "source": [ "Storing data in a graph allows to use\n", @@ -88,7 +88,7 @@ }, { "cell_type": "markdown", - "id": "0e6a0361", + "id": "a2dbd5ae", "metadata": { "slideshow": { "slide_type": "slide" @@ -103,7 +103,7 @@ { "cell_type": "code", "execution_count": null, - "id": "59cbe9c8", + "id": "60d07b06", "metadata": {}, "outputs": [], "source": [ @@ -118,7 +118,7 @@ }, { "cell_type": "markdown", - "id": "ecbc0e6e", + "id": "64b7c8d8", "metadata": {}, "source": [ "Add a context to the dataset." @@ -127,7 +127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "abf88dec", + "id": "95e149be", "metadata": {}, "outputs": [], "source": [ @@ -146,7 +146,7 @@ }, { "cell_type": "markdown", - "id": "ad29fbbc", + "id": "fd2afd39", "metadata": {}, "source": [ "Now assemble everything in a JSON-LD graph" @@ -155,7 +155,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8bbf5698", + "id": "3b9935ec", "metadata": {}, "outputs": [], "source": [ @@ -168,7 +168,7 @@ }, { "cell_type": "markdown", - "id": "bac1cf38", + "id": "268f3b57", "metadata": {}, "source": [ "Exercise:\n", @@ -179,7 +179,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3fd17203", + "id": "8d436421", "metadata": {}, "outputs": [], "source": [ @@ -192,7 +192,7 @@ }, { "cell_type": "markdown", - "id": "61c431e3", + "id": "4b3c0840", "metadata": {}, "source": [ "And create a dataset and bind the selected namespaces." @@ -201,7 +201,7 @@ { "cell_type": "code", "execution_count": null, - "id": "69e3feba", + "id": "cdf16284", "metadata": {}, "outputs": [], "source": [ @@ -217,7 +217,7 @@ }, { "cell_type": "markdown", - "id": "221d2c0a", + "id": "2b4b4bca", "metadata": {}, "source": [ "Exercise:\n", @@ -228,7 +228,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c56c6c9a", + "id": "c40f1bd9", "metadata": {}, "outputs": [], "source": [ @@ -239,7 +239,7 @@ }, { "cell_type": "markdown", - "id": "58bf6f4d", + "id": "0de8569d", "metadata": {}, "source": [ "Exercise:\n", @@ -253,7 +253,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4b37a5ad", + "id": "2e4895e8", "metadata": {}, "outputs": [], "source": [ @@ -262,7 +262,7 @@ }, { "cell_type": "markdown", - "id": "5ada99af", + "id": "74eb29b8", "metadata": {}, "source": [ "Now we have a graph to enrich with external data.\n", @@ -275,7 +275,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cff65c91", + "id": "159dc2e6", "metadata": {}, "outputs": [], "source": [ @@ -310,7 +310,7 @@ }, { "cell_type": "markdown", - "id": "37103281", + "id": "9eb36d1d", "metadata": {}, "source": [ "Exercise:\n", @@ -325,7 +325,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4e782e22", + "id": "921f318f", "metadata": {}, "outputs": [], "source": [ @@ -360,7 +360,7 @@ }, { "cell_type": "markdown", - "id": "e1f0d1c4", + "id": "7e6bbda1", "metadata": {}, "source": [ "Now we can see the country identifier in the graph." @@ -369,7 +369,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f334c01f", + "id": "1e51ea40", "metadata": {}, "outputs": [], "source": [ @@ -378,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "5ae1953d", + "id": "d82404ca", "metadata": {}, "source": [ "Now, we can even have a \"fat\" graph with all the information" @@ -387,7 +387,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c00b593a", + "id": "15071eb3", "metadata": {}, "outputs": [], "source": [ @@ -412,7 +412,7 @@ }, { "cell_type": "markdown", - "id": "2cf488a9", + "id": "4cee4bfe", "metadata": {}, "source": [ "We can also mangle the data a bit..." @@ -421,7 +421,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2d37155c", + "id": "9d1219a8", "metadata": {}, "outputs": [], "source": [ @@ -452,7 +452,7 @@ }, { "cell_type": "markdown", - "id": "ed47f959", + "id": "d1a9a02f", "metadata": {}, "source": [ "Exercise:\n", @@ -464,7 +464,7 @@ { "cell_type": "code", "execution_count": null, - "id": "05804563", + "id": "4fc1d942", "metadata": { "attributes": { "classes": [ diff --git a/sparql-101/notebooks/d3fend.ttl b/sparql-101/notebooks/d3fend.ttl index f2d6f0b..5a797da 100644 --- a/sparql-101/notebooks/d3fend.ttl +++ b/sparql-101/notebooks/d3fend.ttl @@ -35822,7 +35822,7 @@ On Linux, the process is sent a signal on the occurrence of various events: when Therefore, sending a signal to the process to ask it to terminate may not always work. -##### Avoiding Signal Traps +💪 Avoiding Signal Traps On Unix-like systems, sending the `SIGKILL` signal for a process does not send a message to the process or invoke an implementation-defined handler; instead, it immediately does not allow the process to execute any further processor instructions. On Windows `TerminateProcess()` instead of `ExitProcess()` performs the equivalent. @@ -35851,10 +35851,10 @@ On Windows, a DLL is unloaded when the reference count of the library reaches 0. After a process has been terminated, it may still take up an entry in the operating system process table until another event occurs. -##### Windows +💪 Windows In Windows, a process object is deleted when the last handle to the process is closed. -##### Linux +💪 Linux In Linux, a process is removed from the process table when it is reaped by its parent process. If the parent terminates, historically the parent has been changed to pid 1; however, in the Linux kernel 3.4 and above, processes can set a different process as the subreaper using the `prctl()` system call. Zombie processes and hung processes could be resolved with a restart of the system. diff --git a/sparql-101/notebooks/simpsons.ttl b/sparql-101/notebooks/simpsons.ttl index a33c122..03fa565 100644 --- a/sparql-101/notebooks/simpsons.ttl +++ b/sparql-101/notebooks/simpsons.ttl @@ -1,15 +1,30 @@ -# I simpsons. +# The simpsons. -@prefix : . -@prefix schema: . +# This is the URI for the first series of the Simpsons: +# See https://web.isan.org/public/it/isan/0000-0000-EBC9 +@prefix : . +@prefix schema: . +# schema.org/Person describes both +# real and fictional people. :Homer a schema:Person . :Homer schema:givenName "Homer" . -:Homer schema:familyName "Simpsons" . +:Homer schema:familyName "Simpson" . :Homer schema:spouse :Marge . +:Homer schema:nationality :USA . -:Marge a schema:Person . -:Marge schema:givenName "Marge" . -:Marge schema:familyName "Simpsons" . -:Marge schema:children :Bart . -:Marge schema:children :Lisa . + +# I can use a compact syntax +# to define the same thing. +:Marge a schema:Person ; + schema:givenName "Marge" ; + schema:familyName "Simpson" ; + schema:children :Bart, :Lisa ; + schema:nationality :USA +. + +# This is the fictional USA country +# in the Simpsons universe. +:USA a schema:Country ; + schema:name "United States of America"@en +. From 29379611adc56b65cf28113b46bbc28694e711e7 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Mon, 26 May 2025 18:41:04 +0200 Subject: [PATCH 46/52] Anticipating datasets. See #92 (#96) * Querying datasets. * add stuff --- sparql-101/05-sparql.md | 336 ++++++--- sparql-101/10-rdf.md | 5 +- sparql-101/notebooks/00-jupyter-intro.ipynb | 28 +- sparql-101/notebooks/00-teaser.ipynb | 76 +- sparql-101/notebooks/01-knowledge.ipynb | 156 ++-- sparql-101/notebooks/02-semantics.ipynb | 76 +- sparql-101/notebooks/05-sparql.ipynb | 666 ++++++++++++------ sparql-101/notebooks/07-jsonld.ipynb | 72 +- sparql-101/notebooks/10-rdf.ipynb | 53 +- sparql-101/notebooks/11-sparql-metadata.ipynb | 54 +- sparql-101/notebooks/12-enriching-data.ipynb | 85 ++- sparql-101/notebooks/sample.ttl | 7 + sparql-101/notebooks/simpsons.ttl | 6 +- 13 files changed, 992 insertions(+), 628 deletions(-) diff --git a/sparql-101/05-sparql.md b/sparql-101/05-sparql.md index c6f3d2e..af6f3a6 100644 --- a/sparql-101/05-sparql.md +++ b/sparql-101/05-sparql.md @@ -39,7 +39,7 @@ SparQL is a query language for RDF datasets and graphs. This lesson provides a non-exhaustive introduction to SparQL. -See: https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.html#dataset +See: ```python from rdflib import Dataset @@ -54,7 +54,10 @@ A sparql query retrieves all entries matching one or more sentences. ```python -q = """SELECT * +from rdflib.query import Result + +q = """ +SELECT * WHERE { ?subject ?predicate ?object . # ... more sentences ... @@ -62,16 +65,13 @@ WHERE { """ # The Dataset is still empty :) -d.query(q).bindings +result : Result = d.query(q) +list(result) ``` - - ---- - - -### Sparql: adding graphs: _:sample +### Storing and retrieving triples Open [sample.ttl](sample.ttl) in another tab and see its content. @@ -118,7 +118,7 @@ WHERE { } LIMIT 2 """ -result = g.query(q) +result : Result = g.query(q) [r.asdict() for r in result] ``` @@ -129,6 +129,8 @@ Exercise: - Replace the `*` with `?subject ?predicate ?object`. What happens? +:warning: `SELECT`ed fields are NOT separated by commas. + ```python # Use this cell for the exercise. @@ -141,7 +143,88 @@ for r in result: - Replace `?subject` with `?foo`: what happens? -### Serializing datasets +### Filtering triples + +We can filter the results using: + +- multiple sentences +- `FILTER` expressions + +```python +q = """ +SELECT + # You can write one variable per line + ?subject + ?status +WHERE { + ?subject foaf:status ?status . +} +""" +result = g.query(q) +list(result) +``` + +To restrict the query to a specific resource, +you can BIND a variable to a specific value. + +```python +q = """ +SELECT + ?subject + ?status +WHERE { + BIND( AS ?subject) . + + ?subject foaf:status ?status . +} +""" +result = g.query(q) +list(result) +``` + +We can use `FILTER` to restrict the results +where the ?country_name is in Italian. + +```python +q = """ +SELECT + ?subject ?status +WHERE { + BIND( AS ?subject) + + ?subject foaf:status ?status . + + FILTER (lang(?status) = "it") +} + +""" +result = g.query(q) +list(result) +``` + +### GROUP BY triples + +We can group the results using `GROUP BY` +and aggregate functions like `COUNT`, `SUM`, `AVG`, `GROUP_CONCAT`, etc. + +```python +q = """ +SELECT + ?subject + (COUNT(?object) AS ?count) +WHERE { + ?subject foaf:knows ?object . +} +GROUP BY ?subject +ORDER BY DESC(?count) +""" +result = g.query(q) +{str(r.subject): r.count for r in result} +``` + + + +### Serializing datasets in Trig format The [Trig](https://www.w3.org/TR/2013/REC-trig-20130321/) format extends Turtle to support multiple graphs. @@ -151,9 +234,7 @@ extends Turtle to support multiple graphs. print(d.serialize(format="trig")) ``` - - -### Sparql: querying graphs: _:simpsons +### Multi-graph datasets Let's add another graph to the dataset. @@ -177,11 +258,46 @@ g[[g variable]] -->|references| g_graph simpsons[[simpsons variable]] -->|references| simpsons_graph ``` -Now use the extended syntax with the `GRAPH` keyword. +### Querying the whole dataset + +What happens if I query the dataset? ```python q = """ -SELECT * +SELECT DISTINCT * +WHERE { + [] a ?Class +} +LIMIT 10 +""" +d.query(q).bindings +``` + +Now, try to query each graph + +```python +for g in d.graphs(): + print({g.identifier.n3(): g.query(q).bindings}) +``` + +:warning: By default, the `Dataset` queries *the default graph* +and not all the graphs + +```python +# By default, sparql does not query all the graphs. +assert d.default_union == False + +# .. but you can change this behaviour... +d.default_union = True + +# ... and now you can query all the graphs. +d.query(q).bindings +``` + +Now I can query all the graphs in the dataset + +```python +q = """SELECT DISTINCT * WHERE { GRAPH ?g {} } @@ -211,14 +327,99 @@ Exercise: - replace `?g` with `_:sample`: what happens? +Querying triples in a specific graph: + +```python +q = """ +SELECT DISTINCT * +WHERE { + GRAPH <_:simpsons> { + ?p a schema:Person . + } +} +""" +result = d.query(q) +{str(r.p): r.p for r in result} +assert list(result) +``` + +💪 Exercise: querying the dataset + +- Query the `_:sample` graph + to list all the `foaf:Person`s in it. + +Exercise: + +- query the `_:simpsons` graph + to list all the `schema:Person`s + having a `schema:nationality` property. + +```python +q = """ +SELECT DISTINCT + ?s +WHERE { + GRAPH <_:simpsons> { + ?s a schema:Person ; + schema:nationality ?country . + } +} +""" +result = d.query(q) +{str(r.s) for r in result} +``` + +- query the `_:simpsons` graph + matching the following sentences + + - ?subject has a schema:nationality ?country + - ?country has a schema:name ?country_name + - ?country_name is in Italian + +```python +q = """ +SELECT DISTINCT + ?subject ?country_name +WHERE { + GRAPH <_:simpsons> { + ?subject schema:nationality ?country . + ?country schema:name ?country_name . + FILTER (lang(?country_name) = "it") + } +} +""" +result = d.query(q) +{(str(r.subject), str(r.country_name)) for r in result} +``` ---- -### Enriching graphs: UPDATE +### Modifying graphs: INSERT DATA and UPDATE -The SparQL `UPDATE` command allows to modify a graph. -See https://www.w3.org/TR/sparql11-update/ +Use `INSERT DATA` to add new triples +to a graph. +Add the following sentence to the <_:sample> graph. + +> foaf:topic_interest + +getting help from the rdflib documentation + +```python +q = """ +INSERT DATA { + GRAPH <_:sample> { + foaf:topic_interest . + } +} +""" + +result = d.update(q) +assert "Homer" in d.graph("_:sample").serialize(format="turtle") +``` + +The SparQL `UPDATE` command updates a graph. +See ```python q = """ @@ -250,30 +451,6 @@ result = simpsons.update(q) assert "Homer Simpson" in simpsons.serialize(format="turtle") ``` -Update the <_:sample> graph -with the following sentence. - -> foaf:topic_interest - - -Use `INSERT DATA` to add a new triple, -and read the rdflib documentation https://rdflib.readthedocs.io/en/7.1.1/intro_to_sparql.html - -````python -q = """ -INSERT DATA { - GRAPH <_:sample> { - foaf:topic_interest . - } -} -""" - -result = d.update(q) -assert "Homer" in g.serialize(format="turtle") - -``` - - ### The `/` and the `*` predicate modifiers SparQL can correlate @@ -411,75 +588,34 @@ result = g.query(q) Note that the query describes each relation ignoring the way data is stored. ---- - -### Querying the whole dataset - - -What happens if I query the whole dataset? - -```python -q = """SELECT DISTINCT * -WHERE { - [] a ?Class -} -LIMIT 10 -""" -d.query(q).bindings -``` - -Now, try to query each graph - -```python -for g in d.graphs(): - print({g.identifier.n3(): g.query(q).bindings}) -``` - -There's a `Dataset` attribute that allows to query all the graphs in the dataset. - -```python -# By default, sparql does not query all the graphs. -assert d.default_union == False - -# .. but you can change this behaviour... -d.default_union = True - -# ... and now you can query all the graphs. -d.query(q).bindings -``` - -I can also query all the graphs in the dataset - ```python -q = """SELECT DISTINCT * -WHERE { - GRAPH ?g {} -} -""" -result = d.query(q) -{str(r.g): len(r) for r in result} -``` - -Or querying triples in a specific graph: - -```python -q = """SELECT DISTINCT * +q = """ +SELECT + ?s ?character_name ?country_name WHERE { - GRAPH <_:simpsons> { - ?p a foaf:Person . + GRAPH <_:sample> { + ?s a foaf:Person ; + foaf:topic_interest ?character . } + GRAPH <_:simpsons> { + ?character schema:nationality ?country . + ?character schema:name ?character_name . + ?country schema:name ?country_name . + FILTER (lang(?country_name) = "it") + } } """ result = d.query(q) -{str(r.p): r.p for r in result} +list(result) ``` -💪 Exercise: querying the dataset +Exercise: -- Query the `_:sample` graph - to list all the `foaf:Person`s in it. +- remove the GRAPH information from the query + and see what happens. +--- # Querying DBPedia diff --git a/sparql-101/10-rdf.md b/sparql-101/10-rdf.md index 4832daa..de4285d 100644 --- a/sparql-101/10-rdf.md +++ b/sparql-101/10-rdf.md @@ -39,7 +39,7 @@ Graph databases such as: store triples into graphs. -They can be queried using the [SparQL]() language. +They can be queried via [SparQL](). ---- @@ -60,8 +60,7 @@ Neo4j supports RDF datasets via the Neosemantics plugin. ## rdflib backends We will simulate a graph database using -[rdflib](https://rdflib.readthedocs.io/en/stable/index.html), -that supports SparQL queries. +[rdflib](https://rdflib.readthedocs.io/en/stable/index.html). rdflib supports multiple backends to parse and store triples. diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb index b445235..3c94fd5 100644 --- a/sparql-101/notebooks/00-jupyter-intro.ipynb +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2efbeaaf", + "id": "1519c270", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "9c3177d4", + "id": "db0efd67", "metadata": { "slideshow": { "slide_type": "slide" @@ -38,7 +38,7 @@ }, { "cell_type": "markdown", - "id": "2df859d9", + "id": "ba49fa2b", "metadata": { "slideshow": { "slide_type": "slide" @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "3f9f0546", + "id": "7f6c91b3", "metadata": { "slideshow": { "slide_type": "slide" @@ -74,7 +74,7 @@ }, { "cell_type": "markdown", - "id": "2db004b5", + "id": "676a7426", "metadata": { "slideshow": { "slide_type": "slide" @@ -98,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "5849bc6b", + "id": "fd481a83", "metadata": { "slideshow": { "slide_type": "slide" @@ -112,7 +112,7 @@ }, { "cell_type": "markdown", - "id": "a8b7bdd5", + "id": "c8350a45", "metadata": { "slideshow": { "slide_type": "subslide" @@ -127,7 +127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4d3d6059", + "id": "7cb895c1", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +136,7 @@ }, { "cell_type": "markdown", - "id": "863b1b25", + "id": "5c517cc9", "metadata": { "slideshow": { "slide_type": "slide" @@ -154,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14ef7278", + "id": "2d477a8c", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "ac721489", + "id": "ee724bd1", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -174,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e7319435", + "id": "a31adbe2", "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ }, { "cell_type": "markdown", - "id": "46ddaa5e", + "id": "53874d48", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "fb9b774f", + "id": "14819eb3", "metadata": {}, "source": [ "----" diff --git a/sparql-101/notebooks/00-teaser.ipynb b/sparql-101/notebooks/00-teaser.ipynb index 612c18b..729fb7b 100644 --- a/sparql-101/notebooks/00-teaser.ipynb +++ b/sparql-101/notebooks/00-teaser.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "5ed52847", + "id": "09733197", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "81b03bbd", + "id": "6ceec576", "metadata": { "slideshow": { "slide_type": "slide" @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3cbbca49", + "id": "cbd7bf8e", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "3d243282", + "id": "21afe7aa", "metadata": {}, "source": [ "(and some graph libraries)" @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "237491bf", + "id": "6684fc86", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "63d5bc72", + "id": "3bd4127d", "metadata": {}, "outputs": [], "source": [ @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "b86a7da7", + "id": "8f789d4b", "metadata": {}, "source": [ "For example network of persons:" @@ -94,7 +94,7 @@ { "cell_type": "code", "execution_count": null, - "id": "57a9371b", + "id": "f65c9e8d", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "f3c57113", + "id": "8531d218", "metadata": {}, "source": [ "... eventually rendered as a graph ..." @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fa441af4", + "id": "ea7d164d", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "7ced0817", + "id": "751d60cf", "metadata": {}, "source": [ "Convert it in [JSON-LD](https://json-ld.org/) format:" @@ -149,7 +149,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2b348fb5", + "id": "772459cf", "metadata": {}, "outputs": [], "source": [ @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "bdea67cb", + "id": "79916b8e", "metadata": {}, "source": [ "There's plenty of knowledge in the web!" @@ -168,7 +168,7 @@ { "cell_type": "code", "execution_count": null, - "id": "db073c41", + "id": "c2909b26", "metadata": {}, "outputs": [], "source": [ @@ -187,7 +187,7 @@ }, { "cell_type": "markdown", - "id": "ee07057b", + "id": "36fa2370", "metadata": {}, "source": [ "And we can connect them together" @@ -196,7 +196,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dc446974", + "id": "294181bf", "metadata": {}, "outputs": [], "source": [ @@ -211,7 +211,7 @@ }, { "cell_type": "markdown", - "id": "d8975bcd", + "id": "10dc8406", "metadata": {}, "source": [ "Graphs contain a lot of senteces" @@ -220,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bf7d1dd4", + "id": "8f2ad975", "metadata": {}, "outputs": [], "source": [ @@ -229,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "250c581a", + "id": "067426ce", "metadata": {}, "source": [ "but we can query them (e.g., for Italian food)" @@ -238,7 +238,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c324a8f0", + "id": "4e74fcbc", "metadata": {}, "outputs": [], "source": [ @@ -258,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "9690cd82", + "id": "15f61bb8", "metadata": {}, "source": [ "and see if two resources have something in common..." @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8cb6143e", + "id": "8850a8c5", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "c885222f", + "id": "fb21d020", "metadata": {}, "source": [ "We can query remote graphs (e.g., DBPedia):" @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ff0b6efc", + "id": "c624f038", "metadata": {}, "outputs": [], "source": [ @@ -319,7 +319,7 @@ }, { "cell_type": "markdown", - "id": "dca4f08f", + "id": "5ab3a3c8", "metadata": {}, "source": [ "Provided by different organizations" @@ -328,7 +328,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c6896cfb", + "id": "66e02f9f", "metadata": {}, "outputs": [], "source": [ @@ -358,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "ed074698", + "id": "cea5eb05", "metadata": {}, "source": [ "And their relations" @@ -367,7 +367,7 @@ { "cell_type": "code", "execution_count": null, - "id": "aa129192", + "id": "8024813f", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "abadc78f", + "id": "5855c7dc", "metadata": {}, "source": [ "More relations" @@ -406,7 +406,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b336ee8f", + "id": "8ec38803", "metadata": {}, "outputs": [], "source": [ @@ -437,7 +437,7 @@ }, { "cell_type": "markdown", - "id": "26b68d11", + "id": "53e07867", "metadata": { "slideshow": { "slide_type": "slide" @@ -452,7 +452,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e09390eb", + "id": "23a07494", "metadata": {}, "outputs": [], "source": [ @@ -461,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "295cb9f0", + "id": "be43cf1b", "metadata": { "slideshow": { "slide_type": "slide" @@ -476,7 +476,7 @@ { "cell_type": "code", "execution_count": null, - "id": "62952e03", + "id": "defe14cc", "metadata": {}, "outputs": [], "source": [ @@ -500,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "1925d826", + "id": "b32f1489", "metadata": {}, "source": [ "Get security insights from the NSA knowledge graph." @@ -509,7 +509,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f7f616ab", + "id": "64df39cb", "metadata": {}, "outputs": [], "source": [ @@ -526,7 +526,7 @@ }, { "cell_type": "markdown", - "id": "b34f2033", + "id": "5d16f491", "metadata": {}, "source": [ "and apply this stuff to our infrastructure." @@ -535,7 +535,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4d429c3b", + "id": "ca9f4235", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/01-knowledge.ipynb b/sparql-101/notebooks/01-knowledge.ipynb index 40a3425..d93c436 100644 --- a/sparql-101/notebooks/01-knowledge.ipynb +++ b/sparql-101/notebooks/01-knowledge.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "7237acef", + "id": "cd2b4781", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -18,7 +18,7 @@ }, { "cell_type": "markdown", - "id": "df076873", + "id": "510edeb1", "metadata": { "slideshow": { "slide_type": "subslide" @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5e4cc9dc", + "id": "f39f768e", "metadata": {}, "outputs": [], "source": [ @@ -47,7 +47,7 @@ }, { "cell_type": "markdown", - "id": "ffcfd662", + "id": "f72252a7", "metadata": { "slideshow": { "slide_type": "slide" @@ -68,7 +68,7 @@ }, { "cell_type": "markdown", - "id": "829b6ddd", + "id": "810c9c9c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -86,7 +86,7 @@ }, { "cell_type": "markdown", - "id": "a9578c83", + "id": "ca720e42", "metadata": { "slideshow": { "slide_type": "subslide" @@ -107,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "884a1044", + "id": "6c12ef0e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -128,7 +128,7 @@ }, { "cell_type": "markdown", - "id": "fbda97ba", + "id": "48ef67ba", "metadata": {}, "source": [ "```mermaid\n", @@ -139,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "3f02314d", + "id": "869265f6", "metadata": { "slideshow": { "slide_type": "subslide" @@ -157,7 +157,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1653fdfd", + "id": "98a8543a", "metadata": {}, "outputs": [], "source": [ @@ -167,7 +167,7 @@ }, { "cell_type": "markdown", - "id": "32ce1dec", + "id": "5d0935fe", "metadata": {}, "source": [ "We'll see how to use URIs to express knowledge." @@ -175,7 +175,7 @@ }, { "cell_type": "markdown", - "id": "28c4e2ff", + "id": "e86b20fc", "metadata": { "slideshow": { "slide_type": "subslide" @@ -194,7 +194,7 @@ }, { "cell_type": "markdown", - "id": "ae3196e6", + "id": "02a13d2c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -213,7 +213,7 @@ }, { "cell_type": "markdown", - "id": "c5d90448", + "id": "02638bf7", "metadata": {}, "source": [ "```mermaid\n", @@ -227,7 +227,7 @@ }, { "cell_type": "markdown", - "id": "5ba87853", + "id": "8c5264d3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -260,7 +260,7 @@ }, { "cell_type": "markdown", - "id": "74ee2de3", + "id": "a162e649", "metadata": { "slideshow": { "slide_type": "subslide" @@ -279,7 +279,7 @@ }, { "cell_type": "markdown", - "id": "7cceeae2", + "id": "d58c8eec", "metadata": {}, "source": [ "```mermaid\n", @@ -296,7 +296,7 @@ }, { "cell_type": "markdown", - "id": "e81c83f3", + "id": "163552d4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -310,7 +310,7 @@ }, { "cell_type": "markdown", - "id": "ea2e42c2", + "id": "456c638d", "metadata": {}, "source": [ "```mermaid\n", @@ -324,7 +324,7 @@ }, { "cell_type": "markdown", - "id": "4252d863", + "id": "2f822d16", "metadata": { "slideshow": { "slide_type": "subslide" @@ -342,7 +342,7 @@ }, { "cell_type": "markdown", - "id": "3f2a175a", + "id": "26d85cc9", "metadata": {}, "source": [ "```mermaid\n", @@ -367,7 +367,7 @@ }, { "cell_type": "markdown", - "id": "b8ac61fc", + "id": "b3fe6f6a", "metadata": {}, "source": [ "This is the basis of the Semantic Web,\n", @@ -379,7 +379,7 @@ }, { "cell_type": "markdown", - "id": "c4c03ef6", + "id": "8c5bbca0", "metadata": { "slideshow": { "slide_type": "subslide" @@ -413,7 +413,7 @@ }, { "cell_type": "markdown", - "id": "0175ec1a", + "id": "6fc063e7", "metadata": { "slideshow": { "slide_type": "subslide" @@ -437,7 +437,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6470cd38", + "id": "bd5c4cb6", "metadata": {}, "outputs": [], "source": [ @@ -448,7 +448,7 @@ }, { "cell_type": "markdown", - "id": "ca1b6452", + "id": "d7cca836", "metadata": {}, "source": [ "RDF is based on:\n", @@ -468,7 +468,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d5918ece", + "id": "c955f267", "metadata": {}, "outputs": [], "source": [ @@ -486,7 +486,7 @@ }, { "cell_type": "markdown", - "id": "fc53efc5", + "id": "3e612c73", "metadata": {}, "source": [ "#### Exercise: RDF elements\n", @@ -501,7 +501,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5979d9b5", + "id": "30a86d33", "metadata": {}, "outputs": [], "source": [ @@ -514,7 +514,7 @@ }, { "cell_type": "markdown", - "id": "a6186e1f", + "id": "f0304350", "metadata": {}, "source": [ "### Triples\n", @@ -526,7 +526,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7a44fc73", + "id": "436fc543", "metadata": {}, "outputs": [], "source": [ @@ -536,7 +536,7 @@ }, { "cell_type": "markdown", - "id": "2bfc2eb4", + "id": "4748f21d", "metadata": {}, "source": [ "Another triple serialized in the N3 format:" @@ -545,7 +545,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5ef3cc03", + "id": "91ccd8fb", "metadata": {}, "outputs": [], "source": [ @@ -556,7 +556,7 @@ }, { "cell_type": "markdown", - "id": "7036656d", + "id": "a40be5f5", "metadata": {}, "source": [ "The `a` keyword is a shorthand for the `rdf:type` predicate,\n", @@ -568,7 +568,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f63318d2", + "id": "7b978247", "metadata": {}, "outputs": [], "source": [ @@ -583,7 +583,7 @@ }, { "cell_type": "markdown", - "id": "3ad875f7", + "id": "d6018db7", "metadata": {}, "source": [ "### Graphs\n", @@ -594,7 +594,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8fca6982", + "id": "e6e170cc", "metadata": {}, "outputs": [], "source": [ @@ -606,7 +606,7 @@ }, { "cell_type": "markdown", - "id": "ef461608", + "id": "1c58b278", "metadata": {}, "source": [ "----" @@ -615,7 +615,7 @@ { "cell_type": "code", "execution_count": null, - "id": "450c9a35", + "id": "a9eb7fdb", "metadata": {}, "outputs": [], "source": [ @@ -628,7 +628,7 @@ }, { "cell_type": "markdown", - "id": "c9c80315", + "id": "0d8d3740", "metadata": {}, "source": [ "💪 Exercise: parse sentences\n", @@ -639,7 +639,7 @@ }, { "cell_type": "markdown", - "id": "a899acfe", + "id": "dee942f3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -654,7 +654,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5bb35e53", + "id": "0eb10f30", "metadata": {}, "outputs": [], "source": [ @@ -664,7 +664,7 @@ }, { "cell_type": "markdown", - "id": "e642a745", + "id": "813b2528", "metadata": {}, "source": [ "💪 Exercise: take 2 minutes to map the JSON-LD format to the Turtle format.\n", @@ -674,7 +674,7 @@ }, { "cell_type": "markdown", - "id": "e5a420ae", + "id": "bddba0fb", "metadata": { "slideshow": { "slide_type": "slide" @@ -692,7 +692,7 @@ { "cell_type": "code", "execution_count": null, - "id": "69d5aeda", + "id": "af600937", "metadata": {}, "outputs": [], "source": [ @@ -712,7 +712,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f9934190", + "id": "48592687", "metadata": {}, "outputs": [], "source": [ @@ -724,7 +724,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cf375f44", + "id": "d82a5554", "metadata": {}, "outputs": [], "source": [ @@ -734,7 +734,7 @@ }, { "cell_type": "markdown", - "id": "67d40862", + "id": "738c88e1", "metadata": { "slideshow": { "slide_type": "subslide" @@ -750,7 +750,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e4dbb04c", + "id": "12ac43f4", "metadata": {}, "outputs": [], "source": [ @@ -762,7 +762,7 @@ }, { "cell_type": "markdown", - "id": "0408e9e0", + "id": "f3277198", "metadata": { "slideshow": { "slide_type": "subslide" @@ -785,7 +785,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f8704d3d", + "id": "891b1d9b", "metadata": {}, "outputs": [], "source": [ @@ -803,7 +803,7 @@ }, { "cell_type": "markdown", - "id": "11034619", + "id": "7f6a5b1b", "metadata": {}, "source": [ "#### Exercise: parse the sentences using rdflib and answer the following questions\n", @@ -816,7 +816,7 @@ { "cell_type": "code", "execution_count": null, - "id": "03d71b87", + "id": "95d0cb83", "metadata": {}, "outputs": [], "source": [ @@ -829,7 +829,7 @@ }, { "cell_type": "markdown", - "id": "a450d0dc", + "id": "42d42bb6", "metadata": {}, "source": [ "#### Exercise: use `Graph.namespaces` to get the namespaces added by the sentences above" @@ -838,7 +838,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f704b1c6", + "id": "42e81a6d", "metadata": {}, "outputs": [], "source": [ @@ -851,7 +851,7 @@ }, { "cell_type": "markdown", - "id": "d7e5d335", + "id": "3f6bbded", "metadata": {}, "source": [ "#### Exercise: serialize the above graph in JSON-LD format" @@ -860,7 +860,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9148a958", + "id": "483a739c", "metadata": {}, "outputs": [], "source": [ @@ -870,7 +870,7 @@ }, { "cell_type": "markdown", - "id": "b91aa20c", + "id": "a016d2bc", "metadata": {}, "source": [ "#### Exercise: Load the JSON-LD object in a variable\n", @@ -882,7 +882,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a70610ec", + "id": "ffd2ba02", "metadata": {}, "outputs": [], "source": [ @@ -894,7 +894,7 @@ }, { "cell_type": "markdown", - "id": "fe62d797", + "id": "0e90f43a", "metadata": {}, "source": [ "#### Exercise: Get a voice from dbpedia\n", @@ -905,7 +905,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1f6c01c4", + "id": "374313b0", "metadata": {}, "outputs": [], "source": [ @@ -921,7 +921,7 @@ }, { "cell_type": "markdown", - "id": "d78e434d", + "id": "66fec365", "metadata": {}, "source": [ "We get a graph with the information about Tortellini." @@ -929,7 +929,7 @@ }, { "cell_type": "markdown", - "id": "9b6640d8", + "id": "c0652921", "metadata": {}, "source": [ "```mermaid\n", @@ -945,7 +945,7 @@ }, { "cell_type": "markdown", - "id": "2c6d9d37", + "id": "8c44ca33", "metadata": {}, "source": [ "An encyclopedia voice contains a list of sentences :)" @@ -954,7 +954,7 @@ { "cell_type": "code", "execution_count": null, - "id": "78347674", + "id": "d9d4e83b", "metadata": {}, "outputs": [], "source": [ @@ -966,7 +966,7 @@ }, { "cell_type": "markdown", - "id": "66c2b48c", + "id": "ab4d3e37", "metadata": {}, "source": [ "#### Exercise: counting sentences\n", @@ -978,7 +978,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fbe69f38", + "id": "4bf62b6d", "metadata": {}, "outputs": [], "source": [ @@ -987,7 +987,7 @@ }, { "cell_type": "markdown", - "id": "4ebc06c1", + "id": "555d19f3", "metadata": {}, "source": [ "----" @@ -996,7 +996,7 @@ { "cell_type": "code", "execution_count": null, - "id": "652258c3", + "id": "e52b8f0a", "metadata": {}, "outputs": [], "source": [ @@ -1010,7 +1010,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1e55f507", + "id": "89cf1937", "metadata": {}, "outputs": [], "source": [ @@ -1020,7 +1020,7 @@ }, { "cell_type": "markdown", - "id": "6f296ec1", + "id": "7837f98d", "metadata": {}, "source": [ "#### Exercise: extending graphs\n", @@ -1031,7 +1031,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f5aaf96d", + "id": "3d916269", "metadata": {}, "outputs": [], "source": [ @@ -1048,7 +1048,7 @@ }, { "cell_type": "markdown", - "id": "ed87cc7a", + "id": "de506ca2", "metadata": {}, "source": [ "And we can connect them together" @@ -1057,7 +1057,7 @@ { "cell_type": "code", "execution_count": null, - "id": "86bd8679", + "id": "dffe502f", "metadata": {}, "outputs": [], "source": [ @@ -1069,7 +1069,7 @@ }, { "cell_type": "markdown", - "id": "bb99cb82", + "id": "f8b0924d", "metadata": {}, "source": [ "Exercise: how many sentences are there now?" @@ -1078,7 +1078,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dcc59e6e", + "id": "78e379ab", "metadata": {}, "outputs": [], "source": [ @@ -1087,7 +1087,7 @@ }, { "cell_type": "markdown", - "id": "b19017a2", + "id": "4de868a1", "metadata": {}, "source": [ "Plot the graph again to see the new nodes and\n", @@ -1097,7 +1097,7 @@ { "cell_type": "code", "execution_count": null, - "id": "837473e8", + "id": "c04e88f3", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/02-semantics.ipynb b/sparql-101/notebooks/02-semantics.ipynb index 511f9d8..8f61a89 100644 --- a/sparql-101/notebooks/02-semantics.ipynb +++ b/sparql-101/notebooks/02-semantics.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2741cf01", + "id": "b0a86f90", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -20,7 +20,7 @@ }, { "cell_type": "markdown", - "id": "c4bcd145", + "id": "56869ac3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -41,7 +41,7 @@ }, { "cell_type": "markdown", - "id": "939b777e", + "id": "6ba05b44", "metadata": {}, "source": [ "```yaml\n", @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "6c01d34b", + "id": "51f91187", "metadata": {}, "source": [ "Is this a given name or a full name?\n", @@ -62,7 +62,7 @@ }, { "cell_type": "markdown", - "id": "605eab7f", + "id": "2f59fb83", "metadata": { "slideshow": { "slide_type": "subslide" @@ -76,7 +76,7 @@ }, { "cell_type": "markdown", - "id": "6c8e5c99", + "id": "c7988970", "metadata": {}, "source": [ "```mermaid\n", @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "239bddc7", + "id": "0190f863", "metadata": { "slideshow": { "slide_type": "subslide" @@ -107,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "e28cf37b", + "id": "d821fc51", "metadata": {}, "source": [ "```mermaid\n", @@ -123,7 +123,7 @@ }, { "cell_type": "markdown", - "id": "27036a85", + "id": "c5ec135f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -143,7 +143,7 @@ }, { "cell_type": "markdown", - "id": "df4e6c30", + "id": "55623610", "metadata": {}, "source": [ "```json\n", @@ -155,7 +155,7 @@ }, { "cell_type": "markdown", - "id": "9339685a", + "id": "9b1bc5f1", "metadata": { "slideshow": { "slide_type": "subslide" @@ -169,7 +169,7 @@ }, { "cell_type": "markdown", - "id": "6649a454", + "id": "12f7bc35", "metadata": {}, "source": [ "```yaml\n", @@ -184,7 +184,7 @@ }, { "cell_type": "markdown", - "id": "c1bdb2c2", + "id": "5e55ee5a", "metadata": {}, "source": [ "```yaml\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "0093b265", + "id": "e91771b8", "metadata": { "slideshow": { "slide_type": "slide" @@ -216,7 +216,7 @@ }, { "cell_type": "markdown", - "id": "410982aa", + "id": "951fa219", "metadata": { "slideshow": { "slide_type": "subslide" @@ -230,7 +230,7 @@ }, { "cell_type": "markdown", - "id": "041d79ea", + "id": "e90b69a3", "metadata": {}, "source": [ "```mermaid\n", @@ -275,7 +275,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f509f5ba", + "id": "b61eb988", "metadata": {}, "outputs": [], "source": [ @@ -286,7 +286,7 @@ }, { "cell_type": "markdown", - "id": "00c2fcff", + "id": "3edcfa87", "metadata": {}, "source": [ "#### Exercise: dataset\n", @@ -299,7 +299,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3618dc32", + "id": "e3573102", "metadata": {}, "outputs": [], "source": [ @@ -309,7 +309,7 @@ }, { "cell_type": "markdown", - "id": "4e31365d", + "id": "8b7bb555", "metadata": {}, "source": [ "- list the graphs in the dataset again, together with their identifiers.\n", @@ -329,7 +329,7 @@ { "cell_type": "code", "execution_count": null, - "id": "568de8ba", + "id": "2fe9b49b", "metadata": {}, "outputs": [], "source": [ @@ -340,7 +340,7 @@ }, { "cell_type": "markdown", - "id": "3deae72b", + "id": "4ac5126f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -362,7 +362,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3b62d44d", + "id": "3fab7085", "metadata": {}, "outputs": [], "source": [ @@ -389,7 +389,7 @@ }, { "cell_type": "markdown", - "id": "16e95036", + "id": "29e72bd8", "metadata": {}, "source": [ "- Get the URIs representing Tortellini and Food using the `Graph.subjects` and `Graph.objects` methods." @@ -398,7 +398,7 @@ { "cell_type": "code", "execution_count": null, - "id": "96b34445", + "id": "c6e5fb83", "metadata": {}, "outputs": [], "source": [ @@ -411,7 +411,7 @@ }, { "cell_type": "markdown", - "id": "cc293ba4", + "id": "0d6dde8f", "metadata": {}, "source": [ "\n", @@ -441,7 +441,7 @@ }, { "cell_type": "markdown", - "id": "e9608bae", + "id": "4b015c42", "metadata": {}, "source": [ "```mermaid\n", @@ -476,7 +476,7 @@ }, { "cell_type": "markdown", - "id": "2e52be82", + "id": "a6d0dd15", "metadata": {}, "source": [ "- **Controlled vocabulary**: a vocabulary where the terms are validated by a designated authority.\n", @@ -487,7 +487,7 @@ }, { "cell_type": "markdown", - "id": "a1f1a9ea", + "id": "08541a67", "metadata": { "slideshow": { "slide_type": "subslide" @@ -509,7 +509,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5853b349", + "id": "f387beed", "metadata": { "attributes": { "classes": [ @@ -538,7 +538,7 @@ }, { "cell_type": "markdown", - "id": "4f542b4d", + "id": "daef3d83", "metadata": {}, "source": [ "You can see vocabularies as a set of globally unique labels\n", @@ -552,7 +552,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c5e54afa", + "id": "90cf9d40", "metadata": { "attributes": { "classes": [ @@ -579,7 +579,7 @@ }, { "cell_type": "markdown", - "id": "25a9f94d", + "id": "cbf43abf", "metadata": {}, "source": [ "## Ontologies in Italy\n", @@ -594,7 +594,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ac81b186", + "id": "ea967d45", "metadata": { "attributes": { "classes": [ @@ -614,7 +614,7 @@ }, { "cell_type": "markdown", - "id": "39647c67", + "id": "94f1bfb2", "metadata": { "slideshow": { "slide_type": "subslide" @@ -629,7 +629,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0dca8ec9", + "id": "2ad080ed", "metadata": {}, "outputs": [], "source": [ @@ -667,7 +667,7 @@ }, { "cell_type": "markdown", - "id": "5d097c53", + "id": "47e36b75", "metadata": {}, "source": [ "\n", @@ -681,7 +681,7 @@ { "cell_type": "code", "execution_count": null, - "id": "81695080", + "id": "04445da3", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/05-sparql.ipynb b/sparql-101/notebooks/05-sparql.ipynb index ced08d8..ddb7991 100644 --- a/sparql-101/notebooks/05-sparql.ipynb +++ b/sparql-101/notebooks/05-sparql.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "64fafda7", + "id": "2da660dd", "metadata": {}, "source": [ "# SparQL 101\n", @@ -21,7 +21,7 @@ }, { "cell_type": "markdown", - "id": "8451ab6a", + "id": "5942fbc6", "metadata": { "slideshow": { "slide_type": "slide" @@ -39,7 +39,7 @@ }, { "cell_type": "markdown", - "id": "c99c6667", + "id": "f510a7bb", "metadata": { "slideshow": { "slide_type": "slide" @@ -66,13 +66,13 @@ "\n", "This lesson provides a non-exhaustive introduction to SparQL.\n", "\n", - "See: https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.html#dataset" + "See: " ] }, { "cell_type": "code", "execution_count": null, - "id": "31ec6ff8", + "id": "db418c04", "metadata": {}, "outputs": [], "source": [ @@ -82,7 +82,7 @@ }, { "cell_type": "markdown", - "id": "37bb6075", + "id": "d655a626", "metadata": {}, "source": [ "Exercise: list the graphs in the dataset." @@ -90,7 +90,7 @@ }, { "cell_type": "markdown", - "id": "3a0030d4", + "id": "61e46ec0", "metadata": { "slideshow": { "slide_type": "subslide" @@ -106,11 +106,14 @@ { "cell_type": "code", "execution_count": null, - "id": "bfdc6b36", + "id": "7ebb4996", "metadata": {}, "outputs": [], "source": [ - "q = \"\"\"SELECT *\n", + "from rdflib.query import Result\n", + "\n", + "q = \"\"\"\n", + "SELECT *\n", "WHERE {\n", " ?subject ?predicate ?object .\n", " # ... more sentences ...\n", @@ -118,12 +121,13 @@ "\"\"\"\n", "\n", "# The Dataset is still empty :)\n", - "d.query(q).bindings" + "result : Result = d.query(q)\n", + "list(result)" ] }, { "cell_type": "markdown", - "id": "24e473fe", + "id": "eb279b7d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -132,9 +136,7 @@ "source": [ "----\n", "\n", - "\n", - "\n", - "### Sparql: adding graphs: _:sample\n", + "### Storing and retrieving triples\n", "\n", "Open [sample.ttl](sample.ttl) in another tab\n", "and see its content.\n", @@ -146,7 +148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1423a02e", + "id": "9b9a82ac", "metadata": {}, "outputs": [], "source": [ @@ -159,7 +161,7 @@ }, { "cell_type": "markdown", - "id": "e1ef2dc4", + "id": "44fa1ad3", "metadata": {}, "source": [ "Use our utility function to print the graph." @@ -168,7 +170,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1cfbfce2", + "id": "4ff7803e", "metadata": {}, "outputs": [], "source": [ @@ -179,7 +181,7 @@ }, { "cell_type": "markdown", - "id": "af72ca6e", + "id": "74184c1b", "metadata": {}, "source": [ "That's what we have" @@ -187,7 +189,7 @@ }, { "cell_type": "markdown", - "id": "3a7966e2", + "id": "fa0cde79", "metadata": {}, "source": [ "```mermaid\n", @@ -204,7 +206,7 @@ }, { "cell_type": "markdown", - "id": "46a47c87", + "id": "9471f3f1", "metadata": {}, "source": [ "List all entries from th `_:sample` graph." @@ -213,7 +215,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b6b8a3a9", + "id": "2dd9437c", "metadata": {}, "outputs": [], "source": [ @@ -224,13 +226,13 @@ "}\n", "LIMIT 2\n", "\"\"\"\n", - "result = g.query(q)\n", + "result : Result = g.query(q)\n", "[r.asdict() for r in result]" ] }, { "cell_type": "markdown", - "id": "108bdaf8", + "id": "1220890e", "metadata": {}, "source": [ "Exercise:\n", @@ -238,13 +240,15 @@ "- Remove the `LIMIT` clause.\n", " How many triples are in the graph?\n", "- Replace the `*` with `?subject ?predicate ?object`.\n", - " What happens?" + " What happens?\n", + "\n", + ":warning: `SELECT`ed fields are NOT separated by commas." ] }, { "cell_type": "code", "execution_count": null, - "id": "63619976", + "id": "1533a3ed", "metadata": {}, "outputs": [], "source": [ @@ -257,13 +261,140 @@ }, { "cell_type": "markdown", - "id": "d395759b", + "id": "b5fd426f", "metadata": {}, "source": [ "- Replace `?subject` with `?foo`:\n", " what happens?\n", "\n", - "### Serializing datasets\n", + "### Filtering triples\n", + "\n", + "We can filter the results using:\n", + "\n", + "- multiple sentences\n", + "- `FILTER` expressions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ae8da6c", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT\n", + " # You can write one variable per line\n", + " ?subject\n", + " ?status\n", + "WHERE {\n", + " ?subject foaf:status ?status .\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "list(result)" + ] + }, + { + "cell_type": "markdown", + "id": "d331645a", + "metadata": {}, + "source": [ + "To restrict the query to a specific resource,\n", + "you can BIND a variable to a specific value." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57b4a278", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT\n", + " ?subject\n", + " ?status\n", + "WHERE {\n", + " BIND( AS ?subject) .\n", + "\n", + " ?subject foaf:status ?status .\n", + "}\n", + "\"\"\"\n", + "result = g.query(q)\n", + "list(result)" + ] + }, + { + "cell_type": "markdown", + "id": "ffdd841b", + "metadata": {}, + "source": [ + "We can use `FILTER` to restrict the results\n", + "where the ?country_name is in Italian." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e24dc31", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT\n", + " ?subject ?status\n", + "WHERE {\n", + " BIND( AS ?subject)\n", + "\n", + " ?subject foaf:status ?status .\n", + "\n", + " FILTER (lang(?status) = \"it\")\n", + "}\n", + "\n", + "\"\"\"\n", + "result = g.query(q)\n", + "list(result)" + ] + }, + { + "cell_type": "markdown", + "id": "d49f4c95", + "metadata": {}, + "source": [ + "### GROUP BY triples\n", + "\n", + "We can group the results using `GROUP BY`\n", + "and aggregate functions like `COUNT`, `SUM`, `AVG`, `GROUP_CONCAT`, etc." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "af4a324f", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT\n", + " ?subject\n", + " (COUNT(?object) AS ?count)\n", + "WHERE {\n", + " ?subject foaf:knows ?object .\n", + "}\n", + "GROUP BY ?subject\n", + "ORDER BY DESC(?count)\n", + "\"\"\"\n", + "result = g.query(q)\n", + "{str(r.subject): r.count for r in result}" + ] + }, + { + "cell_type": "markdown", + "id": "cdfd6d92", + "metadata": {}, + "source": [ + "### Serializing datasets in Trig format\n", "\n", "The [Trig](https://www.w3.org/TR/2013/REC-trig-20130321/) format\n", "extends Turtle to support multiple graphs." @@ -272,7 +403,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1735cba0", + "id": "cf9491bc", "metadata": {}, "outputs": [], "source": [ @@ -282,10 +413,10 @@ }, { "cell_type": "markdown", - "id": "a1f2d1d0", + "id": "535edd87", "metadata": {}, "source": [ - "### Sparql: querying graphs: _:simpsons\n", + "### Multi-graph datasets\n", "\n", "Let's add another graph to the dataset." ] @@ -293,7 +424,7 @@ { "cell_type": "code", "execution_count": null, - "id": "31d09b09", + "id": "10b5fd54", "metadata": {}, "outputs": [], "source": [ @@ -303,7 +434,7 @@ }, { "cell_type": "markdown", - "id": "92a5e256", + "id": "37574875", "metadata": {}, "source": [ "That's what we have" @@ -311,7 +442,7 @@ }, { "cell_type": "markdown", - "id": "1a4fdaac", + "id": "f3169280", "metadata": {}, "source": [ "```mermaid\n", @@ -330,21 +461,92 @@ }, { "cell_type": "markdown", - "id": "1d94b0aa", + "id": "34a290b0", "metadata": {}, "source": [ - "Now use the extended syntax with the `GRAPH` keyword." + "### Querying the whole dataset\n", + "\n", + "What happens if I query the dataset?" ] }, { "cell_type": "code", "execution_count": null, - "id": "ec97c471", + "id": "869bbdb1", "metadata": {}, "outputs": [], "source": [ "q = \"\"\"\n", - "SELECT *\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " [] a ?Class\n", + "}\n", + "LIMIT 10\n", + "\"\"\"\n", + "d.query(q).bindings" + ] + }, + { + "cell_type": "markdown", + "id": "2692b68b", + "metadata": {}, + "source": [ + "Now, try to query each graph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5be4d008", + "metadata": {}, + "outputs": [], + "source": [ + "for g in d.graphs():\n", + " print({g.identifier.n3(): g.query(q).bindings})" + ] + }, + { + "cell_type": "markdown", + "id": "1cfa99fb", + "metadata": {}, + "source": [ + ":warning: By default, the `Dataset` queries *the default graph*\n", + "and not all the graphs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f58bc31f", + "metadata": {}, + "outputs": [], + "source": [ + "# By default, sparql does not query all the graphs.\n", + "assert d.default_union == False\n", + "\n", + "# .. but you can change this behaviour...\n", + "d.default_union = True\n", + "\n", + "# ... and now you can query all the graphs.\n", + "d.query(q).bindings" + ] + }, + { + "cell_type": "markdown", + "id": "088285ba", + "metadata": {}, + "source": [ + "Now I can query all the graphs in the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6fed86e1", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"SELECT DISTINCT *\n", "WHERE {\n", " GRAPH ?g {}\n", "}\n", @@ -355,7 +557,7 @@ }, { "cell_type": "markdown", - "id": "0591b22b", + "id": "c4fd9f56", "metadata": {}, "source": [ "Query the classes used in the dataset." @@ -364,7 +566,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9c043360", + "id": "66a1fd22", "metadata": {}, "outputs": [], "source": [ @@ -383,18 +585,113 @@ }, { "cell_type": "markdown", - "id": "45ef3be5", + "id": "44561ec6", "metadata": {}, "source": [ "Exercise:\n", "\n", "- replace `?g` with `_:sample`:\n", - " what happens?" + " what happens?\n", + "\n", + "Querying triples in a specific graph:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e51c1f09", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " GRAPH <_:simpsons> {\n", + " ?p a schema:Person .\n", + " }\n", + "}\n", + "\"\"\"\n", + "result = d.query(q)\n", + "{str(r.p): r.p for r in result}\n", + "assert list(result)" ] }, { "cell_type": "markdown", - "id": "a38a84da", + "id": "e7b8113c", + "metadata": {}, + "source": [ + "💪 Exercise: querying the dataset\n", + "\n", + "- Query the `_:sample` graph\n", + " to list all the `foaf:Person`s in it.\n", + "\n", + "Exercise:\n", + "\n", + "- query the `_:simpsons` graph\n", + " to list all the `schema:Person`s\n", + " having a `schema:nationality` property." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48341f47", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?s\n", + "WHERE {\n", + " GRAPH <_:simpsons> {\n", + " ?s a schema:Person ;\n", + " schema:nationality ?country .\n", + " }\n", + "}\n", + "\"\"\"\n", + "result = d.query(q)\n", + "{str(r.s) for r in result}" + ] + }, + { + "cell_type": "markdown", + "id": "7fe71d37", + "metadata": {}, + "source": [ + "- query the `_:simpsons` graph\n", + " matching the following sentences\n", + "\n", + " - ?subject has a schema:nationality ?country\n", + " - ?country has a schema:name ?country_name\n", + " - ?country_name is in Italian" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1141643", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?subject ?country_name\n", + "WHERE {\n", + " GRAPH <_:simpsons> {\n", + " ?subject schema:nationality ?country .\n", + " ?country schema:name ?country_name .\n", + " FILTER (lang(?country_name) = \"it\")\n", + " }\n", + "}\n", + "\"\"\"\n", + "result = d.query(q)\n", + "{(str(r.subject), str(r.country_name)) for r in result}" + ] + }, + { + "cell_type": "markdown", + "id": "7feb20c2", "metadata": { "slideshow": { "slide_type": "subslide" @@ -403,16 +700,50 @@ "source": [ "----\n", "\n", - "### Enriching graphs: UPDATE\n", + "### Modifying graphs: INSERT DATA and UPDATE\n", + "\n", + "Use `INSERT DATA` to add new triples\n", + "to a graph.\n", + "\n", + "Add the following sentence to the <_:sample> graph.\n", "\n", - "The SparQL `UPDATE` command allows to modify a graph.\n", - "See https://www.w3.org/TR/sparql11-update/" + "> foaf:topic_interest \n", + "\n", + "getting help from the rdflib documentation " ] }, { "cell_type": "code", "execution_count": null, - "id": "afc71080", + "id": "1c6fa654", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "INSERT DATA {\n", + " GRAPH <_:sample> {\n", + " foaf:topic_interest .\n", + " }\n", + "}\n", + "\"\"\"\n", + "\n", + "result = d.update(q)\n", + "assert \"Homer\" in d.graph(\"_:sample\").serialize(format=\"turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "45f70494", + "metadata": {}, + "source": [ + "The SparQL `UPDATE` command updates a graph.\n", + "See " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "78b26e46", "metadata": {}, "outputs": [], "source": [ @@ -441,7 +772,7 @@ }, { "cell_type": "markdown", - "id": "f8cc9ac3", + "id": "00405feb", "metadata": {}, "source": [ "💪: check the graph" @@ -450,7 +781,7 @@ { "cell_type": "code", "execution_count": null, - "id": "804a7ca8", + "id": "4b4ba0d1", "metadata": {}, "outputs": [], "source": [ @@ -459,48 +790,7 @@ }, { "cell_type": "markdown", - "id": "336669c0", - "metadata": {}, - "source": [ - "Update the <_:sample> graph\n", - "with the following sentence.\n", - "\n", - "> foaf:topic_interest \n", - "\n", - "\n", - "Use `INSERT DATA` to add a new triple,\n", - "and read the rdflib documentation https://rdflib.readthedocs.io/en/7.1.1/intro_to_sparql.html" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3733f69b", - "metadata": { - "attributes": { - "classes": [ - "`python" - ], - "id": "" - } - }, - "outputs": [], - "source": [ - "q = \"\"\"\n", - "INSERT DATA {\n", - " GRAPH <_:sample> {\n", - " foaf:topic_interest .\n", - " }\n", - "}\n", - "\"\"\"\n", - "\n", - "result = d.update(q)\n", - "assert \"Homer\" in g.serialize(format=\"turtle\")\n" - ] - }, - { - "cell_type": "markdown", - "id": "ad87cd34", + "id": "1543cf50", "metadata": {}, "source": [ "### The `/` and the `*` predicate modifiers\n", @@ -518,7 +808,7 @@ { "cell_type": "code", "execution_count": null, - "id": "11369f77", + "id": "873fe7b7", "metadata": {}, "outputs": [], "source": [ @@ -536,7 +826,7 @@ }, { "cell_type": "markdown", - "id": "42340039", + "id": "4aeefddc", "metadata": {}, "source": [ "In this case `foaf:name` has a very specific meaning.\n", @@ -551,7 +841,7 @@ }, { "cell_type": "markdown", - "id": "442abeca", + "id": "80391f64", "metadata": { "slideshow": { "slide_type": "subslide" @@ -567,7 +857,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4d4847d9", + "id": "58875eb3", "metadata": {}, "outputs": [], "source": [ @@ -587,7 +877,7 @@ }, { "cell_type": "markdown", - "id": "5c372fa1", + "id": "614d3242", "metadata": {}, "source": [ "The `*` operator matches a predicate\n", @@ -606,7 +896,7 @@ { "cell_type": "code", "execution_count": null, - "id": "663edabc", + "id": "6fa32a7c", "metadata": {}, "outputs": [], "source": [ @@ -630,7 +920,7 @@ }, { "cell_type": "markdown", - "id": "d5a094b4", + "id": "b772ca97", "metadata": { "slideshow": { "slide_type": "subslide" @@ -646,7 +936,7 @@ { "cell_type": "code", "execution_count": null, - "id": "345daa86", + "id": "5ece570e", "metadata": {}, "outputs": [], "source": [ @@ -672,7 +962,7 @@ }, { "cell_type": "markdown", - "id": "f5b10a62", + "id": "84e9884a", "metadata": {}, "source": [ "Since we are not interested in the `user2` variable,\n", @@ -683,7 +973,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c6d938d2", + "id": "8112352b", "metadata": {}, "outputs": [], "source": [ @@ -706,7 +996,7 @@ }, { "cell_type": "markdown", - "id": "69e617e4", + "id": "3e1ee86e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -719,144 +1009,54 @@ "ignoring the way data is stored." ] }, - { - "cell_type": "markdown", - "id": "3ec572f4", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "### Querying the whole dataset\n", - "\n", - "\n", - "What happens if I query the whole dataset?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1223c06a", - "metadata": {}, - "outputs": [], - "source": [ - "q = \"\"\"SELECT DISTINCT *\n", - "WHERE {\n", - " [] a ?Class\n", - "}\n", - "LIMIT 10\n", - "\"\"\"\n", - "d.query(q).bindings" - ] - }, - { - "cell_type": "markdown", - "id": "ff2c1b32", - "metadata": {}, - "source": [ - "Now, try to query each graph" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c31d7e05", - "metadata": {}, - "outputs": [], - "source": [ - "for g in d.graphs():\n", - " print({g.identifier.n3(): g.query(q).bindings})" - ] - }, - { - "cell_type": "markdown", - "id": "8af04548", - "metadata": {}, - "source": [ - "There's a `Dataset` attribute that allows to query all the graphs in the dataset." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cdc51969", - "metadata": {}, - "outputs": [], - "source": [ - "# By default, sparql does not query all the graphs.\n", - "assert d.default_union == False\n", - "\n", - "# .. but you can change this behaviour...\n", - "d.default_union = True\n", - "\n", - "# ... and now you can query all the graphs.\n", - "d.query(q).bindings" - ] - }, - { - "cell_type": "markdown", - "id": "4e927a3f", - "metadata": {}, - "source": [ - "I can also query all the graphs in the dataset" - ] - }, { "cell_type": "code", "execution_count": null, - "id": "459bc2a8", + "id": "a7b33bf4", "metadata": {}, "outputs": [], "source": [ - "q = \"\"\"SELECT DISTINCT *\n", + "q = \"\"\"\n", + "SELECT\n", + " ?s ?character_name ?country_name\n", "WHERE {\n", - " GRAPH ?g {}\n", + " GRAPH <_:sample> {\n", + " ?s a foaf:Person ;\n", + " foaf:topic_interest ?character .\n", + " }\n", + " GRAPH <_:simpsons> {\n", + " ?character schema:nationality ?country .\n", + " ?character schema:name ?character_name .\n", + " ?country schema:name ?country_name .\n", + " FILTER (lang(?country_name) = \"it\")\n", + " }\n", "}\n", "\"\"\"\n", "result = d.query(q)\n", - "{str(r.g): len(r) for r in result}" + "list(result)" ] }, { "cell_type": "markdown", - "id": "57fee037", - "metadata": {}, - "source": [ - "Or querying triples in a specific graph:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2f969f6f", + "id": "23d8de40", "metadata": {}, - "outputs": [], "source": [ - "q = \"\"\"SELECT DISTINCT *\n", - "WHERE {\n", - " GRAPH <_:simpsons> {\n", - " ?p a foaf:Person .\n", - " }\n", - "}\n", - "\"\"\"\n", - "result = d.query(q)\n", - "{str(r.p): r.p for r in result}" + "Exercise:\n", + "\n", + "- remove the GRAPH information from the query\n", + " and see what happens." ] }, { "cell_type": "markdown", - "id": "8b348d3b", - "metadata": {}, + "id": "09be7c7f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ - "💪 Exercise: querying the dataset\n", - "\n", - "- Query the `_:sample` graph\n", - " to list all the `foaf:Person`s in it.\n", - "\n", - "\n", + "---\n", "\n", "# Querying DBPedia\n", "\n", @@ -872,7 +1072,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4a908617", + "id": "efc34da9", "metadata": { "attributes": { "classes": [ @@ -893,7 +1093,7 @@ }, { "cell_type": "markdown", - "id": "86b1a1d4", + "id": "72f06064", "metadata": { "slideshow": { "slide_type": "subslide" @@ -908,7 +1108,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1469aa15", + "id": "091e3c7f", "metadata": { "attributes": { "classes": [ @@ -931,7 +1131,7 @@ }, { "cell_type": "markdown", - "id": "31c8835f", + "id": "ed9c64d4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -946,7 +1146,7 @@ { "cell_type": "code", "execution_count": null, - "id": "deb2dc46", + "id": "4aa67672", "metadata": { "attributes": { "classes": [ @@ -972,7 +1172,7 @@ }, { "cell_type": "markdown", - "id": "a243a0bc", + "id": "06fd0836", "metadata": {}, "source": [ "... with their deathplaces" @@ -981,7 +1181,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a1a0e244", + "id": "257eeac5", "metadata": { "attributes": { "classes": [ @@ -1009,7 +1209,7 @@ }, { "cell_type": "markdown", - "id": "289e41ed", + "id": "43f34fe2", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1024,7 +1224,7 @@ { "cell_type": "code", "execution_count": null, - "id": "030f489e", + "id": "5b1eeb69", "metadata": { "attributes": { "classes": [ @@ -1051,7 +1251,7 @@ }, { "cell_type": "markdown", - "id": "f967088c", + "id": "3818198c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1070,7 +1270,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8d2b28ca", + "id": "f0362bef", "metadata": { "attributes": { "classes": [ @@ -1100,7 +1300,7 @@ }, { "cell_type": "markdown", - "id": "75c338ba", + "id": "1c7b6971", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1117,7 +1317,7 @@ { "cell_type": "code", "execution_count": null, - "id": "da4586f0", + "id": "0f538580", "metadata": { "attributes": { "classes": [ @@ -1149,7 +1349,7 @@ }, { "cell_type": "markdown", - "id": "ab46cae9", + "id": "37e4386d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1164,7 +1364,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6bf5941e", + "id": "5a956562", "metadata": { "attributes": { "classes": [ diff --git a/sparql-101/notebooks/07-jsonld.ipynb b/sparql-101/notebooks/07-jsonld.ipynb index cf8107c..ff86ab0 100644 --- a/sparql-101/notebooks/07-jsonld.ipynb +++ b/sparql-101/notebooks/07-jsonld.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "387059a8", + "id": "984c7199", "metadata": {}, "source": [ "# Agenda\n", @@ -22,7 +22,7 @@ }, { "cell_type": "markdown", - "id": "13ff29be", + "id": "274fa853", "metadata": {}, "source": [ "```yaml\n", @@ -35,7 +35,7 @@ }, { "cell_type": "markdown", - "id": "c2be4bac", + "id": "64dba0b0", "metadata": {}, "source": [ "We can then add identifiers (such as UUIDs or email), to be sure that cross references\n", @@ -44,7 +44,7 @@ }, { "cell_type": "markdown", - "id": "9d263ea3", + "id": "69804ead", "metadata": {}, "source": [ "```yaml\n", @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "21a847c8", + "id": "644bd2f7", "metadata": {}, "source": [ "Now we may have different datasets, such as the Springfield Elementary\n", @@ -67,7 +67,7 @@ }, { "cell_type": "markdown", - "id": "b001dee0", + "id": "03b805bf", "metadata": {}, "source": [ "```yaml\n", @@ -80,7 +80,7 @@ }, { "cell_type": "markdown", - "id": "0a2e351e", + "id": "e751a7ed", "metadata": {}, "source": [ "So we actually store data, but we lack knowledge.\n", @@ -95,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "220c3ecc", + "id": "cfec980f", "metadata": {}, "source": [ "----" @@ -104,7 +104,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b974a25d", + "id": "1bc4993d", "metadata": {}, "outputs": [], "source": [ @@ -118,7 +118,7 @@ }, { "cell_type": "markdown", - "id": "e9614fc9", + "id": "bf3528b8", "metadata": {}, "source": [ "JSON-LD associates it with a context that disambiguates information" @@ -127,7 +127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "26ca6b0a", + "id": "07ff14c0", "metadata": {}, "outputs": [], "source": [ @@ -148,7 +148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ce5a32bd", + "id": "84517ccf", "metadata": {}, "outputs": [], "source": [ @@ -160,7 +160,7 @@ }, { "cell_type": "markdown", - "id": "dd4ccc50", + "id": "28929f32", "metadata": {}, "source": [ "Exercise:\n", @@ -172,7 +172,7 @@ { "cell_type": "code", "execution_count": null, - "id": "285ab293", + "id": "ae8a0703", "metadata": {}, "outputs": [], "source": [ @@ -181,7 +181,7 @@ }, { "cell_type": "markdown", - "id": "18ba0ecc", + "id": "4f5bac30", "metadata": {}, "source": [ "\n", @@ -191,7 +191,7 @@ }, { "cell_type": "markdown", - "id": "8e7ce3c3", + "id": "b0e79620", "metadata": { "slideshow": { "slide_type": "slide" @@ -213,7 +213,7 @@ }, { "cell_type": "markdown", - "id": "0053df67", + "id": "d835261f", "metadata": { "slideshow": { "slide_type": "slide" @@ -228,7 +228,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1744be69", + "id": "6df12510", "metadata": {}, "outputs": [], "source": [ @@ -242,7 +242,7 @@ }, { "cell_type": "markdown", - "id": "70ec7264", + "id": "d42d21fd", "metadata": {}, "source": [ "Annotate it with schema.org." @@ -251,7 +251,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9fd683cd", + "id": "8e53efbc", "metadata": {}, "outputs": [], "source": [ @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a46cb6e4", + "id": "ed5c1086", "metadata": {}, "outputs": [], "source": [ @@ -282,7 +282,7 @@ }, { "cell_type": "markdown", - "id": "02fcddf4", + "id": "86d7b383", "metadata": {}, "source": [ "Exercise:\n", @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c6e92c20", + "id": "fbb544e3", "metadata": {}, "outputs": [], "source": [ @@ -303,7 +303,7 @@ }, { "cell_type": "markdown", - "id": "c81615a8", + "id": "1816048b", "metadata": { "slideshow": { "slide_type": "slide" @@ -320,7 +320,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f3d579be", + "id": "7a4f9832", "metadata": {}, "outputs": [], "source": [ @@ -344,7 +344,7 @@ }, { "cell_type": "markdown", - "id": "b5b6deb6", + "id": "497ef939", "metadata": {}, "source": [ "Now we can serialize the graph." @@ -353,7 +353,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d723bd96", + "id": "dbc5a873", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ }, { "cell_type": "markdown", - "id": "39e300d0", + "id": "accf602a", "metadata": {}, "source": [ "Another localization mechanism allows\n", @@ -375,7 +375,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1bb01d0b", + "id": "9f01b59b", "metadata": {}, "outputs": [], "source": [ @@ -394,7 +394,7 @@ }, { "cell_type": "markdown", - "id": "eb658906", + "id": "8dbb6e50", "metadata": { "slideshow": { "slide_type": "slide" @@ -417,7 +417,7 @@ }, { "cell_type": "markdown", - "id": "a7937358", + "id": "22a12932", "metadata": {}, "source": [ "```yaml\n", @@ -429,7 +429,7 @@ }, { "cell_type": "markdown", - "id": "510f42c9", + "id": "2a310747", "metadata": {}, "source": [ "Someone altering the \n", @@ -438,7 +438,7 @@ }, { "cell_type": "markdown", - "id": "9bb7f6d3", + "id": "81ad851e", "metadata": {}, "source": [ "```yaml\n", @@ -451,7 +451,7 @@ }, { "cell_type": "markdown", - "id": "2718bca9", + "id": "c862ee17", "metadata": {}, "source": [ "->" @@ -459,7 +459,7 @@ }, { "cell_type": "markdown", - "id": "65b836d7", + "id": "241efb4e", "metadata": {}, "source": [ "```yaml\n", @@ -472,7 +472,7 @@ }, { "cell_type": "markdown", - "id": "ad120fd1", + "id": "eb5d4362", "metadata": { "slideshow": { "slide_type": "subslide" diff --git a/sparql-101/notebooks/10-rdf.ipynb b/sparql-101/notebooks/10-rdf.ipynb index 7b94188..f8977b9 100644 --- a/sparql-101/notebooks/10-rdf.ipynb +++ b/sparql-101/notebooks/10-rdf.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "f74b921c", + "id": "830f16ee", "metadata": {}, "source": [ "# Graph databases & SparQL\n", @@ -18,7 +18,7 @@ }, { "cell_type": "markdown", - "id": "8f61b780", + "id": "ab84e1dc", "metadata": { "slideshow": { "slide_type": "subslide" @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5c6c8905", + "id": "009124ee", "metadata": {}, "outputs": [], "source": [ @@ -46,7 +46,7 @@ }, { "cell_type": "markdown", - "id": "60757d17", + "id": "502209fb", "metadata": { "slideshow": { "slide_type": "slide" @@ -71,12 +71,12 @@ "\n", "store triples into graphs.\n", "\n", - "They can be queried using the [SparQL]() language." + "They can be queried via [SparQL]()." ] }, { "cell_type": "markdown", - "id": "becc956f", + "id": "d6a0d16a", "metadata": { "slideshow": { "slide_type": "subslide" @@ -99,7 +99,7 @@ }, { "cell_type": "markdown", - "id": "28850f34", + "id": "7a161068", "metadata": { "slideshow": { "slide_type": "subslide" @@ -111,8 +111,7 @@ "## rdflib backends\n", "\n", "We will simulate a graph database using\n", - "[rdflib](https://rdflib.readthedocs.io/en/stable/index.html),\n", - "that supports SparQL queries.\n", + "[rdflib](https://rdflib.readthedocs.io/en/stable/index.html).\n", "\n", "rdflib supports multiple backends to parse and store triples.\n", "\n", @@ -125,7 +124,7 @@ { "cell_type": "code", "execution_count": null, - "id": "603c873f", + "id": "f1af6be6", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +135,7 @@ }, { "cell_type": "markdown", - "id": "7c66f0cd", + "id": "58027ca5", "metadata": {}, "source": [ "Exercise:\n", @@ -149,7 +148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "52ee750c", + "id": "9e009820", "metadata": {}, "outputs": [], "source": [ @@ -161,7 +160,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6fa662f8", + "id": "f4663b98", "metadata": {}, "outputs": [], "source": [ @@ -174,7 +173,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a3d517dd", + "id": "ab483e31", "metadata": {}, "outputs": [], "source": [ @@ -187,7 +186,7 @@ }, { "cell_type": "markdown", - "id": "6d19c94f", + "id": "662b9e2d", "metadata": {}, "source": [ "See also:\n", @@ -197,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "17bafc46", + "id": "92245571", "metadata": { "slideshow": { "slide_type": "slide" @@ -218,7 +217,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a84e58f7", + "id": "963e6381", "metadata": {}, "outputs": [], "source": [ @@ -234,7 +233,7 @@ }, { "cell_type": "markdown", - "id": "9cc2c275", + "id": "5c08094e", "metadata": { "slideshow": { "slide_type": "slide" @@ -251,7 +250,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9bc2d6c9", + "id": "0023db72", "metadata": {}, "outputs": [], "source": [ @@ -276,7 +275,7 @@ }, { "cell_type": "markdown", - "id": "3221f9b2", + "id": "f73ef624", "metadata": {}, "source": [ "Exercise:\n", @@ -301,7 +300,7 @@ { "cell_type": "code", "execution_count": null, - "id": "526155ac", + "id": "b3cb6112", "metadata": {}, "outputs": [], "source": [ @@ -333,7 +332,7 @@ }, { "cell_type": "markdown", - "id": "27674fe5", + "id": "e4e5e490", "metadata": {}, "source": [ "Let's visualize the graph." @@ -342,7 +341,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c755f9df", + "id": "648c6067", "metadata": {}, "outputs": [], "source": [ @@ -354,7 +353,7 @@ }, { "cell_type": "markdown", - "id": "4e4fd383", + "id": "75d99485", "metadata": {}, "source": [ "#### More metadata\n", @@ -366,7 +365,7 @@ { "cell_type": "code", "execution_count": null, - "id": "95137392", + "id": "09cc771b", "metadata": {}, "outputs": [], "source": [ @@ -399,7 +398,7 @@ }, { "cell_type": "markdown", - "id": "e5e24831", + "id": "46981ae7", "metadata": { "slideshow": { "slide_type": "slide" @@ -416,7 +415,7 @@ { "cell_type": "code", "execution_count": null, - "id": "aea18c26", + "id": "a17f77b9", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/11-sparql-metadata.ipynb b/sparql-101/notebooks/11-sparql-metadata.ipynb index e28e875..e0a2553 100644 --- a/sparql-101/notebooks/11-sparql-metadata.ipynb +++ b/sparql-101/notebooks/11-sparql-metadata.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "ad108b64", + "id": "3d1e75e7", "metadata": {}, "source": [ "# Agenda\n", @@ -22,7 +22,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ac6d8963", + "id": "1a05e897", "metadata": {}, "outputs": [], "source": [ @@ -34,7 +34,7 @@ }, { "cell_type": "markdown", - "id": "ea27adb4", + "id": "43f296c2", "metadata": {}, "source": [ "And query the simplest metadata." @@ -43,7 +43,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1f4b5bcb", + "id": "c828d450", "metadata": {}, "outputs": [], "source": [ @@ -61,7 +61,7 @@ }, { "cell_type": "markdown", - "id": "9f68640e", + "id": "74ba7bd2", "metadata": {}, "source": [ "We can simplify the above query\n", @@ -73,7 +73,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dc5d9058", + "id": "9cbfae12", "metadata": {}, "outputs": [], "source": [ @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "f6b5708e", + "id": "e148f448", "metadata": {}, "source": [ "Exercise:\n", @@ -103,7 +103,7 @@ }, { "cell_type": "markdown", - "id": "d93833b9", + "id": "5070d3f4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -119,7 +119,7 @@ { "cell_type": "code", "execution_count": null, - "id": "45d95389", + "id": "9101ddc3", "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "9aac48e0", + "id": "836c70dc", "metadata": {}, "source": [ "Exercise:\n", @@ -152,7 +152,7 @@ }, { "cell_type": "markdown", - "id": "42593695", + "id": "8212b909", "metadata": { "slideshow": { "slide_type": "subslide" @@ -169,7 +169,7 @@ { "cell_type": "code", "execution_count": null, - "id": "81af1964", + "id": "e347f090", "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ }, { "cell_type": "markdown", - "id": "402db08f", + "id": "4cbf2a21", "metadata": {}, "source": [ "Exercise:\n", @@ -200,7 +200,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e072bcf2", + "id": "24f697fc", "metadata": {}, "outputs": [], "source": [ @@ -219,7 +219,7 @@ }, { "cell_type": "markdown", - "id": "681ccc37", + "id": "e3ad9d82", "metadata": { "slideshow": { "slide_type": "slide" @@ -237,7 +237,7 @@ }, { "cell_type": "markdown", - "id": "ee488964", + "id": "923aa961", "metadata": {}, "source": [ "```mermaid\n", @@ -259,7 +259,7 @@ }, { "cell_type": "markdown", - "id": "0fe94b3a", + "id": "8d5949d9", "metadata": { "slideshow": { "slide_type": "slide" @@ -275,7 +275,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b152b031", + "id": "a92766fd", "metadata": {}, "outputs": [], "source": [ @@ -298,7 +298,7 @@ }, { "cell_type": "markdown", - "id": "71ec1503", + "id": "36f191f3", "metadata": {}, "source": [ "Exercise:\n", @@ -312,7 +312,7 @@ }, { "cell_type": "markdown", - "id": "7161c4d9", + "id": "1325e90e", "metadata": { "slideshow": { "slide_type": "slide" @@ -328,7 +328,7 @@ }, { "cell_type": "markdown", - "id": "4aa9cb2c", + "id": "b1743159", "metadata": { "slideshow": { "slide_type": "slide" @@ -348,7 +348,7 @@ { "cell_type": "code", "execution_count": null, - "id": "15f81dd4", + "id": "69703aca", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4538693e", + "id": "38bde82c", "metadata": {}, "outputs": [], "source": [ @@ -389,7 +389,7 @@ }, { "cell_type": "markdown", - "id": "f9c21cfd", + "id": "3f156ae6", "metadata": {}, "source": [ "Now we will infer how countries are modeled\n", @@ -408,7 +408,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d681e3eb", + "id": "f3e85718", "metadata": {}, "outputs": [], "source": [ @@ -428,7 +428,7 @@ }, { "cell_type": "markdown", - "id": "17f12003", + "id": "59439f97", "metadata": {}, "source": [ "The data model extracted from the graph:\n", @@ -439,7 +439,7 @@ }, { "cell_type": "markdown", - "id": "ae5477e6", + "id": "f81a0c4d", "metadata": {}, "source": [ "```mermaid\n", diff --git a/sparql-101/notebooks/12-enriching-data.ipynb b/sparql-101/notebooks/12-enriching-data.ipynb index 122e0b2..4b6d5ff 100644 --- a/sparql-101/notebooks/12-enriching-data.ipynb +++ b/sparql-101/notebooks/12-enriching-data.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "1dc100cf", + "id": "dea79f2d", "metadata": {}, "source": [ "# Agenda\n", @@ -14,7 +14,26 @@ "\n", "## Graphs vs Tables\n", "\n", - "Storing data in tables requires to have a fixed schema.\n", + "When we store data in tables,\n", + "whe have a fixed schema.\n", + "\n", + "Constraints have advantages:\n", + "\n", + "- performance;\n", + "- data integrity;\n", + "- consistency." + ] + }, + { + "cell_type": "markdown", + "id": "adf307ff", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", "\n", "Column meaning is defined outside the table, or\n", "where possible, in the table header.\n", @@ -25,9 +44,9 @@ "\n", "| id | name | surname | spouse |\n", "|----|-------|---------|----------------|\n", - "| 1 | Homer | Simpson ||\n", - "| 2 | Marge | Simpson ||\n", - "| 3 | Bart | Simpson | ||\n", + "| 1 | Homer | Simpson | ... |\n", + "| 2 | Marge | Simpson | ... |\n", + "| 3 | Bart | Simpson | ... |\n", "\n", "Another database related to the same entity\n", "may have a different schema.\n", @@ -45,7 +64,7 @@ }, { "cell_type": "markdown", - "id": "9ad27853", + "id": "81a93627", "metadata": {}, "source": [ "```mermaid\n", @@ -78,7 +97,7 @@ }, { "cell_type": "markdown", - "id": "01bf2e74", + "id": "8041f5a2", "metadata": {}, "source": [ "Storing data in a graph allows to use\n", @@ -88,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "a2dbd5ae", + "id": "fdd6ad55", "metadata": { "slideshow": { "slide_type": "slide" @@ -103,7 +122,7 @@ { "cell_type": "code", "execution_count": null, - "id": "60d07b06", + "id": "8fdc468d", "metadata": {}, "outputs": [], "source": [ @@ -118,7 +137,7 @@ }, { "cell_type": "markdown", - "id": "64b7c8d8", + "id": "d8857b08", "metadata": {}, "source": [ "Add a context to the dataset." @@ -127,7 +146,7 @@ { "cell_type": "code", "execution_count": null, - "id": "95e149be", + "id": "e64f806a", "metadata": {}, "outputs": [], "source": [ @@ -146,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "fd2afd39", + "id": "8a7147ab", "metadata": {}, "source": [ "Now assemble everything in a JSON-LD graph" @@ -155,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3b9935ec", + "id": "7befef4a", "metadata": {}, "outputs": [], "source": [ @@ -168,7 +187,7 @@ }, { "cell_type": "markdown", - "id": "268f3b57", + "id": "eff2c142", "metadata": {}, "source": [ "Exercise:\n", @@ -179,7 +198,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8d436421", + "id": "9a37d18c", "metadata": {}, "outputs": [], "source": [ @@ -192,7 +211,7 @@ }, { "cell_type": "markdown", - "id": "4b3c0840", + "id": "00398e3d", "metadata": {}, "source": [ "And create a dataset and bind the selected namespaces." @@ -201,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cdf16284", + "id": "cb64cfe6", "metadata": {}, "outputs": [], "source": [ @@ -217,7 +236,7 @@ }, { "cell_type": "markdown", - "id": "2b4b4bca", + "id": "3afb9b68", "metadata": {}, "source": [ "Exercise:\n", @@ -228,7 +247,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c40f1bd9", + "id": "620bacd8", "metadata": {}, "outputs": [], "source": [ @@ -239,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "0de8569d", + "id": "86ef9144", "metadata": {}, "source": [ "Exercise:\n", @@ -253,7 +272,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2e4895e8", + "id": "2c9d17f8", "metadata": {}, "outputs": [], "source": [ @@ -262,7 +281,7 @@ }, { "cell_type": "markdown", - "id": "74eb29b8", + "id": "67b2fb85", "metadata": {}, "source": [ "Now we have a graph to enrich with external data.\n", @@ -275,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "159dc2e6", + "id": "7a43bb9e", "metadata": {}, "outputs": [], "source": [ @@ -310,7 +329,7 @@ }, { "cell_type": "markdown", - "id": "9eb36d1d", + "id": "c2ea1858", "metadata": {}, "source": [ "Exercise:\n", @@ -325,7 +344,7 @@ { "cell_type": "code", "execution_count": null, - "id": "921f318f", + "id": "d0b3b366", "metadata": {}, "outputs": [], "source": [ @@ -360,7 +379,7 @@ }, { "cell_type": "markdown", - "id": "7e6bbda1", + "id": "4fa89f8c", "metadata": {}, "source": [ "Now we can see the country identifier in the graph." @@ -369,7 +388,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1e51ea40", + "id": "0fb4a04e", "metadata": {}, "outputs": [], "source": [ @@ -378,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "d82404ca", + "id": "ad07096e", "metadata": {}, "source": [ "Now, we can even have a \"fat\" graph with all the information" @@ -387,7 +406,7 @@ { "cell_type": "code", "execution_count": null, - "id": "15071eb3", + "id": "c01f32eb", "metadata": {}, "outputs": [], "source": [ @@ -412,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "4cee4bfe", + "id": "78d6834f", "metadata": {}, "source": [ "We can also mangle the data a bit..." @@ -421,7 +440,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9d1219a8", + "id": "74aac9ea", "metadata": {}, "outputs": [], "source": [ @@ -452,7 +471,7 @@ }, { "cell_type": "markdown", - "id": "d1a9a02f", + "id": "2eac2a08", "metadata": {}, "source": [ "Exercise:\n", @@ -464,7 +483,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4fc1d942", + "id": "44e31d16", "metadata": { "attributes": { "classes": [ diff --git a/sparql-101/notebooks/sample.ttl b/sparql-101/notebooks/sample.ttl index 4448431..66a5ec3 100644 --- a/sparql-101/notebooks/sample.ttl +++ b/sparql-101/notebooks/sample.ttl @@ -5,6 +5,8 @@ a foaf:Person ; foaf:name "Roberto" ; + foaf:age 40 ; + foaf:status "Coding"@en, "Programmando"@it ; foaf:mbox ; foaf:knows , @@ -12,18 +14,22 @@ a foaf:Person ; foaf:name "Jon" ; + foaf:age 20 ; + foaf:status "Lunch"@en, "A pranzo"@it ; foaf:mbox ; foaf:knows . a foaf:Person ; foaf:name "Danilo" ; + foaf:age 35 ; foaf:mbox ; foaf:knows . a foaf:Person ; foaf:name "Moin" ; + foaf:age 20 ; foaf:mbox ; foaf:knows . @@ -31,5 +37,6 @@ a foaf:Person ; foaf:name "Hermit" ; + foaf:age 90 ; foaf:mbox . diff --git a/sparql-101/notebooks/simpsons.ttl b/sparql-101/notebooks/simpsons.ttl index 03fa565..6b120f8 100644 --- a/sparql-101/notebooks/simpsons.ttl +++ b/sparql-101/notebooks/simpsons.ttl @@ -23,8 +23,12 @@ schema:nationality :USA . +:Bart a schema:Person . +:Lisa a schema:Person . + # This is the fictional USA country # in the Simpsons universe. :USA a schema:Country ; - schema:name "United States of America"@en + schema:name "United States of America"@en, + "Stati Uniti d'America"@it ; . From 33111f99cc69cc9ff33635ff99704d18cfd280a8 Mon Sep 17 00:00:00 2001 From: Antonio Spadaro Date: Wed, 28 May 2025 08:33:11 +0200 Subject: [PATCH 47/52] Fix: #94. [Sparql-101] Fix Jupyter lite links (#95) * Fix jupyter lite links --- sparql-101/00-jupyter-intro.md | 2 +- sparql-101/notebooks/00-jupyter-intro.ipynb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sparql-101/00-jupyter-intro.md b/sparql-101/00-jupyter-intro.md index ab61865..b0179dd 100644 --- a/sparql-101/00-jupyter-intro.md +++ b/sparql-101/00-jupyter-intro.md @@ -16,7 +16,7 @@ This is a fast-track course for high school students with math knowledge. Students are expected to type and execute cells, and share their results. -You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/ioggstream-86/sparql-101/notebooks/00-teaser.ipynb). +You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb). --- diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb index 3c94fd5..abfe9c5 100644 --- a/sparql-101/notebooks/00-jupyter-intro.ipynb +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -33,7 +33,7 @@ "\n", "Students are expected to type and execute cells, and share their results.\n", "\n", - "You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/ioggstream-86/sparql-101/notebooks/00-teaser.ipynb)." + "You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb)." ] }, { From d38bf39a80740101f011cfeebc149b3b33ddb1b4 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Thu, 29 May 2025 12:58:43 +0200 Subject: [PATCH 48/52] Code review danilo. (#97) * Code review danilo. * Fix solutions. --- sparql-101/01-knowledge.md | 34 +- sparql-101/02-semantics.md | 60 ++- sparql-101/05-sparql.md | 121 +++-- sparql-101/07-jsonld.md | 48 +- sparql-101/notebooks/00-jupyter-intro.ipynb | 28 +- sparql-101/notebooks/00-teaser.ipynb | 76 +-- sparql-101/notebooks/01-knowledge.ipynb | 202 ++++---- sparql-101/notebooks/02-semantics.ipynb | 197 ++++---- sparql-101/notebooks/05-sparql.ipynb | 466 ++++++++++-------- sparql-101/notebooks/07-jsonld.ipynb | 125 ++--- sparql-101/notebooks/10-rdf.ipynb | 48 +- sparql-101/notebooks/11-sparql-metadata.ipynb | 54 +- sparql-101/notebooks/12-enriching-data.ipynb | 77 ++- 13 files changed, 891 insertions(+), 645 deletions(-) diff --git a/sparql-101/01-knowledge.md b/sparql-101/01-knowledge.md index 6d2eb40..f149a94 100644 --- a/sparql-101/01-knowledge.md +++ b/sparql-101/01-knowledge.md @@ -8,6 +8,8 @@ *Beware*: commands may contain small typos. You have to fix them to properly complete the course! +TODO: add from pathlib import Path +consider extending n. nodes limit in plot ---- Prerequisites: @@ -23,8 +25,6 @@ Prerequisites: --- - - ## What is knowledge? Knowledge is a set of information that is useful for a given purpose. @@ -219,6 +219,20 @@ where a sentence is expressed as a tripe: :exclamation: note the dot at the end of the sentence :exclamation: +---- + +If you are familiar with SQL, +you can see a graph as a table, +where each row is a sentence. + +| Subject | Predicate | Object | +|---------|-----------|--------| +| dbr:Python | rdf:type | dbo:ProgrammingLanguage | +| dbr:Python | dbo:designer | dbr:gvr | +| dbr:Python | dbo:runsOn | dbr:win | +| dbr:Python | dbo:runsOn | dbr:linux | + + ---- ## RDF: Machine Readable Knowledge @@ -264,7 +278,7 @@ literal = Literal("Mario Rossi") print(iri.n3(), blank_node.n3(), literal.n3(), sep="\n") ``` -#### Exercise: RDF elements +💪: RDF elements In the cell below, create a literal with the following values and look at its [Notation 3 (N3)](https://www.w3.org/TeamSubmission/n3/) serialization. @@ -421,7 +435,7 @@ sentences = """ """ ``` -#### Exercise: parse the sentences using rdflib and answer the following questions +💪: parse the sentences using rdflib and answer the following questions - how many sentences are there? - how many subjects are there? @@ -435,7 +449,7 @@ tortellini = Graph() # Use this cell for the exercise ``` -#### Exercise: use `Graph.namespaces` to get the namespaces added by the sentences above +💪: use `Graph.namespaces` to get the namespaces added by the sentences above ```python from rdflib import Graph @@ -445,14 +459,14 @@ default_ns = set(Graph().namespaces()) # Use this cell for the exercise ``` -#### Exercise: serialize the above graph in JSON-LD format +💪: serialize the above graph in JSON-LD format ```python # Use this cell for the exercise tortellini_jsonld = ... ``` -#### Exercise: Load the JSON-LD object in a variable +💪: Load the JSON-LD object in a variable - What's the type and len of the serialized object? - What's in the first element of the serialized object? @@ -464,7 +478,7 @@ import json ... ``` -#### Exercise: Get a voice from dbpedia +💪: Get a voice from dbpedia Now, let's get the actual voice from dbpedia. @@ -500,7 +514,7 @@ excerpt = sentences[0:15] print(*[str(s) for s in excerpt], sep="\n") ``` -#### Exercise: counting sentences +💪: counting sentences - how many sentences are there? - how many elements does each sentence have? @@ -524,7 +538,7 @@ import tools tools.plot_graph(g, limit=30) ``` -#### Exercise: extending graphs +💪: extending graphs There's plenty of knowledge in the web! diff --git a/sparql-101/02-semantics.md b/sparql-101/02-semantics.md index e658d21..5974e77 100644 --- a/sparql-101/02-semantics.md +++ b/sparql-101/02-semantics.md @@ -36,8 +36,8 @@ Integrating data from different sources is difficult because of the lack of sema ```mermaid graph LR -Am>"{name: FABIANO Romildo\nincome: 4_000_000}"] -Cm>"{givenName: FABIANO\nfamilyName: Romildo\ntax: 12_000EUR}"] +Am>"{name: FABIANO Romildo
income: 4_000_000}"] +Cm>"{givenName: FABIANO
familyName: Romildo
tax: 12_000EUR}"] B((Data sink)) A((Data source 1)) ---Am --> B @@ -51,8 +51,8 @@ and even registry data are not always interoperable. ```mermaid graph LR -Am>"{givenName: Angela\nfamilyName: Merkel\ndate_of_birth: 1954-07-17}"] -Cm>"{givenName: Angela\nfamilyName: Kasner\ndate_of_birth: 1954-07-17}"] +Am>"{givenName: Angela
familyName: Merkel
date_of_birth: 1954-07-17}"] +Cm>"{givenName: Angela
familyName: Kasner
date_of_birth: 1954-07-17}"] B((Data sink)) A((Data source 1)) ---Am --> B @@ -146,6 +146,38 @@ end class p1,p2,p3 pad; ``` +---- + +### Graphs and RDBMS + +From a relationa perspective, +you can see a dataset as a set of different tables + +<_:Person> + +|subject|predicate|object| +|---|---|---| +|:Mario| a | :Person| +|:Mario| givenName | "Mario"| + +<_:Country> + +|subject|predicate|object| +|---|---|---| +|:ITA| a | :Country| +|:ITA| name | "Italy"@en| +|:ITA| name | "Italia"@it| + +Or as a single 4-ple table: + +|graph|subject|predicate|object| +|---|---|---|---| +| <_:Person>|:Mario| a | :Person| +| <_:Person>|:Mario| givenName | "Mario"| +| <_:Country>|:ITA| a | :Country| +| <_:Country>|:ITA| name | "Italy"@en| +| <_:Country>|:ITA| name | "Italia"@it| + ```python from rdflib import Dataset @@ -153,7 +185,7 @@ from rdflib import Dataset d = Dataset() ``` -#### Exercise: dataset +💪: dataset - use the `Dataset.graphs` method to list the graphs in the dataset; @@ -191,7 +223,7 @@ conceptual tools such as ontologies and controlled vocabularies (codelist, taxonomies, ..) are used. -#### Exercise: the DBpedia ontology and dataset +💪: the DBpedia ontology and dataset Parse the following RDF sentences in a dataset. @@ -270,10 +302,8 @@ subgraph xsd[XMLSchema] xsd:string end -givenName_description -.-|description| givenName -isParentOf_description --.-|description| -isParentOf +givenName_description -.-|description| givenName +isParentOf_description -.-|description| isParentOf givenName & familyName & isParentOf -.-o|domain| Person familyName & givenName ---->|range| xsd:string @@ -292,13 +322,15 @@ Examples of European controlled vocabularies are here . @prefix ex: . diff --git a/sparql-101/05-sparql.md b/sparql-101/05-sparql.md index af6f3a6..1345416 100644 --- a/sparql-101/05-sparql.md +++ b/sparql-101/05-sparql.md @@ -18,6 +18,7 @@ Prerequisites: - json, yaml, xmlschema - HTTP, OpenAPI 3 - SQL and database hints +- basics of RDF and Turtle --- @@ -48,6 +49,10 @@ d = Dataset() Exercise: list the graphs in the dataset. +```solution +list(d.graphs()) +``` + ---- A sparql query retrieves all entries @@ -81,10 +86,10 @@ creating a new graph. ```python # Create hte _:sample graph -g = d.graph("_:sample") +sample = d.graph("_:sample") # Add triples from sample.ttl -g.parse("sample.ttl", format="text/turtle") +sample.parse("sample.ttl", format="text/turtle") ``` Use our utility function to print the graph. @@ -92,7 +97,7 @@ Use our utility function to print the graph. ```python from rdflib import FOAF import tools -tools.plot_graph(g, label_property=FOAF.name) +tools.plot_graph(sample, label_property=FOAF.name) ``` That's what we have @@ -105,7 +110,7 @@ subgraph d["d"] g_graph[("_:sample")] end -g[[g variable]] -->|references| g_graph +g[[sample variable]] -->|references| g_graph ``` List all entries from th `_:sample` graph. @@ -118,7 +123,7 @@ WHERE { } LIMIT 2 """ -result : Result = g.query(q) +result : Result = sample.query(q) [r.asdict() for r in result] ``` @@ -160,7 +165,7 @@ WHERE { ?subject foaf:status ?status . } """ -result = g.query(q) +result = sample.query(q) list(result) ``` @@ -178,7 +183,7 @@ WHERE { ?subject foaf:status ?status . } """ -result = g.query(q) +result = sample.query(q) list(result) ``` @@ -198,7 +203,7 @@ WHERE { } """ -result = g.query(q) +result = sample.query(q) list(result) ``` @@ -211,18 +216,19 @@ and aggregate functions like `COUNT`, `SUM`, `AVG`, `GROUP_CONCAT`, etc. q = """ SELECT ?subject - (COUNT(?object) AS ?count) + (COUNT(?object) AS ?count_) WHERE { ?subject foaf:knows ?object . } GROUP BY ?subject ORDER BY DESC(?count) """ -result = g.query(q) -{str(r.subject): r.count for r in result} +result = sample.query(q) +{str(r.subject): r.count_ for r in result} ``` - +Note that the count_ value references +the datatype of the variable. ### Serializing datasets in Trig format @@ -297,7 +303,8 @@ d.query(q).bindings Now I can query all the graphs in the dataset ```python -q = """SELECT DISTINCT * +q = """ +SELECT DISTINCT * WHERE { GRAPH ?g {} } @@ -324,9 +331,24 @@ list(result) Exercise: -- replace `?g` with `_:sample`: +- replace `?g` with the graph URI `<_:sample>`: what happens? + +```solution +q = """ +SELECT DISTINCT + ?Class +WHERE { + GRAPH <_:sample> { + [] a ?Class . + } +} +""" +result = d.query(q) +list(result) +``` + Querying triples in a specific graph: ```python @@ -355,6 +377,12 @@ Exercise: having a `schema:nationality` property. ```python +# Use this cell for the exercise. +q = ... + +``` + +```solution q = """ SELECT DISTINCT ?s @@ -376,7 +404,7 @@ result = d.query(q) - ?country has a schema:name ?country_name - ?country_name is in Italian -```python +```solution q = """ SELECT DISTINCT ?subject ?country_name @@ -447,7 +475,7 @@ result = simpsons.update(q) 💪: check the graph -```python +```solution assert "Homer Simpson" in simpsons.serialize(format="turtle") ``` @@ -471,7 +499,7 @@ SELECT * WHERE { } """ -result = g.query(q) +result = sample.query(q) [r.asdict() for r in result] ``` @@ -486,8 +514,26 @@ Exercise: ---- -Graph databases have an inference engine that can be used -to process complex queries. +Graph databases can find triples +matching different sentences... + +... and even traverse paths. + +```mermaid +graph LR + +r((r)) & j((j)) +d((d)) & m((m)) +h((h)) & k((k)) +q((q)) & a((a)) + +r <-->|knows| j & d +j <-->|knows| m & k +d <-->|knows| k +d <-->|knows| q +m <-->|knows| k +q <-->|knows| a +``` ```python q = """ @@ -500,7 +546,7 @@ WHERE { } """ -result = g.query(q) +result = sample.query(q) [r.asdict() for r in result] ``` @@ -514,6 +560,21 @@ Exercise: - modify the above query replacing `foaf:knows` with `foaf:knows*` and see what happens. +```solution +q = """ +PREFIX foaf: + +SELECT * +WHERE { + ?s a foaf:Person . + ?s foaf:knows* ?o . +} +""" + +result = sample.query(q) +[r.asdict() for r in result] +``` + SparQL supports GROUP BY and ORDER BY clauses. ```python @@ -531,7 +592,7 @@ WHERE { } GROUP BY ?s """ -result = g.query(q) +result = sample.query(q) {str(r.s): {"network": str(r.friends) } for r in result} ``` @@ -557,7 +618,7 @@ WHERE { } """ -result = g.query(q) +result = sample.query(q) [r.asdict() for r in result] ``` @@ -579,7 +640,7 @@ WHERE { ?user3 foaf:mbox ?mail3 } """ -result = g.query(q) +result = sample.query(q) {str(r.mail1): str(r.mail3) for r in result} ``` @@ -614,7 +675,6 @@ Exercise: - remove the GRAPH information from the query and see what happens. - --- # Querying DBPedia @@ -627,7 +687,7 @@ We can use it to learn sparql. - list concepts -```text +```sparql SELECT DISTINCT ?Concept WHERE { @@ -640,7 +700,7 @@ LIMIT 20 Now we want to list all `Person` -```text +```sparql PREFIX foaf: SELECT DISTINCT @@ -672,7 +732,7 @@ LIMIT 10 ... with their deathplaces -```raw +```sparql PREFIX foaf: PREFIX dbp: PREFIX dbr: @@ -692,7 +752,7 @@ LIMIT 10 If deathplace is in UK -```raw +```sparql PREFIX foaf: PREFIX dbp: PREFIX dbr: @@ -783,3 +843,8 @@ SELECT DISTINCT * WHERE { } LIMIT 50 ``` + +## Closing question + +If you ask, should I rewrite all my data in RDF? +NO :) Let's see how JSON-LD can help us. diff --git a/sparql-101/07-jsonld.md b/sparql-101/07-jsonld.md index 45bc9cf..a1c3adc 100644 --- a/sparql-101/07-jsonld.md +++ b/sparql-101/07-jsonld.md @@ -1,7 +1,11 @@ # Agenda +In this lesson we will answer the following question: +should I rewrite all my data in RDF? NO :) + + - Storing data vs Describing Knowledge -- JSON-LD +- Adding metadata to existing data with JSON-LD ## Storing data @@ -49,6 +53,8 @@ JSON-LD is a JSON serialization for information described using the A JSON-LD document is both an RDF and a JSON document. +:warning: Its media-type is `application/ld+json`. + ---- ```python @@ -79,7 +85,7 @@ context = { ```python homer_ld_json = json.dumps({ - "@context": context + "@context": context, **homer }) ``` @@ -90,15 +96,13 @@ Exercise: - print the serialization of the graph in `text/turtle` format -```python +```solution from rdflib import Graph - +g = Graph() +g.parse(data=homer_ld_json, format="application/ld+json") +print(g.serialize(format="text/turtle")) ``` - - - - --- is a collaborative vocabulary to @@ -115,7 +119,6 @@ Its terms are availabe here Start with an object with fields in Italian: - ```python jane = { "nome": "Jane Doe", @@ -144,19 +147,34 @@ jane_ld = { "@type": "sdo:Person", **jane } -print(json.dumps(jane_ld)) +print(json.dumps(jane_ld, indent=2)) ``` Exercise: - load `jane_ld` in a Graph() - what's the subject of the sentences? +- Does the subject have an URI? ```python -jane_ld_json = ... +from rdflib import Graph + +# Serialize the JSON-LD document +jane_ld_json = json.dumps(jane_ld) + +# Load the JSON-LD document into a Graph +g = Graph() +g.parse(data=jane_ld_json, format="application/ld+json") + +# Print the serialization of the graph in text/turtle format +print(g.serialize(format="text/turtle")) + +# Print the subjects of the graph +subjects = set(g.subjects()) ``` + --- ### Localization @@ -211,7 +229,9 @@ jane_ld["@context"].update({ --- -#### Context mangling +#### :warning: Context mangling + +Pay attention! Modifying a JSON-LD context, alters the @@ -233,7 +253,7 @@ could reverse the payment flow. ```yaml # Original context -@context: +"@context": payment_from: http://banking#debtor payment_to: http://banking#creditor ``` @@ -242,7 +262,7 @@ could reverse the payment flow. ```yaml # Altered context -@context: +"@context": payment_to: http://banking#debtor payment_from: http://banking#creditor ``` diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb index abfe9c5..27b450b 100644 --- a/sparql-101/notebooks/00-jupyter-intro.ipynb +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "1519c270", + "id": "05b17236", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "db0efd67", + "id": "2a230b0d", "metadata": { "slideshow": { "slide_type": "slide" @@ -38,7 +38,7 @@ }, { "cell_type": "markdown", - "id": "ba49fa2b", + "id": "384c1067", "metadata": { "slideshow": { "slide_type": "slide" @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "7f6c91b3", + "id": "c2e69109", "metadata": { "slideshow": { "slide_type": "slide" @@ -74,7 +74,7 @@ }, { "cell_type": "markdown", - "id": "676a7426", + "id": "033e976e", "metadata": { "slideshow": { "slide_type": "slide" @@ -98,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "fd481a83", + "id": "12a829d9", "metadata": { "slideshow": { "slide_type": "slide" @@ -112,7 +112,7 @@ }, { "cell_type": "markdown", - "id": "c8350a45", + "id": "32d0bbc8", "metadata": { "slideshow": { "slide_type": "subslide" @@ -127,7 +127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7cb895c1", + "id": "7c3c2b0c", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +136,7 @@ }, { "cell_type": "markdown", - "id": "5c517cc9", + "id": "7259530d", "metadata": { "slideshow": { "slide_type": "slide" @@ -154,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2d477a8c", + "id": "b1a6f4c3", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "ee724bd1", + "id": "b971ca26", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -174,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a31adbe2", + "id": "c93a2374", "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ }, { "cell_type": "markdown", - "id": "53874d48", + "id": "7557be54", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "14819eb3", + "id": "e4e280dd", "metadata": {}, "source": [ "----" diff --git a/sparql-101/notebooks/00-teaser.ipynb b/sparql-101/notebooks/00-teaser.ipynb index 729fb7b..360f979 100644 --- a/sparql-101/notebooks/00-teaser.ipynb +++ b/sparql-101/notebooks/00-teaser.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "09733197", + "id": "503c1efd", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "6ceec576", + "id": "a0ded234", "metadata": { "slideshow": { "slide_type": "slide" @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cbd7bf8e", + "id": "674f3fc4", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "21afe7aa", + "id": "f53f3abe", "metadata": {}, "source": [ "(and some graph libraries)" @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6684fc86", + "id": "88d0dd2e", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3bd4127d", + "id": "10aa1ce1", "metadata": {}, "outputs": [], "source": [ @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "8f789d4b", + "id": "955762a2", "metadata": {}, "source": [ "For example network of persons:" @@ -94,7 +94,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f65c9e8d", + "id": "7b11cae3", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "8531d218", + "id": "6cca0fd1", "metadata": {}, "source": [ "... eventually rendered as a graph ..." @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ea7d164d", + "id": "9ca432f7", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "751d60cf", + "id": "513d636e", "metadata": {}, "source": [ "Convert it in [JSON-LD](https://json-ld.org/) format:" @@ -149,7 +149,7 @@ { "cell_type": "code", "execution_count": null, - "id": "772459cf", + "id": "90c54ebe", "metadata": {}, "outputs": [], "source": [ @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "79916b8e", + "id": "7fa25192", "metadata": {}, "source": [ "There's plenty of knowledge in the web!" @@ -168,7 +168,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c2909b26", + "id": "595570f6", "metadata": {}, "outputs": [], "source": [ @@ -187,7 +187,7 @@ }, { "cell_type": "markdown", - "id": "36fa2370", + "id": "70e1e00d", "metadata": {}, "source": [ "And we can connect them together" @@ -196,7 +196,7 @@ { "cell_type": "code", "execution_count": null, - "id": "294181bf", + "id": "e80e242d", "metadata": {}, "outputs": [], "source": [ @@ -211,7 +211,7 @@ }, { "cell_type": "markdown", - "id": "10dc8406", + "id": "1e3c98b1", "metadata": {}, "source": [ "Graphs contain a lot of senteces" @@ -220,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8f2ad975", + "id": "343e9755", "metadata": {}, "outputs": [], "source": [ @@ -229,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "067426ce", + "id": "02a9dd74", "metadata": {}, "source": [ "but we can query them (e.g., for Italian food)" @@ -238,7 +238,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4e74fcbc", + "id": "e5f69b39", "metadata": {}, "outputs": [], "source": [ @@ -258,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "15f61bb8", + "id": "31794391", "metadata": {}, "source": [ "and see if two resources have something in common..." @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8850a8c5", + "id": "8d8198ef", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "fb21d020", + "id": "8c0104fa", "metadata": {}, "source": [ "We can query remote graphs (e.g., DBPedia):" @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c624f038", + "id": "e4e9d761", "metadata": {}, "outputs": [], "source": [ @@ -319,7 +319,7 @@ }, { "cell_type": "markdown", - "id": "5ab3a3c8", + "id": "d8361c79", "metadata": {}, "source": [ "Provided by different organizations" @@ -328,7 +328,7 @@ { "cell_type": "code", "execution_count": null, - "id": "66e02f9f", + "id": "2064f108", "metadata": {}, "outputs": [], "source": [ @@ -358,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "cea5eb05", + "id": "5ab0b3b9", "metadata": {}, "source": [ "And their relations" @@ -367,7 +367,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8024813f", + "id": "9e7787d7", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "5855c7dc", + "id": "9b210798", "metadata": {}, "source": [ "More relations" @@ -406,7 +406,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8ec38803", + "id": "35f29272", "metadata": {}, "outputs": [], "source": [ @@ -437,7 +437,7 @@ }, { "cell_type": "markdown", - "id": "53e07867", + "id": "104cc65b", "metadata": { "slideshow": { "slide_type": "slide" @@ -452,7 +452,7 @@ { "cell_type": "code", "execution_count": null, - "id": "23a07494", + "id": "a8b53cd9", "metadata": {}, "outputs": [], "source": [ @@ -461,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "be43cf1b", + "id": "24367b51", "metadata": { "slideshow": { "slide_type": "slide" @@ -476,7 +476,7 @@ { "cell_type": "code", "execution_count": null, - "id": "defe14cc", + "id": "c62a8fe2", "metadata": {}, "outputs": [], "source": [ @@ -500,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "b32f1489", + "id": "72d220c9", "metadata": {}, "source": [ "Get security insights from the NSA knowledge graph." @@ -509,7 +509,7 @@ { "cell_type": "code", "execution_count": null, - "id": "64df39cb", + "id": "bfff459d", "metadata": {}, "outputs": [], "source": [ @@ -526,7 +526,7 @@ }, { "cell_type": "markdown", - "id": "5d16f491", + "id": "e4b00d8d", "metadata": {}, "source": [ "and apply this stuff to our infrastructure." @@ -535,7 +535,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ca9f4235", + "id": "e004d3f9", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/01-knowledge.ipynb b/sparql-101/notebooks/01-knowledge.ipynb index d93c436..8688fc8 100644 --- a/sparql-101/notebooks/01-knowledge.ipynb +++ b/sparql-101/notebooks/01-knowledge.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "cd2b4781", + "id": "598d1e3d", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,12 +13,15 @@ "- Knowledge and graphs\n", "- RDF: machine-readable knowledge\n", "\n", - "*Beware*: commands may contain small typos. You have to fix them to properly complete the course!" + "*Beware*: commands may contain small typos. You have to fix them to properly complete the course!\n", + "\n", + "TODO: add from pathlib import Path\n", + "consider extending n. nodes limit in plot" ] }, { "cell_type": "markdown", - "id": "510edeb1", + "id": "7fd1c52b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -37,7 +40,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f39f768e", + "id": "50c884fb", "metadata": {}, "outputs": [], "source": [ @@ -47,7 +50,7 @@ }, { "cell_type": "markdown", - "id": "f72252a7", + "id": "775f17f6", "metadata": { "slideshow": { "slide_type": "slide" @@ -56,8 +59,6 @@ "source": [ "---\n", "\n", - "\n", - "\n", "## What is knowledge?\n", "\n", "Knowledge is a set of information that is useful for a given purpose.\n", @@ -68,7 +69,7 @@ }, { "cell_type": "markdown", - "id": "810c9c9c", + "id": "f724a90c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -86,7 +87,7 @@ }, { "cell_type": "markdown", - "id": "ca720e42", + "id": "461e3d50", "metadata": { "slideshow": { "slide_type": "subslide" @@ -107,7 +108,7 @@ }, { "cell_type": "markdown", - "id": "6c12ef0e", + "id": "c44a462c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -128,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "48ef67ba", + "id": "21ec4d90", "metadata": {}, "source": [ "```mermaid\n", @@ -139,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "869265f6", + "id": "2fd4962e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -157,7 +158,7 @@ { "cell_type": "code", "execution_count": null, - "id": "98a8543a", + "id": "254ebdc6", "metadata": {}, "outputs": [], "source": [ @@ -167,7 +168,7 @@ }, { "cell_type": "markdown", - "id": "5d0935fe", + "id": "66f5e7ae", "metadata": {}, "source": [ "We'll see how to use URIs to express knowledge." @@ -175,7 +176,7 @@ }, { "cell_type": "markdown", - "id": "e86b20fc", + "id": "3da2c913", "metadata": { "slideshow": { "slide_type": "subslide" @@ -194,7 +195,7 @@ }, { "cell_type": "markdown", - "id": "02a13d2c", + "id": "adf1fc70", "metadata": { "slideshow": { "slide_type": "subslide" @@ -213,7 +214,7 @@ }, { "cell_type": "markdown", - "id": "02638bf7", + "id": "17fed3ec", "metadata": {}, "source": [ "```mermaid\n", @@ -227,7 +228,7 @@ }, { "cell_type": "markdown", - "id": "8c5264d3", + "id": "51e97962", "metadata": { "slideshow": { "slide_type": "subslide" @@ -260,7 +261,7 @@ }, { "cell_type": "markdown", - "id": "a162e649", + "id": "b398f240", "metadata": { "slideshow": { "slide_type": "subslide" @@ -279,7 +280,7 @@ }, { "cell_type": "markdown", - "id": "d58c8eec", + "id": "8273835c", "metadata": {}, "source": [ "```mermaid\n", @@ -296,7 +297,7 @@ }, { "cell_type": "markdown", - "id": "163552d4", + "id": "e3388a38", "metadata": { "slideshow": { "slide_type": "subslide" @@ -310,7 +311,7 @@ }, { "cell_type": "markdown", - "id": "456c638d", + "id": "b51573de", "metadata": {}, "source": [ "```mermaid\n", @@ -324,7 +325,7 @@ }, { "cell_type": "markdown", - "id": "2f822d16", + "id": "da9e0ab3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -342,7 +343,7 @@ }, { "cell_type": "markdown", - "id": "26d85cc9", + "id": "dc12b964", "metadata": {}, "source": [ "```mermaid\n", @@ -367,7 +368,7 @@ }, { "cell_type": "markdown", - "id": "b3fe6f6a", + "id": "bdfa4323", "metadata": {}, "source": [ "This is the basis of the Semantic Web,\n", @@ -379,7 +380,7 @@ }, { "cell_type": "markdown", - "id": "8c5bbca0", + "id": "70f53c4e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -413,7 +414,30 @@ }, { "cell_type": "markdown", - "id": "6fc063e7", + "id": "d9c4dfe1", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "If you are familiar with SQL,\n", + "you can see a graph as a table,\n", + "where each row is a sentence.\n", + "\n", + "| Subject | Predicate | Object |\n", + "|---------|-----------|--------|\n", + "| dbr:Python | rdf:type | dbo:ProgrammingLanguage |\n", + "| dbr:Python | dbo:designer | dbr:gvr |\n", + "| dbr:Python | dbo:runsOn | dbr:win |\n", + "| dbr:Python | dbo:runsOn | dbr:linux |" + ] + }, + { + "cell_type": "markdown", + "id": "40aedb5a", "metadata": { "slideshow": { "slide_type": "subslide" @@ -437,7 +461,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bd5c4cb6", + "id": "ea6869be", "metadata": {}, "outputs": [], "source": [ @@ -448,7 +472,7 @@ }, { "cell_type": "markdown", - "id": "d7cca836", + "id": "97fabe43", "metadata": {}, "source": [ "RDF is based on:\n", @@ -468,7 +492,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c955f267", + "id": "df8dd188", "metadata": {}, "outputs": [], "source": [ @@ -486,10 +510,10 @@ }, { "cell_type": "markdown", - "id": "3e612c73", + "id": "58110f85", "metadata": {}, "source": [ - "#### Exercise: RDF elements\n", + "💪: RDF elements\n", "\n", "In the cell below, create a literal with the following values\n", "and look at its [Notation 3 (N3)](https://www.w3.org/TeamSubmission/n3/) serialization.\n", @@ -501,7 +525,7 @@ { "cell_type": "code", "execution_count": null, - "id": "30a86d33", + "id": "22c9a900", "metadata": {}, "outputs": [], "source": [ @@ -514,7 +538,7 @@ }, { "cell_type": "markdown", - "id": "f0304350", + "id": "782b5418", "metadata": {}, "source": [ "### Triples\n", @@ -526,7 +550,7 @@ { "cell_type": "code", "execution_count": null, - "id": "436fc543", + "id": "bcf68d74", "metadata": {}, "outputs": [], "source": [ @@ -536,7 +560,7 @@ }, { "cell_type": "markdown", - "id": "4748f21d", + "id": "48af7343", "metadata": {}, "source": [ "Another triple serialized in the N3 format:" @@ -545,7 +569,7 @@ { "cell_type": "code", "execution_count": null, - "id": "91ccd8fb", + "id": "7440c2eb", "metadata": {}, "outputs": [], "source": [ @@ -556,7 +580,7 @@ }, { "cell_type": "markdown", - "id": "a40be5f5", + "id": "d9d3a652", "metadata": {}, "source": [ "The `a` keyword is a shorthand for the `rdf:type` predicate,\n", @@ -568,7 +592,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7b978247", + "id": "72fc8b97", "metadata": {}, "outputs": [], "source": [ @@ -583,7 +607,7 @@ }, { "cell_type": "markdown", - "id": "d6018db7", + "id": "7d0b01e1", "metadata": {}, "source": [ "### Graphs\n", @@ -594,7 +618,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e6e170cc", + "id": "5ab0c7af", "metadata": {}, "outputs": [], "source": [ @@ -606,7 +630,7 @@ }, { "cell_type": "markdown", - "id": "1c58b278", + "id": "116d8cd7", "metadata": {}, "source": [ "----" @@ -615,7 +639,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a9eb7fdb", + "id": "b409dd8b", "metadata": {}, "outputs": [], "source": [ @@ -628,7 +652,7 @@ }, { "cell_type": "markdown", - "id": "0d8d3740", + "id": "b45fc2e1", "metadata": {}, "source": [ "💪 Exercise: parse sentences\n", @@ -639,7 +663,7 @@ }, { "cell_type": "markdown", - "id": "dee942f3", + "id": "85664b13", "metadata": { "slideshow": { "slide_type": "subslide" @@ -654,7 +678,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0eb10f30", + "id": "b3ed8f41", "metadata": {}, "outputs": [], "source": [ @@ -664,7 +688,7 @@ }, { "cell_type": "markdown", - "id": "813b2528", + "id": "0c63ad7c", "metadata": {}, "source": [ "💪 Exercise: take 2 minutes to map the JSON-LD format to the Turtle format.\n", @@ -674,7 +698,7 @@ }, { "cell_type": "markdown", - "id": "bddba0fb", + "id": "b1b627f7", "metadata": { "slideshow": { "slide_type": "slide" @@ -692,7 +716,7 @@ { "cell_type": "code", "execution_count": null, - "id": "af600937", + "id": "89a3e673", "metadata": {}, "outputs": [], "source": [ @@ -712,7 +736,7 @@ { "cell_type": "code", "execution_count": null, - "id": "48592687", + "id": "280d72e8", "metadata": {}, "outputs": [], "source": [ @@ -724,7 +748,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d82a5554", + "id": "a4907748", "metadata": {}, "outputs": [], "source": [ @@ -734,7 +758,7 @@ }, { "cell_type": "markdown", - "id": "738c88e1", + "id": "217712ca", "metadata": { "slideshow": { "slide_type": "subslide" @@ -750,7 +774,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12ac43f4", + "id": "ba179e6f", "metadata": {}, "outputs": [], "source": [ @@ -762,7 +786,7 @@ }, { "cell_type": "markdown", - "id": "f3277198", + "id": "c328612d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -785,7 +809,7 @@ { "cell_type": "code", "execution_count": null, - "id": "891b1d9b", + "id": "6ad1cc14", "metadata": {}, "outputs": [], "source": [ @@ -803,10 +827,10 @@ }, { "cell_type": "markdown", - "id": "7f6a5b1b", + "id": "7d2afd4c", "metadata": {}, "source": [ - "#### Exercise: parse the sentences using rdflib and answer the following questions\n", + "💪: parse the sentences using rdflib and answer the following questions\n", "\n", "- how many sentences are there?\n", "- how many subjects are there?\n", @@ -816,7 +840,7 @@ { "cell_type": "code", "execution_count": null, - "id": "95d0cb83", + "id": "b80de1ae", "metadata": {}, "outputs": [], "source": [ @@ -829,16 +853,16 @@ }, { "cell_type": "markdown", - "id": "42d42bb6", + "id": "bc07dc66", "metadata": {}, "source": [ - "#### Exercise: use `Graph.namespaces` to get the namespaces added by the sentences above" + "💪: use `Graph.namespaces` to get the namespaces added by the sentences above" ] }, { "cell_type": "code", "execution_count": null, - "id": "42e81a6d", + "id": "a281b4ff", "metadata": {}, "outputs": [], "source": [ @@ -851,16 +875,16 @@ }, { "cell_type": "markdown", - "id": "3f6bbded", + "id": "864f9f3e", "metadata": {}, "source": [ - "#### Exercise: serialize the above graph in JSON-LD format" + "💪: serialize the above graph in JSON-LD format" ] }, { "cell_type": "code", "execution_count": null, - "id": "483a739c", + "id": "9c4cba3f", "metadata": {}, "outputs": [], "source": [ @@ -870,10 +894,10 @@ }, { "cell_type": "markdown", - "id": "a016d2bc", + "id": "4fce0d44", "metadata": {}, "source": [ - "#### Exercise: Load the JSON-LD object in a variable\n", + "💪: Load the JSON-LD object in a variable\n", "\n", "- What's the type and len of the serialized object?\n", "- What's in the first element of the serialized object?" @@ -882,7 +906,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ffd2ba02", + "id": "2455f12c", "metadata": {}, "outputs": [], "source": [ @@ -894,10 +918,10 @@ }, { "cell_type": "markdown", - "id": "0e90f43a", + "id": "d12af273", "metadata": {}, "source": [ - "#### Exercise: Get a voice from dbpedia\n", + "💪: Get a voice from dbpedia\n", "\n", "Now, let's get the actual voice from dbpedia." ] @@ -905,7 +929,7 @@ { "cell_type": "code", "execution_count": null, - "id": "374313b0", + "id": "06693c64", "metadata": {}, "outputs": [], "source": [ @@ -921,7 +945,7 @@ }, { "cell_type": "markdown", - "id": "66fec365", + "id": "975e804f", "metadata": {}, "source": [ "We get a graph with the information about Tortellini." @@ -929,7 +953,7 @@ }, { "cell_type": "markdown", - "id": "c0652921", + "id": "ab1d757b", "metadata": {}, "source": [ "```mermaid\n", @@ -945,7 +969,7 @@ }, { "cell_type": "markdown", - "id": "8c44ca33", + "id": "27161ac5", "metadata": {}, "source": [ "An encyclopedia voice contains a list of sentences :)" @@ -954,7 +978,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d9d4e83b", + "id": "221cd062", "metadata": {}, "outputs": [], "source": [ @@ -966,10 +990,10 @@ }, { "cell_type": "markdown", - "id": "ab4d3e37", + "id": "748a85cf", "metadata": {}, "source": [ - "#### Exercise: counting sentences\n", + "💪: counting sentences\n", "\n", "- how many sentences are there?\n", "- how many elements does each sentence have?" @@ -978,7 +1002,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4bf62b6d", + "id": "19349bf4", "metadata": {}, "outputs": [], "source": [ @@ -987,7 +1011,7 @@ }, { "cell_type": "markdown", - "id": "555d19f3", + "id": "51a6b4b1", "metadata": {}, "source": [ "----" @@ -996,7 +1020,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e52b8f0a", + "id": "19552fb6", "metadata": {}, "outputs": [], "source": [ @@ -1010,7 +1034,7 @@ { "cell_type": "code", "execution_count": null, - "id": "89cf1937", + "id": "3164ff47", "metadata": {}, "outputs": [], "source": [ @@ -1020,10 +1044,10 @@ }, { "cell_type": "markdown", - "id": "7837f98d", + "id": "062d519d", "metadata": {}, "source": [ - "#### Exercise: extending graphs\n", + "💪: extending graphs\n", "\n", "There's plenty of knowledge in the web!" ] @@ -1031,7 +1055,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3d916269", + "id": "fad4dafa", "metadata": {}, "outputs": [], "source": [ @@ -1048,7 +1072,7 @@ }, { "cell_type": "markdown", - "id": "de506ca2", + "id": "2cd29d6c", "metadata": {}, "source": [ "And we can connect them together" @@ -1057,7 +1081,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dffe502f", + "id": "b98ef1df", "metadata": {}, "outputs": [], "source": [ @@ -1069,7 +1093,7 @@ }, { "cell_type": "markdown", - "id": "f8b0924d", + "id": "d041bca8", "metadata": {}, "source": [ "Exercise: how many sentences are there now?" @@ -1078,7 +1102,7 @@ { "cell_type": "code", "execution_count": null, - "id": "78e379ab", + "id": "609b8017", "metadata": {}, "outputs": [], "source": [ @@ -1087,7 +1111,7 @@ }, { "cell_type": "markdown", - "id": "4de868a1", + "id": "b601e028", "metadata": {}, "source": [ "Plot the graph again to see the new nodes and\n", @@ -1097,7 +1121,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c04e88f3", + "id": "474903fc", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/02-semantics.ipynb b/sparql-101/notebooks/02-semantics.ipynb index 8f61a89..5870754 100644 --- a/sparql-101/notebooks/02-semantics.ipynb +++ b/sparql-101/notebooks/02-semantics.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "b0a86f90", + "id": "47f70b9e", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -20,7 +20,7 @@ }, { "cell_type": "markdown", - "id": "56869ac3", + "id": "7b885c8e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -41,7 +41,7 @@ }, { "cell_type": "markdown", - "id": "6ba05b44", + "id": "6966ba25", "metadata": {}, "source": [ "```yaml\n", @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "51f91187", + "id": "f304af04", "metadata": {}, "source": [ "Is this a given name or a full name?\n", @@ -62,7 +62,7 @@ }, { "cell_type": "markdown", - "id": "2f59fb83", + "id": "eb4a5dbe", "metadata": { "slideshow": { "slide_type": "subslide" @@ -76,13 +76,13 @@ }, { "cell_type": "markdown", - "id": "c7988970", + "id": "6199e60a", "metadata": {}, "source": [ "```mermaid\n", "graph LR\n", - "Am>\"{name: FABIANO Romildo\\nincome: 4_000_000}\"]\n", - "Cm>\"{givenName: FABIANO\\nfamilyName: Romildo\\ntax: 12_000EUR}\"]\n", + "Am>\"{name: FABIANO Romildo
income: 4_000_000}\"]\n", + "Cm>\"{givenName: FABIANO
familyName: Romildo
tax: 12_000EUR}\"]\n", "B((Data sink))\n", "\n", "A((Data source 1)) ---Am --> B\n", @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "0190f863", + "id": "97a3d4d3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -107,13 +107,13 @@ }, { "cell_type": "markdown", - "id": "d821fc51", + "id": "b5e82d0a", "metadata": {}, "source": [ "```mermaid\n", "graph LR\n", - "Am>\"{givenName: Angela\\nfamilyName: Merkel\\ndate_of_birth: 1954-07-17}\"]\n", - "Cm>\"{givenName: Angela\\nfamilyName: Kasner\\ndate_of_birth: 1954-07-17}\"]\n", + "Am>\"{givenName: Angela
familyName: Merkel
date_of_birth: 1954-07-17}\"]\n", + "Cm>\"{givenName: Angela
familyName: Kasner
date_of_birth: 1954-07-17}\"]\n", "B((Data sink))\n", "\n", "A((Data source 1)) ---Am --> B\n", @@ -123,7 +123,7 @@ }, { "cell_type": "markdown", - "id": "c5ec135f", + "id": "da186fa7", "metadata": { "slideshow": { "slide_type": "subslide" @@ -143,7 +143,7 @@ }, { "cell_type": "markdown", - "id": "55623610", + "id": "84e4be56", "metadata": {}, "source": [ "```json\n", @@ -155,7 +155,7 @@ }, { "cell_type": "markdown", - "id": "9b1bc5f1", + "id": "f83d3efd", "metadata": { "slideshow": { "slide_type": "subslide" @@ -169,7 +169,7 @@ }, { "cell_type": "markdown", - "id": "12f7bc35", + "id": "279a37cd", "metadata": {}, "source": [ "```yaml\n", @@ -184,7 +184,7 @@ }, { "cell_type": "markdown", - "id": "5e55ee5a", + "id": "632cea12", "metadata": {}, "source": [ "```yaml\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "e91771b8", + "id": "ae371dd4", "metadata": { "slideshow": { "slide_type": "slide" @@ -216,7 +216,7 @@ }, { "cell_type": "markdown", - "id": "951fa219", + "id": "d022f20f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -230,7 +230,7 @@ }, { "cell_type": "markdown", - "id": "e90b69a3", + "id": "db87dcb0", "metadata": {}, "source": [ "```mermaid\n", @@ -272,10 +272,52 @@ "```" ] }, + { + "cell_type": "markdown", + "id": "fe56a26a", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "### Graphs and RDBMS\n", + "\n", + "From a relationa perspective,\n", + "you can see a dataset as a set of different tables\n", + "\n", + "<_:Person>\n", + "\n", + "|subject|predicate|object|\n", + "|---|---|---|\n", + "|:Mario| a | :Person|\n", + "|:Mario| givenName | \"Mario\"|\n", + "\n", + "<_:Country>\n", + "\n", + "|subject|predicate|object|\n", + "|---|---|---|\n", + "|:ITA| a | :Country|\n", + "|:ITA| name | \"Italy\"@en|\n", + "|:ITA| name | \"Italia\"@it|\n", + "\n", + "Or as a single 4-ple table:\n", + "\n", + "|graph|subject|predicate|object|\n", + "|---|---|---|---|\n", + "| <_:Person>|:Mario| a | :Person|\n", + "| <_:Person>|:Mario| givenName | \"Mario\"|\n", + "| <_:Country>|:ITA| a | :Country|\n", + "| <_:Country>|:ITA| name | \"Italy\"@en|\n", + "| <_:Country>|:ITA| name | \"Italia\"@it|" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "b61eb988", + "id": "3a06d6e2", "metadata": {}, "outputs": [], "source": [ @@ -286,10 +328,10 @@ }, { "cell_type": "markdown", - "id": "3edcfa87", + "id": "df3de5a0", "metadata": {}, "source": [ - "#### Exercise: dataset\n", + "💪: dataset\n", "\n", "- use the `Dataset.graphs` method to list the graphs in the dataset;\n", "\n", @@ -299,7 +341,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e3573102", + "id": "1f485928", "metadata": {}, "outputs": [], "source": [ @@ -309,7 +351,7 @@ }, { "cell_type": "markdown", - "id": "8b7bb555", + "id": "455dacfa", "metadata": {}, "source": [ "- list the graphs in the dataset again, together with their identifiers.\n", @@ -329,7 +371,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2fe9b49b", + "id": "4f8d7032", "metadata": {}, "outputs": [], "source": [ @@ -340,7 +382,7 @@ }, { "cell_type": "markdown", - "id": "4ac5126f", + "id": "afe05809", "metadata": { "slideshow": { "slide_type": "subslide" @@ -354,7 +396,7 @@ "and controlled vocabularies (codelist, taxonomies, ..)\n", "are used.\n", "\n", - "#### Exercise: the DBpedia ontology and dataset\n", + "💪: the DBpedia ontology and dataset\n", "\n", "Parse the following RDF sentences in a dataset." ] @@ -362,7 +404,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3fab7085", + "id": "eac33656", "metadata": {}, "outputs": [], "source": [ @@ -389,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "29e72bd8", + "id": "e069b5e9", "metadata": {}, "source": [ "- Get the URIs representing Tortellini and Food using the `Graph.subjects` and `Graph.objects` methods." @@ -398,7 +440,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c6e5fb83", + "id": "dd1da12b", "metadata": {}, "outputs": [], "source": [ @@ -411,7 +453,7 @@ }, { "cell_type": "markdown", - "id": "0d6dde8f", + "id": "c2f06ea5", "metadata": {}, "source": [ "\n", @@ -441,7 +483,7 @@ }, { "cell_type": "markdown", - "id": "4b015c42", + "id": "d71c8475", "metadata": {}, "source": [ "```mermaid\n", @@ -461,10 +503,8 @@ " xsd:string\n", "end\n", "\n", - "givenName_description -.-|description| givenName\n", - "isParentOf_description\n", - "-.-|description|\n", - "isParentOf\n", + "givenName_description -.-|description| givenName\n", + "isParentOf_description -.-|description| isParentOf\n", "givenName & familyName & isParentOf -.-o|domain| Person\n", "\n", "familyName & givenName ---->|range| xsd:string\n", @@ -476,7 +516,7 @@ }, { "cell_type": "markdown", - "id": "a6d0dd15", + "id": "d14342ac", "metadata": {}, "source": [ "- **Controlled vocabulary**: a vocabulary where the terms are validated by a designated authority.\n", @@ -487,7 +527,7 @@ }, { "cell_type": "markdown", - "id": "08541a67", + "id": "27061e4a", "metadata": { "slideshow": { "slide_type": "subslide" @@ -499,27 +539,21 @@ "## Standard vocabularies\n", "\n", "Standard vocabularies that are used to semantically describe data\n", - "are the RDF Schema (RDFS) vocabulary,\n", - "the Web Ontology Language (OWL) vocabulary,\n", - "and the Simple Knowledge Organization System (SKOS) vocabulary.\n", + "are:\n", + "\n", + "- the RDF Schema (RDFS) vocabulary,\n", + "- the Web Ontology Language (OWL) vocabulary,\n", + "- and the Simple Knowledge Organization System (SKOS) vocabulary.\n", "\n", "Here are some example IRIs described using RDFS:" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "f387beed", - "metadata": { - "attributes": { - "classes": [ - "raw" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "3320d2b0", + "metadata": {}, "source": [ + "```turtle\n", "@prefix rdfs: .\n", "@prefix ex: .\n", "\n", @@ -533,12 +567,14 @@ "\n", "ex:givenName rdf:type rdf:Property ;\n", " rdfs:domain ex:Person ;\n", - " rdfs:range xsd:string ;\n" + " rdfs:range xsd:string ;\n", + "\n", + "```" ] }, { "cell_type": "markdown", - "id": "daef3d83", + "id": "58021867", "metadata": {}, "source": [ "You can see vocabularies as a set of globally unique labels\n", @@ -550,19 +586,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "90cf9d40", - "metadata": { - "attributes": { - "classes": [ - "raw" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "149b572f", + "metadata": {}, "source": [ + "```raw\n", "@prefix ex: .\n", "\n", "ex:Person a rdfs:Class ;\n", @@ -574,12 +602,13 @@ " a skos:Concept ;\n", " skos:prefLabel \"Person\"@en, \"Persona\"@it ;\n", " skos:definition \"A human being.\"@en, \"Un essere umano.\"@it\n", - "." + ".\n", + "```" ] }, { "cell_type": "markdown", - "id": "cbf43abf", + "id": "3b9e4835", "metadata": {}, "source": [ "## Ontologies in Italy\n", @@ -592,29 +621,23 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "ea967d45", - "metadata": { - "attributes": { - "classes": [ - "raw" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "7a393d8e", + "metadata": {}, "source": [ + "```raw\n", "@prefix CPV: .\n", "\n", "\n", " CPV:givenName \"Roberto\" ;\n", - " CPV:familyName \"Polli\" .\n" + " CPV:familyName \"Polli\" .\n", + "\n", + "```" ] }, { "cell_type": "markdown", - "id": "94f1bfb2", + "id": "f1769085", "metadata": { "slideshow": { "slide_type": "subslide" @@ -629,7 +652,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2ad080ed", + "id": "7d2f218b", "metadata": {}, "outputs": [], "source": [ @@ -667,7 +690,7 @@ }, { "cell_type": "markdown", - "id": "47e36b75", + "id": "36f11e3d", "metadata": {}, "source": [ "\n", @@ -681,7 +704,7 @@ { "cell_type": "code", "execution_count": null, - "id": "04445da3", + "id": "c655701b", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/05-sparql.ipynb b/sparql-101/notebooks/05-sparql.ipynb index ddb7991..f333b18 100644 --- a/sparql-101/notebooks/05-sparql.ipynb +++ b/sparql-101/notebooks/05-sparql.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2da660dd", + "id": "66206576", "metadata": {}, "source": [ "# SparQL 101\n", @@ -21,7 +21,7 @@ }, { "cell_type": "markdown", - "id": "5942fbc6", + "id": "10b18f26", "metadata": { "slideshow": { "slide_type": "slide" @@ -34,12 +34,13 @@ "\n", "- json, yaml, xmlschema\n", "- HTTP, OpenAPI 3\n", - "- SQL and database hints" + "- SQL and database hints\n", + "- basics of RDF and Turtle" ] }, { "cell_type": "markdown", - "id": "f510a7bb", + "id": "8a1f5a45", "metadata": { "slideshow": { "slide_type": "slide" @@ -72,7 +73,7 @@ { "cell_type": "code", "execution_count": null, - "id": "db418c04", + "id": "60929557", "metadata": {}, "outputs": [], "source": [ @@ -82,15 +83,25 @@ }, { "cell_type": "markdown", - "id": "d655a626", + "id": "bc666342", "metadata": {}, "source": [ "Exercise: list the graphs in the dataset." ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd1841aa", + "metadata": {}, + "outputs": [], + "source": [ + "list(d.graphs())" + ] + }, { "cell_type": "markdown", - "id": "61e46ec0", + "id": "cb2d3995", "metadata": { "slideshow": { "slide_type": "subslide" @@ -106,7 +117,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7ebb4996", + "id": "a924cff2", "metadata": {}, "outputs": [], "source": [ @@ -127,7 +138,7 @@ }, { "cell_type": "markdown", - "id": "eb279b7d", + "id": "74219020", "metadata": { "slideshow": { "slide_type": "subslide" @@ -148,20 +159,20 @@ { "cell_type": "code", "execution_count": null, - "id": "9b9a82ac", + "id": "73fbb2ea", "metadata": {}, "outputs": [], "source": [ "# Create hte _:sample graph\n", - "g = d.graph(\"_:sample\")\n", + "sample = d.graph(\"_:sample\")\n", "\n", "# Add triples from sample.ttl\n", - "g.parse(\"sample.ttl\", format=\"text/turtle\")" + "sample.parse(\"sample.ttl\", format=\"text/turtle\")" ] }, { "cell_type": "markdown", - "id": "44fa1ad3", + "id": "05c95712", "metadata": {}, "source": [ "Use our utility function to print the graph." @@ -170,18 +181,18 @@ { "cell_type": "code", "execution_count": null, - "id": "4ff7803e", + "id": "d067fbcb", "metadata": {}, "outputs": [], "source": [ "from rdflib import FOAF\n", "import tools\n", - "tools.plot_graph(g, label_property=FOAF.name)" + "tools.plot_graph(sample, label_property=FOAF.name)" ] }, { "cell_type": "markdown", - "id": "74184c1b", + "id": "0604a7e7", "metadata": {}, "source": [ "That's what we have" @@ -189,7 +200,7 @@ }, { "cell_type": "markdown", - "id": "fa0cde79", + "id": "b537a376", "metadata": {}, "source": [ "```mermaid\n", @@ -200,13 +211,13 @@ " g_graph[(\"_:sample\")]\n", "end\n", "\n", - "g[[g variable]] -->|references| g_graph\n", + "g[[sample variable]] -->|references| g_graph\n", "```" ] }, { "cell_type": "markdown", - "id": "9471f3f1", + "id": "23dfa999", "metadata": {}, "source": [ "List all entries from th `_:sample` graph." @@ -215,7 +226,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2dd9437c", + "id": "3a13daaa", "metadata": {}, "outputs": [], "source": [ @@ -226,13 +237,13 @@ "}\n", "LIMIT 2\n", "\"\"\"\n", - "result : Result = g.query(q)\n", + "result : Result = sample.query(q)\n", "[r.asdict() for r in result]" ] }, { "cell_type": "markdown", - "id": "1220890e", + "id": "47310a6b", "metadata": {}, "source": [ "Exercise:\n", @@ -248,7 +259,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1533a3ed", + "id": "66f13fd9", "metadata": {}, "outputs": [], "source": [ @@ -261,7 +272,7 @@ }, { "cell_type": "markdown", - "id": "b5fd426f", + "id": "58a20b8d", "metadata": {}, "source": [ "- Replace `?subject` with `?foo`:\n", @@ -278,7 +289,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7ae8da6c", + "id": "5633dcf8", "metadata": {}, "outputs": [], "source": [ @@ -291,13 +302,13 @@ " ?subject foaf:status ?status .\n", "}\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = sample.query(q)\n", "list(result)" ] }, { "cell_type": "markdown", - "id": "d331645a", + "id": "7e1e80a5", "metadata": {}, "source": [ "To restrict the query to a specific resource,\n", @@ -307,7 +318,7 @@ { "cell_type": "code", "execution_count": null, - "id": "57b4a278", + "id": "8cd4b236", "metadata": {}, "outputs": [], "source": [ @@ -321,13 +332,13 @@ " ?subject foaf:status ?status .\n", "}\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = sample.query(q)\n", "list(result)" ] }, { "cell_type": "markdown", - "id": "ffdd841b", + "id": "3c530d2e", "metadata": {}, "source": [ "We can use `FILTER` to restrict the results\n", @@ -337,7 +348,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8e24dc31", + "id": "419b13ee", "metadata": {}, "outputs": [], "source": [ @@ -353,13 +364,13 @@ "}\n", "\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = sample.query(q)\n", "list(result)" ] }, { "cell_type": "markdown", - "id": "d49f4c95", + "id": "d70c5645", "metadata": {}, "source": [ "### GROUP BY triples\n", @@ -371,29 +382,32 @@ { "cell_type": "code", "execution_count": null, - "id": "af4a324f", + "id": "d4cbe52d", "metadata": {}, "outputs": [], "source": [ "q = \"\"\"\n", "SELECT\n", " ?subject\n", - " (COUNT(?object) AS ?count)\n", + " (COUNT(?object) AS ?count_)\n", "WHERE {\n", " ?subject foaf:knows ?object .\n", "}\n", "GROUP BY ?subject\n", "ORDER BY DESC(?count)\n", "\"\"\"\n", - "result = g.query(q)\n", - "{str(r.subject): r.count for r in result}" + "result = sample.query(q)\n", + "{str(r.subject): r.count_ for r in result}" ] }, { "cell_type": "markdown", - "id": "cdfd6d92", + "id": "1095a5be", "metadata": {}, "source": [ + "Note that the count_ value references\n", + "the datatype of the variable.\n", + "\n", "### Serializing datasets in Trig format\n", "\n", "The [Trig](https://www.w3.org/TR/2013/REC-trig-20130321/) format\n", @@ -403,7 +417,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cf9491bc", + "id": "62bf0f45", "metadata": {}, "outputs": [], "source": [ @@ -413,7 +427,7 @@ }, { "cell_type": "markdown", - "id": "535edd87", + "id": "dde02425", "metadata": {}, "source": [ "### Multi-graph datasets\n", @@ -424,7 +438,7 @@ { "cell_type": "code", "execution_count": null, - "id": "10b5fd54", + "id": "6f12f795", "metadata": {}, "outputs": [], "source": [ @@ -434,7 +448,7 @@ }, { "cell_type": "markdown", - "id": "37574875", + "id": "b50cd8d4", "metadata": {}, "source": [ "That's what we have" @@ -442,7 +456,7 @@ }, { "cell_type": "markdown", - "id": "f3169280", + "id": "0595f779", "metadata": {}, "source": [ "```mermaid\n", @@ -461,7 +475,7 @@ }, { "cell_type": "markdown", - "id": "34a290b0", + "id": "8918575b", "metadata": {}, "source": [ "### Querying the whole dataset\n", @@ -472,7 +486,7 @@ { "cell_type": "code", "execution_count": null, - "id": "869bbdb1", + "id": "bd37e489", "metadata": {}, "outputs": [], "source": [ @@ -488,7 +502,7 @@ }, { "cell_type": "markdown", - "id": "2692b68b", + "id": "21380e68", "metadata": {}, "source": [ "Now, try to query each graph" @@ -497,7 +511,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5be4d008", + "id": "375a50ab", "metadata": {}, "outputs": [], "source": [ @@ -507,7 +521,7 @@ }, { "cell_type": "markdown", - "id": "1cfa99fb", + "id": "e18791dc", "metadata": {}, "source": [ ":warning: By default, the `Dataset` queries *the default graph*\n", @@ -517,7 +531,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f58bc31f", + "id": "b3564df8", "metadata": {}, "outputs": [], "source": [ @@ -533,7 +547,7 @@ }, { "cell_type": "markdown", - "id": "088285ba", + "id": "a8b21433", "metadata": {}, "source": [ "Now I can query all the graphs in the dataset" @@ -542,11 +556,12 @@ { "cell_type": "code", "execution_count": null, - "id": "6fed86e1", + "id": "44c863cc", "metadata": {}, "outputs": [], "source": [ - "q = \"\"\"SELECT DISTINCT *\n", + "q = \"\"\"\n", + "SELECT DISTINCT *\n", "WHERE {\n", " GRAPH ?g {}\n", "}\n", @@ -557,7 +572,7 @@ }, { "cell_type": "markdown", - "id": "c4fd9f56", + "id": "57650895", "metadata": {}, "source": [ "Query the classes used in the dataset." @@ -566,7 +581,7 @@ { "cell_type": "code", "execution_count": null, - "id": "66a1fd22", + "id": "8e758384", "metadata": {}, "outputs": [], "source": [ @@ -585,21 +600,47 @@ }, { "cell_type": "markdown", - "id": "44561ec6", + "id": "187280c0", "metadata": {}, "source": [ "Exercise:\n", "\n", - "- replace `?g` with `_:sample`:\n", - " what happens?\n", - "\n", + "- replace `?g` with the graph URI `<_:sample>`:\n", + " what happens?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8317dede", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?Class\n", + "WHERE {\n", + " GRAPH <_:sample> {\n", + " [] a ?Class .\n", + " }\n", + "}\n", + "\"\"\"\n", + "result = d.query(q)\n", + "list(result)" + ] + }, + { + "cell_type": "markdown", + "id": "106f1bac", + "metadata": {}, + "source": [ "Querying triples in a specific graph:" ] }, { "cell_type": "code", "execution_count": null, - "id": "e51c1f09", + "id": "b7e96455", "metadata": {}, "outputs": [], "source": [ @@ -618,7 +659,7 @@ }, { "cell_type": "markdown", - "id": "e7b8113c", + "id": "8f4edc9f", "metadata": {}, "source": [ "💪 Exercise: querying the dataset\n", @@ -636,7 +677,18 @@ { "cell_type": "code", "execution_count": null, - "id": "48341f47", + "id": "900453b0", + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise.\n", + "q = ...\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "450881f1", "metadata": {}, "outputs": [], "source": [ @@ -656,7 +708,7 @@ }, { "cell_type": "markdown", - "id": "7fe71d37", + "id": "081e053e", "metadata": {}, "source": [ "- query the `_:simpsons` graph\n", @@ -670,7 +722,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f1141643", + "id": "3b51e363", "metadata": {}, "outputs": [], "source": [ @@ -691,7 +743,7 @@ }, { "cell_type": "markdown", - "id": "7feb20c2", + "id": "8d9f46ea", "metadata": { "slideshow": { "slide_type": "subslide" @@ -715,7 +767,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1c6fa654", + "id": "61c6b3e4", "metadata": {}, "outputs": [], "source": [ @@ -733,7 +785,7 @@ }, { "cell_type": "markdown", - "id": "45f70494", + "id": "545d343c", "metadata": {}, "source": [ "The SparQL `UPDATE` command updates a graph.\n", @@ -743,7 +795,7 @@ { "cell_type": "code", "execution_count": null, - "id": "78b26e46", + "id": "1f5a5fb4", "metadata": {}, "outputs": [], "source": [ @@ -772,7 +824,7 @@ }, { "cell_type": "markdown", - "id": "00405feb", + "id": "92c56416", "metadata": {}, "source": [ "💪: check the graph" @@ -781,7 +833,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4b4ba0d1", + "id": "bb616f14", "metadata": {}, "outputs": [], "source": [ @@ -790,7 +842,7 @@ }, { "cell_type": "markdown", - "id": "1543cf50", + "id": "96d84738", "metadata": {}, "source": [ "### The `/` and the `*` predicate modifiers\n", @@ -808,7 +860,7 @@ { "cell_type": "code", "execution_count": null, - "id": "873fe7b7", + "id": "a0df356a", "metadata": {}, "outputs": [], "source": [ @@ -820,13 +872,13 @@ "}\n", "\"\"\"\n", "\n", - "result = g.query(q)\n", + "result = sample.query(q)\n", "[r.asdict() for r in result]" ] }, { "cell_type": "markdown", - "id": "4aeefddc", + "id": "3b743a37", "metadata": {}, "source": [ "In this case `foaf:name` has a very specific meaning.\n", @@ -841,7 +893,7 @@ }, { "cell_type": "markdown", - "id": "80391f64", + "id": "db9c0ad3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -850,14 +902,38 @@ "source": [ "----\n", "\n", - "Graph databases have an inference engine that can be used\n", - "to process complex queries." + "Graph databases can find triples\n", + "matching different sentences...\n", + "\n", + "... and even traverse paths." + ] + }, + { + "cell_type": "markdown", + "id": "8b842d80", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "\n", + "r((r)) & j((j))\n", + "d((d)) & m((m))\n", + "h((h)) & k((k))\n", + "q((q)) & a((a))\n", + "\n", + "r <-->|knows| j & d\n", + "j <-->|knows| m & k\n", + "d <-->|knows| k\n", + "d <-->|knows| q\n", + "m <-->|knows| k\n", + "q <-->|knows| a\n", + "```" ] }, { "cell_type": "code", "execution_count": null, - "id": "58875eb3", + "id": "00847e19", "metadata": {}, "outputs": [], "source": [ @@ -871,13 +947,13 @@ "}\n", "\"\"\"\n", "\n", - "result = g.query(q)\n", + "result = sample.query(q)\n", "[r.asdict() for r in result]" ] }, { "cell_type": "markdown", - "id": "614d3242", + "id": "3f76cb34", "metadata": {}, "source": [ "The `*` operator matches a predicate\n", @@ -888,15 +964,42 @@ "Exercise:\n", "\n", "- modify the above query replacing `foaf:knows` with `foaf:knows*`\n", - " and see what happens.\n", + " and see what happens." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "707e3392", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX foaf: \n", + "\n", + "SELECT *\n", + "WHERE {\n", + " ?s a foaf:Person .\n", + " ?s foaf:knows* ?o .\n", + "}\n", + "\"\"\"\n", "\n", + "result = sample.query(q)\n", + "[r.asdict() for r in result]" + ] + }, + { + "cell_type": "markdown", + "id": "970c7a27", + "metadata": {}, + "source": [ "SparQL supports GROUP BY and ORDER BY clauses." ] }, { "cell_type": "code", "execution_count": null, - "id": "6fa32a7c", + "id": "8ca30575", "metadata": {}, "outputs": [], "source": [ @@ -914,13 +1017,13 @@ "}\n", "GROUP BY ?s\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = sample.query(q)\n", "{str(r.s): {\"network\": str(r.friends) } for r in result}" ] }, { "cell_type": "markdown", - "id": "b772ca97", + "id": "712a8dc2", "metadata": { "slideshow": { "slide_type": "subslide" @@ -936,7 +1039,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5ece570e", + "id": "f524ce37", "metadata": {}, "outputs": [], "source": [ @@ -956,13 +1059,13 @@ "}\n", "\"\"\"\n", "\n", - "result = g.query(q)\n", + "result = sample.query(q)\n", "[r.asdict() for r in result]" ] }, { "cell_type": "markdown", - "id": "84e9884a", + "id": "96003994", "metadata": {}, "source": [ "Since we are not interested in the `user2` variable,\n", @@ -973,7 +1076,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8112352b", + "id": "24b99fa1", "metadata": {}, "outputs": [], "source": [ @@ -990,13 +1093,13 @@ " ?user3 foaf:mbox ?mail3\n", "}\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = sample.query(q)\n", "{str(r.mail1): str(r.mail3) for r in result}" ] }, { "cell_type": "markdown", - "id": "3e1ee86e", + "id": "1a1a16a6", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1012,7 +1115,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a7b33bf4", + "id": "ea65f93c", "metadata": {}, "outputs": [], "source": [ @@ -1038,7 +1141,7 @@ }, { "cell_type": "markdown", - "id": "23d8de40", + "id": "b330db69", "metadata": {}, "source": [ "Exercise:\n", @@ -1049,7 +1152,7 @@ }, { "cell_type": "markdown", - "id": "09be7c7f", + "id": "0b8e2478", "metadata": { "slideshow": { "slide_type": "slide" @@ -1070,30 +1173,23 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "efc34da9", - "metadata": { - "attributes": { - "classes": [ - "text" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "9c0ae7d5", + "metadata": {}, "source": [ + "```sparql\n", "SELECT DISTINCT\n", " ?Concept\n", "WHERE {\n", " [] a ?Concept\n", "}\n", - "LIMIT 20" + "LIMIT 20\n", + "```" ] }, { "cell_type": "markdown", - "id": "72f06064", + "id": "d153b3de", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1106,19 +1202,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "091e3c7f", - "metadata": { - "attributes": { - "classes": [ - "text" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "83a4e4a2", + "metadata": {}, "source": [ + "```sparql\n", "PREFIX foaf: \n", "\n", "SELECT DISTINCT\n", @@ -1126,12 +1214,13 @@ "WHERE {\n", " ?s a foaf:Person\n", "}\n", - "LIMIT 10" + "LIMIT 10\n", + "```" ] }, { "cell_type": "markdown", - "id": "ed9c64d4", + "id": "e3f47eb9", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1144,19 +1233,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "4aa67672", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "c646ff20", + "metadata": {}, "source": [ + "```sparql\n", "PREFIX foaf: \n", "PREFIX dbp: \n", "PREFIX dbr: \n", @@ -1167,31 +1248,25 @@ " ?s a foaf:Person .\n", " ?s dbp:birthPlace dbr:Pisa\n", "}\n", - "LIMIT 10\n" + "LIMIT 10\n", + "\n", + "```" ] }, { "cell_type": "markdown", - "id": "06fd0836", + "id": "76808f4e", "metadata": {}, "source": [ "... with their deathplaces" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "257eeac5", - "metadata": { - "attributes": { - "classes": [ - "raw" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "2f07d588", + "metadata": {}, "source": [ + "```sparql\n", "PREFIX foaf: \n", "PREFIX dbp: \n", "PREFIX dbr: \n", @@ -1204,12 +1279,13 @@ " ?s dbp:birthPlace dbr:Pisa .\n", " ?s dbp:deathPlace ?death_place\n", "}\n", - "LIMIT 10" + "LIMIT 10\n", + "```" ] }, { "cell_type": "markdown", - "id": "43f34fe2", + "id": "a829eca8", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1222,19 +1298,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "5b1eeb69", - "metadata": { - "attributes": { - "classes": [ - "raw" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "0577f3d5", + "metadata": {}, "source": [ + "```sparql\n", "PREFIX foaf: \n", "PREFIX dbp: \n", "PREFIX dbr: \n", @@ -1246,12 +1314,14 @@ " ?s dbp:deathPlace ?deathPlace .\n", " ?deathPlace dbo:country dbr:United_Kingdom\n", "}\n", - "LIMIT 50\n" + "LIMIT 50\n", + "\n", + "```" ] }, { "cell_type": "markdown", - "id": "3818198c", + "id": "f494da60", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1268,19 +1338,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "f0362bef", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "c8002759", + "metadata": {}, "source": [ + "```sparql\n", "PREFIX foaf: \n", "PREFIX dbp: \n", "PREFIX dbr: \n", @@ -1295,12 +1357,13 @@ " ?deathPlace dbo:country dbr:United_Kingdom .\n", " ?birth_place dbo:country dbr:Italy\n", "}\n", - "LIMIT 50" + "LIMIT 50\n", + "```" ] }, { "cell_type": "markdown", - "id": "1c7b6971", + "id": "5cdaa048", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1315,19 +1378,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "0f538580", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "ed146041", + "metadata": {}, "source": [ + "```sparql\n", "PREFIX foaf: \n", "PREFIX dbp: \n", "PREFIX dbr: \n", @@ -1344,12 +1399,13 @@ " ?pope rdf:type dbo:Pope .\n", " ?pope dbp:birthPlace ?birth_place . # relation with the birth_place\n", "}\n", - "LIMIT 50" + "LIMIT 50\n", + "```" ] }, { "cell_type": "markdown", - "id": "37e4386d", + "id": "4e4a3411", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1362,19 +1418,11 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "5a956562", - "metadata": { - "attributes": { - "classes": [ - "sparql" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "794b5a22", + "metadata": {}, "source": [ + "```sparql\n", "PREFIX foaf: \n", "PREFIX dbp: \n", "PREFIX dbr: \n", @@ -1391,7 +1439,19 @@ " ?pope rdf:type dbo:Pope ;\n", " dbp:birthPlace ?birth_place . # relation with the birth_place\n", "}\n", - "LIMIT 50" + "LIMIT 50\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "7fa4be77", + "metadata": {}, + "source": [ + "## Closing question\n", + "\n", + "If you ask, should I rewrite all my data in RDF?\n", + "NO :) Let's see how JSON-LD can help us." ] } ], diff --git a/sparql-101/notebooks/07-jsonld.ipynb b/sparql-101/notebooks/07-jsonld.ipynb index ff86ab0..e39db72 100644 --- a/sparql-101/notebooks/07-jsonld.ipynb +++ b/sparql-101/notebooks/07-jsonld.ipynb @@ -2,13 +2,17 @@ "cells": [ { "cell_type": "markdown", - "id": "984c7199", + "id": "400d4d9f", "metadata": {}, "source": [ "# Agenda\n", "\n", + "In this lesson we will answer the following question:\n", + "should I rewrite all my data in RDF? NO :)\n", + "\n", + "\n", "- Storing data vs Describing Knowledge\n", - "- JSON-LD\n", + "- Adding metadata to existing data with JSON-LD\n", "\n", "## Storing data\n", "\n", @@ -22,7 +26,7 @@ }, { "cell_type": "markdown", - "id": "274fa853", + "id": "1c8b35da", "metadata": {}, "source": [ "```yaml\n", @@ -35,7 +39,7 @@ }, { "cell_type": "markdown", - "id": "64dba0b0", + "id": "9a6eb9ea", "metadata": {}, "source": [ "We can then add identifiers (such as UUIDs or email), to be sure that cross references\n", @@ -44,7 +48,7 @@ }, { "cell_type": "markdown", - "id": "69804ead", + "id": "d9611879", "metadata": {}, "source": [ "```yaml\n", @@ -57,7 +61,7 @@ }, { "cell_type": "markdown", - "id": "644bd2f7", + "id": "6d62c7cf", "metadata": {}, "source": [ "Now we may have different datasets, such as the Springfield Elementary\n", @@ -67,7 +71,7 @@ }, { "cell_type": "markdown", - "id": "03b805bf", + "id": "e6830de0", "metadata": {}, "source": [ "```yaml\n", @@ -80,7 +84,7 @@ }, { "cell_type": "markdown", - "id": "e751a7ed", + "id": "11c36f4f", "metadata": {}, "source": [ "So we actually store data, but we lack knowledge.\n", @@ -90,12 +94,14 @@ "JSON-LD is a JSON serialization for information described using the\n", "[RDF data model](https://www.w3.org/TR/json-ld11/#data-model).\n", "\n", - "A JSON-LD document is both an RDF and a JSON document." + "A JSON-LD document is both an RDF and a JSON document.\n", + "\n", + ":warning: Its media-type is `application/ld+json`." ] }, { "cell_type": "markdown", - "id": "cfec980f", + "id": "c0b149d6", "metadata": {}, "source": [ "----" @@ -104,7 +110,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1bc4993d", + "id": "936233c5", "metadata": {}, "outputs": [], "source": [ @@ -118,7 +124,7 @@ }, { "cell_type": "markdown", - "id": "bf3528b8", + "id": "90719874", "metadata": {}, "source": [ "JSON-LD associates it with a context that disambiguates information" @@ -127,7 +133,7 @@ { "cell_type": "code", "execution_count": null, - "id": "07ff14c0", + "id": "8ce8ae45", "metadata": {}, "outputs": [], "source": [ @@ -148,19 +154,19 @@ { "cell_type": "code", "execution_count": null, - "id": "84517ccf", + "id": "a6d7820f", "metadata": {}, "outputs": [], "source": [ "homer_ld_json = json.dumps({\n", - " \"@context\": context\n", + " \"@context\": context,\n", " **homer\n", "})" ] }, { "cell_type": "markdown", - "id": "28929f32", + "id": "b4b9e4cb", "metadata": {}, "source": [ "Exercise:\n", @@ -172,26 +178,19 @@ { "cell_type": "code", "execution_count": null, - "id": "ae8a0703", + "id": "d376e27e", "metadata": {}, "outputs": [], "source": [ - "from rdflib import Graph\n" - ] - }, - { - "cell_type": "markdown", - "id": "4f5bac30", - "metadata": {}, - "source": [ - "\n", - "\n", - "" + "from rdflib import Graph\n", + "g = Graph()\n", + "g.parse(data=homer_ld_json, format=\"application/ld+json\")\n", + "print(g.serialize(format=\"text/turtle\"))" ] }, { "cell_type": "markdown", - "id": "b0e79620", + "id": "4b7509fe", "metadata": { "slideshow": { "slide_type": "slide" @@ -213,7 +212,7 @@ }, { "cell_type": "markdown", - "id": "d835261f", + "id": "2dc0549c", "metadata": { "slideshow": { "slide_type": "slide" @@ -228,7 +227,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6df12510", + "id": "d8afb99a", "metadata": {}, "outputs": [], "source": [ @@ -242,7 +241,7 @@ }, { "cell_type": "markdown", - "id": "d42d21fd", + "id": "30c4a146", "metadata": {}, "source": [ "Annotate it with schema.org." @@ -251,7 +250,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8e53efbc", + "id": "cef0db52", "metadata": {}, "outputs": [], "source": [ @@ -267,7 +266,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ed5c1086", + "id": "d15c72cf", "metadata": {}, "outputs": [], "source": [ @@ -277,33 +276,47 @@ " \"@type\": \"sdo:Person\",\n", " **jane\n", " }\n", - "print(json.dumps(jane_ld))" + "print(json.dumps(jane_ld, indent=2))" ] }, { "cell_type": "markdown", - "id": "86d7b383", + "id": "4ee08e7e", "metadata": {}, "source": [ "Exercise:\n", "\n", "- load `jane_ld` in a Graph()\n", - "- what's the subject of the sentences?" + "- what's the subject of the sentences?\n", + "- Does the subject have an URI?" ] }, { "cell_type": "code", "execution_count": null, - "id": "fbb544e3", + "id": "81a73869", "metadata": {}, "outputs": [], "source": [ - "jane_ld_json = ..." + "from rdflib import Graph\n", + "\n", + "# Serialize the JSON-LD document\n", + "jane_ld_json = json.dumps(jane_ld)\n", + "\n", + "# Load the JSON-LD document into a Graph\n", + "g = Graph()\n", + "g.parse(data=jane_ld_json, format=\"application/ld+json\")\n", + "\n", + "# Print the serialization of the graph in text/turtle format\n", + "print(g.serialize(format=\"text/turtle\"))\n", + "\n", + "# Print the subjects of the graph\n", + "subjects = set(g.subjects())" ] }, { "cell_type": "markdown", - "id": "1816048b", + "id": "3a38e5f7", "metadata": { "slideshow": { "slide_type": "slide" @@ -320,7 +333,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7a4f9832", + "id": "d5781c36", "metadata": {}, "outputs": [], "source": [ @@ -344,7 +357,7 @@ }, { "cell_type": "markdown", - "id": "497ef939", + "id": "c5583f77", "metadata": {}, "source": [ "Now we can serialize the graph." @@ -353,7 +366,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dbc5a873", + "id": "48448d94", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "accf602a", + "id": "38b2eaf9", "metadata": {}, "source": [ "Another localization mechanism allows\n", @@ -375,7 +388,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9f01b59b", + "id": "12b6aa02", "metadata": {}, "outputs": [], "source": [ @@ -394,7 +407,7 @@ }, { "cell_type": "markdown", - "id": "8dbb6e50", + "id": "3ba1d334", "metadata": { "slideshow": { "slide_type": "slide" @@ -403,7 +416,9 @@ "source": [ "---\n", "\n", - "#### Context mangling\n", + "#### :warning: Context mangling\n", + "\n", + "Pay attention!\n", "\n", "Modifying a JSON-LD context,\n", "alters the\n", @@ -417,7 +432,7 @@ }, { "cell_type": "markdown", - "id": "22a12932", + "id": "614adcc9", "metadata": {}, "source": [ "```yaml\n", @@ -429,7 +444,7 @@ }, { "cell_type": "markdown", - "id": "2a310747", + "id": "a8000e45", "metadata": {}, "source": [ "Someone altering the \n", @@ -438,12 +453,12 @@ }, { "cell_type": "markdown", - "id": "81ad851e", + "id": "572aec9c", "metadata": {}, "source": [ "```yaml\n", "# Original context\n", - "@context:\n", + "\"@context\":\n", " payment_from: http://banking#debtor\n", " payment_to: http://banking#creditor\n", "```" @@ -451,7 +466,7 @@ }, { "cell_type": "markdown", - "id": "c862ee17", + "id": "9d615532", "metadata": {}, "source": [ "->" @@ -459,12 +474,12 @@ }, { "cell_type": "markdown", - "id": "241efb4e", + "id": "5c744ad3", "metadata": {}, "source": [ "```yaml\n", "# Altered context\n", - "@context:\n", + "\"@context\":\n", " payment_to: http://banking#debtor\n", " payment_from: http://banking#creditor\n", "```" @@ -472,7 +487,7 @@ }, { "cell_type": "markdown", - "id": "eb5d4362", + "id": "dcabdb2e", "metadata": { "slideshow": { "slide_type": "subslide" diff --git a/sparql-101/notebooks/10-rdf.ipynb b/sparql-101/notebooks/10-rdf.ipynb index f8977b9..30fc427 100644 --- a/sparql-101/notebooks/10-rdf.ipynb +++ b/sparql-101/notebooks/10-rdf.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "830f16ee", + "id": "6fb420ef", "metadata": {}, "source": [ "# Graph databases & SparQL\n", @@ -18,7 +18,7 @@ }, { "cell_type": "markdown", - "id": "ab84e1dc", + "id": "fbf8f93c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -37,7 +37,7 @@ { "cell_type": "code", "execution_count": null, - "id": "009124ee", + "id": "3c3a1abb", "metadata": {}, "outputs": [], "source": [ @@ -46,7 +46,7 @@ }, { "cell_type": "markdown", - "id": "502209fb", + "id": "88200593", "metadata": { "slideshow": { "slide_type": "slide" @@ -76,7 +76,7 @@ }, { "cell_type": "markdown", - "id": "d6a0d16a", + "id": "6c28ae88", "metadata": { "slideshow": { "slide_type": "subslide" @@ -99,7 +99,7 @@ }, { "cell_type": "markdown", - "id": "7a161068", + "id": "2e11962b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -124,7 +124,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f1af6be6", + "id": "c2bc32bc", "metadata": {}, "outputs": [], "source": [ @@ -135,7 +135,7 @@ }, { "cell_type": "markdown", - "id": "58027ca5", + "id": "faa0cfa9", "metadata": {}, "source": [ "Exercise:\n", @@ -148,7 +148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9e009820", + "id": "6e9ef154", "metadata": {}, "outputs": [], "source": [ @@ -160,7 +160,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f4663b98", + "id": "af26bae1", "metadata": {}, "outputs": [], "source": [ @@ -173,7 +173,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ab483e31", + "id": "14881b9c", "metadata": {}, "outputs": [], "source": [ @@ -186,7 +186,7 @@ }, { "cell_type": "markdown", - "id": "662b9e2d", + "id": "8c2977c7", "metadata": {}, "source": [ "See also:\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "92245571", + "id": "a93f0e45", "metadata": { "slideshow": { "slide_type": "slide" @@ -217,7 +217,7 @@ { "cell_type": "code", "execution_count": null, - "id": "963e6381", + "id": "4c6b0593", "metadata": {}, "outputs": [], "source": [ @@ -233,7 +233,7 @@ }, { "cell_type": "markdown", - "id": "5c08094e", + "id": "39b56ab1", "metadata": { "slideshow": { "slide_type": "slide" @@ -250,7 +250,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0023db72", + "id": "fd70ca99", "metadata": {}, "outputs": [], "source": [ @@ -275,7 +275,7 @@ }, { "cell_type": "markdown", - "id": "f73ef624", + "id": "3e743b6b", "metadata": {}, "source": [ "Exercise:\n", @@ -300,7 +300,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b3cb6112", + "id": "b171f7df", "metadata": {}, "outputs": [], "source": [ @@ -332,7 +332,7 @@ }, { "cell_type": "markdown", - "id": "e4e5e490", + "id": "b5e15826", "metadata": {}, "source": [ "Let's visualize the graph." @@ -341,7 +341,7 @@ { "cell_type": "code", "execution_count": null, - "id": "648c6067", + "id": "23d274f3", "metadata": {}, "outputs": [], "source": [ @@ -353,7 +353,7 @@ }, { "cell_type": "markdown", - "id": "75d99485", + "id": "7a14f090", "metadata": {}, "source": [ "#### More metadata\n", @@ -365,7 +365,7 @@ { "cell_type": "code", "execution_count": null, - "id": "09cc771b", + "id": "30cff88a", "metadata": {}, "outputs": [], "source": [ @@ -398,7 +398,7 @@ }, { "cell_type": "markdown", - "id": "46981ae7", + "id": "fffedc09", "metadata": { "slideshow": { "slide_type": "slide" @@ -415,7 +415,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a17f77b9", + "id": "6df763ad", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/11-sparql-metadata.ipynb b/sparql-101/notebooks/11-sparql-metadata.ipynb index e0a2553..2029348 100644 --- a/sparql-101/notebooks/11-sparql-metadata.ipynb +++ b/sparql-101/notebooks/11-sparql-metadata.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "3d1e75e7", + "id": "c91e5398", "metadata": {}, "source": [ "# Agenda\n", @@ -22,7 +22,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1a05e897", + "id": "50edc4ad", "metadata": {}, "outputs": [], "source": [ @@ -34,7 +34,7 @@ }, { "cell_type": "markdown", - "id": "43f296c2", + "id": "2664dd4a", "metadata": {}, "source": [ "And query the simplest metadata." @@ -43,7 +43,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c828d450", + "id": "369bccae", "metadata": {}, "outputs": [], "source": [ @@ -61,7 +61,7 @@ }, { "cell_type": "markdown", - "id": "74ba7bd2", + "id": "4980e8f6", "metadata": {}, "source": [ "We can simplify the above query\n", @@ -73,7 +73,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9cbfae12", + "id": "eb435c89", "metadata": {}, "outputs": [], "source": [ @@ -91,7 +91,7 @@ }, { "cell_type": "markdown", - "id": "e148f448", + "id": "cbd15514", "metadata": {}, "source": [ "Exercise:\n", @@ -103,7 +103,7 @@ }, { "cell_type": "markdown", - "id": "5070d3f4", + "id": "e86dfbc8", "metadata": { "slideshow": { "slide_type": "subslide" @@ -119,7 +119,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9101ddc3", + "id": "9e09b005", "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "836c70dc", + "id": "27ccb01c", "metadata": {}, "source": [ "Exercise:\n", @@ -152,7 +152,7 @@ }, { "cell_type": "markdown", - "id": "8212b909", + "id": "674655ce", "metadata": { "slideshow": { "slide_type": "subslide" @@ -169,7 +169,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e347f090", + "id": "7d798f36", "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ }, { "cell_type": "markdown", - "id": "4cbf2a21", + "id": "3ac8c38b", "metadata": {}, "source": [ "Exercise:\n", @@ -200,7 +200,7 @@ { "cell_type": "code", "execution_count": null, - "id": "24f697fc", + "id": "b0f071ed", "metadata": {}, "outputs": [], "source": [ @@ -219,7 +219,7 @@ }, { "cell_type": "markdown", - "id": "e3ad9d82", + "id": "8ee79cc2", "metadata": { "slideshow": { "slide_type": "slide" @@ -237,7 +237,7 @@ }, { "cell_type": "markdown", - "id": "923aa961", + "id": "9371b260", "metadata": {}, "source": [ "```mermaid\n", @@ -259,7 +259,7 @@ }, { "cell_type": "markdown", - "id": "8d5949d9", + "id": "3d93cd9d", "metadata": { "slideshow": { "slide_type": "slide" @@ -275,7 +275,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a92766fd", + "id": "2ca59444", "metadata": {}, "outputs": [], "source": [ @@ -298,7 +298,7 @@ }, { "cell_type": "markdown", - "id": "36f191f3", + "id": "99aacbd0", "metadata": {}, "source": [ "Exercise:\n", @@ -312,7 +312,7 @@ }, { "cell_type": "markdown", - "id": "1325e90e", + "id": "0ca79488", "metadata": { "slideshow": { "slide_type": "slide" @@ -328,7 +328,7 @@ }, { "cell_type": "markdown", - "id": "b1743159", + "id": "3f492d65", "metadata": { "slideshow": { "slide_type": "slide" @@ -348,7 +348,7 @@ { "cell_type": "code", "execution_count": null, - "id": "69703aca", + "id": "3114ad91", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ { "cell_type": "code", "execution_count": null, - "id": "38bde82c", + "id": "1a59247e", "metadata": {}, "outputs": [], "source": [ @@ -389,7 +389,7 @@ }, { "cell_type": "markdown", - "id": "3f156ae6", + "id": "fc1c8ace", "metadata": {}, "source": [ "Now we will infer how countries are modeled\n", @@ -408,7 +408,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f3e85718", + "id": "b740c2bd", "metadata": {}, "outputs": [], "source": [ @@ -428,7 +428,7 @@ }, { "cell_type": "markdown", - "id": "59439f97", + "id": "abc1d6df", "metadata": {}, "source": [ "The data model extracted from the graph:\n", @@ -439,7 +439,7 @@ }, { "cell_type": "markdown", - "id": "f81a0c4d", + "id": "e3db17c5", "metadata": {}, "source": [ "```mermaid\n", diff --git a/sparql-101/notebooks/12-enriching-data.ipynb b/sparql-101/notebooks/12-enriching-data.ipynb index 4b6d5ff..e2c3478 100644 --- a/sparql-101/notebooks/12-enriching-data.ipynb +++ b/sparql-101/notebooks/12-enriching-data.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "dea79f2d", + "id": "11cbb725", "metadata": {}, "source": [ "# Agenda\n", @@ -26,7 +26,7 @@ }, { "cell_type": "markdown", - "id": "adf307ff", + "id": "71985724", "metadata": { "slideshow": { "slide_type": "subslide" @@ -64,7 +64,7 @@ }, { "cell_type": "markdown", - "id": "81a93627", + "id": "aa05150a", "metadata": {}, "source": [ "```mermaid\n", @@ -97,7 +97,7 @@ }, { "cell_type": "markdown", - "id": "8041f5a2", + "id": "7df3aa4b", "metadata": {}, "source": [ "Storing data in a graph allows to use\n", @@ -107,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "fdd6ad55", + "id": "c44d981c", "metadata": { "slideshow": { "slide_type": "slide" @@ -122,7 +122,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8fdc468d", + "id": "d4b4bfaf", "metadata": {}, "outputs": [], "source": [ @@ -137,7 +137,7 @@ }, { "cell_type": "markdown", - "id": "d8857b08", + "id": "43721665", "metadata": {}, "source": [ "Add a context to the dataset." @@ -146,7 +146,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e64f806a", + "id": "edd826a5", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "8a7147ab", + "id": "57acff38", "metadata": {}, "source": [ "Now assemble everything in a JSON-LD graph" @@ -174,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7befef4a", + "id": "8e7b7759", "metadata": {}, "outputs": [], "source": [ @@ -187,7 +187,7 @@ }, { "cell_type": "markdown", - "id": "eff2c142", + "id": "471df2e9", "metadata": {}, "source": [ "Exercise:\n", @@ -198,7 +198,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9a37d18c", + "id": "5b2cf5b2", "metadata": {}, "outputs": [], "source": [ @@ -211,7 +211,7 @@ }, { "cell_type": "markdown", - "id": "00398e3d", + "id": "592ab468", "metadata": {}, "source": [ "And create a dataset and bind the selected namespaces." @@ -220,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cb64cfe6", + "id": "8302ec41", "metadata": {}, "outputs": [], "source": [ @@ -236,7 +236,7 @@ }, { "cell_type": "markdown", - "id": "3afb9b68", + "id": "aaf8b9f5", "metadata": {}, "source": [ "Exercise:\n", @@ -247,7 +247,7 @@ { "cell_type": "code", "execution_count": null, - "id": "620bacd8", + "id": "d340e83a", "metadata": {}, "outputs": [], "source": [ @@ -258,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "86ef9144", + "id": "4653cea2", "metadata": {}, "source": [ "Exercise:\n", @@ -272,7 +272,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2c9d17f8", + "id": "9786b85a", "metadata": {}, "outputs": [], "source": [ @@ -281,7 +281,7 @@ }, { "cell_type": "markdown", - "id": "67b2fb85", + "id": "249e3b22", "metadata": {}, "source": [ "Now we have a graph to enrich with external data.\n", @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7a43bb9e", + "id": "df0d3e93", "metadata": {}, "outputs": [], "source": [ @@ -329,7 +329,7 @@ }, { "cell_type": "markdown", - "id": "c2ea1858", + "id": "3af13f01", "metadata": {}, "source": [ "Exercise:\n", @@ -344,7 +344,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d0b3b366", + "id": "abcc707d", "metadata": {}, "outputs": [], "source": [ @@ -379,7 +379,7 @@ }, { "cell_type": "markdown", - "id": "4fa89f8c", + "id": "322329c2", "metadata": {}, "source": [ "Now we can see the country identifier in the graph." @@ -388,7 +388,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0fb4a04e", + "id": "b45019dc", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "ad07096e", + "id": "b63a208a", "metadata": {}, "source": [ "Now, we can even have a \"fat\" graph with all the information" @@ -406,7 +406,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c01f32eb", + "id": "edf69f5f", "metadata": {}, "outputs": [], "source": [ @@ -431,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "78d6834f", + "id": "ab0a3e0c", "metadata": {}, "source": [ "We can also mangle the data a bit..." @@ -440,7 +440,7 @@ { "cell_type": "code", "execution_count": null, - "id": "74aac9ea", + "id": "86b19d99", "metadata": {}, "outputs": [], "source": [ @@ -471,7 +471,7 @@ }, { "cell_type": "markdown", - "id": "2eac2a08", + "id": "535f7fdc", "metadata": {}, "source": [ "Exercise:\n", @@ -481,24 +481,17 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "44e31d16", - "metadata": { - "attributes": { - "classes": [ - "raw" - ], - "id": "" - } - }, - "outputs": [], + "cell_type": "markdown", + "id": "8f0317bd", + "metadata": {}, "source": [ + "```raw\n", "?p a :Person ;\n", " :nationality [\n", " skos:notation ?prefix\n", " ]\n", - "." + ".\n", + "```" ] } ], From e0611913391b6130996e94f530aaddd663f21311 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Fri, 30 May 2025 17:24:44 +0200 Subject: [PATCH 49/52] Reusing knowledge. See #98 (#99) * Refactor rdf * More metadata. * D3FEND init. * Add datafile. * Finally... * Add countries dataset decompression (#100) --------- Co-authored-by: Antonio Spadaro --- sparql-101/01-knowledge.md | 88 +++- sparql-101/02-semantics.md | 124 +++++- sparql-101/10-rdf.md | 232 +++++++--- sparql-101/11-sparql-metadata.md | 92 +++- sparql-101/12-enriching-data.md | 105 ++++- sparql-101/13-enriching-data.md | 342 +++++++++++++++ sparql-101/notebooks/00-jupyter-intro.ipynb | 28 +- sparql-101/notebooks/00-teaser.ipynb | 76 ++-- sparql-101/notebooks/01-knowledge.ipynb | 306 ++++++++++---- sparql-101/notebooks/02-semantics.ipynb | 300 ++++++++++--- sparql-101/notebooks/05-sparql.ipynb | 182 ++++---- sparql-101/notebooks/07-jsonld.ipynb | 70 ++-- sparql-101/notebooks/10-rdf.ipynb | 396 +++++++++++++----- sparql-101/notebooks/11-sparql-metadata.ipynb | 166 +++++--- sparql-101/notebooks/12-enriching-data.ipynb | 253 ++++++++--- .../notebooks/countries-skos-ap-act.ttl.gz | Bin 0 -> 3525163 bytes sparql-101/notebooks/tools.py | 26 +- sparql-101/tox.ini | 8 +- 18 files changed, 2098 insertions(+), 696 deletions(-) create mode 100644 sparql-101/13-enriching-data.md create mode 100644 sparql-101/notebooks/countries-skos-ap-act.ttl.gz diff --git a/sparql-101/01-knowledge.md b/sparql-101/01-knowledge.md index f149a94..d1358b0 100644 --- a/sparql-101/01-knowledge.md +++ b/sparql-101/01-knowledge.md @@ -69,7 +69,8 @@ subject((subject)) --- predicate(predicate) --> object ---- -Every term is identified by an absolute URI. +Every term is identified by an absolute IRI (Internationalized Resource Identifier). +IRI extends the concept of URI (Uniform Resource Identifier). The prefix identifies the vocabulary name, and the suffix identifies the term. @@ -79,7 +80,7 @@ from rdflib import URIRef dog_uri = URIRef("https://dbpedia.org/data/Dog") ``` -We'll see how to use URIs to express knowledge. +We'll see how to use IRIs to express knowledge. ---- @@ -197,7 +198,7 @@ But it is also the basis of the Web itself ---- -## RDF: Machine Readable Knowledge +## Resource Description Framework: machine readable knowledge Encyclopedia voices on Wikipedia and dbpedia are expressed in [Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/). @@ -235,12 +236,12 @@ where each row is a sentence. ---- -## RDF: Machine Readable Knowledge +## Resource Description Format: machine readable knowledge -RDF uses [URIs](https://www.w3.org/TR/rdf11-concepts/#section-uris) +RDF uses [IRIs](https://www.w3.org/TR/rdf11-concepts/#section-IRIs) to disambiguate the meaning of terms and provide semantics. -Every term is identified by an absolute URI enclosed by `<>`. +Every term is identified by an absolute IRI enclosed by `<>`. The prefix identifies the source of the term definition (that we'll call **vocabulary**), @@ -259,11 +260,16 @@ RDF is based on: - **graphs** (sets of triples). - **vocabularies** (graphs containing terms and their definitions). +See the definition of RDF concepts here: + +- [Graph data model](https://www.w3.org/TR/rdf11-concepts/#data-model) +- [Graphs](https://www.w3.org/TR/rdf11-concepts/#section-rdf-graph) + ### Elements -Subjects and predicates are uniquely identified by URIs. +Subjects and predicates are uniquely identified by IRIs. -Objects can be either URIs or literals (strings, numbers, dates, etc.). +Objects can be either IRIs or literals (strings, numbers, dates, etc.). ```python from rdflib import URIRef, Literal, BNode @@ -370,7 +376,7 @@ We'll see JSON-LD in detail later. ## Graphs: Namespaces and cURIe -RDF use namespace prefixes to shorten URIs +RDF use namespace prefixes to shorten IRIs (the [cURIe](https://www.w3.org/TR/curie/) syntax). ```python @@ -398,10 +404,32 @@ print(*g1_ns, sep="\n") g1.namespace_manager.expand_curie("dbr:Lasagne") ``` +rdflib has a set of predefined namespaces + +```python +from rdflib import RDF, RDFS, SKOS, XSD + +print( + "The", RDFS.range, + "of an", RDF.type, + "is an", RDFS.Class +) +``` + +While + +```python +print( + "The", RDFS.range, + "of a", SKOS.prefLabel, + "is an", XSD.string +) +``` + ---- Another vocabulary could provide a different definition for the same term. -:warning: URI could not always be human-readable. +:warning: URI are not always human-readable. ```python from rdflib import URIRef @@ -438,7 +466,7 @@ sentences = """ 💪: parse the sentences using rdflib and answer the following questions - how many sentences are there? -- how many subjects are there? +- how many distinct subjects are there? - how many namespaces are there? ```python @@ -449,6 +477,14 @@ tortellini = Graph() # Use this cell for the exercise ``` +```solution +tortellini.parse(data=sentences, format="turtle") +print( + len(tortellini). + len(set(tortellini.subjects()) +) +``` + 💪: use `Graph.namespaces` to get the namespaces added by the sentences above ```python @@ -459,6 +495,11 @@ default_ns = set(Graph().namespaces()) # Use this cell for the exercise ``` +```solution +set(tortellini.namespaces()) - default_ns +``` + + 💪: serialize the above graph in JSON-LD format ```python @@ -466,6 +507,11 @@ default_ns = set(Graph().namespaces()) tortellini_jsonld = ... ``` +```solution +tortellini_jsonld = tortellini.serialize(format="application/ld+json") +print(tortellini_jsonld) +``` + 💪: Load the JSON-LD object in a variable - What's the type and len of the serialized object? @@ -475,7 +521,12 @@ tortellini_jsonld = ... import json # Use this cell for the exercise -... +``` + +```solution +import json +data = json.loads(tortellini_jsonld) + ``` 💪: Get a voice from dbpedia @@ -523,6 +574,11 @@ print(*[str(s) for s in excerpt], sep="\n") # Use this cell for the exercise ``` +```solution +len(sentences) +set((len(x) for x in sentences)) +``` + ---- ```python @@ -544,7 +600,7 @@ There's plenty of knowledge in the web! ```python from rdflib import Graph -from rdflib.namespace import RDFS +from pathlib import Path tortellini_url = "https://dbpedia.org/data/Tortellini.n3" tortellini_n3 = Path("Tortellini.n3") @@ -569,10 +625,16 @@ Exercise: how many sentences are there now? # Use this cell for the exercise ``` +```solution +len(g) +``` + Plot the graph again to see the new nodes and their relations. ```python import tools + +# Increase the limit if you can't see intersections. tools.plot_graph(g, label_property=RDFS.label, limit=50, pattern=".*/dbpedia.org") ``` diff --git a/sparql-101/02-semantics.md b/sparql-101/02-semantics.md index 5974e77..365ba44 100644 --- a/sparql-101/02-semantics.md +++ b/sparql-101/02-semantics.md @@ -104,11 +104,14 @@ See [01-knowledge.ipynb](01-knowledge.ipynb). Vocabularies contain a set of terms (IRIs) and their relationships that can be used to describe the meaning of data. +--- ----- +### Graphs and RDBMS An RDF dataset is a set of **graphs**. +See the [RDF Dataset definition](https://www.w3.org/TR/rdf11-concepts/#section-dataset). + ```mermaid graph LR @@ -148,7 +151,6 @@ class p1,p2,p3 pad; ``` ---- -### Graphs and RDBMS From a relationa perspective, you can see a dataset as a set of different tables @@ -189,23 +191,29 @@ d = Dataset() - use the `Dataset.graphs` method to list the graphs in the dataset; +```solution +list(d.graphs()) +``` + - add a graph to the dataset. ```python simpsons = d.graph(identifier="_:simpsons") simpsons.parse("simpsons.ttl", format="turtle") - ``` - list the graphs in the dataset again, together with their identifiers. - - +```solution +graphs = list(d.graphs()) +print(len(graphs)) +``` - get the `identifier` of one graph. What's its type? - - +```solution +[(g.identifier.n3(), type(g.identifier) ) for g in graphs] +``` Now list the graphs in the dataset: note that the default graph does not contain triples. @@ -250,8 +258,6 @@ g = d.graph(identifier="_:my_dbpedia") ``` - - - Get the URIs representing Tortellini and Food using the `Graph.subjects` and `Graph.objects` methods. ```python @@ -261,7 +267,12 @@ objects = set( ... ) items = subjects | objects print(*items, sep="\n") ``` - + +```solution +subjects = set(g.subjects()) +objects = set(g.objects()) +``` + - what's the namespace of the `Tortellini` URI? - what's the namespace of the `Food` URI? - Open both URIs in a browser and check their content, @@ -270,13 +281,43 @@ print(*items, sep="\n") ## Ontologies and controlled vocabularies -Ontologies are used to standardize the semantics of digital content. +Data modeling specifications +(e.g., JSON Schema, XMLSchema, ... ) +describe the syntax +of information. + +```yaml +# A JSON Schema +Person: + required: [name, surname] + properties: + name: { type: string, maxLength: 64 } + surname: { type: string, maxLength: 64 } + born_on: { type: string, format: date } +``` + +Ontologies describe the semantics of digital content +in a given domain or ecosystem. - **Ontology**: a set of logical axioms that conceptualize a domain of interest by defining concepts (e.g., a `Person`) and the semantics of relationships (e.g., `isParentOf`) between them. +--- + +An ontology: + +- is more generic than a JSON Schema or XMLSchema; +- applies to a domain (e.g., the fiscal domain, the healthcare domain) + and not to a specific service / API; +- may or may not describe the syntax details. + +A service can reference an ontology even if +property names do not match the predicates, +as long as the concept are the same +(i.e. I can map each JSON property to an ontology predicate). + Example: the Italian ontology for person defines: - the concept of person; @@ -309,18 +350,23 @@ givenName & familyName & isParentOf -.-o|domain| Person familyName & givenName ---->|range| xsd:string isParentOf -->|range| Person - ``` +--- + - **Controlled vocabulary**: a vocabulary where the terms are validated by a designated authority. It can be of different types - e.g., a list (codelist), a hierarchical structure (taxonomy), a glossary and a thesaurus (which adds further constraints to a taxonomy). +We'll see a vocabulary of EU countries with their names and properties. + Examples of European controlled vocabularies are here ---- ## Standard vocabularies +Vocabularies can contain predicates and their relations. + Standard vocabularies that are used to semantically describe data are: @@ -331,7 +377,12 @@ are: Here are some example IRIs described using RDFS: ```turtle +# Standard vocabularies. @prefix rdfs: . +@prefix rdf: . +@prefix xsd: . + +# Custom vocabulary. @prefix ex: . # The ex:Person Resource classifies a group of Resources. @@ -339,12 +390,51 @@ ex:Person rdf:type rdfs:Class . # ex:Alive classifies a group of ex:Person ex:Alive rdf:type rdfs:Class ; - rdfs:subClassOf ex:Person ; + rdfs:subClassOf ex:Person + . + +ex:name rdf:type rdfs:Property ; + rdfs:domain ex:Entity ; + rdfs:range xsd:string . -ex:givenName rdf:type rdf:Property ; +ex:givenName rdfs:subPropertyOf ex:name ; rdfs:domain ex:Person ; - rdfs:range xsd:string ; + rdfs:range xsd:string + . +``` + +```python +from rdflib import Graph +import tools + +sentences = """ +@prefix rdfs: . +@prefix ex: . +@prefix xsd: . +@prefix rdf: . + +# The ex:Person Resource classifies a group of Resources. +ex:Person rdf:type rdfs:Class . + +# ex:Alive classifies a group of ex:Person +ex:Alive rdf:type rdfs:Class ; + rdfs:subClassOf ex:Person + . + +ex:name rdf:type rdfs:Property ; + rdfs:domain ex:Entity ; + rdfs:range xsd:string + . + +ex:givenName rdfs:subPropertyOf ex:name ; + rdfs:domain ex:Person ; + rdfs:range xsd:string + . +""" +g = Graph() +g.parse(data=sentences, format="turtle") +tools.plot_graph(g) ``` @@ -355,7 +445,7 @@ These labels may or may not overlap (e.g., I can use labels from different vocabularies to describe the same data), like in the following example: -```raw +```turtle @prefix ex: . ex:Person a rdfs:Class ; @@ -378,7 +468,7 @@ It contains Controlled Vocabularies and Ontologies, including the Italian Ontology for Person (CPV), that we can use to uniquely describe someone. -```raw +```turtle @prefix CPV: . diff --git a/sparql-101/10-rdf.md b/sparql-101/10-rdf.md index de4285d..4e1d1c3 100644 --- a/sparql-101/10-rdf.md +++ b/sparql-101/10-rdf.md @@ -1,9 +1,11 @@ # Graph databases & SparQL +--- + ## Agenda - Storing and retrieving triples -- Using the `rdflib.Dataset` class +- The `rdflib.Dataset` class - Querying and traversing graphs *Beware*: commands may contain small typos. You must fix them to properly complete the course! @@ -15,21 +17,33 @@ Prerequisites: - JSON, YAML, xmlschema - HTTP, OpenAPI 3 - SQL and database hints +- RDF & SparQL ```python %pip install oxrdflib ``` +Decompress the countries dataset + +```python +import gzip +from pathlib import Path + +with gzip.open('countries-skos-ap-act.ttl.gz') as f: + Path('countries-skos-ap-act.ttl').write_bytes(f.read()) +``` --- -## Graphs (again) +## Graphs ### RDF databases +An RDF Dataset is a set of RDF graphs. + An RDF graph is an (unordered) set of triples. -Each triple consists of a `subject`, `predicate`, `object`. +Each triple consists of an *ordered* $subject$, $predicate$, $object$. Graph databases such as: @@ -37,10 +51,11 @@ Graph databases such as: - [GraphDB (proprietary)](), - [Amazon Nepture (proprietary SaaS)]() -store triples into graphs. +store triples into graphs and datasets. -They can be queried via [SparQL](). +They are *triple store*. +They can be queried via [SparQL](). ---- @@ -57,9 +72,9 @@ Neo4j supports RDF datasets via the Neosemantics plugin. ---- -## rdflib backends +### rdflib backends -We will simulate a graph database using +We will simulate a graph database locally using [rdflib](https://rdflib.readthedocs.io/en/stable/index.html). rdflib supports multiple backends to parse and store triples. @@ -77,29 +92,78 @@ d = Dataset(store="Oxigraph") Exercise: -- use the `Dataset.bind` method to bind the `eu` prefix to the - `https://publications.europa.eu/resource/authority/` namespace; -- use the `Dataset.graph` method to create the `eu:country` graph; +- list the graphs into the dataset + using SparQL (se the [05-sparql](05-sparql.ipynb)). -```python + +```solution +result = d.query(""" +SELECT DISTINCT + ?g +WHERE { + GRAPH ?g {} +} +""") + +assert 'default' in str(result.bindings) +``` + +- confront the query result with + the output of `Dataset.graphs` + +```solution print(list(d.graphs())) +``` + +Let's load into it the [European vocabulary for countries](countries.ttl). + +See also: + +- [EU Authority Tables](https://op.europa.eu/en/web/eu-vocabularies/authority-tables) + +- use `Dataset.bind` to bind the `eu` prefix to the + `https://publications.europa.eu/resource/authority/` namespace; + +```solution d.bind("eu", "https://publications.europa.eu/resource/authority/") -eu_country_id = d.namespace_manager.expand_curie("eu:country") ``` +Once the `eu` prefix is bound, +the dataset can expand cURIes. +Hint: see [01-knowledge](01-knowledge.ipynb). + ```python +eu_country_id = d.namespace_manager.expand_curie("eu:country") +``` + +- use `Dataset.graph` to create the `eu:country` graph. + +```solution # Use the default backend g = d.graph(eu_country_id) +``` + +Let's see the performance of the default +`turtle` parser ... + +```python +# Parsing takes ~30s. %time g.parse("countries-skos-ap-act.ttl", format="text/turtle") print("The graph contains", len(g), "triples.") + +# Clean up. +del g +del d ``` +with respect to the `ox-turtle` parser. + ```python d = Dataset(store="Oxigraph") -g = d.graph(eu_country_id) +country = d.graph(eu_country_id) # Use the ox-turtle parser. -%time g.parse("countries-skos-ap-act.ttl", format="ox-turtle") -print("The graph contains", len(g), "triples.") +%time country.parse("countries-skos-ap-act.ttl", format="ox-turtle") +print("The graph contains", len(country), "triples.") ``` See also: @@ -108,69 +172,107 @@ See also: --- -## SparQL practice +### Traversing the graph -Let's load into it the [European vocabulary for countries](countries.ttl). +`` contains more than countries. -See also: +```mermaid +graph -- [EU Authority Tables](https://op.europa.eu/en/web/eu-vocabularies/authority-tables) +subgraph eu:country + eu:ITA((ITA)) + eu:FRA((FRA)) + eu:xx((...)) -```python -from rdflib import Graph + eu:ITA-01((?)) + eu:ITA-02((?)) -# Let's create a graph. -g = Graph(store="Oxigraph") + eu:FRA-01((?)) + eu:FRA-02((?)) + eu:FRA-03((?)) + +eu:ITA -->|skos:narrower| eu:ITA-01 & eu:ITA-02 +eu:FRA -->|skos:narrower| eu:FRA-01 & eu:FRA-02 & eu:FRA-03 +end -# And load into it the European -# vocabulary for countries. -g.parse("countries-skos-ap-act.ttl", format="ox-turtle") ``` +```python +# Shortcut for converting to curie. +to_curie = d.namespace_manager.curie +``` +```python +q = """ +PREFIX country: +SELECT DISTINCT * +WHERE { + country:ITA skos:narrower ?narrower . + ?narrower skos:prefLabel ?label . + FILTER (lang(?label) = "en") +} +""" +result = country.query(q) ---- +narrower = {to_curie(r.narrower): str(r.label) for r in result} -### Traversing the graph +print(*narrower.items(), sep="\n") +``` -The Country graph contains more than countries. +Exercise: -```python -to_curie = g.namespace_manager.curie +- run the above query replacing + `skos:narrower` with `skos:narrower*`; + what happens? +```solution q = """ PREFIX country: SELECT DISTINCT * WHERE { - country:ITA skos:narrower ?narrower . + country:ITA skos:narrower* ?narrower . ?narrower skos:prefLabel ?label . FILTER (lang(?label) = "en") } """ -result = g.query(q) +result = country.query(q) narrower = {to_curie(r.narrower): str(r.label) for r in result} print(*narrower.items(), sep="\n") ``` -Exercise: - -- run the above query replacing `skos:narrower` with `skos:narrower*`; - what happens? - run the above query using `country:FRA` and see what happens; then replace `skos:narrower` with `skos:narrower/skos:narrower`: do you see the same number of results? +```solution +q = """ +PREFIX country: + +SELECT DISTINCT * +WHERE { + country:FRA skos:narrower/skos:narrower ?narrower . + ?narrower skos:prefLabel ?label . + FILTER (lang(?label) = "en") +} +""" +result = country.query(q) + +narrower = {to_curie(r.narrower): str(r.label) for r in result} + +print(*narrower.items(), sep="\n") +``` + -The `*` operator is used to traverse the graph -and find all the nodes reachable from the starting node. +The `*` operator traverses the graph +and find all the nodes reachable from the starting node through a given relation. The `*` operator is not supported by all graph databases. -#### Creating a graph +### Creating a graph SparQL can create new graphs from an existing one. @@ -197,23 +299,23 @@ WHERE { FILTER (lang(?label) = "en") } """ -result = g.query(q) +result = country.query(q) list(result.graph) ``` Let's visualize the graph. ```python -from tools import plot_graph +import tools from rdflib import SKOS -plot_graph(result.graph, label_property=SKOS.prefLabel) +tools.plot_graph(result.graph, label_property=SKOS.prefLabel) ``` -#### More metadata +## More metadata The Country graph contains more than countries ;) -the resource type is identified by the `lemon:context` property. +the resource type is identified by the `` predicate. ```python q = """ @@ -223,7 +325,7 @@ PREFIX context: SELECT DISTINCT ?broader - (COUNT(?narrower) AS ?count) + (COUNT(?narrower) AS ?count_) WHERE { ?broader skos:narrower+ ?narrower ; @@ -237,30 +339,36 @@ WHERE { FILTER (lang(?label) = "en") } GROUP BY ?broader -ORDER BY ?count +ORDER BY ?count_ """ -result = g.query(q) -list(result) +result = country.query(q) +[ + {str(r.broader): str(r.count_)} + for r + in result +] ``` ---- +In RDF, you don't have hierarchies, +just triples. -## Datasets +```mermaid +graph -An RDF dataset is made of multiple graphs. +eu:Country((eu:Country)) ~~~ eu:FRA & eu:ITA & eu:XLI & eu:XLL -.->|a| eu:Country -```python -from rdflib import Dataset +eu:FRA & eu:ITA & eu:XLI & eu:XLL -->|skos:inScheme| eu:country -d = Dataset(store='Oxigraph') -# Add ns shortcuts. -d.bind("eu", "https://publications.europa.eu/resource/authority/") -d.bind("schema": "https://schema.org/") -d.bind("euvoc": "http://publications.europa.eu/ontology/euvoc#") +linkStyle 8,9,10,11 stroke:green + +eu:ITA -->|skos:narrower| eu:XLI & eu:XLL + +linkStyle 12,13 stroke:blue + +eu:ITA & eu:FRA -->|lemon:context| context:COUNTRY +linkStyle 14,15 stroke:red +eu:country -.->|a| skos:ConceptScheme((skos:ConceptScheme)) -d.graph(identifier="urn:People").parse(data=json.dumps(nodes_ld), format="application/ld+json") -d.graph(identifier="eu:country").parse("countries-skos-ap-act.ttl", format="ox-turtle") -[len(x) for x in d.graphs()] ``` diff --git a/sparql-101/11-sparql-metadata.md b/sparql-101/11-sparql-metadata.md index e73d5aa..5bca368 100644 --- a/sparql-101/11-sparql-metadata.md +++ b/sparql-101/11-sparql-metadata.md @@ -15,13 +15,24 @@ such as: ```python -g=Graph(store="Oxigraph") +from rdflib import Dataset +# Create a dataset... +d=Dataset(store="Oxigraph", default_union=True) -# Load the graph. -g.parse("countries-skos-ap-act.ttl", format="ox-turtle") +# Bind the namespaces. +d.bind("euvoc", "http://publications.europa.eu/ontology/euvoc#") +d.bind("skos", "http://www.w3.org/2004/02/skos/core#") +d.bind("country", "http://publications.europa.eu/resource/authority/country/") + +# Create a graph for the countries. +country = d.graph("http://publications.europa.eu/resource/authority/country") + +# Load data into it. +country.parse("countries-skos-ap-act.ttl", format="ox-turtle") ``` -And query the simplest metadata. +And query the simplest metadata: +the `rdf:type`s of the graph's subjects ```python q = """ @@ -31,17 +42,19 @@ WHERE { ?s a ?type . } """ -result = g.query(q) +result = country.query(q) [r.type for r in result] ``` -We can simplify the above query -avoiding gathering `?s` at all -using the `[]` syntax -that matches anything. +Since we are returning just `?type`, +we can avoiding gathering `?s` +using the `[]` placeholder. -```python +Try it! + + +```solution q = """ SELECT DISTINCT ?type @@ -49,7 +62,7 @@ WHERE { [] a ?type . } """ -result = g.query(q) +result = d.query(q) [r.type for r in result] ``` @@ -67,7 +80,9 @@ and their labels. ```python q = """ -SELECT DISTINCT * +SELECT DISTINCT + ?ConceptScheme + ?label WHERE { ?ConceptScheme a skos:ConceptScheme ; @@ -76,8 +91,8 @@ WHERE { FILTER (lang(?label) = "en") } """ -result = g.query(q) -[r.asdict() for r in result] +result = d.query(q) +t = [r.asdict() for r in result] ``` Exercise: @@ -85,8 +100,21 @@ Exercise: - Rewrite the above query using two sentences. - +```solution +q = """ +SELECT DISTINCT + ?ConceptScheme + ?label +WHERE { + ?ConceptScheme a skos:ConceptScheme . + ?ConceptScheme skos:prefLabel ?label . + FILTER (lang(?label) = "en") +} +""" +result = d.query(q) +assert t == [r.asdict() for r in result] +``` ---- Now find all the triples @@ -94,14 +122,14 @@ where the `object` is ` -```python +```solution q = """ SELECT DISTINCT * WHERE { ?s ?p . } """ -result = g.query(q) +result = d.query(q) [r.asdict() for r in result] ``` @@ -110,10 +138,7 @@ Exercise: - Rewrite the above query using the PREFIX directive. - - - -```python +```solution q = """ PREFIX euvoc: @@ -123,7 +148,7 @@ WHERE { } LIMIT 6 """ -result = g.query(q) +result = d.query(q) [r.asdict() for r in result] ``` @@ -141,7 +166,7 @@ graph skos:ConceptScheme skos:ConceptScheme -->|skos:prefLabel| _l1[/"Concept Scheme"/] -country:0005 -.->|a| skos:ConceptScheme +country:0005 -.->|a| skos:ConceptScheme((skos:ConceptScheme)) country:0005 ---|skos:prefLabel| _l[/"Current EU members"/] country -.->|a| skos:ConceptScheme @@ -151,6 +176,27 @@ country:... --->|skos:inScheme| country:0005 ``` +---- + +Now, let's get the predicates associated with resources +of a given type. + +```python +q = """ +SELECT DISTINCT + ?type ?p +WHERE { + [] a ?type ; + ?p [] + . + FILTER (?p != rdf:type) +} +""" + +result = d.query(q) +{ r.type: r.p for r in result } +``` + --- Now, query for the information diff --git a/sparql-101/12-enriching-data.md b/sparql-101/12-enriching-data.md index 7a7de56..6a0e80c 100644 --- a/sparql-101/12-enriching-data.md +++ b/sparql-101/12-enriching-data.md @@ -40,9 +40,10 @@ may have a different schema. | | Marge | Simpson || | | Bart | Simpson | -With RDF, there is no fixed schema. -Instead, we have a public set of predicates -that can be used to describe the same entity. +With RDF, there is no fixed syntactic schema. +Instead, we describe resources +using a public set of predicates +(`rdf:Property`es). ```mermaid graph LR @@ -71,16 +72,14 @@ db1-surname --> familyName ~~~ db2-surname --> familyName db1-id --> mbox ~~~ db2-email --> mbox ``` -Storing data in a graph allows to use -a set of predefined predicates (see them as properties) -that are globally defined. - --- +Let's contextualize some data +like we did in [07-jsonld](07-jsonld.ipynb). + Start with a json dataset. ```python - data = [ {"email":"ft@a.test", "name": "Francisca", "surname": "Trujillo", "country": "ES"}, {"email":"mr@a.test", "name": "Mario", "surname": "Rossi", "country": "IT"}, @@ -89,7 +88,7 @@ data = [ ] ``` -Add a context to the dataset. +Add a context to map the keys to IRIs. ```python context = { @@ -119,7 +118,7 @@ Exercise: - add a `"@type": "Person"` to every entry -```python +```solution nodes_ld = { # Every country is a resource. "@graph": [ { "@type": "Person", **c} for c in nodes], @@ -127,39 +126,61 @@ nodes_ld = { } ``` -And create a dataset and bind the selected namespaces. +Now create a dataset. ```python from rdflib import Dataset -d = Dataset(store='Oxigraph') +# Remember the default_union option. +d = Dataset(store='Oxigraph', default_union=True) +``` + +and bind the selected namespaces + +```python # Add ns shortcuts. d.bind("eu", "https://publications.europa.eu/resource/authority/") d.bind("schema": "https://schema.org/") d.bind("euvoc": "http://publications.europa.eu/ontology/euvoc#") d.bind("my": "https://a.test/my#") - ``` Exercise: - list the graphs in the dataset; how many are there? +```solution +list(d.graphs()) +``` + +Now load the JSON-LD data into a graph. + ```python import json # Create a people graph and add the entries -d.graph(identifier="urn:People").parse(data=json.dumps(nodes_ld), format="application/ld+json") +people = d.graph(identifier="urn:People") +people.parse(data=json.dumps(nodes_ld), format="application/ld+json") ``` Exercise: - list the triples in the dataset; + +```solution +[t for t in d] +``` + - list the triples in the `urn:People` graph; +```solution +[t for t in people] +``` + Load the countries vocabulary in a new graph. ```python -d.graph(identifier="eu:country").parse("countries-skos-ap-act.ttl", format="ox-turtle") +country = d.graph(identifier="eu:country") +country.parse("countries-skos-ap-act.ttl", format="ox-turtle") ``` Now we have a graph to enrich with external data. @@ -203,7 +224,7 @@ Exercise: - Replace `` with `?g`: what happens? - Can you replace both GRAPHs values with `?variables`? -- See the [string to datatype (STRDT) docs] +- See the [string to datatype (STRDT) docs](https://www.w3.org/TR/sparql11-query/#func-strdt) If that's OK, we can update the graph with the country identifier. @@ -246,8 +267,9 @@ print(d.graph(identifier="urn:People").serialize(format="turtle")) Now, we can even have a "fat" graph with all the information ```python -q = """ +q_country = """ PREFIX euvoc: + INSERT { GRAPH { ?p my:countryName ?countryName . @@ -262,8 +284,17 @@ WHERE { FILTER ( LANG(?countryName) = "en" ) } """ -d.update(q) +d.update(q_country) + +``` + +Exercise: +- in the first query, replace `?country` with `_:country`: does it work? + +```solution +q = q_country.replace("?country", "_:country") +d.update(q) ``` We can also mangle the data a bit... @@ -291,19 +322,47 @@ WHERE { } """ d.update(q) - - ``` Exercise: -- replace `?country` with `_:country`: does it work? -- replace the two sentences with the following **one**: does it work? +- write a SELECT query replacing the sentences + +```turtle +?p a :Person ; + :nationality _:country +. + +_:country skos:notation ?prefix . +``` + +with the following **one**: does it work? -```raw +```turtle ?p a :Person ; :nationality [ skos:notation ?prefix ] . ``` + +```solution +SELECT DISTINCT + * +WHERE { + ?p a :Person ; + :nationality [ + skos:notation ?prefix + ] + . + # We want the country name in English. + FILTER ( DATATYPE(?prefix) = euvoc:PHONE_PREFIX ) + + # Bind a modified value to the variable ?plus_prefix. + BIND ( + CONCAT("+", str(?prefix)) AS ?plus_prefix + ) +} +""" +d.query(q).bindings +``` diff --git a/sparql-101/13-enriching-data.md b/sparql-101/13-enriching-data.md new file mode 100644 index 0000000..5fe0015 --- /dev/null +++ b/sparql-101/13-enriching-data.md @@ -0,0 +1,342 @@ +# Agenda + +- Enriching data with external knowledge + + +## A real-life example: kubernetes infrastructure + +Kubernetes is a resource orchestrator where you +describe resources in terms of +container images, ram, cpu, network. + +```python +!cat guestbook-all-in-one.yaml +``` + +[d3fendtools](https://github.com/par-tec/d3fend-tools) +converts a Kubernetes YAML file to an RDF graph. + +Let's load one. + +```python +from rdflib import Dataset +d = Dataset(store='Oxigraph', default_union=True) +kube = d.graph("urn:my_app") +kube.parse("guestbook.ttl", format="turtle") +``` + +Exercise: display the graph using `tools.plot_graph` + +```solution +import tools +tools.plot_graph(d.graph("urn:my_app")) +``` + +## D3FEND knowledge graph + +D3FEND is a cybersecurity knowledge graph +containing a taxonomy of: + +- digital artifacts (e.g., Server, Database, etc.); +- defensive techniques (e.g., Multifactor Authentication, Network Isolation, File Analysis, etc.); +- offensive techniques (e.g., Phishing, Content Injection, etc.). + +Let's load the D3FEND graph. + +```python +d.bind("d3f", "http://d3fend.mitre.org/ontologies/d3fend.owl#") +d3fend = d.graph("http://d3fend.mitre.org/ontologies/d3fend.owl") +d3fend.parse("d3fend.ttl", format="ox-turtle") +``` + +Exercise: + +- list digital artifacts + +```solution +q = """ +SELECT DISTINCT ?artifact +WHERE { + ?artifact rdfs:subClassOf d3f:DigitalArtifact . +} +LIMIT 10 +""" +result = d.query(q) +list(result) +``` + +- use the `rdfs:subClassOf` predicate to list the +subclasses of `d3f:Server` + +```solution +q = """ +SELECT DISTINCT ?artifact +WHERE { + ?artifact rdfs:subClassOf d3f:Server . +} +""" +result = d.query(q) +list(result) +``` + +Now we use `CONSTRUCT` to create a graph of the subclasses of `d3f:Server` + +```solution +q = """ +CONSTRUCT { + ?artifact rdfs:subClassOf ?parent . +} +WHERE { + ?artifact rdfs:subClassOf ?parent . + ?parent rdfs:subClassOf* d3f:Server . +} +""" +servers = d.query(q).graph +``` + +Exercise: display the graph of subclasses of `d3f:Server` + +```solution +import tools +tools.plot_graph(servers) +``` + +- list defensive techniques that are subclasses with `d3f:FileAnalysis` + together with their `d3f:definition`s + +```solution +q = """ +SELECT DISTINCT + ?technique + ?definition +WHERE { + ?technique rdfs:subClassOf* d3f:FileAnalysis ; + d3f:definition ?definition . +} +""" + +for r in d.query(q): + print(r.technique, r.definition) +``` + +Now, let's list the defensive techniques associated with the `d3f:Server` artifact. + +```python +q = """ +SELECT DISTINCT + ?technique + ?artifact +WHERE { + ?technique rdfs:subClassOf* d3f:DefensiveTechnique . + ?artifact rdfs:subClassOf* d3f:Server . + + ?technique ?protects ?artifact . +} +""" +result = d.query(q) +for r in result: + print(f"{r.technique} protects {r.artifact}") +``` + +Exercise: + +- show the `rdfs:label` of the `?technique` + +```solution +q = """ +SELECT DISTINCT + ?technique_label + ?artifact +WHERE { + ?artifact rdfs:subClassOf* d3f:Server . + + ?technique rdfs:subClassOf* d3f:DefensiveTechnique . + ?technique ?protects ?artifact . + ?technique rdfs:label ?technique_label . +} +""" +result = d.query(q) +for r in result: + print(f"{r.technique_label} protects {r.artifact}") +``` + +- replace `d3f:DefensiveTechnique` with `d3f:OffensiveTechnique` + and list offensive techniques that affect the `d3f:Server` artifact + +```solution +q = """ +SELECT DISTINCT + ?technique_label + ?artifact +WHERE { + ?artifact rdfs:subClassOf* d3f:Server . + + ?technique rdfs:subClassOf* d3f:OffensiveTechnique ; + rdfs:label ?technique_label ; + ?protects ?artifact + . +} +""" +result = d.query(q) +for r in result: + print(f"{r.technique_label} attacks {r.artifact}") +``` + +## Packing it all together + +Let's look at our dataset now: + +- one contains our application infrastructure; +- one contains cybersecurity knowledge, including + artifacts, offensive and defensive techniques. + +```mermaid +graph LR + +subgraph dataset + subgraph d3fend + d3f:Credential -.-> d3f:DigitalArtifact + d3f:WebServer -.-> d3f:Server -.-> d3f:DigitalArtifact + d3f:CredentialRotation([d3f:CredentialRotation]) ==>|defends| d3f:Credential + d3f:UnsecuredCredential>d3f:UnsecuredCredential] ==>|attacks| d3f:Credential + end + + subgraph kube + db_password -.->|a| k8s:Secret + app -.->|a| k8s:Deployment + end +end +``` + +The kube graph contains not only the Kubernetes resources... + +```python +q = """ +SELECT DISTINCT + ?kube +WHERE { + # Kubernetes resources. + ?kube rdfs:subClassOf* k8s:Kind . +} +""" +[str(x[0]) for x in kube.query(q)] +``` + +.. but even links to the D3FEND graph. + +```python +q = """ +PREFIX k8s: +PREFIX d3f: +PREFIX rdfs: + +SELECT DISTINCT + ?kube + ?d3fend +WHERE { + # Kubernetes resources. + GRAPH { + ?kube rdfs:subClassOf* k8s:Kind ; + rdfs:subClassOf ?d3fend + . + } + + # D3FEND resources. + GRAPH { + ?d3fend rdfs:subClassOf* d3f:DigitalArtifact . + } +} +""" +for r in d.query(q): + print( + r.kube, + "is a", + # shorten using prefix + d.namespace_manager.curie(r.d3fend) + ) +``` + +So we actually get links between our application +objects and the d3fend knowledge base. + +```mermaid +graph LR + +subgraph dataset + subgraph d3fend + d3f:Credential -.-> d3f:DigitalArtifact + d3f:ContainerImage -.-> d3f:Server -.-> d3f:DigitalArtifact + d3f:CredentialRotation([d3f:CredentialRotation]) ==>|defends| d3f:Credential + d3f:UnsecuredCredential>d3f:UnsecuredCredential] ==>|attacks| d3f:Credential + d3f:Container + end + + subgraph kube + db_password -.->|a| k8s:Secret + app -->|a| k8s:Deployment + end + + k8s:Secret -.-> d3f:Credential + k8s:Deployment --> d3f:Container --> d3f:ContainerImage +end +``` + +So we can ask for example +the attack classes towards +our components. + +```python +attack_surface = d.query(""" +SELECT DISTINCT + ?attack_label + ?affects + ?artifact + ?kube_resource +WHERE { + + ?kube_resource a ?kind . + + # Get digital artifacts associated with Kubernetes resources. + ?kind rdfs:subClassOf* k8s:Kind, . + ?kind rdfs:subClassOf* d3f:DigitalArtifact . + ?kind rdfs:subClassOf ?artifact . + + + ?attack + d3f:attack-id ?attack_id; + rdfs:label ?attack_label . + + ?attack ?affects ?artifact . + +} +""") + +for attack in sorted(attack_surface): + print(f"{attack.attack_label}, " + f"{attack.affects.fragment} {attack.artifact.fragment} for {attack.kube_resource}") + +``` + +Exercise: + +- simplify the query materializing the digital artifacts + associated with Kubernetes resources + directly at the level of the `?kube_resource`, e.g. + +```turtle +# Original graph +... +k8s:Secret rdfs:subClassOf d3f:Credential ; + rdfs:subClassOf k8s:Kind . + +<:secret> a k8s:Secret . + +# Add this triple too +<:secret> a d3f:Credential . +``` + + +## Summary + +That was the last lesson: +you can mix and mingle all the information diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb index 27b450b..6985c3f 100644 --- a/sparql-101/notebooks/00-jupyter-intro.ipynb +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "05b17236", + "id": "baab3cb9", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "2a230b0d", + "id": "294f2455", "metadata": { "slideshow": { "slide_type": "slide" @@ -38,7 +38,7 @@ }, { "cell_type": "markdown", - "id": "384c1067", + "id": "b2ea41eb", "metadata": { "slideshow": { "slide_type": "slide" @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "c2e69109", + "id": "49fb7dcb", "metadata": { "slideshow": { "slide_type": "slide" @@ -74,7 +74,7 @@ }, { "cell_type": "markdown", - "id": "033e976e", + "id": "dce9437e", "metadata": { "slideshow": { "slide_type": "slide" @@ -98,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "12a829d9", + "id": "82b49eb0", "metadata": { "slideshow": { "slide_type": "slide" @@ -112,7 +112,7 @@ }, { "cell_type": "markdown", - "id": "32d0bbc8", + "id": "6220ccfd", "metadata": { "slideshow": { "slide_type": "subslide" @@ -127,7 +127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7c3c2b0c", + "id": "fab72e72", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +136,7 @@ }, { "cell_type": "markdown", - "id": "7259530d", + "id": "8b4e5ce0", "metadata": { "slideshow": { "slide_type": "slide" @@ -154,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b1a6f4c3", + "id": "2c583685", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "b971ca26", + "id": "d4a9829b", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -174,7 +174,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c93a2374", + "id": "f0e5162c", "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ }, { "cell_type": "markdown", - "id": "7557be54", + "id": "f89aaa25", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "e4e280dd", + "id": "27d4f22b", "metadata": {}, "source": [ "----" diff --git a/sparql-101/notebooks/00-teaser.ipynb b/sparql-101/notebooks/00-teaser.ipynb index 360f979..7731f13 100644 --- a/sparql-101/notebooks/00-teaser.ipynb +++ b/sparql-101/notebooks/00-teaser.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "503c1efd", + "id": "8cb1befb", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "a0ded234", + "id": "31698268", "metadata": { "slideshow": { "slide_type": "slide" @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "674f3fc4", + "id": "b0b9032c", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "f53f3abe", + "id": "469da5f6", "metadata": {}, "source": [ "(and some graph libraries)" @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "88d0dd2e", + "id": "80d65c10", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "10aa1ce1", + "id": "1f8f9460", "metadata": {}, "outputs": [], "source": [ @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "955762a2", + "id": "b62d294b", "metadata": {}, "source": [ "For example network of persons:" @@ -94,7 +94,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7b11cae3", + "id": "246201aa", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "6cca0fd1", + "id": "2279454d", "metadata": {}, "source": [ "... eventually rendered as a graph ..." @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9ca432f7", + "id": "e12cefb6", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "513d636e", + "id": "4902dd40", "metadata": {}, "source": [ "Convert it in [JSON-LD](https://json-ld.org/) format:" @@ -149,7 +149,7 @@ { "cell_type": "code", "execution_count": null, - "id": "90c54ebe", + "id": "bb01a1eb", "metadata": {}, "outputs": [], "source": [ @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "7fa25192", + "id": "5fd81b62", "metadata": {}, "source": [ "There's plenty of knowledge in the web!" @@ -168,7 +168,7 @@ { "cell_type": "code", "execution_count": null, - "id": "595570f6", + "id": "d4628bbc", "metadata": {}, "outputs": [], "source": [ @@ -187,7 +187,7 @@ }, { "cell_type": "markdown", - "id": "70e1e00d", + "id": "8be69385", "metadata": {}, "source": [ "And we can connect them together" @@ -196,7 +196,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e80e242d", + "id": "ee12f5ba", "metadata": {}, "outputs": [], "source": [ @@ -211,7 +211,7 @@ }, { "cell_type": "markdown", - "id": "1e3c98b1", + "id": "9d6d3989", "metadata": {}, "source": [ "Graphs contain a lot of senteces" @@ -220,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "343e9755", + "id": "ecd3ec39", "metadata": {}, "outputs": [], "source": [ @@ -229,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "02a9dd74", + "id": "1233bbe5", "metadata": {}, "source": [ "but we can query them (e.g., for Italian food)" @@ -238,7 +238,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e5f69b39", + "id": "857038d6", "metadata": {}, "outputs": [], "source": [ @@ -258,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "31794391", + "id": "cc3f3a07", "metadata": {}, "source": [ "and see if two resources have something in common..." @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8d8198ef", + "id": "15a64386", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "8c0104fa", + "id": "141a9d52", "metadata": {}, "source": [ "We can query remote graphs (e.g., DBPedia):" @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e4e9d761", + "id": "db84d4f8", "metadata": {}, "outputs": [], "source": [ @@ -319,7 +319,7 @@ }, { "cell_type": "markdown", - "id": "d8361c79", + "id": "529626c5", "metadata": {}, "source": [ "Provided by different organizations" @@ -328,7 +328,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2064f108", + "id": "30051dd4", "metadata": {}, "outputs": [], "source": [ @@ -358,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "5ab0b3b9", + "id": "19de5dfd", "metadata": {}, "source": [ "And their relations" @@ -367,7 +367,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9e7787d7", + "id": "e5f48820", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "9b210798", + "id": "63c2ff6d", "metadata": {}, "source": [ "More relations" @@ -406,7 +406,7 @@ { "cell_type": "code", "execution_count": null, - "id": "35f29272", + "id": "e9ec9b57", "metadata": {}, "outputs": [], "source": [ @@ -437,7 +437,7 @@ }, { "cell_type": "markdown", - "id": "104cc65b", + "id": "0f2f7b3e", "metadata": { "slideshow": { "slide_type": "slide" @@ -452,7 +452,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a8b53cd9", + "id": "3bab3110", "metadata": {}, "outputs": [], "source": [ @@ -461,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "24367b51", + "id": "36a0706d", "metadata": { "slideshow": { "slide_type": "slide" @@ -476,7 +476,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c62a8fe2", + "id": "333bb050", "metadata": {}, "outputs": [], "source": [ @@ -500,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "72d220c9", + "id": "cf1ce6ff", "metadata": {}, "source": [ "Get security insights from the NSA knowledge graph." @@ -509,7 +509,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bfff459d", + "id": "802161cf", "metadata": {}, "outputs": [], "source": [ @@ -526,7 +526,7 @@ }, { "cell_type": "markdown", - "id": "e4b00d8d", + "id": "fb397df0", "metadata": {}, "source": [ "and apply this stuff to our infrastructure." @@ -535,7 +535,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e004d3f9", + "id": "2821b6c9", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/01-knowledge.ipynb b/sparql-101/notebooks/01-knowledge.ipynb index 8688fc8..7f18db8 100644 --- a/sparql-101/notebooks/01-knowledge.ipynb +++ b/sparql-101/notebooks/01-knowledge.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "598d1e3d", + "id": "d1c5d0bf", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -21,7 +21,7 @@ }, { "cell_type": "markdown", - "id": "7fd1c52b", + "id": "fe996522", "metadata": { "slideshow": { "slide_type": "subslide" @@ -40,7 +40,7 @@ { "cell_type": "code", "execution_count": null, - "id": "50c884fb", + "id": "3953436c", "metadata": {}, "outputs": [], "source": [ @@ -50,7 +50,7 @@ }, { "cell_type": "markdown", - "id": "775f17f6", + "id": "a8203d4a", "metadata": { "slideshow": { "slide_type": "slide" @@ -69,7 +69,7 @@ }, { "cell_type": "markdown", - "id": "f724a90c", + "id": "58e1927e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -87,7 +87,7 @@ }, { "cell_type": "markdown", - "id": "461e3d50", + "id": "1e5705ef", "metadata": { "slideshow": { "slide_type": "subslide" @@ -108,7 +108,7 @@ }, { "cell_type": "markdown", - "id": "c44a462c", + "id": "88273f32", "metadata": { "slideshow": { "slide_type": "subslide" @@ -129,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "21ec4d90", + "id": "baccdc23", "metadata": {}, "source": [ "```mermaid\n", @@ -140,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "2fd4962e", + "id": "81fa50ab", "metadata": { "slideshow": { "slide_type": "subslide" @@ -149,7 +149,8 @@ "source": [ "----\n", "\n", - "Every term is identified by an absolute URI.\n", + "Every term is identified by an absolute IRI (Internationalized Resource Identifier).\n", + "IRI extends the concept of URI (Uniform Resource Identifier).\n", "\n", "The prefix identifies the vocabulary name,\n", "and the suffix identifies the term." @@ -158,7 +159,7 @@ { "cell_type": "code", "execution_count": null, - "id": "254ebdc6", + "id": "334a5a54", "metadata": {}, "outputs": [], "source": [ @@ -168,15 +169,15 @@ }, { "cell_type": "markdown", - "id": "66f5e7ae", + "id": "4f07d958", "metadata": {}, "source": [ - "We'll see how to use URIs to express knowledge." + "We'll see how to use IRIs to express knowledge." ] }, { "cell_type": "markdown", - "id": "3da2c913", + "id": "9142b96f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -195,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "adf1fc70", + "id": "52ab8511", "metadata": { "slideshow": { "slide_type": "subslide" @@ -214,7 +215,7 @@ }, { "cell_type": "markdown", - "id": "17fed3ec", + "id": "6ad16b0f", "metadata": {}, "source": [ "```mermaid\n", @@ -228,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "51e97962", + "id": "91341303", "metadata": { "slideshow": { "slide_type": "subslide" @@ -261,7 +262,7 @@ }, { "cell_type": "markdown", - "id": "b398f240", + "id": "bbcab3b4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -280,7 +281,7 @@ }, { "cell_type": "markdown", - "id": "8273835c", + "id": "8896c130", "metadata": {}, "source": [ "```mermaid\n", @@ -297,7 +298,7 @@ }, { "cell_type": "markdown", - "id": "e3388a38", + "id": "44841e95", "metadata": { "slideshow": { "slide_type": "subslide" @@ -311,7 +312,7 @@ }, { "cell_type": "markdown", - "id": "b51573de", + "id": "841c9991", "metadata": {}, "source": [ "```mermaid\n", @@ -325,7 +326,7 @@ }, { "cell_type": "markdown", - "id": "da9e0ab3", + "id": "1ecdeb0b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -343,7 +344,7 @@ }, { "cell_type": "markdown", - "id": "dc12b964", + "id": "1ca17502", "metadata": {}, "source": [ "```mermaid\n", @@ -368,7 +369,7 @@ }, { "cell_type": "markdown", - "id": "bdfa4323", + "id": "0cc4365e", "metadata": {}, "source": [ "This is the basis of the Semantic Web,\n", @@ -380,7 +381,7 @@ }, { "cell_type": "markdown", - "id": "70f53c4e", + "id": "696a7f3b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -389,7 +390,7 @@ "source": [ "----\n", "\n", - "## RDF: Machine Readable Knowledge\n", + "## Resource Description Framework: machine readable knowledge\n", "\n", "Encyclopedia voices on Wikipedia and dbpedia are expressed in\n", "[Resource Description Framework (RDF)](https://www.w3.org/TR/rdf11-primer/).\n", @@ -414,7 +415,7 @@ }, { "cell_type": "markdown", - "id": "d9c4dfe1", + "id": "a4632a43", "metadata": { "slideshow": { "slide_type": "subslide" @@ -437,7 +438,7 @@ }, { "cell_type": "markdown", - "id": "40aedb5a", + "id": "16fd4310", "metadata": { "slideshow": { "slide_type": "subslide" @@ -446,12 +447,12 @@ "source": [ "----\n", "\n", - "## RDF: Machine Readable Knowledge\n", + "## Resource Description Format: machine readable knowledge\n", "\n", - "RDF uses [URIs](https://www.w3.org/TR/rdf11-concepts/#section-uris)\n", + "RDF uses [IRIs](https://www.w3.org/TR/rdf11-concepts/#section-IRIs)\n", "to disambiguate the meaning of terms and provide semantics.\n", "\n", - "Every term is identified by an absolute URI enclosed by `<>`.\n", + "Every term is identified by an absolute IRI enclosed by `<>`.\n", "\n", "The prefix identifies the source of the term definition\n", "(that we'll call **vocabulary**),\n", @@ -461,7 +462,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ea6869be", + "id": "6172e4b9", "metadata": {}, "outputs": [], "source": [ @@ -472,7 +473,7 @@ }, { "cell_type": "markdown", - "id": "97fabe43", + "id": "a4329758", "metadata": {}, "source": [ "RDF is based on:\n", @@ -482,17 +483,22 @@ "- **graphs** (sets of triples).\n", "- **vocabularies** (graphs containing terms and their definitions).\n", "\n", + "See the definition of RDF concepts here:\n", + "\n", + "- [Graph data model](https://www.w3.org/TR/rdf11-concepts/#data-model)\n", + "- [Graphs](https://www.w3.org/TR/rdf11-concepts/#section-rdf-graph)\n", + "\n", "### Elements\n", "\n", - "Subjects and predicates are uniquely identified by URIs.\n", + "Subjects and predicates are uniquely identified by IRIs.\n", "\n", - "Objects can be either URIs or literals (strings, numbers, dates, etc.)." + "Objects can be either IRIs or literals (strings, numbers, dates, etc.)." ] }, { "cell_type": "code", "execution_count": null, - "id": "df8dd188", + "id": "3ca2e549", "metadata": {}, "outputs": [], "source": [ @@ -510,7 +516,7 @@ }, { "cell_type": "markdown", - "id": "58110f85", + "id": "c0b0a103", "metadata": {}, "source": [ "💪: RDF elements\n", @@ -525,7 +531,7 @@ { "cell_type": "code", "execution_count": null, - "id": "22c9a900", + "id": "4090ac66", "metadata": {}, "outputs": [], "source": [ @@ -538,7 +544,7 @@ }, { "cell_type": "markdown", - "id": "782b5418", + "id": "4133e46f", "metadata": {}, "source": [ "### Triples\n", @@ -550,7 +556,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bcf68d74", + "id": "67387380", "metadata": {}, "outputs": [], "source": [ @@ -560,7 +566,7 @@ }, { "cell_type": "markdown", - "id": "48af7343", + "id": "ad1d764a", "metadata": {}, "source": [ "Another triple serialized in the N3 format:" @@ -569,7 +575,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7440c2eb", + "id": "bf6fc3b7", "metadata": {}, "outputs": [], "source": [ @@ -580,7 +586,7 @@ }, { "cell_type": "markdown", - "id": "d9d3a652", + "id": "a4807460", "metadata": {}, "source": [ "The `a` keyword is a shorthand for the `rdf:type` predicate,\n", @@ -592,7 +598,7 @@ { "cell_type": "code", "execution_count": null, - "id": "72fc8b97", + "id": "edc7e61c", "metadata": {}, "outputs": [], "source": [ @@ -607,7 +613,7 @@ }, { "cell_type": "markdown", - "id": "7d0b01e1", + "id": "f87278d4", "metadata": {}, "source": [ "### Graphs\n", @@ -618,7 +624,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5ab0c7af", + "id": "95620b21", "metadata": {}, "outputs": [], "source": [ @@ -630,7 +636,7 @@ }, { "cell_type": "markdown", - "id": "116d8cd7", + "id": "79d38157", "metadata": {}, "source": [ "----" @@ -639,7 +645,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b409dd8b", + "id": "aee14f6f", "metadata": {}, "outputs": [], "source": [ @@ -652,7 +658,7 @@ }, { "cell_type": "markdown", - "id": "b45fc2e1", + "id": "fa16d28b", "metadata": {}, "source": [ "💪 Exercise: parse sentences\n", @@ -663,7 +669,7 @@ }, { "cell_type": "markdown", - "id": "85664b13", + "id": "3cf131a5", "metadata": { "slideshow": { "slide_type": "subslide" @@ -678,7 +684,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b3ed8f41", + "id": "3400b95d", "metadata": {}, "outputs": [], "source": [ @@ -688,7 +694,7 @@ }, { "cell_type": "markdown", - "id": "0c63ad7c", + "id": "51b2a035", "metadata": {}, "source": [ "💪 Exercise: take 2 minutes to map the JSON-LD format to the Turtle format.\n", @@ -698,7 +704,7 @@ }, { "cell_type": "markdown", - "id": "b1b627f7", + "id": "c0132edc", "metadata": { "slideshow": { "slide_type": "slide" @@ -709,14 +715,14 @@ "\n", "## Graphs: Namespaces and cURIe\n", "\n", - "RDF use namespace prefixes to shorten URIs\n", + "RDF use namespace prefixes to shorten IRIs\n", "(the [cURIe](https://www.w3.org/TR/curie/) syntax)." ] }, { "cell_type": "code", "execution_count": null, - "id": "89a3e673", + "id": "bbaf1a67", "metadata": {}, "outputs": [], "source": [ @@ -736,7 +742,7 @@ { "cell_type": "code", "execution_count": null, - "id": "280d72e8", + "id": "11b33829", "metadata": {}, "outputs": [], "source": [ @@ -748,7 +754,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a4907748", + "id": "ebf22387", "metadata": {}, "outputs": [], "source": [ @@ -758,7 +764,53 @@ }, { "cell_type": "markdown", - "id": "217712ca", + "id": "c7bcfc8a", + "metadata": {}, + "source": [ + "rdflib has a set of predefined namespaces" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "77301cad", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import RDF, RDFS, SKOS, XSD\n", + "\n", + "print(\n", + " \"The\", RDFS.range,\n", + " \"of an\", RDF.type,\n", + " \"is an\", RDFS.Class\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "3f989091", + "metadata": {}, + "source": [ + "While" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "530d6e7e", + "metadata": {}, + "outputs": [], + "source": [ + "print(\n", + " \"The\", RDFS.range,\n", + " \"of a\", SKOS.prefLabel,\n", + " \"is an\", XSD.string\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "1a1d7d62", "metadata": { "slideshow": { "slide_type": "subslide" @@ -768,13 +820,13 @@ "----\n", "\n", "Another vocabulary could provide a different definition for the same term.\n", - ":warning: URI could not always be human-readable." + ":warning: URI are not always human-readable." ] }, { "cell_type": "code", "execution_count": null, - "id": "ba179e6f", + "id": "ac908e71", "metadata": {}, "outputs": [], "source": [ @@ -786,7 +838,7 @@ }, { "cell_type": "markdown", - "id": "c328612d", + "id": "49a12d76", "metadata": { "slideshow": { "slide_type": "subslide" @@ -809,7 +861,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6ad1cc14", + "id": "3577d291", "metadata": {}, "outputs": [], "source": [ @@ -827,20 +879,20 @@ }, { "cell_type": "markdown", - "id": "7d2afd4c", + "id": "0015257e", "metadata": {}, "source": [ "💪: parse the sentences using rdflib and answer the following questions\n", "\n", "- how many sentences are there?\n", - "- how many subjects are there?\n", + "- how many distinct subjects are there?\n", "- how many namespaces are there?" ] }, { "cell_type": "code", "execution_count": null, - "id": "b80de1ae", + "id": "41bd9bbc", "metadata": {}, "outputs": [], "source": [ @@ -851,9 +903,23 @@ "# Use this cell for the exercise" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "8468d3e5", + "metadata": {}, + "outputs": [], + "source": [ + "tortellini.parse(data=sentences, format=\"turtle\")\n", + "print(\n", + " len(tortellini).\n", + " len(set(tortellini.subjects())\n", + ")" + ] + }, { "cell_type": "markdown", - "id": "bc07dc66", + "id": "d5370fe1", "metadata": {}, "source": [ "💪: use `Graph.namespaces` to get the namespaces added by the sentences above" @@ -862,7 +928,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a281b4ff", + "id": "730ecc37", "metadata": {}, "outputs": [], "source": [ @@ -873,9 +939,19 @@ "# Use this cell for the exercise" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5302d86", + "metadata": {}, + "outputs": [], + "source": [ + "set(tortellini.namespaces()) - default_ns" + ] + }, { "cell_type": "markdown", - "id": "864f9f3e", + "id": "b7be61cc", "metadata": {}, "source": [ "💪: serialize the above graph in JSON-LD format" @@ -884,7 +960,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9c4cba3f", + "id": "a0114c99", "metadata": {}, "outputs": [], "source": [ @@ -892,9 +968,20 @@ "tortellini_jsonld = ..." ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "72b913d4", + "metadata": {}, + "outputs": [], + "source": [ + "tortellini_jsonld = tortellini.serialize(format=\"application/ld+json\")\n", + "print(tortellini_jsonld)" + ] + }, { "cell_type": "markdown", - "id": "4fce0d44", + "id": "42c8d2e8", "metadata": {}, "source": [ "💪: Load the JSON-LD object in a variable\n", @@ -906,19 +993,29 @@ { "cell_type": "code", "execution_count": null, - "id": "2455f12c", + "id": "d08cbe3e", "metadata": {}, "outputs": [], "source": [ "import json\n", "\n", - "# Use this cell for the exercise\n", - "..." + "# Use this cell for the exercise" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9089419d", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "data = json.loads(tortellini_jsonld)\n" ] }, { "cell_type": "markdown", - "id": "d12af273", + "id": "9df88769", "metadata": {}, "source": [ "💪: Get a voice from dbpedia\n", @@ -929,7 +1026,7 @@ { "cell_type": "code", "execution_count": null, - "id": "06693c64", + "id": "7c7d3816", "metadata": {}, "outputs": [], "source": [ @@ -945,7 +1042,7 @@ }, { "cell_type": "markdown", - "id": "975e804f", + "id": "b0fe7b28", "metadata": {}, "source": [ "We get a graph with the information about Tortellini." @@ -953,7 +1050,7 @@ }, { "cell_type": "markdown", - "id": "ab1d757b", + "id": "181a02b3", "metadata": {}, "source": [ "```mermaid\n", @@ -969,7 +1066,7 @@ }, { "cell_type": "markdown", - "id": "27161ac5", + "id": "ee7daef7", "metadata": {}, "source": [ "An encyclopedia voice contains a list of sentences :)" @@ -978,7 +1075,7 @@ { "cell_type": "code", "execution_count": null, - "id": "221cd062", + "id": "3d5aee78", "metadata": {}, "outputs": [], "source": [ @@ -990,7 +1087,7 @@ }, { "cell_type": "markdown", - "id": "748a85cf", + "id": "a989b46e", "metadata": {}, "source": [ "💪: counting sentences\n", @@ -1002,16 +1099,27 @@ { "cell_type": "code", "execution_count": null, - "id": "19349bf4", + "id": "1d13a711", "metadata": {}, "outputs": [], "source": [ "# Use this cell for the exercise" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "795aae40", + "metadata": {}, + "outputs": [], + "source": [ + "len(sentences)\n", + "set((len(x) for x in sentences))" + ] + }, { "cell_type": "markdown", - "id": "51a6b4b1", + "id": "7fc80b5b", "metadata": {}, "source": [ "----" @@ -1020,7 +1128,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19552fb6", + "id": "7a294686", "metadata": {}, "outputs": [], "source": [ @@ -1034,7 +1142,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3164ff47", + "id": "438a5a8d", "metadata": {}, "outputs": [], "source": [ @@ -1044,7 +1152,7 @@ }, { "cell_type": "markdown", - "id": "062d519d", + "id": "4fcf55f6", "metadata": {}, "source": [ "💪: extending graphs\n", @@ -1055,12 +1163,12 @@ { "cell_type": "code", "execution_count": null, - "id": "fad4dafa", + "id": "b8af9627", "metadata": {}, "outputs": [], "source": [ "from rdflib import Graph\n", - "from rdflib.namespace import RDFS\n", + "from pathlib import Path\n", "\n", "tortellini_url = \"https://dbpedia.org/data/Tortellini.n3/"\n", "tortellini_n3 = Path(\"Tortellini.n3\")\n", @@ -1072,7 +1180,7 @@ }, { "cell_type": "markdown", - "id": "2cd29d6c", + "id": "c313592a", "metadata": {}, "source": [ "And we can connect them together" @@ -1081,7 +1189,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b98ef1df", + "id": "55bf09b0", "metadata": {}, "outputs": [], "source": [ @@ -1093,7 +1201,7 @@ }, { "cell_type": "markdown", - "id": "d041bca8", + "id": "c4b3907f", "metadata": {}, "source": [ "Exercise: how many sentences are there now?" @@ -1102,16 +1210,26 @@ { "cell_type": "code", "execution_count": null, - "id": "609b8017", + "id": "c0118b89", "metadata": {}, "outputs": [], "source": [ "# Use this cell for the exercise" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "5275c828", + "metadata": {}, + "outputs": [], + "source": [ + "len(g)" + ] + }, { "cell_type": "markdown", - "id": "b601e028", + "id": "fd7d1ff2", "metadata": {}, "source": [ "Plot the graph again to see the new nodes and\n", @@ -1121,11 +1239,13 @@ { "cell_type": "code", "execution_count": null, - "id": "474903fc", + "id": "6065fbf8", "metadata": {}, "outputs": [], "source": [ "import tools\n", + "\n", + "# Increase the limit if you can't see intersections.\n", "tools.plot_graph(g, label_property=RDFS.label, limit=50, pattern=\".*/dbpedia.org\")" ] } diff --git a/sparql-101/notebooks/02-semantics.ipynb b/sparql-101/notebooks/02-semantics.ipynb index 5870754..a27ce2c 100644 --- a/sparql-101/notebooks/02-semantics.ipynb +++ b/sparql-101/notebooks/02-semantics.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "47f70b9e", + "id": "82d1e212", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -20,7 +20,7 @@ }, { "cell_type": "markdown", - "id": "7b885c8e", + "id": "e096dc31", "metadata": { "slideshow": { "slide_type": "subslide" @@ -41,7 +41,7 @@ }, { "cell_type": "markdown", - "id": "6966ba25", + "id": "a355ea28", "metadata": {}, "source": [ "```yaml\n", @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "f304af04", + "id": "70f9c11e", "metadata": {}, "source": [ "Is this a given name or a full name?\n", @@ -62,7 +62,7 @@ }, { "cell_type": "markdown", - "id": "eb4a5dbe", + "id": "98ce7856", "metadata": { "slideshow": { "slide_type": "subslide" @@ -76,7 +76,7 @@ }, { "cell_type": "markdown", - "id": "6199e60a", + "id": "46e5e4aa", "metadata": {}, "source": [ "```mermaid\n", @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "97a3d4d3", + "id": "417df745", "metadata": { "slideshow": { "slide_type": "subslide" @@ -107,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "b5e82d0a", + "id": "dd86770d", "metadata": {}, "source": [ "```mermaid\n", @@ -123,7 +123,7 @@ }, { "cell_type": "markdown", - "id": "da186fa7", + "id": "0dc44d45", "metadata": { "slideshow": { "slide_type": "subslide" @@ -143,7 +143,7 @@ }, { "cell_type": "markdown", - "id": "84e4be56", + "id": "2f784472", "metadata": {}, "source": [ "```json\n", @@ -155,7 +155,7 @@ }, { "cell_type": "markdown", - "id": "f83d3efd", + "id": "f4e2a5d5", "metadata": { "slideshow": { "slide_type": "subslide" @@ -169,7 +169,7 @@ }, { "cell_type": "markdown", - "id": "279a37cd", + "id": "20c250cb", "metadata": {}, "source": [ "```yaml\n", @@ -184,7 +184,7 @@ }, { "cell_type": "markdown", - "id": "632cea12", + "id": "375cd519", "metadata": {}, "source": [ "```yaml\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "ae371dd4", + "id": "5f6068ab", "metadata": { "slideshow": { "slide_type": "slide" @@ -216,21 +216,25 @@ }, { "cell_type": "markdown", - "id": "d022f20f", + "id": "cf3aed0d", "metadata": { "slideshow": { - "slide_type": "subslide" + "slide_type": "slide" } }, "source": [ - "----\n", + "---\n", "\n", - "An RDF dataset is a set of **graphs**." + "### Graphs and RDBMS\n", + "\n", + "An RDF dataset is a set of **graphs**.\n", + "\n", + "See the [RDF Dataset definition](https://www.w3.org/TR/rdf11-concepts/#section-dataset)." ] }, { "cell_type": "markdown", - "id": "db87dcb0", + "id": "b77282e5", "metadata": {}, "source": [ "```mermaid\n", @@ -274,7 +278,7 @@ }, { "cell_type": "markdown", - "id": "fe56a26a", + "id": "8112f788", "metadata": { "slideshow": { "slide_type": "subslide" @@ -283,7 +287,6 @@ "source": [ "----\n", "\n", - "### Graphs and RDBMS\n", "\n", "From a relationa perspective,\n", "you can see a dataset as a set of different tables\n", @@ -317,7 +320,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3a06d6e2", + "id": "d2d43467", "metadata": {}, "outputs": [], "source": [ @@ -328,42 +331,85 @@ }, { "cell_type": "markdown", - "id": "df3de5a0", + "id": "0a774b07", "metadata": {}, "source": [ "💪: dataset\n", "\n", - "- use the `Dataset.graphs` method to list the graphs in the dataset;\n", - "\n", + "- use the `Dataset.graphs` method to list the graphs in the dataset;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "621d413d", + "metadata": {}, + "outputs": [], + "source": [ + "list(d.graphs())" + ] + }, + { + "cell_type": "markdown", + "id": "e7d80563", + "metadata": {}, + "source": [ "- add a graph to the dataset." ] }, { "cell_type": "code", "execution_count": null, - "id": "1f485928", + "id": "a7d83a6c", "metadata": {}, "outputs": [], "source": [ "simpsons = d.graph(identifier=\"_:simpsons\")\n", - "simpsons.parse(\"simpsons.ttl\", format=\"turtle\")\n" + "simpsons.parse(\"simpsons.ttl\", format=\"turtle\")" ] }, { "cell_type": "markdown", - "id": "455dacfa", + "id": "eea180ec", + "metadata": {}, + "source": [ + "- list the graphs in the dataset again, together with their identifiers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "146e95c8", + "metadata": {}, + "outputs": [], + "source": [ + "graphs = list(d.graphs())\n", + "print(len(graphs))" + ] + }, + { + "cell_type": "markdown", + "id": "fe995623", + "metadata": {}, + "source": [ + "- get the `identifier` of one graph. What's its type?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfd58985", + "metadata": {}, + "outputs": [], + "source": [ + "[(g.identifier.n3(), type(g.identifier) ) for g in graphs]" + ] + }, + { + "cell_type": "markdown", + "id": "f5e3f122", "metadata": {}, "source": [ - "- list the graphs in the dataset again, together with their identifiers.\n", - "\n", - "\n", - "\n", - "\n", - "- get the `identifier` of one graph. What's its type?\n", - "\n", - "\n", - "\n", - "\n", "Now list the graphs in the dataset:\n", "note that the default graph does not contain triples." ] @@ -371,7 +417,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4f8d7032", + "id": "a4465a11", "metadata": {}, "outputs": [], "source": [ @@ -382,7 +428,7 @@ }, { "cell_type": "markdown", - "id": "afe05809", + "id": "3d568884", "metadata": { "slideshow": { "slide_type": "subslide" @@ -404,7 +450,7 @@ { "cell_type": "code", "execution_count": null, - "id": "eac33656", + "id": "a8037d3f", "metadata": {}, "outputs": [], "source": [ @@ -431,7 +477,7 @@ }, { "cell_type": "markdown", - "id": "e069b5e9", + "id": "3b045800", "metadata": {}, "source": [ "- Get the URIs representing Tortellini and Food using the `Graph.subjects` and `Graph.objects` methods." @@ -440,7 +486,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dd1da12b", + "id": "5a3b34ac", "metadata": {}, "outputs": [], "source": [ @@ -451,12 +497,22 @@ "print(*items, sep=\"\\n\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c4012bf", + "metadata": {}, + "outputs": [], + "source": [ + "subjects = set(g.subjects())\n", + "objects = set(g.objects())" + ] + }, { "cell_type": "markdown", - "id": "c2f06ea5", + "id": "acc04b33", "metadata": {}, "source": [ - "\n", "- what's the namespace of the `Tortellini` URI?\n", "- what's the namespace of the `Food` URI?\n", "- Open both URIs in a browser and check their content,\n", @@ -465,12 +521,64 @@ "\n", "## Ontologies and controlled vocabularies\n", "\n", - "Ontologies are used to standardize the semantics of digital content.\n", + "Data modeling specifications\n", + "(e.g., JSON Schema, XMLSchema, ... )\n", + "describe the syntax\n", + "of information." + ] + }, + { + "cell_type": "markdown", + "id": "62a8774d", + "metadata": {}, + "source": [ + "```yaml\n", + "# A JSON Schema\n", + "Person:\n", + " required: [name, surname]\n", + " properties:\n", + " name: { type: string, maxLength: 64 }\n", + " surname: { type: string, maxLength: 64 }\n", + " born_on: { type: string, format: date }\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "842d5a09", + "metadata": {}, + "source": [ + "Ontologies describe the semantics of digital content\n", + "in a given domain or ecosystem.\n", "\n", "- **Ontology**: a set of logical axioms\n", " that conceptualize a domain of interest\n", " by defining concepts (e.g., a `Person`)\n", - " and the semantics of relationships (e.g., `isParentOf`) between them.\n", + " and the semantics of relationships (e.g., `isParentOf`) between them." + ] + }, + { + "cell_type": "markdown", + "id": "e31e2741", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "An ontology:\n", + "\n", + "- is more generic than a JSON Schema or XMLSchema;\n", + "- applies to a domain (e.g., the fiscal domain, the healthcare domain)\n", + " and not to a specific service / API;\n", + "- may or may not describe the syntax details.\n", + "\n", + "A service can reference an ontology even if\n", + "property names do not match the predicates,\n", + "as long as the concept are the same\n", + "(i.e. I can map each JSON property to an ontology predicate).\n", "\n", "Example: the Italian ontology for person defines:\n", "\n", @@ -483,7 +591,7 @@ }, { "cell_type": "markdown", - "id": "d71c8475", + "id": "5ff5ae6c", "metadata": {}, "source": [ "```mermaid\n", @@ -510,24 +618,31 @@ "familyName & givenName ---->|range| xsd:string\n", "isParentOf -->|range| Person\n", "\n", - "\n", "```" ] }, { "cell_type": "markdown", - "id": "d14342ac", - "metadata": {}, + "id": "7b5ebd5e", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ + "---\n", + "\n", "- **Controlled vocabulary**: a vocabulary where the terms are validated by a designated authority.\n", " It can be of different types - e.g., a list (codelist), a hierarchical structure (taxonomy), a glossary and a thesaurus (which adds further constraints to a taxonomy).\n", "\n", + "We'll see a vocabulary of EU countries with their names and properties.\n", + "\n", "Examples of European controlled vocabularies are here " ] }, { "cell_type": "markdown", - "id": "27061e4a", + "id": "de663f08", "metadata": { "slideshow": { "slide_type": "subslide" @@ -538,6 +653,8 @@ "\n", "## Standard vocabularies\n", "\n", + "Vocabularies can contain predicates and their relations.\n", + "\n", "Standard vocabularies that are used to semantically describe data\n", "are:\n", "\n", @@ -550,11 +667,16 @@ }, { "cell_type": "markdown", - "id": "3320d2b0", + "id": "04f01747", "metadata": {}, "source": [ "```turtle\n", + "# Standard vocabularies.\n", "@prefix rdfs: .\n", + "@prefix rdf: .\n", + "@prefix xsd: .\n", + "\n", + "# Custom vocabulary.\n", "@prefix ex: .\n", "\n", "# The ex:Person Resource classifies a group of Resources.\n", @@ -562,19 +684,63 @@ "\n", "# ex:Alive classifies a group of ex:Person\n", "ex:Alive rdf:type rdfs:Class ;\n", - " rdfs:subClassOf ex:Person ;\n", + " rdfs:subClassOf ex:Person\n", " .\n", "\n", - "ex:givenName rdf:type rdf:Property ;\n", - " rdfs:domain ex:Person ;\n", - " rdfs:range xsd:string ;\n", + "ex:name rdf:type rdfs:Property ;\n", + " rdfs:domain ex:Entity ;\n", + " rdfs:range xsd:string\n", + " .\n", "\n", + "ex:givenName rdfs:subPropertyOf ex:name ;\n", + " rdfs:domain ex:Person ;\n", + " rdfs:range xsd:string\n", + " .\n", "```" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "39d81b6f", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Graph\n", + "import tools\n", + "\n", + "sentences = \"\"\"\n", + "@prefix rdfs: .\n", + "@prefix ex: .\n", + "@prefix xsd: .\n", + "@prefix rdf: .\n", + "\n", + "# The ex:Person Resource classifies a group of Resources.\n", + "ex:Person rdf:type rdfs:Class .\n", + "\n", + "# ex:Alive classifies a group of ex:Person\n", + "ex:Alive rdf:type rdfs:Class ;\n", + " rdfs:subClassOf ex:Person\n", + " .\n", + "\n", + "ex:name rdf:type rdfs:Property ;\n", + " rdfs:domain ex:Entity ;\n", + " rdfs:range xsd:string\n", + " .\n", + "\n", + "ex:givenName rdfs:subPropertyOf ex:name ;\n", + " rdfs:domain ex:Person ;\n", + " rdfs:range xsd:string\n", + " .\n", + "\"\"\"\n", + "g = Graph()\n", + "g.parse(data=sentences, format=\"turtle\")\n", + "tools.plot_graph(g)\n" + ] + }, { "cell_type": "markdown", - "id": "58021867", + "id": "c26e56a4", "metadata": {}, "source": [ "You can see vocabularies as a set of globally unique labels\n", @@ -587,10 +753,10 @@ }, { "cell_type": "markdown", - "id": "149b572f", + "id": "c21cc116", "metadata": {}, "source": [ - "```raw\n", + "```turtle\n", "@prefix ex: .\n", "\n", "ex:Person a rdfs:Class ;\n", @@ -608,7 +774,7 @@ }, { "cell_type": "markdown", - "id": "3b9e4835", + "id": "63b08cf6", "metadata": {}, "source": [ "## Ontologies in Italy\n", @@ -622,10 +788,10 @@ }, { "cell_type": "markdown", - "id": "7a393d8e", + "id": "f6e61711", "metadata": {}, "source": [ - "```raw\n", + "```turtle\n", "@prefix CPV: .\n", "\n", "\n", @@ -637,7 +803,7 @@ }, { "cell_type": "markdown", - "id": "f1769085", + "id": "f6dafa5b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -652,7 +818,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7d2f218b", + "id": "35dec9a3", "metadata": {}, "outputs": [], "source": [ @@ -690,7 +856,7 @@ }, { "cell_type": "markdown", - "id": "36f11e3d", + "id": "b46ea06b", "metadata": {}, "source": [ "\n", @@ -704,7 +870,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c655701b", + "id": "70c308e5", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/05-sparql.ipynb b/sparql-101/notebooks/05-sparql.ipynb index f333b18..958e985 100644 --- a/sparql-101/notebooks/05-sparql.ipynb +++ b/sparql-101/notebooks/05-sparql.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "66206576", + "id": "aa06055a", "metadata": {}, "source": [ "# SparQL 101\n", @@ -21,7 +21,7 @@ }, { "cell_type": "markdown", - "id": "10b18f26", + "id": "677de056", "metadata": { "slideshow": { "slide_type": "slide" @@ -40,7 +40,7 @@ }, { "cell_type": "markdown", - "id": "8a1f5a45", + "id": "c442f034", "metadata": { "slideshow": { "slide_type": "slide" @@ -73,7 +73,7 @@ { "cell_type": "code", "execution_count": null, - "id": "60929557", + "id": "d9714e66", "metadata": {}, "outputs": [], "source": [ @@ -83,7 +83,7 @@ }, { "cell_type": "markdown", - "id": "bc666342", + "id": "98529189", "metadata": {}, "source": [ "Exercise: list the graphs in the dataset." @@ -92,7 +92,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dd1841aa", + "id": "5dd3197c", "metadata": {}, "outputs": [], "source": [ @@ -101,7 +101,7 @@ }, { "cell_type": "markdown", - "id": "cb2d3995", + "id": "d88a3a67", "metadata": { "slideshow": { "slide_type": "subslide" @@ -117,7 +117,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a924cff2", + "id": "722c33c2", "metadata": {}, "outputs": [], "source": [ @@ -138,7 +138,7 @@ }, { "cell_type": "markdown", - "id": "74219020", + "id": "e724c8df", "metadata": { "slideshow": { "slide_type": "subslide" @@ -159,7 +159,7 @@ { "cell_type": "code", "execution_count": null, - "id": "73fbb2ea", + "id": "35ad0674", "metadata": {}, "outputs": [], "source": [ @@ -172,7 +172,7 @@ }, { "cell_type": "markdown", - "id": "05c95712", + "id": "b2795947", "metadata": {}, "source": [ "Use our utility function to print the graph." @@ -181,7 +181,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d067fbcb", + "id": "64b3bb98", "metadata": {}, "outputs": [], "source": [ @@ -192,7 +192,7 @@ }, { "cell_type": "markdown", - "id": "0604a7e7", + "id": "5fffc247", "metadata": {}, "source": [ "That's what we have" @@ -200,7 +200,7 @@ }, { "cell_type": "markdown", - "id": "b537a376", + "id": "cfc68600", "metadata": {}, "source": [ "```mermaid\n", @@ -217,7 +217,7 @@ }, { "cell_type": "markdown", - "id": "23dfa999", + "id": "b3ffdc2b", "metadata": {}, "source": [ "List all entries from th `_:sample` graph." @@ -226,7 +226,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3a13daaa", + "id": "bd734dd7", "metadata": {}, "outputs": [], "source": [ @@ -243,7 +243,7 @@ }, { "cell_type": "markdown", - "id": "47310a6b", + "id": "149dddd4", "metadata": {}, "source": [ "Exercise:\n", @@ -259,7 +259,7 @@ { "cell_type": "code", "execution_count": null, - "id": "66f13fd9", + "id": "3e9216b1", "metadata": {}, "outputs": [], "source": [ @@ -272,7 +272,7 @@ }, { "cell_type": "markdown", - "id": "58a20b8d", + "id": "70088f4f", "metadata": {}, "source": [ "- Replace `?subject` with `?foo`:\n", @@ -289,7 +289,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5633dcf8", + "id": "15461e16", "metadata": {}, "outputs": [], "source": [ @@ -308,7 +308,7 @@ }, { "cell_type": "markdown", - "id": "7e1e80a5", + "id": "766cc8b1", "metadata": {}, "source": [ "To restrict the query to a specific resource,\n", @@ -318,7 +318,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8cd4b236", + "id": "1fe20a4e", "metadata": {}, "outputs": [], "source": [ @@ -338,7 +338,7 @@ }, { "cell_type": "markdown", - "id": "3c530d2e", + "id": "50de1f78", "metadata": {}, "source": [ "We can use `FILTER` to restrict the results\n", @@ -348,7 +348,7 @@ { "cell_type": "code", "execution_count": null, - "id": "419b13ee", + "id": "0a7671f8", "metadata": {}, "outputs": [], "source": [ @@ -370,7 +370,7 @@ }, { "cell_type": "markdown", - "id": "d70c5645", + "id": "f8e286cd", "metadata": {}, "source": [ "### GROUP BY triples\n", @@ -382,7 +382,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d4cbe52d", + "id": "507e57db", "metadata": {}, "outputs": [], "source": [ @@ -402,7 +402,7 @@ }, { "cell_type": "markdown", - "id": "1095a5be", + "id": "3d92b8f7", "metadata": {}, "source": [ "Note that the count_ value references\n", @@ -417,7 +417,7 @@ { "cell_type": "code", "execution_count": null, - "id": "62bf0f45", + "id": "44433c74", "metadata": {}, "outputs": [], "source": [ @@ -427,7 +427,7 @@ }, { "cell_type": "markdown", - "id": "dde02425", + "id": "7ed0cfc5", "metadata": {}, "source": [ "### Multi-graph datasets\n", @@ -438,7 +438,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6f12f795", + "id": "4e64eeb3", "metadata": {}, "outputs": [], "source": [ @@ -448,7 +448,7 @@ }, { "cell_type": "markdown", - "id": "b50cd8d4", + "id": "c058c8da", "metadata": {}, "source": [ "That's what we have" @@ -456,7 +456,7 @@ }, { "cell_type": "markdown", - "id": "0595f779", + "id": "40bc0259", "metadata": {}, "source": [ "```mermaid\n", @@ -475,7 +475,7 @@ }, { "cell_type": "markdown", - "id": "8918575b", + "id": "4da2d2ad", "metadata": {}, "source": [ "### Querying the whole dataset\n", @@ -486,7 +486,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bd37e489", + "id": "0fb861b0", "metadata": {}, "outputs": [], "source": [ @@ -502,7 +502,7 @@ }, { "cell_type": "markdown", - "id": "21380e68", + "id": "32a39db2", "metadata": {}, "source": [ "Now, try to query each graph" @@ -511,7 +511,7 @@ { "cell_type": "code", "execution_count": null, - "id": "375a50ab", + "id": "a013765d", "metadata": {}, "outputs": [], "source": [ @@ -521,7 +521,7 @@ }, { "cell_type": "markdown", - "id": "e18791dc", + "id": "e4a31b0d", "metadata": {}, "source": [ ":warning: By default, the `Dataset` queries *the default graph*\n", @@ -531,7 +531,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b3564df8", + "id": "c111a1f5", "metadata": {}, "outputs": [], "source": [ @@ -547,7 +547,7 @@ }, { "cell_type": "markdown", - "id": "a8b21433", + "id": "f3029197", "metadata": {}, "source": [ "Now I can query all the graphs in the dataset" @@ -556,7 +556,7 @@ { "cell_type": "code", "execution_count": null, - "id": "44c863cc", + "id": "6a82a88c", "metadata": {}, "outputs": [], "source": [ @@ -572,7 +572,7 @@ }, { "cell_type": "markdown", - "id": "57650895", + "id": "4c6ba231", "metadata": {}, "source": [ "Query the classes used in the dataset." @@ -581,7 +581,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8e758384", + "id": "a86d331e", "metadata": {}, "outputs": [], "source": [ @@ -600,7 +600,7 @@ }, { "cell_type": "markdown", - "id": "187280c0", + "id": "abb878c7", "metadata": {}, "source": [ "Exercise:\n", @@ -612,7 +612,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8317dede", + "id": "c9a8f11d", "metadata": {}, "outputs": [], "source": [ @@ -631,7 +631,7 @@ }, { "cell_type": "markdown", - "id": "106f1bac", + "id": "a47bf0f6", "metadata": {}, "source": [ "Querying triples in a specific graph:" @@ -640,7 +640,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b7e96455", + "id": "6206fddf", "metadata": {}, "outputs": [], "source": [ @@ -659,7 +659,7 @@ }, { "cell_type": "markdown", - "id": "8f4edc9f", + "id": "01da25a9", "metadata": {}, "source": [ "💪 Exercise: querying the dataset\n", @@ -677,7 +677,7 @@ { "cell_type": "code", "execution_count": null, - "id": "900453b0", + "id": "1824fe46", "metadata": {}, "outputs": [], "source": [ @@ -688,7 +688,7 @@ { "cell_type": "code", "execution_count": null, - "id": "450881f1", + "id": "cf52b896", "metadata": {}, "outputs": [], "source": [ @@ -708,7 +708,7 @@ }, { "cell_type": "markdown", - "id": "081e053e", + "id": "aeb7c8fa", "metadata": {}, "source": [ "- query the `_:simpsons` graph\n", @@ -722,7 +722,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3b51e363", + "id": "cbfd90b2", "metadata": {}, "outputs": [], "source": [ @@ -743,7 +743,7 @@ }, { "cell_type": "markdown", - "id": "8d9f46ea", + "id": "058fe130", "metadata": { "slideshow": { "slide_type": "subslide" @@ -767,7 +767,7 @@ { "cell_type": "code", "execution_count": null, - "id": "61c6b3e4", + "id": "c88a8259", "metadata": {}, "outputs": [], "source": [ @@ -785,7 +785,7 @@ }, { "cell_type": "markdown", - "id": "545d343c", + "id": "33883962", "metadata": {}, "source": [ "The SparQL `UPDATE` command updates a graph.\n", @@ -795,7 +795,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1f5a5fb4", + "id": "a289722a", "metadata": {}, "outputs": [], "source": [ @@ -824,7 +824,7 @@ }, { "cell_type": "markdown", - "id": "92c56416", + "id": "4b8881ae", "metadata": {}, "source": [ "💪: check the graph" @@ -833,7 +833,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bb616f14", + "id": "41c21627", "metadata": {}, "outputs": [], "source": [ @@ -842,7 +842,7 @@ }, { "cell_type": "markdown", - "id": "96d84738", + "id": "ae886777", "metadata": {}, "source": [ "### The `/` and the `*` predicate modifiers\n", @@ -860,7 +860,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a0df356a", + "id": "b11407af", "metadata": {}, "outputs": [], "source": [ @@ -878,7 +878,7 @@ }, { "cell_type": "markdown", - "id": "3b743a37", + "id": "572fb8b8", "metadata": {}, "source": [ "In this case `foaf:name` has a very specific meaning.\n", @@ -893,7 +893,7 @@ }, { "cell_type": "markdown", - "id": "db9c0ad3", + "id": "d540b1d5", "metadata": { "slideshow": { "slide_type": "subslide" @@ -910,7 +910,7 @@ }, { "cell_type": "markdown", - "id": "8b842d80", + "id": "8f72c66a", "metadata": {}, "source": [ "```mermaid\n", @@ -933,7 +933,7 @@ { "cell_type": "code", "execution_count": null, - "id": "00847e19", + "id": "db38ef14", "metadata": {}, "outputs": [], "source": [ @@ -953,7 +953,7 @@ }, { "cell_type": "markdown", - "id": "3f76cb34", + "id": "1e08ca36", "metadata": {}, "source": [ "The `*` operator matches a predicate\n", @@ -970,7 +970,7 @@ { "cell_type": "code", "execution_count": null, - "id": "707e3392", + "id": "d21e877c", "metadata": {}, "outputs": [], "source": [ @@ -990,7 +990,7 @@ }, { "cell_type": "markdown", - "id": "970c7a27", + "id": "57e9df86", "metadata": {}, "source": [ "SparQL supports GROUP BY and ORDER BY clauses." @@ -999,7 +999,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8ca30575", + "id": "6513a9db", "metadata": {}, "outputs": [], "source": [ @@ -1023,7 +1023,7 @@ }, { "cell_type": "markdown", - "id": "712a8dc2", + "id": "80980098", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1039,7 +1039,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f524ce37", + "id": "59aaa12a", "metadata": {}, "outputs": [], "source": [ @@ -1065,7 +1065,7 @@ }, { "cell_type": "markdown", - "id": "96003994", + "id": "eda3d655", "metadata": {}, "source": [ "Since we are not interested in the `user2` variable,\n", @@ -1076,7 +1076,7 @@ { "cell_type": "code", "execution_count": null, - "id": "24b99fa1", + "id": "317234d9", "metadata": {}, "outputs": [], "source": [ @@ -1099,7 +1099,7 @@ }, { "cell_type": "markdown", - "id": "1a1a16a6", + "id": "8ff86149", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1115,7 +1115,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ea65f93c", + "id": "328e686c", "metadata": {}, "outputs": [], "source": [ @@ -1141,7 +1141,7 @@ }, { "cell_type": "markdown", - "id": "b330db69", + "id": "6163ee87", "metadata": {}, "source": [ "Exercise:\n", @@ -1152,7 +1152,7 @@ }, { "cell_type": "markdown", - "id": "0b8e2478", + "id": "77098854", "metadata": { "slideshow": { "slide_type": "slide" @@ -1174,7 +1174,7 @@ }, { "cell_type": "markdown", - "id": "9c0ae7d5", + "id": "5b3fa776", "metadata": {}, "source": [ "```sparql\n", @@ -1189,7 +1189,7 @@ }, { "cell_type": "markdown", - "id": "d153b3de", + "id": "a119458f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1203,7 +1203,7 @@ }, { "cell_type": "markdown", - "id": "83a4e4a2", + "id": "ee8ef490", "metadata": {}, "source": [ "```sparql\n", @@ -1220,7 +1220,7 @@ }, { "cell_type": "markdown", - "id": "e3f47eb9", + "id": "b69e9a9e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1234,7 +1234,7 @@ }, { "cell_type": "markdown", - "id": "c646ff20", + "id": "e89110bb", "metadata": {}, "source": [ "```sparql\n", @@ -1255,7 +1255,7 @@ }, { "cell_type": "markdown", - "id": "76808f4e", + "id": "b1f30cb6", "metadata": {}, "source": [ "... with their deathplaces" @@ -1263,7 +1263,7 @@ }, { "cell_type": "markdown", - "id": "2f07d588", + "id": "379735fa", "metadata": {}, "source": [ "```sparql\n", @@ -1285,7 +1285,7 @@ }, { "cell_type": "markdown", - "id": "a829eca8", + "id": "9a5a996d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1299,7 +1299,7 @@ }, { "cell_type": "markdown", - "id": "0577f3d5", + "id": "e111aabf", "metadata": {}, "source": [ "```sparql\n", @@ -1321,7 +1321,7 @@ }, { "cell_type": "markdown", - "id": "f494da60", + "id": "67e548a2", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1339,7 +1339,7 @@ }, { "cell_type": "markdown", - "id": "c8002759", + "id": "182af075", "metadata": {}, "source": [ "```sparql\n", @@ -1363,7 +1363,7 @@ }, { "cell_type": "markdown", - "id": "5cdaa048", + "id": "dd841e82", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1379,7 +1379,7 @@ }, { "cell_type": "markdown", - "id": "ed146041", + "id": "360eed31", "metadata": {}, "source": [ "```sparql\n", @@ -1405,7 +1405,7 @@ }, { "cell_type": "markdown", - "id": "4e4a3411", + "id": "95ec7175", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1419,7 +1419,7 @@ }, { "cell_type": "markdown", - "id": "794b5a22", + "id": "c7d6c9d5", "metadata": {}, "source": [ "```sparql\n", @@ -1445,7 +1445,7 @@ }, { "cell_type": "markdown", - "id": "7fa4be77", + "id": "64279728", "metadata": {}, "source": [ "## Closing question\n", diff --git a/sparql-101/notebooks/07-jsonld.ipynb b/sparql-101/notebooks/07-jsonld.ipynb index e39db72..142ef41 100644 --- a/sparql-101/notebooks/07-jsonld.ipynb +++ b/sparql-101/notebooks/07-jsonld.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "400d4d9f", + "id": "05db0517", "metadata": {}, "source": [ "# Agenda\n", @@ -26,7 +26,7 @@ }, { "cell_type": "markdown", - "id": "1c8b35da", + "id": "61e4ef9f", "metadata": {}, "source": [ "```yaml\n", @@ -39,7 +39,7 @@ }, { "cell_type": "markdown", - "id": "9a6eb9ea", + "id": "1c5b8815", "metadata": {}, "source": [ "We can then add identifiers (such as UUIDs or email), to be sure that cross references\n", @@ -48,7 +48,7 @@ }, { "cell_type": "markdown", - "id": "d9611879", + "id": "fbc45452", "metadata": {}, "source": [ "```yaml\n", @@ -61,7 +61,7 @@ }, { "cell_type": "markdown", - "id": "6d62c7cf", + "id": "b97369ac", "metadata": {}, "source": [ "Now we may have different datasets, such as the Springfield Elementary\n", @@ -71,7 +71,7 @@ }, { "cell_type": "markdown", - "id": "e6830de0", + "id": "3c907efb", "metadata": {}, "source": [ "```yaml\n", @@ -84,7 +84,7 @@ }, { "cell_type": "markdown", - "id": "11c36f4f", + "id": "6bd8ea88", "metadata": {}, "source": [ "So we actually store data, but we lack knowledge.\n", @@ -101,7 +101,7 @@ }, { "cell_type": "markdown", - "id": "c0b149d6", + "id": "369ecb51", "metadata": {}, "source": [ "----" @@ -110,7 +110,7 @@ { "cell_type": "code", "execution_count": null, - "id": "936233c5", + "id": "aad603f4", "metadata": {}, "outputs": [], "source": [ @@ -124,7 +124,7 @@ }, { "cell_type": "markdown", - "id": "90719874", + "id": "82d738a1", "metadata": {}, "source": [ "JSON-LD associates it with a context that disambiguates information" @@ -133,7 +133,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8ce8ae45", + "id": "37f97232", "metadata": {}, "outputs": [], "source": [ @@ -154,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a6d7820f", + "id": "b0990eb6", "metadata": {}, "outputs": [], "source": [ @@ -166,7 +166,7 @@ }, { "cell_type": "markdown", - "id": "b4b9e4cb", + "id": "c93c1975", "metadata": {}, "source": [ "Exercise:\n", @@ -178,7 +178,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d376e27e", + "id": "f1e5b20e", "metadata": {}, "outputs": [], "source": [ @@ -190,7 +190,7 @@ }, { "cell_type": "markdown", - "id": "4b7509fe", + "id": "d115de2b", "metadata": { "slideshow": { "slide_type": "slide" @@ -212,7 +212,7 @@ }, { "cell_type": "markdown", - "id": "2dc0549c", + "id": "0fa6fc0b", "metadata": { "slideshow": { "slide_type": "slide" @@ -227,7 +227,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d8afb99a", + "id": "cb5bc79c", "metadata": {}, "outputs": [], "source": [ @@ -241,7 +241,7 @@ }, { "cell_type": "markdown", - "id": "30c4a146", + "id": "8c3b2314", "metadata": {}, "source": [ "Annotate it with schema.org." @@ -250,7 +250,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cef0db52", + "id": "817ecccc", "metadata": {}, "outputs": [], "source": [ @@ -266,7 +266,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d15c72cf", + "id": "ca71f476", "metadata": {}, "outputs": [], "source": [ @@ -281,7 +281,7 @@ }, { "cell_type": "markdown", - "id": "4ee08e7e", + "id": "7d9b5dc0", "metadata": {}, "source": [ "Exercise:\n", @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "81a73869", + "id": "8fa07e34", "metadata": {}, "outputs": [], "source": [ @@ -316,7 +316,7 @@ }, { "cell_type": "markdown", - "id": "3a38e5f7", + "id": "daa5a352", "metadata": { "slideshow": { "slide_type": "slide" @@ -333,7 +333,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d5781c36", + "id": "ee492479", "metadata": {}, "outputs": [], "source": [ @@ -357,7 +357,7 @@ }, { "cell_type": "markdown", - "id": "c5583f77", + "id": "00c0443b", "metadata": {}, "source": [ "Now we can serialize the graph." @@ -366,7 +366,7 @@ { "cell_type": "code", "execution_count": null, - "id": "48448d94", + "id": "f1807607", "metadata": {}, "outputs": [], "source": [ @@ -378,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "38b2eaf9", + "id": "79ec1657", "metadata": {}, "source": [ "Another localization mechanism allows\n", @@ -388,7 +388,7 @@ { "cell_type": "code", "execution_count": null, - "id": "12b6aa02", + "id": "a7c060be", "metadata": {}, "outputs": [], "source": [ @@ -407,7 +407,7 @@ }, { "cell_type": "markdown", - "id": "3ba1d334", + "id": "73cd9cce", "metadata": { "slideshow": { "slide_type": "slide" @@ -432,7 +432,7 @@ }, { "cell_type": "markdown", - "id": "614adcc9", + "id": "583225f0", "metadata": {}, "source": [ "```yaml\n", @@ -444,7 +444,7 @@ }, { "cell_type": "markdown", - "id": "a8000e45", + "id": "fe58077a", "metadata": {}, "source": [ "Someone altering the \n", @@ -453,7 +453,7 @@ }, { "cell_type": "markdown", - "id": "572aec9c", + "id": "f7a6ed5d", "metadata": {}, "source": [ "```yaml\n", @@ -466,7 +466,7 @@ }, { "cell_type": "markdown", - "id": "9d615532", + "id": "3a147fd5", "metadata": {}, "source": [ "->" @@ -474,7 +474,7 @@ }, { "cell_type": "markdown", - "id": "5c744ad3", + "id": "9f3815c3", "metadata": {}, "source": [ "```yaml\n", @@ -487,7 +487,7 @@ }, { "cell_type": "markdown", - "id": "dcabdb2e", + "id": "9adcdd50", "metadata": { "slideshow": { "slide_type": "subslide" diff --git a/sparql-101/notebooks/10-rdf.ipynb b/sparql-101/notebooks/10-rdf.ipynb index 30fc427..59f4647 100644 --- a/sparql-101/notebooks/10-rdf.ipynb +++ b/sparql-101/notebooks/10-rdf.ipynb @@ -2,15 +2,27 @@ "cells": [ { "cell_type": "markdown", - "id": "6fb420ef", + "id": "17ffc1c9", "metadata": {}, "source": [ - "# Graph databases & SparQL\n", + "# Graph databases & SparQL" + ] + }, + { + "cell_type": "markdown", + "id": "bc217bd6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", "\n", "## Agenda\n", "\n", "- Storing and retrieving triples\n", - "- Using the `rdflib.Dataset` class\n", + "- The `rdflib.Dataset` class\n", "- Querying and traversing graphs\n", "\n", "*Beware*: commands may contain small typos. You must fix them to properly complete the course!" @@ -18,7 +30,7 @@ }, { "cell_type": "markdown", - "id": "fbf8f93c", + "id": "f0c6b6a0", "metadata": { "slideshow": { "slide_type": "subslide" @@ -31,13 +43,14 @@ "\n", "- JSON, YAML, xmlschema\n", "- HTTP, OpenAPI 3\n", - "- SQL and database hints" + "- SQL and database hints\n", + "- RDF & SparQL" ] }, { "cell_type": "code", "execution_count": null, - "id": "3c3a1abb", + "id": "4de2fa8f", "metadata": {}, "outputs": [], "source": [ @@ -46,7 +59,7 @@ }, { "cell_type": "markdown", - "id": "88200593", + "id": "30245ba0", "metadata": { "slideshow": { "slide_type": "slide" @@ -55,13 +68,15 @@ "source": [ "---\n", "\n", - "## Graphs (again)\n", + "## Graphs\n", "\n", "### RDF databases\n", "\n", + "An RDF Dataset is a set of RDF graphs.\n", + "\n", "An RDF graph is an (unordered) set of triples.\n", "\n", - "Each triple consists of a `subject`, `predicate`, `object`.\n", + "Each triple consists of an *ordered* $subject$, $predicate$, $object$.\n", "\n", "Graph databases such as:\n", "\n", @@ -69,14 +84,16 @@ "- [GraphDB (proprietary)](),\n", "- [Amazon Nepture (proprietary SaaS)]()\n", "\n", - "store triples into graphs.\n", + "store triples into graphs and datasets.\n", + "\n", + "They are *triple store*.\n", "\n", "They can be queried via [SparQL]()." ] }, { "cell_type": "markdown", - "id": "6c28ae88", + "id": "f7df59a5", "metadata": { "slideshow": { "slide_type": "subslide" @@ -99,7 +116,7 @@ }, { "cell_type": "markdown", - "id": "2e11962b", + "id": "33d428cf", "metadata": { "slideshow": { "slide_type": "subslide" @@ -108,9 +125,9 @@ "source": [ "----\n", "\n", - "## rdflib backends\n", + "### rdflib backends\n", "\n", - "We will simulate a graph database using\n", + "We will simulate a graph database locally using\n", "[rdflib](https://rdflib.readthedocs.io/en/stable/index.html).\n", "\n", "rdflib supports multiple backends to parse and store triples.\n", @@ -124,7 +141,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c2bc32bc", + "id": "30d1c241", "metadata": {}, "outputs": [], "source": [ @@ -135,58 +152,166 @@ }, { "cell_type": "markdown", - "id": "faa0cfa9", + "id": "b9b69487", "metadata": {}, "source": [ "Exercise:\n", "\n", - "- use the `Dataset.bind` method to bind the `eu` prefix to the\n", - " `https://publications.europa.eu/resource/authority/` namespace;\n", - "- use the `Dataset.graph` method to create the `eu:country` graph;" + "- list the graphs into the dataset\n", + " using SparQL (se the [05-sparql](05-sparql.ipynb))." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce12fb38", + "metadata": {}, + "outputs": [], + "source": [ + "result = d.query(\"\"\"\n", + "SELECT DISTINCT\n", + " ?g\n", + "WHERE {\n", + " GRAPH ?g {}\n", + "}\n", + "\"\"\")\n", + "\n", + "assert 'default' in str(result.bindings)" + ] + }, + { + "cell_type": "markdown", + "id": "dfdd3289", + "metadata": {}, + "source": [ + "- confront the query result with\n", + " the output of `Dataset.graphs`" ] }, { "cell_type": "code", "execution_count": null, - "id": "6e9ef154", + "id": "a823fdbd", + "metadata": {}, + "outputs": [], + "source": [ + "print(list(d.graphs()))" + ] + }, + { + "cell_type": "markdown", + "id": "79be2014", + "metadata": {}, + "source": [ + "Let's load into it the [European vocabulary for countries](countries.ttl).\n", + "\n", + "See also:\n", + "\n", + "- [EU Authority Tables](https://op.europa.eu/en/web/eu-vocabularies/authority-tables)\n", + "\n", + "- use `Dataset.bind` to bind the `eu` prefix to the\n", + " `https://publications.europa.eu/resource/authority/` namespace;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2a223bd", + "metadata": {}, + "outputs": [], + "source": [ + "d.bind(\"eu\", \"https://publications.europa.eu/resource/authority//")" + ] + }, + { + "cell_type": "markdown", + "id": "3924ec29", + "metadata": {}, + "source": [ + "Once the `eu` prefix is bound,\n", + "the dataset can expand cURIes.\n", + "Hint: see [01-knowledge](01-knowledge.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d263d2a", "metadata": {}, "outputs": [], "source": [ - "print(list(d.graphs()))\n", - "d.bind(\"eu\", \"https://publications.europa.eu/resource/authority//")\n", "eu_country_id = d.namespace_manager.expand_curie(\"eu:country\")" ] }, + { + "cell_type": "markdown", + "id": "e8833457", + "metadata": {}, + "source": [ + "- use `Dataset.graph` to create the `eu:country` graph." + ] + }, { "cell_type": "code", "execution_count": null, - "id": "af26bae1", + "id": "7e4582cd", "metadata": {}, "outputs": [], "source": [ "# Use the default backend\n", - "g = d.graph(eu_country_id)\n", + "g = d.graph(eu_country_id)" + ] + }, + { + "cell_type": "markdown", + "id": "33a57c3e", + "metadata": {}, + "source": [ + "Let's see the performance of the default\n", + "`turtle` parser ..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfecc183", + "metadata": {}, + "outputs": [], + "source": [ + "# Parsing takes ~30s.\n", "%time g.parse(\"countries-skos-ap-act.ttl\", format=\"text/turtle\")\n", - "print(\"The graph contains\", len(g), \"triples.\")" + "print(\"The graph contains\", len(g), \"triples.\")\n", + "\n", + "# Clean up.\n", + "del g\n", + "del d" + ] + }, + { + "cell_type": "markdown", + "id": "687deea7", + "metadata": {}, + "source": [ + "with respect to the `ox-turtle` parser." ] }, { "cell_type": "code", "execution_count": null, - "id": "14881b9c", + "id": "3bd043f8", "metadata": {}, "outputs": [], "source": [ "d = Dataset(store=\"Oxigraph\")\n", - "g = d.graph(eu_country_id)\n", + "country = d.graph(eu_country_id)\n", "# Use the ox-turtle parser.\n", - "%time g.parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")\n", - "print(\"The graph contains\", len(g), \"triples.\")" + "%time country.parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")\n", + "print(\"The graph contains\", len(country), \"triples.\")" ] }, { "cell_type": "markdown", - "id": "8c2977c7", + "id": "11b3765d", "metadata": {}, "source": [ "See also:\n", @@ -196,7 +321,7 @@ }, { "cell_type": "markdown", - "id": "a93f0e45", + "id": "1af361ad", "metadata": { "slideshow": { "slide_type": "slide" @@ -205,68 +330,103 @@ "source": [ "---\n", "\n", - "## SparQL practice\n", + "### Traversing the graph\n", "\n", - "Let's load into it the [European vocabulary for countries](countries.ttl).\n", + "`` contains more than countries." + ] + }, + { + "cell_type": "markdown", + "id": "efa205d9", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph\n", "\n", - "See also:\n", + "subgraph eu:country\n", + " eu:ITA((ITA))\n", + " eu:FRA((FRA))\n", + " eu:xx((...))\n", + "\n", + " eu:ITA-01((?))\n", + " eu:ITA-02((?))\n", + "\n", + " eu:FRA-01((?))\n", + " eu:FRA-02((?))\n", + " eu:FRA-03((?))\n", + "\n", + "eu:ITA -->|skos:narrower| eu:ITA-01 & eu:ITA-02\n", + "eu:FRA -->|skos:narrower| eu:FRA-01 & eu:FRA-02 & eu:FRA-03\n", + "end\n", "\n", - "- [EU Authority Tables](https://op.europa.eu/en/web/eu-vocabularies/authority-tables)" + "```" ] }, { "cell_type": "code", "execution_count": null, - "id": "4c6b0593", + "id": "dff9d674", "metadata": {}, "outputs": [], "source": [ - "from rdflib import Graph\n", + "# Shortcut for converting to curie.\n", + "to_curie = d.namespace_manager.curie" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d17d330f", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX country: \n", + "\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " country:ITA skos:narrower ?narrower .\n", + " ?narrower skos:prefLabel ?label .\n", + " FILTER (lang(?label) = \"en\")\n", + "}\n", + "\"\"\"\n", + "result = country.query(q)\n", "\n", - "# Let's create a graph.\n", - "g = Graph(store=\"Oxigraph\")\n", + "narrower = {to_curie(r.narrower): str(r.label) for r in result}\n", "\n", - "# And load into it the European\n", - "# vocabulary for countries.\n", - "g.parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")" + "print(*narrower.items(), sep=\"\\n\")" ] }, { "cell_type": "markdown", - "id": "39b56ab1", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "a52cd8ee", + "metadata": {}, "source": [ - "---\n", - "\n", - "### Traversing the graph\n", + "Exercise:\n", "\n", - "The Country graph contains more than countries." + "- run the above query replacing\n", + " `skos:narrower` with `skos:narrower*`;\n", + " what happens?" ] }, { "cell_type": "code", "execution_count": null, - "id": "fd70ca99", + "id": "b9fff728", "metadata": {}, "outputs": [], "source": [ - "to_curie = g.namespace_manager.curie\n", - "\n", "q = \"\"\"\n", "PREFIX country: \n", "\n", "SELECT DISTINCT *\n", "WHERE {\n", - " country:ITA skos:narrower ?narrower .\n", + " country:ITA skos:narrower* ?narrower .\n", " ?narrower skos:prefLabel ?label .\n", " FILTER (lang(?label) = \"en\")\n", "}\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = country.query(q)\n", "\n", "narrower = {to_curie(r.narrower): str(r.label) for r in result}\n", "\n", @@ -275,24 +435,50 @@ }, { "cell_type": "markdown", - "id": "3e743b6b", + "id": "2bb6f609", "metadata": {}, "source": [ - "Exercise:\n", - "\n", - "- run the above query replacing `skos:narrower` with `skos:narrower*`;\n", - " what happens?\n", "- run the above query using `country:FRA` and see what happens;\n", " then replace `skos:narrower` with `skos:narrower/skos:narrower`:\n", - " do you see the same number of results?\n", + " do you see the same number of results?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10ce55c1", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX country: \n", "\n", + "SELECT DISTINCT *\n", + "WHERE {\n", + " country:FRA skos:narrower/skos:narrower ?narrower .\n", + " ?narrower skos:prefLabel ?label .\n", + " FILTER (lang(?label) = \"en\")\n", + "}\n", + "\"\"\"\n", + "result = country.query(q)\n", + "\n", + "narrower = {to_curie(r.narrower): str(r.label) for r in result}\n", + "\n", + "print(*narrower.items(), sep=\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "aa9b6e0e", + "metadata": {}, + "source": [ "\n", - "The `*` operator is used to traverse the graph\n", - "and find all the nodes reachable from the starting node.\n", + "The `*` operator traverses the graph\n", + "and find all the nodes reachable from the starting node through a given relation.\n", "The `*` operator is not supported by all graph databases.\n", "\n", "\n", - "#### Creating a graph\n", + "### Creating a graph\n", "\n", "SparQL can create new graphs from an existing one." ] @@ -300,7 +486,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b171f7df", + "id": "084c57ef", "metadata": {}, "outputs": [], "source": [ @@ -326,13 +512,13 @@ " FILTER (lang(?label) = \"en\")\n", "}\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = country.query(q)\n", "list(result.graph)" ] }, { "cell_type": "markdown", - "id": "b5e15826", + "id": "ffb43ba8", "metadata": {}, "source": [ "Let's visualize the graph." @@ -341,31 +527,31 @@ { "cell_type": "code", "execution_count": null, - "id": "23d274f3", + "id": "7a97e06f", "metadata": {}, "outputs": [], "source": [ - "from tools import plot_graph\n", + "import tools\n", "from rdflib import SKOS\n", "\n", - "plot_graph(result.graph, label_property=SKOS.prefLabel)" + "tools.plot_graph(result.graph, label_property=SKOS.prefLabel)" ] }, { "cell_type": "markdown", - "id": "7a14f090", + "id": "d4c16a2f", "metadata": {}, "source": [ - "#### More metadata\n", + "## More metadata\n", "\n", "The Country graph contains more than countries ;)\n", - "the resource type is identified by the `lemon:context` property." + "the resource type is identified by the `` predicate." ] }, { "cell_type": "code", "execution_count": null, - "id": "30cff88a", + "id": "3b41a3d5", "metadata": {}, "outputs": [], "source": [ @@ -376,7 +562,7 @@ "\n", "SELECT DISTINCT\n", " ?broader\n", - " (COUNT(?narrower) AS ?count)\n", + " (COUNT(?narrower) AS ?count_)\n", "WHERE {\n", " ?broader\n", " skos:narrower+ ?narrower ;\n", @@ -390,48 +576,50 @@ " FILTER (lang(?label) = \"en\")\n", "}\n", "GROUP BY ?broader\n", - "ORDER BY ?count\n", + "ORDER BY ?count_\n", "\"\"\"\n", - "result = g.query(q)\n", - "list(result)" + "result = country.query(q)\n", + "[\n", + " {str(r.broader): str(r.count_)}\n", + " for r\n", + " in result\n", + "]" ] }, { "cell_type": "markdown", - "id": "fffedc09", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, + "id": "8ccfda7e", + "metadata": {}, "source": [ - "---\n", - "\n", - "## Datasets\n", - "\n", - "An RDF dataset is made of multiple graphs." + "In RDF, you don't have hierarchies,\n", + "just triples." ] }, { - "cell_type": "code", - "execution_count": null, - "id": "6df763ad", + "cell_type": "markdown", + "id": "c35aa2fb", "metadata": {}, - "outputs": [], "source": [ - "from rdflib import Dataset\n", + "```mermaid\n", + "graph\n", + "\n", + "eu:Country((eu:Country)) ~~~ eu:FRA & eu:ITA & eu:XLI & eu:XLL -.->|a| eu:Country\n", + "\n", + "eu:FRA & eu:ITA & eu:XLI & eu:XLL -->|skos:inScheme| eu:country\n", + "\n", + "linkStyle 8,9,10,11 stroke:green\n", + "\n", + "eu:ITA -->|skos:narrower| eu:XLI & eu:XLL\n", + "\n", + "linkStyle 12,13 stroke:blue\n", "\n", - "d = Dataset(store='Oxigraph')\n", - "# Add ns shortcuts.\n", - "d.bind(\"eu\", \"https://publications.europa.eu/resource/authority//")\n", - "d.bind(\"schema\": \"https://schema.org//")\n", - "d.bind(\"euvoc\": \"http://publications.europa.eu/ontology/euvoc#\")\n", + "eu:ITA & eu:FRA -->|lemon:context| context:COUNTRY\n", "\n", + "linkStyle 14,15 stroke:red\n", "\n", + "eu:country -.->|a| skos:ConceptScheme((skos:ConceptScheme))\n", "\n", - "d.graph(identifier=\"urn:People\").parse(data=json.dumps(nodes_ld), format=\"application/ld+json\")\n", - "d.graph(identifier=\"eu:country\").parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")\n", - "[len(x) for x in d.graphs()]" + "```" ] } ], diff --git a/sparql-101/notebooks/11-sparql-metadata.ipynb b/sparql-101/notebooks/11-sparql-metadata.ipynb index 2029348..7e2b34b 100644 --- a/sparql-101/notebooks/11-sparql-metadata.ipynb +++ b/sparql-101/notebooks/11-sparql-metadata.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "c91e5398", + "id": "62a56dd3", "metadata": {}, "source": [ "# Agenda\n", @@ -22,28 +22,39 @@ { "cell_type": "code", "execution_count": null, - "id": "50edc4ad", + "id": "ce896bc3", "metadata": {}, "outputs": [], "source": [ - "g=Graph(store=\"Oxigraph\")\n", + "from rdflib import Dataset\n", + "# Create a dataset...\n", + "d=Dataset(store=\"Oxigraph\", default_union=True)\n", "\n", - "# Load the graph.\n", - "g.parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")" + "# Bind the namespaces.\n", + "d.bind(\"euvoc\", \"http://publications.europa.eu/ontology/euvoc#\")\n", + "d.bind(\"skos\", \"http://www.w3.org/2004/02/skos/core#\")\n", + "d.bind(\"country\", \"http://publications.europa.eu/resource/authority/country//")\n", + "\n", + "# Create a graph for the countries.\n", + "country = d.graph(\"http://publications.europa.eu/resource/authority/country/")\n", + "\n", + "# Load data into it.\n", + "country.parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")" ] }, { "cell_type": "markdown", - "id": "2664dd4a", + "id": "8d905bfb", "metadata": {}, "source": [ - "And query the simplest metadata." + "And query the simplest metadata:\n", + "the `rdf:type`s of the graph's subjects" ] }, { "cell_type": "code", "execution_count": null, - "id": "369bccae", + "id": "dffc0765", "metadata": {}, "outputs": [], "source": [ @@ -54,26 +65,27 @@ " ?s a ?type .\n", "}\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = country.query(q)\n", "\n", "[r.type for r in result]" ] }, { "cell_type": "markdown", - "id": "4980e8f6", + "id": "5b0e943e", "metadata": {}, "source": [ - "We can simplify the above query\n", - "avoiding gathering `?s` at all\n", - "using the `[]` syntax\n", - "that matches anything." + "Since we are returning just `?type`,\n", + "we can avoiding gathering `?s`\n", + "using the `[]` placeholder.\n", + "\n", + "Try it!" ] }, { "cell_type": "code", "execution_count": null, - "id": "eb435c89", + "id": "3cb42a5d", "metadata": {}, "outputs": [], "source": [ @@ -84,14 +96,14 @@ " [] a ?type .\n", "}\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = d.query(q)\n", "\n", "[r.type for r in result]" ] }, { "cell_type": "markdown", - "id": "cbd15514", + "id": "761846c8", "metadata": {}, "source": [ "Exercise:\n", @@ -103,7 +115,7 @@ }, { "cell_type": "markdown", - "id": "e86dfbc8", + "id": "c9a65b74", "metadata": { "slideshow": { "slide_type": "subslide" @@ -119,12 +131,14 @@ { "cell_type": "code", "execution_count": null, - "id": "9e09b005", + "id": "20bb7dd9", "metadata": {}, "outputs": [], "source": [ "q = \"\"\"\n", - "SELECT DISTINCT *\n", + "SELECT DISTINCT\n", + " ?ConceptScheme\n", + " ?label\n", "WHERE {\n", " ?ConceptScheme\n", " a skos:ConceptScheme ;\n", @@ -133,26 +147,46 @@ " FILTER (lang(?label) = \"en\")\n", "}\n", "\"\"\"\n", - "result = g.query(q)\n", - "[r.asdict() for r in result]" + "result = d.query(q)\n", + "t = [r.asdict() for r in result]" ] }, { "cell_type": "markdown", - "id": "27ccb01c", + "id": "5c963a97", "metadata": {}, "source": [ "Exercise:\n", "\n", "- Rewrite the above query using\n", - " two sentences.\n", + " two sentences." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "979bde4a", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?ConceptScheme\n", + " ?label\n", + "WHERE {\n", + " ?ConceptScheme a skos:ConceptScheme .\n", + " ?ConceptScheme skos:prefLabel ?label .\n", + " FILTER (lang(?label) = \"en\")\n", + "}\n", + "\"\"\"\n", "\n", - "" + "result = d.query(q)\n", + "assert t == [r.asdict() for r in result]" ] }, { "cell_type": "markdown", - "id": "674655ce", + "id": "ce3c3a9e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -169,7 +203,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7d798f36", + "id": "4a12d685", "metadata": {}, "outputs": [], "source": [ @@ -179,28 +213,25 @@ " ?s ?p .\n", "}\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = d.query(q)\n", "[r.asdict() for r in result]" ] }, { "cell_type": "markdown", - "id": "3ac8c38b", + "id": "e9989a1b", "metadata": {}, "source": [ "Exercise:\n", "\n", "- Rewrite the above query using\n", - " the PREFIX directive.\n", - "\n", - "\n", - "" + " the PREFIX directive." ] }, { "cell_type": "code", "execution_count": null, - "id": "b0f071ed", + "id": "688fed99", "metadata": {}, "outputs": [], "source": [ @@ -213,13 +244,13 @@ "}\n", "LIMIT 6\n", "\"\"\"\n", - "result = g.query(q)\n", + "result = d.query(q)\n", "[r.asdict() for r in result]" ] }, { "cell_type": "markdown", - "id": "8ee79cc2", + "id": "5eb31008", "metadata": { "slideshow": { "slide_type": "slide" @@ -237,7 +268,7 @@ }, { "cell_type": "markdown", - "id": "9371b260", + "id": "e9b60b14", "metadata": {}, "source": [ "```mermaid\n", @@ -246,7 +277,7 @@ "skos:ConceptScheme\n", "skos:ConceptScheme -->|skos:prefLabel| _l1[/\"Concept Scheme\"/]\n", "\n", - "country:0005 -.->|a| skos:ConceptScheme\n", + "country:0005 -.->|a| skos:ConceptScheme((skos:ConceptScheme))\n", "country:0005 ---|skos:prefLabel| _l[/\"Current EU members\"/]\n", "\n", "country -.->|a| skos:ConceptScheme\n", @@ -259,7 +290,44 @@ }, { "cell_type": "markdown", - "id": "3d93cd9d", + "id": "3c37f8f4", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Now, let's get the predicates associated with resources\n", + "of a given type." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a54311b9", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?type ?p\n", + "WHERE {\n", + " [] a ?type ;\n", + " ?p []\n", + " .\n", + " FILTER (?p != rdf:type)\n", + "}\n", + "\"\"\"\n", + "\n", + "result = d.query(q)\n", + "{ r.type: r.p for r in result }" + ] + }, + { + "cell_type": "markdown", + "id": "c0cfc512", "metadata": { "slideshow": { "slide_type": "slide" @@ -275,7 +343,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2ca59444", + "id": "2db4be00", "metadata": {}, "outputs": [], "source": [ @@ -298,7 +366,7 @@ }, { "cell_type": "markdown", - "id": "99aacbd0", + "id": "05ad97bf", "metadata": {}, "source": [ "Exercise:\n", @@ -312,7 +380,7 @@ }, { "cell_type": "markdown", - "id": "0ca79488", + "id": "104f1b38", "metadata": { "slideshow": { "slide_type": "slide" @@ -328,7 +396,7 @@ }, { "cell_type": "markdown", - "id": "3f492d65", + "id": "4483aa1b", "metadata": { "slideshow": { "slide_type": "slide" @@ -348,7 +416,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3114ad91", + "id": "046bd31f", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +433,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1a59247e", + "id": "78c3d78e", "metadata": {}, "outputs": [], "source": [ @@ -389,7 +457,7 @@ }, { "cell_type": "markdown", - "id": "fc1c8ace", + "id": "67977410", "metadata": {}, "source": [ "Now we will infer how countries are modeled\n", @@ -408,7 +476,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b740c2bd", + "id": "67b9f084", "metadata": {}, "outputs": [], "source": [ @@ -428,7 +496,7 @@ }, { "cell_type": "markdown", - "id": "abc1d6df", + "id": "7d41421e", "metadata": {}, "source": [ "The data model extracted from the graph:\n", @@ -439,7 +507,7 @@ }, { "cell_type": "markdown", - "id": "e3db17c5", + "id": "8f57c169", "metadata": {}, "source": [ "```mermaid\n", diff --git a/sparql-101/notebooks/12-enriching-data.ipynb b/sparql-101/notebooks/12-enriching-data.ipynb index e2c3478..51c6868 100644 --- a/sparql-101/notebooks/12-enriching-data.ipynb +++ b/sparql-101/notebooks/12-enriching-data.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "11cbb725", + "id": "685f3d33", "metadata": {}, "source": [ "# Agenda\n", @@ -26,7 +26,7 @@ }, { "cell_type": "markdown", - "id": "71985724", + "id": "1b3ea697", "metadata": { "slideshow": { "slide_type": "subslide" @@ -57,14 +57,15 @@ "| | Marge | Simpson ||\n", "| | Bart | Simpson |\n", "\n", - "With RDF, there is no fixed schema.\n", - "Instead, we have a public set of predicates\n", - "that can be used to describe the same entity." + "With RDF, there is no fixed syntactic schema.\n", + "Instead, we describe resources\n", + "using a public set of predicates\n", + "(`rdf:Property`es)." ] }, { "cell_type": "markdown", - "id": "aa05150a", + "id": "32763e77", "metadata": {}, "source": [ "```mermaid\n", @@ -97,17 +98,7 @@ }, { "cell_type": "markdown", - "id": "7df3aa4b", - "metadata": {}, - "source": [ - "Storing data in a graph allows to use\n", - "a set of predefined predicates (see them as properties)\n", - "that are globally defined." - ] - }, - { - "cell_type": "markdown", - "id": "c44d981c", + "id": "015a94fc", "metadata": { "slideshow": { "slide_type": "slide" @@ -116,17 +107,19 @@ "source": [ "---\n", "\n", + "Let's contextualize some data\n", + "like we did in [07-jsonld](07-jsonld.ipynb).\n", + "\n", "Start with a json dataset." ] }, { "cell_type": "code", "execution_count": null, - "id": "d4b4bfaf", + "id": "59865da3", "metadata": {}, "outputs": [], "source": [ - "\n", "data = [\n", " {\"email\":\"ft@a.test\", \"name\": \"Francisca\", \"surname\": \"Trujillo\", \"country\": \"ES\"},\n", " {\"email\":\"mr@a.test\", \"name\": \"Mario\", \"surname\": \"Rossi\", \"country\": \"IT\"},\n", @@ -137,16 +130,16 @@ }, { "cell_type": "markdown", - "id": "43721665", + "id": "eae85033", "metadata": {}, "source": [ - "Add a context to the dataset." + "Add a context to map the keys to IRIs." ] }, { "cell_type": "code", "execution_count": null, - "id": "edd826a5", + "id": "e59e54ad", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +158,7 @@ }, { "cell_type": "markdown", - "id": "57acff38", + "id": "5ccbfb86", "metadata": {}, "source": [ "Now assemble everything in a JSON-LD graph" @@ -174,7 +167,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8e7b7759", + "id": "b9bc5a9c", "metadata": {}, "outputs": [], "source": [ @@ -187,7 +180,7 @@ }, { "cell_type": "markdown", - "id": "471df2e9", + "id": "9d47b64e", "metadata": {}, "source": [ "Exercise:\n", @@ -198,7 +191,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5b2cf5b2", + "id": "cafa6de0", "metadata": {}, "outputs": [], "source": [ @@ -211,32 +204,50 @@ }, { "cell_type": "markdown", - "id": "592ab468", + "id": "7f6ef27c", "metadata": {}, "source": [ - "And create a dataset and bind the selected namespaces." + "Now create a dataset." ] }, { "cell_type": "code", "execution_count": null, - "id": "8302ec41", + "id": "54da4cb7", "metadata": {}, "outputs": [], "source": [ "from rdflib import Dataset\n", "\n", - "d = Dataset(store='Oxigraph')\n", + "# Remember the default_union option.\n", + "d = Dataset(store='Oxigraph', default_union=True)" + ] + }, + { + "cell_type": "markdown", + "id": "91e16d60", + "metadata": {}, + "source": [ + "and bind the selected namespaces" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50da8a2e", + "metadata": {}, + "outputs": [], + "source": [ "# Add ns shortcuts.\n", "d.bind(\"eu\", \"https://publications.europa.eu/resource/authority//")\n", "d.bind(\"schema\": \"https://schema.org//")\n", "d.bind(\"euvoc\": \"http://publications.europa.eu/ontology/euvoc#\")\n", - "d.bind(\"my\": \"https://a.test/my#\")\n" + "d.bind(\"my\": \"https://a.test/my#\")" ] }, { "cell_type": "markdown", - "id": "aaf8b9f5", + "id": "518f0b96", "metadata": {}, "source": [ "Exercise:\n", @@ -247,41 +258,94 @@ { "cell_type": "code", "execution_count": null, - "id": "d340e83a", + "id": "bd4497ea", + "metadata": {}, + "outputs": [], + "source": [ + "list(d.graphs())" + ] + }, + { + "cell_type": "markdown", + "id": "65461b89", + "metadata": {}, + "source": [ + "Now load the JSON-LD data into a graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd3ad003", "metadata": {}, "outputs": [], "source": [ "import json\n", "# Create a people graph and add the entries\n", - "d.graph(identifier=\"urn:People\").parse(data=json.dumps(nodes_ld), format=\"application/ld+json\")" + "people = d.graph(identifier=\"urn:People\")\n", + "people.parse(data=json.dumps(nodes_ld), format=\"application/ld+json\")" ] }, { "cell_type": "markdown", - "id": "4653cea2", + "id": "4db3cf56", "metadata": {}, "source": [ "Exercise:\n", "\n", - "- list the triples in the dataset;\n", - "- list the triples in the `urn:People` graph;\n", - "\n", + "- list the triples in the dataset;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0dbffcb", + "metadata": {}, + "outputs": [], + "source": [ + "[t for t in d]" + ] + }, + { + "cell_type": "markdown", + "id": "59a88642", + "metadata": {}, + "source": [ + "- list the triples in the `urn:People` graph;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "60503a6c", + "metadata": {}, + "outputs": [], + "source": [ + "[t for t in people]" + ] + }, + { + "cell_type": "markdown", + "id": "cc311ad7", + "metadata": {}, + "source": [ "Load the countries vocabulary in a new graph." ] }, { "cell_type": "code", "execution_count": null, - "id": "9786b85a", + "id": "82b6311c", "metadata": {}, "outputs": [], "source": [ - "d.graph(identifier=\"eu:country\").parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")" + "country = d.graph(identifier=\"eu:country\")\n", + "country.parse(\"countries-skos-ap-act.ttl\", format=\"ox-turtle\")" ] }, { "cell_type": "markdown", - "id": "249e3b22", + "id": "4981e6af", "metadata": {}, "source": [ "Now we have a graph to enrich with external data.\n", @@ -294,7 +358,7 @@ { "cell_type": "code", "execution_count": null, - "id": "df0d3e93", + "id": "3949b0e8", "metadata": {}, "outputs": [], "source": [ @@ -329,14 +393,14 @@ }, { "cell_type": "markdown", - "id": "3af13f01", + "id": "ac9e24d2", "metadata": {}, "source": [ "Exercise:\n", "\n", "- Replace `` with `?g`: what happens?\n", "- Can you replace both GRAPHs values with `?variables`?\n", - "- See the [string to datatype (STRDT) docs]\n", + "- See the [string to datatype (STRDT) docs](https://www.w3.org/TR/sparql11-query/#func-strdt)\n", "\n", "If that's OK, we can update the graph with the country identifier." ] @@ -344,7 +408,7 @@ { "cell_type": "code", "execution_count": null, - "id": "abcc707d", + "id": "d0324993", "metadata": {}, "outputs": [], "source": [ @@ -379,7 +443,7 @@ }, { "cell_type": "markdown", - "id": "322329c2", + "id": "46fe071b", "metadata": {}, "source": [ "Now we can see the country identifier in the graph." @@ -388,7 +452,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b45019dc", + "id": "ce9e6aaf", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "b63a208a", + "id": "b6f1c90e", "metadata": {}, "source": [ "Now, we can even have a \"fat\" graph with all the information" @@ -406,12 +470,13 @@ { "cell_type": "code", "execution_count": null, - "id": "edf69f5f", + "id": "353d364e", "metadata": {}, "outputs": [], "source": [ - "q = \"\"\"\n", + "q_country = \"\"\"\n", "PREFIX euvoc: \n", + "\n", "INSERT {\n", " GRAPH {\n", " ?p my:countryName ?countryName .\n", @@ -426,12 +491,33 @@ " FILTER ( LANG(?countryName) = \"en\" )\n", "}\n", "\"\"\"\n", - "d.update(q)\n" + "d.update(q_country)\n" + ] + }, + { + "cell_type": "markdown", + "id": "7a57a73a", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- in the first query, replace `?country` with `_:country`: does it work?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09d17c46", + "metadata": {}, + "outputs": [], + "source": [ + "q = q_country.replace(\"?country\", \"_:country\")\n", + "d.update(q)" ] }, { "cell_type": "markdown", - "id": "ab0a3e0c", + "id": "6c250d1c", "metadata": {}, "source": [ "We can also mangle the data a bit..." @@ -440,7 +526,7 @@ { "cell_type": "code", "execution_count": null, - "id": "86b19d99", + "id": "f143fa2a", "metadata": {}, "outputs": [], "source": [ @@ -465,27 +551,47 @@ " )\n", "}\n", "\"\"\"\n", - "d.update(q)\n", - "\n" + "d.update(q)" ] }, { "cell_type": "markdown", - "id": "535f7fdc", + "id": "b0105f52", "metadata": {}, "source": [ "Exercise:\n", "\n", - "- replace `?country` with `_:country`: does it work?\n", - "- replace the two sentences with the following **one**: does it work?" + "- write a SELECT query replacing the sentences" + ] + }, + { + "cell_type": "markdown", + "id": "43941918", + "metadata": {}, + "source": [ + "```turtle\n", + "?p a :Person ;\n", + " :nationality _:country\n", + ".\n", + "\n", + "_:country skos:notation ?prefix .\n", + "```" ] }, { "cell_type": "markdown", - "id": "8f0317bd", + "id": "299b9adf", "metadata": {}, "source": [ - "```raw\n", + "with the following **one**: does it work?" + ] + }, + { + "cell_type": "markdown", + "id": "57e0b26d", + "metadata": {}, + "source": [ + "```turtle\n", "?p a :Person ;\n", " :nationality [\n", " skos:notation ?prefix\n", @@ -493,6 +599,33 @@ ".\n", "```" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61dc33f2", + "metadata": {}, + "outputs": [], + "source": [ + "SELECT DISTINCT\n", + " *\n", + "WHERE {\n", + " ?p a :Person ;\n", + " :nationality [\n", + " skos:notation ?prefix\n", + " ]\n", + " .\n", + " # We want the country name in English.\n", + " FILTER ( DATATYPE(?prefix) = euvoc:PHONE_PREFIX )\n", + "\n", + " # Bind a modified value to the variable ?plus_prefix.\n", + " BIND (\n", + " CONCAT(\"+\", str(?prefix)) AS ?plus_prefix\n", + " )\n", + "}\n", + "\"\"\"\n", + "d.query(q).bindings" + ] } ], "metadata": {}, diff --git a/sparql-101/notebooks/countries-skos-ap-act.ttl.gz b/sparql-101/notebooks/countries-skos-ap-act.ttl.gz new file mode 100644 index 0000000000000000000000000000000000000000..df77b8e7121a120db218bccb98d6330bb5e28edf GIT binary patch literal 3525163 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 Hz(ZUH-6{g|}M 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 z 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

bQl2ZeHh8#T$<$R|_K0 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%0DrwuIL-Z!R3;;U7Zhc^XTE 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%0Dw9Z1$3>?hZ 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Íxx0u~?&TH!(nrlHFioGX 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 @7*XNgTArntONT815k%_p zHX3;+q^A^gYS5p|SxB6C?$C&YW(S&#Zkv*ax4YdAws#6(nYf%f$L}# zP!Kd2rF>RVduT8;rXO>)Z?~a3?pvun&W`Cg+##B)srJcR$g&h`9}{)0T?lELiE}Le z18kWB9rJ?;$guo;^?JQvz`PN!t2u@XD=~tz{rIVGP}*e}kCI^_wid-G*DICMaDurc zMoIzP2N&Ic)=cZ6#V#~w%_2`yRa+HZDT)|Fyhn*+h=NGWE?|L5hM2`9i_ol7H_yQN zJOAGP(MgQlbUE|3TeOL6BF18Pi4MYqfYJ)Hm=Fu5urwYZFs|}e(C$Cwo97m*sBrsF z`tDiZZa~w;t6P|@Go5fN?HEax;!K5v7$Z|gv@#^Pm;?Kma}gp%UdGjhMh(r*{DmR@ zx7ppBd-txDUMZN|#GEHcV9~4cm@!+f1a?d^Em0Pjk37DuTA@1R8_-VcbH~v}tnh=7 z*?!uMVbca7mZGb0keUY0gTmmMNlR)i0s;s@R!sadG+WgPIOm(KnX7$*GpqITD+ZKE zgmln`TIm#{pqWOL8?Albg!V$+XzV|7=Y~IbE=u6^Vtc+*EmqG%ZCk^BcGlLnV{Ls~ zB2=nF04XOXSQ(|AXBrdbfddMZ@GO#u*I~ib=SEh#hAJQ|EpjD0MRPi}>C~|BN|7`W z3Wvs5CVI17-Pk*%ek9FRZu|NBZiq70qFt4gvw&Ri4rOxC*U?8hs7^!O=>1F6C6>MOvxIL#Xh#dN6kSWTQIZSd z33!gBHPXqL9E6B@9-+`DcW>T%>+a3F-`)Go-7g13cVFJUS>63;KwtCW-LLNbCJp>8 zuJV9y8&Tm*k46k(X2VsiS%x^m)8-0Bv?I!S7fp!sz=F=&Kr?ilaJbWGErH#_Zfw_r zxZQ;JW>-Frql)1f)*A zxdT0Fwa@(R3BO=`yK}ZazfK$Ci##^=WHYIzS6CRl!V>|!a;Zm8KOXT&uNVJ8vwm}> zqvlCowSB(Tj+eOKwA_W~4!?F{P7J?%JF#O-{<7)Eo;z{)#G%8d{;n7qj1|&?d*lW^ z6v0TWlqZNqtDa@QU-k>WS$9`9mux&|o$h3Q3i@K!%dZqrl4e8Gkt&Y&S&#wCz>%;d zA{(+y_Izr!+uyAh;!9U9rjPSch3ol< zg|<`@f{l{_QEIXd+%Np7o%7vM%eZH7Z*h08mtQHMTq22`7%s`^U<3ysj}FmydSB&$?=dSwKe1uoPR(DMA5L zX=8@RIe-nR>r&yEjAtD!on5MTRSm!@jXpp9=8?@SHM_(R zoP5H{&PLcuHOX-W27pKVAh1FtP>K!4gvHzRKw_X1 zk-~Hw3b4Tv*%78~C)yOY#;I79h_Kju>Xa6NNGt?GfVgxqd|;Dt*I<%d$dnA*&y6J> zq625QW5f1y<)lMtj~Gd-LI9%>0|jcd!%T6JV)?96LcP>#&u9UkG>Bg-y;3kG5{?_I zgP>g6Xv!HA&PyI*+MRX4-~Y${t^T$C)&7nCm;KM9p}4-Tz_Sb6h^AWya~laaMW$G1 zuoE%!qnHPWIZxDq%Ftkhws|D4gX+T2G}cT>c1%fDp(xdg#1m_Rq*O6N2_afJ7D9{* z2~k-`2FD+7@a=t34NkYlbL{Iu?QZO1?mbrx*hGfK*jnqgWj4^DRY(-FBm}I4vI1v$ zi9^0w$4hCqHiuIVmKIaAH{hIL{_?TtN>S8GA!@Ztq=PYJx~>lYth|KQJW{qo_p?;c+Nb@lMt z_YbdKdU)-Vhu44g@cLW(4s_}a-XVklv%Fc9W3A?5^GqjR)O-qF=FaynH@AoYS3-upa&PBFfSZf4 z7-4LpCC63=Y^`%a%3v{;1VDtWVbWvCtF)e#86$#H&5=ySapVdkHWE)${SF>KefZSL zgDEh{(Za`27pq-x-fG4ZyEzdAaf7s=)MBGh*51;g9`_fb!r6B3atej27rjdtoXChy z`t#7(K+600kaFezrsF%r*Xl(KIi5N(&@mkiUe{dVNk;nPP??b;LV6HlmIYv3wX9*4A4f~7?ZTreEG;+#m& zRZx%>7|4yhQV^Jy9nGlm8I%uh}QFEAKRx1QTB$B$U z{PzUh{s>mOwl*g)TR8=tlB4XYiH6sTt`Nz9K@f+f!6;2H>NLB^Kq)Dt;#m=JX9*ex z+OBRu-AuLFu%U7>t4(b&2r){ArNA6_L)+jh7fv|=rC0&!#swlPt(j;X;RhY1=vo~1>rTp34}qM11d)uFlri{mLoB}+W+ zc#j-mO-eelQIMr53r+r-5~KCXmjQ2>U0{ktB(6l z*YE1nuHl??a1w&Yd8Q4e)tw?Y-o6Hid=)6wR_QHKT2XET=0+KTu}je-k3nTt@9aux z7uxl_?^efP!L(c&%o%qS!dKc`XY)-PD&(WYScH zuiKs8m3;@!jNz8wTQh6<$6Ld~D@9T>Obz4I7~{DDK`{VGjlE?u%d^bES!hG`inX=# z%`P-?C@PK9Rxp-z9CZTj+-!B~R;N1MYQzv@@ZlUZ z;^SYveDLRgJw&TH)1V#Gpe&S%b;$`T9HO3rk)9w!Eyp}Y5g<_3#QUqzNU2n3em5)3 zP)F~8Gj^|3u=9Q3D$J!C=UH%IQ7Uf+f~nNfD6i9AB<`}Bv=2rcp;I-XYWCi*7kXFP zy(=wywhO&0)xkCxuxDWwzD`WJkSo}VihFcl_9p{S7|tM5O0Oo%RNf9K8mjPLsS@taJg8jvOD$|+Frho|U)YQ0sqs*hY6xc7 z8N!e=oM^5T4afj7TqCg&=HypI^~QGFNtL$!tB9U^eNPIaXO>Q1J#pd6n4)NU!%{Ga zMw}W=FfgnKc}8YMK-wxIvUrnBnju>Is5{c)IP>w^3@lvQB)n26sZ_#J28d#b6o95m z1BMv-5T2Dj=s}%UdCfQAl|VXHh^5eSBM8$$5knP-_;B)QEiLyJS&>!WfyYJgW-#90 z9bre9cQ4Fn_rf^fO0`K~>$UKK^JxAtQA{9UA!sQi%IX?CyLt=i-egMrw5C{0E(yOx z4)=5u49~<@3Z=3xo!!@Tv zreqT0j)GFGD1mZ;Bxk~M!zjj-rnU4j&{ih1=OYbL{mrCp^9O4XZDkOSJ^tH+emOK| zs%kHw|JmTm=~vMO-#BymwUcL-PMkY-X7SXe$!EwAc%_=;7z!>PBHANx$a&>JaG*jH zYtVE7xky}TlXs)+V~g^oD|-}?U${!K5LfZlW9KfucI+x0*Rh=5ybu{oC;~7#2Is^Q zE~!Y(1;~Zew4CLsEj{jNPwQ0v7Mf}iZjYZ0nCHMJW=gjeV=2M{aiwv5(sT&OD4~t@ z#&C>{v{}dfap)LuV_VYa;rh-Trdz~U3@7$p;h>$ANTkC!2q}Yuz_7_GyT?!Uok6VE znNt`(S4M5K{7L~eNGKaaW6xPcRyu2J46Qf;pgPOT>b09|X{Y)SPxXOprI>5pD_15b z{)T}rRy(gbb<}YpgAg&Y2QN7G1Z#}L7MHA`;`NUk|Nh9CCaq&=y1lx$nr_s$d=;Oe zPJJWXs&Cx!onKU^Ytu=)*Ww?K$Gh!T?VG-H$NO$|&70_S|9t598F!WsmgbJ5VjuFE zcI`Gw#qZ-&4s6i9$$09ZveNqCH5imPi+!<^-Vf~cUUjT-YoB-Kohws2UE9d86x$#i z^F)9qgm}xSw#axY0R@b*Jgz5WN4}|+R-?MY%8r~-Y2Ibe7YiIDY`2kNF}6xOplKw6 zDT-`b7;OwfF>Er_9^hfy%U3SFxJY*J=EcZBw5VwfuYmwkP;H3A$VtHiWJR)Xwwnj< zR*hfnb;is)3@`nlQ>=zXeU7Npt0j2 z5UzYyz#3V|>V@*VUxmS00 zm}=yMeGiA^u+A@Y?S{~cH3zu!fMQIfIW`6e)r@+_Wc1XtW+3~YJ$(D&`&C*m*uP)( z|Ed3Z|I7Y&RsUb(58jEd{!jmY|GRywn9U>VS58kZnq|XPs#%;zza$0&MqnqA)hQ^j zI2ezV%8CirKV1Lf(J$Bk6hjnqZI`v@#NS^!bMD-k6O*P}aN-a=EG5@`tF;-HVl4?F zrRzy_XORW%HRhTH6_`Ydu{Z~u7r$9wVP{*T|q&woC0^!n||pz5&;eO^XT^Xa9> zO0g7MfgHk;5^049EG?cyoJ&wnGMja_oN)^$p{ZBmc{e<%J3Eo(%s;Fn5-i13DomN; zS`!(RC5nPo0Lohmc`@g;=*V%O(TcDHKP=Jt(l`V(}(bT?jd?VIsyw{2@^)!pdrq?g?f-@?k;-RpztyTk}$ zx2FT%+3F9Ol8vUkNefQr>5E}4+7;wV^-nwRxF!gJm!3FgV4pEl!V9X%22I!$vrP1baIB6`I4_;upL{bJ zlW$J%U5ZN#o9l>RvH|*q2Lq~S_h_Cv_n~x2F!GWTCct`3ePBpMM@D<02+k_Hy;-jqFt>JCm!(h|55zBu>T_m~$4$~J#!_R9 z6XTqc5mxD#BY-?GY*pR{&5P{^-wtA+&J#l2p|f%vs(QdhJZWRiON44>v(k7O7Gg`0 zG|o$Hgwig?6$E*axFUmPRFD_a2Y76?*KXSFmB;;d)lF!slfLmOZReYP>H^HUiBi#X z>ztL=T8t4;XQ-6{5y`kgA*=JZ|GWN|{d*68)xY2Wr2oyHFD~E1V&y*YvvGcyS~2oZ ziZM!5s@On~F@$mzqE<5=gpgQ7Ee}+=thD&@fY|tlZ{UYt4c4E$H6J^fdJFET2uoqL zfq1SZwOn%S95NO;NVCI8ldMtj0Tp1HV)o6R8mdEG?wElsH^VrWDxD8DFfhn7MyzH+ z0H)Xk!mxlms^iwe*>t!WK3ws3xjj<4-h>s?gY~qBBr}lj#cz^cF_u2nKn#+>7;mT`7@XHO zHB_@Ki@LP-QQckpD7pcgO33p=_h5Q^lgr&BV3(>NPxDofdLaYHlw%_)fxxXN!en(X zY+8%dsutUKVlY(O_Q;;vty6S~mhO-==1(z2x1A(QaaPKS5YG*QI3^q%ww^*DTqsSm z%*-ORdfv}zDV~RxVpw*&0Hgy4!V69V^@2){nWWwuO$Pa%cIVnJ7X6Cxo$mGetu1xu zc#)@EP;B6djZyq`g_Xe-o(tBETU|W&6w7qI_yJ9QXT$M&o~w4=YIou-E||8v{mQ8; zi%UceU%!*qF;9Qp^v_;dJhgZ{5j2%T0~#4(gT*2kf{{hi(14Xu$eH{tgROeGI@Jok zF}`k=*S_iYjvQ^7$xQ)j&V@d9AbFf1OHuZ~opc0ia0XHCe6Z1|GAqE#tO8v!?w6lT zU9|_q2WxkmXy^xK|ALLjd(*Dge$%*t@t+ehPwgd5FX2L^h#@f}F(fuF+T<9VVP;Uk zo+^U?WwA9s+kX0H?OW}}Uu#zvJ9lok9{k#k&&qFhrsScSa-4RX?6&eO#T*k7tWty! zz!7Xq6jmu^?=V4mCB=X1|M$apAO3S1hx=py-otnLUse6D`k(c`tok4HKk0uNzxi$p z>E}GCdqJ7hX}~Jgtf)T(QB7oY+7-3dAsPZUESed2kcltO9p9R6+Yj5ZIXCy}$*Y*5 zar+mJ7boU8aVRm*@W2sPfGE{mV#$SdERVGRV%=MQ@cT{!-Krad{KPjuX}o>jl{Z=s z8z;e1Tsihw5a0~bDhBD}Z=@{uPH>jhvi#F;{_ubA{q`?keEHL_Kl|x-@Bj4S{e9ks zwK0k$=gP84S+;?tR9yrG10evz#3Pm%K?5j{g7PM04WOS}`?z<t_mMU5S$Qmeq9EdjE<=frfV36WKC+ZJt`XOHf#{pid zg$84U(iF7wj)F|21(FkPgrzvky=c|mUXOPZ@2GBSXf|=5Vk1IpZf!zVv5doG$>JX74?WNL~gHy%} zjR*^r31_mb%Y*mp)`LHc+cP$ISav!thGbWaBZG*Vq}T=x`;-W~bd-U%5XM6NW@r z3Zrz4@!%x)4m+!uAfe!G*8D+y7Rf7sm#m-ITm9aj}4=oNNEBqq(Dk@ zK#WSk06C$0APMneY z0QY{V{hzf`yD)1djFnPq#j#+2bPt(Io65ZUvKTd(s6%% zb>{5*%x6`%$gddBfJ5L635;0)=b~p!m~vveW-{OtE%|NO|&(0LwQHZe3!{f4C?4TihufD)ul zbU(e(@!4=ZaG;E2O{1Nyo5nA9*8W)A>(%*o=a#>gdMxIxQq$SM?ZsG#utXFT<_s7? z5SXzMZLJ*AD$$(hAbk2J+E9WoFSQ0?SU|(Yt5D8X83=s(DUNJ?v6f*0XI~L=}C?Z&H zSEo8pNi3_AF}hri|MPmeotAHG_AQ55sZrwZLnMopdcSBwUYfNPx!{y)5f_eY#=QpY zl(ErXTHo(+AiH#DQHaE zz)FCM@_k@EDZ3ri^lxmLUUPgOwy!NS2PYMl) zQR#w5I;-S-y5k#2_3!Hw%z$JIDRnY;sfQ~qLxL+s(P0FdYR43b;V+M!=bcxqcx?ZsX2g9Tc{Lo>p(w6DHZ?=7D5}Fh6DAg6twN#qmK+<+wLK4qV zNc$xdWmJx?v{%;dHr?g5`|}a{=NQk~EWJ`NH8zANR(?f6A@8&@I{M_y2ujoe?%X|g zc_vuf&{)>CbaSP^Sx-&i7BNC32*E5?2+2SxmozIudA@xMsq`b2Gzf$5Uc_6;~G7k}rAs)Dn)FxnR!ez z#!h?3;{;fUDxi2mLky9*0f|()Kaug^CmcgR(!~Y>vLa* z$eXDa;=$hOJnUZa?Z!LzlMpY~MbJ_L7mg~9bTDa1KY);oVUg8gakSlE@lmGNszu+c zyS?WHcDwjW5ygTV3D&ZJg=ZFsm6`;IK{ys!9{G7+SzoW>`7Q(xGgk3z1iDo12w})L z2uOIO9V5}6Sf^qbVZ6_})c&jkF_MACODn7Ywch$$P00csEL)QAgpQSBF}9j(m6*E& z(+a#3$_FjA5=i9D16^4Cyt7nY^@oo1>LSgzn4Ud%;-wR37EWa>NZcsBQY?k@lF~qR zV4e|csbqn8BC$s}llJgx)T^rN$5q^Fn>&;9aHI4}!IYjEFR-&n1Uzaf)+@FNuoTkN zHy{xsUdQkQgc1x0)7}tHNLIA_>NVq+s&4PA>&aQ3wyR{lAD8Zh^yr=nIkri#6w_b@ zr_r8rsdQTIiiL=QrLsXQm(@iy`1#;>_iqe78T_g-`03!&!EXnj4L-mBdfIt(|INoc zk8Z}#ezIjb)w5xeeCgcr<0mH!@8B3XB`S-l;TW_6`Xg{o<+0|zV9GDr4oqx4F#r16Jy)C8?V z8c+v>3_~J-i-AK{X=U)Q(Tu%$|N7v|XuG}~S*tfkTl#*J%vw^x&!TC&v*Q<-mZ|@0 zsv~rOFR;>Pt$9!{R#E1Fsel6zqZK#KAf+*I#iQeu*MHx<++CW%al#`0slTtbHd~wT zp9rrMNd^%`B~`>!T8D^JPE!#~Al%NCNqRhYxYMf+#%Cn{#QWz$x_DyY%)-TEXHPGj zI5Q^OFnVe+Bo29>xUPAGhH-5bA}FE}Fj86BhEu-RZe4}xMU#5b$b|iQ8-!PiB&RI; z^MP7L4N;DUz_Ar%ly5NmIo-F7&~&e4`^srgjWAAfj%+-Bno8kaJdoHMsz8#tK-*)r z5k_~MhIaJGQamIQlz50fhXp_YUy027AFEU8?TLmwN}5`uj)z8r|9??Bf?@> z0VE?-iy&mM;I;J;WkeK+ygA+BFNU{=9}GVl?GE{P?fTjq@z3`T9qBJU5z`KC?TV32 z&BnKF$IE1lO7%x+>5)N*QHl`)CpaN8Dv;zNZ{hf(fB*dV?_YoT_dojIPk*+SAxiHfp>7^=x9B^Jgzo zEW|~8@yx5I$K2=YS@>5FLz<9kZ%#_VB?g17Qi)mLix04elBVDR^DL)RDAZDq>D9smJF1$A~24#7R<^FN)$7`?0+wAu6{n0kc+l}GR)<0N# zeRmei$@M7yxie7ir+Z{JOr@F>B<7eway4Z1JOIag1ySX+5+qBLmXlFv`Nhua-Kw#) z`q8!C>a9)}x~sPqt8udswWWCB2U9VhDbPa5EsCJiV7WD*1-OVk<&*`Pnwqm#jGkZp z+;#gdZPIWP%O3F<;nBW|1L7FwM-rRGSBfSLM5;g?Sna)M!b&O?cO1O5S|@H@MdryfZ5L|76svwnJSV_0=)^>X?aAsUBHNg)|JDmI4{Dlz4-w@r+@}(xZje zV!vuOVFOLx7>l6LXhP(GxTJY8<|fG%;uxI(sc5w9-USh~B9JD064yH*mK9s9K&u}` zIH{wiKB+U>Gq=jG7*LO}M?rW`j5NS$@D?!{f~WJAkauYh`GgWO+oi$FPy^<&%i%hw`SZXMd+<{a)7)_}3 zR9NOL$#S=cKOfaSZ?C;Rygj_Tc4K&ZQUjr9eCiJK2}$kox>Ty;fDlKF zI--ri#B=4-Y$|wVA#V(>>U?#5sa`npv@yaK@s+~qBvQ&h6vg zwPR35?uq-+U02YLquTxL|`2 zf@q~hz$)=Vcq_qXjeK3`cb1k{-&?P*cbA^4U$SHVL*0otfeUC0*rnPRh|&Z_+sP&4 zNCiVkfZ&KRK(d%)AARu4-`}|R=x=}Y=%0W4@U1%!|KaV2|8j4~`|u8yyP4UCHxZda zrSS-1O|5iTaw`?)l+b9hEFqXf)`0#MXs-T8w^y}%t6Oyw1KsvodhK)0;L;c?#8POf zlukQ{_E$>)<|tUDgmZ=a zzB{}({2>16lW+g(-!+C`#1B4PpRC%sCiL3PnUULl9@v&Dtn>;SqXj1t;o!8fOxO^- z4ANvpV2|$p)5AOe_UP^}9^QQK;qA}=??1oXjq$mIW#}@)_KC=pDviRP6Gt6kfCQ1= zc%-brzyb+*z3=VzvTwWw20B$0oqj)MdwC7*nCAEG@+-yE5y?zq3ByW;=mRllt+a#^ zuVt1Y=t1>ESdZd*hmLgX(%-y23)=)(3@NjUD!`n}cvOuO+F7Ep6U^zXeuXEsit}H; z(f*-tRn_#3Ua2`r940%>9lfW|>Lei+qss}>)@v;s7epE2r1Oe!YBHOKU-q4@zk29M z*hYVGP>pYX0I@-K#W(_B71EwWZ31}33Go~wE1f`DA;YP|CwkCKMa1R$8l9isX`}Q? zvGhh*0B{DFLY6wK5s$YjS1y>mfsA&uy=>CbzgB%J=O4+~D7|7VtpH)U_l#=b*jaB4 z4-{kMNY+T;c~~~ka^2?Yz17<*zUivf+l`|g=vK|uU)NiS=68B$%d-^oKrAtgb3~AJ zf@6gV!-8{g@pB3Dc4zT>r~R^t=KoT4WwO)~=NTWnL?eBN<zIzrp)fghmLgmPXtz%e0GrlW+qI(=&RcJ6G8_)6ha%o0f@4N73AxluNT zbp#t?k;{U!cL^?cmsW4pyPclG*l!YEDU=`r7r|=oDJNDlt|B0akp7jFqT7r-Lpsl`;7z`T%YjeSP*K0a!%ocr_L8#Wp}yciirgcTAaf)Ha!6QTeE z7-}iWYEf&4#?gLf8D2Pj6Be*zq&7{o1jpl<7+9DAfX` zmN%lcG#*Jpk!KdgSlwhr=K-2a&6KE1KU?Kj3~11XF<{;cL!}lBGe;aF zF<=Q<&a98myHY_D(uBaFBcZBK{=Qbf>CBni(Joa$5+uhWsCWli?2OS^1(ujInR8jp z>?cPFpSmJ8e?{!ErL5RD0SOl0u_eDkXZZ$0>%2RFaD^Wewd zyw~{Vm+^xe@x%Y#p#h5ntS)&;vgrU7>koi%h!anhA_ySyz55vKajo-m{%dayzZl*d zemeT~?x-F1cHP~)huoHl0F|naRECG>#R%uP#!g8JfP?g$GZpeENe+*iu-3bMuXcX+c&VdD4Lvzaor~M z9^Gd%G&%u~Qa!PTgTT?D7AezWxuDWnPp~CGvzqQVP|7w2x6)4W`){R9;`iSk+^g9L z_sZbcOq5FX$mwWiuqF%xqug@p6v0x*pe=^oIePTf+y3iY)7LM@!>UHSzk6Z*^5{*- zm^b;uUtS(%@V{-wW69!?F*EYJ5t45dbt&#a3no31+H;MfuS10<9)yIT^Ttj4i_w%_ zz1&?IJJ?Yl>=`ArE#fPL6JxK9QPeohIpsuQpNIrdkW}UIKEKj-o&Hxpx$GM!+oM$j z)uqNCo%Ft0wNl&Er9W<*?X}0J$LZ&tVGYNL#8Lf{YIMHWPOQ`|n906<+Nk6feQ){vsD2`UX+3s}u-3mI5 z^KDc4h+yM*r}KoHpna`^X4UP*ufz+;_a|9|MDd^w6P9HWQl5q$e*SzA-x-VWG(Z(= zmnB3g%y@Je6s3V`WHdIGCF=0Jc+<2GulSCupl-!}syxzm36_FtFk>hn=6!133_Mti zeRLoQM8lC)fr4wW6x9q`jTigNm-?ORs_#{Yj`XHvj@G%>@d4pl&&wQ5kz+B&Ofsbe z0j>x~3>;RY5k~M9XJ!3Ye9K>JH%B^G)u(peQ@cfcrEprRm`H2nHAW_S{4sEgF14mg z8kE)NavB^gLUcMhX?m*h_|6zNQMid!HgPu9hjs(9Qzco5GvPF75hMhrw2AQ?(SWoU z1PKmV!x%?9tDm-f)i?&7_))hDO<0~zCz8Ur@sd5b7*CX9F}_k6$qZ0wywrvT!zHE) zD;k~mtaJQ_!K`Rk;+sya$Hrru{+kw@e}_=bkG!_XuM|%ymE)F6<~2i{NfKfJ#*nne z^Q?MId^zZkGJV~8KgCm2WVXt$6i}U(0~jRIqGYDEjqWi|bnV12jknAxPUyLcDz8Vx z`+0G&USG2{v2)@t)*p4~>=oatT8j-IU5noL8t1RXAHA18(GHE?|Fd^(KXMk?{a7!DQu!7L=ohH-6X8C4hdno zh=;+iZTk&gkx;^ak*c;0J>5M$HB&ItZGSu%>}mS@e150St;6V5pFi}%{hdF)IQd~9v2m!8nT-A_pR=$@aR>GzUE z@BNUeM-O^^W^tb9e00DMEaftXHuE_|LdOby8s?T@4I&r4e;e1o z8m`WCs7%(WlLOL=SJSl}kX0R!Gf33xM&Km)sABHS1}YKLi+IK%T zjp4W)HtSs<)eOD* zwju99G%eFuS1X@qOjAQWL>fZMeu?G5DIx-sMMeILIJ}#0H34T6n>O`5&eV4XidyZk zgczklN|TbNSTD6lrikMPQY2BL9WWg1r1xt{c^(+^w3w7<9^SP|2o8)SJa~lU6}d>i zvw@>k(vqT$?cZ;oVc{KdEF`d(XY3b##a46 z?WFVYsMQr`sh}1-m`P(nLOZM1?BAy=8&ahlliI3VB40{O(*7g^qjK64%MOfByt z<6dSiV`|XEkQt1DX_HQR%2*5MLvMd@=lY%3ZvW5ikM3`)Y&mz9C~DmYo@%u*&I|6f zHo0#QW6%aE0u7*{$TM6TT!yfiu`Rb9nPV6hSdLuy5N+e%iLMsKWS#S(KdX|pmH`YQ zoI0LoOKBOA=K!{@Kx_eQ&6WA#nRVgj5Quq)M1q>$1{BQtTVLB|Dm2%w3J7-EqT zIhP)kp49COyXnErWRlauTADb_6=E&4EQb|3`2!k*@!qf~nX(CJtzuDF(QKVM4>v!( z*BITBYb^y4+bkxvdLn`dng?QNWL|T}A;=U@P^VldG6B%tY1W6(?VWPacf&B|=W6Fm z4sG1`lVdHw5`|XWM*+zkNGpX+ra=g$D6pau`_E22mBrt5@`!#jrvE#=js0<}b-T^< za5pIj$g&n|C0I!CN>3^CJUMZ0BavW&3ZZDCDE-o0!|nhlj&N)5SJT`qW;fW2bhY9I zqNHRd8m=P>OEae;u`x)>rrUK_srK~Kb0@dKCqKIu7j3m6Xt?LmL1C|Xd_E!)d4Y_M6}VGqSoJM@ul65#}DqD zO-kYWyYFTb)Cs-LnO=8&cF=g@PE@OWC%SOnX~HOo@dYYr?-|PP84gCKR)2ib9mza! zNm9^3q%bB>C7C0}6or=0?|$YtdZD+|Z1?Vt@rCrVoBiy__8X5}J?k@ZxklJ{=X6;k zfKH#Ja~U)rFspVrHK^6v5O}VPC@-W}JmhHyR4%4KS(eegUBZ6)&h)*w)4AB|$KKZF z?uRKGA6!|wsAgHL*Zea2{&K9v7@cAO!34oEdMa6nI#8R!Q{+W;^_&0PY&GSq3N5^| z@Xi-uHL{*rh0bW^owr=lC?jE9F|?knaHhey_)$`g=Ps_Deer^@a}td4BP;QcoP;Qt zN1C!dfhKy6GCHY(j0*O4<4ti@CS1wkyz6yDKv;xGmR zJ~(Z;<3)MFaBvk$cxWCLN{ezZzZYFCiV}lo;7O1M43%I*fJ{ip1F#|#pTYic9_4s@ zA`hgZzAw3243z-|iVK}mbHXjL1{m`+Fp?Z!(Mq@9fA#CHUjOoUU*7oYS6_Z`QoG#l z5z_tW9CNFtC;OmNt2J8XI$!$L%Yf1bB$jB6EOMgUVPYhfBCE__vXDaI_+li=_<~-* zd#^gD7xf1XsJ_qcCqk+5o7KW*!8;BqisI5p#T6Q9)1T$WPEt0!`KMd2-MT)yk@uF2 zKECy4yIp2k=uze(Q>!l^v`I%>2T25@#&VF3Nn)5uZhnPRp`Q%4f1F#F(-%*_c=qWF zr=Pkw=LnCVS_z2~4l+p`2|}O~KAmZdmIM`;S4AU5*P3ky?&T(LH<(Kb*B-S4`Y2{4 zSPQBYQu(N9@Qz9iB86W{(?~f|Q)HKaF>Lzl!{!>cjWI{KsopESS}+Z93Xc#L%m}a+Ql~95M6whQ z5Mw5l<^##)+x3#={G2dDZ0nF z7k6Uw$YUGBHY!+Y&09RLu@~t|#nU7u@>EBX0#i+ukUTmbxsQx$U(`gi*4u`yl9_rLz- z+kbuk+rN7A|6cj+x39kU%^Nqq`I|StdHb_R9=o>j16K&2JbiJ-q)hB5X5(d5%P>;P z$9ED-&?vDGoNCoU>6GQd5-XztAdZmS7DI^BMI2gxiQ8M3v9p<8_j2R0leeo+7?{;_ zag$jV&nAT~x|cff8tL&T)cYb{tBYJ}PeT;Z63{8;;y@LbGG*B*!!FT9OyAhY%Y)6` z&)VAP5n|?P`PBj{G~>ik??W;#BnQr!euQxFu`CA~y)}A!^xNaPru33A;00J?YP*{3hQaN&qi%>+ud8l#gP^(k}K-Xxc#tZ-%&zd8R?^@V@&)TJlSKDBn{XQ!XKaPHZ~eWFv4RO<+6Nr;d>dgo{m5P>Eg z@iAysWUJPCTfJnEc0am`U0h5KrpflqXEUg_+S^*Yyv)v;& zZMW(jv2Ao(ezkxGDSW05HjX%OjN}=*WLKgO42ueIw{P5e?ar&W|9Fqe@{cXk=n@_O zx!}~QOf+1o0F)SQg78ErWjUdg5!6LjPq*K?^Xog;@BH%iM|b{ukGixT=!6oK8AK{| z#87HDM5Vcp(qLdIMJ9Qw-f`xO%*q$P>34hUdG^0ux^tAe{qyaPp zWC}zXpf01OeIB;f^NP+C1mjBch_y3p2a%$L2+Qsbx$2TQ);q7tAKVewVkXz^#1WZ(yInDq76n$DI(Hfg2l*1W`VY-iUPK^Vff;e%zD4Ih)7W# z&q%_moy$q#)goy~G*QctjG!(t-H4%9(!s-AqD8-BJ{~h$P>F)laT_v>)h59{c)apiLnd+8N zG>S>@1u^MFbB8S1i%*L)FHBa11e zPJxu>DtJJ22~yO?Dn?~dkH}inU5A%?eVkz=*lWw>IDczH;%V2rM|_oNS_#1hDGf@Y zyaB=qjmCqLR_LM%_yDi^4cywoYZDDWD`FX!fNo|=e6?^Y0$!S!$L|z#GDt;Gr1U+3 zNsHPx&-S)cn7*0mjIeWmeQ?{rd6a{?zbI=_P6yO-qbV>C5CsEiqsyDrwDLvl0nao$ z9-4kPnUFyX?4kKqC#6@5rAhv?C& z;It!FlSl$Uf|r0RDuZ9fe)9B})5lhNdazZ#gS%*_psrOtFi|Uv+GC^~Y|5xnG7^{| zEEW~5pX_aIK{p&gkl*_H`DpHuUM-eRMZqapRN8QEa-Un2&VeL87NyP`y>1xxb3{3@ z|ED!0t7%4_Tc~(bP*R&t%fNWJ@H=H|s@a1O^+po!+o>K6%&B+wSyY z=g)inkT*l)@{v6+bh6gx)E zB~q@u^;$Seycg8*qEKV>>FCDjlUuKk{xJG5ZxI-M-tKo;mK0+jY^rs}OChKdLPkNg zqJf8~MBZWP%2JIBIo|8ydViK|dXFU_D(_AqZF~9zrc<)3#1fLXr=EGuBUgcGAkG=? z1M%9qqIk~@w>DtB9(Bgiw@38g>BuSZ)xs&gO6Hq5o>Ir;cr(i)`V`oO;L57RmwMgx z)!u8ocff^=Ey!^<_byYwIDg6QcQDs#oI+wfG17BuA^Cw!?~#lLSY>@t0C9f2M`N(F z`)+rlzvrQE-6+R$T7b2PYGMgxib!j~Gehw%kz(=?q-=L;NSW!m{IK2kntZ4ETsJ>| z-sN!X9uBznUm(g_n2nY$f)m^jXQ?$tMjv_J&q;LALXj|Ry4czMpmVyr)2t7n1M3OS z$D!|bKhA~Fb_>nP_v#g3RI5iw6+^U4qt{Y67AO%C1qh|fnhY)t`kbry_{JF*pIlLv)fTZa7LzIbKmFhuy2tbk6U7 zcr7I({Q(Si-(8>BJ2daW-X)+o?#bz;uJG+I##)4_vkYk@Tp;(7o4hg91uLbDwx~VH z!A2i0-+XUp=dCyLqW3ADh4zy61P}ZiTxxYi0bx2A ztvKNhLbL``vW(I>7K{9R(?2yHL>c#obatS7>SFqjKCHjoR%w>P?H>eCtp*wDDGCyZ zVct8Yl{Z=wlF~cQ%GStUMxQ>i)w=?l&5F07PVSaqhuDQ9WM&ySvCGHf)5dvV*J_{> zn4=UfQm$en4Iv~;21tC+SY*Slb^f2dYwL~cNX~!dz)wlAiu-=qCsVR)Yi-JgD6g@8 z5vseZsbdXiv@;wz)RSyw7k*hFK@wnXY>)`ai-0(58@pM{UfB;^19_r`e_?^-cclAJ zmWP_*u*nngA|BbIW_X!7tglXYRdv<(olmcsM?3uW>MiJF|MBC&Xni=iHMrG{%pBrC zs?4fw!4JqRXAqomk?9zOHPRVokV#v{2>y4IuP2{p(&-~1cz(8&ok!3ok&7_&95rX7 z4pUy|p5sR?ecO|qPbk~w;gs@Z+DTw2ecnylD-4UD?j+ChwK2Cx? zR3SZo++k2B8}=8o26Yq%b0h-yF=kt|bqal&K|<$(@xW|aTC-BK64Vq$^}VsjHTV6z ze%Eb&;MH};fNdc)UZhN2rBIf0Zipd*cxg-uX%UJB2v>0EYCMPQ=kj2~=KcQW{bsZw z?w&z^Qi6Fh6jGv+oxYi;?>vGM%yTs}xB!#Z{({!V5R9VCG4v7yOG`k&ph(#gunKO_ zpAME!UpcW`sP;cOn}WHm%UKbH$CPSwNRhoF#K}Co7DM#bA1wCUkxM!9ENp)4ckzuA z(OyR9(#GbCYYm(g7@`TpNX{gR6e^&LUU4pL(TV5e>&a)^A5OlQd^vg0XwQAq2?L&> z_O(6WY3nw@q6#4}PO0OT>F6Q`1gr9s61Vx^kH7k#kM6(l((UX2&#v;?(&Ysu*sjDg z-%Y0AXzLo0dC6Gd2w=RD)Tf|BOPNv;boO9d!7-sVe=GRwoA_+%085vbuD$%`^3tWt zbJqCgU0Xu}gajG|_~1DwX{!cMET%O-n4-HC`qj#K^V8}w3?jUE0oJcWJ*@gr{S?;0 zZ{Dl31Y9?Ybo__Jr9idxs6Z5PhA?5MaSmy8sH9|)dq;d(N;+7BELUBv!w8bEuR}_G z>dt|V+ky7LrMrSD4l+kW+WMqaPEe8llqnQ%f0V-K->2~TmnoFK(}|y-IEUF2pti0U{Sm+r*QbKtdB@?b6F!@V=ZpngV=ALmIuc@)ke*r~)-uNx zr-Bs43R|CSef#Jak3QJ?{L$Skme?t6F6fAC+^PBhY&dq=Ml{!jT06G4AqI>oS+|Tz z0PBoYS)4|yqQzZtZp$vy&0RofUxrGt!vsaw**{T3A+~?ysL)PU}Y9pXn~z z-7=&z&G?biPoIK~;wcNZ#T3Cx3MBgAyitm2jM72y-gqe5_#bPf;f-o#Jgob$hVy7- zrfLf^54m(Z#Z1rVtPNXZ8=@B)eI(IFX&BFnNGNFT7%WoVp8R3*+2oIt&%54@li9m5 zAD)(OgWO~SS?Rs>LWaP>2gVE+G{uue^u_0g<384->4l(+E>5QdE}lc(1$0}t6G0P= z+ET75rA|3ZqjDZ4SX)Mgnm#OVKz|K}FP^W5YtXM@YX0E#x!}~uyRo?w=~L5GER=@G@YSraE8;_V&Vt~JeT zkH1@Fv7dPoAI~bs`BC%g`A@4Cedp5E*IvG~a^a1oOUoCpEGG1u0{$ zap{!ugi;o@HD#i)E91dh{oY_yUBS_l!qDuX>RBzEmSs(Q8L=h0kqQ(xMZCG3mZ_V- zVo*w3L>r3Mil4w5q<5Wn1iSmp&dj|-pGQQ?D;(3tYl|e$%!wJjV11xkGKt=is3CY+ z)YrNUz0FS->#k?EV>?%U>}=!sgX!9$XaOVhRtFZDh|Z;KlrlqrM9G>%*THc0$IH0p za5%bN-+U^BPA~Fg5#8sQyoamM>usEe5r#MWSF>d|4q>kK<_BNAaPh*@li9y?g=@_f z9?B7ROtJj4tJANS{-${M_D=WtVP183b1+OMIOhgoxfJKXMJ>0z4AI(2`>=LMbdLDNfuN{<} z@O0x*bkuvUC9$Z$IKhKQ;mT-PUWarqHZ&rqmw@oZdtGVOWEzaNo*}4EE()-m(41u( zBe@MBMs&U?6FLw5)gA==?jB5e$Gmf+v?lU1!xd5u{5)SpSJrUl7&j))5d$&aWqa$?9uW{M*RBo>)Lp|xM6&@ROUE+9>5HX{*b^ucRy zk;xLj=x^Lc>}~#gKb&%o;uF7YoPds`8L->BpL0MdVL@UZA*5VHN2P$2B5GAcn=sr^uPus60pp;q#%7HiD#1N!V9JSVhIb^k=dJ&Iba(69tq0Xkm;TmQ-GIkJ%Ih7i zz)l)`X2@d?PipJpIz{cmSqk6+ARuQ7wRgfXTiC*z?zjzn;idIGn|G-ds*zkc0mtAc z3)CswwZ_q?=)EThQScP=NC%Q@13KzhG>G;xt~VkAjiB{a9HxiqO~z|gUF9!b>WAhl zZ+gtUqqCyn-O=g^p8r6Pt01KwluNyVLGJW9}_D2QLWH5}iB>U=%y)qnbzdhw29 zd9E0phyiHPG+xaaZ#e2TXr2Mvq6)@4sTc|wYz$f&qnP%B2bp5zB2?2llDjl-462L6 zCqr@7D_KMrdMU)&Ex#}=`qYd97cmZ}2*l<+iOp$fJC35DZhCj0X?I=QqF@0oZGFe_ z+_T}Bp}}#HQhH&iLrS^AP!zH(=a+>31}t6+Qc97l$DNAK(+xSh%-0&tv-g@~Ld!-M*8aJj`<~$3%V8ji;4S-^@VO)}sP?5`;k>RkRkk&7_np z7{@~>YBHGIn|zV3rjd$D*Y>+=@?|yo?c`xK`Az!tgY-K*>@>*sE68-&+#LTebgZ^_ z07~bTu#PfCvL=}gKs_fR8n4S{aX0TbZ~XJL*@tm;IbFdJR>!bt*1Cgy{vqiCOSZ(B zQHYWV$+^~u!evHeZJf6h0Sk*aYl9oZ^sayURX=_Az}L{LM~|QW5WRi(ufw_r{iX?Q z(L^?Dg5@*P!CYFvIfRAV`i0;w2m&dR(nk0|z?qm6zVQaddym*}-Flsiso()I_l9HC!NzG?VpAFJ06e-KSNvaB}KbEz(?oyls;;A-hv zoM@RA4IwO%UYQ7v*r=^T5lorD;`za-U%v-cJ*-~C^fs%5TXlb*iBZd%rQ;-Q>l zzrdDlab^UJHj!f%N}@NC#;CH^nPuz`x~YhhFct9xiMBo=f{4;0Pn$aiYrN4x z3#62$jIZnz_%9gMil7!z9ZSSs;uO$efQt38qryh+4ZM4!_4+VwRJJst468b-$O^#}x6TU!{Zo z;K9XwOSZ*XOU6+X&%7akpaT#>M4q6rqNuZ?5o;ZFd{cWhLM`T-+HJkIU>e93TtSEx zQZv-XqKc9uT7gB0z~h#|dWcoP>Yd!7HOf-ZuZ-8n{n_K3DPeAE@{PNYF~6IgJ9L{& z0WNKQ$4UValE-kci~>p@4d))6b!D72ua4_J;<@wnXawWaPQkfL_LC~fGVF{QmKYDT#%DuljX4{HZG{hr;4rU11K#rGMhZI=VO%X+P`v=%5u zABeRnUG)Z8h~7{Zcr4PBdUd?f2<^IXKu|Wwrh=}Q-Qh^Ba&cga5{4` zNAA!u#><3<{&DLMTYud8cI&G~Ip%M-e!KN~mHzqm(J!j4-#ohWSX1WPN59&7m_GfW zn_F8vx5o0~bylkDg~CLKaj~{HhI3xJz`bFX2j&bV(F2t!_;y~LW;OA_+Ht6f=XY%j zNl+5JNP7&rzz{O6H%l-%t%xs*U{`K$embn7u9k-2s@FIF>-PHQz2OK(oA*{17s=1o zVDR2i#N(>&{3DEHiZEhw3FT{Eo1aWh4H2S>YxXUPrG*dvgsLFaLZ$iDciNh zF@hybCf|b&P3Kjx0SODbfX|RGFIE-%q}oJe>S~`_7MY zpW&C2hua@klYiR2+Z-5ww*AY=m-%rsU372qS)MjJjv2_)rMkRJ#)LN_v_~jovan0w zkZ`y4Q_H;(k5c zUGvJ~fyUitY>jYKRC}r=rr+1msI{?71gRl}qVmsAa4nP0JR$i%ee28a#(Q#>#wiaV z?DGWXmL4Z5S4;rP2r21h1Tu9aIx9S(yr?R2yLxNzevQL^?Qi4ipt_2~jmHFC?`({2 zR&Rmdi1m%}Oi6N@kEZEI;HRb0=9EPAuO70nav((8`k&CmX&zE)4g#qZJ{RPK4PFXc z7GY%-@9L*@!Y=)r^37`fI##a^u@9l{W2VtvR9v-973Pc_avV?_eLt(V#y)Vs=!6B& zt=CpCCy;T9j5_mFk$gd9ncMUdjC+z4{mstLzi{C?^jEPO#O8MyrR!O*vOajVKB)eD z=hqi*qrYCmpYMG9<7z2g_+R8#{!3vkvw}`}(LC&$E0{-XC8h z$2SUkbUDqw$hY-P%{_3G)H=!|BNz?ksE{FLvWTu_>mM3s-v?U{w?5tae5Xg^!K1s6 z?r!}@{=zeF!Rcm&3f!m!q_&=9Y+C1-j)sKH5$&%Z1^)$WhoCsr)<{}M@6*|+FE0rqtr+j&Hu4? zb!IrsNz)7VlaW-EUiEB4m zQn_)ec5Q59V{G6;=5{pt4gMqP9vPU?jAmMDkVe*91!5#%=B@Lb?taecbDkqajC#Sa zkQZq5pmpj78cfg%bF3s_PKfqAZ&=dx z%`czcZnbTz-E7At@bsf@GhIDjuc^Y3Q-!^uDfJpDHBe!t;f5p2t)q-eY-kLIXjVhn zx%iG9pNQ|Z&T)2>3CZu2X02;cb~)h$(xrZkI4h;_J~*H?inl>J8G&&UBZW-dS}8{Xj3Y8@1-{+x_D;W3ZNvbJp_6q~=2M{w>lI=t zMGTjXrdT2DwP!(CZ-}740-&sGne*M#SJ&G&pxKAJIb2v&gx%W^c%)^y4R}fd)tYOvIes*Inq09jNaiucFNFAZ)jCFcTT>8yldxrJ2DJ^+O*w=zk2u5+v9KEX|Epy(DdJab@ANAv*)h-WjQVp z2uB35lpE!^71}x_(kM!jR};U|Ur)p6q1Ee84gadQ&Yb?wT?Q;g6fk(EoC8A{^(dZ# z;3E@FQ6zTzp`ANxP0znjJUrTY^{=n&rk%UC1vRr~^QCgsODn&gK}<)FR*IWL0;PUk zFF0WW8x4pO5J)INvWV&Ce{_3E-Kv=wRl8n@`(22;>{p7XcR+C9Hm*bOL24Nd&ou_A zl*q#KN_#ZWuQgT$b}TdgbvU$OhU)~-rEV9aTLL;DPdp*iSdc*n$3!3~a|G3Mk<3fb zpJ*GJl~z(|1)r4E@P1WBUl_0uRfU9RT96ppT56ScGKRH?QAWH*d5SEZ%|A8Xf|dn) z?bMl7s5g{jy`jv{uS|hm>V8C6s)>;r5$u(hp3r~c9K)KlAD7C~zQo_k?P>{;j-aP97?Gu0efQX!Ji)ZD(V6URv=ELV!7pk6a$P0}@HSb6HX zj=waK#AX$zR_mwFw%4m0$Gm}K>35IpMvF;2iv5FgFh*0t6;T|h#mqUwl+!$K-cEJ1 z1Ae{R+`K#1RD4WqekeQkYxCipG+!y48U=xLP=Qesu$Gp9z={$oq{tF9x|}BO{sz|S zX;=qIOHEj>7)!%AWh^Ke()40sH4BmcNfVIHI)Vq^4xVh?8hkalH+U3ZKOFqI))_u_ z=fV=~QG57Nsec>KKocS)7a?G7(i{dbBp{_w*67|eA7V5f<_c7;YtXm|eHT~Wo@$GV z?xW}G=tTsMnw%bBTE|Q@O8vw}HVoVtk=k;w6f8~bAwaMMo#iL%{btv1n0^e7X6oM7 z8^D4MV9J1{korI!;mj(nGNq%sZDq)BXCm%)onVzSn|{snW4=m1VJTe8kv(!4F68pD%nnt$tkf=T~OzOc^?U>+!?9wQAXWP*^= z8i^r9Lcv^Qj3mVcSpway#?C6r(_4G_tN2aJL-%39^~ zGM)~)jq~f*;@9`8PTUl`jg^hK?b+zV-KlKC(!;O>XU0N!Kd-X{n7u4-`1Pa za%@H~3(7*L1Qe+ba@KGy!4l;)iZ1FbkF+PRUiiKCYR^}VH+`q;Kb+r$UOU3HBTSpG z7}0<@WsV_%3~?+NY6T}0E8$$$9q;gQnsf2V_CIa^cKG@Bt>Ndx$A>w_q$a})$nakH zlsXP4NZJ_uc)^8a++w9YkADd5h1uu$Ks?f@J#4v&y~YQ+BN-p)ikrfKdqS<^kst&I zDlmc42r9$k;`UkXnHSpY{S8ya2)PGch>zBbTqacY9=$)Ikl98oN7sUON*nLFv4~<9 z2uli2LfEXb`m@*iy_83->#FvDSvh9AQXHj11{~5nXo`ct&I#!?CkAC!6P)dLnpF!L zuR*sxtK{(onu?`9*CQKfw3N$p%6g@EDzAb-L^`G{Q&I^KNNR<(B|Zz!cUx7z)i{?v z&c{zbbtXRMo{(yq>eZJ*gMy7lYt1NTI&4U18L$*pz(H~hiaIHEK$ZX?X{7NWY*wU` zq+}sYBka}F91qY)vdetMaBA%h$An`aJW|{%3zlJ_v?E!IbZ4%}0*!3RMg!#PQ7yZ` z95-Gml4hqdUV9lNLW0CERw(P83we!bH{u62lWV1RM|aGoVJty!;cojC18S01rDG(i zkO;(ri8Rz=?zP8RQA-cp)5le_inec!>I3VB(R~+K&az=Cu$HJ)S*4k@aqEreDKPJ> zj=`wTyBHn(VP^)%Cxd%~?*`utz8X9kJQ{p9xL2p8mu739k5RD;F%<}OR(IIMd3KWN;u~|+iC!7NlL@J@ySK4KRC=;f)B@KGb4sYjf>4AZ zy*5mG!{`A-r6O>L9l_2D&jGubg}B{QEQT8$Dw&fI0>~ zfyy-C)ly5Pq~M4nmJpkD_jnaj25c6+8tc4fqXl_Fk`w!xYxvxDg*X~SDdtF9Yfyxg zA%neS!XYIo&FXR(KHR=D{9<^2`0e)X?OVf#hdZLaW^D^t+aB+;z}!cR(Vq*kvkDW8pBz~SO>{|Od7BlQjJo_8s~^f896!CpeYwZ2Y@U|sAm5L zto6Fh%}1xs*eN}Y8qftn^Dgt1!byB^sauW5)0tBqf(nks<2thBygK%C-Cny@&1^;- z%Qf!|8a*M}DEpYXGiJO}B$ZGQ7o}B%3u`$Ch>H_ZWu4J^^I4J#Wv|`&Fpcf~b=$VP zjbB{we!Xg~{<3kto0_K<446Jyp>5ukLbg>)@z)}ruEzKv7`F@%L@#iNQDgnY9;fBQJ+?Us!o(<-*FPl{(?IZ)cf8rqoxQ2`m-ed5^slNos}h7@qkUyM?R? zPQyRODB%0;e;7U*KG^=hmQ_3S#wfPjyyiO2&7UkB0;-=3?a;VW1J#HS}sWZ z5mQ+K;iyUA*5Hf5H-j&CS`4;sAKEorz2_`QAMA-vsoyY6nDNnTj0+eE<46d?VJ-#O zJo53$@X_|~hF=fwzi{o}4%7!ap0^}=dHvRZr5*&~y$o53a3IJ@Kr(Laz(E>qIDjHC0H89fjQZVX2iB@I{rdSx zkG-!DPe_qZX1mI`<%)4++VQym+5j%1n8w5hFNu&4APdK{og}f?xO#K*>l?n;-TZX5 zYFya-`etwQZl?>~&AY4dIqONC`|B~wvuQE*+JP6?P|8dIYkUZlIt7L?$ZBf223;RY>UyueQ8l0grqP^O z8`Z20r$%_eT*wTQ7Q*fj!pw34Oe^A|4>%mDKcQGiMnYDy@ZYw7JG?)9H2f|lzK35$ zXKcPOSe+d_;=9UO=#=^lrc4Jfm{1xc4qR%LnQohbGQvz&FZB7==}W$M&3AsPo7$-5^7k*7KW)QOTqAFE zPCAN}qcR47lz_A}0;^(Fm{k;9byoXTl4keanm!(DaxtGiP5@o%b_^SjK@c5)2f{T$ z${E4ITNSe0?#kw;qYwU@zHd0+xC&LPclsi9Qt@7xlZ-f7TTABr>G`%S#adB8FklG| zfuTZh?t;RO5~WmDvC^B>)5opNKQ%72qxELB9*otXsg!G)J6-8#1aJPyF>S(9RE>^@ z29q`@#C>9N2zgDlV$$aot&bGj``soq-t5PRgGSX@X+6+ zi=2=2jcUYa3F2p)x6~UPCyY37m09&{q~;om2|GkK9{^W0iV80pUqN!4s*O2pZua1t;2J z#`M}7N3ld7 ze!w(aT;=`u|7wA_ikj(HFI8OS(#rEKaZFQX^k}8H@gNyyidss%ke+!?kt5(ylFZJk z(EsZ3cWdw91Ai&3SN5$miDMyKSw;v6fD zDH1_t-M83l)q3SyEkBkItrPP<$AD=P=~Bmw5jAJdFcqAZf@y1jXyzr7IPbF7bf6m_ z=qKr#PObfOfL^azHY^2JCDmh(z>t8QwSh^W_7ax(N7mTmXYB@!*E5veWZa)wUGzD# zUt`>WrKkcI(qa=ADnnKa$qWDmrK%YLBq zIvl={|0a76C3$8z9By(;yjTaYtRX4Q9IbEdb=zxwO9doIkeYLqRj7O9$!(&JyOeU< z+TZAQ#yI$zRQ#!HOYSV}9BfMUCMt@M5)&jW5h`ZPNKj!BVS?w8Enn27x2n{Fu3bGL5fFbcC6N$lqC!mb>GR?LdiSj59qEXp+F#6!u`OaEZ z#~1Z@PjutUvk&n8qAW*QN7L-mdOj<`AjK?-NmL5o@`jg|YS)ZP{vhnk{G@#x=W?a< z6fld2OvEIQc*}{BM&lrK-gfQBJj7L}*IMZJ*5gygvv4=Hb8fufP5-K1Yt-%Odx

nq?11^PDfL`W4j+~O=yS37H+ZUg8M0iBdyF_8DOi`L-5;NIZ>TZ8+9ZwB`^-`ad<^Ir#F z$FClyKX!lc`QYQtcL!e_Py5c;l}=0|qff}Z(mAe}^#^mMQ>X}~ifnaMSWPsG`3)B? zh8+THgSmD#Z!RNLb+g3h=ym2P@s+|E3}a3ag|wEM#yph?ObrVdXY$1NyZsw|xI0d- z(PS`ZQ}O0gflL5hrgjV=M!fa}W97Z|IC@2blpz{RXR^3ncHY{)xAX4yXWJjX@Dg;N zvU^)tSy*hyK8{dmnL?#hOE73Aj3x#M69h{Ok{QLENvlw@Hb!ndh(UP`YxB82Bu_+; z*9`<(M-#)6i}`V z4@P>46~{&p6}Yk58x~J%)|RQO?am#r_Gao_tLCt`92Y(FnLD48@+-wtYJ#G9)k1MY zsAu3rP*ysnHOcBZSg3DQ?OV_rYx!?t!Lw;e=HHr409~qfN=hcZM+95%I2DuyZc`Up zkSHq!`Sbg?p}y5=_g1S}%nl8j2l$0)`4t0dO#sKd;>>~rW?~p;DWNgJL|Jy^`vQ8) z`F7j4s$M7l|L>sPj&X=@z0zOr*K>WwF8_ZD>rR2s*nJXlnl2^|lxwjLI4|Of1{Q<9 zs1QLj=|J0nn8I20PFK~f#hd+gs9$)g+iA}9AuaTj_zK~Sc{*5RqykShO&5+lNMM0# zDMHqfUOE5zp7Z*oWIUSiPNCJjdCxIQCOsMlKfx)0r=TJ)uUuaK$rHPL*tY&h(kz9Q z8G$785c9GS;WU^UZ-@=?dnzj>bH3Ml)mQB*DrM{HdjDp-*LtyaCqBmN?x@jNjkgH} zPpm;P52jLW;w-fw#ALxC=MdvgaIL+zT7$_7vRSe(CEWUk#P*XGuC0E z5E4`wXAB5NiAFAqwqXkw)GtYVz*s2LH49_Tc{JdugZe;15rllRk(~`R(A3@rwtKfAU|6 z&uH`Q_)qwD@Nn>X{Pw-wAIzXSI_5UE=vc@hmx(MZa6su;zQ?yQ7;j*4gx`2asw^LS3qQF_}_KNf9%01KMayxk@I)2r9G2y%*y< zCNhE66{vkZde!NzcRP3Pjy3b2NmXo0c=Pn|0NhLUk|~d*Bho~Z$iZ^1Y@k6nrYX&G zZDXU9uG6~KGyd=URd0RcgU*b8~ECI*6$ZLVF*> z8L1AJsh`kEot>%w z3Z>HF=XI&e3PioV9Y{^`(^)Fa2I#S-QBiyzp8{`F9L}Qe~j2yO>8~ zZH-nuO(Z*QUGOo#&7;;^jM`cE;=|P6Uof1(!b)R>4!AiR$GKGLv zlw)MD(UzEK{k7o;tVEW3COlVJi&@Y6+Yz<2WN|%FJHOKPwY}N8*spf!LmTGp6CZ3j z5TRlnB7q7cj01|iY`@!(Dv~YO%`P5eEW|Qx%LJAqp0XE)ldXw+8 z78UC?4{3rETji8?3UP&r5{43iR94bcwa+d3cJ+pDsEbd7A)JJxR68iAK5)x9!-zWy z#5wLciT|0r&bd2KM=R{RbS|}c8Z*DHwg>D|^<&y#?HwX%jS=-y@c;sc^aGrA z4LA7B=C5KZct7V~4&d4e>TIEKAeP)do5x?&yL9a=o_im=~Zt&+k*uQS%Bb0*`Nv05@4EpKS*P~(?` z(?}QVULY8Vc20Y2f^#kiWt8&FBA#_qc%>U{WOWO)KIo6uV9^zZof`5pAn7pjLC7@HDcDWX=`;7G*J zjbcR}!$#{9xqYxEtDWRk=-u*b)p}}oYW=uVSM_SQy0zN++fLU(U2XjDSVH{V3GoXHsBbk{s`i(*rFl%8-tVR!_V=3sfFtx4PYACRN}Os!fpdzLz(Fb}fnchL&@^Nvir2dR8+YIq z^b4)OmOSytN z6;u3|R!)9|e=M6B8{bb)R*IUI-lcX4Z9o!Xkih|aq=E<`Z;*8By{JW>Z@qQg-r{se zeWxJZ*aJ+dsz3@W5g}d+L98-FX@ey*j9`*gbsB8}TCHGyA9=GwY0eI%$I>gs(#8NX zI0l4}XsTT_(U^K_xHdMgtM1W;j;iZhA%?gcA41h@CHD4(0Nq~8uaCZ1>h;p@o&ASb zrA+gvbIIk#+=5Khh0k6yPE84^l)CV+AeCxWP=a~_K!wBLLCKhfO0bS0nm5!`)vi-- zeAKHN9=jj9dzyl}Q1v9zF=R1ZV3zg)dls~1lm|;p%wi4~eMSd_Prw1qjy^A3J07xU zG9$iBpIwRzAq)j2EhC&E7xPMmoaPG4p!2qHzubx9YOTZ%Zq{rZC2W|IUn!nKgZEU% zbPpRzIW?3=BTvA9qFMA%%l?^LLJMtT6c}Sa#cdia$9V&U{>I(g>s4=ceb($?BCEr0cQ+GAqFDG3Ip+UQBc8ZN1V&L zp!@FAZX0SB&G!19O`*@L+sm_+6Ot>%(OBdK^AriNfv1ieXOKdYW1i>mc1Jy%Dcmz} z*MEAzMc)&cOI6M)CzUjadqFe=h%q!s5XMr4^LAMFEqC`+-NkHC;EcIFHt#`irml|3t ze)IsV(0bInG;61Q6RFOF_5fLyV$C=f-YTo96e#9}o)OM@j3Z3I^bp0G{bzWZV$Gal zP5IQ0;#wmWT%rc{!h!*-eLTVxm;!W$S0nuOTJPE9_Y2Dl*Uw+Rw6L^1Be5TSYAGa= zBPEqL)<_;=a!9EF=YdKjMb_BOwHv$1Y2BF|?K!h>LW~I1nlx*gJN~QI#_mU0 z3NIT(_l`AB$gdbrXDA6Eoi$3Lw7c7DucK*qF0V6frE?ehYrf_Bt=Hlw#gEw2fHv)- zlR!^F0&{xu(tTuDimi=D(;8z~5Y7wa4HYb&R3Mh;v9&F3eBG<+=#*Np)_S#LZ+36` zs-D+Rni^J5%ef^ZHr-j&S|@RC=g6`YXUA#kzyfJijI6n3*2f6VaTg5E>J%QWG}~oH zJ<|*}P3U+)=r{p%soDj@k&C}c8gn?!6iI6(H3*x?ZL-Fjp;FOc&WU5tsY7)EED zqg+uHcytd$N)(VpfOJq?#%#-D;g!Njyud03lwg%q+9kGVCb9G0 zd6hNJw%Y%P=#n-**~5F%9LR$Y)am3z~6|%z4byHYABu zR-Ld1YaOU()sh-04@eHiL{|zU#nL!V1&#h(X+X&MAcW^QfX}*pU8rw#+MR~<=v0s% zje}9D8H_?q8Zq}y6G^Qgft$aucV)eC9ohM>T<9qYEW7r_0S2Na+15yu2Beq7FUF~j zyk_&Z(2F$ElO@dr$izmF3}Rzuf=QGN;5fk~k_{nVBKv_d;HOseZT##%lB!Ed>=v7? zBCjd7%of;WtCzZU&v&Zo?1%cez_kxq^1{+(s9bk#<7Ux$7>zTjcm0@?9?2tx2uEp%4_&Lh#^1FjktZ?K{o#a(AutBe`eumH%v>Hq!-%aip6vp2Ea< zL>&-Kj6lW&N-Xn9*JN2fi&nYX^VK&ud+<)xO{-yNkmMZFCzy#R(XctNo>6NNV}=p} zhJ!;~2xkpvSx$=KSDV+1;jcG;we8QIm%o`ATf}5^8Z!++i11V{l__AD6XYqfhB2&6 zR#xB7+NK3|wO5>6-T1VE(ygxh)L>+3l1=`(*>J?VHgm` zl}qJnP%wx^Z4#(aO540Tnv12obnnAdwYBKNxLUb$^@_B5=`?lW2)E;Dx_T!f(Ud=I zWDlf4IOH7)!~`uA7D|J&BINK#I_zF|%gak6fu+x$)-l4w5AsH*wTIhg;;qn|Lu z^z0bpFgNA85QR`JofFnFiUW$O2j|EVK-OhBvAU^L+`acxBI|1BndQ2f=Z+cBb;prz z$an_DV@IbV6(AuP2~HSKX=J+KQC95b*|M`zrefDi+s2S0`Zt{rCzilnT)$-zgA|ulX>-7lxf?;c_FK=gqrSakes`BcV z;JTktI~UuXIK|_p?XJ9V;q=KBW~$Fa4x3Fx*>-xnxZH%!y3F)F0De3C}NsXtGp*N3&rnm{Qmpv|MmU# z|2%f$o$X#-Ka73x?80jcXBW;dObJZUTdVxAg!q}|ka1X=a!FJvsT3L^L=;xWKq{Xv zDFUPST)z~jgcdv-)$AQ2-sQ~ zAKKkyL-~H-O{}CS_9Y#$b9igDd$r15o=dbb!$Ta5`=dq7EejusO3Q{tP zQc6*xiOf>(&-&`h6FTdPI$04<^AsFOIJZgH7)8Oj#h_$}>mCRboLOwFG8FRiPFLI2 z%36Gssn5KxCRI0{ZRK+YitbIKVPjyWGfW{9un{1W5tCRM#W>3>WJZ|9mAKX`lL^|) zCGWj1(Q)!MMbl_60l;BxKvQ9Pl*XmA-V08%Echqew%zq*Dk$0=iQ}Ccv!2cUWV$(Z z2iQ&7&my6S2vOIw$P>?u*WNiIJw`fjGiiPE)y5w?Pps$pAQo|&U*>4;Cgb#LjHgH` z0R#tXJyU`JC5SSllnBf`rlySp@bj&gj`gduS_M-kYQ<&hI~BBw-d3ZQ&XuAaiiLi+ z7w2C>5ozBoyS=hnNw0@EucFnye7tofz0!*_PMlqo-I`yEvMPF)+eO!3gk+s8I^Kuw zb47fw=&kx9%7azBr+P80mo5M3qGcST>!FA%#CK{G&6WBa4+j3r`aj!KEW2?QTTa<@ z$@t!x%9T(R7p#ZTWc=L?y%P?-5tZynkf^PmU!tAaft1y^7|Gj z;^~+0n`|(^m`<@6JecYPlk*R1G1xvkN7%BSSyR}8unKu=Bt*_TcAl94rri>r_ZY{t6OG0U zqBWA<7|RfNML9y$D&id%$Ymumt|jmB)$ZEH-AVZ{bEV=5*>8`LuPK}aIpkF8?QX#e zsdVt%qX4N+URIO6m*R*$pNjQW#cSIg0;6=|{CW~p9=vzqYAvhGZ5Vso_4iKRrX0bv zNiDbt1S)yz;)x~amizR4@$&G z6cIoYV~M7DNei9+djFeW)b)LK#)Hf@$!B2yAE#bpFu`&iFit*466)+{#}LMj^N#ZnWmfG4j}6xz9T)B=%`gNmnlmT`LUkAvIy zZw&rt@a5pn;Pb)P#r zwUV1@u^=0&#!M9u(J1m2vYZ&LFm={>pR!s!%3-SYy6{GOUIA$zd;KWwngVH+BvxR9 zF!K?@xIX~pf>DjA%PLU+R=a|t^8I8g-GSz4P6wSQCLLU2(hd|F@`XdpImDe25`%U= zSfO2%JTKa7sSlN#mz|mo`^qR7O*umu zLI4v_1x194KtU2JIdi#XMC#nEs}Gu|%;SrmarIz&QIf~8Zp?g+$Bjt`4#=vg>oG%x zB9`Ic@(c*Co>@FIscP|zBYAS^!uh|Ru8BRmv*t7w$OIQswIJgiAOnn29i*iw%fGta z+i|({oemV|d|kDAT56rZN2ykHW@_E;bZm;Ti2^r@8@AEjdJ}-iD7b}q@7(9PNEfQ& z40JYbmUc(|o+B)P?l#a4Dc3OZ|mQfib5P`FV@8ykuZx@RZxUx#U zZ*~{JYeLpPb4VWxWY|H%rl=+>CNb7HOC2_jG0rqdp@3q@N}O4TRyptRv47KM`9t;i zaDj3V)P$4_g)AiwjP=}Er@YEaie29LKeyuBQJhK*jH<$Id|VdY_+rc3)nYly_m@k% zT2@`(^79~ueJ#ZKs0XQipQNBX&EecS-R9xf88hRT(R8lb<4=G z-Ch(JiZ{SOr!3c^Jh*#xu6b>}12lr?0MnRztV4n_B{bI*1ru>M8m1^?<3;gmS5z+Gi!e|OMeW3#{8fI4PFU@lnaj8;4l(G8-_i}3Vs~ktozU2 z-uz(m?~Bb3is46fjP~8(t>LG`uQuP^{JXk+$aby1gN&db;lUIy5r1-ypZH-KKlv2m zD}FRQn2mZ<{-m6ex`h}9X_x{F06M;mk+E4m`>_Op&x+x{)f4|>^IARa-^K}lKKvq1 z`P#7){k5mUq;pw0r>*s#U~9@{oYE8pfDM4PT!Ey*f(K=|$P4IPhO+7%-%`$tKePSP zr9#K68}E0^R&V2v9slR^K;T($RAu7Sl%HfO5a+4IAegd95Unj2R4}Z3mfp1xR-l4z zZ{ubKsbABacb;)m&~!J}1h^ZsAW*Kc73r_x+*-!Ci`!aiCGGZ}&Z;LClRSiU*1uX@ zctSd>ny5_tpy{mV7apDIBl)cL)SBX^J#&aalnjIx8fjrPM!=j#j%FQ2-A*dEu;#Dc zyD<`wHs3d%&3$8f8<)qiZpwV%nKgKi^E?VNHV^XFn^4No>S}`tFUhlN6CQdhpcZPS1;lHE` z3Y+g1Nx%N*y8G{);g?b2zB})`HAA|=9w2MTUIF2NIP#zzp@cfXN|{uI6@1Wnnegpa zd8vG--7QW*f2D+8yv)51i#MRv?OieVKHSmG=LjDZnaS@t6m5(TG;bRvRBrk117bH#+|qSAM?2GDf|oSPGoFHVUMi zW=vt48U|{wxRM&OMA@VV`%byyd&Tml`pNVVleu&;A$?*p4I5)iIF=GSFiuj$ypi!) zV8B7-)z2CJYm{rh-n=oq9i`hO<=!fW{}lgxGQ72UJ^7d8i?`xicheicP9DPe^iJ(^ zerk%#$RVNX;H4u{8$PpCUlRly^PdMWnh=zD59Jij;O)JazMbmz}{sgl%HuGZhdKQN* zmhLiKIo`dR1a6-ae^&d?>{d7H%zo&hW)snF%!2`8YYoZ@eT~cHY`fdO)c%Vd!TRIT z&niVf;~B_}-l|5ACYaj}%HHu@J$m}rXwWy$y!Ps;Gs`E>Eu2|Q{br|cUZbcqh{WB|J&cixkKy4;$ck0i}AA;6Md?0e|PUjoXyF0rwx@a3lnbys?z%Bi}U>=fc3@2 zI3HiQC=4w5mB2YU5v)7&B_B%;8>TZo@cH}U*P2;U@Ot!`38CitjE^!GXG8<4*7 zGE2&_LlUG!8fl^_lTmAqJ2kdhE-n*qrteDs&CUL?6RjPwIP(qk3E>lu)2|tz93knY zag_(V^qN_a5idlArT<-M;MF@TxSA1lufd&sK=jfg0vB1B)`jYRpwCAe{dHQ~hmK|)o&o_|Q2z+^rD{JELX@iCjEkKjpDZpj3~jK zB{(o0vIOv#+7*-?c&=FPJzt#eC*qdJH@1oF<;1w=b2xmz-Jg;IBtZ z*-vSUOz*x4oi1E1eg-z~pv(1rzgWCku9X+PE8+Q(CI*uP1zd-WOfV)q{P21$bvy{` zV0FsXbT{RJ-9%&DrB4nYCyo4n_O7Kjt|L4Dm4??*T<=E~fk|7oH8LqdlJnXKr(Wb0 zo3}kpwhd{eh;o29lSLkj3?@OK1kTKOG?U0mJQ$B0FBkz?HMi2%!u*e^y40gdHk(D3 zBwm^qk^ptL)VFxPQ&s2r9d1dy22|?04k#)D%c`*W!C<*wTaU{>x7LT+?P;lRdnr|G z>ISF!mxrt!oCZdzhF~Wo7J;TAHPOtp1ZhefQo%TvMXGw)U$@J?e|=)u*om|)Cvuw& z{U&LH>)NWo#}1^+^)3YMwPcC}g0*wj(deZ*su{@&P%las+w82{n@7ygJXd6ikvY`d48^WT4k zXQrK+qQuwF_u6VJp%lVm9n?l5EEP)>T@YNnjH12I8Ie?G>EL_A&9CZhkGGrMbOf@- z9pWoRQ&BFNV;nr!0dtB(NYOK%@$akmhQ z(Uk^!?u{~O#GVOAIqWd9Kse8un>7A1nkDzfUqzGTxAD*2ZR2G8ZI?T0PkP}1j7oI~ ztdqLfz+kK$qmL2TEqgX#YW{4umJ!mVWS6o_&L1C_B z775z>gW8RTur|@GaO#b^3zyElcW!a+gM-oBA-z&8jnRSWxWx^P{-L9gdb6W_&I8FK zv)tCLm6WiCNph6EqjgU!viV2&3|SW9Oj0Bl8zD8aQVXhtN|l0GGbQuL?ZOax?+&3} z8CFYcz2>o-|52^2_}*Z3xcRv|*&Mo)Oslem$?RjlLh|4*)>7@fmy}2(WnkcfO&v%< zB8GKVykOqfO>5qa!$eZAP+2s#R4sAuL#Cv9hV8V6KDZT&d$F;Pk^rV!sY8nv5+TlPF1<_svfo0r| z(T?O&VCMqLo6lS?4f@`%`Dy#S-KT8}m<4u9uM|ungkci6)W-9ml;SivLWJ{%WgXa% zma~?OoQ@px&>5p0!YhSR5o54d!Ux19F-$RP0dxq+(JZfS{?a>p80_1R;@g)lEdKfI zpxLt@tXRT<8ZL-Y51Q08n3Qrwau7gaKUj})c#VXLGg};1SVc4;%wyXAYIyR*`6DZeQV?;m-;Ryq3E%M4M zrfF7cV5u^3jqxm~QiAcLF5!FZ(fU1z6zT{i$^@>sa!tpMRq;YJ7_<~V_$+@X*An)z4mLBKVU|0cbn`*bsrg)VoQmLR|RLlm;^6{^#p)>;S{1-cgARC2-m8(w9RiO zS^-bUmTEy{Vz>N?0c8Tyz_H+*DvLDZ0(%~f0SF>1!ahG5j%ruU&ZCKj#ks4)+7m6D z5MC*gEZ)S?iFAZ>q_CwVh1iKyfrV`@k6b#R?I8vF^_Ry_r}M#cXa=88TB@4bc>hxQ zd=}@Pw-Zb>^fyZ@#Z4m=4^=Ci1FDFYEZX2cn&LbdoHul3P%mxX?^l!dRCh~e-I6;+ zSBxYLj#e4y+_KOA*k3`ebYe<8kNM7h)sVaJ%07F%vf zu#(ESRlUusPT2hU4@a;*II}cLV`Y7v#!815?M|K3a}q7I*@@PDATL(MAQ`ewJ8DF5 z0te)g(uw?yiY%{c@p|uV=zBM)({VS8(_O3PZ0Wk=Cdm+XORp49h)@b71u+~6gf-$` zJ5bti&a!&wKY+nn$IX8ftNXd+N-^|72&Lm4uWZCFSeo`ud@H_USxNfwzmM-V1a1G_ zwATD;>sD|4cTLyLm*f8&-`mv<)!i1y6e7!msZ^U%%c~&FV9bII9GnG-aR@}nyp~Dm zr>ccCIB22@vQwMyqmi)->O$3H(o+OM2Sk7)!-UmJBBZz>&SZu4pKScila0@xY&>{! z>laTp?mpT0>-5g8e|zJtYcEokFDD^%e(uWL`MJfpJxbFVFtapfCPJn9qnPFvmK3o}?YiwLJbUd-44Xi)XK1yma>6bAL8v^EPWN1<(=a;@&07AV5Y-8qF_BFjm4c zd$?(}_zamc#$qR-^10gfN6xSHzPtHPm#dYPYW2IDKkkL7v2jE?N_)9e*r1m2To}`x1fSFWUSgL3mc$Vc{U#$H4!~4CtFsxQm_^98N zE**PZW(p>SdcrXxDdrMg7Y8&tG*L$wQQVPe5N8$ij{kN1VEpaY#@5a8x8rY`h|#?i zGwO|hGQPL<+4f)mas2D_uf|`eAkxnWz(*&mDO z88VAk<1(X_XI61+i=@eJHkEfS%;zal9D#b!v#a9YL_$ABLl~31@PD9?w$}ygv-*$_wF@BFTx9S|-ZfxY4-8 z9(h1oIZd3)Dn7XUG2E!G#ecP@hpI%CmZ*VC-c|khxW_zs(Nj5128nX`lcF^6Sp$PLW?JrfK+J^a=xDL_8I# z3?NuTEtA${-S1Zh^%C^XkLs#k8dlXxysKuQDp4cL*X=g8C44Zw33!?Wi*fZ-gCx%o*W*RsrIW#NT)m^HGMRZbl#YjeLD@|W%}Er8Ewd;Y141)n)}U*%jmHHHO4} zr!;Z`a})ujI^MOx)2sl*<2pItWTqj=}z1OteV~OD+E-MK#(<5IEjL0pp7sD1!b)Y zd4T=^K1y?o_p$|_*8Q0mN_ru-QUs$JgdjSj$RY1JXH*-GsYeP3&B_*;!CGBKy*jh( zhd2Dv;FGF(Ie}?cM0YZelG$WMvv4m}N}~uzNLekY;K>3Yf_OnS0C06kABi;)%XX9q zaJh%>=Jk{aG!HIC#Uh2g1Q`rP7zYj*>vYx&sY2Fa--q>&Q%19zHWjMda0hI-ozg1? zGl0;EMk;9VLeOKx zA@&K_!Eou17W}I5!?oq=qg`c1@k^f9p0mc>pJHUEZ&+=<;YjdqFZJ@DJok{&_r*U@ zS2wor=c9b<@T0*nF7b>Rxa)78{czzjkyr8L6NZESQ8Xs~w>KBgF3g|3^vA{EFvfMf ztvy3ZV@+{DwrTj4jLNK=`y$k^nkG#?4~%tZ{YyU?vO8lYz$n!W>15P~=&dW|99ZTl zH8$=+1&(ED#^ofGe(z#`lsJa}|0h-AGVjIT^Mii%apkLyuA~h*lLu3&HYte_mx{>X zwZT$>h{h_bB{NNzT&zYXdxmK1m8JzI$PS>3)y{`h+YEppglKl4Aiz0{qC4Yr zxj8q#ZXVqGu&&~YobO$M`UW(FaIW%%w4CB6I3RVwh55K>xPDR7op#fh{IV?v#E z#7AFHd8CN-S@*-G&0h}e@_O&ea;l}ApcCqDiDNS@reIR6Cn*$Vc_5s-=%!!>4q<{Z z2+Z{1HuzI^`gYKr|Dn6_YU00hi*r}sxv(&IZgI-aZJt^RiD%3)Eu%$;s3F(^$RMnt zU{UZ{)u{b5Pp1dJIX@b%MnzfOw|;z^z=F+gSASjiDsAEsQ*QWUDNCIu#Zqho!ctP; z%mc9jbYeR@C73;|I}td>;Ctetro>Xr2~ z@B6;5;SYLqYu49m$@qb~cV$>b5!b!w623jEmtocv41!X}ux>|VU~63K!wR=t8=R6f zs(_=x5b3E^G_?_0A7qxpcJ{*)nCs6N1^@KtDwQvG!8q?Z;(;+0d~$XqF%|?>Sy}i6 z7(ToM{lUjo@51`P#xr1fxc_yiL^`*~DcMqoDqY?y#ZqjEAjUX~9k*6HkG<4^I<92U zA&Zr6u3oQ}M$jAe=3!_?Zqj8s;TE>St!eshl_E}uyi^luR6FD~(^zR|5tUd{CwcVe zQC_Xj+;D00=LZfUJEl-e`$3(QUNM%@QPd*iR3&Z7T%>qooBT6I0_$5=5w6`5jv(GsiZ&S=4O;3Oca6d}=X#e`+` z*nU{2@kS3HOiKWDkRAZ(4&jwT8IeOFnvEI+!Hl_NPx83)sTLux&GuvH8yLFiulxY& z-U3`tqv*dcPHJb_P9-Irj(E8)YVWkc#A0sZPt1j+oG>XY&x?e8Fj&9-@J>UQcmRXd zYoVfS2dIabo4G@LrD&>%q5~!z)}Azv(7s zw#7!BflaC2Xrd(#2I5~m=R8^&#>aOgsAy?qv6SBW)%NJS-+g-TcYptT_O7iruIoDg zl>@z`1#D;EFMTMin{COGY>1Yd_$63-@3qMzl4q0|j%w@4vXY`H3%_9FK)%R+VEsB8z1h#Mf&7f_J(R2=IUH^3h~&^58KyWCIp=VF>#W;eYklv2`>VTq zu&eZ?;}`z&nbAAuKTrHNB`Z%ijy#XZu8~5r!^sf0Ry{3bP{;%4%-Iy-DwaZ_XoSM( ziX71T-SrQy;!3F3Kd4?_|EPR1h5O~4`Lue36^orYzwYv zTieTZ)8KM<{WrB=s$S}>tUwc{onOzx$B7+8J4vxEz90!fMgtKPPzY2!2t_#sV_8uP z%8T9pwHn7_$3q!lY>soqT>CapGC#t&wY~)rqtZ0*?gLI~^ml;>qOq-!sga&lln};q^+X(NTVQV zsbPv5NikZ-vMU9qo`7lA?tgSUdGO-Q#ckV3w@`XgQX<0mIfXN+#GC2qi^ zjDiN?oj~xYWU$;u=`5#(>^*r57}7;jT=tOCxOyEMyw=B+sg0WRKzCw;_2cE)7IVo# zY7tTpVx2;vqn18cj8Y0;)SJ23uN%w+GtauZ*Mt7X!S(jy>1=!3SvdFKNsw(JR)AI+ z3SfjvkGD$R+D0XSV#2xv;^DsyZ{7dJ@b2*Q``7QkQw?tpZx8QQ!@nPXaR2T5@1z%> zrvE=1-Z}QXTYSn6{p61?o;i2!%*h?SIwQGTOwS7-n{;Vch_%%(qgdq5JIb6+AA-tc zVN|3PCjDcPe*J2AXZYdpgW=u#*N2}BKdA1%oo?@o`!|NS(v9B9U)rQvhb@PhdFxl2 zYm@@jR->#imN6N9h*a@(pIilQ38Pk(Y1BOCXmyPDbVCdaDY^(jO0P2^q@{uj9yudE z8n)w7uN@+6InmNTm8D)6UVTKe_tckqUApkfjP3IRZ&MmCDGyAiG=Agp(m@7I5Q?Y^ z&NRLB*ZI6dc>a{_&OvV$U0Wn0l}a$>BzF{al!80wgEuZ?T(o{U{qp^gBF^{bq5Bgo zMBgI5mT)>kfJRR}I)lO+ZX~zTP?8=}S9FMY0$1v5IBB>2rr{Z4kIWQTVZQxHZmlu2 zI*&LKg^UYIBSuag%_~czEGq2}|78@S-+mZt-T!4Z{P*GQ^kPfA)$Q+h&NV8<9|UL6 zOe@cB0BfsVlu!xGv*fI$GcgbhK%8)vawtmaPr%CBa<|5-qv`!aypMDId}xCfd>UKm zBMqh|uk6};4)O05ne;ZTX{*Paaub-qJYOUT^EPVXK{*u^DGFRpVN<^EKT+jnD$E0n{iBI>wDRB0u&9#4cGy^BDgDz%|(x|JA}wtVB(hnqaT<&9w#2 zq5(+^4bD470iE++I71y%rl>LXY`JtsCpe%dTaIN^x1jrE~bn)eYOBAo!%sN z(xYl_3klXrrP>~UA6!%^|1%-kU<^SdTTD5jLKRhva#Q2_`^{)_=limN@n|)#mV1mX zShv+ZhmIuG3lMaqItq}~qXdG4(W24smouw+KR*rqLtToP`AT`|G4EDD+GXEQ%;WNu#L{C_LE6 zi14nc2e?-^i*O~q@2D%eKGZ|rbJcrHOWQWE+p1q=f#_&8mFN}s$n!Z%fV@W%iyA{N zbh_c$mph|@u%@$f>>x%}!g=hl711s7Yl){PDZQi$tg$Z8ND`tQHT^E5(-o?w9b$eBx)yvC1vYQ|L@~>zy0{bKYjlBzE2k^HZzOGXUb)4 zMx?ER2uWQO+Il4IK7!Rn(xdRVS(*Tn|Y`-}O9-w^H){q#fG?>gH%RE8Nf>bP%J#b2j z>eb8Gq@<$m`K4pe2b@P3huS7guU~9|`YEWMPO)vU%7(SG!b%U;o{y+guHV4nqu`e}L)}*O9B~wdau&G^%w&onYZMhKeOg2rbrx13U3L1@ zLvBkkM`m$nVVA;~;M$@Xl1a}8dnRfnNpxCpP{Ibrge&R=J5hI6;fD{{DYtP(jQ8J z%-m>~8trWYYzt}Bj#)@}X7+6+3^h?o;ylF=iq7`W!j<^|>5~}kD^F*5G{xT<949_{ z&NE9NMoA+G^jhudUFWbxw z*I;=miL`+^rO*?c+-{X$dq7cXr>*tQStg_oB%~Z8Fb1|LLOBO{wqj={_@fqY?1IGQ zq2$_PXpJITO0HONnvj$jT44e;l(P+%(TQdLhn1f6Cf^~o<1pD%Df7R0?$z-^{L?M- zpT2Z{;nCdJj1>BVXF>8{99ncfMgJy@mX&BPlw*f@MemP(bYfOl^p0+=HEvd*BzY5% zr`{1ESxVV;Og7Q`B0o1;DO=~#0XBOYzs-+l_Szx8@%Y`r4}os0cELyiK5rJ&EV*Kn zlLw=OL+NBu`fz&fa_7qB&B4`N?+&NlO%DV&Bi&N*kc8-+@La|qF(?Z>SYlKl0(lWp z`ErU&mwMOM)^9fTvFDfib3AuxN45#DEu=I6*UBaDB>}kec{_Dv5GAD4tpw81`kB#% ztB_v53SC(2!&_t1WJf;OFDoui6J%SIQ*`MRiMj7K#JtT%8EMnA?71%EZajVsyAIa> z5H4pQwten%)8tP+-!(@A+VVVZn*>{93OaJ{xI(5lgUqXF4MpY^r$tZh;KRWe_pT3a z4?Z4zG5F-c=eO?tEK^Glem|%Do)sTnfKzK-@+xpef(+4Gg3%jDU(N2FmO1wCx>lx* zan9R)rnLLCpWj4{EV?l2rIu7v$Bpoc02O(Cdyz%Bb?@za?^ap0?!8kD{&n#C4L;cX z;@5-!zIQ#nyfyfAZW?CgSZX(bwbd?1sc?)LNPi12s0Jdf;mLLcS=3uH{PpON;r8%< zhMy1b4)5Im=R8uhy8M(?Y4Q=%c(2+?Kb8ULn zc0{_h4jSpLa3VL!IKxufqN75Afsry!tieAG?%w;w;IqN|gS&$-s=+^`C+NoD4}(uP z-0QwswxgN~mB-5^NVQa_NCHyBCF8<6;y?xMgb2=ZfwHK}`Rkvj|9jV}Dt6oaLA$7T&yu*$^4Ke*KGZwbmz= zVqh(dO2G^XnTx`MbvAfzNzrcbQ=Qeish8*WW@a>J8zSv=L=hH~GUPUMFPY(7$!L{# zmMBS086y=eb+K-G%W&-ZrTNmw-Bxh7h_5Z2JU#ME28v*$AOwJNFo961NGyW0+h6TB zm*;3c8Je4=*BVS6Z4lnOpb!#%CK+%IhB4q!RC-@Xo@M3B|LSe#4w{f6=uzEkP7}3h z|HT&JwMA1Afkac~(Hg^u*IX;$4nowds7RVJ5nN1x!IWc^qm}CIY8&PQ(X~ZUgA~+R zFzBrXs#9dnU5r$4E9?xl%8plP_oh`=&Q`0eA|`o1W{ve$2J5Miplnb<)1X*U%jE;Q zBwVh};o3&VKdmj@j))oOXO`PKRkn$+HL^&O*Hc`Y4631oTj>cJAeIy*#y{=X-Nk-= zZNBAn7Lu4vXtdQ0&xGStqaZ>Wa7L%lS4hddkQ;ODhqOWd>?_kYOC4x~{OHzN;}-IW z5K_ZXa48Hio_Xzqh*Irx*`r9Hv02$Dedg3mECl<>!pWCTpFchUy?ldh!3&@%i`D}W zCp~(lnH5SZ&QnaZt5pOGOY0xiy&CeX>STJ+CLlN=wnKej} zPP2`}be@qFWMt#QYl$Q!%y}J6=J9suP@)GdX`o1`DQa$8xP}cbuHRglG?1?5_WI8JmriawpPgYPHCr;MAVH{kP3C z)4;bahu>xM-V{9A>Ix%{GU2&4#v9ZwIcH=*spo>5-K7IMVXB_pd&c;pbm06O)8?G_ zkJ40-NtC9eyK4;{4?&AyBVhuP!B*N55h9P288bsA(LLWD!1RojM5zD^j2Yr12CGd3 z$^~SSAk?IY@-cm=uOV!3P|gnoCmaY~nCecq%C9Y;k_(&Xx+&=3sHKu|&ybUtvX`RZ z=*q_IVBHxjh0ftD-O9OHdTqh9JSCjUM6M)gm5CZT5ju0L5mr=1S%tScYrW<5n`2zS zb1+K}>o-fUEtrr@Du72KjUrNN2apmO$*k37%+4>=qi8BK#N(7CbY4){p`&+`_}ZfB z7zC!R=b+Lr8Z9$6pyH0FII5_RW^n7?^}$Dj+k?BKY0SI#-o5wEd^m1a?D&r8wACB$ z1oxh3bfEHihGR*UC!7~*!)yAhyg^gcr{JZ!)Z`dBJzWofGbEL&skf~B4&WM%w+_O7iruIoDg zl>@!>iSE8%(ihQ}%7h}xuxtnQOR@HiJmPRhor_fI$ug4$1roGDiy}dbHfjPCK^sI$ zDm#)T`+?T$X!I8%BtZW~_db-YA!j(;)RsijJcc03p3=o0TC|DFAFroqymLklgr&$U04Hz~3 z#XA$~$FHX8$Y&XHYmasVQfeWVN{vA&XLQhn2Jl2;7up9d7-)>%p!a z>%zAqZzM-Rr)dt{#U?0>kX|5zxI_dL#au{kFmsabPD0I6_ZO{J)TEj7_sWl-*=maU zME|coJQ5f0n9aL*fBtauN-#Tgx<7ipyI!G=R~yCT40UhYNIuxo9KYnHt@>OIV657dQ}SyyGsi42e@M12CsBr94YvWb%{ffPN4? z&Yj8K$%9j;N3TcnacA5tQq3qnA$^<&IVxtbDYX|RkrRp`Ep#x^9T235MV4?wT$Z!{ z`p4iJw=`SZ-TL=^{QLCUl>!+LXk-|6@tC&YVxY?~hZyp@fN&O&k%w$X)4CVQ#e>PM zYVylyYd0oew$lptn^ve;qm<{$|1@m&l<-wsQWc^d-H}Y zwdcw{Wuen+R|q6S1`#4rst0A*NJN-No+#x(Z6`gBY5mNbA02*LeWAWZdcacfu(V*U zl$=uLwbp?N69|pFQRj_5Tj?*o@4J^q)iB!Lav#hks4l`)*NDl@POUz4tdDf=YQM!S zMVny6zyS#qSuX{oQM=NE7RuTzw4Z!>=gH>po@{>cWb+@NZ2tF?&A)5@{*Nb{_fMU^ z^!)zz<%FJRmp@oOyL^6mPs&CRl1uT=YgaNlN(cB{OWF^pVoM6qMFeF*bIJ)PIyni7TQJp^mqGo%F7)(85DU1xo!{1SDlA5bFE|LOHNUE8&GAsIeK6UN$YWz=W z-rD%?_f+#%ERCzu6mfA-?Wi zAKzoOcco7A)4wg5-c-UzPfX!NK3&)g^ipdSgeaUUVw_SUVB-R#)HCV>4O!(A?_Q~+ zzZ(ta%3{rkRjZ}fE{b&Ip`BU5QcR<}4@x^~ArOv*i6~>nC`5X=eKUSc^@z_czjajg zh?_?%#myKL&+L$hpFlir#el&I>@}u&q5FH#g^jji|J%$RA|?n*k*>93o)A320XG( zQH5MI`0Y8D$21{=1UsCj{^pHKQ4v&bUv@CZ2}6;00ym%$M_Ohbavyfr+Z7J+y({=|B)R;?uQv~G35CUKz; zp2-ePi6IgLOF&kq$s1NM?ltFJNz8oK#nfN+ zp?iJnvq3$uYkp8I2k0+Vqpqt~1_N02ruM@a5c~NK{u`;CMO_n9niH~7&VS{Jr6c3u zUq($?EqE+jD<+Gf+IXjs$%@hCNB8l_^bHwi}6=6KDZs@gC<6(#=mGjeK&sU zi}Bq@n~jcQ^M!vNe?Gn+Uwtn|6u0B2fAhNTzNVa05^ZCP@4a`9^^i;WO6dcE~ir~5P7 zkL_W#U;EA6RV)RUA|>M)Wf8TKYKEN@P6rN%d6v~B{_$1s8cE7UV}DLmz>{u=A36svXX{Vo$s`{=Dl+n!S4FOCl$-gX4Uya#C$D@7!2`d9gi8 zAw&$3V_1x|0gZzM;ssSiL7qKAzvrtD*CK=-)?0P{17kb8ex;ZS9GImJNK>MZB$Xsc zuB^sBZ*sc+UiZ!Z1u-XUrygK1Xa8lD!U$!sH#pKb;s|lrJ4#(3EV^VN^SY=89oQJG zL-qc%6QNoTsZ24hZFe+Jt1(aSM|*3BHOU-Q|rl_F@d4u%U)C2;1H;D%Bb&lQnwrVlVdc0F3t`51;iJ=+$| z`)C2(bMEWxDwg8w5Wz}oNLtAZke89dTf&%8jAfk`rZ*g1g)Vd;vd``mi9ePnMVop2 z^N$xA;vBe3P0-7Lk>oxAK|x3&Ez=qs!bs*s&6EJGy93|pPF)uqOY_@#CDw|J&D!5C ztV?Y#1mMAYL$y;_DCYul9y=Qyqs$^Gby7x%Z@tashwx|B*^!x6m^hYpc(mPM?qGoh z*c950#3)UoAW{<@l=H|3fuj3zIuL!JZsYC74Y7n@_fDT*taq^&zuot{Plw#?({Bw%OC1==A8?T*vvQQ-t=I=-A`N$t&vVJp`!=j5M2VuK!c^$GUKzf=PnF;>(%*Q zKlD25^G0@`RHmEnn88FaR8Zlr%jR{Ja^ymd3OT;Jxt4wNd%UDQ(a6)+sb2f_m3oMJB=!OBKEKoVzF zcXs`D9>))03gtFlIG$;f#nr{Tu`V?}Z82gLsI&2)64G%3k*QkeGzgJne9$pzH`p~l zuf(#&b00i+Eng{|z^n&vjg&;jvjcgoy~ipr?`YPzsPVm~p!fEp8%^EsgI#^dt=iEc z+R7f-l-i6z)JL{qf|gP<6gWXjC>_~|AZAwzqCjl=Z@0hy)Jk;z{kl6C*27VHQ0P<_ zhu1p3Iy0)B|4y~i_sPM1r*ge2hVWH9F{(d&^3$jH+%}D%fBKR?eDbsSihla)NAm=D{C@au-viY+o zo4;x_H19w8^z*|IJ8h+H_S*ULz$vyE?NZp`J@Op94jxjLDtN?UCiD0bw*7Z|-PNl3 z{&IYf4c{H6t#)Pv&Ubn-G|Sljs?lRxy!{X3iAzDXnAphN2=f#f23~Ngf(6Eq z&{=I2gET3-8_7tRNjJ9V^FHVE^x72zsZwDx5mW)uDpI+WbyRVWhWPno+{FJz-G4Qr z8}VTI>$fkQTV6RoC%50cYbhkoP@-uX56-yYF-Q_fbK{*?m}Rx+yWU3Kt=G41c2jNq zR2M|M#d5dUoFy!UHAts~HN>#MJ=2T>38~{S2ye3@;O4$4m12&%ja2obiyBRjOxYky z*KTMI)jAB7g*j_jh^s=DScyScX=s|_9?wKhECEYpUis<(`Y_u1_0(9eHl=nveahk< z$Z4F5jV@T@ER9Du!$_xr$e1X=Knc#vzr3?i_hC4wwm#{D8B`y3>){}}xwiY^z%kRF zD_M#$;}&@Z0!uK;`J@R-Bp1#QqOu%I-C24Q*7{I)+wz_xQQor?k7E0J43&yVl2=7|4m#lLLEVbiejBWCF>l$8b*b@b%z_U((q`?Q4U}^5)FIC;&#U17 zcvQQkW;(t1gL&c&Eu{N6mf0071=To3Ksc|Av?hkOHgMq;rp(hkMV+^Lo!*A2p*xjP zZT-pdG`__h89R|KG(1hxv}Nm!)5H+UwL!`WWG$EgS$+Mc_MKk8KN|Grl`get?lS;& z*YcIZNevYc5O^06MKQ4TQVB#D3&vz+$u6ekc(uIY``6at;r9pYwQsw=UnH*GYavS! z=G5?jK^vP+2%w-5!CY!8u**6r;*Y%Y^^M`^)alNZcDo*s%65#mWHPgTD zAKv%X+1|r{wRLsz;itWB-Mi{9E%w7t8wh3Vhj-11-)BLK5qFU)@wkzr{}q92%Uzlr zAGmZbD~)tvFzolPRNM3HkMUfy=>`XpdKT!S>$BHSAdXCfL#Y_-Zi6YcV22Rqi70xG zH4TP)AZZ*E1q@l2A!oNf>tFW$fn9?ztS%1UsLn-v>+T{k*ON9eJ5%;y(MlHM%$yfN zraY03M-#PH5`v^>+J>yGWf}&5#`pTGb?UC|E}id%LET-0el@D%SE7%-bSa+O7oqE} z)^=^@YuY=MW6z})Q{!^$C^hg@QV&E^hp-8WL(3q7<{=R0)iEx{!dx8A1f=GTOHm2b zA`&D4Pz-6LI0?*hn{M84mZH!(=nT{J&%aqfep#B^NRC3i&XFR&&zG(c#Y6>^m7q)# z1BYO_pu%eBjX*q0(>1#MfloL6>vepf_Ris;iNf9MR}5%?AmVoP+;NU55nd97Jt5wU ztP`XRhCgjMIeBvafW3jjIX6s=dapa@e5q~Pp@4mkQ`$ak#iwQ2vAC#QiK3z7-OrC zaisD_XLJ~CBk5gBArWyifpOL->I0@U^4l0YI*BC86SyDW8-JCiEj4Ywy9YzJ4cUj= zkUfh`sl7;L5TS}AM==iAsuU0@Wl0)&kyWt+-C^7_zFWPMeg`v3V=DLN(Nga_Gp*&( zFU+I&0;AYU9KwPTEM#QW)?y1(bLF^0+GT~!lb=uSOul-&Il0|bvEG~9swV#x{}KP^ zb=Ddm`gwCy>}tLu**+kZT9Hbk{=^Xp(guo|@H+m-De**Sk@&5@A6y?+XSY7PKHR$5 zAHZPi=IW`_YYWEeJZS3+d)$AMfCRmVz{EKv-rO4Tx%l7baxl8V$NbPmbIa6PCbyaoMS2Sdm2(45{ z!tuUsXqsLh^U!5G*0q&SA;%$pve$VOLG-?K^y?*YtI zCDvVMDIO0sC;J>nUpPO5#eCP4V5@_2;^~)IauddUlaZ&J6rt8u0p|n_I#3p|C&+6o z<93rK92k|gycf%Mzc>qNaAbSdfW}Ia)!&1$u;-}z-!8$rm}1Nk(I8BW|5DDFDhxoB zwF>L3^1QO`I_5F*C4N|4P_OZjJAOjnNN z!)|$gIKk(Z(4RS1SXXh{mG3n=}^b?hUcnC4~`QsN(pWpLM@;Ah|U+MpzJ5M>}H(geUFpeD#hCP#-K+?1cGU z*}rs`W2k{PxA$wC`0Bz*Bn@DlRU{B55pteNrmSL|u!AUEnBS z%r*Cf1QY-OVUu`9f~AP;Tw=9SC(1W3S`N8%m&~>#g#$OUy9=sD0NDxG+^ch#u*{tz^=Q`bsX$p8V>uG)* z?~1NAiaK$fOBTG++)5pEFq-2S6}ddl%Ei?*(!J{nXuIMWXvaP4iXR=G(7>8s@;qIZ zb#b-~n?#^2yvB@q0zoFOY$=cpS*!KJ=hytwQm5DItitkg3Gt~O-P6g@106C4trm+~ z%l4#4V?XKcoM$={HK(pVJ1K)?DTGXHh)z0Jn&gyK6Zz8`Pdi4O~H`0k-2Wq+z$A{(~P-K)o( z1xQ_O5uPH#gkynXM~x#CD@DA-hU2WwZJ~W}P_|mpPwLNT^HL}=HRC3R+FoiqD!sZ` zN~NjxM9?4w(}-f}n3YNpqVvXE!^^&Fpmd+#f_CZq<>%Lyp?By=YphM8vFSV2)=!mW zU64ICB(7Eg))7J}bD9GtmNJ@23Uvm0uoNL^m&J<^O+TY^?=WF*HVOD(F_ ziUY!_pNDp?P-~*^84n)PEGfaI51wL72n!lv<#ATp>!@#)FHbhvBM9SWYQiLxM}=1x zNzNHjG!Wu+kXTC3B-NTkKg$@G-9=-F1eedAs^83vKr@rO@rV0r`Jaw94t_gVLt>+47S@>mG zF`X(vsOAJTiL<%$q2m&)3#vlaA<$lJR^A2!NO0nWMkKGrV(rad7ksPNU3(`D?3qWjx2LFc+E{-#lVZuy69JZB2{`!j*vGgo@bp3-&0bo z5-HM5(w@gFSNkB2khiK#T@8-$nzPhN9`zQOjQ*%34iPY%@vMCQ@Mozx5n4nBYCxpT)~ih;+8(|CtFs`Dy2qSeCCG@=`woc<_-v9Yz zr#6z3MSmd87Q~8L0mvA`DY6Mjl(p6`_;|^9*+Hu~-R=!qzAVmlx}norZor+_8QejZ zwXt@AVn|&;UPuyGYlu+=F&t||)qHIv0#`29{%9jPb7Ak>NKQQcQoPj!H!wY1UEshI z6GK7Hyo~=aNMQ}P1~cqg7Lm*ItwFbJS9gV$FBba%{o-h+Rj!t)<<8AW;Wz7ae4Xwr z&bo*@5xnBaBoZIR(#UUNMItTt(Jtp8?tH5S#mU4#6W8?*29WFuBaBT7!(GrlVX>0VP5lTf#(Y z!=cWAH4ydB22PmIbLKC`1>skq)mvV>))0l=NANx-z}k>1D`oT>B(teBO{eiHl;T9C zFSE7}UhL3qwSV3J9^%>8y}%(_1}!wCwd@5Ur1yaW2QI?#gB;=QdQwMOYiv zppjOR2TZA9##hI>##1b59-Hs_KdpbX{^|N>>mPsd>iWB1yuSY5>+crv!$)6SE!Kaz z{#pF)JMsHh8-|G4lxZpzG2&gXOWYqCpBG@vrCN0tg0j)7fnZ!SWR3K|I4I^)Z9~Xn z@mnmHm&=tyN9@)T>5)QJ$*bWNv-(aCFsZ%qD#80e&74H-vTC+Q4?EzR9HuY+<=%(sQ_tDb!_@`O^B9v$ zFcvGJ9P%MVOJfjdZA8`#r8|_z7K+7zgZ7}6rh&vyXB~w{(cy|2yg6bUCy$;i$=Wz8 z0)!}}q@WsE5jbVW1j7+iS>DE}cv*k=#ZIdaWAo`pO)*Q}!OYb=Vv1G8ld|i)3Xhcw zx*dqRnvon(VHA~CNeL`X+ELnx5KXwvayAya7k#^5wmZGzyzf=dkZP`GcCj=k?BgX) zQ^i;lVN5g@X+PG%MvSTETm@x>q)O{7gnO6#s_(Wt%bji-?$Y#L-_MEHL?PCNmd1!t z;kbCQK-zKVvCsh==pa?r_C5UR@aD$V;q{GIh9Ad|H-;Y!uQyGN`^6?qMW?RbNQxaO zM5Cfm!I(6b2PTZAo-jX;+gEf#vFN*|qJ5sxOMyhHoPIv8XU${Xk#dKrd-dI{$ADC5}pADKI!@9VF58fbdI9AFV zOF&Q-u=J8rm35L5!~f#x&Pv&iw?1^Fy}PF+O_M@Kie?Ovx;kPdQZcF%+7KZV69OSr z8{}=!IB(+Z=y<9#YwvVR1O1)md`X?6dE9h4jzBw0khM{EMp`By8u;LYLV*xYx%Vbu zo<%$`{Lko7+)Qi;KOf$TpGK#m_n>=YcXavgIt2%$w&J<-r%#?fxA1I++cy!Ox>^$m zI7fpul4)U>;~=8;Xb?{1F{M5OD^SIxvx?^hsS-d9_w5Ltqk^lAA_(GjK*~}iq?R%A zV;X4UA4gf<-IT+C$K@8!EX{fW1|k3x_e$ULmQB zq*=w(8?O#OjOOmc;rqku!%r&Wo?8#I*l&MBybtDWOa-W}>PQh)Cw1t7b;=47LsZ2P zby!=H#WnZUTQ|OX>$9)k`sc6ypFIZv)yPC3T@yic4{;pE*8(XQu;+K^Rc5UO0_~Q=} zr`YDN#TR~9Z2Wk5J!Ry!*s1+obvW7jJ%qx;gO%5vqkwvsl(FtAQ%osKymf#r#xd5^ zGFa{jw+ga?%aPWex5ug#o9%Yz?RHFnbs^O;U@#Ih2!>Hc5%QdY<=kQ^v-&VL=cuiJ zu>L>m@1;3vU;JcSz4fkDMmPGhbKBKabn5Dj(FiQE0lYT~gf`q-u2WOCAz7zH!(R_S z8onDXRkU)+nne?Lb8k);H#vM~mIxlqU1%CYb#=#L@0A2Xy@+qwDJH>bFF*vbnWG%3 z2%PGI6O?jE@gaQmCh*Qdr62N8*MmeybL#iEZQj~BXf_@r;AxBKl6j;H7M&@PU3 zR#wVhFO~VlA7S<+eKLYW3NW2Pzc|zBbyhn?43<-RezO{|Y)^c(>)1iXl3$H=PBg~- z-uH?>z49*?mdZq<-zzVEdx2i@!!pV$UO&3imjMct$G2HV zb8_gXQJ;Fwa9P^{F|SVfoqN%H$pl%Rg7;!8Q@rMm7fL%rW6C651)RxuSs* z%wp`26*>Ghl-;Q1YkzpTzjm$LgWlS;i-(RZ-E$Wn<-D}45>Hb%vauc;F*}L9zrEtz zy!2GW>*^w7!PBUN!Wl#YlToHlVGlAOpGETKKELI=y@n5>PGB-ghP8nOj->(?J;M;N zqt1KghyVySF9~?A(_QuHc_vk{HfgJ!R_s>s)kTwg8&{|T9@i#HO^`vL7;dIb1kclc zk~Xpn-RLYia7D*16&E@N{-3>T>uu}G&VS{=F9nKtu}e-2!P}=D3 zi=8*%va9`cO59wIRmb;!Th_t2QD>b49Ft*FY%TX5A%(+MS;rj*PB=OeWJE7!*<~Zy zp6;?a^XlU&_}=WYQKK)v|Ep~BKo&#gx#Aj?wLwISk|o0m#+xFCcz*Cv^3nZjaRs{I z2X~I0Se|kqB6G{-aWe1L9lhr!Nw6udQPGgn6(_a#J}?<5RYoXHEV818%i$bwr+lhX z?IzBn3+!YOHbhnsni5bGsfrF2k%H>zh^NYhz>CNx*Ke+WegB7GI%e*3!kjJ_71EfWe46b4?gR(W> z==4*F->Q54bjjl@-FG{2p0BN)MOmJ9Wo;oyO|=Rv0P#*BO}Z6LAVNtr&Qm~LR9p#} z+OZnksTS&Xzizb#A60FrRtE3)>Q;a7Q5Q#|#zS0b8EQ{fplOFcBQcX0dchz51V9=5 zO|{fHq8JjbW1zsJG!Bho7L>QNsG&R5qZ5%kj}8tt7zbf-!*&5Sg)~x6oX(?S(K(*S zIvDsA{A%F7sNnKfoo!QHAL@0GN42<77S!*Ax~cY23le$me+3h))=qLJtmlGA zU9^Yz;V~|*RxiOy=Q3U!p#LYM<`<#W#~xO`(@lOq;{ZPWobuh}+;2Z@ zna}O(b-UNE`)dz-*q8d(TA243h9{0BY%Thk(4afgZ}D6%u_H1OkAylVw<4c{aSZjB?qDkJFIkmuX6y3p22{y*n3Z+y4=9ETjl(z&}pf1>`i^#(- zU^l&HC-?eaU2EqFtVdhElPSbj-XJ_}Ti5)=W8&iU0+BXF9+}Vv6qsnKWW;kzq5%)Y zYG1_d^V<0{$4>Ni+{6dmFu!>I?3tfWkEtJhu%;4@!~nCInx7jjIYi+J56OI@mPIX> z%iucSzC9$A-f1ikxSaQ&m3v%z4Z&0tqw_rTv2lY&3Xw1bMGTYF6*<7o8z1DA$2ab6 z-uSQ0H{aU4{)f#QcQ$XlyLscw%^SD!v<9z7NrnNw?U zc^bj@QS;H|T%M05*Azo5yh87Sbb(_^!-L{fF)o85Wx@4Qe{i#3{S*>vKb&INK5dIS z(4paWpqpwQCUvvUN+0v64Ob&d%h3kNf4yee0cqx@Y zhRVngBN%Tf6W;nF!@l$jc%#lm)B4+cDF(VcFGKBnr`AqL8fuAV#zd+)>fogj)(NS& zvxqtUDC){`=@sX6Zo8%!)9KvCgx3^G9;9-D1&KWQeHkH80>K;4oGQBE&td0E3;&{5 zy_D{7pIKylHM)pop|y2~NYL@Vk1|k6%Ft0Ha^J>MS;Tp@v6khBk zu~p}XeTUPwMI5b6VV0FKWAbZ?r=(heQ(S|ODRKiRJrw~X$>+C4d;Qwg;8(soxLLQS z4-^&*8XQSLw+pZ-qKaBaHSs|iPc1OVl_W$8DYPg$j1ADMPPbOl*F|i1(wkKa5t4B8 z77wV0Z|mW8IJO6UN&a>T8)?S zn|s5>ghQ5|t8>r4-=2R0CQbE3gWwpAEix4wzsmg6L+cQvOZR2!aWqqVd{tK^OIC=ieLUseQ(JOBgXG5qB5ljQo!hvKM zc>uyu3WqG(vXu-=gWu*&(^Xw9<{YYx%iYeg6Mh`%k!kveJ36QJ+>cm;%qumYOe>#E z+ZBz*dZL`y5TbUP=}1u}^I%N0B!zNCE+T#Dbk}-sjPP$Cc7~Bd5(>Wdl)5yASX2FB zA~*X+hC%Us#;B#2PDvUu_@b8I|GoF|gLglC@Xi;6# zA<2ktjHA(5Ig-CIj3v#m(o+y7Xs;YfO1&v+MLGwo!!T%ifB!tQ-z~ErkzP|Qd8Ws= zJ_U}RWIA=m7*CE|dSOKAocp5zv`4%nZP*b}9ARK*p5xml#>NP95veqQlnQE;)5JyY zi68_?5yGbipLGYHE$_aVV^Vf7&FGWX?74H@GSY>KI-ibi8?ph^m6!BOcnN-GtIqSKgG?FJuq z>r1`W!B>+GTIZFKCs14L5MX0SZSc;^6dI+>H?O79!2x=azSAOBpL5;1?dvO$F7w*3 zN3R_^-7d_hXJ+-J(*)TR<=iskoL9`J8&(JhkxLQ5sg%U3**xh!LAOf@Oo;8S^qF|a z(@SSx=TxcJ>FZ}ME>5az}_P+4=D{+*LJIjN; zZJ;z&l1O5(lF?-Fxr~7;Cn5$FEVWxRG^ImuR_^H#+`_ASJp?BY*btm$T*=&27K5{b zcu-2E$UG{=s3<-B7}jf{y0F&$=KcB-OyaEAcb9*lqqSXR*ce+YfH3bAr78XfFhq0Y zE>bRdQP%w6gI_=R_q+f1-ftiL<9iQ2x%cNUfB&a{{`mRVq>(k;*#)XAll1FqZ8>7jqcfV*ZmAHwJ@|Z(_39#3^9GW;V%%YlNXOayfyMC!0wN$ zQ)}35_wd?}t5*h}cayna8^%qU!zT|5*1c7%R=erBKdMfzrk_JnWoWnR<*g{|;p<<R#LwiJvc8*^dLB15*vJJ zix+-tYw&!J_RQJNcKJ00)UlLb8y*1Au*eJ&o?=^?3H(e^zu;23la4RM?r@)4d&+*# zqZKKY`@QV~Y>H?E4>EY<9!&6(MPybQZjt%2Q_Gj@@a-S#>0$5D>i8@Nb3}FxaRees zh%_&1jRqocVN7Hi(?ckWQkfpKt^j~Qf4@TLba8OIGpTqxx3y0wDC`hmQ%I@eA(F^K z=FkKxQ$|CKq?CF|ir9FUpxuY+)z_5q&y%C4r8ciQ3A4j^W;z{oXHNt1+ehw^e zk#NW@CEA9fKpxh5DZjYc>aAXzSF4}GxonqTQ$VeDlIb9$GKP392s#inM!|d;BgDpU zHa^|>{l=%?y}9wpch@&Q-}vv1uQooZHvTRB`sT(T(?1P={g3plufMyoaeL#-^qjl- zp?A}-cZMUwUv7Mo{_OMb{&nM%^r5=X_*`xBp!moTg5twwmkGn!6GB+=YxJ< zlA=&yfT5K|6}-%Sx0<={zIne5Rrhh7aS;M6LvJ;+-1ffjx|pXy&scRzDT@kmYN}6x z^4z6EqczDtcorG=-a5sY!XmFQEVE#{TD%7B%fpMhIyts{L~GBcop_GacW5KXlsB9|nY7)oVuo=c-i@*GU%d8eY-@XvQ|{pnwBJ@*EIxi^}uBO`D$R1L?O zr#x6HO$@}LrOXqCFObXr}aOq-&_BB{qFs@)^Fc`d;R0}+g1AZ_5F9M^O-E9&(cmKm!K^ zqa7-X-emUq!#rA%Jl39!R$Ms!n3!>-#cB9%O`&i`Qm&;B5@Zb2B8`lI@xu7Bso+(( zbQ#)PvsH8E|Cx{bw~4PQoIaYE0vDzNQbKKtZ=<)y=m70a{gqxqYo|l(3z*q<;GO2siH@M47A8BmCiV2rA2GBk=oj_ zgWpqY5U|x*yOOSFWq!yzbJn#@evR=o+%rrW80U-_;yKkpbCe+x3Wu0*lo7T6grncv z$C2=1cx4S?^F$LyEXTl!qf!b+yyXtPpi~!y4?j75_QIsO=K~%%6l{Ne{K=Zim`c!? zDLs&KlJYZ_gJn&S;-v2Lt<&VwR(_jYFQ;?yT2 zVU;9OQY=!wC8*o|<3CA$b7k;h(z$Ex>e@;l>)znAV<%!grA1Wd@ta9jv}agrX4djM>XaxY;2e$ z!KS#1kX$$=(h?dqRmqP4a^t;A349To#roahaq#W?Z>@i^etZ3^`|mwBdV#sgf5KA7 zU9f4YGg3*-J%W%@IqQ8CDoCZg(NPw)zx*68W4oSjZ#?ws_u5qT8-cm0%4G&K9<5Lj z6ixq2WZHsfTIn(Z*bANI&ZOhv@uN3!oE?BoP6z9l<+0=%W5^V807|$fGsgx7O#s*`=2prcmzIY;YTXRpg%>st_NDCJ`e@S4*yBIUA1Ivs&aRwJg`jk$Ts&CLd= z>#Cl^usj9HF%8T|L%<`(SRl-}BUy>XeIS=^dsF4!CZnTf@T9(wr)b%kV$ASE+116- zr-{+TMKC@pL?f|OMA8@)p*YK1y5q!D$<9oNiOyBNIkTW{s=Fx*DcYZ46-rh!h z(A7BQHsaO_QCC-k@;X8gWe|y+NkqZ#4Z@?~N!~!518ybtg-;%e^=u_q@)w;^;nhSE zAk)EfZMncyC=3BJh5v=5MxrdPi+1O1XTh|B@BHwq-a^?-q})czdz=jG0*ev$;2A__ zxpcA$KsgG*3#L$3!fZdd&fQ)p4z_zM;8XjuUA%5w+ORGD?igSaS{2FCa`^k_UhH-r z$ZoHBtRodLN~G9|PNHx_&1CGp9gQj2d`Eq8lI*)3B2XX;5YEIZ-%cI z{r`l6@A_X4&R5O*)jO`;yWCYc+4;c-{jaJQ;k7GOd;c{!#l`AVaBuJ_c;}zt#;(FQ z@4yeQjk(V7ZG&H@E5T2%r#Hc8igd5(gGK*K_&w4+-yEEOz8Wt7h^nb^bPglsO^qZU zO0u?Id!ih+0{krGoL7!VM1&D(DtOkU$7R!-Ic9EsZo0#cg4b8tp}pL+f9(0ibuu;4 z1la4UB=<;ba8D%nHhSccA`GHD!HJ}K^}nZ0+vL_m$TXK0H6<^j^}n0tS07WKD!E}@ ziNx@LEK{6BN+eM%i}bAjaau|T@4-?CzFBwWF}up+d4`%v3mN|MCS>aBiqI}bZv&1o z283-)+@szq!E`PO$f+}BD^1-iCu~bA)R3}|X8;+IUTrKRpy;(yd2@kVYyaI_F5Bj3 zdnM1hwZHnLp!<1s_VlOLN&n&C@mKdBJht!f?7_JMZ%kB(jj+_!3CWeA4rz~wWsXR& z?+#IA1P?BY67_^ByI~XA=^pJ2`>8#EDYs}I%D%1|DB*%cky*xq)r3T8jAt}3ro+aF zdSY7;)@)c~veOktTMS_n=!tX+zj@@?{*!ZQq|K&)xVmI*JdAPCN1>t)L7Kn<@yIGk zl_Qx<#btZBm;+oAchuH3LC;#9`7~6-8zfj4Q|&R2CJ=6-6gqK0OUDEbk{Xm%8TN3l z&wZNnNez|H7DfEDlaWRwSQl4AoZ!eH>apQzjsqreKs2G5uGTop&JW?>dwAh8{QI*1 z^+=*_2cs-i6^lN38m+ygLb+ho)+(Vigk07TB%O_cP-H0QDsc{E@d@t-A92xi9mEc9 zPq^>9Yx!R2U7ILf!aKOP!s*!g= zDU;S00!s>|mTDrh7M2rhmliwS-on}+3%K2KdF`uixw2Rs>6{7k#i3MIwDuL;Go0z% z+NCpPueEl=oi5g{p9_m?Uu>E@FdFx(%CJnLhuC>5^wbb`)`zXG=CNS0#7KoGQbRs* zTn27=HMBWvX?f*LVm4V>Y6iScy(cs(xw<%V>AjQIV&({8U@1Hn;BFGmyw6WH%)DNP zZa2(?<(awipH@Pv({4!JAL4rSjf1ZoJTiMYx5a%6Y1YMBFyvDUBY_UorHEt!dkH%Pgti**2P1oq2LbNfM`f0N&;iX6(bQ_k<|%sc<;E+nD4zZ)(=&wZil^-P#nuyf$_~yR znLWAx=-lkVBV!)4>Z)}iafoZ`IKeRlX}Quy392Oaiki&+@|HPUHl4yxLCRrrr|>$U zYpPvDo=6A{7-JzoxW{ZHaDb{=GFhdmC(NQP=hM*aNsYp+8uGEzl#;uCWgit@T_lMQ zT5|8BCQ(uju^$&yE2C3CUl!RwSTe0n@p1qaG_Gvl`mlH~Zzg^7M(Ew!W!sb~TtCkR z(HSy^l5>krUp_;cc`msw_mmjb)hUW?qLinp6;x|UX==2goGQ&tR$Td7s91C|>x6aX z0PeUiv0HRuEaGD&SQl3T0TwLr*n5v93z)G)WACX%EUyeDcGv!^UA&fB09QviA{vKd zZ#o>4+YmN^U040A2Lt7F;GPpA48)ht`LzG-EoIY%9~!3&&yG`&j1NB!&7OEN;m5I~ zCn*-3`D6%rZZLK*~LJ!LqnI^oq$t7Y0AtdDI1 z{b}97QQ_4_(qk3{(%72BY)Ci{USpvRMlNLaQvUF1*(;XJ8RN@#xoCPtJ1m6q*88O? zmOAH3SI+cI-I;y91mr$Y@b?L93H}#_DTnA$*tcFuW+c->zsiX!BZ+1S_Uq*xN2{G z*eiU1Z<8xD-|0O+;+Jl#jC`?rnx|-z+@m6@t6PC$q?}jUq`3nqq7cDLbTr72*F4f& z?KZ64Ple|&xjJGL=h{lgt?~Uo-UnhG%ri@?jv1W@gVHA zng&LZcSI;+x#iwOVGYmP(b~7tHEW-n&WQCIliI>fnf_*8#8JuB#St@bJ%aZJz(h_H z2B=DKNVtwXD^&5J)#?<9tf*6@V^i!amzUQ*P2Uv1tQ52jw^}wuk<%s&@+DhW35Z33 zhBR+6D#Eae7+aq@Vu`Xbt4HGxgSQe7$l!d%1Ty%S{x^wAq#_=<3@=~kUxqhaPlP0c zUngpk;oC02;ae4z$jyq}+zczk=v6R*VKyeh_+)QvWhA9(ben{LsEohy%1 zh3h_$RDd1Dfmvs)Qj{wWE43xc=*Y5~rVbehq}vcSA2Y4a*qZc_ZAG#bI?t|+9V5T` zn3`x9@s{c+F^llq8tO5JxQl1)5#M^hYz;@WZYV2njOn9e=yk%Y3nhaH+DoiGcN|e{ zS#XkgOqIrY`%?0Uy2ArA#|2c9Q_> zLK>Y`5H%`?B0R{96Yhu*8ZqHbR)tGaJ@-KMe%Wa)^zMxq3=73;sib!k(4!m+!$Ro1 zzEvS-Fx~-f#iu4)k%>)x9dZt7Y^-2Pa1?|@uv7>Mf5eo$a0gOYvm&ZJRVE zU_3M2IvLi)79*v2Kt6Cz!PtZ0SKPVCu_vBptq*ghKWkQtgS}Mn*&FHEYkJu0$GTIl z2V=0Ps~=P)))W+ir5@}EMnVL_5Y-6dEQkBl*&!83Rc_S`Pn$Xr-YCD?fEufW<|>WG zQ`{)Rk>Ju`@0icxW4d$klRFpx=g!4J$wk_C6OwA`sH{vyr+exbb79ejZtrxtw80F( zNk%*E#|tZ+VX->Hwm=)+>XD-la^UHF@Xxf%bHmP-?VPo{)BztW%-D`!ec`~%$7e^+ z-tDxu18e%&3v&nNUP}4;y1;1g@dG7+MH)SIHYz2sQ4$+I?2s4>%ockkd@R%QV*%!s zH~;a;0rTdOqq_|kfQ1G_6jInY&9MU?NFomrw$Dpe#fk&CDfHf^>D(Z`x^Q}KA)fUJ z9xl$|fGWx5os!;b-!zAuDta-e{QvG_m)?eSKNH3ZCdTsVySyBobC8_ zxlnY2Hw$iczPlm2O)?uO|=YE1Pp(r;K78%7Z+^S-s66Ay0e%XK{v3#jf54Lqr!1sQ z%H~~zjTBvY5?RDE=ZQX2nzivZDk{#vnnn|%A=C;Q;n*=OveMOypnP3Z_C}U~rtxNP zdIFO-$JPN|TkWh42r-3da3X0P3DOc0!NFr$YUjZ)g26Opv9R{dx#hJ>-Ja>KT{@Mf zJ*+f(xTp1SGUL@`nt7OKez55X$G1KO z5Wsi);d`@by7c<(o@9UWic^`c_J*Fg&D=HqQr+#Ie0b_=lEpMyZxD!uW8-nu7}SYH zubIr+6-Yx!2IudOAsPJpy)h(kux<>=%EH4(v6&h3)46K-aMjf;k0nhstkQ7IWt!!O zNMPJVE?HLkx#v!w4duB|_2Z8%C26eCBl03+L|7NrproJ<367$$#Bi=-;4T2fjAxmi zwU6d!POSZL$Qtv&3wq{r{`nQK8wFSsQHr$o#0M7wAvhq7kX1r5W259*!8Dkvwd>V| z@3H(XmuF0|?=%>@A`}ODty0;&?M+O9PiRB)iwI=&x`(V;iaqn z8H^A@Kb;p2Zvjhfb>T<~0*ei& z+}R+(kWfT1C0NHSv$0_27t>BkTJ>D7Sp}wC1vZGUE}Rw~o(T4WW62=$jZS0gLn?~W zD63Ou$SbteTIrT;bFNG~>Y?yu@lvN%o+-^Z#-`@Eodj@>K@H616a{(Goyk^YAY0Y^P2xw`u};ykBCLySw47iOEJG|rlP1qb zPLZYH?yIa-`UET^#p|YR7U7+ziUl}oZLY@~?Q=j)pTm+`s?8kwxY`8ZPqY#OUA>cfM_)Gnp zgLhz6y4?Tn-v0PQ8tuzz@B9z2Q2jr9*U}r;k)8j_g;ohLw(I@yA`qp>vc@8nh_Zpq z#yIsNuh_ipx!p}$T3O?X5hMcyL4X8<%p`FT#Bef7EXxLDk3C+ryrrm}yq#Z?s-`S8 z+0AB=B~hf=qWI`0yYB7tojQ*?ug^!#v_DP1-1;nvuF)@cWCtd>mg4gNyLC4%cxx0^ z`)pgh9Z?#^&J>|252jVDPAk$G9lD|C-jwv%oV64;WIqy?Dcu=1eu9*U_+Wh885l|A zs3TD|vaIZ)JIGoOk-2}f3^ z5Ki>w4a?GvKZCj*OT;>P2GckP%TW`DSz2yq-Ksc(mTSjjK*=+SJ^a8bD5 z)LJ%88zBNwk3FFxD=_s_Schpd>?bCRsHx$-AETnm_s_?PSBxYOO)&z`wY6!|u*PX5 zxyAu(mI1N|o#97=dOrW}IJj)%U=(r&PaOzE&Kj$L>Z^M?~0QzJn+NQnxTVoMAtU{Rpt@W(Y6-rj&_B2IORkMHtzz&P@RQMne;&<`F#N;~KWRtVYkz$I*9)Dv<6))o zvs%^6!;#OmSSlBtQa&Qgc!f}EZjTV+2qX%UAQ2?9bXSw9(b6+aKXEkely`0WAG%nb zAC1-7Ua&fYI63odP;DN+@oiu)Enj(?Vj^p;#63g?(Ju0p!bzhe&J5L~1b*r$O05Z;iRPHXS#J1R-PR^v)c5P} zK3apRlRoF5?gQ#nB9=nSSX89UG9rz{%sbBj384T*bn~*q`rUTbxBbD28{S)A_xWrJVyZCrDBx2?O? zLX+AvMHcQ>=hBn^(ZnBTbt_PKujaY)wC`u5!t>xMBC#8eEoi z|G4?>gTLPVa`T(b+naY@+WgIf_cyPAp94}UC(%G6 z(`b)qbpIK))`=jAq|6wU)$9FI|D|i)WL&P#O4353ZV=Di0Y7O9W1M)UNOFdG^sF?a zgz_j3thNf1=wW$E?ZE=8Oed9alTzX=njYU;QS1pA^ z5{j*JL2Hw`KPx2^O((a~Xp$wSpUyxF`-7QQ(ypS;r*{O}}0lKsEfNSDk~_3>?gEAFlAIUip+1 z?&Pc5y$D%~umwtx4=h+OI44{M%YXw7)|tGr#owf2u~AFkREhTGyd;0Wl6;|(mc#So zhsl!sNlq%~Zzh?h#CvUpCP8RJITJx}LbBRUEZ4qmp}Oq5Q}R1^;)>^9!qiC2ZVHxS z>Kr%0IL$*UA?40spC%tzN`bS3xe6~R4`jNluykp+r*IUQ?sO~0Y@soCBHdXrYMus^ zqGp~Gs*Kfykl0> z{olstK7RCn>HC?p&^}|cVBzY*xta5+q&^zw4DLmmBL1Z^&C;hByy6& zNJt>iipPIhPUU6a?^kc^7|=M|sfjdGbQf$<*Adl0c0U4m zVCiv?V6)1A*1>u=yxY{1bI*=F)sMm8!d>Jmg;S>t%IL2PEG2PZBfv;%jD_Slt8PC; zxAO;Mcg;7|Qnz*Mu;yL2snd+}c?Q=Mh%e5BID@3cuxsrj?#MWUKp9V{rd|p#!J#bJ z->93$ueHPftnF%bZgtR4HN>-WXy?@+Q*ti%AYv)HVB?pdyyn0y@-mfZI^Yf|uvvkp z>!~w{o%i=XTp`y^>Xm|Nhy^Ezzz9;W1WE`;Mma}3$62QQ5)9hGwC>D1kIV6F+v!KN zIrIJPr=%-IF=B|M;sP8&HsCO}_PQg+@9iX@oQS`znNXZ-z+!K$YaRzxcv&-oupbC%2&ZY*si?waLjqmN( ziuiQ(o6aA5HItg9czeXPQ`#X60-~j)ydjDs;;4qK!b)hP^61xfn$uD@$&Pz65as0g z-E%V_nE^kW$&yn6FJ?m-^+#kw;jo9Gi7;4Uc>_8IS_i$VZmXX{6MtBQ>%N)Z zOYgLX)eevly$?Z45!c|Y5CQRMM>|ijv_FGo=iYyE1)`=*K-xKj=4eie6Nwd(t6 zbb)W`6<0;Cyl&Rwl50Py;*C_^uEvX2@5aC1h%{{a?{>Sb^PTtyRo$yL;-k1)W#VGK zNfVfR@qzERer>I8q9EA&vhh_H5}kc~#hXp-t95`jt@-$J>)yv#L9f@fwfC*7y6;pg zZMSiwSN}!Z?RRarQ_;%Q*VAJCZn~_CSM9|M`dM%7<*~^BG=3#1UQDJWWsjvK&%t=6 zV3ck}g0=BdVu6IA3?b~W<6K&8w8#oYzBc@?c6cuW=BMT7omS&A@8o?K?Mkss@PU&S zs6(D|D>)EFq;Mqo1I{|&d^G0js8c_t*H^sum#@G6e1{#-DYX;ZS1rXvIE?}_oC^Y& z`83;#i4bIn4qjGj$2n+LI^cY7bu54GM4DK~+qBR1_IKe?${*ULs7cT~6<5aHi3%VMNWx}l&8zb=vIuOK-fpE!NHpVL<9h@tqPLkyeW76LA$no z|DT)D?1%aMj6=lbCMj49YP148aU7gwSRw0ih?~^OAeGEAv^VcOc>lq#st3Q^{C4x3 zYV*U*yPIEbep_vR{NUE8P2Vpc{OZAno8QJq@yV|??`(cqZT@!i_U32tx4+oYVe#1% zUSGU=;ldjyOjsX-f}C;~OF7X6p&1d;BQwT$r%iGaJXP8{l2xzs=JK?>@neqs`Kwo! z{%ZEo>f`rSNMD2Er*_g{84%S1EWrvSlEDERMd7>c%Bzch-T1b*TEDY{jy^5�evN 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 l+?2(lNN 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

lCfb}6s0aKVQ4xY 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

h+^;*gw4wK-x@rGdhM8#)po-j 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

+iHGZ`${}i>n{rt5Ts+qiVd}sRcnB4jPwwtvQ(P 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�Bzr? zH#5V%r3Tc!X4c0|SPH9h(ft>8c&15WJP4FCEVwijNLF&aUtjXw-qMJ?bmK!DPVQZp z%DqvXOG&2%2}%=2q}7tfpw>kGdCM$jdE3LL?0v7b1oijtw4rsalNxrnW%#y=H8eW4 zdprKvqgca^h!k^0BkjOC8R842oS{}ah5|5cvbeGU%ay61ZknME{R%a`8EOmArL+Su zX~JJzk$|`m!yFkLcT(u+)@G@ZJruE6iZ?T7``|j=X`M99nbWjEC)$bOYJ2ySYt>~q)cLhp*K&XMdAn^u7cBz)m({DYDKc;c@DnmQoWhs2Yk%aZNJY_Fjrc=sTD`wfSg0sQCp~ zqsA*m(kr1wj5H0VfP-=#1>-z1gvAhJk0rWnhUyQv;!pd;bK%0HbmPcr=kS9|Q3=9u zX9dP4I${6_xIrv}68A=z<%>bxIJvsY)M#*j~{F?_Yyf5QOOVT>67ro=KQ1cbN&^9ZEK zszZYI-S5^u?e><|Za4i_``CcD+piQ*!;!bjISU?`LP&dN9Ty&1#1d{4Bpw?q7iI*X36*+Y!Mi`f&cl@QQ2Uno?NJV`7 zV0g<`Az9ofrWdduIrncDTb5$&w2*0Dh~t4;CAF2rq!CW>OPzPN)=zyY@n+)9?g*^X zLq*~vA~T)o*N+&k7)4-GON|xx!HekI#}HhR5CSD4EAF1})L=W4=F&fNM{bt<@}0E8 zAKI=I#~>_c&PkzgFr50Jt(Pth;<7qR`7@*=vb9^+dP}~k>f6UQy4`+-fD#a`0tHBZhUs{H}`&(H0|!alQgZKjpAVQ`0t=Owi807+~ILK zw}Cp1u}ia4w9t+M6-;}bm3`Z|8Sm_?jn6i25AW)$gVd>OR+?QR#fjjQQby>YxRyL1 z$6b)o2>{D2Q%o9`wcI?8Uq5c*|9$Kq+wE5hs3tN92+@NEi4{=>j7__V)4^p8_q%ZJ z{P|-iR(>2+QJZs3cve*uA;S`?ryfi0oJf8Ggns$lnT4M{T1WPn6@CPLISGx_kV<|X zvle1#NC~lEPz)Zk@&Tt;pasPjTP9b+N} zMu)(Si|oW4WtE`Muie}X*H)%Ta~>^7_Ymri7_Ssb&!r^D16TlMQ|pO0j7DDtd(IBA zw6+j4udJPJu@FAWm{C}|xCf*XOB1ZZLLn&)cO)xSVLI*VO68kb@B4`!wivGzN-ns- z6c8hUIThDa=CvV=fKz$Ws&7E2ckD#f3@6+3g8ImEr5K9jopH^2hPQN&Ez4#mI>e{ATv!APWS32Ezi^omJU48z-!kN*FcRTI< zK$+h5{QTVfOLOO5EXKuQ>pc)F5m8)XLa+^3IjVx)lu;P*Knwb>ezE!fW2fuhYPH(8 z)#bZ4qsvgas;=UzuCFgu%bnI0aGfjAd!co*>Q*`R(65eD68mdvIF(=ePg;xsmp`NzWfi>pGd>MUS|SGxDD( zg+3UJJ!M==!w`qagBXRl;6e;1vzFGm-fA0aHFfYcDQ!5B9yA1RhXJgji0V{- z&bWcB#Ci?=ZvXOdKIC}QXM^f4>N#7jR|=+(R7NP{8m_erMr!4aBrdvHUgiz?`uls= zH*Rix7YX*w#%JkZ?%r<>@SJ_5SRO?eFYd$BDy6n)xMF;qH0mgOITo3Mbtw;}mx2+2 zH8Sa-PI`ohVO*$yb=IP?_Gx!Gnf?%;i!@8$F48CuF)k&WqDlRcYa3rD^==baI~zky z21I6M?Rv0mk|^DXreDLj!^ybmF4PvFOKGQFTH~ze()~Ys*VY@?k(~d^fu6(NzF#&# zAez={6N31GmvAW^bNU@SJyX5l1oyw1Z| zuU_hH{knn!?7v9&kz^0a;jqagN~C5ah~j1DoWuI6tE;N3>Z3eQgo51lNp-NUj8OC8 zgTdtIy@hhOocjdW71E&40sz{mkvR{}AoV6N;I^#ZfBl_a|IXyWR<36LdiRe|f-w*hI7v2^qYj=$%ZtV_T!h=7zt_NUs_kaE#XongD;>VD3yrS25fMzAo1)u$Db{`W(ff~nQstoc(Y^G|&vMCnwe$DwPkxZT{GXjq z&Yd4`ePcD3T?H?%c`F=!L;xybW#N zBhHBwgnlvA+o!`U9O2|_m-xD(nO3|F2}&E3VTK7*Ah}DQc)^O$ypwLYHF?l1`$dk~ zFS1X7ogvkXqB0RJ7dk}_(jg`<(NiHw5jDicaoyx+nOh!h+KGGfCi*Po>YS2YR~#)T z))Pae5}tTaf*Rx?6eF>Wcg&?LCdEoOUQ$Y(c_T9aFm(^qomJ0jZ3K;6<}8w+K7Hy? zdxl_(#v(tR6I#JA?N#}imYo(y^8aVZuPdfNO|Y7C7DQl_qG!Yh<>0tPj%k#UfR;o zF4zCG8!;ugt|%hW!gyjSx1b!8(Sx8Gg%Vm7r3t_Pc0C&6;P7I{#j@n(PT^hwc1DyE zjW%#+6Nc7f$VNSiKnPJqJ^o+**_S{1@&{l3>2E&z&A*;I56`>AY4yhHYs-}1F%)GV zE}b<+QVtLUBYC1wlu8;%tDXm~pRh_F%B(WR!Kh!|sF$OmjtA*p0d_?+#^|h7N?@MD zjM^BIjk{0re&k1GLV9gH7&oClcRn20>_x3=n*tW))aU3-NYg^>h_2F%O7D^(cX`%N zOo6}hKtXUvWszn7-M@VBfB*f_x$}3&_?(UUAw0edwfwK$xODN-)zvo&xO}JZ=&BrG zh!+HsD=xJbfg4E9Gcyc@C`;@;JEw$=1VuinoP3gxDmUgV{>3`-EnEBti?J)h$V7^@ zGS4*+=4WZmzk8gKzCKcXdnsQIQte zIrOT4)obktis{pZh4&1~;4TqpN7OZmGLV2=ODY(T#u=Nu24G%FRTTOS$6*EHAlk24U)^W*!A!kkop3mvM%_F;sF3QGkgU8Tsa9PxQ3^aEM zuPc;HTZMv?Ty-Ih;)*zu&t*JuSmen+qg1T=v05AS)9nvWvS;(Rq*dA<#P1VgS9CeY z;8aY`dy3_iNh{VV0UFRG{=!EfLFplZiTRnNvs?H}c|+`JFjyblm#S9qgy@7(vR4 zw(+qaq-VmVgMBPicT2A`n4Tl`)C4AVFoYN)l0nB5I0G+ouWvOQFlgCa=IqqMwzJk2 z#1AVsz0<<$iX` z*$O#veK<9JDEoZvBle)o!K1UTa6u4A6i&JTDX4Z-V@NI+iL^*pR%4!Sm?Ylp zt@rQLIBI)a4tC?t7&Fjm*wl|oCNv9;t~w%&V(7Hxj#35ACI5{(Zmo$}Mq7Fr8pzc* z^J-Ihs~dDd@||VteoAg#F_g||7lh-U6N;2l$g`uQ0EMBbXmP9GjOr$BE|UkndRVm# zoHg_Z!*?bRHtI7y4sqH-J!xp4r-i3xt9o%0aSE{Ss-KFaKv7X2wM{5MvNb8_4_YFT zv8<{N1`a~MC0E~EGSwWlH*Jsjy25EFf?=LIL8Bs?8c05*kSSKgxOZm%-1Oc{TV=D; zd)IH>y0SOH_k418>(}1oRH--ljI7<0yLQFIa>KOpC>y?b>hde$9M#lf`oS%dBbBs^36H| zVM&Nmm^>{qN8d&9-Z_`1R=Q>X($A`vJ} z@~0(1LLlhm^*kBLeo81HZ`@k{gQ@Gi>J*UHI7ALXaY+d%r47fZ4MpRnI#N36lsTU3 z{q*+apjWGH57NtbLT_DNfBnsi7p|?Zeec4R3p3oHeNWsKS{qy-5)gp^vyuYS7_>kF zf|+u5&pZHQUb*};cF!b#%w2qg$%g@ai$a~k%fVB+%lwT7d*7)hf7!!fwFZ-qwxJn* zr%EqLPu{Nw>D|A5_k$#b0j_MPMVzPlLDSTKGRALBaikwW+-VYubBQ}o{`tBB29!H% zKp3RflW0H@qLN>$(}yBP`Pci~b@OzbD$I0bm$`^DgNZOe;hrjh^*Ep|J<)`_O~Y=R&{lKF!_1o>$h+o z`+8fkn%UPEWcF@xx7RU5+*LC$#buHPn)HGsWnemm;0WA1O;`~-%OAov+|Fvc|5$PN z{xjRSzlwO5ulZ@=bw&~ukzP<11w*H_mL6!ZRvA*p+jt!_Rs3>7+A$`iJ(FBl45M~N z5<-KamIm)7W`mVjjAm>ebG+-sfTe|cpZ@h%8axrEEYO9 zOGbiPaSC4PplK13H^+mmZOp~#nQm!{`|5z!c(%fp=5-ICGi2BmS0NpjTH55VTf@eYGZ_pLL~dnRp44UQB=Rx8~ZwwWlrtSXEF?2rfk1`Yp%)K z1$1Y%i`oM~Fd8W8v>{0*IVT(?DI3Q3#sB{LhrfO=fBfQ??Z;ny@vATX?cDjVU;MmA zK3u$U;lkymwj7l-V-7xDbw}Au+vx--LOp}vEa#pgF(w*0H}m)`nb>b|<*l?U-K|Fb z5v1qN?a@t@VZrL{&0La&jqh*21;b&o(cAs>`!*{9?pABC?fRjH3Yt(Qp$@YRkAwbp zl~V`la`}Jz`&IJO-iBe7?aiRy>!laDbhAyYE^p@K-i`iv1E+=x9effoBchqgI-a^; zWY+H16>mehm*_1zM|Aq&1(zwF)JBW4;Q;}wE8w9&mF8V8~5F3(+$VV3vGuPdM~d(lezkdP%vRB|7+@-7+Wv^tB( zj9?SCAO5nfg&n|nBgaB>5(Jtb8f?5m@nj*N(M%C`MHYn)M5Pt#v?Gonv%-U>Oe${R zXvJsR=By5z$42_%j&A>G?dC~W5U;**{d=o38v@#!cSI&nGqlcgXPvf2Sr>!kHlXyx z@}joBD`_(y;$Q%y`SZ!oQc`uh1^KD#BwE*LMv~!WqYOyq#-gi^0JEHNf#|#y!D{byR6az( zlq>RAcOE=?f9F?^?ycy7loanq#N!FD~w^v$MjHmV_Fe&6=w#c1ZrYmjL0js(R^_@D50eVBMLwaL99B=hENAj&wZv&cAl6}RIc)DRy|bf;{eV0-1)cW(d?>48sC1jY5%(<*cDgIEa{Xm zqp5WkkSayJikU%4(=*)MdVTf9q!-z&c_XXcvx`xC%;b2%8XXk!n9MG!T%E0#?k1{3MwsuI|X-F*|-0}5N3jL;p*BQy^0*PJ)Zb5S|qV$vqsw|~gG&kn){hvI( z_tVGs-+MVs8fPi}{9>6jreW!*B|a$!AtBEMq|6GzQb;G$-pYirPgrq})}m)$eEwv% z9e!hNpCR6}>dgw9(dO}7t@hQ`wHao*eYCE)2`P~gu-;3}B{7ZCyRFD zD=-*tCQYd>4Kv@?a6TuUX*(&{g2XXLIE|ep#je-_L~ac7^jE7$Me?v5rOcTWxfWHZ zU2gEbbeNeU?2N3_CI}WlqKGM6)d9I;8l7TgEYsKfgVA^c zdhI!^UsCxVy@PF!0J|cJ0l{-6yLFlLzfiWaOGvc|lhB;JDS*tCThSH*bgr_+&+^R0aJK#5m zEpy8uN0fPR`hv8^9VyeeUy5DvRZ4q>G&pLc40$?`lQL?@t>i^~Ms-+u{dVp8<54{| z&}&&Z_1qPubhi0kKssxPQ6y(Wq?azmPLMn~CsMGacnC#Rm6rlMGe~#oNMV~)2r^1z1n8m+%f>i8^)~cIxYbtN50@(#eBfwY94&x8COzE^QGApY)>%?!E_4G zg;6eI028RPk~vnCd%4=b1JxSzFiifV$xN#AMhMyeXYWdSffnFb2s zt5T7fa4z21ymhVacQ)@;ecbv6)dkoX!vB78E>C@^&I~gT_x#|I=HqnwF^TpTZaKwb zZL0yy27=-?e`JhbD2K7a_PyQ@%*RHu3SEQ zDbHnldi@0$KpS~XQ9J8=5K#!uM4mI~MZ`mzmyH+fjww11NVeGVl%wSk@5xZkgy7nu zC>&bnoa-n;kjV?0w9y=mI#9MKI=A`X{lVb+5g$^s==8iVJtVXX<<>gqZ6eWYW0Uqm zI55deBMFbDY)snrKW%@#eRro4y7!c1@dXvDk98!&eoQ8r9->%%H!f}UMCCb_mRdCW zQnJPabwVg@y&}{evd)5zi;@;&#JM5jMb}x3Z`m3TuPClvT&O^e^qK5PLWqoVT1I|- z3g7E6v$rhy5^ z%CJ{ok2z5=SXNaW3e)|?*cM^Ojg^`(;(;aZoe3m(T&mP*T@<~!QJwD(dfjXHzpU~! z&3=^wOttU!XSvFYZQv}xn5X&DYzuZ0MiYoc^Bi$iED9QNPmY!qjtLs`qgP>AoxKjt zdM3%78s#-vtU5N1Sy{0vx^9`DW0_++6jS{)60P+k@E|<(Mno4Z3p{%7lCwr|Q#9-S zQQ?3`t?f3eU9{}x9NtTEwS6lub_uX0s)=YSaBrswDNt}U633{LL>L+lS%SP!EncTC z&gm@p*&y9*M*qc|A5cMN7}5FR+5*RTq`3Z4lwJuB&N>QcMq7xXj1h11<6K-jzy9fX znOo)l>4fas;>gkG3Di;T1fINBL>jbG9Gz3oic%A&hP`!o{mD)rVBa&B=egcRPxw{vN*4hymB^+&U$Qg2q>pM_O^I$Q~4;8s!gy`{Pj>YKwLJfa8 z9O2^|w?#z+WtkL^GH;4Eo}zx_`EE={b;!AkDi2FJ!C&;airJ{VxAHTAa^{26=P%Dd zBj2zs7@jDfd|*NZ!@cAH9)S=xIkm&7upqpWXWxFZ#T^G;$rO@e)Oe?)Wh!|?m`jv8 zMTvrxQ==d-#Wle3jML}kG)~VJWLt!dQF=@eo|sV}jZG2o zKmezbEt(Jb)Fs{x)G{OR0;3a?Ahgv8>qOKdra)xw$x@DTbcWFt!(SCud)1v2Tfax) zKywwA&3cP)`tL!ct&TWC0quVcmibH`?IVdM3LBj)tNriS%_?jRd$H+f{-R~V_^=7% zJpybCDY^l~YG$%yuZYEMAoJ66X$hA_4Vb69>)l>FpzC^v-+RgTyl49Fgz#D;3DE?t z8D&5NIN`g) z0M=T&ASIU2p|YT39{H}6!J{BYZbOlFUFf}>n`_`%ww!lV(jQ06aM%z z#P<_oYjl$&G|E7|c0AbN2uFj>da7+%6h73|nPKdq{dj#$Y`;7V4#~_pCBL?S#-z39 zG*FiyrpScVlv$}ozMO+YEBS8m>OLp@uA!22K?bdh@tpkynE*XYh%J$&#P}4s z#gjcTw8|x;gi`#5r(lXU;>}OiuE7AW3!T+ReY4@|MCc*cwuxOlSo`Qm!-_ z-JEOSQo10^!nHsC+fN_;_$7Y+na?tOn><_c#Y*z2{6B4vcD$-V=d}M}#j5VXdHOLbt+yr(uvYUK{i1%4x=lEC)kO zKsrl+ZBfD zp^6i&6=4F8nUI{ulgDW;ikzQ!>gcZwV$&bQx|zS;muAF%v_{h+Y>g@|aha?aF&WR4 zB$05=c#zuDq6YD04QM+^pKl!~+CKt~KPMPif}1u1%YzY#g~U^lO&GG1T5Wz+ov%A_ z^H$wt+Cvyl#EX|3`b*o;=Yi8!a{y2O5RD6H!8uQZk+=hZ35-NfLnIJyT9Yvo)qb4fgiJ&@4R}{}$hhZ-cpvfN2M4iJ@ z`;Mmeot>+Fd%$k1eqJRh1NyQ|$e==QOQSC4aVja5SwZWuSKq(2R#&+;@BXd2x-o3< ztGenAx@+|>$23|WHzPi6#X?)yE&(P z9e=oy-&Eu4+-@~h^E?@f-Wgy&uZm{L_W8`M5{E{qtzPNqX#|O|0uedyN<9fq2B!@z za;-OS|9S|6?uncS-n=~?o4(Au9@h4oDa5wWdTVjpcT6Ql73B`Me;uv#5JW2SeXox5 zD-(zL((yQ&$~T|*U;^frD#wYk8obXfwG=lI{3hlJ>zWBei;DYG4;nx0@8URJYTeP) zy7|q(yOD0KcqTb5&?K^g@!(waDFtQ|izyUkZZF^=+aJ`;0bCl#%Xc~X&buoY&z;PQ zQcy~~OMqv#M@Zt9UIo zgEy-F2EMgH{z2+>*Q?X#FB8tptJS$UxDtC~Zs_V{GpIZGmS3Bof7lnNSv-9c4_dg}PwrEO~Ae_=reqk}}_5qSnhuMN~zRx%i|2 zyXmf8tDD>p(4C0LFOBA3qS3rR>a7*hJL0_7P6h8J8UtP=iu;S?XjPXek=xgEp!1ff>Emcp@gpQh(3N24(Qg9(j?R@e&5h$v`y99MJsNNa+gQ(c_cxcj+ z^=QxeHYLEehzjWvcoM)_Fvc+zgpFRxe9Dz&6!CdZoCSn#c0hT0Tr_>rV{8}OT$z?$ zYdk?qt4SbvMWV5yU4%S2k4q|wtd-I4Mt>aLdGN{T+tGKU|ENYkjP5=7=)tECJ{o<4 zA9pJJ^uvRXtI>j7h1)hGoWo1)G#lN@WE)AgyDu!B3o6V0&MCuSj9j64?7EwnH z9vd>3aVJ8Vi5iUqAtKR^7Ud&Hza4#p8^;f$?{FizgImm(6FbenjQ$-rmTz~R4@>9c zIV(?TNp~?)ZFS0na^9z)fdt{Xh3JDYfVw4QQGao&JM~6=|D%2`rdtl3I&|g2wES8F z>VkEYGwrw&&U%a9164#wUpPhV5m(h3x-qA6Qe}eGdG^G=m%)Ou(6-%73AV*G#=vM2 zTr-8ceTXtBnOLGa8d+3l^nd>hJ*Y0m)w+pwbryzUg2(OXZS@lsb%tl;=lT~5lW}=* zN60>Sx75ST9RShg4zef{wSs^Rc@~AWDbn)1@&MUta`-82U_rD)jJ8Np|rmwFK ztEQXqO>TX5{}wdRuX^1z=&$y+ZsOJpZ&YWtKI=7oG`rrwKdc#s-}=KUR4B1=z2H@NtvVO$IH)@t{Xund<60e?F5bIey^SyF)cry1SAEEjb8YM9 ztCfp`YW(Z`zBUFZth&FJzlXt~j(+P84)0U<_Pf$rcYPxcV&k_y+jZlWI^)oBSU(JsQ z{jRUKKEvNauUfhE+61Y?tc{jscYf9wxQT@P61SIyTiXRLat4FoDU+P0mVk30tffp_ zD9e?;hi6{(e#})Cu*`lR)_B+>y|#ENu4B*=%|dB~W>PV<3ypAyXJKLrnnAbOAro22 z7OjhU*=1Gl439Mb%Y+S)GaH%EZD~X7N>m*PeOv9+hJsI2Mn_~$UIC~;G>uw2UsUjV zar5^0#=pi>C;aOC@P^yGz4oYbBrPjoU%Cn%fKOZf$qm9H2@}Ax#GIGZga82;*QTtp z2b$_~-Si_gO$Dnc^9HIjcrrAbx9YI@MYH+E{CXeUIr3E8V=@Q%FgejO!M4@_Zk=W# zct}xEo(FI`PazQ}NfEQb`Sq-e^C-=amz`1$@e|3l#Sjz~25nAmn2q40@(zgNDFhBh z^_Dv`jpkdMW?VS?^AjU428w0Y=7ii@W9UsTktGI*F)RpNjDV*&^BQ3+!O){~ljmnQ zTOS_j$kf6g-3w3wHH~#!70 z7LkBtMpL4Mr^*&B$l+QK>SoDM^sGDVwES8Es+ba#1xAD-)Pehn*Vj`SpccjSCOzr107ziN~`D z9zPjvy^zKk=M_I0RJMqS>sMyl*I)FH8m+;y`8Juw3c|x^;s4eAA<3T85 zFf^E%E-=%?_+XgMSH~JglrUuME?SiI3iK7HZrJTSsuA7X_ow^kM_y0DDV|+)sU6w(YVbc~Wq#QS=;muvGIL zuCxr@Tj~UQK>~N~!?ZOneW7Rag{H*U7EVnW1Q%$IMtQ=~p|z4a8={M4l-J`P+7Cxx z;?Djx?&Ci^X{q`h{xt9PJFQmtrrO|MOq(6BP74?aiZnrh!YE)NF4_QXY}s*Q%a;8>8Sv9+ z^k)Bn7VW?2-b0HV4u``%IubP$k06mlax`Z4^Q96A1*-no9gZLnQ@pb%nZ}{1nb9TKcY%GGM z$px#fRyn~jvjnr?tQQ6YEp6gx3`Z8t}cpznKnEa5Ey_PCz0pT z%eRD6o;xSIeRuT6Y1`(iXtY-*_DqtHhM24(fSt1fhZtPr zOd2JqVBNIJZ@wJkWNQxI+=F*Qe6`_B5gaJ(KoRC83S1lJBcMEU&(6bt9DX$X*{6e3(xi>ZjwJ|`F$0ivW(JRp%Z^k(nB*J^kAO*i3VB04F* z+JI`scyP)QCL}N)uq4TXTdHgp_syl!-v9N^@Y*AO1~a>+(irP$tA-DeVr_iAaDiCM zB*jcAAB;C9tx>Z)kKQ6iZePX7?QZ<{X^h zRB0Z->S`BP0RaJKC}pEz0ZqNuBp8NlmN_W9t?dsg-|P{6E=<>KuXPgZy2_`y(<~S+ z5wb!lOaaGFhH1)GR=(hcc9eRt65n`igYv0AW%8Q5VV? z#ai2%_4Y|;aUa`gK~gG`HjUVmvu{%&udRtjiGaBRm6o1IRWz78Mu{a_XC)@PaP6Dh z(CSWKFx{LjN0|Q!@zsUXSu7E^jAJ1TwU#TN7DXd#h0iMfTsHmqnx-m`Xzvs#F)>ct zlXbf9(h2$1#nWS~C@@c5aGrBzgd);2?6JaGEhQIQXD^$Uxlv9_DUZR)Mjf3~YVfBU z&i&%6jiz!;N0U#j24b~S#9=3eRZRM1J25` z{NL~Y^MAkk>c8K8|9^h_Vf=XJ+|7+AoGN~K>B_7)3ylVJ8k0Y9(oVyruCh>ttufdJ z>Jbt~XvY*$HYyAvFwcPb&TSkm2`$Pn!p-V-G{g zA8&~6rxD%n7hzpwMGUOsooS+<6E!8e=Y(<_w6@fx@g9HhWXT9?%#@WZ~IZke{ewd{3lS6wd&YLMLL=r zd{)ij$CqTu#J{ed8X*-D+DeMO1c7WcAi<$DZHBXIE*GNeZN})h>_%rOZ2zfa`<3r@ z_7(vx#|wI6bS}!9i;r_2;BHH;$yXVX6{rk5%M>K?|{H!`PYz_I4PYSRmqS5%` z6uc|Lr3Fdj$qhE>Xn~o=CcHh|kq?N**;zE0?tjg)TN%zqwouYs~&+j@+h_%s` zifGIPO$$o7KwMkun1}~@3=rqu_yfg-Yo%@Xd*#@=pJ@ooQElav+`F0S+Zlqai?U!u z5uk!n#TB-RK8M+O8yf_9k$<9rNlVaD+s^uoTenHF9!{e(CcnCPD&R3R0t5)hvzQ{J z7%(7|T7$A?FK?Dx*4P`+GG&!wwcS>>lb5ww`0UEDbW#58O!b=rcU=|K&LrQCIN>M| zBSUZ^7#dgzA*++}yMO=wo$r5&!W`w;=AxRE3sSmd?+t2?;)0p4!y- zC-h}1Hgz?|I~=_YK@ek_VH0D25}gc8Dd#jRT)f476a&y7sVARzN zFp6^=)xv{i!c*m>M1&Y-ghWq%i}gzzrB5za2VzVbUjT|Sg4HRjZm;b1zkM%WyJ`J+ zcc*c`h!@?i+FONb6&FkeTPFS{<&VZV=nmh@JSB)3E9*STE2#|vaH5>x@vmiIf(YIL z5u9sim6QJeH2Z zzYhM8*xd%77lZc)A3k_zaCdNL@cDyVgL}u$%GW5)VTyAUN_EwUFwZqcl4-7mXBsHC z;HWU%urPn^Ur+6`eFnAvD_1WaQTtbC$&@Pa6RrJUS=#kc$85vs((2+yH3KAVe8i%O zL0(zu618#4^kjMIFLq4z?R%!!f?j;bb}P;9?Ar)=U_L?11)NW~uzYo8`Guvmqeh}M{QjJqPf>f24D!H{kH~7nKn5}$eN|3E|@VQ zuqxjB8abKfExk=d8Qev9A?ql(Satg?XhHF!X>F#QcC)R0-crwW5!OalCc3WZ?g`?l z_S!1qq_HFzB(w5sYtY%rGqj7Ps<(Z+6P2`GoR8nzzFozKF_P#W=JhFj*z{cE^&Jw( z&FT4Np;KFjET_VIhKaC=sF4xRIiW1^zGanzQ;R56#ow5S_iRdKiAOCvO_hJ5!FHeY z>f-6FV#*T3I8s^=EI~5NxYR=9tcm)U9&!832J>{C@^jRE_ld7InjUnF+oKB>m{1(J zH-S4u0(B^h7AbU0v9tx9=p|OsmsmAhZF8bq_8b54=(R70f?ii0y&%-95IE(MBNvs> zan7UH0aj)umsYlaKbj_JiUp6+EVL)Nx;O%gc>iv$+?L3+j`_wkc7kt+<48ivT`?} zScU7*skZ;CxNJ7Tx2piEKvlmIn$+B59HfU!vL?t5F-NgaTfZ$3;xuqUgY}dI&$7Cv zAFVl_lA3RjJ(|ICLVUI1bVLUgSg?#4qq&h%Q{@q6g4lVgWzWp`O|O>y-Re&-{{4)4 z*;BKR6SK0fo`3z)E7NLbKU`p4{0I?-Q==Tmj(cVaFoh@s?Be&cGAY+!Gd`u&zHT;4 z=$&X6d%Uzq<|yqkp62PE{#5MqmE@VCICZs|B8;gAktS<{H=bY|EGP@c?`*9nEt@7ID=!unoqn}2JAN}7}>AO2Aktn0$X0*9QyNVXL z1-&1|h`Mz+;5%dc(`G2gj*G?pz3O5vabPYmLP`82yby{~X*5I|q_e!nA38wqes|}) z|9BRixjceLXAj^%M?v2!D;Hn7cxCBQc4zJ$F10m9M9p9btVly$LCG}JNr8C7LRQ<~ zC8##bYvWzHhZ}>24tH{c%b4)$BB_E?*b4>1*%&<-&IvK%3~44x zCJP~ZIM>!Wkbs0_&SD;&Sg?c{EvytQKFq37-Y_@IowEA`{mU2w&=32+XIZQ<)YYh# z`P5N=u40}2Fx1rwivb16uroTwHAq?!%^-phyKU;Nd8LHTYd&3b8^)jL9NHA(65MdrOuD7JFxS<%z`SP;E9N{kDh5MD z5KmC>g32uJ(cRVNN72Kbo}KXdIF1XiCXya28J#OGoj?dntPR72;FljYg??k==duciNwGG*o-09u4>52AjTnypn?+nX9C+59x@CUe?j<(D-n5&w zDSRHW7XBKD35vI807k)ttRCRuuhP=s;l1HU#qhIY_;15c zAHMnUABLX}KiOF#oPILeEB`dzxu?r4e++J-CZh^S<0ek>)#qwg-TOeM4K~&rWH>TH zSjvs#)>v;fWMveVLTXS;<-c~rS+WRYa+846)eub)wk}cO3s6!rE}2KcNJmuObag0O zAB%(q47}>^;$n(H7I^9&UN~G-qUeyZEKjKr$oS+VAa(sqSE}4!k{U0F&egt z8-%zpj>#;o`bpU-tw|i#v*!Dx9vwTUq}6i{BL8ve)y0x&iwI$!DUAsZh5}1GfF3br zvaq~lde_Tq`7Wi#$I}wC7^vpmxQEEFF17*!i|4!{SYelXKDD(BFyS$V$QlbD{OZB2 z!JWa!gU<(d2Y)CA@5KinKlsJY7rz^P{ow8RjXQ%c2A@B8`@uVV&${#A-JOTO8T@(h z<>2eV-Sj%~86OVr91l6S*_*xiXDh|<=A=FL{ZNyirNoHZSAlIgQ5sHNK7Swiw=zE$~tPYj>fh4 z+B*&UGi=@IY8jZLqi0Nbb&*s=1nh}toG9&;vzjGZI_50N>-zQmvVvm!lj4=K1>3jF zsyM&VDce0$8Mk4I$`qGPxxV4SR82l*5l(`60jsNF8Z`65awDBIoFtAN0wVfVmTR4( zVXtl9a~o}+=mFNstwg?fkYr(OWgQt!3Y?M^_W6g#R4LZQ)@n8dD@YXZnM3+3ROPj`0 z{X8mCUZgb_Ty>SpX`tFgjZ!#}M1I7X4F-gkGLM$)Mey;`zkRPX#Y(@skHe#}KhMnm zOhu)xu6P|i78U{_)&XJ2aT*wt3R^<51{~4^`BK#@*ZZT9^Yf--``(NV!#5gpGTR4c za}Ujcy}n8UQbADWsQ@W;0BfBjLNTzJ>(&#g!R}u0w9aNHy_NQX|0GfC%qEZ2a>N~b zN`}L8_pE2hv?lfe3l{?`3JBA{!4S)+(8*5x#hHJ!~~dHqzl z>EHk5H8`+yz2OW##u3Xbbn5C5!yX%Dna~UrMnp-+h4I#>T?08f^s^Y>HDi~L6D#dX zt~Q2@BZq(>i@ef^YQYFqJX!*(v*v8hoBwC;T6*I;vh!cL&?YN+>iyV>mKaO6MH!^* zLA()8Rh<$q+3Z&OAxBz`BnQY$9OPkOCNCgXfFLlOK@uxYFyk0rP}-96UkEcmenzUA zlGP-;o0lqyY>I6IHrb+iug`a?&igy7u+dwG>SI{L(5`b~dv)3dV18(?!5f5V(~hID zGAzYb2M5X+ju2$>J;6aBP7vXQ2#qpl&*-ReVlv~bk$E>ipf5yMilQM#WHuL%CV#;^URo$Lp{f_VDk^0lQuxcZV# z?Q>}s!x|X(-kId53Lqpp9fVWBS&YrvCf1=1Vc5{W`hp*Co_slt$(QM~8+(8*RXdj= zB*v2^2u6T6##rG-8QJ)vQFuG!7RaIY8=<&N?Bk30N5D84d8X z)7t#??RqV*;;c5>oz+fz^IHdD!24*dMpv^mH2XjbU{EEPR*4T+EnM?Xf3F zn;}rFDS)VXWHET-s8u`!Vue9XuvuWZRIg$84ph4x1g+}gU}JUAt?ytS=IBpx+tqF+ zU>4khnaPSDCd^W_lOfUQz*rYJ(cC(LTsaL2sl-#ftmWF(rTsa%SCVGCvU2SPr%K(R zHx}Oi;PS!^J|^upe0V7`LQ3nIi&SgRU7$uWFBu4H1U*u+bjFa8hP-ZMmOi{X29@E1 z%TYmr(t$qGKK#RrlW;xD=6ZOyN?Nc9Iz1L_m))#QR)w#Tfb&<0eN` zrHj{CC6v&~5LzP9#YRP_w_!E&vYxvT>nU}7mFFVq89A3n$QzFcuNX-L3*HJRS>_Il zRzfgDM<&tAQ|#7o%TC6v89ula6%%8+Bb~uuDZvO@O6omjs65%fCG9k!^47+!*MrK! z(!z~P*RC#HSsDY$@TsMcK=LlB2qIm1RO!eKx15NGAv$ctS+Mz^z4U+Ft=H?``UpMn zyhwXG6Nev8y`m3*U8;WG1@0)bidjKDV}KDgH=Z-otS|oQUp)Qp>7yTh`SjZ#KKtR% z&s`Y2*l~1h{5gi?#yol|l8(p9B6|>aPh-zXVzoItI}<&7yKgc^)lMps8YjqNlr00ox#nn;k_ruK=VkhX=-5%B zWn8a5z#QMT=e7Tr0e4h>rI?}vLQzreb!HFonsE{pki3|nQAu$xBUidrhKyYQFr=n_ za55MFTy+j3P8$bPp(f?(v{x7-VUYgetjgW@!Be!3HJzjAVh%K?4o}RZ^oddWbK#XD zX%)|8chqTWOk|!QVLI3psZ-OaO%J-sZS6n)Dp{T<4+rB2WacjYAw#cYL|6)|lPD#z zUeTCvRY6c0yanTv72rn;^X-r{`Plb(O$hT_{gVju^HWP93CIkiMoB6y8Et)*E+rVl7(5IP1u7*scxXu=tZQKD#Mdn*knpIXc;vN>S)JR*dgWLaWlz| zKdx6Uy{1&@J2x&~`*6%j%?~UEBl$8yFq2Lx(@q4UBLD^97&$x5oe~!>pJ1oN@Zp8X zFajbnWGRl(0#R#k1b2b3yoKvXCEUy|@D6Oadg`QL@<7RODa0AseR#C2!#)|7VoL)E z0Anzq!F2LsNQN@EFIv{jJi1Q5_X)J2?%}x$aXzVZx;^IKpQ?lVu`X3U#swF|SZ;hI zky8hm+KR>$8OcV62Xal#D5Kp|NzVF*cA36ri-={7Uh)IYM; z^ss_f-Z(pPhI-B=bYu;92`-_rh!pDzI?A*MW}MK>au&b>$Uu>aMpIhvL#NlN-mhU0 zYV1{)p3`QvAOEUa#@@58x^d%MXZ2ohx~`zHTuXJpD@Q|!+#yCH!D$^VrGaWebfa4P z+k@_)9qQ?MbH#=`h38F*`;YdB@CuPkSAH_vIYAJOmwCq-_0n*LUuG17^mgXv>$g# zd_pm9ed8pGarvpGkO=U3qTX4a&aGooGHxse?Y#|+rlePHV6i;>rRPGyuUD!#kzUIpSRj6Hp3T1;MPPx32MY^E5OA6EnIR1h8;g&7~gI&_~r zs#fyq+wOeS;SEs1=}C{VfS0PFQo?yEtO_Pj;L);RNiZst&o@eZTt?`I&h6@2zq4M| z)m49~(}q_1q|P7tL)tIqnbz@GHV^UH%?3)*3xe4T~HjLFcHY7ImetTKQsK#F)W4X3d_@~DxDCR($RW#7h|-OWd% zjTv)gIh{spdK1Y3uuIj?Q5J!d^tU$zVp2R$10x#pyl5l8Y4g|pHp0e8DSDh?lDQrH z*hd3r-Z1TvUMZH|ffd#VYMioBM;DzH7 zV_m3xlBTdLAPFJ}VNv@WQ(G+*4~8`AFobrs2)%x~*xK{9mRaz5_5)I?A&d%i)QZT3 zP>zx0_h@Q$)LiLCp3b#izh7^3y5}y0z1Cy2D$IscD$^pMJ*6B<&$HLQ7JX)tb+2Md zWe*CaI>9xi*5);xkyvVzE0SkbBxOuD#-$uD#$t38c*6lR2Ok(B64pvk zw1V;jtUh~j_@mvA&OP~}?p5th4+iUljr0{}_VxTh|M9&w=vBAUce^4VRD*T}eOI@7 z{c2(9T6O7zY8mf#T2H?6^%~R_WkUQU-5WOl;7U@8TmAIXb#MLgy8iO`Oa>lb(8YVqa zjmm&GZ$rS=;8t(F9!GF6*M-Ae%6;-H1{5-fpkpCMCV;WzU4rMzb4DF&)JdE-OT+X5 z1-{$sHE-nH-v|6ccEvcNF(J@k9JkSd(dk%9Wd#YmS#+?H+$IOzP<3ur??St}3U@N! zbU4+CqO%&!H0wE=40)+GdM}A3>84US`(&I!iIh=`n$kv-v&nz%L$#b&Ni|+QIfr=c zq`@RP7GkVO-Y)^jkR@9o^CH?96nZccM6(+wi4)t^m0lOHHL~1f4sEm3dq8}ph^BKJ znUgUp>H=q=UCu@jr+i?I0*{4u*nE@|B2!D1X9~;a&cLYfN|BVos_0b6Ju@*luBkHw zm`eEaMqb^*26oe>(H@4i)w_fC&4}H0-R@zlJuXdfR^e@SR1cMADc*`iLOAEff!iGq z6p>JmhUn19-d<^)zu4JG9^NMit^R7&hyVH6-&B`68+ALq%=E>H+T>}Pk zo~4*uDixw*MsrU%GbxU->l9wNASplHsJc?F^eV=WPimUm2c=OtH>H z=Yl6WS;HApm377{mTO6-kLlZKzpATuy4Z%0qRT_}?%A_6C(yJEGEJ0)NNWPz zCOhve@!A7wBPcTOL2$im@{hz2nfx?PW`ZH|?RQ@bLFDx-%VUTk^TSGk;M8%jAreKT z@WcTIqqX%``(}e+&$r`1wYYv8LhjI=wxMBuu})qvv{!_s$O>vR1G7RdKnI8tav_@J0k^%KPrtgt8N@*n6f{Nbvk737YDtJFDL0N-jm!~FQ3z+e(_S^xl9k(URhO~#`13aO zsugGr34TxY(#YAia80Y}6L2Zj7epn4u$BgbiijYYrJhHDG6kVWOYA60)$Iy8t$XXq{l*7*I$>Gd>n*50Ws)%|pKc zG+O}u|Lk2`ZyiT+{wo7NC4edS{bFDjrYTC6WlDl5J@`qezELCb%rNI7uk>Wg8zexo zLG~p`fDIC510=yBu^ropBClj1lwakezp#drzme`CDIb!DhfR)5Qs#iRcsuOVQ(tv= zRdv-@M<1y>@&4tc@LD6uR5a&=iFg0|H=lg}uOEH?+uwcvr=R}cU;V|=HwTN` zf=c&5C&CM9W-^Tj{HTM|d%)6KUE)E*5(OPMS}`vu1kVKZ5Tv77tWm!zSACcBaoEMb zLws%Fq|t43G5~Hmd>a}4g?RF~prV(Vwfe8rCIz^L#g#-Ju`=q)B@Vn&r;D&HvWx|) zL;#~PSiyqRI54WCeZifYNx^X-z_$207S=y^;JO;+q$?A5BYvs4Tj}# zWXnXN`et!HaXI^ezx!r!)~_X%k1r}56bp5~hQh?>SpTP#R(__ql*R~fFL6+$*VJ+7 zvZ{;gRq5*2i(W%Q(F~Cq4EXdiDC$I0v9kVoe7`~A2g5#8E57X4gWcmn8Y%s3G0D`I zurX%*qxA=Kt2ccCgFzx0k1zDS;!fEgj$AX1EB$&{+j_Mwsx$xdsGtQ@{ugxtb#bi^ zLvW24=A9p;!M9KQ%!H{uO)Hy@$kW*4Cp?Ev)(4Sw+l9nUA|Y{xA;D7Z7?swW5Pf50 zaaN;=9|#Zr>)GSt*{`2Hj$eNE?MKfZZBiQiM@LR^Qf_TBv1+SRz=D;=1T3v$V8O^} zNqK7kB;l`cqt%7WOP8-ME+2o$<=ojDh@&Y{mlrc^3!(8G2ojDXV*Y&47&MEjV6 z&AN>nKY4z?82@JcWc>K~{pTMwDS4khzyI1>X62~zCcEumpY324Mr{?y0@H*7XP8k> zkm6Wyrm%KCZVFlF%2#nmdYJfe8d99NJAM0?-`?-el9N&&H3Ofvy5l85K;j<6C`-+u z0}TdSz{~>AiWZLlas1`@>*pVjKO28FemH(K{`eGgVkKP@M*s_og0tWilX>KdAEesA^?$BhQykdUR~{mIH%*3Zfu%qK=FFhfKL&Yc z0Amsl0u>F>T(*Ss-~8U+x)o)xRJsq~?k|M4d5gJuqOKZO2ftq%@6Q#c`UWj(*t}< z^Y0yDpXP?K9ub+MO?2~7ob@fyyCe?Z>G;I||#`P`{M@mRxsh}dYEaKoC=Hh?{ zv>?Y)f<66!zWDy}AJEfl9@5O(qNcox>l+;MgbGIkRU`z7f|O2YEpwY##QSNNg0e~! z@h_S^bXNVVdCJW0f;~pghE7=QiQBh0^K30AWio zP^7U}z_>%sP^yW+kkGXc7Y>_4WV%dA%;1blukMpkcfU|9vkYv*Qu(b zg5vGX#{899_{_ z?IbpuhIc$`JL7tj(rb;SjnsSkja#w#D4L}Y>nVj+t%Z>jFr*4A+{vx4wq4$(P8 zIw-e8IVrrhNJ<2RMI<=~5ezYuQsOy5h6R`9SA{+l@B040-+k4){dLFvKDTu{pl+>t zm^xvYioQIODtdrC5KdI!#^F3(CBG77zFI6nTn`g045xl8$xXx9DZaLdYK0K?m=H&V zZKxX+j^781gUQNz>(%$5XUeC)>h5g?+cjW&7{ zs;T=cZ!YM|i zt?tJu&Y9ZXedGG2%aeom>(#?3O8T=mmKK-ZUcCDA*0?y$Esmc-8^s8xaa%D$P@*}` z^OcsNtcHo!%2%+fcjk-aV}g+0Hy7#@Cm&BW*$$Y1ybFo8y5Y4-G-4E_b^(YWLA$sM zdu>&)2h4)eC+L!G;rQ>^Qjsg3TIAaLmdzqXP|9F3)}?MfDv`cmYKcLZW>uJ-gVo!s zso7990Ogt^lsm6&ptb~>V8A6>5k}8%(H?>f&*1d+% ze>dgzY2AMELp$4~*A`30Qin%uiAP>~#56PBateq!nuX=Xx?YQO8`w6ox+FX*mD)*!VS-QA?7+pYJxW8YhnZ9x{u1p{6YWr@}SGwU6rCP+eL*4^w{{q)J8OM^LF z8q7A~wS`ie2w(Kn6ye@tM2%qDNI{KOCd)8f81=zIJ*zouv;Q^!osOOO00-@a@Y*7& z4CNd->Ww1;amA3g%mjjz_gRExx9YxIf3U$Z*)7WhM?H6luPvMqUGczZT$>OAxF9$Y zUI&PdIL0R^=(%)#`7{MRBQ6jP8}6ccX^|GxGp88QfyP5o&m`EKU{gqqZ=+?ZvI3e) z&LJ{K_PjOP;^Mq|vn~5o{4N zF1iNFaOVu8ptTPh)mOOz!wroWb9l*}cg?shv>u~qQHY=kXb_l7DKu@h+7szTb3&+|x^GSTY*-pz~6;V>v0jmPk6{BqxCf z&qC^Wg1jP#OCgYSBCE){30gI8T)48h7T@V+7v?=A`^i)>wndlf3%5M&144;gH=ezSf8;j)_LpA|I?XHl&Vn%0{cs%dBn@7b;g*@ia(g z$Y2%|f=(oJg5$m71b|w}YYj*t8v(R2fvR=NLwp~#o`dNUZpN}lYmJw^b!Jeyt zy~|or=gOxK%3DzFqL%G^=>0Enw+XK;lv*ePfqA90j?0c3g;Hb{NojdjR{Z!uRI4Y6 zcRcRo4H@|^e)4FY^p9i{+qQ>jdMx>&C*`D`zC~n$)mE!4!B&Z=RYU+~Bp^#23LmoRw zNXW{>aig;G#ro&P<#N@h3fy9$w)LR+ql@0JmetB1Pn0!xLEM+V&~rP3=fTugo18IH z5P^j;P5VfpIi-o3fpL_jP4oAB-$3cUc>+~x*EZP5J%eezA}02B+$4_7x+pz$d;3gD zw#C_N!V?PuM{!FQ5>W$AdBvpFar-3M&d9fai zfYfQCyI6nag97_qtWP4{R`D=)Qb`KL`lx+gAOS336O5xG>#`2|an{3fGwrcU(m!a{ z=uY{y1(aaW7C2>;$RLTOUK$A?K~u=$H#&EwaA%5Jqm_EF3U|slucE(MC*rGO32u8= zSJQ6tCPTnFWh~B2z}p_aVQ~XLH6h@(cP$4(sI5LR8iEywXaI&2W0s_rFeM!3GApZm zIl7>*R`>mEmLV0!Fd_RsE z$MwVF{0Mrp@AJF#j4A0E(knMr->6BnyAo_qw(L(pLFX<3wuMxu z#Atz$G$tMO0eP<^2g?KBX!`q#wxGK5{<))x;?gM_e)HySkpbqkp;`njA{>Yr0a9T` zBTg)<6s8BO!>)4rkPB^_@Y+IYSl|K^WgPc1ZKBo?q6u*_sH}*54@Pm!ax~}~lKe!p zZ+1hHX?V9)!W7@3iUX!Xl3)>w&Uy3#2q>M$#IXL$KN)SZL~KMBUwdoS%rLc7b02$3 z7)^mbgHhJTlN)?+(arOe1c$M8S;4%;mAh+c$9qsfA58N_|A$U`FHE&p za=$rt8|6fY8TLiKrEZ4QHW3UF!Z^XTC5j3nywwy3lXd)=dbPY$-WqfyyN9|s*df05 za2jBW5=LY+Yn&xI`hVUTX9db)VBhjhlXH6Y1E?HK&;jn@w977QbE<#8Lx!!f^+rU; zj}c~_rNEG8)FbJfW_hi!p(=*U>yKQ@F6)y1PC_JT7b0zS1Y1KP2o{Yd9A+XtM$kB=GLK;zVyAazy4tO%_m)K=n(V`nPP1Xze6MtVwutqKcw=2 zgSEnIqq2g4*GB!@gCcQ)E#{^fo555cjE5je9=sDu81?*n4~Y$9Ft>Pt#&8GPk2wt!N0AN2Fa0D zLK}i4)tq940$0NMsHRy;`gUDG+4rv(%Zb^3ag=Z=BeJ8osFuOZq>eppgoSz5X_iFW z;htJO7|fm2Km-j03luQKor+*0Ngi7;^n8C*bv1{Ft2x{uzP4~;$Eg8f6a~=UI;{*C z1tM??SyhKu%At)~S4}xwPQ5*mAD)~l#kSZA%DIgmgV#=hAtp8aNR?(b=00zFGX?!@s?D zvmC?`2Ib1u0E6O#GRi8Bzt;D+My`w#9@fQLJt!OL7V$+JO7wa&Sp0+drmLxhEB#?{ z{nGNn)dCa7-oRSx<~8Y|E-buTTwW`y=3%PlM=u`0u0ns~?c-yX5#P16(xa%({NcmD z+Z^#{#r3L8x_M~>L zcsK6+@v+WKnD)~aKm#k8!e%&er`ln95;1MPF)+ul^WIrUkOFFyWAWekP@H9DHN7|b zh3`c`|DU~U>y7KW&VOZ~mp-Z4_e&lE(Gq>9q=+=ytRfDQf0$eQU41 zuHWh|H+w5%YF396C)4GaUKibocCi9-g8?BX9Mu96JEe7o`5-JdSyjuT>V^-SF32Z;u#xj)@SZwo1E@qDOM z@!VsAvQia~%YD$8i|$vq**tUZS{>XTsA4)P!ct^`QXfKML}Zc?VFMycP$E=fx7p85 z=oet63(ZR6@~5~;kvPzBy{2jc*PQ|^Mb#1vTnI>jIxZxQCm5ItL@Sfkdpr1Q@Y&%0 z=DYFo`7T~e|1i3Qz8c((cTfDh`F`y-%u1tg7E;CfWRMlXAPQ-$j)Dg+k*Cg}09kDn zJ%8PIJFESB-L#skf4}bOK0v~{Qi!F{dV(D1Jcb%Lu@W0Xq+vKnOG(}u+y&_NR-n~t zwtK$S9;-E-$P~udE*g>QVpHd`enfXwzH3>5cc~5r0>l_aG@*AhMj8#r`*LwbS)`tXXC%jo}|TW5CS& z1e4+`MUw<10y1gohE+&tLxX@s0LUE8YS3N04lR>*xBuU7nvGW>F~!`N*r`_AnPY3` zo`Oxe-gu=X^HNfZg?AE^@hBPv3waB<2mdm-H~7=wZe#H8gRci4#}N99i9|=OG{>Yg zy8%2=y8_8ZU0FZ?wmkuANA2naK>i8f~+w z$Qd8UO;-hYsTOkXq>;$W5WG>!3aVtZS&1@%WNG1L=)&>_+^8oI4l;o-A-z&8Wx^9h zZ$)WKmFJpJ$D%J2lr~vdKBYEa>8$ndbzy7@t*WBJN3(^eq@t34POHUOimt|75@uuo z<9NJ1Qp-LF>p{A_mhAw(TPLXwn53EzUNMwPBE{0iEKQJ+mH_A&FxtRuUP;5=jNxl% zIqFt#wdu#|*(dVmua$3)I$H(Yr7CC`cuXV%i(ULG1-rljI0LD(I4{ma8(jal@jOhq zAt)Zz+)qgzBd_K@F1S(@Edxy)ji0a(pqR%>F%*P|kwjJp#T%=s?mwOet=$odcI77EcjG} z3iXGeV5p!Juw$BNs+B`ZV#2(Onv_+-Y<8O_zG-iDy~+~Q=6V(e`U=VEN&w5QwxGsWyZ zz${o5xaX9nF#^pv${lcOL8qqQKA@8{F1u17A(1G>NQr{NK?ZEFcEorWvBX(b`WK+R z+=^lNM-T6$#V!xN-Ef`jljMy%n}o+Q-|>9V3YB%Su6LFn(K+rM0;k(sddwDj&YoygVKSO9C58kkXR|qqI)NujlSHzR(H0dS1K@ow+&HRrcv;~6?b_<$ zEZms8ICu5JrG>dyE><8ide>4&M*T`SM3)HpC{)RLP(lOK7Kg09x9{KipYLz~VYHw3 z58uD@yW?4#oV0rn6Q2>s$6)1Y`icyx%bZVFMA*iAj51mXK+J*1BKpakG9we$MOJ}guDf9> zec}mjfn6eu(;e$P6B0&eX8$AMR%szsMdT+^d_(7kponzHgRmV2AhH^XNZ^5 z#>+`iKos#&cVMTx{L=-$W_-7|(!BPJFB@OvNxqWoCbsknYok{<5PaK@y0G-~pN+j< z{6F5uH@D-cgS=|@TBjQy@vP~%8$X$UV_}iV@z?KmS_gqR{j;Ae%rCq!f8}Sz&G2rDaIA=q0TdntbivxeY;eDDy-Ee0^|MQk>o@jSrY_YhaN!O+hs~>wJ{pcg7 zYPd_aP{x}@0-+Q;&`e-O6o+UlqOs7=62$M36@SzicGPw4>fFouUmSl)W8va_Me-#* zSt)9Oqcac!Q_dibgVR({gagq?kgV4I_0DqVdYu71a3TAt@Cu>iSc)K|_XJp?vZTgq zVu@swS&=oFw+L${?ValOKVEG%7UIWl|6beo`X6shC&o@ZVW}0R_Q}T5Q+o)r7;Ueq zVay^9N=oJp14I;d%o>vA-7i45vzp4;?I~=fT$~*x6i)}T`(l85BD_*0iC~@+#0-jn zdSWg20U;q6GI?W|ug8~PU+Ld#HeO3x0$VqF{X5HJE?m_OJ7V@bwk+{Xp4i>RSc))9 z6tp0?h<|p(f~Eijh|~e&yveG68xf&@H=5nKyZP>j2qe*@Z@$wQd>Fs~`QUE+`#;C; zf0e#@=#(voILCDa%pQp`K%6C~gu^ON`wygIr3Zsc?yO>9j58X`curXGHoBzVw z-XDIMvK?D*4?h{++qxY;-hWK`ZkCTKJ5~F+d-%C~z*MS6(pl~(joRa=717i(u8bTEe_|}$ZQACW8@;OS^kdhiO70M@-Ju=s(1iR-@l-xo8~s>|12z(CqJol+V*szS zIs%5jj@tEg(z4;FXU?r1Lz?<@F%4y=sh>rqR8I^7A_N9Ul+YqbA(4+xGqqdaxNv?LGn>N+aeQ7Z)#FU0}MZkte-nF&-ExCLL0k(HNg9Bp^5iDuNQS=3)B3 zPg|t=AN9sq0lHXB}cl z5aASa(X2<;PI+upusY=J0`IIryV-(fJ8`N$nRPvRb*$Rt?cMhBEY_vU=X3z+qN0J) zf=O#7i@t$F-ba}@aU+{GyY;G-ILonst3-c^{CDoT*X5hOeXJKB7p1Qi?$ z6;;P(uGbgvK4Xqa=@o)0kdYiH=a^e9Ku1>}A!dRi8k?+cgoWfw zwf%B8b;7RIaPAk*XXRH6XfVctkeoS2gm6NDMV45u!SH?F!N*gI-et~t?)dNE7cX4J z3{}lI&lTUl0>``8Q>#+jH;MkL;)Gdet)|Lnu_83PXGiN=&1hfiI{ZyzvFW>AXuR$_ zZC{VW%t9kz21dnt#CQlIIOBrEICTgLg935_xXVfj&imea^UOJaqSa*wi7h%EZejig zf~PPSYn<>PltJ+~WJqb?gqk#4>bd4w%!RMCR-o}}XQka+Pc(ejCcTL9?&8rZ=czS= zqYoi}G>OQaFcfQs0x2zc4AH&R6j|&niNJ6#WL9!#_~G_Q#qck~FSb6|`sd@BfZ_63 zN>#I>M%AUoDr8Fag)*kCMc@)wL@<;K;t-e0A(mGGdAhIu0<3h_{0_ptF=HZm>Y*jm z?8BG}sAPE#zkTmVV@xWMDAf-ZyfMZ>3~n@NL5Z-|1|zMdG;2tFMD*HhN6)JV(RW|p zgPZeo@#W?n{Av-FBFhouR0PV2R>aG+&A=m1gu&QkH5Bzf=&toYYTszQ*8lwGdjC$h z2YWZ=>b(n_rw-p~f-FYaQ6F$nOw*veKvX$l6(b^emNhV8SDFvs?X5Oz632sN4#$O8 z45g31n-zcs5;6p3;)zWSV-8WDMU>EMt{E_IH4}+?)dJia&OKT@cL=Z;(m_z*ETxqoj03}%g{>kWxLaBEcy6Gok!gYCpxJx+bWrxgUUjw zRF@`@PkO=}y!~}JKq)uBavUZ6jo&sn==*B>yo!FxvlSZfRl4+}{9(m@cWB@Y1 zpJPvnmSPUnTf&6r4iSz62?Tp;J;DZ|tl7EYuZG{Ie&ns&X*OZ&)-k1YPF1&fzW!9A zQ>rrtqE}&M^bU!#-lU-dAH#Po1I1aF!SL)DoAsrW9DUu!>Hz6%wz=$C( zj1|mc07{g}DpD>s+sklmqg&N(J_aRE*1bNRJ4W2crB{k&u)$C!0^u|SEU`3RMO#j! zl8ByQ>Q=4E@pHFce)-bH`Ky<&%)j``-&ZsYjGnO&K#4ebhOi*gF+kos?@90!haf~& zytWAKb!g1Dd>a}!8qQx!?qu6GVdpf+I611`vl>zt;SQWP-vg6Uoxz?+gH#AaV5E^& zS_|hm3o$;+tH|9Mem4B`@U!S1+)tcmsSNa0{MM%O>ek6OF3dPf~F@kHz=QQmxVxK)sK5p2HRkN*xncaA~lx)-gg(aFhC#%ZD<-xb(`E ziu)_QSt$@K=){vrrE)PgNP90uF!4^)LCLH}rQx?*?=*(Li|X>_Xx#nNs4t&3hF`|- zMUA!`Sm)vi=R9pwl`(E1-g=S9#N|FmQI2VJXqQoxUmniF zn8iz1DHh@?zB>2%<(KEKlBy|_UzQ(w$B}hGD8^0lKsXUJP>mG<<+92~@hw-@ef!~^ zb$GMgTkYSkTG&?~#63!Z)lw`4*T>W4Bto9)#CvSK6w$q8Ko#1y==(TyGBxMWqwd2x@b93I7a()rvRQnVZW~Y9RSNo>6L=1 zE#VYnWvJDJA!h}SxLV64<|lc&_mwM$WZYl6dj8TI6&5|cVJR4nv1q#uCQJyFHY1YY zd0>nPl}EreIf?S%pHkg$IVCg4P+uqF^xQiUvXQ zR*|eWyUQE>k8572gM?QT!YhU{SZx9hmSN%v_9BK?A<#6tZE^k{5Q5U)TUt5r@LcwQ zyuS40vU~n}KrYTLT^fJ&8Q21%LbPX6DB?MBMw#dZ0Yeciz=&r}tMuPX^kKc#=1QZp zo?5i(jpnm(?N-B5tSvHN!yT8(2*iW~_O9(Y$|Jk~D_`-vr22l@Cotw>8!#p8P3#xf z>F(3wL&FR^qrnzW#+O~ko9jAN*=%i9;!3ItcO2ATbh}ne#i{{X3`6`JEIs@U%}c?gZ!*(|KK#09wAW{L$oU?&hTD?}OzJ zTjl3H8T4-nRAX1td3rG8D*2D+F~temv78q`Ns3bV=bu0S{8Q(j-_V-1rZ@9`oKQAK zim^#o_>Z0|-n_=-5jf7Vxu?%Q_XDfkZqdjZi#COq#R#Zq$dgYQjlt-N5UE2_cti8u zpa1&*uD$i$jeq*?^*`-~4%ope?Jd*+n}SJGN8vJv$Wejtn(-7_8brba@l^RD`n#^) zMBD>ikoT>l{}i%LDM@%r$=p!bne&eBK5 zh2aW!x4+$FyKRON-*=yRWWL$GflOlDxMk>*ID>Dc4p;-lhlc{%ZN-yT6;Lfqa}7QTp@O zD_{J#^h55C$X%I6vSX7W)>Fx>|1_&MeRTt+lW`+I{+yzpOu6!p=_rj?LG-yMg$eXZ za7hCpA$O_y0JbROGU#2YN7vIb?rmNVe-LAp9Zj%r(;*+gtf>!4$yC}kt@CJ;<3uJb zb0Qi=bs5P$`OW8e@nW*dVtQ}q;OpPiv0fNfXX=+;!cGUe7wgGap2)b>)wA6?i?Us6 z70`BNH+xvH8he>{fhUIOsi0m6rWGN|s3;=SMY<@*F4P??mNhz9VM1AiJk^3taWw={ zGL*qF3zSl&P(+#NzfX}tQL3zWwT6{ZApQbYr)#&AJ~@1}4{qg=U-UW)gTs%f&*2hW zs8{qG9uQM$C%NoY@7BYj)zr_Nk}0>pN54x4)2c3Ofa$w?OAa3b|84H@8=+|I9p0L>vV%^` zTt~|}>f|IQ%XdfE$5pj+$9Jz$DL;2ZT!5IgJ_EDqaLt!sph%F$`G^2m)F^!hIxwhV zw$R1FQWoCMc-vLuHAPaSHO81`CcQ`Nk*AN4Q}BW#Ez&Ic_O*NOeEY_|TZfK7f0bf9 zlI-QtxucJ@Iz>=J*Wn;udoxx005F@kH`sjR-tnl3E`s9g!nRcHrtj_m_ z0rGgf8H26!aFyxi{3!xk7K3kY#-<2MK_qubl#hWjNL0xM!wD!6Vo_1UGZ$d=UM>s7 zEnsce>-0H;>+RPZPau*>bXu|CV+xOao?vAx1YV>aa0V7&bgNnzecl;;*zMqaI%pO~ zA6~8J;p#jrj@};BReJg9%b0U~8%3nsn0Sjpq1(4`Q>Rc;Fl{4oX*Z832q!kO#Nw>G zPo=la)en~@A^c29c$F7;Td=wzb-rr5#yGmjxZ@@SA_;ooEI6Tv&a>*uwBXnVSb3YHlo|AzHdbH>`XM* zTdygYKm-z$mH>kk6i1N`V8=q*bD`{}>M`u*Nr$s$HLnb2*>UZMJ-@}Snyx8|0eKJ- zQp5wCY3eoD$i2|s1zmJfo`Z#Ykf%d*XAjtD>F{QYa-IE};)&phCtfR(yE=$;F;gMR z8Kb7?#C)c{)azI2=VEseI%`6lw%qWMdr4^<+7wKh`biAdprM))| zuj;Fof4_Vq{q@Vk%fFozV}G!G`_Pg8aFrYFl>B?57(}O|>0q2og%ka@gIHt#3N{F# zrPf3Vj)7TE8KsFw3R6^9H-2mUQFZ6F@ke)Fsm8w@-@Nnc_`UIG<4^9qnm)UkAN<4k zPvfudygvTo&TEH`VCNA#*~z)%$Di7?=-BX#>P(5(1AG(Pw9aPx*f(`oY77<5I>RCd zjhxvO(6V%fS}fZRpXn`N2Zo95waMe{Cy&<{uPKu0_>zRDa3@5QqE{UfB@zZPvt_xD z@7qsoP_fzxIM-j!pLqNQs>qZJ`4i0*uN;W9+PIP_q9H!Y#9pHY9wXCXMeTl{jw@i6 z?EbidRc^cnwaF`M44W~|TV|QGBA<&SQXvJ1=mOc6-1dqs?9S_^PlxT;sSO1#55Q&) zGxj6HcJ}D8DY#8uT2tJ-@Xly3B=Iy7B2mDlA~yQ0D^=9Jh}|Wao#;~{*Q?PfRyx?{ z-KyytqL?^!be!qLs&EV?f^n$Yam!~PG0>^xK#hx5Hb2d+RBpz1(%20Vsd zH`j}$cQG|2`(f5aSs$q7S@WHkHY6(y$+izuQ_m7cB~HjeS;09n)HzL+0<*;FZQ1yU z4PB?z@;@xUe_sb+(y6**{mOeGuGlM{w`p>!1gxfBrJTg9cq5btmOiyw`Ur`yQcH_U z0qeox^PS!mSXj8&s_5>C^!Nru8v6(`Z3K(ly1$esYaUU$MRrxsZyFw|rvrO3(XDzs)oKfwf6Nofw%C(@($wGb4@xPC6-}%j* zUypB(KO28`=kLZ}tV=|`L&~5=Em(tk*Nai$dm;LkQUE z4KL&DNw)`UE7(pA;yU{^#nTyYbCTFckBS)Yc!MJ#Ldu>zgLzE$| zw_Z~)eTo&N1qmb}s3KDgtWKm(N)w8}9E{%W=g{SHOX>Ev*UfI_UITMumkWj>V+?$h zGEx;emDc1bIIJv|cx>32hxBR|detfH_v`9-|9*6xTa$59^;BcG(FZJ4&Z__TjYvP4 zRL7R6H1!*#M0#OEw3a!b9=u5mR7n~Hp@qVl?@wg5ZccO#KiElq=7Y*oj-Gzz_}tl} zdGjjLqudBkQ@4pZ{gpyf={x~pX|!6ZXbsvzxwDga3A^ZUuvnez^%r~9+(bodW6k|R z#kee0wYeD^A{>Z9?sEU4i@|#hkVTNk0?pv zeMXBi0oL1-w02Hz-(LP?BBI%jvffK=Rht6T)O9#@41=)RGGIWmY&1HleT=58@FLXR zYElw@_)I#fbH`ABLk&g??-pCaR3kQpRtXjfa&Hrr$0$(+%e|mI#*oDLA zhXJ5luSpWNxrkj$CQrenv7bc6og*O^sd7pXt;o6t>9J5&wKI3(qnqWR|vWP z#+q8#kYIJN3}v)JNvqLQ?xnOso1)ZA+7)^Wz3Qo9x9-mO>v~~}jJ?Xb;^cr-x|PLA z(@oeISNzjP<9FP_1|C~nOv>O>G(~wzmql1q$E`r7ZvS<9xs9T?8%3|TUSlw$ zr9`SknmH;T9n&d{c1VPCWdajV!sVES{G&(2)7NM4?k6AOSqeQ zB!W?tXez);5rW8fvO;R`E{GzJyo~)}u1?s8an|l$63_Kstg+v% z{Z*{~a%pgRsX7OKX)-M4{33Kmw_dECzlfpR^H+P_C4V8EqHW#huBYlA3bn?*7Q6^5 zkz2_)8Vov`(}?_qy4&XX}w}>Ucs3%9*2-BQS;-fpZDg z2kK1GCU*%sSL$witNf58=K=FIg;N=)i3Euv+UOXwK{F++O|g{T=Aa0zv#0=@m9^Zt zM*7E}+G~90aQ`DvoeJOkaUFzNrFb=9Io)?R28_BW`Yt+ifbEWsKfsb@R@jp;uZ zy!J#=3$*CYY*6P{hP`f$i<7&&_9FCQx{anF@o30nw?2Fop4l9SM$a>9(~MWz3P`xmz9 z`_c*D&c@g-(|yo>O#$Uv35Q-1mLRo(qV&NaQplw!MWY5^z4y+&_tWn`-@A41kN4jB z_E)P)r-}0_jS0Y5bre=4QfU5Y!>KinuaGMT3B1rP+HNjJ%}266k-&4zIWPo zZ2F6q+EU3$w4yBA1KrT;4>BFys8`*dDqE2Hb;fH7rR2_2r%BeAiGf$=t-n8G7=X=B|T-l1VAUbt_{wMmuU@IC#ONHlBGRfFc*lDbLC% z;OpuC*AmsZUZoFj-n;ef8~6VB?Hjwn1C=_Qf!k@F^gZoAv*2m!J1PYWAv(vR$x~67 z(9U{Aj197^Kk$D(fAfF;@Xv>iT)ps!UFFo#vorkUVAWEW#|vxVXzUso^TZKKAy*F( z&j?XSxL1i1#Qi+|KnU_1nd`NuTa|`!&TAltCe)B>}ycjPOLuqeiLoP@rOQ z&}-xO$M21AR^v~{H^-mkxkWecyq+HYDn0(yoxdG_G5%!y)ecXu%3Dibb~C$GSGSW% zU+WH#gr7_*V4J`qR~~SM_-I?T)|GLM>nd+umkRFdVbTa;=9j~`eCtx!(HbodM2j!I$0-{h)J9r@=~0w7saS)n9lK>#Ox(0jlF+5Jw;O-LM;Q@z9Y$s}#Sz*4CM( zY=$&XgvnE-LeO4v3YIb?1f$CZQ?}>^r;Eb@VrTRp-7vXm?jJf5b`-RIl6arpD>mJV zO~IvsMo&dB)Oe~b7$ykU-m^R;ttfxn>q6bfpWPRfIzCKLmJT6;OqZvB86iTMqIw^$j^6F$Yxa$39@K?d&X3oduPK_Epw&EWtVG3tDTd8+ z;2nSuJ{0leIlMgjbn?X2)BPH|i_ob;uX?sWOaWQl>c4FFTrIF?W6ZSy7K~s>iT2z^ zh}zmjnq$NV?=c!Es=T!F?++d8B?6d!^+(qO_{o(+J(*P49W2(1!~8%OJ3p^Z4zb_G z0WST#3Zv_n)7AzF#r!WjP#sI}Cx2h%(z}6fxBlf2|DrmJRfKx6x(tK#yT4ecZy#23 zy(Ji4!o$yY>z`GZpdM7%{r*Q*m(vfb2I*K!?=};d^u?F{pS^4At?RhXe`Q0@r84)6 z9}3B`V+)aFL6j5pNmw(phTP)e-t4)^m7d%z9}e%U=7PiJ{4d*gQ6`gVjBuhOdVZ|09Gm{rqpdPVx* zkRA(Rd;VyWAANY~7Z-feRT|4Sh~8i;LcWVrhzHR>yXgCFGbe-c7=XBRQz1flDX2uj zB9mny!7?_sOxWmy^g`w~4+sQ^!XgjoL8kVC$J|~p6pcSa zU;j}F_6F6;pos=AiR3Jjv`L9XCjwYr6!r~Y{U44e!)EQVSyza#FRaK&SZ#^YIJzA6druwzzSC=)i?1?ia!AS^6qz9*k^9glk zC|E?zyV8z!y!F;~+;vI8w(Gs6tb2OMleDQkPGb29yWJC>3Ax8hz5L-5xbpMTztGeV z9v9*~%TvdD?KmxQ!?of5_ul>R`X)1r&mU+1=k(9bKlZ)r?_PiV-CKXz8ydzG1s#>6 zA_7HV7>tW~v@^FwTkt`3v!43oF*dVRHPnMyJ@K$SEWf^hN`cG~%Q0$4eENq+;heFY zJ68ngW{u-9RM)U=a8;6Jq573}edsTnCFjgr(jyY=i>ad08E^t5L==*wTMCMp?5MY- zXf)^d+tChwM-aY~E@B@xTQF`eTx!}SV|!>sB3a+QywL4rbGn?aBYPc6oDOw6tpTLB zwiu&hQW%dcD$QjSR!2=~@Y)m=QhxZr;bWe)RTI#bi3(b_PFtc5U(Nl5a=M1I!?Np*Wu63@PEaj1;|QpOVnpgp{`k0;q?|7B6`{4d zVL%J9+%WK5dH}9&esCupF6s`wbK}D&WhM)IwR>@2R3Iv20i0Bt5kmtP-bezO?SmB^ zUN>j>?MTsVes_mB&uMFfjtHK;5K=s$v>qCT5uh~Bc)h0U|^By;qu6xOo5l# zSLjQ)aGods=r|$vM3<#KuC3(YjrW$(bT|uUqq8DiE{n=L_y6tdPxpVZ|NH&_{rbmG z`g#6y|4(0k`t?t~?dAFG<+N~}1+VQGDlfT`PUux!UyI@Dt5_Czy387)WF$Tv95f0L zV4XxHMHGv^-WyML>LE${EOXiyWY-tS;CS-vm?zpqPz;l~a5jLag2^&|rgpS5%7rb} z1V-J^yWwtpD%-zGfIU&=jJjMEEKL;Xg`qAAWwlF=JLN^E`eYX1tDg*v*sp~(Ie{ne zFx0(OPbv@TSYRBqV%!=4qO?&qNGz)NxY@c9`0Z)cK(#&pX{HXVo1Be#(!e?B;d9r+ z@+m{dgVR@YB+(>FVtuq6lg4<#C=VnA?aI1Rc40Kd$HiK#Y_amHCn=opVJzuEGK9}}=ftk+a3UV^kRxD}ZQMmhRpw$`$vsT3*BW2Pj ze?zMfm_k|9WE1O)ws{Lj#<|qM!3>^oyd6cmuL1@K(gs6?7T_@`4#E>Jw9YdT zPnU?y6&dQ~)5@$)L|&ZKFD4Or`Nrit?|g9m^3^AIl7%c}_tw6UpaPwnCv9%ELjr+v zGJIqKVtQT(rgl3mdBR_p zf6o;Pdv3FW~GmN9>4w)#Lc5vkZjGK0A{_F8tKI13+W$V=I zjr1;-1=tf&K_qyJ)(fY7axqAZEVxWmo&G2)+^okNx3IZ8tEMp7*!&0{)FWuZ!u@4% zGG192V+}Ta^@a(SR40mL3VcLhF)5El1L$oi>Q3DMBIj%N|9k(ljwtVoumA3)CD_h3 zxMv_%dJHywbw)S_UU~42DPxUxCeol(P^R!6bER!}s;iT%#FG;S(2-pD`=-!dpW^sf zmSA5@Ev3l|1Hqa$7I-+<0D= z<;q{(x_a%}GWGgP2)n4RasN#j^iZzZEA*(ZZUfg=1jnpO2U}E90CE$N6Uu4P)YGpX z-b*hXA0F*B_(QMbk+}qQU)6I|QqPsMF=|3Xh(-o#k#Nq--15ieRd?GwqiFJ^Q}$?6 z`B1R74%K6&*cV^VWei$EV9BO%Mj263Cf_+mubq~y-@!liJ8!+Eg3C)nR*`Sk=; zau3PadZvh1+_>~{at8z$&so`^?EQb*|DXLo?EfjBQN?%ViJw;cKkx2W zzuEuA{vQwBde5@QyW%eW65L%m%r!fDJwJ_V_1p-GSdflKBb3w08TQDu0m_&UQI~ll zP1>1xfPFQ7O4)I=MP?zf+zqCr1LTJ~3s(!VH@fK1DeyWf;s^tyWr$WXB4sQ(x8BV! zLdfmmbxwD$3(8oYfjtv@S#;Tj7n;;5=gM6n!@juEFn^=3^w zEf0b{67#nROjatRzH7l65_&}>U(m+tMmwHvSJ!jNNPD(4?~`Y;@QwL=*#Vz6E$ z|J9)p(K2GGBFdpIB0PD&ZNhAfI9WAs>1<2<48&ayORq1O>1Iiyl0YJrJd%)hI@3-P z;x!g+^~Zs|yO3F3hYFN)u6gU-)+MO>s-6v8U{F*z9s!wWOi)cs44&&ET9+v_4~AyK z*G2bEh&C@_-B@bYOeH3ukIp43l*SH<))aM?cQkC z{ogfcC+FQV4t>_^RP)rD&{uaI)rwOTHby3dq?v5R36C~UX)4j(o%SP~|JSs}uEX+t zw?_?@^Mq6T2-tnq4~>K5_(PzY>!_JF+Q>kn)X`xXvrnBzJiw$1n8${|E;iFef`>s7 zU)fc04K}^?CNR#T5W;w$4qj!fOO}jsm+NiHxFg!#ZqUGF7}oF%U203>>kDUOAOj1a zn2rLJ($rBNyi|FfP4`AW;)bi#iRu%FrJl{OaJ37cR|qo+|tctOI_7z0^}y>^{Y%ubv2N z&@vtf0T9U_@Qeha4I#mljaAyrgJ`cqLJpgCv)6}#zN<$HEJ?2~o?2;?D2xJcHO&K- zCP0BBySSvl0;xppYuxctOoEp#S#OY4gp zaGM|k1wtrGv}K+kG6+%0vQo$&-Jk41_0_+8RDb!iDc-H##}PL7|Dt;Q`5!eky7r^V z^vh58(k-Hfs;+L2J1+YwKy_u-Y@gIxYO^++kL2;8PGr&1(XX&NFMF>)CxrTHn&+7o z9T-7Roevba1c;IfqoBHkfBi~L&?L9~zFT|IQ%#+DIgL?g`zA#Tl=E*`YzQORdnJ04+ zC_S~tC?f)oO!D*}B^l>Iae)Xv04>v+Z^?-t2TlDLreA(iy_cj1&6l5CxHLX?4w3D= zK~g@4NN%tf&TDXH^k(IK;Iz7PA~b!qM>Apr5{4WQsnK8%MHI>9Ox{e1_H51S2D@Bj zeXf%$!-01~0Q(To{nd^J%9Il!C})|Xkw(ukDh#$L2)PM)Aos?#nXiwYZHEI^HcuZ| zJ1yoKEJC zw(4qU{<{a$`NQ!9Ci90|^@U5@vti$!vN*9^vVD~xa!T4gyMyM&U5J!ys44w!lcJ>i1*dSJVKRn8i~`&ga}+}5}feq zLsm3<0!D7AM|)ikxAjq&C8+zV9w$ab#hp^x1j#)0!eY7Fu!tr^HYa81w%W(YU}f(y%Rx;?9+H2V*snI*9lX4y>_lH)_7Z2``e66}ks z2sv9Lq8FK_&8Kt5G98%VPL_?!d#`qBg;Q8Lk>E}BAj)&$hsDNq<9VW(y}Z z6@cGYL$x-UEHn_QoYFL?U_+qHpfqy%j@-kXd^a)tTH0Q1m39_RruC?;>V=`*zRp9t z->Tl5;kdyG-hZpQjpMZ7wCJ`x`+2qU$X1vmqT3Pmf(Gw)pS+zQ&p(o$emQL8qhYSN7oC>Ch zqGtlT?GP$BLszzCK>BKkl^jK$*$_MnMmlGBM6YtgEf!tqZ{gnji^nP0o9*6g1mka0 zvB^8gpG?;3>ip4eF8$j(W?FWaD9^d?b%j?8w1ql*W-tEgcV-ghy$dW(1yOH}vH_FF z21GK2$}1%))0z7@cw1z1ph;-&q?PT=9}bmQ&ya{dBEY_oI_sT^&MFa&k(vHjBG)Vg z&Y>vzv3YO)@UE|`AGA%J|1SLo^M^k9F00a&Z>oDxn3rB7$lfS}bVLXfxm7Ae=hB9C zff;70E~<2i$w$6D8}Cdus&=co0<~`^^Ut%xe%=#ZgULBzz~Twe_f<_K!77_8{*xz5 z9H&ym;52$pRoP_J_5tj=^xnEzRSYxWd(vRkCHeIP6o_TU^I!-yQA?^JSJYw5;|$As za}WOY;PY=jIr!}`7UINdoT6(g*)oTlHn`r*|LQ?;?8@*-sy zGYD^0fByKNZ*OB&caxv;7rWBejqB;9b(20_h5BBdZuB`E-&WJ~t=}JG##LuTEw7!~s3F^M8XDN^Q52=M> z8YmBpNdOdFt0In#kWB6-Z0G#x2i_;M+e~4!qHS)#_T(tbI$8Dxnj_OTVVqelF`$Ul zNhMVJOB99euhnk;C@n2dmLJHJUu!*Fg1Wcr>WdSS}vm6ovhy@E=To&i-_Se(X z-P8TGvRQow)^x1#b=R#X7U+Z3pVNhQMD_jw0hU7QiBK4Mo{}3<3B`p9&H=OWG3$)y zV!NrEwN8C?ty(baw(YN)ag0cDMedIFIV0)Eyp+RXLM%jgz-vdGik=z6NTc|X>N~KY zRJp7LJKt1`tF`OY&DO_tcW56!^98aKOj0B05nqAdi4bqy!_HgZF|-oaLLf zOz+x&QgKR1`4q|Jz0xZMlX?Y6azL2-2%^x;u(-D}8~vb=1LoF0)a&UOZrtL0SWtCF zdiwJh=aB45ab&_Fr>wz2#N`x|&7t=n$3?NcrN(zhS1gG&>l-QIb< zQ!<%cGx7SB^Ou+Alc6Zd;2nlZv9dTxlw=Z7Bu$_etT9pqDh#-+Jg;5d`YIK$cLz0H z?!Z*%sS!WIh#wGODWo=7gp`$3Mz4#>xG{4?y|+R;FHbR<17`Y%XLERxl^Kd@2d}IY zHXuQg5M3!Ig$SHb%mfa>SZ!%mpX%Lr@4mNvd;3p!Z*G6N{n_?cci-PLsQI~#RGu#K zqvPd6uqo6Tm$>7UcGzN#fiXmhw$WpwglAgsCp2YC^$K)GCBKL2+f^cZJu87#Uc@{~ zfW@c^%e{)BvI8fikT$+3@8Z53GRKiVdQs_!IUN))w40Uo_(8{sNm3m@-|(rx_MjL` z5oQ7rX9NU>I1ucq)QN8iTWWP4@wd4K*PAE9a=L5gF_lYHMc6Q{nYqjjy}8%9@9J%vCwX>&0c7_iRgM}u4Rw1{m;Lg z=49CZ{G7}I2^M2&yoesXihi5dC@oyDiV0AZ>O9Jl4uFI4JNen_PMUzPVpxqeiC=N78PO`QA?eX>P%Za6bz|0HJOz#90~-CQb9T@<+b6teoCU0;Gm3K>omq+#W1A6_=&YRAPq%Kh z3~bKK)dv#K(;e|B6FMxsQY3NEKGljlz&7QYg$i+{dG4g6S+p!q0;J`R?d~~oI+eA0 zL-DgnnQ1iLy+`ccd(bY`K?aEpNE#QdJa*1u8?8L1;3RUHq%utm=C(d*cH6b41P_y* zWgQS;DWn3T4M7M3NWhGVzyhKyf@@q}g1c*4*Nks>20FGn9n^ffwQu|(%YLj&l~2<6 ziM3)u8OnfKjun;y1Xqxyd>4ANiF;rjn!zZsQPIFqWegrTmf~z|6Zu}sC?S?2t7y;! zxa34pOsT-saBn3N9>gT)W@~HEJPJT(=9)2QXVVb=a3^5D5R1{ZP6n=&z|uPv9a7*z zM{g8iO0uGg?|$>I-+%tjgZDmr@Xzl*_~7=;-1XIGe2o5+`K3cW#@&NfJWHqD&_l{H z3X@_*3CIiLEek>usi@*iXwNB96rst|0%DLBz{g$JI65tGe*WTf$qQV$aCt-`U~som zC^V8Gu312gYtAjU7)glxuP01q#g98*?tHQHfARD7y?0Wt{BiOaOg*zB;)0Rjl&Xx? znj0mZ=Gr9cC5pD}iVxl~!8E zXqzB~Fe5IDJYxIb@4kQc-R&>8zp1wWu>H;5_qP9M`@gntA6wPylN4|2Hpz$wFwO5D zvPLbV( zM#-=kSiwk8pp^h8EP)W$IR=I}i(5qwup4G=kT#s=|6c?J9H0N+k9D!~1?*&WOk6-| ztg2UWbBQjC2pIT;RU;zNmCcfI^k&CM|MB`UdyDCYrC?Adu>-GDah3!iic3T>*VK8N zMP$0rPO;(Tc;jZMfO2XHPNyXp&o#Cm>r&-Yz`0Irh$IMagO&_LGz89R8?soTL&r2O zk?u`N?p|oc8^*a*>AWyh5+($XQL#i!bLJTeHh!b>j-Okt=v${M_L(_1hLhoJ)&J)O zF#BXzie+$wJBkeU$a{n1f7+4&5Uep-+#0^UUZ){(P1LP=nub2zHe~!^$v&tHRWHO? z$rG$J;*wY`g$phQ#ySMRcEX(J*&wky)Qc@=t_w&6pj>#aoChkoQs7+RQh1g(=60?B zb{fLhO$>*RTSlgK;B?x7@dqFKpe|KCOaL5a#CxeZRfZYNqVjnsozH4*Sujm6u9E7i zsm`aDZ~L9it}z|x&CG>*54=O{KvEBg;qxZw9hZT5VOoukz@%7bSYU#I_kntgJhP4% z%P=uP=2cW*N+ThAZ?~(zy$Zf*yX);{)2&wL*XxeyZQXjin(r9fU8|FhZyabn{=s*i zlcE(Pv7b=3#kyd?2BI+5#%atg^~41kW8%~YnWGE$Z~pH7jsL!X^OO5Ge|i7LpYGrI z{r5lr!}mA-I5T(k2`lrnE3Z2@xMKQv>dRc5zcPPuerbM8sovQlo6J+pu|SuqA$0~M z(!_Ztq)@^rA}oq=l|(3uN;IyHraPrNcq*4sL=f~`0+TnFmS6eVBGV%xlff-Z@koc~6uj0%D5SZu-lus}RvBlq*hF?d+WGTf zQqec@-=BAG-}}YPT&MqxEqlf+sk7xPOfXk&G(M$zV+jJsZCbT}l_eDGfQ83gV3}1M zcgZwn-BfGwp;cGCZo8e5_J>ajLaFd-Y;pV<4k$*d!-PS_VStosilZ_HoiZ93WPodn z)0k%CMD!~|7X8VhX{8BS2bit)X0v$;IH!G7`%xVhUMZ4sfm?-z@qr=9l(gP)hlEdL z{aNYkOLfngy3^D-{6uHVpl1euBLrB6DnmqCr@`_-xJQ^VDF~LHMuY>-I_11*u0Jfn zn3?O1S)#kGj>ld*d*YYqKKYg6nHpD>5<(G8ydlEGpI8jk2SKy&eDnM%oQAb<`HiK& z86U^V<9|pRA-CmV)78 z6iFzJaU@_++$$B0nNL*sEH8XnuA$R0)$7o1u1=Yoo+>>sLWISz1}!uN>v6CgQ)Z1( zPUE;mxx6NUL6h-rC9;p-Uut)H?G@8%wTI5pr#?r1zxJV`EJfNo>lC&@aYhF{I;p-& z5P=xYYqFYeS<}=B%-Yjm&pO3@_IGtyiK7o@|0Jx9{UNDoV7cvdaSLf@L1xiBWs z1+Fqy+~H&^{;H@e|H(=v4f&AIByPwJ+D zy4T(84JrzDe?L^}F|9g!<{FgS1pid1mFilu3oJy(Oh+4G!3G~4a-kt=8_qg;h3=bH;+i z>{%fk%y+%_LS3kN1O*%QOcTtUMbV5ot|$Xckl-fkNPGLM0WHSo+h5%M#{pBuXWO@@ zgZoZSPx%;pN_B@ZMXBXNaHkBn2z*o;o(|PLWFIHr9(SLmZyWjrh)87oZGoMSr_2GLF zQ`6ys`_<$CAkRWY9A?pj7TyAv*hhUyCHg$D3F~Pek`+JcmDHweYM@KF4fSxbE~R5)qE2X zUF+2`{$5V^OgZC2YbrS(bbyarphKbY(NBIR+Hv{(l?#_&jDpHZASzWTOAry33T_iu zQt*i+4F&9-p^#Pe6C?YD)w;6+rrX>4u#OS_ikZ3Ua z;HK&S)319+i~)L#a-qUegoP9|7{!AlkVf|bQJVSqHDs}Vo$u9Kw>C~c^U_eqshmaR z_?`2UK!4J3P8#-$6PSZ7_UMwUBgV@o}>&jSi+3FOP|) z9=_5Mz0A+H4*2Eyr9%pV)5|M`jtR-5)5}?EPEi4KK_q3$_z?6&(4DZpQbqCe9`?EP z=HduY1~)E6g&Qkah|w-YSQyioN~*O*5f`01A95t`KRhB5uKa*&cvfUi)oB{%3aFw%A% z9B{)#Ae{eNdOGp2E^esu^*LVC1y)itwO)G>0my`}?~;{`$dtzj*N8r{8`3(Sy%FIQB`- zXRD1M-%5?brC3=s28jh_NHeRw&_+>+8-?)BWI1o&z7KakTr*YY;aqYvGiS%lebe;B zG&jc3K+lp9J?+OG(vKElDY6zjW`O`Vd@vLmgqDcd_!06-TJGQcr~5bGzklQR_iw&C zG(!9|^Uk8={!nxRl<&mkun$MMQ~{kMUOG!aaYih)AQgZ;Tc<`48GLV zDWqn}88Iaj@TDHarc_@b8WF0v_TFP`DPSFq7j#9V&uf(l4bz`p4Bmdwru*ccEJ?LNC6Rb`*qZs#jCpDx8at z(74s=wSH|Hb1ps_53P28BmQbJzO1^b|E?due%(};w?6JSQ6%XXo9%eJbJen`o8BNK zUETUPn!U|OKid7%N8epa+)+@O##f8!a;}X;$PLh zC}`-OOK-ATFfH)yCO!ABO{-OR2bX-c-|IK#rRqZCT791;JGJVK4e0dRO?9E$icfiI zh-PM#YT`kneS~Tbos>`IJ*m8l7gXGnF?AX%WCXJ;#3(?3^#WwbDqyV}pC+t8XK0+x zDcSE%0O8wS=@o*>5oJm#rj5ah2S&h9szVIq0?XqEzWgxiSc{sqxM`Yo(;2Le)TMrk zGw{RY*LqN*m2)__+jfP2xI?4k^XQJiy;v`q;f4*AlN#oP=Mn*7njyJ6IjP-Q`SBvG zTj+FG>y7aRc6?;cI$dFXaD}IWWA~*lzx6m3m97^*O;carEgyTDt9CZpo%j-GZQF1D z=#BFWuMA(k({4Qty6Mk;wD|w*T}y9VM|S=z4Q;XsGxdJVBG4nUJXUB6)_4$jW1M=C zm)*Rr-0tQ?T8-uHOoAYb06~C2frANS7_lSIVB)dmMN3-^{Tq}Ze+e%PmKTvno5(mpC_{3+D9^cz5jEFL~{oQRVT)K3T}3s9ZLaL zN@9-FylMy1e> z*L=?g+dwZ}{r}wTgDY*BKN&>D9;GFdJjM}BdnUNG(i0L1T|63Cmdw@Wum(G94SRPz zS^4VnKiIAmN9v?WY7rq40Ask4luH(<2#DIOT+VyBqu$S8FdCGwFx>{?7a6z5}Bp8_uLt~{qd*CG0a=96ifxgaN(GC@spB>Sj4Ho+(@Ld@_&nK zH0}(ycZSty7n%y7uDYEk=ZAru1guieGB!{Zf@U<{7FyyUeG*l5Bm|OG<9Pb@({EPI4Qx%Ie*95u z({gvotmk2~x>~jXcB%UjgM{E3QSCfUi894(yrYzI%4CUg?oGe8+e0@TSG&XJu#czf zojLI(vfPTL;BwBC(ZUcAih>luru8CJ#{UPaQ0q{MJCmBLpvhq_#)P$K$jR0?OmxD*vZIo1L! zM@kt(gXJIy=HLX)8z+eD@$<+ke>?kU$M(qU ztF`P_ieZe!(qSIo%y`wBq{!x|Q;1W_^M-S)2I^U^a90DUc3ZiG*U# zAwy*(#6n?DxQMI?XPvN{!+Wr6s{ZPguab8g6PNb|w5(T(rMIb@Lt+ynSLHa0C)f+$7l*K69$XWoL_smHi1W2IDf+mLAEH?AjaJwFjhxNwjUbW@N z)mpE%Y0tKc=!YA0RUYfy#7<{--7Q7C)CUO&Cb?o93jdR=3^j9JfL;nt9j-2 zIR`I2U@3TkQ?D$=K+{SzridVvA_qdKkhj>Va!(#rJ6$>Sbmh<^<|~9#lSud#VL+H* z2pD$SBI`g}OJ&xQyIaF%JlTT5XkM#-air;$zqIE%v^(C6#Rz+!1{1M%0zAefBsCl< zoVV6xA^exqucx1l#yiu8O%2T;eYNKYu9|+Q+WE;P$DlvP{?SL2&GHSn=NkjnR+5*FPt0|ces;0Q2knAHI%AFxsd$+a^8MrBc;H=v2Z zSnr+j&@PQ=U)PsBv!r#@dc}BBWsu_roc1_a?m4B#8chJ@>2i#xUp4*R>3+S|G^gX< ziF?1l()Z?(E_FQ54JQU!L~xMIfwe(KN+K|VkTt`-3C)v#fkE$zg8?*;Kkr?e>~2q* z>h7#pXH~y>>UTn&I^|K7(bd*0#XE?!QJPvC!-r=!a@;!W$Slv&?T|dGF!Vy4N?l3C^DYD`!7)M@(q3XDtYHXooh79C zKVSaS|2_KK|NZQ%_~Fd=qwCj7p*!Di7CL12!R5e!p~c)T>l8n66PFTx?FcsxhGYtnKND~lni35 zL0r5LiAK&vEG2i?Gv`#^Wa(AdhFypc<5#ta&{@Kx3j&VnPqvI#ilh+Qx_~6dRyz`G z(w-Dt5MTsn6+Ujl2)2`se|(%3BIS{or(&4susrfw&Y7j8rZm~-l+r6dwM z;gSOb2c=1RLPGNz9 zrvaoOIxASaH5}Znr~9MI_d)~p^w&_0Iw{Ii40jx7#!`ea!VbVlNtBn=gW{1^cKx~lInJ@jl==*z!3Lsryy-aRlxWM5R#q9RMAiThl9>fF8WnB2Xv|1 zac+6wD9Fg1jpANn6F9b!Pdjl`pQd2W<8KcC`%9bN-K(nl$%An`!)mJs$4;xEG&1{^Y~m+Q&b>=Xa|lY5Sla_2JK2slR0` zIgNX4kR?4Bt;U0w^Gv0{#9)MZ>{KF z=wh0s)#A48im_CTTV+96tu&+!cTRXu1ptAp%)@Bb3p|M4IosUW2}_(*SYp9|rI1Q) zonTsGl2#E(Bs{}1bplX}+#1Wg+`jUX_7dIr;MzOyEou8ozpxYxga2=}<(_1%uo%H`JlyqnnyR+d9Y2_U+%2@d5U0ZG8L1Vpm%1b{Z7~u;b7s5%ubiW) z4bhQ!foDm_O`1vVs!=~)L2lvt?x1}^viXSlis5vKG0ePS8nh0ISm_vt7^UgVLE71} z_Hnfr`J!u{Jc2#n`(c~AZw*{`N6jk>?sGsY_M{N+CMK)^W@IXhg7nBl-jKHUJ%ikKB0od(v@AkF_w>r*DT~%rWcU@I;wX+5Lm16245a&@aP6(o6#OdRK z6Yndb2+5k2C-%=c@O4Me-vzWKh}V*oGoM2Ed}+zK6o zGNL@S@f(x_1Z@P)66-S4{Q)$S(P&xLqkU`Obh0eV@-6WItda-3{9&Er6=~LlUw@xa zIiY&Z0&1mx#0ZvJ1|wC_0XYSM8O*o^D)O`ls%GPP*`^P@ar`UZc=DCs*@>3ggl4o2 zgTcCQAG;VtCl{zE|3OgBvveGx4qQN9_+z<~V z;Wee+dSxTKAX4Nh{$Cx|P&NKfd$+54+`B$WrmrG+L%ZF(4JJj#$F7Ne?g`y!?_!D} z!>Xm&$N$ePw_q7)&9GqcxL`46j4nY=G$q>ib?@fgJ53sXs)xs)_upkSUz6eAlg)`9 zv0*8;203RK_Y7<6AkfGGC7}^(f=Jfs-(H7ajRvqg`{X9QThOl#2bH_Qj}t#w~9qG|(*Nq9EvXFkne8q4E3p$1SA%^(cQ==^pSn(L* zsVq3_yL}jVH>|5szttJBmZ3xEd_Q_`rSmO-UFv>VNFglMks4rQoCzK@M6#$s(ky=X z?Ec5kKH7hF|3AA`3g?Mn&cjmfC7yZ76~n=MjRg@>Q5+O@@vJ(L-pDQAOje7Hyk3Z& zP;BIT^OYjX4MUbuFb2y=A_Z7Zkc1F`<*miI7N0&fU_6*xV75Rfy5L|HuE!a%7+ov4 z3o%B(l&903G2%i{K7uW>qJx`I?LrJu7g9p=kdoI)7w9BnPc7>eV;NZFgVahVnGR{a zpEOJ;g+S+N0zthssRog>RwKK;aQ3!}K~m0SJ6FA-E$n4V2)=ymU)#2UMc7I`Nu{EZ zvxFlfXb^@TX^!i-&VOZ!Yt!oY!wVNd z5`0($$dIBd(T3HJ)4(Nw8D<890GJsx*u+a1us{G)g*%P&o$mAKbIvzD6}D#n`=wWkrMH-XbQposiSCn7 zh0|bW@G5VB(7Cp0x^5yMz0#Vm>Uv%?CNz2#T!%`s6yxAU0D=V3z)hf1SQd=NPBBKq zuB$STj;H&fsLHtX(}QQuo|=Af==a?!r3vDB{MoGZ!YOCI%e-X@RBSMI)`T^+ERj4*%YR-lx6CYfC44_t*Yu?VUtBbTFh)QYUWEkp&;eZqE+`r&Md0@-`ml5Pf=N zHT6`=)F+D(N7@}>k`+S5!LzKq^gH_YdcCqz*o3kH8$vJ#Wnw7p7*2FbfVpy6Q?2Ua zk0}%3ONF5@0@mYIN0YZ3w@I%UPmhH#1}N2rI&3*oI2dBA6)39{bt7fdNlDyWLrbp5 zS++f$5cNt~w(lS-)gY;(x=7-cR6gpH2sQu*!kx1?>qIzx6Xsj(ZfA2cW*podSa7!$ zkWvlNK?_Sb!QM)%l_$nYt{_nD^Qv~&m;P&g>G$i)pR6z6d-mSLXCHp>?Ed3DxO-3h zdq1e3m_GLM3SW?9+s4u5=Ii@mD3>arS5yUrg>;G07*ofkB_2qOSR6jW;Uz-b82w(0 z`*?l&+SwaZOb>7(>$fb$BOvPt^3EDWgtf#dt+8+lgrZqZ!7n;oVkok3=)gMk+564n zD?^hdl}`=sez!iRNN8(=`p#^o`S|ZM)u#iVUz;_#__R!EeWP zm>`Q0j%J%g+ntQKP?|WD`0b39AZS+l_2Rak-qRbSnfh9;htyigV}o;^l^iX~Vx*1n zH16Z*zZ<71g2b_45E$fbUU=Vao2FS9Jq1Scw11BaS8D$L?H67#lFnLZqz^=UMnlTT zTB#`r!WbOk{2FHHkmlFwm6gI4offHO^j1Lum5dmHHDF1ES%?{PjGF>QD<>=#cg-D3jBpMkWT|*^|N;Bkb z-YA|anCsM4zoY7G$FbXx*&2PqD@BrH$CV&F#@_KX;+%NxK?Z>dclEV~fM zr!V(Eyxp3A6)e-Qy)iX8b$asZkIQj!G{!zmn!vcT+F_ms;)wWD=8byu>-!7f=2jk$ zIqF_vPW)!+6@%%S1gyQ)5)cL!eLNJ+f3QrVtl;^ynQfb@*~eZsD5Mf&4(cI%;xB|( zilneyW2>w;0b^txq6|kT4m*`O|9O4+7wgOay}tC(`ttkh%m2E*^k98yFYYliE+7<3 zok?iy`1fBx427pua}seOU;~m9h>jBq0<_kSGv^_zm+)mb{o=S-3)P}& z_^NTf+F*9?rwKgv<|MZ(eFte4;|(YEyT=m@F=`ciyrRe&UETfzWXTcCIm_jNI>E|(^$ZAJD4fR~@(Sxd< z&q6;Y_iGcE-kQ8RJ&`jv)6<9X>(Yr+ru~}rapLO4>5)A?W4#%yH`{P2)D(=Z6%?>A z6gZ(G@Zg9*m}$#+R%gLkXg033TxI5C@LqN1pmA>H^XJ@L(0DN(=qKHoR%hPau9+sb zkmU8>O4f5*23=7MDm&_ zqU2KLW)~sRKEussO|3Q8T>0pmFTpL|Uis+zGnM>!oqBmbeg^iX`bpzIu1JuUM-xd< z8b||HViF)Pm^(9D6ETfv$L-#ry%b$Bij*N5g0b2}*ItN#qh&){1Vcp@igR6C!8Z@O zCr-_8n>aAe!M<^RB#xVeR|+LJ#%U41NQF7YL`mkIM%pQ_vJ6I@;X8Q=I*W}ra-TJD%!#OCYCHdsm(MFnt_#m%nLuwO?I_1H7%9cLsf9*ME^moc*bviHT>FM5Am zduMH__s8CsjoyEz8=?5}qZDSJIMtnd%^H+3xPptC(Q=%^?N5Yc!&RzT4hzD-3$B7S zO#2{okemcc1k3UdTA}e)yJ}Y6__}xJt(G-2t-i|bBN=^+J)1Y)9;u-tU@ullsyP=P zz}w((^iwq@jw{2swOiTJj#9^~plXlU4KLrIScn_=#`N_UH35Ci9rYU*qv8oR79kza z3ND0j!a9vjv`a3pQ*x#a&BVkojwW6;n%FMEQcxj=63SsI81}?6Z78!8+aM#lSp^)n z-EG3n&Rhk3BUHvG{?XLF(L5?!pe|LtG|w121BAN39Pl(siwX+X<2*v7)A5OQ=BtW3 z!p*f>4ptsCQ~Gx0(OpN?|mBPPR*{S zZydHx)PwIsy>j95^yG~zS0~S1{Ods-sl_e}K?l=yY1`#$WFJ+nKxIW?P;4)@?KQvY73=;x+e|d;i`zbNM<#g8Z=WYGx4X zIE|4Xw7|Yoa(`Ag$onow-15Z87K3?kY zu&8NerKou=9Rfkq#Ab;F7sz;FZLrd~tf?*2cTD4LfRsERGpD?YQQa!QQbYl9jdUQ8WFf>o$hH1(Utz{;W!|9ETz2%$nMl5#q4=I3>nMy%}6O#Hkjaa`xN1?7I> zl_H5{wC37#t%bG`*yvy(!W;#wL)KjFXqsB>xSmFUo6-B6hlS3{Z)d6#r)InR3DyzG zPmZqc870eNpluAa>Z>#elu6A!VFpo)Jkh&!!G)?V`F@uU4k1q>+sKplr@W_r<5E

1k!&Fp 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 -nhEBytI()MM;c)ASk8k!nENkI2O2&G0$?= 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⁢two$zdm4 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�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

ecm9{_1iDViw>)0%8&#DJTR~RB%O6 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

bqywY8kMF=)Za81WEpXh>pKgS$!hk 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⪙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

vtO>)Yj$%w#=a{7|0{&7#$Y!x%%ic#fV!9A$Lx} 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

?bm3 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�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

@f zs(94qc%RNyX$VQOS~EeQU@2M+$D+V5^KCSyiz133JYv<%YKaQ=MQ~o3Fja@tMi_(Y zD^W1c6znfm)RF?;Sc2;xw6=|48bva`5)cg`(-+2LR1yvhjEkeHG;Id4Svy<}4qE|lP~&W(^2id4xl$zsutCBzW|%0*UqvYJXpH3DtZ zNm4C1@*$-&MrFKZG1ILB6;zuu={0j0K@Rde0?|U0hp?XNL|J(Mu#e9L=Lilm*Z5Ib z8A2ByT~V3NE;~fcp%KoJf+-d%X9n|#U_Te(ofRQelQheXfP0vM$_xTFQCBY|{3CcX z@RXD=aL^k$FPskddcu{i($L)zBaJrJ@aRJDjlh(Yfz2mef5Q;2GI+^^YHPXWnQ7jJ z*`!NOIMAOXekDvW>8!+yrh*c+QNBIG><1y*1u8CAh*Gf0SpH>GlMMvFqoxvmhB z8uPj+*9cYKpg))?icotzevHLy5-C~7Yom&N;GnFSBCMNOHGE48p9M0>K|H}5`QM1? zs}D&S1t&H0sTS{Gfcp363SlA#_E3k7SVrkYd{F&C_^vDQZf-)+cMC`m9VDi9Z} zNmMb)k+qDBa26Up^CC|OQ6n_Ipb}9oAP|%A@`Vwapb;9~bkl_+f{#2JL|j3Jig*b6 z1Z0$u{$~X}*xCBSfgWsLzV!NQTQ4=s#@@Vqef!$ZkDK+k^~&X)OV5@Cbga9pSDr0J z<~b&^Z(VU=?-?*~ca)X99WNE+YEM9u(ma<+-AgY;nM znO*{qX$k4^XDjk&EAnS6vd)T}1T}LgjL#WrX7l>a&K7}cwFl+kN%$HILLjcZL8u*~ z47|q&RIQF6(DNLQ!IQv3r9fC$!Asao7 zV1!|6Bu^#y6tXE4uu_G~AT6T3Hupd1poXUUzgE(@ARB|OrV3qQZ9L-2Hc#yW)mPxw z2k(>QSOt0}d{Ivo7;>xP&%(GWRIP~UO9(ufzD%Gmthm~!;*O09)N>oT_@l}LZN%+>Tqa~lDCha{+~C80l7?kv@Qj#|a!Jg+R9HiKY)6|YdjK6()( zGg_FCy)Mx>CtD4I-OW}-LU<3t=xki7$rT1_mDK34cQFa_=XErokp#7_8itZ>O1Yd_?auoKgVwfzq{IOz~v_SUQ*xC3~!qK>T@fe84 zQ$uCEG8&g*p`594hy%(1+qyLvgDR^TU_ai?gUSA#VJZ7vplb_VhuN-XP+bY%zCWP^ z|G&9W@^F;i84d5G-9@*vPu}iFn%o?uUCI$!n>Bp@pYDJC-3Rx-x__^KrCi_d-n;+t z{a+s?|NbLdzrct8^WFP&#Y$Qk4LAtHl}s{9$sSD>v%x>J_b{6>>8=k4d9<2RhM8ia zp_~2dE+sZC7W`P2@Wz5181E**CzN4#GYlt3NyEq6!-*Ngl%qBKpr6*H|3;6+Fj&nz zJ4y=%4}=NjpABap3~tTtjc4~pX?H)&?)4N7X*aB-qg}^_42Cz#kWz%l;dY-ZJg3BJ zvhd#d`R9Y~)o(te*>sn}8{d5R<}`(y6JYdkHbcIT7}mvdpQQ)fu2 zUFz+4!mPJPl)ZA{^7hv2S9Z2ux%i`#r;HGBZNnmVTxx%+q0!@EED%djkz2mgNX@xf;YpB{XE@HJk)ro7*e9=v<-(ZR=uX~3Tye0A{ogLfai z_u!`ozdrbAB^7vUpL=I z8JEHTv3E5+mKN9fue7|$3hC5$RkHEKAtMr5vYIH1?5fVG8k%Va(mjKOS79)YV=UQ; z07c3oCYFc@CT4_y7&Bqfux+|`u$~ZQ{zaa1`(ygv>7H(&@WRZfHB8_8^48b+curNF z=Um&ka{cI0O&>mdb~StWgw5Z*wPf*kf4yYycWNa2QPbGek z2fTn8|611j$ao(PbTzB^(JRmO?VS%duOH0@-oCx_#+AOBUi^4{3M+GC=j|Jdp6&7Slt)hDHPp;UXZftG#PyTh|>O$@pleW2Wb+d2bZP!=r;~(w6j6vR3a)kX?PYiGWXL}#$ z2e0gXxc}rma{pXMV_oaXMpAUcYf6u@C#V>wx_r;g)zVZ=d_&eYI;S*;j zh<^*g&8$pzvej4`revkd#<0uCt_L4%9A(m$08t&%ITYVrZaz`+re;54C{fC!Ob1eq z-;$%I&t>C=V=kIWnU$_p!kk?#^2SPU)SP2Pbt9!v(25B|oRdkV&?y$JQC>KE*KEkl zQez}7VrN~Pl+a8$n?Y=X&%@;?f+o593?UHB0-w}K$3jc@w)V)?GYRX~3CF-z+MEkF z)SGYJw7`-8)3p@3PSfz+NTEr*&&H%2jS#UoG1-MsS(EC9FSYtUsj#n+A)Fj*y`)r= zZPryyqJ&T>Kgb`C%!H?EK*K(hB z5HDSG7qmZ=JW(lUk zvDnZi`4cM!x}68XwuI!_;a{Chg5HqtGH2W0_EIb?O6yt72*w*d?C}8>GG<#RrRPzy zIVLt*tvrc^Kw;u?7@GE9@*F*Jgx3wJOu@u5tZ}KNmUVniGxR21qiri{=>` z`1(SkS#*;?kaxY0K7ywFh6W>9qA}E9&YbX=RII=USST&p9$Vt5RYiaw8dTo2(83m9n6G? z+){(0B+WSx_{CV~C?kL(-b|RaP@v$2N>2+V@oYz#RJKlYm`KwZY)a1AR@h=i&`eGW zU*;StVSP&?$)dI^W*=gK&MUApXnB&4hnA0!Llx+IvnfdS$~BN;5lsl0RBuB(v(c0@ z`1%CM8ia;uDK-IEDRVSFc0J<*jtGe>r_>>A&Q-?3$CPIA?vOFr^b9wZtptf)Q)QiK zT4VK-&Z^N!9gVB?5akgl1(IMrOfcyM@i_~hs5%!zP@iI5!g^$CHo~zuWqz3BPm;A^ zP!sr($SuN^l*J)eW-0&{bAUwhTDds@Ngy;OM2xN1nA^bnO$lLA4WvM@^Il1>I;ofy zbzPA|gbxUlD*3{~=L#5!z)AqMB1Z(i;t9TG7(c5RwSmcPZUKb{7A3;Pd*#W1t*2<` zpq1><;o+kuV-5$$F21qVO9d82g(uaCj;+Anj^rpXBdF5?pRmfxVB^N5)P`bh)`CP1 z^M-%{VhkjKsLMw*ZO0rvDd@Zw@kHd~2`Y)0f!G;qW6LItS;eT!FddPQ1uBJvaZeT) zsc2;{&XXc7Epk?vatorl_@1aXI7Ph+0dX*s?%BYpk73Ec=6BJQ!cjB8Jxm&mf1Y)j z$8?7^h6C=|_1fTHf^r{{abv_uX;~toNs&&glX_bN18uYEk*sCk=9ra6m?Wql!LGo6 z6nGS0({PbWwsBH1>V^q&QeE@0BMjyth)x^ar7~jhq=aRLsc$hDC_8Mt4W`5{h`SQJ zS+A28o@33;N*fgzMO>|B0OMiKywfE1IeH>lV+Mp*4aP)RZwrlF^{QPekl{IN(j9QIi1&z1ulSSc2v9u3$)`Ny~5!Lw9}Vm@?8mk&q=SdwRuWB?L?^ z=c3s)CQLd}ZN5Y$tN|(y9&OR6h%1}PVQ8>9sgaz4zJdE05)93^DOfBE#)g%e6djuw zP3|!_2r!nT=TQ(Vmjyd1%;l`}6?hXRdeS3K;J;3-;_V`4aGq5f+C_MLZUPq>oi|iq zzhKI8HPtC(o^@c5AWr1Fo^>n75|?12GEKk)Oxh3A9F%A+1^BJzlzpZ5XaLZlF|clP zjB=1<3m~%ZuxDCumIH!H0Orol#x&=YJKCINF#MxM9K%qW*2EYlI0KSd+w9^40%Rdz zBuS!N(M?JZRDl6zoef6`iwh2oDv%{s-ZA@-IvTX>+@w>9o)NMjeDqdNZ6L`Zv@irn zW<;8F<^@lzq`(EZh#0s62v&;%FF45!ex1`u###?$a%`P^>6N{KR%V?$1jlns{bG$X zT)s2{C|07-Y6=7H6+Qf%MC3@i6B3vhwh=!;d0}gZx$M!VNfc`}0I?RBdSxLS1PKu5 zHHnTqg4s5Sc^+`Vq!tnCH)ZZ_O52%DQdkxMCMIoF4fqen3?V)#>a%2VGEs(DpUj*c zaA2SAjfFocy7>|_(6}C_hsAY-N!J@%%pSVl$eIrDm96EL;Jcch-pM3r+;T*Wsx(OI zNxG6Yb7l(UtGNYw>6 z$AH)sK)8i4X}1-sz%Yn<(;xxTm6SEryoctkj56wRPTtm)KYpTafB!f+@M}S1D7+|$Wk3AiPF!k`YIk7H3B0&!w?C zjoB%lPpI^uUOf7hn4P}VDChBMU4+JJ{$Rfvjn(?4-$zF-z%X{Pjy&Ykdgy^3dZ4f8 zf&MTluzX52yIg(jdWAwX7fSD$S*`Lp>GG6A_-m48rU7Vc+Jy;8>C#6p*7`|INWnEm zV3mDyr3F1i@3uzi90BU_>7={Mtf>QqEy6f4qSt&idW_BH)+gN!h*%GAQX4*N;)UZO zwMk2@q-2tt)W}F7Rm6?aP)QhsmUy$pS8tVBW>QU=k(+njgj#yE(o3r1gSW*roARVu zh()x>7wP4{NTzGSP~BHu6s}X&tvS0NCMToYYaXj1NlMREujsfIQtXp%1GUk8jgG1o ztI}IW&N`C`qLnziFlV!fJ(Rsh@3WGVNedK8b=C9$ZJd=7A$|9w}PulP7!8T#rIge)aQp3>OfL;rIiK&w^i3Py7F!*!}!NvOJL^BA1;7S)_aB3EuuI~n8_1^sMr zhKC=~GSzS<&(`HLdA2TpJ9xGp|G|TKwtzG2BR2n`@N9km(e=l^_cf@tKKu3OFMj^_ zpa0~uTgN;vpZ)5yTlo0LpZ&+@KmGj2t6VR?+>S6t2?i)ZS}=eT&*kAE`Qdqt=)UD zudN?Gw?gc4^vD4-#)*fPC|zFOeSi1E-H&!ZP%f8Gf3*9X-CJw;&-q_hL#HEd`D;w9Y@4TgtEfKjK&D2tl zml#}*K41IGo%eotedo2U?Yh15+LaahmV>91wWY3Y?%dva``NxJ8#`~Wu(m9kJD8z* zuf6+eTi(2L^TRtYymRM;=kfO!FW&m%pMJLBzIgJqz8`meL+Lt}C|i!cd3qabwtXyN zoA=N7$8TP%+sA@aSBP33+j``v>x-%S__d?HFR`>7{_p)nmv-JNSjNC^I2;IM@vMU;Uazamt>!~`c z{5)sL`ig{aTuj0@A35`@!$zOHwtZ|MmE~zk`0G7!K42Jn$kBHnM_)djqi_Av133ED zAHdPK{9U9o-?_@)w{;$W-}-|X`qnSX(0BP_41MJ6MHu=npTW=<{J8{u>t_-4tv{Hc z@5C(r)nn@?zIgm;toz!fr}`Fz<9zDAlOwzcb>F`~2(q1r&&~s7t2pe$=cfZN^}Wkz z>po+6hAFHo*6&>GbS7k4!AY0Sz($uYU|vr*sd&DgfqWJ~=8W#118`Pw&G~TVYzT87 z!Q6S~`V@q67AiT!BG*=d$XV#)qL|}sU~v|hSOpO0p@wsi!r5@(A=}zF#J1*2DXDbd zLvUJE-doe91fPkUOd{R#b(mqYUK6x=Br6U7Ahxw8YbIUrp-@6=HMM3n4`Bo@K?`Um zN1W57Y6zseTQRgOEmX9Sjfu>u5`GUdi7SIdl6SFYDRH=#l~Bl1He|W-ta{nh3p$)! zaLxIq>5Y0JRh;+1>vhFB*Y-6hfSY%&d2TMW>RF1_GOdN`B)S*lTW0i_*;A&Hdq_-n z=!K}FOh1zv(L@bN)ifiqw%jFl+f59%O{04;sU|mIF?7SfH!H*W6pi83gYT1S@)|}1 z0If!8%5t-uus|)L&7{0Va~iQ!Y)Bb@lIaLB5P4e$1IJ7Y*#M*i_in#d#Lgy-1I0X4HkvX~b$uyQvv=Sd$su zsNEJl({x$Pq(&B8H6ym{5*$dX9wt+{@ZvBclg`RqP92U*@LDo8)$#m_+r#LA@X zNmqQ~*gW|F$1AR>PL@JNi88oOny!+%jan96Oi!t!JMBL!L#(6u zG-j1w4_dxD>80nI6DJoT(Ut~{7->=oWAxc6HC=@tw0&UljrT=!f#7KRnAAvey}6hy zTCoz?wWw~Z#0bDrC#B~3T)aW=Em_P?*L3DVEe2gDjAxDr`>e2mq;vUy_O7N^)8nZA zmHPu?)L+#fOM)WrSj``(?y52dGC|{vC0Ln^K(IgrAw@!p#3G9%3rI$eL@-gZu#i}d z?VVYV0{je4-5GoC^}RD=Lk$wjSn_<`M{mDRcURRp-BqXHfZHWV zJCo`j@cCZKG`)o8(D)IybuNK@fo(=E3gDQl*$JOcS=31Q22YbCI{X zYke*lP4cEuL4&M(TzX@SbgCEwNaD}gtEsF@jS0WBmX_v-h3n9^5AOoB($hAbtp_RK z0ooM>99rIVEYH$rj}BZqvBH?zZ{xM@}f9-_k|21sBJnYU*gw9;i)ILb6LWlW<1#Ke#wmkD&iwJ{Nh z*?UfozJ<3Muw@GJ!b8C0R^Oo2v%=q(E#^f|<~=PnNJDvM41u_wCYOh#~J=;Lw1uQyQzHRICCcvIzjp*AV52j`+% zXv0dS#!Q!Ys|Do&iIc%;!O?ek70*KU1nVFnG`DxILV95EotN42bX2SibwK+V5_Av- z=P9{>HriU%fKrb+v;(!*6Et0z_|wk;8?_1dvXfTY84y1MbqD#bL*{gPzz|);e758w zHJ-!Y$5;(cL4LCARa{gTW(lab$aPzTE@`B5_6FYs{A0y= zkNVYL-8$nMq67187Ity=BLW@-KSq8G=_q_et;uF@Pd{b44jI6z(NS9P%b>yI1SzVz z)X9P|jw0f2tax-u0#a}4))TswG{_uGPbD1+XeCh(9ku3pX6XD86_sV)y{r&l>3Crx1~VX} zQ-;;DpA@@e;h;VV1{l0tmV5b)GU8zu8Hg=|yb4TW(29823I~55i zSIoj2f*~;E1e733>ROka@fLZ3-fK`VB-7k3ujP);wz9+d0{iR^Sg}e`gLqGxO_Q`p zQacS`m8C3Gf``#pqYazVSPTf}M=Y4g))Xr=D!xLgHA*(Bu>+S3Ht+g<;zm>wSQvtV zdTK+=AlBf?bQXC0jvaQoTB}sRz!NMrsAGmuVbB%xRu(jKNm2m$(pv1v6j9>ieih&% zjR|O2m$!S`O)?NtSu}%W)SYbaNxM&yKGFvA>y$y064MGwWH}qao64w}YFRGR4YRSD zUAA#?kRZHtK@8@S=j=fF-MKe-aZ}!@QH^;M#N&cR&$VOyQ%{M`rj}gk(Aw0fO2FJR zSq2-Pm)B5p?~N$n*SBK^scf0w&y$Nm_5u8=4Zsyv-{H+{jl5rt0BzgZ6~fsMz2O1+ z90L)ECm}co9qDFZJ|YYPJ^bcn^*y=tpX&@%?_uS zLGW?lk}e3{U8r|?KG@!r5IT#(83YZ&p!Lg-DmPYVP4739=14BDs4K>7D%d0ZNoBTt zyg^b@zp}>;U__muQ>4o|QoMl5@?MSt%v@6fply9vkfa+x*aVs>$@gm&>SfQ?yf}XW z-`1c(y4kLlv;&wOu*eNKh*1ZkjEWPCU964lXDyp&IUuhc?y3V>7NY|O69kQy zfq-rBx=J)b%X-%%zAQNxsw)P(U_&j<|1tA@O!9Pn@G2y=0Dy)?tq9F zaN$ICj|Lvuz=zA;oMVjfvQZTJa$d0mu!P)s#eQ z)&i#=Gl+R|2BlT@K(y}&C!Rsm08pEUlbF+1E2T{WX`u=bKRt&AK2ipEZ{-}6r~!8+ zdU?d&ych!1tHLo)RTv@&YgC6JscRP|#dIkQaaM0VUI37@WARrZKwGzGti#d^y#5r* zphvB@b6`EgbDCH2WK80&CS|MbEY4X7HVtO)39 zE_K;JNq05R2q6~l312a1Gw2YqF{eFNk!IuiX}H$NR% z4{eKS0BlD!*Yg|@@b-CzC>0))H%rcJvQ3V~yvYVN;5sti0(EI$;P^O@;i;wiYMf@y^B0o zQuEGpB{lE-hDd6D<9FYDEvfnTOC&X~iNe`EzW8l?Am;DlTW?)_o$u}Y!e6`KC;xW$ zoj>^6#eVXScW)@i$$i(A{P6wHKY`x@D)7(v@B`s5Y83f1@9M?dpAGT_t)izRy2{$O z-gq+PpFGuDyE>%$U?2X2kEYK)>AHl^({J-{e|Kf9YhpfvnSc3H&*s1tdR~jZ-4J~% zw~M~HyLqna+i&q(FH>lH^F<16FA!cU&-o57R%k2pODMG6d7eUBeyKp)o6i$yd-KHt zZNJ0!-Ui0tyI(?s?aDj6OoQzQPqf!Q{ovpK;?o~q;FlkL`tZ{q;rE|>`okM?Y)`eO z-v8u*D^mXa;^V*h_@|$|_whsg{bx7D*`6BI6>~Z_9DqBCD?fkdmY+X!Ltj*Fd-}lr zyK?1;>*{Tnx@|vs^!}p{9{uX0KYR4>0)Ke;=$|hhegC8P9zFc%PapjPzyIo^zq)+x z;TN^tKKq7O2e_{C_VkHAzVh?i-r@JJyrkado31`^UH>I;i^mVXclqmkUlftMxkau^$$j=-_pUr}V|w59Epp|7cW>K6&wl>R+tx>~e8An? z_Q=&;dR=htrWyRvAKsYRFA=`}_3xh-m|kv}_wK)VR<8@xeKxCC-uazd-}(IBl_zeS z)_1SG)VE*YOFsGDjjw!7%kJ0z_?Q3j*Wdlmzx}@J+Wynee*NDnlm80_;KXF3ZKeXlKVeD6d%)PeX1wnXZ-RH| zT#{lO!IqA(lalAKI?^a6q|0)dnd{Mg^pFIp_mrBC7nUr~+&Qv2R~yn-vr}vbiGr0m z#1?m5=Ts__=Td53Gl_rQQJKuj<_p4bx;FOG;kB!p@lqXbEJ&!$bAmh-NYcz!;8b>H zp>s6vzJpQ@Tgtpr>wHAAx`NX@csox5gIpk8ThrH#wcB<^2EGRX%RFe;RMin^155@EH7+Gdetz37V0D{fq^CzwBRT7!fW>`%Vi}76u zCRm8sx9u%^pOuG_aYjrbI~wCwI-(yCgn4JNZ2*yjx99y%I|<-4NKwgUSjXbybwn8} zgdLDKY#wvCTTmM_gsjaf)!P*|Sj-l_%rFOv!4HCR=msKg^Tv3&p4qgN?9J0w>u|=W zwV22Vlr;un{&jAkBFf`gnWqDPM zSt*FQrMYG;0tq%Y0%MFZ&ISZwaE&z+SA@hfx`PTJ{XV3{+!s&KhLhArsp3ufN&~}c zF69E8mx6>4Cfo-BbkWJF0?uPsO<)OZu;Ow%F>Ymg7s=A7VI>emhL^{&YY_F7HoRs` z3cD*#?P5BUoLNDItS+t#@V+4Y$G8<2!?r~#8*#T{$;-~$z*GxpmIa9xFG>qLs%;RT z-dicP0Z*oR_9!sTAOR`{RRpe|XXMjQtt7QP^;po~cM#(u#>8XKfw;)BOJ-XKH4JrY(%CL<6?6TD^x6)UT3?QI; zK8^7I?iFFT_Uz&WSdb31l!G!vu)XG)IeB~9Yy#>_M^_STWdqs^8l-y}I@Wt|9UBq9 za{_zBO4U_X40QnL%3#-05bBGy1vUiaNZSvi76ytLMEnS1CKkl?IuFjNEEEA%LfB))p3CA z!Gy2_mZ#OhcLnhiDWii@fmgK*?_Ts^8>?db7Q9Ok#g+z4gmC2=>sy*r2=KXcytEf^ zB1lThWf-fgZHw!CiuWWqAVUDGl50@evv^eW3So!y;3X4dWIpQ64**?*N}|fBL}wc? z{VW;IaScr0!2TLN1u5<8vR*o%eD@l0XYL~dIU-JW*=+|&1Yrdf-fENO30J@Ua)5I# z+1peHovi@)o>5s2vnw*{xU589$IhDG1wAMyEOjq+KdlIX@H$d~XRh1p)Ygt!6BqSe z%j>NeJRX=nA=+~R0ow*R8RP2Bh11qNl;K_g8%w7(s-D$a_KLMvB&;J;@?0*%oD8IE zb(jw<2RqNz2ZPSl^F)Lp{crZJrPt0QtNxX%o=2)(uU$1G23oQ}5wZyLUA3#oRf5y_ z(GrYkqBO0ZA)y{L6EbWbqAl?Vfsnx!)3iN{e*hBv3)a52<9m+JwbRLtP=hBl+}3(|us8*ryapz`U$9Hfj>9^&C|(AgAqBX?9d+ zO~YFlwmF5N&5gJKOLV%bn^PTQzz_m3ADD5?h&yeq29N4VeAcAGv~oVWo(biWc+4#>g-ZF_&gvP>O`z~w7 zvNQ1BTs6lG#$UTr(&`k$h}x>@U4V=O#F`|=vauje&$&P|sw`1qd8;A)U zHaT4b0(A*>6Pxfi4Lb(uMKBJeFJxseIU2?j0k#2=H=CM#E`y56fg#-&Cj|`YVA~a; zm?j}E=G>R)NU*iF^K`n`BFKYvwTwK47%4#Z5!odHypX0&KGTIK86LLtm4c;KJ0hMs z5RxMYcG}rfE0Anr4Q7q$hus6n%Lb~DV9n@!D0uDJj-;^E%l4_mz~uF07XnNk*lEWC z4{wAx4AL8Ul{AnTTgemag5f#sSbzm-x2~CXS}P-@&KVeKnFe$%KGwCV)NrZv2-3X* zrJYg)p6^6~#7jLB!>EaBCaua8kd9RVkH|!j;&u`>hV4q4pp8lk)*BEo6AW>pt%0jW^%&d)WU^ zIffImGw{}5R(9s_pL|2vnHx9171^1urwnuJ?XMyX^G&}<4*wfpTD>*a51d?WB{ z`5TwVy$;^5gZEbt-Y2wlzI4W4T`e8$m51#+_R$2ybjKnoEU^yk-APK;q$-zI#*=3$ zAUm<8(Wx!AX2VW8+@O88)^)4t>87^13hso;fnfoZWM?bbqs zoqEVuZFz)PxK7D=6i(p1*><1%=WfVdL& zTAkrPYjCSe+p=~C)wa-+QzOW&*44R$jEPh0NWx0+`NADTbXt?CG%3u!5yMiq!!m37 zi`Q-uYwF~)X+wp^m@Vk$mh5VY-7+YP>IzsapOI|DkumK0XzRV~otkx`$hObX2w~7grZ<4Ahw;FJH$(nH_9_2xHPfiE9)>+QFWHH?0>REfU(bwr82tYiPq7k~Ts!^eO2 z_(xwnc>Lopes*@LP4eLJj~@T+k|?>gzIXA-<&e%`wm0tIxqn;Fk7P>lcWl(}%9YRWp7{J-lZbfs zH}upKu6%qTQt}s{|MTbn_W5U@fAWhTeE#54uH?ZP{`1){K71lmg8#uM&qPZ8C@-g`}_F|4n#_>8Rdac$U@i{PsWo{rvs2TkG!A(H+T@JR8-Qqd!t9xq0V}XWtex zb5GuT7t>nb~fA76(Z0Y?gf9J$#zVmB$ZlAEzD^ETY zF@f(s`oSx__dv(w$#d?$d-2iPo#zvGAZ2o5ICoD?$kq8c5Hh*(WMO{&{vW(^|IYaz zt$XLkLM8`a`_WHc_}Y(ta;#F3l}Y~Ho42lf@SAcM2nq>^#y{_g|?oUxukeMfw^>rmpZCX=bjy+Ft($}IK zG>4{b>tJpp$;fl3I8&iCoyyLru9ey%E-5d~*3Mn)4x2}8AvGU+qEx?rI_i!^$+5lV{Khy>U*k*J*d^LgKs!e$-5b#AiQ{ z)`STs8ceZE6v@_-E!jQSEyP}3X~T-lqbAJLj#)XZVkO`sr&OG3+X#fUxOR`qn-oEEAP_e}&`dqH9T7C0YO^%d+Vje$ zcdynHPj$oLDU3?Pr#8#(fsU#)3Sx_Plirc3c4L2y=(Ra-o$z>3ovBOU9>~I2;YMX_ z#?tt_L{e&fNs%4xu?zV{X)Re1zLT6PS;RUNhR9I~QL@ZtJM&SLH01514VX-zCeJjw zZV5EmG$`%PYfiDw;S+^T@9MI~tV~f8@UmOs2q_ig(ndaL%9M{X!uv9z0?srsm{Q_^ z9n?OYdc^10?TN9DfHQ?8%+o|_YNfg;GA9v0G61{UBotw32VbgGPddb!{ zEQW+Va;suTauGO8k&9b)lI_ct)6f_M*{Z~hpg5BuE{@2OPHH>Fy4FOzWdZ&wCAG2{ zJ17+^m~@gOE7lNrtQ{3Ns8Q>o4M6|^Ibq(_2MZUjToY-oeYX)usZ<&u1l*Eh^;-B< z6E9(q#e!5HgTikbhqzTHPbVqG9p*ME*3e~D(4mEZ1)OREFC#g1rLEDVEF~@2mGsNn zJF+}KMBx465&nc%qudXqg+dhbR(nTgqcQ4-1~AmOBd#JiZ*LdX1rTZh;ew-&4` z-ZXtWpL~MEghf%YBrG+KKIde+LN-mHd-;r{gL;W!0*t z*f1Elw8YwaoMFu-G8p;HCqOoQ{c7dV4Zh!rK~UiO*5%DqNS!D)GHtFy!P#|{*;i{3 zX?R9cwpCUi+|~N!rCLHt3>|}!Y8Ae5YVKuJuQjntx}mG>497mRl@ekt21xO+tsa4)sJ_vHKuqm~*%)6UZ zSZb?)t>&B;O{bfDn0&CqfEZ$!3m#ubWKJ@WSfn}CLQg{akgCykSOD#jT@r|?2@slu zpU(!)j4AFq;rA1nh4PlffO*?mRg5)#wmnS2)}rEKtFLC@M+^*58_}O)cDf)u;fvfx zo6>fP%83)e3ossGT)}H3rU(^5epl*%T+4=qFjLCl31H;ojChh_G|S|*v?qjKWaH8& z0}$=vl;h{_2`S6YeXJL4+@{~C6M-v&**Bl*QW#gaK)>w_z_1bZI?WP7QHoBb;|zXc zT{f^3Jp^ka!3gv-+h!*@U8G0ONHwkAkbwbMyM5|FfF0|(wav}`1`ENVu! ztCQC3reOPl9q3fk1pK8~O3IYU+65OU%>YYHz>SE(;JtCfSt6_ekiN&&owUoh2%;4L zo#7xvV1Sh#fg)*?9FkW_z}yYA_j2=N0!Zu`5nQ<7r$yCC4RmWPqPy}yWDgxo4m^dx z|%Qq)>$GVjtZcdPn=-|NX-ahmpa+8 zYQyr#z)MTPB>A8{*%KZ!!V;oVtw$I*Qrr<}EJkta_OQw*mv6`o6SplnBOGKkB}K#m zANYbO366~iVmv@$8!J%K?+Qlj8qV4nDxw|h$BgvaW-r9#=!kf=a67W8pV#Ev?KxaD>Q&%N6MSn zCn(ooHNXH$;C5idD($kV<5DB~>csOaMG)e#hlo-SBO-Gm_QSNOjO-)_Y*8NECG1?2 zWKPuL&RX!N^`&&WYs92ID%jT)_y`yi%>u?ZZBv1|(={N@YDsJtPQ!NdVObGj8NLak z--=U%C$hv#s&>0*?SMSbY$O)Q*@TpRUXqYDNU$)RLgWzaZHSrythFVlQ;DXg%?n-u za4EIN!Z2jym7HaQn)|Thwgv^TN#G(7?=IZ>&I5z9*1GUapWRk%F=lQdfl96(tTR@z zigQdK0)Wq%S6`W>)-Xq_yQZ8&XnU8HV89)a%xAZ?(VXyZu+xA@ zlfiM=t{s0++r?>TkKoxl1HltPQ4(2%oC(YySh+ae!d12#S)xGSlRKCZR-$J>z7Rkv zhga7Rgmy|rF=N)=NvBLKyr#+-d5qalis0grn?F)j7p9bh^@A+z!48GQpCiwChnea3?Rk58Oo0NPK|(!q zZ{NDNZk=sf^ zjKn1))oW^>k*MjS8P|y1!ux@CO36rKkOD;L^vSLu=kJSZ{YbB*okXlC zi%o-bLTb@lY-xr?Ys8XMD_GaHMyuJL61r@*Y+v0oUdo!O5%Q@@(ayzIxCQDlL^qpE z`x;{3b(YM(P|R^malxjl2V3EUpwS9fa^gjw+j(|ZTq@jcy%r~2f6V9{@;aI%W z*1G1VlSQXGzo^jTC_=q+H^ydU!O$&fO3VpQ#&J=hLcC?NnS(K5D$cH~1rIbs?VaYT zGNKxLE``PM=yT4IRb*3xDak}Wz9!diMXfZovofemje=G9vhDAcL(sic#CzI(mx_4$ z$hVn_`1p6uzzqNFSgaT1HVW{v3zs+Cq&+wB%|ai3@4HLEhi`oH{-@vn$e-oUY+;~#F|tpB|A*E`&y z&))j?&))j*v$tOR?5&?|et7G%w}1HATfe|*d+37C9=~+`kgshhgLvbIa8f5%cezEk z4}A2_Z{FOH+YS%p_?2yf+ZNI2kB<*u)N7}?b*HYpMLGIYoOyEXE{yNaY2)fH_voKK z{^@Uj^zr*2|Hq{Vq8ESq@dqFO9H;)ue!_uwfBV`FBI#K@e(6yE`_+FqxwJ)MJaw1* zV2o$G>!Wv0cBx8tuXAweIllS|zp@9=c<;QUOE2=#2_Ibq)%eop77ni6hBltM=PfYP z6+S+?{Or{`^u{Y!@%KZ1`6~XlK{@h){o(;`|KMa7==cm@I~JUDip2LtGrxIrm*;e+ z{ew%-;2s|Ud3@~fqYsVqc>QpT_ITBNs`a7S$ z{=?5-`>)Sm|JVO{|NY#zEgIEn)6o~V`echwb*?dPF{_@wF2{d)oIH?~nfF zcR&7{Gb8>SROM}7_(vD?gj)yp_`Dr2*Y6#Hzd?-Macw(}>gZ0t-`_QD$eO2)??UJ9 z+2}d;xMO|?=UCZUu;v9!^Km_To)5pEZ0>f&!3!rZ9_TI@?u$!}tM@UTb1d!b`Tg#Z z13qFq_z3fP2J`9j{VAW1U)fLj+&;ET`IHAyKChg|@w{?Dj^`8SoOqh!>9V^3$Me+H zwmF`)x(9MRuk7P^UOAuRdHVPk$Mbu~c!L{|=gGkZFrKF$@xd6+Hz3UKs_-))&j*O= zi|FEArsqDvdyd4tn09@TYd%ko?$w{WsLy?(^0AA0-+d}^m;1R-`8}M%+hu@WK*I4E z7U;c0_u+x=_4NBx*ItozPgCs)0cXV1exdXb5@?qcx=-3%K+Bv#hF(;b+((K$B8RRa zht`=S2^H}gw5YdrtGU>m^X%#tkwaVXvBi<*lwy1Xk*cwsvQ<-D=+#Qoc2d-(vJ4#Zhb)U4Q z(0j#b%c4~ruX^!5a3eovX`3%3&P}WR+t^DTJuiAEzBC$2wu2Ata7!@Cn#6Wm&0NzO zkK}7kZP$E^4GlqFz!^@~u*K!#DIG`_VMjMH^CVo3@`?>zu=v zk_8r+SVJgnMskbrq|P=|!9!}8R>nNU>a!CMkLhCYYld)$6g$->v-B}iL@O}FC|0hl z92_v$jMcp+; z%=T)W@GImIisRrALTs+-qRkJ8QQh(wojHv7wqU%+?qq<(^tY-^duQlEOQ7b~Q## z(lo5`!n6VZcY<7@8b+_S<1v=0c|wE5MLYJUPM@qMtnF?sTJU5nRxs2xa;rFkq1pz= zM3WrkJv9?Z(rtTgHoC&1MpzM38ce-6tN&0TyYR;wyRt0eZI;x%gM9?N8Y%ccVlk9N z4cw7MxHUt#6e9ER89fz;?d9=EzN+_`VWVzQcNHX~u_xUAfJgK>Fl14i*-%!gudx$& zkv5>?5^`)epz~z%FyNwL(qJfS8bJiCa2nJGvtv?IHf-YA-3vw>23fxs% z%8M4*)i4pax}Rtbo~2Dj8&$d&5__j5rBNA3Th|<~0`2wIC@i1B1!71f!RzQg_V>w5ngk z7~<9j6cDak)sYW)gyefNhGb)1gu>(|CHmQlm1;)7hsBUs)okr;)`f_G(=t{1I#MfRTI9}V(XYjA|POWwB5 z`#Hj*?!wL2Mo1V&Fs7p`2wFz&FNF~V7SUYcx|~Cz#dDZ|NDOy5k`Fcdu6fbAU1ZXT z=6DIvCRuFGs9NEo1f3))EOL+|C+J@!)?LlWCvM&wWF%QTZ4s<+7%Y+0T2!4OPk(K{(n)(9VC&=fau`^7UkbMU&lngX7Y{f@IEw z>!Mxx;$&v&c>5YS!mUX0aS#lWbP=&##B*r@@v#`s2TB-TCW_9M3zX#|h=FzoXO(g? zt}0QEQYr#)lvZb0v~5OaKqhLH<0$FKlPD5$Rf$1oM~GR}NHNS-#rT4`)a<6fI_%3_ zuhYw#)IlL05ow7S0u_=)6mrW{3mR!9E<$0}P!s$+EFXavx9(yjZQjTt6jm`Gsz#%z zkB+1c<96CCOPo`3nCQhd^IeK@8ydIl3UUbP(D!{qSRh4vqKy% z$*~|kG1e0=YD7Jf2lQ8(6|x8!YGUNtNWc`C_aax1OaW#H2keJusclSRVXL7+p2wo8 zsA-?$XLE>yfh%-9hO;vQc4A~-(SJ1nNmrC%Fl1YFL_;RcR$gvyOmr^7E~4XHsYvfO zw7B2};~5dBO+TX(T2w}|2S|#ERLD=k1Ni1VjcLVaawv=7TR~c$Fq0YEbQ#$f0wvx6 z8w|blMY9L7GD&l={G1{2ebS^HlFhSB@{54ZNK9?&R@nDpl(Jf4(F{GdnO&cY3TeOr zvqN5F^+wD?Lt`3PKO_w45LV5DAOZ(Jr{Xc}16`kpW613>0y46)HTfM;^5`uq6EHh+ zp%#z@d&u$(=eBCgWDP0#GL7!j0+f-aVV_mwFnr`96i?qUyXT~yIJrqsc#K4ESfE~Mf_`Td!q-k6=s`X9~<0ajc_xrP%2*u&2{E!-_jbSK(vC+!-A(x zf8){0s@lHMir3X9R+1Q5GCN!203nmA4Y)=1mXpo!OzqKNz9n0rc2+Z>D;2+pS!b9? zNaY5xL`|)XGb?vnaAqvNMJc$a*r1FQP8rrS>t;PgFZKy68-9P$S|df$jrZLPR8533 zLp~9Pa)jbswNS%XiEaR7K%2k#5JRu#XOO^H8r~%jNc6fU&-WO=5#6ONAu%$duSu4s z$iOw`RfOGvxSn!`)i?1zK#C*WG{HF2(A**vgO#g< zu#(UR0x0r5zo^ouL)Y6ZxgEzNh{wN=R2QSm;|Q@K`W(CcUexliYs=d|i`RP_z1 zw-ty%HUak{HDrZ)83PV_(I-OY(5?7D6LquJ+9LTH8fidt7zt};Tam}v`UbJp01;}k zaWle4$p)ie^oelP8Y_aku;r2=oUsZ_{UY#hgMO&wKQX?&Qb|Aq;hMW3&llRSR00s0Z(BQ zWw0%ng0SPreYRf1BG9U@esq)AH9OpXfEgOnxlz^lN-c*Ly@4{CzL?-Nzq$X5Gd9Fj0l~L&HA# z+(V;bw|?czqG6x>O6aW*)yCI^hJEgt|1WIVi`~gSI4oWE;j(`Ohh1>FNACNP`@XpQ zz8`7!jxl~?Nwdz`3X>AaA(vxs1qHkKm$a{=vYUN!A+3K=Mop=!ov}BJgQMw?3 zOTK%TL$*>cgxp68Evj`N71#B-1kFy6{YF1Vt!`7eGOTKZo2OwP%4;dDhDxD12}+|= zZ;J}PRJGc4B{;4%`_!x$(g?Ma42N89&C2fHk?q!*OOCeJf^&~k(PYVCl(4E$c+ANv zY{we7S(TUEX{P42Wvw|anj2Ck3aL*mM4UBw#l?Gb)Vaq+weBU3k{dJEu3UY$#WE_k z=#x1HUNiyKD+$HsY%PvDZpHQv4Hu+T61-_7Q!0akG-HXotkku1+K02fmv8LiY)>EgHsfp` zd+xDEINJ;2Y(M=0{`>x?uN%tN$hH6W$-73j{q&7pgw{XadiCawo4>mCSGQif`LmlJ zZdir4ey}0f{_^GrJ3OuD^!X#bO;EjhjSr4?s9H~5`{>QX<5x~ze&wTgZ=dqQ(GFhg zspF&P_1eMn`trSNY+<&Z`sf!&2hU&oKlaY0$Fl0W<6q?}lO$3c?e}A75TX$>1Im#l zCehljuG@X<7V2Bos2PEQ*p3|{B@tGv2n)$dgbaeF4aVU$sAgJSHG^raJp3*4U#Ggd z>prV!@0JI&gsM@UQ)i$3TI;{|+55NZIB%c1V-C0VPlq?}ymI*7;U|Y59{%p|i+P0X zogdwK`S4x*{<8)A*3;wZ<+8hT0!h64+yz$bc)EL9xr4Wd>+@u*ZM@cWJbHS6if66F z!Vb@6ChTwv&G7Fs5q9?m?eE-c#(MDHbOF}&?7_RcOjLYqo5pwFsl~cUq z-D2j5U#RhTdiC1)%GLYTnInJQ9h+Crj?Fm&7{>RlNuBMzuzNbXm+7j*7~<>bxSb^; z4={-xqb8YFK^#mhEG? zQ4=me7CrN{d9rBq`dqT;rFCS{OXrY9&$RM9TJ#67w%>p(dZvo!kwrI(qD>lTwe(r7 zc2-NAHL_;2d|9noHcOS&@?;4ax>AEYwpw~@)Ei5T&=s2ELP}x@3%Wrztl)v3{C*V- zbd~K~Ee2LAfP3A%003R#?AJK?3wZM-;^!)lz0pap0DYe0fgj;L9}eErl-!cbwQ+W8 zof=i^izDT25UtaWQenO3)tp#DFcg}0HuC0c5~k(Q>CBBtq7*pCRy678gSE{N^UH!n z!MV?(7@tby{cA>P#xK^?f=2sU$vZxy>QfV`WVB8s^hOa*dDNoTP$Kc3pxo)?s8mW3 zDLk=hqf9bc@+nePncCDV7rivhb+u8T04sP?mgWIhB7a9vqEmD6*@4Du#hy&!WKvZ& z9kL8bxhgwt?^dd6O-X7`A{S#@tV#u8wbHV+J{zW#Y0g+jLN_V0=iNmErj|5s$L(~m zN0sc*WI;$DiE^m|J(DeFr%hUR+Sjj2Vfb3DBJ=4R%tzyWDZ*$V#L|z|G?xuf3=myW%Yea@ ztr;qxq6OID#A!&Sgcq@tTObrtf~}pPn8d~^kjCVLU|}#Kl!YOBZVgO ziTGGu#HfN{CLVFFx;``B70akX?FEzd8-!zYMPm&600$#G;XNyh)F?AUJ-vtt$^|n< zad-kN(5Fv4+s0H2Z&lYY#>Q62ujZu-6~?U7nIr`xuWN%t@!3GAI1F7lF|Az4x^#m5 z84O^^2gcq?1MzE})bPhm7T9FliSmdcWR*(=l_01Hry+m|I;laj^n(4N9wK23M@CI3 zl`w>b@rdOR6hmBeI$f2}<)y?5Wn^I|B~x}&3@Evn*sHm!V5pS0WCCi^7~+mn^@{DXzIQ%8YduBAT+f9+RF=Y(tPD#3%uUs1jnc~=#kI)A` zr7xQe-glw~M?4pGNdg*0SqGt4U?340Q4G4JPRHsjB9b(mtukfc4r%FXQWc>ioO~zB zqbJi!$}+-0LOn8UBzm}EZ!m_b7oY=OkaDKN+42fgC6#VgM`sZHb|MNU1n@!lguu#a zVyL=A5EKzRR*JdPvPWX=qacNNegbJ>ovd(DM9pTSY(RXCXb9%fYr%wg z$ko(oV;;3)N+^g=T|g%kt(vl}vCfyJ)A@Y#d6P9d=ZL(7H_^@D+3?2_o~v}CJi=^A z??baHLjhMvJq9Lag6`oQyf31+6umHcKj4#NY(OJQYF*_?ObEk~Xx8P_+|LPz%Yd zb|H=QqAJA@5U60GS$TKDsuw3X?$uhrrJygAGYB0_b}cd1pi@np%B8>rTj(IT#Ux^_ zKB5gVZFHw|$HiH6gdoKzS11+1sfC=iQl^T5+{Zu`PlY2C&dg9#(Ndb4gAlR>iTT+l zJ}Ch)LPCU+8SUk=;;&5x-2u5$b0>~PAp`Y*KqNUO5H#52F@i}+sbxW^*Qbywa%NDt zP|`rC_?(IvHZ2$7MW>W?6~dalYp!}@;fYqrw#lX$OD$6EJaK)$4>wJDxg|o^yOh>7$ zfc%Dvkg_<~ncOMUOygCps5CDU#43zLe`8vbZ5n}TFPs4kFx;<}1A|^YJ(PjDCA9981;pa6h?q@F)Ub{m7L75Frcr`ry<7q z!cFSN`3fUkJzN*#l2BPh7oFf$D#;Yt)CB4*EV?Yg?yvb?unFD{3HUWXL+cnF+bBhAJ_*6dpHd1$nc!~|#u5fY zr=>i}sRWx)%BL2x<~*J) zI1)X?+1N_O$bx2;aHPS+lBtCtIw3`+hmI7PgZxC!V5Y(az*6$g1D`tqvt$mDw-~TN zPP~dQ3Wj!tD1&S&)QMEAIV6f~V0?w@NTOKS0|AW|t?ra&PZ76QDvvE5~hk&s1TfDLs&03tt32jiHaPP+WPpgWGn(zk7x|e z1o0SSv4i7pcbKQOPa$}D%{$quF_3`{Gs9rcGk_n4y4X&I*dUqA#o39i=QT|gQIR!<_3~A9RDYBO+ zz(pTa#9-Dr7i9$G40KYKt<&h@k3=L{-Vxd`uqOU?$s4`ApYFp~Y ze2arwApgLJeWOQKyWun2Rp+8i>`x zA{I6g?KUJeRKymt6O$knL?u$j!0A*3i2@&-5;SqGr26zpbHyYXbPkmhF^0qohnOzV zsDi(L_bDW3ofG=IK$SYgK@z$S0k}0JF#kKPhjE4@PNyWB%QX}oDq>YH3}4VGJPeei zRZw{j5=kN2%Q2fQn&1ud#0#;_{Lv`Mtw$)ybXIK`j;ZE=EOb?RZDDLH|93PL*TeW<+H%S!>- zDN>@TPG=4I+bEx7b%7A4QQ-qyIanhh;(L9N=R+Y)l;Lo+GrTY>crRI0ysu1lT0GGi zAxDu>lvGpVO&JRow9A#c|OZXLU&3*UR6eLZai$GKxL%J zoWX`O?UKvB6E3vcrYavMM-Nz-ln{B_im%y9n3vkAkfboTV{x%brE1ig6oxN~khQqh zX@v%+oe!SW7M$l@Ftw7WDyx(_m_%#Qlv``jlw02pH02Y|Jo#-xQ-1G>XPG8`)|9SNB==kO1 zzdwHc=(h`arpI@8c6O&PR1~(>tkZF&d6`>TDU=L^}gHZ}$A|q~89AIvvQB3k;{Z z2ky4f-gZ5CAcKeIxK0a2UpsT#9O&s6hhH$@>F|p?FX8__IsDz7R}ViteDCn)=+3Km zescKPJ(A_&&BIUcyuO5j+W1Cuc&MeupxK!_XN!$Nql16juG6wVTP8>0>U4Btd#{dX z2OljUq!x-fQ^p)p3b$=fXm1-YF{RNCZaR2thq%EP5mVeRGEqGU z2Oqt7@X>5`@b)6ya*KAZ*GV}6Tk_5I#ud7@K%!cB>&fIyD=x#S{_*#(ytz!boO{Og z{pnq(=gC7BX;rlI<*m^cP0Kafzf8;2D%#n{Kf1OrPtmewRiv&C=a1Lwr zWZkLLn(AzCbe+z;*nhqBud`*=6+d7`I|*-B_ZFa6KbSp#aBIROy^}{A+t&g zKmNnp@BH7(|MG_){`*EW=7MQ_e}re=JpReiXGfoN84Ct-gZVkf?woV^1TMOAO5dBw zcbj?Dg#Pl@`Wdk>3C8Qj{P@DNXl|d0)&Fd3vU?qKYXo0-Z47g_ zP1oxPvBh*mlkw##eEth#E`6IV?jFy;)4!PQVS>@MGWv_Bx1M`y1V^d=a)e(E_dYd+ z78qj`kN5W3AJb&CwRZz%>B)VFs^PY$zWe zi2j_NhyL8!1ozy!DBN?yjq`9%a}l`b)*85{JQwY`wGQpMbq?C|xiw_Z$LZQQA)uUI z1nX%ojP-mFC3#{dPfYRA$IG}+){cM0LUNUWys?b@Tpc}E}4$$+ExS4o^3%Q(qYBA zPK%O+ZPf>vI~8J#3o=w=@t@1VWnr!JRZ`QMv#RzfBn0cZq?EF#xp?cTQHY*fuk|^o zjdn>Ydenw211xlCQ6wF8BO#RUR1?=~u6(xc|Jgg29?6RAj(?Thc>^fkkJ%v%mQ1(W zq8W|k%_t(y2|DTO%yw24t@g_1WogX99?Ra~*JwN%!&tUa&kTbBA-V9jfL*i3*z(F> z!T)o!AC+0zUEL6Ej}a0DROQVZH(uxbPuz&#F{hBanYPu@SEFQ{m$ zR$KJCwoaK^eG;DMAO@|R0cF=R*VqDi;@qty*)E33r9nqFoGj=@ty50TwWte6NnPfH z&q@tCfT~@miPjl>qg1n!{kFOZ!%?M>2jO7@W}|K<Iipn_Otx8#T zUV6%L5GB+oGREl|;_bAZ*?9rKaUY8YdKCZmal zI4JHB^CY%hY%V67&}=r*_CbmMa5l$MEeq6G=H44gEYPM7G6$No1r>Pg;#>^ALmAdLt^=^G}#aL7*_E42E#SD67 zYir`-VX=bqUikv&n|t%wq#j!v1d_7NYVSg2Q$1$8)7De8r5Pin0~)j;pqpNcu$c`8 zFu{Zcle|f+Fs7Nt^a;G6z-Fxrq1OQU&|56FDqRvMJBaG$R8+FzUCVLY5;J9?d}(iB z(TZ||YGSCsTV=6Ws6gw{B-!eoA@HiRWA;xtpDZ~@m4vAhY!t{-wZ5v5n|6ba0J;R{ zp&=Wncp1I0#wC>u*NZ9H+@L-oO!26MUJ+WaowVSfDYc@Lu6hs`7&@XtYDdUN3y}&< zkLH6y#(W`IvN4-9G-i3Q9uBy6$Wq~Mp>o=2)ULNd=~fXSL^?XrM91XyCaO*z237;OYG9FI9GdNT7vjfp{S}F*L0fg3cdPNRq4`kPnLG^eSAW5>BMC$#a!( zeoP^uiF>ys+(vjVm}IKtyU~FYg2*w2RNs^6cpZvC1msCr?G3?W%W`^pOd&0aCoE!1 z3L{?38ndQWL|QOic~CxTp;@a^UBU>+IY)1Mu}&!MDrr5YPqH|23f2&&w;b@6JxtBU z9)qAg$IN(iMyn2%1g+)7*w+YE>=;vD`8?=IdCmbgm%P;~)eI+$p;iKG-OxpD&;~O& z#-iZ{ON-E`sd+h_8N`4YNdhp&pP-W^$8m>w=}<%p;?4yX+37C)sxkhgz>V}!O36KQ z<&OS=f`||i)<@IEh`SQe&4}f5t}t5`0cx$TN?4oZ;K+0V!ol9)0 zMi*lnV^*q@wV@`9f~9CgzvvU|BoRQ!9n!w*(Mmr(6N`>?YD5rKlo%y^Q+0@h2WD)dW%kW{LaRxRQd zg1H$}NJ7&Kxn4FDV?w6s9fZxo#K2S;R7gc5Y15QZh9LA@Pnm@eoyn*+h=W26mL$Ww zCkb}RlP-EUL_`c3vXOk# z1uh;fnA#Zk%jl7AZ4FTfC`1KP&+1l!F~V0G(Pf3?b1v{NRoDn-)CqiBD<)z###X`@ z5E3Orrxc~&#RfSoi4&)+QK$=SBQum;$eQF$8m9jsfTuT>A}Q!aM2$%njD&XO(EZUt zc#kS%B2G#k!jPPXfzJXnSHh&j6dlBOsJ$zvJOUpoO_u5R5dnjv?B+t z!ZFnpa)tec-GT%Qc2ILA6(Q++q85oV<_iXayj|{5qpU$F(p(*T$Re)ESP6V>;2fd! zv@TW+s!4-f%sDj+rJAZEQxzAV$W?fnI>rk3ZY0eIJP5>=AsBldx`S!N{I7n{k}cG> zN03kuH6&w9q#lWLOGJpWdw5jjR;Y?1-Q!BeoOB{za>_x_krL*Od26Eu+9r`h7qB*D zYa)0YNV5QsFzWr22~b~=p^^|7JK^{C1ji!FhLV|O%xZKDl9?_gU5O{!B_u^dK^W7z z4LSn{1*T=S%VajLAe48)IW##09lLd-)(at3A+~MOh*B-YSJhOZiz_3t7({L@wn&yW z1u2X;UNSw&dP~=clO$`^nAr&-EZZ2MC9=d^jIh4h4C5I}F8CQE^95^32BDmlWHM8B zSV=*f9W~ttaW0`#1J%?5Lf<55IeH7pa8?4>)`RHwT#`cvC(ax?i(Ep(MMyDUT8XAV z5~wP=Cpa#KWu4uki=dy1MpOFGa~l&KBVI)?;UWBk%8D?ado8`?=o7m%h_q)&a*-wl zo8nt%S2Nnr2Sqs*Gb%TLP2@SHm>CY*djzrUg+!cMfxa9RB-sLoR%HVKS_(78Rv|@a zcxjbkn8%E0TjgacL$$Kt@N$PMgV9v5YrZ8lsJTe?-eppftD&*#nY_&mC&RkdK?|Y6 zgh$)3x6#xF9hf~kMkMP~!QdK|&Xq_*S7h1yhmemFVT?&mOiuwp_@H;gz9P7zsAaQ} zB;SKZGsZW}85p@ig%lys8mNhoDMP)c))Vwu?XpE=&?`b$BBJhW6Czd^Njb!i`Y5Ap z6$bvGO#u~_-b3|!E2su|8jFb1Kn2Jagh8xkJZ+HS>t!#NV09%YH6mr%9T4=OcV0eK zAf%QE8~ZEU%zolnY*!Fs zB{L+R?QEc3S(U)1$2h1a$yHYfPKuO)2$$^ko-x%mJ0jSyF>i_>xuX{BI~4;@7$`%2 zxhi`Qv>62HMi}HH^qm+l11av|+>@lGMuBVwsn!Cupp)!zV749wB$jNIPO#v$yFoOK z9`nzc8Z;#gI>@3iGai0DV|ugfXW^)XJCn6&edw;12c;Eja88hmwJHsSQf(gI03hSnqqPRYniZ`tfWW^~EU*qW19N~Q=DcFE2a#V&ed(jc^T zkGViU=!#INI!}<_YDx&=ebG?)j{>R+WhD9Vtg9_bwl}y-iYm(<`Rt7AUl*!+?)*0g zs`~5A!u$S(^Ur<%!c)%=yXCJf!0zJHzw_jlfd0l9V9Q1` zD=s-X#HEnFR2!OZOd%P!@+S3=WJ$nuNdun>w7nx+1|>Y3M0PmA!53gF@@A(oXf4Lj(=4-z^;|&n5+&u_d($<*P5!e zlIc!&x87=mc-J(aU9WBs29pKh3S(B;_?$3+O`29vRr7M{^v-~$Z!*{M zndhFoFW1ot*HPPVxsJE+JHp+0`{qA<{@Ts=))1bbeE#z1uYUf6&tLoe2Q&P71Alz| z=G(KIe}D6*H{ZGWHa@xa={BV2uTLV(W}p7((_ei0;Y3pV><>PB8Na-bpASyadY)SD z{p-7X+z#e1&EY78dUvtR7lL@4fx~w^2awXKMAn;O+J`ikXAYR z)qMXl&n{e99sT5XF`M7pAOJmk^vl&%e63w7{a|+S;EByg+T;TL`SH(>-}&VA2u!inD<{FW+^Rv^;$y-H0R;=59Ff1JbG)kyJt4gM<+ht0jyjt=ZnRzd)xzXckv}YnBS=|zqrLsI$dEr zt%Yu!U5bs&%lg*5A%(zUz@TnMyDJ;)_>q{PzccHNlmB z_Qfl&Pyha#FJAfJ%h%rd@=xCQ_YePU3%B$vjQfc(dU|kdV3;oQx?>rip~mR7)%?Y6 ztR*h0(=}H<{@LvE^6H!yJCK&oZdC3-h)lbRKgGAiq{Xvd-PIP0z5BKL7TD=`>wLLd zUR(a#n;-wtuA6PaF7FO-o(9;_kC%6Q{BR2eb?0)}BQCqDbsB`Z<~N?eU{2=m@m=O` z0~mGjBncBk@#yakjy~KNjJx5Orw8o@UFsRwu9slt7xTpn`^&Y#JJ{7u8}zADHJzcG z`SR2hyg%Q~&wT&0HzuS1vS2KC*ZQ-+*v3=+<&VF7_vim{wS^S!-U*eg=+H$twYbWb>$3)M0|B2a?`?G>SF82BN4p9nA zf%Dbu)*`_*eB*G@_PDI%wz%|QeubZyeecqI5ABAwyt-T+%;x+1hbXaLKl!+L#=Uu& zo^t>2g%@~V)Z@V=D1*8@xPS|d_-MhZ#dE&v>J-lv%${75odT@Vs z;rw&A9~9r%>Oz5op6o>V{lZhv-}=I1(~~~^-P!Y^ou_N@4<458)?@l;^3~_&`xQfA zZ@z!9FCSfzt4}}AKBG<0mrcOe*5#>u>-}v|v^4W_Z%&g~zoqVOe|EdD#kvX6=rTQ~ zdao~dTILC3sD5{W4^DwdH>k81Un(b!&&O}RxTU1dQcMpoZ+6^qV}h*8V*hg4E24HE zo9)Zh_3p*%zi+9Dj_(}(w9NN;OB>K3uAUv;I8z#&nswXs+tZTZ-eBwLnIAv#(DSVe z=C_^c9bftzXL`~rcNET7a<@lso#AhHTp&d1GcP*9oqiCX{PkS&duQ=<&)tuwd+q^wy64V67*98N^8h^E6L;I> z>7IC=EnM!o`{QySf{J_c5znIHK6u#ufN}PjLG>9?^sc$TVf@bskY9&ucn==n<$Jk? zZIYJTTbL5BGBC~kN{nkZ4RG#7gH=xmj}$|m?~lpA!$$QEPJF|w&SsvxIL zT(UylvO@11^ES%}DOp=bP2M(@tg;iVVlbJ4>0!(Pa}xua-dod}C+&k5j;dqw%A%u2 zAyjkHQRprOch)7MxhPrk6y)&PAOMzW$`K}BlXIWmBuo+;&`YHTodb_~A&YirYi%nr zDx>5~Sx=>fEPJ@?s4eu?axa7d{6FknPwTG9QT;0JT#a;BSM{G|j5j6_k}xR5yBVsx zt8ie9VUmDkB?iH*8$s{`7(oJp|Fg?})Sdg7@8PL;xS4x@_s&d$6%$Pc!i4wt&hxxa zch{+N`sq3ayee+)`<5teobJ4}CY59fSootzu8eEpC4qJ3HUXMgWHTq?n`l>C;rp$V zJJ;LU!-tZ!+K`;p)yAQyWGY5H2Ewq_BRW6|`pat*PE+)Ec(#5k(TyA{3cgL3ACFTyqZ8Ojc zAVE?yUG|Gbd%GPh<|qQ$?$hF|)E+dFsz8JXIes$@Ou+EzQA-$=I_!;CQg>L{phO7s zDltfnmM_HR(ajavx91#Hl1qx5INF+`2*WnYU7c6MTDUdIOGNBUI-|^}iTAk%pC;Rp z%4YbLCtOb_T1BI;pM1M&@(6-~_#Qdc*tEvbEWSFV*R(jwR@#K}F% zz?jm<4QH90szPWG#pMB6#j&jBMYw?8)8cS;OEMlEm~bSgi8NToj`1qzTw7Y|50kRb{8%`A6Ql0)DE69$YBbT+_U zsY1h10sn50_h;k;<66;UrCx9@Z9SS7^ynS~D3dS>O|no0TLdo|Bg!Q0CJ6GZYKwPL($a0a9uw2DFF`)mBCC75Bu!S5o5KzlF9C%| zlta5i^G+^v;znabX6Nj!fMbPWYWOL}sp?8lMbjDt9f261q?%PPS3NA)ksV1v!_0eZ zc2zx>leq8>yLUWEnX5(t{JgWCI4gXH5=JhmF!uW826as(num-izih~oQG}0`kaLqD zKjz$kCDDz2G(m)%aPHH+EU9J{>-7u-dTA!i(7@5wzPFC?sw1hWAL*midZBbz)IETD z_W>w7TF+W7X|v!mW<xfWH1R>`@Ec=T~`Omg3tl}#Kygowh|Sd!H5 z?GW+{16C^N5JF{)az+D2#_VUgn_i3&AE{lpS3?da3j5KbJ=%sPd4l#z2>K2-&P_%|&>=aphKJfdm7u$*wF}}3g_m=a$RgYg%QjkSK}J{w{Q9YKmnPMA zd-U62V+Nr>uy0!z9It_0SnZPJ=I~y;wRp#dE#qB(HdcLwYV4;WGd7z8z_<%|c3(Ol zmf1oLG(oK9LAjDE_7To|LSQuf|`@lLYNm8Ri`-cQ71LoOUh zU+OD*##u|^+k)8!v4f@?0y+miG3hv1N^43xsYPeB8$$AkolIXg*c z(QdmE$M{dCwFS?C%a7f8jg{20U>2K=fxsP#D|S*FZMt^*Li$Z==JVK_$4_6*Q7?O- zO_32HAFFl0D`!qNlusC0E3_l1W7n=NdgxNO&Mm3U-RS^fXlb{2MOrWBdYwA-6ppvr zNq+Ajajng>N>ceBQecfuF8a_@2M{)5`vdENw_f6(iEkzz2pZM& zME?SgF2k1&AQ~(a0w(D&L&y3RSLn#tssNebN9!}!ph`&=z)-6G;gFn3EU^S9rNGYIlHbTyzCBTy-0^3dx5P& z+}BdW_}gNSBB_m=MDwO-6V|#f=#+bLOE5DUkGFV9uLpo9tC0Jgi^d8kdkBcBg#UTc zJBZ2n$06flPvXW2fMs=vPy?zoPU^76GUupLV{-z6sA^c|$8Isi9mH79O$>|HkoBF9 zA2JV{0qb+RhVOgMaIFvzSGNnGC4ycZioQpygfg=lK7@e?kKV!oHkvA8hDO~gG&LGS zC+*x@8TZkuWY-x$M%;lgMtfD@bJC`|g`uUebS;(W)_8+Hu28?_UdqYwdpc%YM~$}w zdqRM%Yj!p-h&xZ(pxE&?7C=%OYixAdDaFRYUE`dQCUx_QPFq;Q_trUx&gqA}jt*Ho z*pr+Mw>L5Bz;))OH1BR>j~zXr!)7>XQ@u`sWW*(*CiZoV&_Ou%z0I-Aa>VeF-nY^a zFL9tGS`OcSu9Z_CG(6`f`(WupM6B4tgHW-Gg-~}$im)`!xyeCVgp9<)gd2{;fynMy z$R*@=5|Oy3UO-MXHq`g+ec{^PHcgH`kvYR8lJCtLcRlq1Fjs3Im&9rd=Su|akLB6T` ziT-}Q;?!EoRXJ1Xc+&gbS%X8iPg|+be zIk<2>|LI*gpC`I-KL1pQ%#X(7C%CveR1<#xTi?|E9xm~@-+BiW=;=LP`xT%6gkSOO zTkn6-{wU#xK&pP~4|(>*FFb#i{$qZsA^*tu^o`!6@rL`YvfiTlf5DsdSD5=N%>B7y z?rUzPFU8N#$E`HM)3Zpl*gV`8q-a(DaP$CKGHPW7Tu|LB-KP6%*xzM z0zt{l$6M?vbvAr@lXm#Hh_*Pn!NV~bwT`lUt-By&%k`|CaE0P;zU$sl64D9l;5KqA ztqsZ%OH<~I^QAi5zEI2%nSEeVq9dZ8q#i$WokF7L#x6|l5PB9p&PP!hy(eudDD?M+ zo;+Nt8dh&u(yoJB-WGj6llH}U$x$k7zVw7EZM|AGI<9TkoYfVF8fiAID+X*BhOUuL zyIj0?$=R|({K=`&loV0u{jiGCFa7o>`m9R$tkV4D_E~+!Uh6mQ zy?4KDzy9tME0X<#@8a`!?Q36qYFHHpC%~*JxU@qVdju@q4lx0M{jmLg35jI`G>Oj<-dI>JYV`d)apxr z|Be0aPjgIq{z;BW&wo6@?GB>mOD{qYBX|G~e0@VyWI;fWv8 zi|@Z;f)pPfdt!d{<8Qu(1NOw`=*J(v{J@|26xewa>ev$lBYgPy&)k9h(5xz*HP|uo7#^+?hV)d+M9;=6?35%AAbE!-~9TU zuKB8a&`V3_{cpYD+pkyz{rJN--Ru=Npcfy0^YwN5AAb=yd&TtUzrO#yAN|>PfApvS z{E2oyzl3<7q|jd5?%5x`of9L$PbR<~Q6 z#;K;YkHxhmb%w3n)jRnpwtMOAP6(|%_o{oX={c&gir!h4_PuVa4pCwr4VxX4H1+1_ z---)ifw2+CS>`xodVH_F!-(Q08IMG{&4~sk{bCh&TfE9Hf?zQ_lGJgY#L23OTiH|F zxp7FV9=n~#;H1Nhge#k1$`6J0V;^P3JLqMT?aYyLWFyRlCMG4Ua@vaa@*dr^?_ez9 zI+Myh7MIR^SDDj?Vlq5VWiF?#Rg(_Rk@wQHH1krdVxSHXQbeu9;T_7^lOR_}b_Q(i zJ6A!xw~3io)^ef}HfMvd)?UqK^>r~!eP3bkaTHJk?{o59BkoLCwj!t2*s{GIhHRoU zn&%`{#}KY0o8}TgJYvOfr)xB${&FOppK5pvR=dEEN>Q=Y=Dr(v&yQBeS@uuJwu*d$ zDBsig%r>LcXIAhAKv>cl>B_p4@DvC6WR2-s8`f4m%SIAEX=74!8XkbK+gmBZL&EJ( zD(-obR@c@ zxA7@+A7ECPj9o7K%$hUtj2H}Hl&I^&s2P&h(A8rXQbx-`VO|ZS!Fo9@{8O3$B}X_* zo>nz$tCJVfNmN8oM~Z)Eldy6J@t%Y3@h-)*#0+y_Hc;lSf$z>DRUy~FHc^uEiPaaMNa9K^;$+(PkgOZZNgsO?!J z3horCaU}T}0eF|$h#reG%p)gIr7gsY2t-iMoPcL3U1XIldtu-nHdA8{^#e8GIZJq4 zuD1*TF%LzsZ zt*aHOg9jL0yf>#hqUIWEp0ivVrj3w37aT&zoU6~VAg~A$Pd6u>EM7!m94KJ-7gOM% zEer5((#jcGgnNZQ-P!ozcRLVek8r}hrLKtqOUm)9VPs;vYeEf4SykI226u$AYm&6> zvHI$=J1#=O$}O4VxiwU)ODAO(e?WgVx=$lC0}ub7QTskg^Q3b%7`^V z{j<7z8x*m6SPEo~s=KS@Q8G4~i5KkRSe94-LP#L7felfX1msATm6!$l@td8qj(~rI zb3V`5Gw;3e*rbe<*s?4=zvu7X@80e{bxwEHDP_fA)SaAsZB_>%Ei|STX`QYx0<4d_ zcSsa9r`ohp<`68rB$&xT`cOo!8Ab~ddvtP@+d?#4Nn@#r?oV^;s^Ab{->10Qq~+8l z_3fBGUbRu!0se2h-5x)4|an}Y>2bi43RK<-*<7C1I z1`L#^O6*`-#>CE=3j#0A&z*wS#$9+m)36jv<8cjM;28T%G0RSA$=0>8d~b3aXKdPa z>{-gicLZbQzLo=v^>7mK#kc-=O^_-?9uD<)&J=7k7p))6FBPY!rVxuvxfv`g2Da(?_6c970 z$nDgOfNdab=6I6QYq_O96FX`EYe1C0)VVvMP8^(t!rjTGDPCQXB{!z;1_=M=qqD^-b?QNXumy ziZyy#y|o2lww*E$Ah$4Q6Zb6ygdad)AY@oA>{c+GPPqYNSQc~;zVy#JJS$36mLYbF zK2Vm|%$ACr7^aZ+LhA`;P97wAz_aOMbfwlOp2@Cng}%~V_s8g}Y~1Tn9;2eUvFgc%QHP9h1swYE~b*`fWX(Rn%X6$aBh zmJcDXJJJwWdyXv^<>p%*CN0E0V{!8SlblK!HN=52!22l`(JbdZEmJJ}>{vh;?^Wnw z3sMf?6;Y_nD03anU7h^1v>yQz+dvToivdw?QNZ`go>b&MH(9Bs-oW!AA!nH!e+1+c zFMU>=x?5q8GdQ^>(7g%fzss^-w?c8?Ejoo?jYjxwTUz0EKICN1HV-p`04+|NZYA|j z2hg)tIJG5GJv)8wIAuAVazjXz!OlsbMrVK@$5VQ#0fZlbv%GwP*jc45@W>I`YM|Xr zK>&pXY3W{O`x)x^L)KY*+IU~=HzbhyJXu?F)yZRguVTau zRtz?TCz=ZjzuQsVZtc@7B&W_7>}6FUS(TQkh*QQ)iqYAkplEX12(`f!kO4&mh@X34 zu|Qe06x#{YtILAv3<(e{eUA=ucTVQ|#L%QNms8#ONxd+Mu_QK@G=UOomk-7$pvdYOs5cJwPaUZaEz7Bfja{lr<5ks4$YTaQdtBNKKuCLS zC^Ad)gqWcDYOF=r+Iof+)&x)YDx1+!`i9Qb~&&} zGIyFXldZ9~O7coQk76q_Uk^%PMCF!7j$te9bf;5mc3HMsEXEAJKBa10QnIWAXF}LfF+EqN^w2vkGPe#WBc?#i6<%gT^ce%a zX+!kd*8-0zqM(f@q+Eh(_i1yM{hk)rE|#hAD<83)Qws7f1lrf z^zHAyV6^jsFA|L_p8V+g7f;@~e((BcH%wL@|J~!CfAsd_Up)SgkKTR!-ba7)_?I_q zQ6_GrZ@h6|f1rFvzkhFj@+_bH=PkdJ`wt)7|IZJ$uGepQoA6_gzJLGTYd?H*-M?jW z^7OB-^UvSE?YzW4zj@o0guj04-k<0X-l8|j|C`a04~XMJK8KeV2alH+EnRr+T~13^ z&pRnWS3dW*KbQ|*<)n1=c}_}KU(iVjAo|6elq7rsC#C1E_M(&0t9_KNUgo28^$H)Q ztC#pF{qdU*fB3pReB(@yY%qECzrT?=hwU8y!5xfe&?Tm z{mxHlzVyzIZkaDV{mc#brDwmr3+EmIb#FS&efo(9cfOi8?tJGrOqiYy_MhMJ|313q z!}RnLw~UxxoOahgzjysl&rQ6a-EwGpdea*gO;5+-(VbuW(VY)|%cbeFZ}Q}?u0MG4 z4=;X`_ixxY{m(ys_}}mT{eS(-Pe0eb>32C?`1v$}xrYYjiGLukE#;ADDO*YJeNH0- z)3XW_DD1Q%G0a?ToD!;qTAeanLxFgccBw>fv$Qf;@po1$#w`^mpQafm{d(eJ+redf zj}F_qP^-+x)dml$Izq)FyBUsB!X!DWPu`!=vi`ivI zK={wX42a6K6Q`Y_IBO4V3`6| zNpn>eW<_I)R;)hjghtN09L%jqn>-o#G05qy=$Jb>^-XQ9a~pVelez(yrMEF^30Y~n z?h~dGa|=sOO#JKnup%~vLwlf@*oD~VCQM%JJD0rYj^PAtsf-r-ruURn5otOaEwD_1 z&h14KvzF`Lxv_(nlO-RkuqLjySq54Nk6vwNnIKoCB$*Yf52Ia6o^$Qh zCtLXW++-xFy=4a8oG^pO4wq=vb`QzP6DThe#B`Z$)eVF^)@F@n>_V5-$!ZKhSQiT~ zH@?0o?bdbF)WC`mj-5)%N)DOWl~$I`UX7yx9JRCiYaU+iMuq)Ffy7lZJ<+xO~poKbb>ZmhoAk_GD$JOV-f=x9lU_z>ydhZwKI@HvdU9K zD=p(LAlyrxM36urT8HW}!#q~)t)?Dz*Aw>2P9jJKP-PJ#dl^I7-$rU$gJq1EWS^I2RrNd+@yDq-h**p^hiZ~mwf4wybc75lkILBSPgx50Ez9v zBab5NZ@cT1l$?^V8z7#fE;nFtIkHC|Aun)90SR+zEZwYNSp=@W3357F8v#a)2a2bh z;6u29z+-?9X;b-4J#kJIpEOk;MsiOG^!@PfdxX})}J0jzOURj_P$*F-($7n;6;&QE>rGv(`8=6#uT8q=GfJDNMI{~K_l-9(6oB_}W zdz|KFE(nPLf*Qeodulc-jbx!CA%j7`Mss>ymO8#WP5&ms`mm;vTN0{c)#`Q=#KX`g zw^-P{m?qxr#f*U|)obSt(mKYKa9wR{&TuJy&l%IVvfq#ob`1!|nIzPa*}=FfqEYB zmj#>j)yJTu4WOh4$!bxnldY9Sny%8KX9e&%PE8d(6t=7&^B&WB{-A*jW8Zp-(hzCMrb@DUYIc+9A zmK76T9VBV#x{k(>Ao85#+$LMe2!Ur9G|I&ZS+LY)hXe}a=^b z>alavw(7|N+Q9$-ppY^!74Xw?I%Pj|+dgwDWeNgVU*pJ3$FN}fbSiK^TP#8xGBFtF zIQG#RrO&M05R&z)u}}goHiX?#Ru`t#BW#A8du~M!7`c<>dH@Rp41-c&#^FVt!V3Nl zRHLPylX*O7a6p8qr>z*VR@llkgr0hhY(V65lfK%(z|Yuq3(Zk!qOl+*c8J9*xgG(l zth9BuCbO`_)@VJ$wDI1Z_CZD{L}WxQIZZ`6n;s;d(t?d){`t&l=AfT~d*oFBHMDB! z6Pyf^7|-N$CV0-2lltx@WOmpdSdzA4L1<2=uJYCRH02290!5iOW(N2TW->ayd-_n)1?Bv1ky1#A!1j4q;(J2f#Hg zlg?)K#2GKgcPBe_h{`PhSLy@`?1*^>&5G%^!Ih00ay~cd>$v9R<>@rHD4X8GdMQ0w`;ZENv^&i*5rM zsIodJjSuo8v_KWF!(f87&mR+cEH|sW(>jq$Po36kONyY+v&huiq%FnSarzK)LByhU zCf-?VYuCDi(4DhDH4Eah&klI*Gq%%36f3;2YRe`V4SpDybWS$`Z2?)~5roM~X~Y1; z&%3mSQF1bwY&_dC6Y!%w8YqSdgdaV?0sYfyGXdgj58D&EK0$dyT!0y!Zn@Bu&&hv= z7THi?dv{E*z|LdfF$js5vs;J@r=7ictOgp&OBtBWp@u{Ma^mrHii|oSAvLyv_ol3S z(*=pavtFCZ5`!h~9XgmeMrTSpk+KH#AP)f3t`hIZpVgvd!^KgCE$p*Y{5O2Bk zmoyneKk4o;E{?!HtaazOrq+bzvL?@0l*jdWu+lH@&*vsJ1TMtNPL?*JvGEOP7*H4y z(y8YHaAZ=1Ygk3*LQnz5LxdeLq8**`TG%jRGy&-vfZY@E7)xcIX?Tmxsfoabl$awx zpEBty<9!uLb*5c6y_B3b-3sg3TgWNq&^KG3tkn=$R+Q@H!V3b?R*6w&Z&a!k(YHl0 zW1N}Mhj$%}1oK+{m%VFiva7hxf8|u(UDfwq{U|P`lmbQ`Nl@aguW-a+Ce~;~nJ0rG zaVTHPamrL-KZIP$frKEyCR|GJFsLd|!{|*s6YRf{Z=KO)&e4oU@+>(nPzfZ>Ia}Sk zSNHnXxAyM-RwUjQ0(f_kiUO$E8ZD#nJ-IT2nPg)oEIJ z^qZs8^x(?r$4{-E5o_<;C9bmiu$&gkw^UeVKh39=NAFtmY2lw7Rr6`(p6f9I6c5#7 zx;dnMZsXzWf=qXHCwDc>o6=U_0MV!WICmfC{$FwKn<*g0W!4K92Z&(t78$%5VOV7e zS+^B>rOKOUdbUMbPvp#?s5NWUBc;!^N$n&Lm1|~>+PoG1LrHP4P7Zz96 z3fY4jTvEf0sTD)_y1@f&|Pk}VQi*^bTo8Nj0 zopj}TjLL;*m2)*&W1Ol(RhTW|Z!91mI;eCmP(7Cc<a&tCL2a=vo$*<7iMjBuM&$Je2}s@Ke#-((&Pj-HH<<%=c-1z_>yvINO0^fduYu?-W@XF7ZL<1k@=TVarv(0nU zwOld4Jewffd0>6E_4b8nUeXeLY;FCS^|h@x&aJn#t+yu|=eOQCfBo9Nq%inUUz>b) z*3YfYO`m6da+15k)zf*y3&MlfZeY)qH!fvi(nUGKf7kfiK1d?`^-c{q8Nwg$w=8Z?I3+$IY8u z5Hw_4we@|Cb?xc}Awhh~A5Tu?+1br=`I!rw8-0fLHCdfbpIw$e+-+iQ^4$8`^x3?& zF;`@rT)>K&t}lrqZv8#m@oyIH{Kj4MC8@-d^C>z$!=z0&rduE5zMq+_WxhI3FZ3n- z#3yb{`_p>|{>1e18~yr-@sA%mclpzNAz$nA?6Sh^sjUx6S?kZe(9cgdw%&aD^1C7T#;*Vq4W@fUx1?dMJ*y|gU zhw|pr(|jHf^7(6%C-Q9L{13|KuPrM+uFpRI4>r^M`u4)w=P%aj+0EVSmn9${{m${d z9{IuxXZePvlk<7@oq4}!m*pXEbLY#Nk?fLV?vfj4cdy=9aLENJ$tS0MhKu0p>(6&A z;>#~@oPU0Oe)03u>5{_a{;rYt;K-u#Bw+0V!`k;ZmnL>|cD<3y|FYW({<}60(`BW~ z17YyWPv+nJezNn+xn$~GE&0k1Sve9Y_~|W>xF~12d(US#p53}Md2TP_U7B2egZ*hq z>GFyG`A_$FN4v#478Eca+xoY)r+4S8!xiRJfO)ww35&v*>vKa*w*GGY*~#hI=EiJu z@=(7pgJ<0;mU$7TxQG#6Gsl%*Etms=;2-CDnu~D(SG{-TS8Rj@CCwYI^2eWj^7W73 z{NpFT``?dWpS#VXu;zj~_2N=I_ou@6$9E0m`1tzQA8o&j*8Xehg4MoD0}clF)vY(@ zmwbP--vyc;45h&G2cDUKv#e2j9X$?&iDgyToA_~U7_6ziaLM!_aG2dSoZQy!^OD<_ zT`+*Fu&EZlT6E_B`SoGWd}m(wXHx~2*;G4MXBBEF9i$4b4-f@kd33KTxYCQN;OmE} zg0I|86@29mRl)b%!y&5RbO);7dsQKo|VvI;QDvM8WCK zMZxzb4Y$gIA57;D;Oz%c^!>T`L3q6Y!OIHZ`(oz9$z=iX+Y-fFB*3o&`VxvCKM0feXLI}0w*7(nARczTiDd=wL)lSYR{P$c z?A(^s+{$1M<|BJ)$Zf^FzlFg-O7mN@5-TfsWfwVU8W&TS>7=)63+wmPoVXY3a?ULWf{D7&3vo3}uG%?^o42-`X1^YxmVnO^0t!cF;qS(DI}53$0A!aEZycT=AwEN6OoUGd?F#iWaD8i z@>saTj95cVy${T~FRD~0cZQf!q|E2;YBPyyZJ`({K1c0^PTu;aU>+A#t);@*TX8M% zLEjPyJ|lEc+4;cL-;GX@4=cjmS&G|YeA!D0i(_eJK)uQ^Rkxi_$H7y4)NN=tWG3D! zn1>N@RO5Bza+V3*nws)R!^#}TvTi6KqgOpsGuBv+D42EaRqi9n9AdJ*)#SS82%f60 zm~uFZ9dTq7a+0>KD`Z?) z4nm#y+ImW@1}X)MIg>&d$tJpBNXSoY@`xYKBJM^9Pw6W19@pNhQAU%@aV%R@E~SAA z#n8bfMprBv#rl(lbs~lK((2e-(bcf9v_l82HLL(l+Jb}0OuSP7Lvn+ZVO`!{j6$!* zhtOOZMMf?H$e4@sEI-!J=~nrgG5#%6(CLh9wQ zg9g=V5_`E#xd8fAN!c17X$Z~9Xx>ue+BzA$1wk>JVjUPoPAv-Qw|UrS5I8D=Zi&h! z1~U*y0>v9z3w7d(gJ&2_4Y`ti489HvF4PgrnimoZa%El!Arxvock;vs+?=5n=mPn}F_)U#DVYGXTs3Gf|66{%2Uzvly`IV3ED(S+2?i9&BI>R*QU z0c*HV1KSm*H3?mpNT710$dicc}NQs$?l zM;97N3!$iibz73tDb>01&2FCRjL`1+z|wOHkpp2Dv=M_DTroEoK2RQnMB)Mx-kv#{ z`|fLmvyczDBSKPZLr5Jk1ZNyf)X3GyLVAGr>~b$1i>w$SMfsdvML#UTj6~a4lU*^r zsiuQQ$d~D)cAF_91RJa+LXy&p4bEFG?UbAhO^slqa76Hw;KA`+&Bd@1Wf;LmBcul! zO|S5dmg=aWk2<$#n{|wsY%U>f{HBL#-8c*b&JtM_&{EJkaGV!!>HnOaz-kyt3Z z_MnKB%ST{LcCHGQj%WQ^+dR?|Wz2}=EX*}p$;!9vWmXpz$HMhSwGnIMb(~=~hn!Bc zj-HUpf6FXc-a+Zm>SztQFe0LcCvq_=8SF}?aN1_A0&mgT>spC`EU_pL79%8U=wKJ- z!>pax0a-DaX87?$W6u}r#Cv{xlZ$2f9$VlZD(4nh^B?Xn6SPu_1!&S>E*}$8In9e1 zZZc9tiZ3Ph?v1jJwVDb6fqh`%S=+IKt0N~98M6URP1=MSLbkE!5WrWQ%>Yc+3z6vr zL7wZMfHzPF#9+=Fm}JpDBDw1_3^IdlCB&s1JFlgL30NcIvNQsH<0b>p{vnIOFVmv4OEe63*{#Tximk~grj8EV#T01CDlmd zje}PTb&`iK7=sx)8k-{7UZ_w<4_sSIrjy2$4he)#)eR7>oD8h6pg0_4 zWG?HWk*g>$J2qP3T)qj3y(8iVPnh!J;4Ty3-1o{T6#fmUlSU4{W9qR_NE2WVv@L|%HYjqevbt;w2FVbXS zrFj~)B!s67x91YM$bu22=}T3zygiI++JqlTXs|jza`bC z7=-vhA@G|t=bcqXXe2EtSDOWCXw@a75VwH9pu|NZlayIq$gPlomZZRbI}6NJ7hD?- zY?2UIgw84FN-2bd0PHM9em-mv-4SMrNl8e~u7i*E&X0nTadmA>0{<#pT}x5SLIuJA zgt|qq6|*7CJZpSfqX?w6>ZoL%3wPj0aiH~Ddn#OMvLMLo9u?9faxwrplv9ceDY2&@ zNv+ky;5FQni-8K&79LsUky-k}m_pfk?ZJ(aktU>!Itm?7$6Ce2N6*UZNa$Qb+%+b^ z@mXc|7GZ1|MR|)X-uC25Er4a~I9~<*<2v9b8llw7dUy-gGZvU4Y5-=I6E0OL1hwXb zI>`u#G1NXnPC-X>)IC@$l8a)!RDIJ(o)oalRFBjs2e7c7Q;ma~4MLQXpKv?Fg)W`* z2we^9L1iS~(R9}OmU#fy0Q4!Rh_DElgh#gK2mGj+kiC-uvjFR3G}d#CX{1CMEC#`) z;%6>yE%cNvwOkN*E9gBnQ2WYn3A7vFNLi}h15;s*1!iLdnvqYcIMp~xVj%cICck5q z=dNvaI`xEsup%}VF#<9x4GZOWIrb8{^cj{wWEJC~su`h^wJatgLyq~CR`K20LSSSm z4NfXbqT!j&3Uv}dz+o`5W+03uQ)?}S1(-(ySr*c;Maa*}>Y7=4+15~vuQ4)EHamo5 znE7oi*hvF^gZ>XRqTusl33o3No?K z5@y7>7zP!uxH32}xyuX;^vh;0^FbhdBkAnHo?NfC=ZGXjXm??afk+oihU?dN*HuNb zhXH{G3?ViHjLcjK3E3VPxo^%`1m)2H%L5cmYP(!w%^Tjt(uV@=@4V}iz;QSQC^D2u z*EZt((LKl*q9phPuVqg2y)8oq%8be!EBzP_OSti~{DRc1jRazrjZk@q<`V_7&2(kq zjfJW)E|sPXCPqkR*jde+7rD%3%5Iddt3}w4WCPdSl$m%pu$(Nc)H6jwX6(RSof}|F z2ryEwZ9|G6m0huX8?rrw7h5S*kJV7g%1pd3EeE&>8A38aFp%bFFQJ9#OP3l67m@1G z<}$c;D+{<`Wg)K2ckM)>%GPF>8e2yDAWJ?Wd(|;!Ymta+FI99p@WyDQUZ6xldCeu$ zfy&mzQW2GJNb=C>d$6*jElU7$>0g=(sLha?mGQHg$!hVqnb)RflcS=*m+L59fjv-eXV+ z={LMn2?ebJuE({@K_~D>;HRI2sj0~NxIVko!)fFuad3G8r1#N8_zDP2v?+Gqh29jg zzw@piYG6cGA<+XP8X1$k9Co9E4T@m5^Pw7unUxQ=se(j!&Sg< zGlBP$c2}(CGQRhs@&fWaXW%BvX1{x2MJwd1yotwK@QtHZURXVLzw*LC?cG--|5KYg z{=l)LiE`bSH{Z96!|JiSF5|H9Pwu{q!#pYG-{#DKwaIi14ZyETHb?~9qD4M@p7ZSP%>HM0=Qop9 zzQafyhfCs}N5_ncIHd?V3WU&aQXzP>yg}4jMmNk(Q%0TF8rselyvv+@=%58LlsTZM ze#ie=(S<%c={$aPJr_+E8*G`BpwVlxx+YQ#zE0Xv7s1WQiMO>EJgC}XDh69H zl2vyO#$`|LFcV z?*GI6Z{E9o|67WW{{E6D{e$~|e}$pnA>S5AoMuYyiz&8Gn2H(enKlFN{78(F`|v(eV*?4*6(z zZyi8)$gl419ldh=)g`nlkc2-c=9p+s_@a7cM-MxO3D<5uvM?ZK?-e2tDqU%t{N37)N zb(Y@ah*LR!yC1)O`l0&`JpK6X<>Oa4doLZ-J#JU8FP^`8{F8m&?N{L*u8xNcX*`#Y z-`!hBpPs!Jt~n!?p0>u`I+<_z-NnnV9)ECiTvuB3?&8mmKX~=}@mq&Se02QQU#~Iy zUgm3+_xsV_@h8Xc-5h&;iHcsfz&{m{duMM6 zd_8^4XYbtn?Dehm*RLHu_wYquIU7~WH(g?05BYyS)}CEK3O=}M?`*)1S57-<_xPPP z&fp6NhxGh$Kx5PeLJIxg-i1 zg8p(S5b20kuReX&XbY1%=;J3@#pBs zmzbfSk&&Mc8QB=l)w1n@mBy;MESZ7{xyIt{oU^7Tq}avgY@XHuUu)t_DM-v@88=F$f8#nQB64l*B z#UK#el~fL0^JGe7O)2e!o}V+ibT>sxl#wcIr03Qu*&ZX4GdWJ;5V<0h4EHEO^B3}9 zJWP{6N>jY|q>gV2)bQ1eUaRI@7POHGN~>?w@}xHzL{xk!DVnMTX+Na(5Til>Wm2lO z8|dwbe*>eDYRhaWig8(y1$h$s#EsZ>W5xRjODyOg_%RIWRy23XO+x*`ue8YM zhQ+thY7lQRzf4L~Q%*6J4liY3l|9wcq$oYl#RUH~=}r7d-3LXWXX)sEDw;}CNTCjP z5=zSln^T2Y(PQ7#`>0|vd?cJ0qmw4R2^`{R+!-^Z(z6=okYsyr(bBTusp*O^prz`9eTLtf-i1Tjy+|Yn!bRu&=Xb3-Ud>V ztM593=j=XHfpce{#Z{ov`g-j4z)A~ zVXv60B|(d%)DCqFSLxsjCLytdNy63$GO zmjl`-YL$=_a)iHcxU)^hvGVuFEXFh3i8RF^L(h3Fb)gVj1Lx?BpTt5(U&9C)^LaDT z!}Jvk=dB^;fWDbT5Qo5u2_D!hc3C=HqX>d*NS8`s5)BS^9!6?qSf2yt6;efs=_Hw0 zElo=23<9-f2V#Ygn*y~gCKE_wKOExjNrzgZ!+^3xRug-2lb#~tYfT&{k~pdCMf4Gq z6%;BycZ!*_m4xVy6|IG_JPC>InVMJSOD3SJ5ka;TBBqs47(bXqpMlLaIQD>EMq{8>c6!#BEZ$q%bwD1oT2h#}y;D9%y!2z?Diwq}QOZB_|=Xuzz?EXqWm z(_D!ZC7OE1gj?P47O}4#R&i$|gfwS#CF*H-E!i-%E?3k8c~T1_zE||~q&Gq6Zd^)^ zidY2nB1OTtwqzTPOv>C(J*K3^#mW+Mp(9!bF_G&_8tasY-~-p?qMaCos0M0PDy(ue z=kVZ3b%8QPbZ^TFmcgTZ0^;932|fYqK-7pyP>Xm(K~&OdxeQrH8IuGz zl&LegXV6M!(uZ>{7=cQygz0w@61&2gC<2JJ)F&dxjM*xCquQ7uTjva63@j?eb;Ldh z76Y6~vwGfMvs475dCo(`N%2e41m<<4IDcCiibA5+Wt`I|P2)omRssb~QMYSqBj=it z7-iC=)!HZy!MpZ6DJrpg%v$1dgq5~738UdKSJAMrj*z|2u0w1i;)Wioh{EQ)NvG5i z2nmAS3XP3f3lSu|z13QMvla`wU`B+wM}+aIB0e!}4Tc`&3lnGwB_2L?gpYoXF^Wb!rYH zB+v4gtzl4m+?GZz42R>`#u&#Cb}}jE9z6-Pgdp~EnHtP821H?_AYA1(skw$A;OYWf zgy+gsv$sR{2$CkP4a{OsgZQeLM9j)@K+kwxS&u6Bt**S3G--duw5rhUh@Q`AyM`dF zKm(Kp?QGqo4FlWY#&o)LWkAegW`iadLQt;dO(&^-I|3Dtk(?3K!@sqtN1PBcd3d`x ziO}al2raV^JhRWivC`hzlu!^aL1NB%NT!VFI1Bo_$1Wyny7)-YoFT_aH3eKR3Gt9I z5gyIBfO%Q-c`YIgt0$)>?bo~IW|T9ck{MA&gW6P(d}G@t$yl$OY3yMpL-T}dq=aeH zR&v4FG6^}SbzfapR5{EakvL|zo-MVkS=V6_SK2e2BwSdD2q@4C(C6IaFe6LweG;_T z3&VY=|B?pFHhU6v za8F^pj){tiX4c7r7M*^2I2PL>nrrZhTXT9mh!Bm<+4E{0k)xxoTilTUMzltp(UMLB zo^#SJw~QRqfb&Y2e+x%DoTt$!>&Xf`N01}va(%EyT}hDyF?QpNX4q%0c9M*ZDMO~D z2=yv5JRE&xjD^BlM1Up%a&|8;^HwGLVzR-lw8 zJp_XY4l6t3dmFC8e?i82n2lJPv=EvNB(Os`B!zljQj(!3srOj5+Rvo&mL3ku7KcDz zOHRT-n0nIqVq~I8r*MlIQH<#h9~|$Har=@IRY#!76qu_O za17c{zBKW5=Na*J+x?!g`hMHn{ej~3HbPo=esf6c&TL5QW$>k6eff8VU%K;u@j))b zt$hkja``u1A*nvSXKcr`#`v7I&w29<)B5Fa_ssSGp1b}HWYshK`TrrS{^{<~^@GD( zFCJX~ZIEh@cIm1v#Utj_UpVzn#`Vl64N z@|yb~O+_KA366{yG$LR~rg)oNo0Mi@EhXnn*33HNj2Vcj5WFX=DYdh9>2>L!>d3~h zBaetGAQ~}}99m1ah~_Ln1=koss5nG&diW=6s-TS>v3n?!j>V>;5wFB%ydGrfX0&3w zxDle}RL@xr&WYWSeQSxWa%d&9OSw)us+_wYT1_$zO#}CMjVi@jlZww(CRHpi zA^7MswFGO_6OzMZ8YYci%BYi$kJs)!v+=iFimo=A2&sCuE` zx#T9PX3gm8lU5!Zi5TZwYaEMi{yNyq&~v^vH|r;rs@LNTR?zJ!pucU=(=xhT?`-$Q zPFfox)8HPx)EG@Dcrn5_=qWqaihq+rTH&&_8Nq{7DX+X zEOT?A_*lb;o#BydHQ8=Ot?q0^t?v9`pjQ9*#Xot5THU=gYV~VJ2YbBO;ls*ZadEpV z9Jf{4-9O)X?d0~I*H1pi*B_mHa_7yHPtU>Y9^PrJbDmDW&+CY$)9)Xwlad}@zXa8- zex^tA?d-BeyNUsTF5bOXl%U16pVeslL|v43!VaUDPS%Nt|t>reDA&mUa7cCi0<1Fd&;!TYza9UP8Dz4746 zm(Wj3gL`=OLz?4*C!8AgVxO-Ke4uNL{_Bey`=_7#E6UJ%M$kJ)(6h9Kp!e06pMcQY zc>+Rj^%vI}di5fP-p-RKc{`V-Ni>6W=}g`Tw$aHobNn#~J=B_Xk)(e|PmVfU_`=Tm%xF zMRrx))d*#h5_l;G$;uR^d;tl(2o%8CM6dzdh!L4F1VfgnEEsLC$Q`vNY$*RCZyix2 z&$)9*I%*{dOn@Jk=M1N3rn{@&>gjsw8CLO-l=t}K?Mv7+p@*ov-N$->%KPHeJHI$P zfX0LuIRgPZ@l`}1!fy!pW)EAP>N+DGL*Y3Pr5j6GD|4@6pGvZy){o_PGyOd57cf+V;cSN98^Kc)RJd?Yq7H^dWx;%ClcT`oVAB zdG7@-?`y*4*`A*?noGXt!Z}q=kP#H?bV(NB^1KjF%Y8@0H^yjGYV-yTsll>u*EEuX zwh*#mRmwoD6q?6hDTZLUm^JaA%bcjXk-JzTgE&rOW-AdJL}?MI$r)-4@t+@(TDHuR zVNft3pN8NjZ_Ny%7;af ztao8@s<>!`I^xv0+tQjb5QdboX2r+%P^1~u z#(TEfI%K=dl4WH?%bQxW3p+TN->H4H-V$dv$dOuY>pW{(#8(KxfJuxA=tmsfVz%5I z+mRgw)?g9IZkLbVt8Jcg*^S~g;&xK>JZfEpU$rXFE|YDX>upXayEIZ2$=*v{gfNVe zQj9%}5HZ`?vhG_~g_Z2tk3}0lBV%$KXKGf?Mz53_@#Ly&hH4s%_-_)$Qn|I078P$i zog@v~B2ek8n0!jpJfSlxCPj8I@d^(ds7tSHjgLM`~wSW33^?S>S`iB5GQkXhw=}9CZ%M^iT{jNJbV|<~1Fkl8})Oh*FV+ zu@$(J3k9y;>8g2x?lv4yg0mtw6Ld?r`$(ZhH3zV!k;dqfF$c6sO;gEFMLShVU05aV za_kLruBDV?Hh`grnIs3J>6D$UneiD{8;VYaoa+&?SZi&<8m+3{s+5QfvxRf^jI(D* zhlJh;PT+bq7>IMti%G8&PQGC(+6GBejl&VN9?VNfyyl%@u~D0#?rhWN&;ZfMgn5$_ z1Vvqh(kVEny)kSI;TWOpC*p@Zr%^>6#Wj&uQ3%p01yis4rWjmsU^Lte38R4)(V!r* z*&`$|xK$^MwJ?z38)Jp?Zfi_^Ma)>d(Sj4MJ2u;cudeuB4I1tjB@%?_VGyf{ElX1f z4rT=^3DK7U&Xy6nf+>cYJpv$DE@-4q-5DR%>RhgAL}4KftbjS0y%xk;#wX@XmTuM8 zOh)Lq;*t?4ASED-n!Pb>H4pT=%X1N^$#^+x=?R=*cT2F0{@J~~-cyoADG_AZm2kCW zXg+AKj0npxB=|>bbIm*= z5@WGwcugZ}X*H=cVz?#(p@ML`<(cv*F7hIv+02n3QoH1i=oGhAOhFEaV;W^q31-{` zS-N9H{D8oO;1>}CHyCEBt}M#CXqHu9EVDIPgasEeXR5R0A{k7+93MWGeMxFAu)OvV8gkF)-_nlDg(jguFB*=x!Uw!}(~FzM8bxIahHs!l*uU z$j3IIRB;;yXu?>=fNo_`5VQl&B!{@&NFbv@1!Ls;9ELNP#+o6Fum@_Tl?tb>@GR3A zacn@VVknPAaeUW2Qs{9aax8Er1yOc}<$|GyfmuWZL06AF$?A4c-X)De7I!oi?CutU z|Ayy=vD$j5Fo&^?)CM|Vnq^n73LR`$VKXpOokrQmjYKn!slf|ZUBv4d(AUY(>NQJL zIFMrKG-74kEg~K8RsnKYvcpv5DFI4S)=Wl)^6^Au zDfH9%KD>nzS@2^Hagh~L?q#B_dBhCuaj8v(lMf|*GwJscNW+Fp}rx`8E(+u}%D;JAq zr+1A8V-z<-vw91P2m_+z8b(=#8ze)Q!2=6Nf@yXDUO=J0@Gxz5D@qf!&-Asxvl1DZ ztFR1%8bShM%9d^cay8|&D4_-RIpqxVKdkIgbg(!*62?Y>HeXd($<0PwEV{S!^9WBm zc^G86dben`)!xmg5e-aWoGG%EU8{SOy;dlwH6t4F{Vaqzl8RMysjdmtCSFEx6#{+H zTK+7>pq6nsJg~@#)iQu)3-F`aAYm=?Hb}wLF@~2A7A?A2iMAR8LW>-{ zP&adCWsh7a4i;|FT7K?KhWIbZ)>|!I#zJupU7hwtM3sW*lv`15UJ!cK68)H=NFb{W zNsC?>Sbe@BFgB25t!2qECJDts;CN@yU~DmJkz+mh#S-3-{E~?N7t!3q-ZSxwua3(}_d4`VpE<*8f zs^?00Rv&G*t^>PVp!O+39GT(AMFgsvuUoU_Ac~DnJNKup?=GDI-MZK_dFYMfJO^SLnfBtVs zQ45$&KDcDjmfvLy)d>+d>)P?MIGwJ>Lj}+((;IXxWpqaDh?KMNnIxm zguew*owi)FOKlEUYs`zbt0RmK2gWWU)ah065R18y_r53*ke_mrKuBk?j389r^1lJm?M=Xz!dlk={ z)3D`%%CUut_$S!*77Z5Jw@zzT3wp5P#k~afqc^U3D7R`Dt)Mk53blG`sqPAYB6gqX zeoDhOoJ@p}G3G_vK``NK$f-mOD(SW#z$(x22*b+wtXbk7wg*VN5CX+m#5WbPlA|+t z@8hD>&7rd^IvmmApfQWxmehoY7+nf}(QEEnnr-v63Sru(22xCQdnr_kDA%K;qtm0L zqto9F($Sy(;U686j{bkKi(dKGR{$5?|H=JZpZ(2ee|7)IpZ(p*{r3zIa)O`Vy8jFO z{_$sTUtomX``*2qcW>W)|LzATcmL7o3HNT^yK(Qv-Jjq65WhbLn^AA6L>-^UF?em`* zUF2kk7@}X>gvgN z(M^|LJLHsHyqt_dOm2X{s zX`{s}PwnnQ-pa=JPcl>fm_K>z?E0U-w)M33P%M7{X+H2^FC2O2hX-_)S4_iiKK=t* z%VP`h(zXTI$G7Yr8?4St)&sD{{5f)`t6_Z#@1i{ z*@cV3hnKG$N51_42Igm9AdQZhoo}3+|LXjfeR=)?etPfxmL2&^{D<@R&p*JC|Aym! zc>#%Ze2VQ^sV|3tp6uDH=P_5`xOnnow(0oA%tHh7#dJF|#SZ4vr7!2x!6dr$?0JSk z&DXas=<4Mcn79j=xZsXp;$HstaZKFr$<=4k-cFxJdpmtz+S^kO+@rm<@;tP+(<8LE zQsXmuZ>Pt2Z>P`Ty*=?9_knM(yoP>yN%;%{^y+nTiX(A(@<^7s7=XqL?>;EqfJG$t$z-gZVwMVDp@wA$+jLj zW*?8qjZKZQDJ%{#ZVx|vee1~Ax6XM~5^Q?^Lv-75=f3IDk9hHW?`*p37ofJU2h`@( zPpwgyOX-c{$jUVh?_#&?{x#PgHD}FfWU>s3*@Kpmde`3K^o#PcTq>^RF@0#clFT`L z;v9oS9@#J2YwBufQd`vIlD0u}Sk_548hA))(H0TcYAdaD7bbb>lnnmPAq1-GXwibT z!!4-6x;jl7o{2_ZOhe3ub|jF_6R)3|8Mp>l`vV^=O;0 zH4#i!R?E+uJ;|a*qA|lRP-P~aXM;2vaq{2L_ShjVsS0T0&je<(56yhr6+^)(fO?Cy{ zqSH~EbCNwP$ypZN3A!Zs=0h}eRwH5-o}(qM740q}kGTX7Sj23WzCOJ@w_ zRFc5|qJfzLZp^B5EMllRv%0?eoLj<8a1Vo6a5L4C@Ye{51V4hFXDdBwnKyaxVBB3S z!3$jEnnrN(@J`vKULjC+?<6M~mxN%;bj=&RG)8R`H(+`EmV#k9a%j#a2UD%?iVX>Lu zGuXzOeH9R;Fuqb_DsU~Z?-M$OgL>bbEZR^*mKL%&m2Z)Q@XM~|3GUeic}=^{0v16xEl0~rcKcl@cbh-+tAf>~!D9V39Oiv54H zcReq99?AJ%(LW%l{@s0yNnk;TfSFTnRoz|kSn>?$hru~z?IZ-21d_uB_L7(lBpYI~ z_9kJIT{#Eo?8rC!CfJ4i8+q!J?DdSkk?eJukk|-GqnS@{zwcXJRnOC1{ZxYO5r1_R z0bKGqL56sn+E}Kk5jnEyoWb@WSrb3WP6AZ5mG6NE(Raf{7G72E7 zj2!j^C|;FU%_dQwfn%nVdXLH0mYHbo!7u_SB)(xXrU|SCq}XQ=1jO3Gv;v+dYb26{ zsT@tplByHnMkG0uHvyK4!Vr=c&_s(80)P@Zo$8|iPy&F5Sc1U2%V;}fWUvmjjWFgj zNMO*_|FomQ}+Wlm3`o?ln0DI z1L!u~X5noiXAbp=!rV|0SO~a?u0ek_fW&1l!LIIucYOK%S}2AW6M0Q3XI z3dq|EzNDAr|8|Z{AM(j2pS5b|zDx;K9*EK+4?qH&ToEpn8pPzt~qZ z#U!pVf}UpJ?t@-+&OXklh=`@Mg*aboRufB2Y@28@fbf=^&=^< z0)^!6L+5lbs6&`BnxteG)9Z+-RsuwA_|s<)gViPV*c2JW^!0lSIZg!PVT!^&gKSeR z6=QF)WuTN2f$M?wtyck}%QvIY7dj9zd@-(#tPe(qdx%kc1hmNA2~q~>rn|m?z~TA} zEXCGBq~!>D(VRp&!LMSshI~|PT?!O3nq*eCB?Xha@>yO5!8Q$3R?IUgREf*zg8<2k zuH>|?zJRtgSbawCYYpi087@%Mq&1LTJlC9%Uuo0*9r-FIJO2vxu%nfu?bf<*3Lp8Nh%{r!v$qN$1H_lCpV#V&KekQ6*qn-I zN~I0xN^`}E;bOGrF^p(e0yXuCGH?#E(u2wfF5pTP=p55;t{gC!Q&*~B$1giLCGvA! zp&Eo8#Y#6YJA%{Vbf`jh_!1DGfG$iq86hkIkArW_<}}DcKDKQYn7Kw0qxlMwDVcKZ z&8fVh)&w|%5R+A^$*}7LsDbGxz<|^KO0vd8xb=d`Wc?KTo-h&Me-FlJoenHxo-(Hh z47&wiOX~=i$@qREaS8xA%gzYCoOSjDq90mn5f8Cj28i;pN!~S?24?}A7ze3*+q`KA z(k+05`yk9xvTEd}nG{oiICBU8UM6xDn^V`^x}~l$Ozt@Yyi!LN4ptm8nn-hs{BTJeHTVodmEIMiiEWv8Z)ODKiitqu0*e_Eh1o9WRz?*v4`$4h%yBp?-S}l!eSWa=wN!H!?uS&#tErX#&XiN z>o5Yaeu`t@3yWlZ_dFQWpzh(dzhZp{!wA4dWc^uZQp{n%Bj%Ep(|$bztJJuA99BXM z>x`JinpLdOjcYh<7}y#0mG>M<0`Qgbj|I*Q+f;TcGLtkCuNgWaO18yPk}9BCTphoi z*s&CWUyNeQ6V?>Rs)B&`h83RxT>3nT6{riq@a~fuA-)FyxgI5EgUHKiAyk*`4u>At z*4k+XP|2F7HS+7lsp8Z0BG_~_W}~hqmpJya&AZrQMhNp6gd6w*0o~hj%Rscsfv6`6 zR*mh{N^uWETGp>IQUI;XB0JPRnl)?QP9DG6dSgeKqqmaFPS)?zAk4H>U!58k5L_f% z!%5I>wOzGVXB^zQR7vEtz>}<$Tc_~sOGgA4-r1nnZc>}qQdLvDqXuR|1mq3Mx{5Zd zlLky0!v_lkR$Et732|o7h7bf6Y4A^bx>m+FAn<;U%I|#*t;#~zsa&V=omS=7zub3$|NnX5KcZFnx&Qp%)vDaxy3JWH zo6_4FwWgpAj5OPcW~U=4k-*lLwpG{YVJAC8LmI$4ZE0vZ4H8mYI_u5}l*5is*&5T< zEw(vVd>C7*C0Z3+u{xhLhVZ7jdg`?D-q~jm5NNd{4-{iOP&T%flEdUZO^V*B9n&b; z)-Yi2v2AlK&7G_ZtL|3FsYgc@ZJ=s)R6Wy>in$ijh~Uz3w5?7pB$vh3B9lOHeFhQhBFtQ*Z)$1HQ05jZ=PuR($g8$5%s?~lEJK;J zZLaXmRd$V9SMpieSO_G$N+9N42eDS`Y-2}3%eJmeK8p^)#2vya)LEA9fKle`v?Xyx z_;Ol4=|g7^*2PM?!rT-ZQ$aXhJTzXVx_NS?>gLI}M0N9b|KRs8t8Tt=zU(cmr>d3L zDPE8L>YMl$X>@-2C;0WppT6_SPp*CP51;04 zA3Xl>+T*|c_#J%t)5i}ksXD#7Z=UUg65MO|@A27Xd8gMN{>QzC@1EVg_3$UxZryqK z?(Oq8@7{a!;d_@9pKhF=-Q0IhZ|-}aU+04O(~XD!c6NI6&OV*5{pJH-6oPv4;BTKi z_~DZeKX~%sU!FX8`^hhV@Z`a}hp&H(ukqnO{KAJn`m2xL|F3sG`sa^+VPbd}wL9$# z{PUkadT>cg>c;8W&2|39wR8Ra4lc+_y}D1&&Odt*c;w6aQiuO@dhN#jGhFD-5y{S{ zA2_>q>+lJ_i@)#jCGDwK&)?$vZ{U63$1vwl@8W_E)vFKRJD;!JyLQIcUOBva%$Q4> zR5$MM?br94r}mMjSGcH7_4M{}r>ADGx9&cC_vR(7Dp>3O+0DCm9=><$^x;nr1KDLR zC|B9Mc&5Pl>}@@-VfD*jz5SoRdgo{V{TDxYUSt!m`)p&z{M{E#eo@xSzIT4@2IG0& zx_j@@UtgBDx_|G{_s{t5(@&hOOn@{7mqYn?Bcz#Jt>-ouX_x5v^=ZlYg zQDe)#cg-$y`_cQ4{^rs9m*uuTzwM8Ic*SjBP~rOZ&;R__KmYg7rpQGtt_!M|uN?Eb z-#F#5pNieL(K6z}aogSZz-^ofoFDsd^kd-{S zT2=Cu?_Ky=p)3Diri*Hn_g2c-p}aC-KQDy+G)^8-p*$8QkEY?Hx%abgUR0qxmS&Hq z*O%nc%OaFVlI7L;@p%c#7bU;%Bq+Zj3Chyeq%?@E&T-ZlcMCDE)ng9L=_QzckY=%R zj$K(o3~i6Hs@1(}aT0Fi*h6hpnM74%lD;GrBG%NpQ(YSI%ECNKlh#7ty=2B?jMYP~ z8l47_#WAX-wNUB~S<@=hmZeq4W+z!tn40>e5F1A>*-kucojH)kE$mY=Mz~v<8568! ziZ$#NmK{r|O#?~vS-lO^rR=rq=Ga!7Gn%l7U<&IL{KIJwS#cDhjC-%5d4_3cx5gZO z?&>6W7>9;XN{h*gcTFTk%N#*^n0YuAiQ3W0TwwN|Q;=Gu^4cSn0S`@GoHP|H?mlAv zror&?U0P{-hs9l!u+vsbs4JFGa%F@Q$(?q_1e?2?8cQBN&KQPlTFSJiw5pt&^`Z}T z_D+$V{3J|~kraM6>SDt4jD&YpNW<3QBz_i?HKDeO@Rrl+8w8+@o=PggWFUN=B=%}r zrlY9o{+2pp+c5fs-!~Az`UjGy-ius3X@axu}MPg zEqT^55RM56BvM594OVWsqLZpbN;61EMcYiKSfe{8BuHwAV6eW^lVs}1CKLnb2&43= z176Q#DrMw(pFxV!+5zqtO~)87tga?GAEwtXPRESwDD&70HjyR7UGTm}+6@>?7y0bh zAXSxa{r7}bbR)YDR_+bxs{?%b|uK>Mgwou}+1l?TIJJ!|8x&27p+x_c$k})lM|m(A=8|nD60~ z<8#bZIwE_e1!ymInkF;Vjj(C2&TA0ujWgRJkQG8`ody95^|}o#`3z!k+YT5^xFlFm zok^RT3PS{b>~4c}lSQ8m93tfyWc7ov8#9nNbXvd{C*5RZcTRC_Ok+D@ zGCPPCz&$d|PRh;4Pf8Dkz!HcQ*DaG5Z6KID!rr|)<#=oEkg5qMH=eUKLF%og4gq@1 zL{3K}IWCKiwUh|N1?y+c)@5K?LsYNVwKi_p_WLIoH3mecL~f~vHlo8RGa3RCu`(|J zZ!Sxl)C6F(meuDt@%S2}sfGcb!drBJW~YR_n<(UHRc1be@J=8opmYNiizB#JWUZ^L z811Z)&mc3mmf_~TEQ*Q&t@COGKWS-gcG7oPoxwl>d^cj^Ty@Q2`fAAdk;SQFa0LQF zG%PY!0OO@hGDoJ}EDC3*!#P#!7(`o1;e*klyJ>6%nbtVE`Yg^I03Dd7cfpDL`@0|!CkGRlYqUsAMC86uBidBtat z5r^(>Y6y00bqOX|&WK!XE^t<-rq{?(!1BOAJTu#&PexS1Z#L=K=;J3%0(=C(1SrLh zV5bS(SPH^cPaOct{UB+@mhg;cQ2+J3GPDK{L%pcvIR&l>q0kWusIp=rB8pY}ouwtCs+(xMnY)?$Jb) zi%}qTqSzz$VNz##3al?7wziRC0^r58f?uCOI?W-B3mS*0rqc=hA~jP-`kg*ecy#Mo zP}=~uM+nXdxUqr*6_d4=>VsAQ+*b$d2^;|)VT)ucaal&lD%+_i6-!5OAB%NF7+y-j zB-UISAU=^(yC_KrkfkY5!(K>Wv_OBC$%ArUdHUoNDXT}$d6&hdB26_C9U!Sxa<1J; zqZd|&&nIwG(5#ABGE8I*#FxuZC$wT}!#$VIcnZ~6O@p6nwo}resoe*6!S4UV-nsN@ zdK`89tIQXO)R(HhES(4t0!7FmX5E)6F|uPD&)8Ae+2a6;!UBl0KrG0HfP@rJq7Y;V zSpgQhm-oz^#5F=BV{7cudEfK&^K^Gr{i~nuUoE7JNKBDFbcK~v z=^1`St8F3oagav3lhQ3O4PuorhQQ{D;E@|#fYX==5}yf`#eKqY6+s#lk&^C&zt`e3 zg`pA+LWXhffu%JF*40xDb;0q=_5uN~ZhN^ImLG}{V5?e191K&-(Mhc=&NC;ZiDfk? zhlI2g>3bfXQsvA}jlecq?xn%iQ=nL=H=c}4`1IV6&ldZ#3)G#hdEtQ$$B!zKASM zOJSkIxU){IxJnVhDy6bn;z(A-k&skO?zYRtY0<4hQI>@qa@$I~tl67^F5`#=e#~i4 zUfrc8$k!g0v8O}t@G2eZ93C=Or%bFFF3c8;6k<$*gneQT z6%M->*^Uh79g!V-fg5|%Izxma?oi@Ek?nOEHI+zPosMl|KJCy(Lm0FzG&DkoEQ82E zRPIjYZV}%Hx(aa%_PC6n+@@H)fz_AMRDBw;lkIJ%0dEiSojUHHklzanhwO9!ecE1- zS@JfBE>hy%75;15v)LN2QxPWF$n;?plvk!|X!a<1h9NPm6?_JMMf_vzOmt0!nrl;y z6uNp$CM28+{@~_ivJ!IdJ&@u>T)GD9m%= z!xXg*xNEnR0v<(-rl4wd8rpCwlap702-a@uKC6K`@b{(NR;#>R{kHw%LoufgQa)h# zOYDYj)hVP-bVvl;Ez(0Dxc>rGUu58UR&BLMr|k_84M^)nrkH!zu){X&_poheL$^~S z8;`&>EZe~f|Jw%d3{Si?WcZnvLWkV8^Mt7PS_-QM#1*l9x^@@4wl7VGy!qNII^~3 zP2xelt}!TCIqZOh<51BEiMh|-{5Wv;)YD9}1g5fWdkV6p5EsO{PYy%L_SP)UR*F2e zlB6Rm8#;ED(3VppcEV$X8aXyH1U>W2t5>8+b{5a45w;Upoa45gj?_!b*|2${gEmj6 z_s2{`NVwT{BeZC{E^4WghlDWDe?E=Wk$Q+(WcA3#v!l`Kwlax>?4*fLBih>(-1;t7 zJ#3U>rxmrfC~dLRi=39!1|WnK4#4!iywV@*O*C0Ou{!lyg*HQ+`u~E7N6e31>oYv zhdsTK^GKz~zkB0P#~jC~i;q8l>&BgNd%TaKx`bT3|F4Hz`SbTqv5QY{<{WzIkKUed zjwj$nyOm?)#j`!X-alOAJdo+}wQt?{gZuyf7kBRe;N9Ef2!8Po@BjS%$M4IV`v70W z@0?!h)}=9g(m8LQx$6rAr+@tX?nj^B{n6)lzw^bn?|t!i-@OcCJU7&**EmmgI=z9n zZ{K)bZa;p$i-;%t$|;NSX%`%0F`nKsy63>ad)nML?p(edIeR~E9ho^7X74#P)Flh} z)+H?Cv#Is=nW^>8kvmyu?dUv03ikW(gDWif_6RbF8T& z)9CiG9yr$l=OI*2e|+by%R@PCeC@q&{Mmc&-ujl@xpfg$b?%uSe*cPRI!Cek;&1-p zf4=)Kzx?}u{^ch>IWx!dF4zzf@M5D;ch*5X1?MxUgk5V zejL#F`d6<8G@k$LB82gqFM=@Md>(}H<~1RV5P#Q$FxGSp2;-Tnorf@{QeOyRym=Lb z@#YI4j5l8hVbpgq($~N+o_WaYVHmHJG0)d5SE!ULw8<5E5{~E#mBChedq5aBmeuUY0+=pHfs;>yo&wl*Q#cv-8 z!&e30YsJ}%q4jt`eNGfT{q~(>^Zgpp@D)n^`BgBXLNY#v?aHl~RaGAH!dxN%5*Z05EO z$M%bAZfn{8ET=~78HjRiwdRl(^)hX%av3pu@vDN>_|9AH7+>5WRAwPgx}_)EVC2)t z($JzUX^j@wp>%G}%eLL_omclc1sAqe71F(#x~dE!E{jXdOE56vwU<9mj>XEEl2y1} z=(i>u)26w*6ZI*!G%44kJ%O8GDvN!uS7H(ky9fRqq5;7 z_dvL+OQiNF2x64_ZsPM6Bd?GY5tqq4RmDV$6_YD4yjS1biM^+_V^nP8KE@#%%GLIF z?kT)5C7fQ44$RjiV-+2UA6C!0sg=);2m*2XSUd+&c=uXTN<593l6h(h7$Xde(`#Oi zAwmJ!&cw;R8qtw<*r2!wE4wJFS;VvC!M8QpASzdBK$5@D{waUH-J zkiWIo7G{rqR}7JlTPb!P!QQ{4wU)H1pqpkdYqK$QoJd>lJc zKu+ZOVkC<+Q|8hYGBVmh3muU*^y_e81v= zs5)UC*-kt_A4h~qW0X1#{A#>Xwd$Q)n-s*6jdl^q2ziRriK?Pakz*-5N#KMrM<%pm zqrTRl>?Db5h>@fXbduPSJ!mhDz0}Z)p*5VqWf#HKK$Thr&(YA3G}|v` zlyEj&VfO;fw1#`11Gxg3aD)a%(CsPM5iZ0PCl0`zwBk<72+?EACD3~Ck)|lnjXtxh zEzDN)ikM5GF!a5hu86JnJ)pgum|_xai;7W!5g@tm5Ufma+E#@#IiW0?2(l`T5#wDa zL(~=Hf*44&1##k6A?WrY6Ut;*g$_8FykI7FoQDzurO)1^IBMEC!C1QKc|1{t2+v4Z zv~}|7t{!(h9G%t4#;%KbhR9H2IY1OUft9=AdmG#qT4`!&;+}*_fY_Bnbeh5tL!}Gy z1<4dcfD+OPg&#_vNwxWCVVE}t+?XY^#M%g!V%0xdfLkfsX)D)&mY*x@2&1+-N`dLG z4BNMsms2@ncoPhHV=9$k{0rgU&Y9cdE!i5CPb0>JMw$%;3^%qTTqR+Ob6itNqApA-o$xEGtN^cA zI_V(GeUcrLZ-@Y;#O}0Rd)ev(`ig{*adpM;AY4I78nKR?U<^y_NG`na3K(V>4K(l^ zYaspV3rU2}3Eh;lz5S`x%BDbW3-awzpzLR{6)LAjO0nr0Vu1CnSr5riLXTlm2PZZ- zBx$d`2i2W83zBP2Xtf%^X!q)4@p~oY?220-h7Ur}DuUEYlXg}(PM=0#6&i_IQd?>8 z+F@zm)?~Mw-lq|Xxy}Lk7$JaGTP<Jqy_JI-27)I%YFp$NJlnSj75~5PNy~XU6H=ME4vIm|4!UsNOkBuCK$Jm(F z0^38mWd?-PBIng zkY%gVSA=AR2SP^S1Q^C=-=fY`q(% z>24JhVJoz!&tgL27E5l>V>w8isS=kSc7Zk_N0v;$>~1Wbh&Q-|$C+!#D(!n1at zpoZjbL5SN+PQl|Zof()EaZ;IfJH(X}cPKl9vx0(g1 z1vFE%Vn;rW^hh0&Pv=AygL}v5KxdATrqEhW1(cBH+sS1+lf9reENM~9g2^dHBA-B6 zkWsL3kru;P=(sqf%s5$_@$h{X6L9s~c7ng(R!;+2pFoqTSUjuCsS;xijENgJTe++O zXPkRf?kQAZcx0a?U0Asg#@k*)1sS&8k4(TQ5)M3#Q|S(978u`5!!#zYT567m^5mn0 z;8p1aW++C(L#Tou!7R&0L?6r6dSdXI!bWzC6;=;Xxsb0KTX)kASq~*be8vRPZ$(UD z%^i|YboV6-GVf62vpU&Hw-Q-aw@eXPV3QCLuu2}AtqzTokQlKy-UuBrPpue!hJ49F ziT;ffjP zSC}oK=-dfxCI)Vx$0gAwRB$XcotK_0RlCwh-mHJ3P&)UbowC#6&D zamtjR$n6r+Ey&0|FzLIjTq2O^#Q27Z7ctdgNv4*G_#T1?%i-W~tdfHq!6G~Doe`p< zsm4T4;(kM@#X*VdB>7U1DMNm>6p_#B_ z3RQM8vS~@C2&LGRR$J#l4$l^H(ZZOTjhOJ{A_8$s!c~6}&_xIa_td$+;qJ&2-w%X+;n_|fi7BlB98FNdgkCg()Y2dqYJ&nnPeJZhqf|*mmg1Qsw5M%}E0-MVPa zpyq5$6Sh!Uo}7`=p19CP$FS64Z8zlPaVD-U2l9)D%vCx-H@h=F+aOQkY2-YuVcE3W zd>ujQ0j9u33%5n%V$O7CDIGR*NV#UObdIWKb}eG^Sve5|Et|;Z7{XHO*s#*`-ssUQ zJ-WcH_!c|CVX=|5$B1s!Spyt#$ntdwEfqWbkTR=XR&KyXLs6gKjEyuWoG7dotabsp~Q3LlOiqV(2KNUt1yGLAkuJo@DF(fg1quOEH5 z^?OI}<8wzJE+n}hZ>Fxjd+Xy{H@>*`#g$wCdF!JueuAH$-um}jAKkjK{QOYZji+!O z9|5zy!k2fq&)xf`54ejz-dRH?jW^IYTSvdzdiBx?bmFCR^RVtfhyBsfFLw@4!zVU$ z{#IW)V-vMN9k`XFFuC;CSLie=x?%O^hEmG z$*Zl=-+X)${q4k8UZuaSzVImh?PNc$;@`fHdA`R_4Szd%k57WXts!my>FyQz_3l;t z^S!M*@7=wI*M4>9H+TPH9Sip_#~&ZxxPA5ZTgTUr|Ks?^@n^@^Z(qZ|7EUH!xw5b& z@rN}C?q=rg;v@Mhzpw(7yZHL&zuk5bN37+*- zzq;mC?|-lRW4QmIslJ(tyL{r{tL|7K*`4O3*WtMGo}CA-^Qi#2Cmi#Fzum~leXOIu zc*tY_PnU0g^Jn;aC!nz_SUjQRqVer}cku*j?)P_&uFJg~eX#q+-U)*4W^nG~qRfB) z_JjZV=MTTU`j20}{Wo8}{r;C%|7{aLchyW7W^%$xR&aaEcfZg=Vg3(Ins?XWeUg-1eq^pZm{q$Qk-HBA?eEYPMO&cd-1Dx^8Olf@CS#l*L%kCSV-?Fx4Z6K@z(|2dkW8Y4Oj?M|KGp= zhmGLgGiIRZgO@bF`3B4`RZidrzA?j#%h)BWR}rgv)0=h z*eyJxkn0G^F?XfI`_`n%C5>b!rLvTI$tL>}NAp$du%&e&QS)ue!l+5I%fF=Qs_b2z zQ)!QpokrH-CdsC?G+UJgA7_L~Fso}y=sHW76R_79WTni{X$9x~FyxZADR|#am@Gx4q_3oyv(kQh@^>0Qm-t>P#OInG3|3|)yipfOFqV=bWFt?Qwy$~3cvk}?aY?K3|FfLp@3sto0tXB)06h6vy0draWk_RSDXCu#dlF}}9U!${a1l&%~ zE;i1+NsX%9cy_C_KT`IM+F~eE$|1EwB6MQhOfLapJ}K3|i;d)1`1H*q(I!`r6FUTy zF@~JGRstjTAru?*e~g$L)g!g@B*p!Z4>i`wyPytyrV>jFjV486ghgXp@zm>VO6WQ} zQkAS|axf#iRJeH~)VwfV9y*Wklb2J0t`Z^%XUVa<)Nq`0w25(1>MokS2BGD|ieMj> z1gwQ_;b2BoI*ksk1NVh=7^xk>2@3%R`CazN`g({uF+RnKj1ErS4cTwaCP&|FBimDJ zMd{>jO4G*fM;u7CkVd#dCJB#E+*wh=I4Akic5o{bHq}b>f^{u1g%0-;bi8ot$c9T3 zOkT?vi2;SukP}Ho0@J!ucd?bt6c7qXP>UR?W)lta(`;Lm{q`!2AW@mNVIGpH)gfKw z!X+Z7hrV-awL49BP}eb57yBGRygage%F~HTRcd6IC>%*x6XtmDsZK<&Kq*4mDeb4p zRSryhSCHP#nXKSPGKtoLmgrt5P0f|7wIRje;6&I3f&dx;o=kG@sB|Z=Av;|&LL0J~ z@_++CVxMP9k(JJ+WK0V9^ojUrafVZbQ+mn3II1Dh*CBfabbK4 zBD_PdD(z}4Q%)PEiX=N5mx-6^w)lzA&qfK{E}9(!o@IjwZb1~0OUNj)n?vxMI*nk) zL5#rX%CZVFi84FPKvIiJQK?`~ZScVbn#xP64aaXo;2uN}b4gX{?CEf}RXCFvN6+jG z!;+I5&Uu8Bs52(b%9^H`Z3y{?mIQzJ9DEQ9Q_8y4 zKurcE#A70YceIhrvT`f6g#g8X3ON zjAYIUdOVS}Zgyng!gy6$=oAAEQ0|74#KJ-l_5)rMx)C{rQjABEik!=ZlDLl41bFP2 zN+{hoss5wWh(q8-%0fuDa8L5$*u;LLKGK#JR zt27Nxmkj!=L16V!D*Q0xRtQQ}3A>5Bp?Qu-xrx1S2BxhZng|(Et4gFlPGxjl8~MBx zHu13|n`q7TZX6N}rACmQ$Ya^&SPFl{R*)ivYT3cpbftmk>g4&1tPMbinl8}<2?fCf zAnKGhuyY#>ePt|sWTr71;OYWO0&>%fM`6#0V)W?J4#iR>iAwXC#hVp7T-6H?d~J#o%s$}%Ow zPNamq>_y-NjR}bM@M)DC7xW)daZPG*B18;UDlTaYWN`PKa?Cbxmq)a?6ED#GdtTuiIMi&-0~4drBSfEXRLfKnsb2nnyl;Y4`^ zRgy*M%#LhK@52e2~@Oa%*lbEiD(K@ zRw4wZP9q)8QA%3{p}QmBi@`~4s{pa&tycLzbd{6^kwv5~OYFjX9%!U@YC{S5<|n5% zyM-KvHzOh`m)Tv*kbfg7ts7G>3oE|l;Gpw4r7VX&&1f!Xwo0Yumi0S<#|vz|84@fe z)XXTeuunu z*a~wsQ^>*a_Bo*`IQuxEY;>L!m1xL_YYDPM)nyA6QrL$7c{WP5I8(J1;w8ieNe02! z|!d#!k}cewao~bLD9pgA#0LSL7kkdcoYnC>&-h$Ln_M3CMt?G zE0xL2rFMMtj=)88R$0}DFC%!b;0v69(&H#8!&xC&guEVj!t+l!nq&g(OR0uOK>*}T z75ZCh0!>8xSZ$MvtkI~QyoPv$^nyT=JzxgokL+7c6H5V5n4He?p&9*NV8>0E92TK0 z2jr2M8{Ci1QWbeAs*(`i1LZ7(VkN}8$eo)KYoRwTNbW3U2qIaA857C&KYHWrf!8(;1oIH#+O3cEJhzO-xizx!Sw%H*6o-hO$ z1S?g6o1=T#)eXmjj3Ps%_#Ti^&H#T5SN0-sf^L-2qy)N@KAK#n?^P!+*2Ta59iM}7vjemxp=hQ zmSLNN*zhBilBBev=~@MEkRQiD-Upyu+vMaVZ=LE{4kKliI6(a zCtyLac)vCEh_B}%+_Kg&|x_g=Tf6#lB~Ye>Unynw3H;vppjB&vqF2>Sc)6LvMe%G ztF&>i*g3+o;UUyihAhG*;%d3I$yuvfNC-=Hs|d|1Y{i&c&rMcgg7ZVE8asx!#M(KP zUgET2w9u(FA{s?bH0U%kTl0i_8IfH;x7kK+bXiLZG;`d9zWXXcTu0xXeC6AWzWdS3 zKlo-7>n{G`bMWfcnNaWDy>{p0yYJln$-Q5Hedp6V|0=Jn6QSNc{_X9n$JdWPz0ZC+ zzHxm0_FKoF9sgQ>dnOdrs|T;Wu~!ebV2^us>rZwb!9fYY=kNX!f4p>(o^6)@D_-umc^cQzuR zw(#ROg57%;|GIGsYVTD(cx{jW>#bir1OWA|gZZGTO<<@8o%7&rC-3X!9sF(UhxO8% z_00`bD0#>JmY{0t{?kCAUR#>mIb<0PX>%P6^}TwqzrDf%yoh1oH7eAFdU!DQPtc(5 zcljC;>Vy5dvvmQ@?>>$Ob#CwIGl4*@prE#vPj3c7{U3Yh)+1MT)$y-VZw84$`@Z&m z9EKUi@?atd4bN*|7Ad>aEp@vmnmoZcBwRG05kewdB=SNe!Vq9WM8Yt6u>I~;CCefIt>T*v|L+gLPQ!_hd8g!;)Jf9Jn` z@Pq&Phxd2EpkNVui#L~i+?V452-Jh`J^1!MA1!_ZE_`JK)Lq_t z1qQHpj8_l-@RbLDusnx>I%~J%`G;JiKkYF8HRcn3Zv}TcGh%NZ_k%BAKzn-bw*2g@ zJ8(}YZ+vj?sX=|^Jo0HHm?+ulug->(tD&Aw0s=1{e0+Q^Ags}z-n@O>&$64;Jn!=D zqjR_?y>+L6r;{7EMtQpbb%gKF@!p+_7*A)e?-|Q!?fR~WcKYx4{^*>^t^=Od7@2~C`9f@pb-rACjUeX0WE4rZPX0ooEC+(8ha%Hx0H7zB1*482uLeot?#(1hB+1`Wg zB?Ri(l`;$br#n>f*Js<<*Gl;Gq1K!!28w>tNs_LTbnHc!0OCefvc7ulSFX^WIW#Df zn{FoJ&~o>V3T|Dr-SzIcIAms+XS5b2JrYC{rTj$3=uZOW5Kc2=Q+q1&OG z??^iN5S=wc+iwhGCf%+UsA|)aLfzObCXh6nhR-2{S?yiy&<#?~OH6}BiCNZUU0kXg zablhmRvbLTINO@;g%~6wQI58G+%k^UPJ%I-LdDhqBPJfYlfP1t0*~P+anj0o=W^qb zoQ*AM^X=}G0|jf)6>ePSOr$$+kvW{#2H44nuE~ZARy(4owM{~OQc5{GxM66H9GpcT z36^H0!$-@c+a<;qecYIH&vC_4;>-%$@X8CA6Y9OoWY~nnsUa9st=zH_IJqY>ZPLDr zUZO*|k3w1RlTm=-sI_DhN1pU72$z7+IKrsDTbmmq|8S|bkh*T_p0w{GC*9pqLd-RW z%z5-its@WzWBQ~mWIjztq&T@tm&qgIV*kxJC#H5#cbJBgJch{9NjmJ zPMNe$Ht^trTnKjzOs#q{^ctu&9}tgKw$6DX zZ;?P;rKS`OGeScYg9;XBldDc9?dowjwDZFv>qc@lazbeAqZr)?Hwku<;usP;EH@}A zjf`?hf(UXK(#)jxlPN_Fjoxdp55*7Ng^Iiqy+xpGlTe?85VG2iMjR6xSTZTn+e*(w zZH|J3w}(mtqOmLQ-io8pP^RJ>h4Um1NydX_4Ky;UM2x-nec&&d0yBd}he?cA8EhCe5JJ86 zt8qs`UrQ2+BbYe>GUG0FL@X;AkxTN>&X#cg99)tyi!RuklAOIO5ox}6RCdh8p)O^( zqMPH4ifB@lZ!bL=r|m9kp%5YT6TD^;*Q%_VL5%3drO>NKU2p9e(HPy1N^@dYX>5!$ zI$x0Ci72sXq=qQwgcYVUXCI%3$SyvQk|PV3=o`$r>RwlC!lW&BOf+m7MVkaT1Tn@x zFf*0+q8rKPoFqdIY0rk<(u&TZes433*$r`%bQkKZ(si>gH7=nJsMB0XY1`E(Sai}! zv^779cB~QcmVXVU#_24EB<;HcSqLalp;X45iw5(t@~Z2F{UVL73;N zn_p>YM~Wd(s&>*ozM6W0&K?984As?C3H1+^CK-jqq>0X&p-Q1u6o@N`y&R-llwG5f zCp!rRqp+MZ68DB09s;s7@&=U=WLI}_67jK)oDsXm2*bhC@$nmluC#5XwbVKJ1eT<= zk3pSK2l=2AAT=sI9JPEMlOS`w#;oKA+$2^QHe?XOShdJm$O3aheMel^8Az1!6+)G@ z=|#^m>U^hCs^^>}GD&E`>Li-(K-XSC9#=6U#ATc_CY>0Tm7o@*l4?h?R)N^IAyvlV z=lDrysa;ZUMRaL0p{B2nki{6fD^Duty6!oz7#O$<3@wwA`J`)4m^}QXW>y_OG2n(3 z8oohFDz#RJJ}0NdmQ*AaNg-tq1wtiIWy)t*XNH#Tx*n8o?l_rIH zsfyH&S|*mxYRx*!)CB|PNU2j`og&oqYYU=s_YDcB7}&_9 zs%R*hg+j@wj07dVkXJqk5|}Xv43pxF?aZxV%uRt7hdrmE&uLjGv&8(F5Fb$xMK497 zMYu$v6uIK$$OU4vo7C6PWLF$>4&ITeh9WhHzL;b8u9->mVNfmIc`c0*q@iLE98g`f z7D=N-oV6N6Tcx57UUdu#q3cvAl#C4{VwfiNWEGvk53a@N3d2Vsp-^OWKYU2DD4ZT5 zMpHqOtPi(sS01}If{eJH-sfllC>XH?YSM=g25MI8MivOzsB7FN!GEKNB=_Fd=4?mV zq6U^>06nG>22X0#hjIe91wNnI>QWuZe&ib{^H9`X=LBV#uRs`&*l^$x1IFGZ-7xA< z%}z=$nn%P-3f6e?nOt;@!)l_ZxiaY~chW9nL$n2kAe99qE?kGUp(}xc%z7#jny;R# zuKHs_p3(KCsaJ{GTVT@8;HVD@Y=qFD8k0w=)Ltv2l0{KAYx{A@q2qp8g=OiIAZA_G zR-woBIq0O5)T}&Ts!b!i4oftVBNrq#YITlvl_oZj#zS4{nRFH=>0_ceB5MCK=So=N z%idL|HE}^*6l+dBU`%pHp*(4tJ$h=|7Zt*;+e8*&nV6u;GyJAan$m@YXr(3icMH{t zB|9Ku6BN0nI0PGM zs;Sz1sKHt75+l%IK{1>uQ%+vnl1-X7mO@sa<8UB0)Jvq%Fe18bpLr5pP@6q!-HKw* z>J!53to6m!j#p*Yf~FP=`IL3>t=DG~NMJ)Z>1%H)6YL}=pToy>y8R!*%j+z)#w}ei zrLcxc(}!>h>sq#i!#jrO_f$NiHsahFiefUg> zk4-yfCPZbQdK*w<&A=A$Dxwt2{ih{9UVrN)@p0GjUINHI?cx5P0?4)zAFsdl!o

&`M<{)t8&^iiA8t6 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

3#t1yc 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 +2jGPfJ5j!VZbPag_U?-o4H>xbGmXY>~A8F)H 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%0DphJiraaqM08s>IVkr$_3D(dix0Gxbd|Jf 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

@feVYN1l`lA>P2Af%QI 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�Y9tuZ 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
    S_{%3#ciREcmLGbXIm8 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�St@1>XTbQ8~A?@q7lX)pIB)$6)J=MV<= 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

    Lg?bdbpV3(PHnTX#)ha$4P3SElJu( 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

    7xs2L{_#4R%Fp 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 NMUmpJliiN(-|TiCH{G#9U6Q(dijlE3A=gn7OD} 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 z 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 uP figure: # Convert the RDF Graph to a NetworkX MultiDiGraph - f = Graph() + filtered_graph = Graph() count = 0 pattern = re.compile(pattern) if pattern else None for x in g: @@ -50,14 +50,15 @@ def plot_graph( continue if x[1] == label_property: continue - f.add(x) + filtered_graph.add(x) count += 1 if limit and count > limit: break if not count: raise ValueError("No triples found matching the pattern.") - G = rdflib_to_networkx_multidigraph(f) + # print(filtered_graph.serialize(format="turtle")) + G = rdflib_to_networkx_multidigraph(filtered_graph) fig = fig or figure(title="RDF Graph Visualization with Bokeh") fig.add_tools(HoverTool(tooltips=None), TapTool(), BoxSelectTool()) @@ -73,7 +74,6 @@ def plot_graph( graph_renderer = from_networkx(G, layout, scale=1, center=(0, 0)) # Normalize node sizes based on degree - # Add node sizes to the data source node_sizes = { node: 0.01 + (degree / max_degree) * 0.05 for node, degree in degrees.items() } @@ -81,6 +81,20 @@ def plot_graph( node_sizes[node] for node in G.nodes() ] + # Add edge styles for rdfs:subClassOf + edge_attrs = [] + for start_node, end_node, edge_data, _ in G.edges(data=True, keys=True): + print(edge_data) + if str(edge_data) in ( + str(RDF.type), + str(RDFS.subClassOf), + str(RDFS.subPropertyOf), + ): + edge_attrs.append("dashed") + else: + edge_attrs.append("solid") + graph_renderer.edge_renderer.data_source.data["line_dash"] = edge_attrs + graph_renderer.node_renderer.glyph = Circle( radius="node_size", fill_color="fill_color" ) @@ -92,7 +106,7 @@ def plot_graph( ) graph_renderer.edge_renderer.glyph = MultiLine( - line_color=line_color, line_alpha=0.8, line_width=1 + line_color=line_color, line_alpha=0.8, line_width=1, line_dash="line_dash" ) graph_renderer.edge_renderer.selection_glyph = MultiLine( line_color="red", line_width=5 diff --git a/sparql-101/tox.ini b/sparql-101/tox.ini index 67ddfd4..2a9395c 100644 --- a/sparql-101/tox.ini +++ b/sparql-101/tox.ini @@ -3,10 +3,16 @@ envlist = py3 skipsdist = True [testenv] +deps = -r requirements.txt + +[testenv:make] # XXX: Update notedown so we don't need setuptools. deps = setuptools - git+https://github.com/ioggstream/notedown + # git+https://github.com/ioggstream/notedown + /home/rpolli/workspace-py/notedown +passenv = + SHOW_SOLUTIONS allowlist_externals = make commands = From f06d646df29c4c09132f0deb3ff4979f98815a98 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Fri, 30 May 2025 18:06:17 +0200 Subject: [PATCH 50/52] Setup (#101) * Env setup. * remove solutions. --- sparql-101/Dockerfile | 5 + sparql-101/README.md | 25 +- sparql-101/docker-compose.yaml | 14 + sparql-101/notebooks/00-jupyter-intro.ipynb | 209 ------- sparql-101/notebooks/00-teaser.ipynb | 76 +-- sparql-101/notebooks/01-knowledge.ipynb | 233 +++---- sparql-101/notebooks/02-semantics.ipynb | 136 +++-- sparql-101/notebooks/05-sparql.ipynb | 236 +++---- sparql-101/notebooks/07-jsonld.ipynb | 79 +-- sparql-101/notebooks/10-rdf.ipynb | 154 +++-- sparql-101/notebooks/11-sparql-metadata.ipynb | 96 +-- sparql-101/notebooks/12-enriching-data.ipynb | 138 +++-- sparql-101/notebooks/13-enriching-data.ipynb | 578 ++++++++++++++++++ sparql-101/tox.ini | 4 + 14 files changed, 1226 insertions(+), 757 deletions(-) create mode 100644 sparql-101/Dockerfile create mode 100644 sparql-101/docker-compose.yaml create mode 100644 sparql-101/notebooks/13-enriching-data.ipynb diff --git a/sparql-101/Dockerfile b/sparql-101/Dockerfile new file mode 100644 index 0000000..694cbdc --- /dev/null +++ b/sparql-101/Dockerfile @@ -0,0 +1,5 @@ +FROM docker.io/library/python:3.12 +COPY requirements.txt / +RUN pip install -r /requirements.txt +ENTRYPOINT ["jupyter"] +CMD ["notebook"] diff --git a/sparql-101/README.md b/sparql-101/README.md index 17910b2..29eeeb5 100644 --- a/sparql-101/README.md +++ b/sparql-101/README.md @@ -4,7 +4,7 @@ Still stuck while modeling your data? Start managing your knowledge instead! This workshop introduces tools and techniques to get the best of your information, -including graph databases, RDF, SparQL and vector embeddings. +including graph databases, RDF, SparQL ~and vector embeddings~. ## Abstract @@ -30,13 +30,18 @@ environment before the tutorial. ### Part 2 -- [ ] Storing data vs describing knowledge. [07-jsonld.md](07-jsonld.md) +- [x] Storing data vs describing knowledge. [07-jsonld.md](07-jsonld.md) +- [x] Metadata [11-sparql-metadata.md] +- [x] Enriching data with external knowledge [12-enriching-data.md], [13-enriching-data-exercises.md] + Exercises: the DevSecOps dataset as a Knowledge Graph Getting security insights using SparQL ### Part 3 +:warning: Not this year. + Graphs and semantic search: mixing Graph and Vector databases Exercises: the EU Recruitment dataset (ESCO) and CV analysis You will learn about @@ -51,3 +56,19 @@ intermediate: python, JSON, YAML, HTML, HTTP good understanding of: databases, SQL, data modeling Tags Best Practice, Data Engineering, Algorithms and Data Structures + +## Environment setup + +Setup with docker + +```bash +git clone https://github.com/ioggstream/python-course +cd python-course/sparql-101 +docker compose up course +``` + +Otherwise, you can run it with tox + +```bash +tox -e py3 +``` diff --git a/sparql-101/docker-compose.yaml b/sparql-101/docker-compose.yaml new file mode 100644 index 0000000..62b8ffd --- /dev/null +++ b/sparql-101/docker-compose.yaml @@ -0,0 +1,14 @@ +services: + course: + build: . + volumes: + - ".:/code:rw" + working_dir: /code/notebooks + user: "1000" + environment: + - "HOME=/code/notebooks" + ports: + - "8888:8888" + command: + - notebook + - --ip=0.0.0.0 diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb index 6985c3f..e69de29 100644 --- a/sparql-101/notebooks/00-jupyter-intro.ipynb +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -1,209 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "baab3cb9", - "metadata": {}, - "source": [ - "# Knowledge Management 101\n", - "\n", - "Welcome to the Knowledge Management 101 course!\n", - "Author: " - ] - }, - { - "cell_type": "markdown", - "id": "294f2455", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Introducing Python\n", - "\n", - "Python is an interpreted, object oriented language with\n", - "a lot of built in features.\n", - "It can be used as a calculator and for mathematical operations,\n", - "such as statistics, plotting and linear algebra.\n", - "\n", - "This is a fast-track course for high school students with math knowledge.\n", - "\n", - "Students are expected to type and execute cells, and share their results.\n", - "\n", - "You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb)." - ] - }, - { - "cell_type": "markdown", - "id": "b2ea41eb", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "# Jupyter\n", - "\n", - "Is the course environment in your browser.\n", - "It requires a modern browser and an internet connection supporting\n", - "websockets. If your network setup (e.g. your proxy)\n", - "does not support websockets, you will not be able to\n", - "execute the code." - ] - }, - { - "cell_type": "markdown", - "id": "49fb7dcb", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "While you might find the exercises' solutions in the environment,\n", - "it is important for you to spend some time trying to do your homework!\n", - "This will help you to remember the concepts and to learn how to use the tools." - ] - }, - { - "cell_type": "markdown", - "id": "dce9437e", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## What can I do with Jupyter?\n", - "\n", - "You can:\n", - "\n", - "- execute the next cell with `SHIFT+ENTER` (try it now!)\n", - "\n", - "If your environment supports it, you can use features requiring\n", - "operating system access:\n", - "\n", - "- [open a (named) terminal on the local machine](/terminals/example)\n", - "- [edit an existing file](/edit/notebooks/untitled.txt)" - ] - }, - { - "cell_type": "markdown", - "id": "82b49eb0", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "- add more cells with `ALT+ENTER`" - ] - }, - { - "cell_type": "markdown", - "id": "6220ccfd", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "----\n", - "\n", - "Try to add a cell below this one and write some text in it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fab72e72", - "metadata": {}, - "outputs": [], - "source": [ - "# Add a new python cell with ALT+ENTER." - ] - }, - { - "cell_type": "markdown", - "id": "8b4e5ce0", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", - "\n", - "## Python terminal\n", - "\n", - "With Jupyter, you have a Python terminal at your disposal.\n", - "You can run Python code:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2c583685", - "metadata": {}, - "outputs": [], - "source": [ - "# You can evaluate maths and strings\n", - "s = 1\n", - "print(\"a string and the number \" + str(s))" - ] - }, - { - "cell_type": "markdown", - "id": "d4a9829b", - "metadata": {}, - "source": [ - "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f0e5162c", - "metadata": {}, - "outputs": [], - "source": [ - "# Evaluate this cell with SHIFT+ENTER\n", - "s = s + 1\n", - "print(\"now s is increased \" + str(s))" - ] - }, - { - "cell_type": "markdown", - "id": "f89aaa25", - "metadata": {}, - "source": [ - "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", - "This means that sometimes, you need to \"reset\" the environment, to start from scratch.\n", - "\n", - "This can be done with the \"Kernel > Restart\" or \"Kernel > Restart & Clear output\" menu." - ] - }, - { - "cell_type": "markdown", - "id": "27d4f22b", - "metadata": {}, - "source": [ - "----" - ] - } - ], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/sparql-101/notebooks/00-teaser.ipynb b/sparql-101/notebooks/00-teaser.ipynb index 7731f13..f0b3a45 100644 --- a/sparql-101/notebooks/00-teaser.ipynb +++ b/sparql-101/notebooks/00-teaser.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "8cb1befb", + "id": "43043d4d", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "31698268", + "id": "97353726", "metadata": { "slideshow": { "slide_type": "slide" @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b0b9032c", + "id": "2d80072a", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "469da5f6", + "id": "b81ab319", "metadata": {}, "source": [ "(and some graph libraries)" @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "80d65c10", + "id": "4b4a0e16", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1f8f9460", + "id": "78750155", "metadata": {}, "outputs": [], "source": [ @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "b62d294b", + "id": "8612bbff", "metadata": {}, "source": [ "For example network of persons:" @@ -94,7 +94,7 @@ { "cell_type": "code", "execution_count": null, - "id": "246201aa", + "id": "8a90766e", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "2279454d", + "id": "393f7e50", "metadata": {}, "source": [ "... eventually rendered as a graph ..." @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e12cefb6", + "id": "b9d55ca3", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "4902dd40", + "id": "87645e2c", "metadata": {}, "source": [ "Convert it in [JSON-LD](https://json-ld.org/) format:" @@ -149,7 +149,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bb01a1eb", + "id": "ab42f580", "metadata": {}, "outputs": [], "source": [ @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "5fd81b62", + "id": "96e74d83", "metadata": {}, "source": [ "There's plenty of knowledge in the web!" @@ -168,7 +168,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d4628bbc", + "id": "908bb115", "metadata": {}, "outputs": [], "source": [ @@ -187,7 +187,7 @@ }, { "cell_type": "markdown", - "id": "8be69385", + "id": "54cb64fe", "metadata": {}, "source": [ "And we can connect them together" @@ -196,7 +196,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ee12f5ba", + "id": "a56717ac", "metadata": {}, "outputs": [], "source": [ @@ -211,7 +211,7 @@ }, { "cell_type": "markdown", - "id": "9d6d3989", + "id": "72a6c7e2", "metadata": {}, "source": [ "Graphs contain a lot of senteces" @@ -220,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ecd3ec39", + "id": "d6f74b87", "metadata": {}, "outputs": [], "source": [ @@ -229,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "1233bbe5", + "id": "2e70df30", "metadata": {}, "source": [ "but we can query them (e.g., for Italian food)" @@ -238,7 +238,7 @@ { "cell_type": "code", "execution_count": null, - "id": "857038d6", + "id": "96676ab5", "metadata": {}, "outputs": [], "source": [ @@ -258,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "cc3f3a07", + "id": "c8ed6313", "metadata": {}, "source": [ "and see if two resources have something in common..." @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "15a64386", + "id": "fe2c9b0a", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "141a9d52", + "id": "b3ca6565", "metadata": {}, "source": [ "We can query remote graphs (e.g., DBPedia):" @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "db84d4f8", + "id": "2008e555", "metadata": {}, "outputs": [], "source": [ @@ -319,7 +319,7 @@ }, { "cell_type": "markdown", - "id": "529626c5", + "id": "ef83c435", "metadata": {}, "source": [ "Provided by different organizations" @@ -328,7 +328,7 @@ { "cell_type": "code", "execution_count": null, - "id": "30051dd4", + "id": "35924928", "metadata": {}, "outputs": [], "source": [ @@ -358,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "19de5dfd", + "id": "3fd4627b", "metadata": {}, "source": [ "And their relations" @@ -367,7 +367,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e5f48820", + "id": "9835b326", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "63c2ff6d", + "id": "299b5612", "metadata": {}, "source": [ "More relations" @@ -406,7 +406,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e9ec9b57", + "id": "db7e0fe5", "metadata": {}, "outputs": [], "source": [ @@ -437,7 +437,7 @@ }, { "cell_type": "markdown", - "id": "0f2f7b3e", + "id": "6e6fc2be", "metadata": { "slideshow": { "slide_type": "slide" @@ -452,7 +452,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3bab3110", + "id": "c7f05a0f", "metadata": {}, "outputs": [], "source": [ @@ -461,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "36a0706d", + "id": "e2406ac8", "metadata": { "slideshow": { "slide_type": "slide" @@ -476,7 +476,7 @@ { "cell_type": "code", "execution_count": null, - "id": "333bb050", + "id": "110a5736", "metadata": {}, "outputs": [], "source": [ @@ -500,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "cf1ce6ff", + "id": "ad71a315", "metadata": {}, "source": [ "Get security insights from the NSA knowledge graph." @@ -509,7 +509,7 @@ { "cell_type": "code", "execution_count": null, - "id": "802161cf", + "id": "f3796bff", "metadata": {}, "outputs": [], "source": [ @@ -526,7 +526,7 @@ }, { "cell_type": "markdown", - "id": "fb397df0", + "id": "89151969", "metadata": {}, "source": [ "and apply this stuff to our infrastructure." @@ -535,7 +535,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2821b6c9", + "id": "b30dccc1", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/01-knowledge.ipynb b/sparql-101/notebooks/01-knowledge.ipynb index 7f18db8..6249bfd 100644 --- a/sparql-101/notebooks/01-knowledge.ipynb +++ b/sparql-101/notebooks/01-knowledge.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "d1c5d0bf", + "id": "f2b13dd0", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -21,7 +21,7 @@ }, { "cell_type": "markdown", - "id": "fe996522", + "id": "c28341fb", "metadata": { "slideshow": { "slide_type": "subslide" @@ -40,7 +40,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3953436c", + "id": "1416091d", "metadata": {}, "outputs": [], "source": [ @@ -50,7 +50,7 @@ }, { "cell_type": "markdown", - "id": "a8203d4a", + "id": "527ca417", "metadata": { "slideshow": { "slide_type": "slide" @@ -69,7 +69,7 @@ }, { "cell_type": "markdown", - "id": "58e1927e", + "id": "99d6c065", "metadata": { "slideshow": { "slide_type": "subslide" @@ -87,7 +87,7 @@ }, { "cell_type": "markdown", - "id": "1e5705ef", + "id": "5b15a248", "metadata": { "slideshow": { "slide_type": "subslide" @@ -108,7 +108,7 @@ }, { "cell_type": "markdown", - "id": "88273f32", + "id": "c4b965cb", "metadata": { "slideshow": { "slide_type": "subslide" @@ -129,7 +129,7 @@ }, { "cell_type": "markdown", - "id": "baccdc23", + "id": "29f88c14", "metadata": {}, "source": [ "```mermaid\n", @@ -140,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "81fa50ab", + "id": "387e002d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -159,7 +159,7 @@ { "cell_type": "code", "execution_count": null, - "id": "334a5a54", + "id": "5665eb72", "metadata": {}, "outputs": [], "source": [ @@ -169,7 +169,7 @@ }, { "cell_type": "markdown", - "id": "4f07d958", + "id": "78c5db50", "metadata": {}, "source": [ "We'll see how to use IRIs to express knowledge." @@ -177,7 +177,7 @@ }, { "cell_type": "markdown", - "id": "9142b96f", + "id": "a6a2f486", "metadata": { "slideshow": { "slide_type": "subslide" @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "52ab8511", + "id": "802efd52", "metadata": { "slideshow": { "slide_type": "subslide" @@ -215,7 +215,7 @@ }, { "cell_type": "markdown", - "id": "6ad16b0f", + "id": "550dd58f", "metadata": {}, "source": [ "```mermaid\n", @@ -229,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "91341303", + "id": "71d2839d", "metadata": { "slideshow": { "slide_type": "subslide" @@ -262,7 +262,7 @@ }, { "cell_type": "markdown", - "id": "bbcab3b4", + "id": "99f5a26f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -281,7 +281,7 @@ }, { "cell_type": "markdown", - "id": "8896c130", + "id": "9e287780", "metadata": {}, "source": [ "```mermaid\n", @@ -298,7 +298,7 @@ }, { "cell_type": "markdown", - "id": "44841e95", + "id": "cfaa84c0", "metadata": { "slideshow": { "slide_type": "subslide" @@ -312,7 +312,7 @@ }, { "cell_type": "markdown", - "id": "841c9991", + "id": "7cdf353a", "metadata": {}, "source": [ "```mermaid\n", @@ -326,7 +326,7 @@ }, { "cell_type": "markdown", - "id": "1ecdeb0b", + "id": "9974ed40", "metadata": { "slideshow": { "slide_type": "subslide" @@ -344,7 +344,7 @@ }, { "cell_type": "markdown", - "id": "1ca17502", + "id": "834e3a99", "metadata": {}, "source": [ "```mermaid\n", @@ -369,7 +369,7 @@ }, { "cell_type": "markdown", - "id": "0cc4365e", + "id": "44e96d14", "metadata": {}, "source": [ "This is the basis of the Semantic Web,\n", @@ -381,7 +381,7 @@ }, { "cell_type": "markdown", - "id": "696a7f3b", + "id": "d2868d6b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -415,7 +415,7 @@ }, { "cell_type": "markdown", - "id": "a4632a43", + "id": "813ec68c", "metadata": { "slideshow": { "slide_type": "subslide" @@ -438,7 +438,7 @@ }, { "cell_type": "markdown", - "id": "16fd4310", + "id": "2e5b2486", "metadata": { "slideshow": { "slide_type": "subslide" @@ -462,7 +462,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6172e4b9", + "id": "4026348b", "metadata": {}, "outputs": [], "source": [ @@ -473,7 +473,7 @@ }, { "cell_type": "markdown", - "id": "a4329758", + "id": "ce30f961", "metadata": {}, "source": [ "RDF is based on:\n", @@ -498,7 +498,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3ca2e549", + "id": "41745d8f", "metadata": {}, "outputs": [], "source": [ @@ -516,7 +516,7 @@ }, { "cell_type": "markdown", - "id": "c0b0a103", + "id": "5d744a86", "metadata": {}, "source": [ "💪: RDF elements\n", @@ -531,7 +531,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4090ac66", + "id": "455e315d", "metadata": {}, "outputs": [], "source": [ @@ -544,7 +544,7 @@ }, { "cell_type": "markdown", - "id": "4133e46f", + "id": "5b4dce92", "metadata": {}, "source": [ "### Triples\n", @@ -556,7 +556,7 @@ { "cell_type": "code", "execution_count": null, - "id": "67387380", + "id": "a39c01d6", "metadata": {}, "outputs": [], "source": [ @@ -566,7 +566,7 @@ }, { "cell_type": "markdown", - "id": "ad1d764a", + "id": "1480dca2", "metadata": {}, "source": [ "Another triple serialized in the N3 format:" @@ -575,7 +575,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bf6fc3b7", + "id": "a46f51d4", "metadata": {}, "outputs": [], "source": [ @@ -586,7 +586,7 @@ }, { "cell_type": "markdown", - "id": "a4807460", + "id": "dfd5ab89", "metadata": {}, "source": [ "The `a` keyword is a shorthand for the `rdf:type` predicate,\n", @@ -598,7 +598,7 @@ { "cell_type": "code", "execution_count": null, - "id": "edc7e61c", + "id": "57f29405", "metadata": {}, "outputs": [], "source": [ @@ -613,7 +613,7 @@ }, { "cell_type": "markdown", - "id": "f87278d4", + "id": "f21ac291", "metadata": {}, "source": [ "### Graphs\n", @@ -624,7 +624,7 @@ { "cell_type": "code", "execution_count": null, - "id": "95620b21", + "id": "a611a651", "metadata": {}, "outputs": [], "source": [ @@ -636,7 +636,7 @@ }, { "cell_type": "markdown", - "id": "79d38157", + "id": "d9776120", "metadata": {}, "source": [ "----" @@ -645,7 +645,7 @@ { "cell_type": "code", "execution_count": null, - "id": "aee14f6f", + "id": "464771b8", "metadata": {}, "outputs": [], "source": [ @@ -658,7 +658,7 @@ }, { "cell_type": "markdown", - "id": "fa16d28b", + "id": "91ee1b50", "metadata": {}, "source": [ "💪 Exercise: parse sentences\n", @@ -669,7 +669,7 @@ }, { "cell_type": "markdown", - "id": "3cf131a5", + "id": "21110729", "metadata": { "slideshow": { "slide_type": "subslide" @@ -684,7 +684,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3400b95d", + "id": "27bf2c3c", "metadata": {}, "outputs": [], "source": [ @@ -694,7 +694,7 @@ }, { "cell_type": "markdown", - "id": "51b2a035", + "id": "21cd98d6", "metadata": {}, "source": [ "💪 Exercise: take 2 minutes to map the JSON-LD format to the Turtle format.\n", @@ -704,7 +704,7 @@ }, { "cell_type": "markdown", - "id": "c0132edc", + "id": "a7fe25e9", "metadata": { "slideshow": { "slide_type": "slide" @@ -722,7 +722,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bbaf1a67", + "id": "a3afb7fd", "metadata": {}, "outputs": [], "source": [ @@ -742,7 +742,7 @@ { "cell_type": "code", "execution_count": null, - "id": "11b33829", + "id": "f9b0b011", "metadata": {}, "outputs": [], "source": [ @@ -754,7 +754,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ebf22387", + "id": "ac06bf97", "metadata": {}, "outputs": [], "source": [ @@ -764,7 +764,7 @@ }, { "cell_type": "markdown", - "id": "c7bcfc8a", + "id": "dc699c0d", "metadata": {}, "source": [ "rdflib has a set of predefined namespaces" @@ -773,7 +773,7 @@ { "cell_type": "code", "execution_count": null, - "id": "77301cad", + "id": "43d0c966", "metadata": {}, "outputs": [], "source": [ @@ -788,7 +788,7 @@ }, { "cell_type": "markdown", - "id": "3f989091", + "id": "83dc2a16", "metadata": {}, "source": [ "While" @@ -797,7 +797,7 @@ { "cell_type": "code", "execution_count": null, - "id": "530d6e7e", + "id": "d9721bf9", "metadata": {}, "outputs": [], "source": [ @@ -810,7 +810,7 @@ }, { "cell_type": "markdown", - "id": "1a1d7d62", + "id": "f60481ca", "metadata": { "slideshow": { "slide_type": "subslide" @@ -826,7 +826,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ac908e71", + "id": "a3773987", "metadata": {}, "outputs": [], "source": [ @@ -838,7 +838,7 @@ }, { "cell_type": "markdown", - "id": "49a12d76", + "id": "9bb5fc1e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -861,7 +861,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3577d291", + "id": "f7ed671e", "metadata": {}, "outputs": [], "source": [ @@ -879,7 +879,7 @@ }, { "cell_type": "markdown", - "id": "0015257e", + "id": "152b7fe5", "metadata": {}, "source": [ "💪: parse the sentences using rdflib and answer the following questions\n", @@ -892,7 +892,7 @@ { "cell_type": "code", "execution_count": null, - "id": "41bd9bbc", + "id": "313e3350", "metadata": {}, "outputs": [], "source": [ @@ -904,22 +904,23 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "8468d3e5", + "cell_type": "markdown", + "id": "5b7bf51a", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "d5370fe1", + "id": "967d5613", "metadata": {}, "source": [ "💪: use `Graph.namespaces` to get the namespaces added by the sentences above" @@ -928,7 +929,7 @@ { "cell_type": "code", "execution_count": null, - "id": "730ecc37", + "id": "2a1ba8a6", "metadata": {}, "outputs": [], "source": [ @@ -940,18 +941,19 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "e5302d86", + "cell_type": "markdown", + "id": "003ef724", "metadata": {}, - "outputs": [], "source": [ - "set(tortellini.namespaces()) - default_ns" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "b7be61cc", + "id": "c2f01c55", "metadata": {}, "source": [ "💪: serialize the above graph in JSON-LD format" @@ -960,7 +962,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a0114c99", + "id": "b1c2f7d5", "metadata": {}, "outputs": [], "source": [ @@ -969,19 +971,20 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "72b913d4", + "cell_type": "markdown", + "id": "fe72d76e", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "42c8d2e8", + "id": "f6790136", "metadata": {}, "source": [ "💪: Load the JSON-LD object in a variable\n", @@ -993,7 +996,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d08cbe3e", + "id": "e2066980", "metadata": {}, "outputs": [], "source": [ @@ -1003,19 +1006,21 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "9089419d", + "cell_type": "markdown", + "id": "9c709a1f", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "9df88769", + "id": "f5c7908a", "metadata": {}, "source": [ "💪: Get a voice from dbpedia\n", @@ -1026,7 +1031,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7c7d3816", + "id": "16f5369c", "metadata": {}, "outputs": [], "source": [ @@ -1042,7 +1047,7 @@ }, { "cell_type": "markdown", - "id": "b0fe7b28", + "id": "f8b6dfd6", "metadata": {}, "source": [ "We get a graph with the information about Tortellini." @@ -1050,7 +1055,7 @@ }, { "cell_type": "markdown", - "id": "181a02b3", + "id": "1969e4f7", "metadata": {}, "source": [ "```mermaid\n", @@ -1066,7 +1071,7 @@ }, { "cell_type": "markdown", - "id": "ee7daef7", + "id": "d5e57cd2", "metadata": {}, "source": [ "An encyclopedia voice contains a list of sentences :)" @@ -1075,7 +1080,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3d5aee78", + "id": "07b1a50f", "metadata": {}, "outputs": [], "source": [ @@ -1087,7 +1092,7 @@ }, { "cell_type": "markdown", - "id": "a989b46e", + "id": "b789d920", "metadata": {}, "source": [ "💪: counting sentences\n", @@ -1099,7 +1104,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1d13a711", + "id": "d16ee766", "metadata": {}, "outputs": [], "source": [ @@ -1107,19 +1112,20 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "795aae40", + "cell_type": "markdown", + "id": "cab6504e", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "7fc80b5b", + "id": "ff19fe23", "metadata": {}, "source": [ "----" @@ -1128,7 +1134,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7a294686", + "id": "4d8fa981", "metadata": {}, "outputs": [], "source": [ @@ -1142,7 +1148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "438a5a8d", + "id": "98faa0d9", "metadata": {}, "outputs": [], "source": [ @@ -1152,7 +1158,7 @@ }, { "cell_type": "markdown", - "id": "4fcf55f6", + "id": "926efc57", "metadata": {}, "source": [ "💪: extending graphs\n", @@ -1163,7 +1169,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b8af9627", + "id": "13f288ba", "metadata": {}, "outputs": [], "source": [ @@ -1180,7 +1186,7 @@ }, { "cell_type": "markdown", - "id": "c313592a", + "id": "eb4801ed", "metadata": {}, "source": [ "And we can connect them together" @@ -1189,7 +1195,7 @@ { "cell_type": "code", "execution_count": null, - "id": "55bf09b0", + "id": "603203eb", "metadata": {}, "outputs": [], "source": [ @@ -1201,7 +1207,7 @@ }, { "cell_type": "markdown", - "id": "c4b3907f", + "id": "20a98bcd", "metadata": {}, "source": [ "Exercise: how many sentences are there now?" @@ -1210,7 +1216,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c0118b89", + "id": "bb7fe744", "metadata": {}, "outputs": [], "source": [ @@ -1218,18 +1224,19 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "5275c828", + "cell_type": "markdown", + "id": "32599779", "metadata": {}, - "outputs": [], "source": [ - "len(g)" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "fd7d1ff2", + "id": "79c7ac0c", "metadata": {}, "source": [ "Plot the graph again to see the new nodes and\n", @@ -1239,7 +1246,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6065fbf8", + "id": "c68fab7c", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/02-semantics.ipynb b/sparql-101/notebooks/02-semantics.ipynb index a27ce2c..4f72e22 100644 --- a/sparql-101/notebooks/02-semantics.ipynb +++ b/sparql-101/notebooks/02-semantics.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "82d1e212", + "id": "3c9933e3", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -20,7 +20,7 @@ }, { "cell_type": "markdown", - "id": "e096dc31", + "id": "2426164b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -41,7 +41,7 @@ }, { "cell_type": "markdown", - "id": "a355ea28", + "id": "9b8f7704", "metadata": {}, "source": [ "```yaml\n", @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "70f9c11e", + "id": "9aac84fa", "metadata": {}, "source": [ "Is this a given name or a full name?\n", @@ -62,7 +62,7 @@ }, { "cell_type": "markdown", - "id": "98ce7856", + "id": "0b3f0b52", "metadata": { "slideshow": { "slide_type": "subslide" @@ -76,7 +76,7 @@ }, { "cell_type": "markdown", - "id": "46e5e4aa", + "id": "d271e1de", "metadata": {}, "source": [ "```mermaid\n", @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "417df745", + "id": "ab51c774", "metadata": { "slideshow": { "slide_type": "subslide" @@ -107,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "dd86770d", + "id": "59bb5adc", "metadata": {}, "source": [ "```mermaid\n", @@ -123,7 +123,7 @@ }, { "cell_type": "markdown", - "id": "0dc44d45", + "id": "57063511", "metadata": { "slideshow": { "slide_type": "subslide" @@ -143,7 +143,7 @@ }, { "cell_type": "markdown", - "id": "2f784472", + "id": "45e4b68b", "metadata": {}, "source": [ "```json\n", @@ -155,7 +155,7 @@ }, { "cell_type": "markdown", - "id": "f4e2a5d5", + "id": "16f3abbc", "metadata": { "slideshow": { "slide_type": "subslide" @@ -169,7 +169,7 @@ }, { "cell_type": "markdown", - "id": "20c250cb", + "id": "670df8d1", "metadata": {}, "source": [ "```yaml\n", @@ -184,7 +184,7 @@ }, { "cell_type": "markdown", - "id": "375cd519", + "id": "77ae5abe", "metadata": {}, "source": [ "```yaml\n", @@ -196,7 +196,7 @@ }, { "cell_type": "markdown", - "id": "5f6068ab", + "id": "53ced9a5", "metadata": { "slideshow": { "slide_type": "slide" @@ -216,7 +216,7 @@ }, { "cell_type": "markdown", - "id": "cf3aed0d", + "id": "63c03a5c", "metadata": { "slideshow": { "slide_type": "slide" @@ -234,7 +234,7 @@ }, { "cell_type": "markdown", - "id": "b77282e5", + "id": "b0fe0fb3", "metadata": {}, "source": [ "```mermaid\n", @@ -278,7 +278,7 @@ }, { "cell_type": "markdown", - "id": "8112f788", + "id": "7e978ecb", "metadata": { "slideshow": { "slide_type": "subslide" @@ -320,7 +320,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d2d43467", + "id": "9e0ed2d3", "metadata": {}, "outputs": [], "source": [ @@ -331,7 +331,7 @@ }, { "cell_type": "markdown", - "id": "0a774b07", + "id": "2247f10b", "metadata": {}, "source": [ "💪: dataset\n", @@ -340,18 +340,19 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "621d413d", + "cell_type": "markdown", + "id": "caeaebd8", "metadata": {}, - "outputs": [], "source": [ - "list(d.graphs())" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "e7d80563", + "id": "fd31ab0f", "metadata": {}, "source": [ "- add a graph to the dataset." @@ -360,7 +361,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a7d83a6c", + "id": "926d5f9d", "metadata": {}, "outputs": [], "source": [ @@ -370,44 +371,46 @@ }, { "cell_type": "markdown", - "id": "eea180ec", + "id": "971b6d59", "metadata": {}, "source": [ "- list the graphs in the dataset again, together with their identifiers." ] }, { - "cell_type": "code", - "execution_count": null, - "id": "146e95c8", + "cell_type": "markdown", + "id": "2bceda36", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "fe995623", + "id": "26c4c5a3", "metadata": {}, "source": [ "- get the `identifier` of one graph. What's its type?" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "dfd58985", + "cell_type": "markdown", + "id": "389ba759", "metadata": {}, - "outputs": [], "source": [ - "[(g.identifier.n3(), type(g.identifier) ) for g in graphs]" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "f5e3f122", + "id": "43b00153", "metadata": {}, "source": [ "Now list the graphs in the dataset:\n", @@ -417,7 +420,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a4465a11", + "id": "f703ca7f", "metadata": {}, "outputs": [], "source": [ @@ -428,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "3d568884", + "id": "c833db55", "metadata": { "slideshow": { "slide_type": "subslide" @@ -450,7 +453,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a8037d3f", + "id": "ccfd4958", "metadata": {}, "outputs": [], "source": [ @@ -477,7 +480,7 @@ }, { "cell_type": "markdown", - "id": "3b045800", + "id": "186d785d", "metadata": {}, "source": [ "- Get the URIs representing Tortellini and Food using the `Graph.subjects` and `Graph.objects` methods." @@ -486,7 +489,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5a3b34ac", + "id": "9fbd3b35", "metadata": {}, "outputs": [], "source": [ @@ -498,19 +501,20 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "7c4012bf", + "cell_type": "markdown", + "id": "a123fee7", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "acc04b33", + "id": "f703808e", "metadata": {}, "source": [ "- what's the namespace of the `Tortellini` URI?\n", @@ -529,7 +533,7 @@ }, { "cell_type": "markdown", - "id": "62a8774d", + "id": "dd5c909a", "metadata": {}, "source": [ "```yaml\n", @@ -545,7 +549,7 @@ }, { "cell_type": "markdown", - "id": "842d5a09", + "id": "f17cc267", "metadata": {}, "source": [ "Ontologies describe the semantics of digital content\n", @@ -559,7 +563,7 @@ }, { "cell_type": "markdown", - "id": "e31e2741", + "id": "65de1d13", "metadata": { "slideshow": { "slide_type": "slide" @@ -591,7 +595,7 @@ }, { "cell_type": "markdown", - "id": "5ff5ae6c", + "id": "611adab6", "metadata": {}, "source": [ "```mermaid\n", @@ -623,7 +627,7 @@ }, { "cell_type": "markdown", - "id": "7b5ebd5e", + "id": "472ccdcc", "metadata": { "slideshow": { "slide_type": "slide" @@ -642,7 +646,7 @@ }, { "cell_type": "markdown", - "id": "de663f08", + "id": "48fe2ae4", "metadata": { "slideshow": { "slide_type": "subslide" @@ -667,7 +671,7 @@ }, { "cell_type": "markdown", - "id": "04f01747", + "id": "110f0ba9", "metadata": {}, "source": [ "```turtle\n", @@ -702,7 +706,7 @@ { "cell_type": "code", "execution_count": null, - "id": "39d81b6f", + "id": "0ca64ee9", "metadata": {}, "outputs": [], "source": [ @@ -740,7 +744,7 @@ }, { "cell_type": "markdown", - "id": "c26e56a4", + "id": "1477d7d7", "metadata": {}, "source": [ "You can see vocabularies as a set of globally unique labels\n", @@ -753,7 +757,7 @@ }, { "cell_type": "markdown", - "id": "c21cc116", + "id": "36486bc4", "metadata": {}, "source": [ "```turtle\n", @@ -774,7 +778,7 @@ }, { "cell_type": "markdown", - "id": "63b08cf6", + "id": "bae91fbe", "metadata": {}, "source": [ "## Ontologies in Italy\n", @@ -788,7 +792,7 @@ }, { "cell_type": "markdown", - "id": "f6e61711", + "id": "b5cc0f52", "metadata": {}, "source": [ "```turtle\n", @@ -803,7 +807,7 @@ }, { "cell_type": "markdown", - "id": "f6dafa5b", + "id": "22a3cc32", "metadata": { "slideshow": { "slide_type": "subslide" @@ -818,7 +822,7 @@ { "cell_type": "code", "execution_count": null, - "id": "35dec9a3", + "id": "16820a0a", "metadata": {}, "outputs": [], "source": [ @@ -856,7 +860,7 @@ }, { "cell_type": "markdown", - "id": "b46ea06b", + "id": "38397c97", "metadata": {}, "source": [ "\n", @@ -870,7 +874,7 @@ { "cell_type": "code", "execution_count": null, - "id": "70c308e5", + "id": "fb36935f", "metadata": {}, "outputs": [], "source": [ diff --git a/sparql-101/notebooks/05-sparql.ipynb b/sparql-101/notebooks/05-sparql.ipynb index 958e985..b9dff33 100644 --- a/sparql-101/notebooks/05-sparql.ipynb +++ b/sparql-101/notebooks/05-sparql.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "aa06055a", + "id": "fd9c1f35", "metadata": {}, "source": [ "# SparQL 101\n", @@ -21,7 +21,7 @@ }, { "cell_type": "markdown", - "id": "677de056", + "id": "cb3d0791", "metadata": { "slideshow": { "slide_type": "slide" @@ -40,7 +40,7 @@ }, { "cell_type": "markdown", - "id": "c442f034", + "id": "531f5d9c", "metadata": { "slideshow": { "slide_type": "slide" @@ -73,7 +73,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d9714e66", + "id": "ac9385aa", "metadata": {}, "outputs": [], "source": [ @@ -83,25 +83,26 @@ }, { "cell_type": "markdown", - "id": "98529189", + "id": "ba5a7635", "metadata": {}, "source": [ "Exercise: list the graphs in the dataset." ] }, { - "cell_type": "code", - "execution_count": null, - "id": "5dd3197c", + "cell_type": "markdown", + "id": "0273eae6", "metadata": {}, - "outputs": [], "source": [ - "list(d.graphs())" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "d88a3a67", + "id": "084bf9ea", "metadata": { "slideshow": { "slide_type": "subslide" @@ -117,7 +118,7 @@ { "cell_type": "code", "execution_count": null, - "id": "722c33c2", + "id": "6b1c16a0", "metadata": {}, "outputs": [], "source": [ @@ -138,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "e724c8df", + "id": "fabe6d96", "metadata": { "slideshow": { "slide_type": "subslide" @@ -159,7 +160,7 @@ { "cell_type": "code", "execution_count": null, - "id": "35ad0674", + "id": "3923336b", "metadata": {}, "outputs": [], "source": [ @@ -172,7 +173,7 @@ }, { "cell_type": "markdown", - "id": "b2795947", + "id": "b454b2cf", "metadata": {}, "source": [ "Use our utility function to print the graph." @@ -181,7 +182,7 @@ { "cell_type": "code", "execution_count": null, - "id": "64b3bb98", + "id": "f75399d1", "metadata": {}, "outputs": [], "source": [ @@ -192,7 +193,7 @@ }, { "cell_type": "markdown", - "id": "5fffc247", + "id": "a8a31058", "metadata": {}, "source": [ "That's what we have" @@ -200,7 +201,7 @@ }, { "cell_type": "markdown", - "id": "cfc68600", + "id": "e060d424", "metadata": {}, "source": [ "```mermaid\n", @@ -217,7 +218,7 @@ }, { "cell_type": "markdown", - "id": "b3ffdc2b", + "id": "3c0449bb", "metadata": {}, "source": [ "List all entries from th `_:sample` graph." @@ -226,7 +227,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bd734dd7", + "id": "0cd319ab", "metadata": {}, "outputs": [], "source": [ @@ -243,7 +244,7 @@ }, { "cell_type": "markdown", - "id": "149dddd4", + "id": "2a5f138c", "metadata": {}, "source": [ "Exercise:\n", @@ -259,7 +260,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3e9216b1", + "id": "e4d757b9", "metadata": {}, "outputs": [], "source": [ @@ -272,7 +273,7 @@ }, { "cell_type": "markdown", - "id": "70088f4f", + "id": "085a95c3", "metadata": {}, "source": [ "- Replace `?subject` with `?foo`:\n", @@ -289,7 +290,7 @@ { "cell_type": "code", "execution_count": null, - "id": "15461e16", + "id": "217e3066", "metadata": {}, "outputs": [], "source": [ @@ -308,7 +309,7 @@ }, { "cell_type": "markdown", - "id": "766cc8b1", + "id": "47725191", "metadata": {}, "source": [ "To restrict the query to a specific resource,\n", @@ -318,7 +319,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1fe20a4e", + "id": "36f1289a", "metadata": {}, "outputs": [], "source": [ @@ -338,7 +339,7 @@ }, { "cell_type": "markdown", - "id": "50de1f78", + "id": "4f77408f", "metadata": {}, "source": [ "We can use `FILTER` to restrict the results\n", @@ -348,7 +349,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0a7671f8", + "id": "a3e9f1dd", "metadata": {}, "outputs": [], "source": [ @@ -370,7 +371,7 @@ }, { "cell_type": "markdown", - "id": "f8e286cd", + "id": "84c41312", "metadata": {}, "source": [ "### GROUP BY triples\n", @@ -382,7 +383,7 @@ { "cell_type": "code", "execution_count": null, - "id": "507e57db", + "id": "5d82fe34", "metadata": {}, "outputs": [], "source": [ @@ -402,7 +403,7 @@ }, { "cell_type": "markdown", - "id": "3d92b8f7", + "id": "b1b769d3", "metadata": {}, "source": [ "Note that the count_ value references\n", @@ -417,7 +418,7 @@ { "cell_type": "code", "execution_count": null, - "id": "44433c74", + "id": "703850df", "metadata": {}, "outputs": [], "source": [ @@ -427,7 +428,7 @@ }, { "cell_type": "markdown", - "id": "7ed0cfc5", + "id": "2080636c", "metadata": {}, "source": [ "### Multi-graph datasets\n", @@ -438,7 +439,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4e64eeb3", + "id": "13f58d69", "metadata": {}, "outputs": [], "source": [ @@ -448,7 +449,7 @@ }, { "cell_type": "markdown", - "id": "c058c8da", + "id": "148874c8", "metadata": {}, "source": [ "That's what we have" @@ -456,7 +457,7 @@ }, { "cell_type": "markdown", - "id": "40bc0259", + "id": "b7831cc2", "metadata": {}, "source": [ "```mermaid\n", @@ -475,7 +476,7 @@ }, { "cell_type": "markdown", - "id": "4da2d2ad", + "id": "89649f43", "metadata": {}, "source": [ "### Querying the whole dataset\n", @@ -486,7 +487,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0fb861b0", + "id": "fab0de10", "metadata": {}, "outputs": [], "source": [ @@ -502,7 +503,7 @@ }, { "cell_type": "markdown", - "id": "32a39db2", + "id": "f68726db", "metadata": {}, "source": [ "Now, try to query each graph" @@ -511,7 +512,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a013765d", + "id": "5cc41d80", "metadata": {}, "outputs": [], "source": [ @@ -521,7 +522,7 @@ }, { "cell_type": "markdown", - "id": "e4a31b0d", + "id": "876e5fe0", "metadata": {}, "source": [ ":warning: By default, the `Dataset` queries *the default graph*\n", @@ -531,7 +532,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c111a1f5", + "id": "5ac41aa7", "metadata": {}, "outputs": [], "source": [ @@ -547,7 +548,7 @@ }, { "cell_type": "markdown", - "id": "f3029197", + "id": "f66a5926", "metadata": {}, "source": [ "Now I can query all the graphs in the dataset" @@ -556,7 +557,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6a82a88c", + "id": "d07be19c", "metadata": {}, "outputs": [], "source": [ @@ -572,7 +573,7 @@ }, { "cell_type": "markdown", - "id": "4c6ba231", + "id": "0e23f677", "metadata": {}, "source": [ "Query the classes used in the dataset." @@ -581,7 +582,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a86d331e", + "id": "f3330620", "metadata": {}, "outputs": [], "source": [ @@ -600,7 +601,7 @@ }, { "cell_type": "markdown", - "id": "abb878c7", + "id": "7f47e36c", "metadata": {}, "source": [ "Exercise:\n", @@ -610,12 +611,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "c9a8f11d", + "cell_type": "markdown", + "id": "99489339", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "a47bf0f6", + "id": "dea6032e", "metadata": {}, "source": [ "Querying triples in a specific graph:" @@ -640,7 +642,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6206fddf", + "id": "a9003d78", "metadata": {}, "outputs": [], "source": [ @@ -659,7 +661,7 @@ }, { "cell_type": "markdown", - "id": "01da25a9", + "id": "d4e7b680", "metadata": {}, "source": [ "💪 Exercise: querying the dataset\n", @@ -677,7 +679,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1824fe46", + "id": "f88b827d", "metadata": {}, "outputs": [], "source": [ @@ -686,12 +688,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "cf52b896", + "cell_type": "markdown", + "id": "582970e7", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "aeb7c8fa", + "id": "187cbbed", "metadata": {}, "source": [ "- query the `_:simpsons` graph\n", @@ -720,12 +723,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "cbfd90b2", + "cell_type": "markdown", + "id": "a8b21945", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "058fe130", + "id": "39b7646b", "metadata": { "slideshow": { "slide_type": "subslide" @@ -767,7 +771,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c88a8259", + "id": "9b3a0c14", "metadata": {}, "outputs": [], "source": [ @@ -785,7 +789,7 @@ }, { "cell_type": "markdown", - "id": "33883962", + "id": "010d1f79", "metadata": {}, "source": [ "The SparQL `UPDATE` command updates a graph.\n", @@ -795,7 +799,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a289722a", + "id": "a87cc989", "metadata": {}, "outputs": [], "source": [ @@ -824,25 +828,26 @@ }, { "cell_type": "markdown", - "id": "4b8881ae", + "id": "b3996783", "metadata": {}, "source": [ "💪: check the graph" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "41c21627", + "cell_type": "markdown", + "id": "8e09327a", "metadata": {}, - "outputs": [], "source": [ - "assert \"Homer Simpson\" in simpsons.serialize(format=\"turtle\")" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "ae886777", + "id": "e529ce6a", "metadata": {}, "source": [ "### The `/` and the `*` predicate modifiers\n", @@ -860,7 +865,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b11407af", + "id": "20e74514", "metadata": {}, "outputs": [], "source": [ @@ -878,7 +883,7 @@ }, { "cell_type": "markdown", - "id": "572fb8b8", + "id": "c02e73b1", "metadata": {}, "source": [ "In this case `foaf:name` has a very specific meaning.\n", @@ -893,7 +898,7 @@ }, { "cell_type": "markdown", - "id": "d540b1d5", + "id": "56b473bd", "metadata": { "slideshow": { "slide_type": "subslide" @@ -910,7 +915,7 @@ }, { "cell_type": "markdown", - "id": "8f72c66a", + "id": "31bdbfef", "metadata": {}, "source": [ "```mermaid\n", @@ -933,7 +938,7 @@ { "cell_type": "code", "execution_count": null, - "id": "db38ef14", + "id": "312b0c28", "metadata": {}, "outputs": [], "source": [ @@ -953,7 +958,7 @@ }, { "cell_type": "markdown", - "id": "1e08ca36", + "id": "5a53c1a1", "metadata": {}, "source": [ "The `*` operator matches a predicate\n", @@ -968,12 +973,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "d21e877c", + "cell_type": "markdown", + "id": "0d275715", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "57e9df86", + "id": "b4556879", "metadata": {}, "source": [ "SparQL supports GROUP BY and ORDER BY clauses." @@ -999,7 +1005,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6513a9db", + "id": "d9dcad6f", "metadata": {}, "outputs": [], "source": [ @@ -1023,7 +1029,7 @@ }, { "cell_type": "markdown", - "id": "80980098", + "id": "9b52481f", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1039,7 +1045,7 @@ { "cell_type": "code", "execution_count": null, - "id": "59aaa12a", + "id": "75393b97", "metadata": {}, "outputs": [], "source": [ @@ -1065,7 +1071,7 @@ }, { "cell_type": "markdown", - "id": "eda3d655", + "id": "0341a933", "metadata": {}, "source": [ "Since we are not interested in the `user2` variable,\n", @@ -1076,7 +1082,7 @@ { "cell_type": "code", "execution_count": null, - "id": "317234d9", + "id": "1138227e", "metadata": {}, "outputs": [], "source": [ @@ -1099,7 +1105,7 @@ }, { "cell_type": "markdown", - "id": "8ff86149", + "id": "6b7a7387", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1115,7 +1121,7 @@ { "cell_type": "code", "execution_count": null, - "id": "328e686c", + "id": "fa4f2d2f", "metadata": {}, "outputs": [], "source": [ @@ -1141,7 +1147,7 @@ }, { "cell_type": "markdown", - "id": "6163ee87", + "id": "ddb7e736", "metadata": {}, "source": [ "Exercise:\n", @@ -1152,7 +1158,7 @@ }, { "cell_type": "markdown", - "id": "77098854", + "id": "550cea46", "metadata": { "slideshow": { "slide_type": "slide" @@ -1174,7 +1180,7 @@ }, { "cell_type": "markdown", - "id": "5b3fa776", + "id": "a9c7f72f", "metadata": {}, "source": [ "```sparql\n", @@ -1189,7 +1195,7 @@ }, { "cell_type": "markdown", - "id": "a119458f", + "id": "5ec53ef7", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1203,7 +1209,7 @@ }, { "cell_type": "markdown", - "id": "ee8ef490", + "id": "644957a1", "metadata": {}, "source": [ "```sparql\n", @@ -1220,7 +1226,7 @@ }, { "cell_type": "markdown", - "id": "b69e9a9e", + "id": "fb730576", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1234,7 +1240,7 @@ }, { "cell_type": "markdown", - "id": "e89110bb", + "id": "f465f10c", "metadata": {}, "source": [ "```sparql\n", @@ -1255,7 +1261,7 @@ }, { "cell_type": "markdown", - "id": "b1f30cb6", + "id": "f3fac446", "metadata": {}, "source": [ "... with their deathplaces" @@ -1263,7 +1269,7 @@ }, { "cell_type": "markdown", - "id": "379735fa", + "id": "22d2ade2", "metadata": {}, "source": [ "```sparql\n", @@ -1285,7 +1291,7 @@ }, { "cell_type": "markdown", - "id": "9a5a996d", + "id": "59ba92f3", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1299,7 +1305,7 @@ }, { "cell_type": "markdown", - "id": "e111aabf", + "id": "7653f174", "metadata": {}, "source": [ "```sparql\n", @@ -1321,7 +1327,7 @@ }, { "cell_type": "markdown", - "id": "67e548a2", + "id": "c5c97472", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1339,7 +1345,7 @@ }, { "cell_type": "markdown", - "id": "182af075", + "id": "654b77e8", "metadata": {}, "source": [ "```sparql\n", @@ -1363,7 +1369,7 @@ }, { "cell_type": "markdown", - "id": "dd841e82", + "id": "0b8829da", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1379,7 +1385,7 @@ }, { "cell_type": "markdown", - "id": "360eed31", + "id": "cf83510e", "metadata": {}, "source": [ "```sparql\n", @@ -1405,7 +1411,7 @@ }, { "cell_type": "markdown", - "id": "95ec7175", + "id": "c139df35", "metadata": { "slideshow": { "slide_type": "subslide" @@ -1419,7 +1425,7 @@ }, { "cell_type": "markdown", - "id": "c7d6c9d5", + "id": "3dc3bafa", "metadata": {}, "source": [ "```sparql\n", @@ -1445,7 +1451,7 @@ }, { "cell_type": "markdown", - "id": "64279728", + "id": "870b148e", "metadata": {}, "source": [ "## Closing question\n", diff --git a/sparql-101/notebooks/07-jsonld.ipynb b/sparql-101/notebooks/07-jsonld.ipynb index 142ef41..f429334 100644 --- a/sparql-101/notebooks/07-jsonld.ipynb +++ b/sparql-101/notebooks/07-jsonld.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "05db0517", + "id": "d44d6090", "metadata": {}, "source": [ "# Agenda\n", @@ -26,7 +26,7 @@ }, { "cell_type": "markdown", - "id": "61e4ef9f", + "id": "f0413d9a", "metadata": {}, "source": [ "```yaml\n", @@ -39,7 +39,7 @@ }, { "cell_type": "markdown", - "id": "1c5b8815", + "id": "06f64ca6", "metadata": {}, "source": [ "We can then add identifiers (such as UUIDs or email), to be sure that cross references\n", @@ -48,7 +48,7 @@ }, { "cell_type": "markdown", - "id": "fbc45452", + "id": "16984988", "metadata": {}, "source": [ "```yaml\n", @@ -61,7 +61,7 @@ }, { "cell_type": "markdown", - "id": "b97369ac", + "id": "3c1091f8", "metadata": {}, "source": [ "Now we may have different datasets, such as the Springfield Elementary\n", @@ -71,7 +71,7 @@ }, { "cell_type": "markdown", - "id": "3c907efb", + "id": "492c9072", "metadata": {}, "source": [ "```yaml\n", @@ -84,7 +84,7 @@ }, { "cell_type": "markdown", - "id": "6bd8ea88", + "id": "3eea4446", "metadata": {}, "source": [ "So we actually store data, but we lack knowledge.\n", @@ -101,7 +101,7 @@ }, { "cell_type": "markdown", - "id": "369ecb51", + "id": "f8c49050", "metadata": {}, "source": [ "----" @@ -110,7 +110,7 @@ { "cell_type": "code", "execution_count": null, - "id": "aad603f4", + "id": "1671ebf1", "metadata": {}, "outputs": [], "source": [ @@ -124,7 +124,7 @@ }, { "cell_type": "markdown", - "id": "82d738a1", + "id": "33ae7193", "metadata": {}, "source": [ "JSON-LD associates it with a context that disambiguates information" @@ -133,7 +133,7 @@ { "cell_type": "code", "execution_count": null, - "id": "37f97232", + "id": "ad2a5eba", "metadata": {}, "outputs": [], "source": [ @@ -154,7 +154,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b0990eb6", + "id": "d64d59dc", "metadata": {}, "outputs": [], "source": [ @@ -166,7 +166,7 @@ }, { "cell_type": "markdown", - "id": "c93c1975", + "id": "e593f1c1", "metadata": {}, "source": [ "Exercise:\n", @@ -176,21 +176,22 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "f1e5b20e", + "cell_type": "markdown", + "id": "0a77f38c", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "d115de2b", + "id": "ef8cafbf", "metadata": { "slideshow": { "slide_type": "slide" @@ -212,7 +213,7 @@ }, { "cell_type": "markdown", - "id": "0fa6fc0b", + "id": "2f61c6a9", "metadata": { "slideshow": { "slide_type": "slide" @@ -227,7 +228,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cb5bc79c", + "id": "cd509e69", "metadata": {}, "outputs": [], "source": [ @@ -241,7 +242,7 @@ }, { "cell_type": "markdown", - "id": "8c3b2314", + "id": "fcf1113c", "metadata": {}, "source": [ "Annotate it with schema.org." @@ -250,7 +251,7 @@ { "cell_type": "code", "execution_count": null, - "id": "817ecccc", + "id": "82159a19", "metadata": {}, "outputs": [], "source": [ @@ -266,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ca71f476", + "id": "65298ca8", "metadata": {}, "outputs": [], "source": [ @@ -281,7 +282,7 @@ }, { "cell_type": "markdown", - "id": "7d9b5dc0", + "id": "d85205e3", "metadata": {}, "source": [ "Exercise:\n", @@ -294,7 +295,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8fa07e34", + "id": "8ce7b1e0", "metadata": {}, "outputs": [], "source": [ @@ -316,7 +317,7 @@ }, { "cell_type": "markdown", - "id": "daa5a352", + "id": "52032152", "metadata": { "slideshow": { "slide_type": "slide" @@ -333,7 +334,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ee492479", + "id": "9941afd2", "metadata": {}, "outputs": [], "source": [ @@ -357,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "00c0443b", + "id": "f0d12045", "metadata": {}, "source": [ "Now we can serialize the graph." @@ -366,7 +367,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f1807607", + "id": "8c2131ae", "metadata": {}, "outputs": [], "source": [ @@ -378,7 +379,7 @@ }, { "cell_type": "markdown", - "id": "79ec1657", + "id": "5d1be031", "metadata": {}, "source": [ "Another localization mechanism allows\n", @@ -388,7 +389,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a7c060be", + "id": "bd9aa0bf", "metadata": {}, "outputs": [], "source": [ @@ -407,7 +408,7 @@ }, { "cell_type": "markdown", - "id": "73cd9cce", + "id": "5594b663", "metadata": { "slideshow": { "slide_type": "slide" @@ -432,7 +433,7 @@ }, { "cell_type": "markdown", - "id": "583225f0", + "id": "537713d5", "metadata": {}, "source": [ "```yaml\n", @@ -444,7 +445,7 @@ }, { "cell_type": "markdown", - "id": "fe58077a", + "id": "9fe74fde", "metadata": {}, "source": [ "Someone altering the \n", @@ -453,7 +454,7 @@ }, { "cell_type": "markdown", - "id": "f7a6ed5d", + "id": "c4d2b823", "metadata": {}, "source": [ "```yaml\n", @@ -466,7 +467,7 @@ }, { "cell_type": "markdown", - "id": "3a147fd5", + "id": "1ee374ce", "metadata": {}, "source": [ "->" @@ -474,7 +475,7 @@ }, { "cell_type": "markdown", - "id": "9f3815c3", + "id": "301a8e49", "metadata": {}, "source": [ "```yaml\n", @@ -487,7 +488,7 @@ }, { "cell_type": "markdown", - "id": "9adcdd50", + "id": "c1699fb9", "metadata": { "slideshow": { "slide_type": "subslide" diff --git a/sparql-101/notebooks/10-rdf.ipynb b/sparql-101/notebooks/10-rdf.ipynb index 59f4647..3c8ffe8 100644 --- a/sparql-101/notebooks/10-rdf.ipynb +++ b/sparql-101/notebooks/10-rdf.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "17ffc1c9", + "id": "f0371cc9", "metadata": {}, "source": [ "# Graph databases & SparQL" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "bc217bd6", + "id": "ed808af7", "metadata": { "slideshow": { "slide_type": "slide" @@ -30,7 +30,7 @@ }, { "cell_type": "markdown", - "id": "f0c6b6a0", + "id": "5b7e3363", "metadata": { "slideshow": { "slide_type": "subslide" @@ -50,7 +50,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4de2fa8f", + "id": "fc7962c0", "metadata": {}, "outputs": [], "source": [ @@ -59,7 +59,29 @@ }, { "cell_type": "markdown", - "id": "30245ba0", + "id": "4865386e", + "metadata": {}, + "source": [ + "Decompress the countries dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a1bb00f", + "metadata": {}, + "outputs": [], + "source": [ + "import gzip\n", + "from pathlib import Path\n", + "\n", + "with gzip.open('countries-skos-ap-act.ttl.gz') as f:\n", + " Path('countries-skos-ap-act.ttl').write_bytes(f.read())" + ] + }, + { + "cell_type": "markdown", + "id": "85ad8bcc", "metadata": { "slideshow": { "slide_type": "slide" @@ -93,7 +115,7 @@ }, { "cell_type": "markdown", - "id": "f7df59a5", + "id": "229885eb", "metadata": { "slideshow": { "slide_type": "subslide" @@ -116,7 +138,7 @@ }, { "cell_type": "markdown", - "id": "33d428cf", + "id": "ed65e827", "metadata": { "slideshow": { "slide_type": "subslide" @@ -141,7 +163,7 @@ { "cell_type": "code", "execution_count": null, - "id": "30d1c241", + "id": "2c7e9ff4", "metadata": {}, "outputs": [], "source": [ @@ -152,7 +174,7 @@ }, { "cell_type": "markdown", - "id": "b9b69487", + "id": "b137413d", "metadata": {}, "source": [ "Exercise:\n", @@ -162,12 +184,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "ce12fb38", + "cell_type": "markdown", + "id": "5dae2f07", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "dfdd3289", + "id": "f70d7538", "metadata": {}, "source": [ "- confront the query result with\n", @@ -189,18 +212,19 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "a823fdbd", + "cell_type": "markdown", + "id": "17182cb4", "metadata": {}, - "outputs": [], "source": [ - "print(list(d.graphs()))" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "79be2014", + "id": "9300830e", "metadata": {}, "source": [ "Let's load into it the [European vocabulary for countries](countries.ttl).\n", @@ -214,18 +238,19 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "f2a223bd", + "cell_type": "markdown", + "id": "1d25fbd6", "metadata": {}, - "outputs": [], "source": [ - "d.bind(\"eu\", \"https://publications.europa.eu/resource/authority//")" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "3924ec29", + "id": "9690a2ec", "metadata": {}, "source": [ "Once the `eu` prefix is bound,\n", @@ -236,7 +261,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2d263d2a", + "id": "aa7202c7", "metadata": {}, "outputs": [], "source": [ @@ -245,26 +270,27 @@ }, { "cell_type": "markdown", - "id": "e8833457", + "id": "168cb00f", "metadata": {}, "source": [ "- use `Dataset.graph` to create the `eu:country` graph." ] }, { - "cell_type": "code", - "execution_count": null, - "id": "7e4582cd", + "cell_type": "markdown", + "id": "dad71957", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "33a57c3e", + "id": "6b61d898", "metadata": {}, "source": [ "Let's see the performance of the default\n", @@ -274,7 +300,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cfecc183", + "id": "8e6f7430", "metadata": {}, "outputs": [], "source": [ @@ -289,7 +315,7 @@ }, { "cell_type": "markdown", - "id": "687deea7", + "id": "5b3b35f2", "metadata": {}, "source": [ "with respect to the `ox-turtle` parser." @@ -298,7 +324,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3bd043f8", + "id": "7eee8bf8", "metadata": {}, "outputs": [], "source": [ @@ -311,7 +337,7 @@ }, { "cell_type": "markdown", - "id": "11b3765d", + "id": "09015162", "metadata": {}, "source": [ "See also:\n", @@ -321,7 +347,7 @@ }, { "cell_type": "markdown", - "id": "1af361ad", + "id": "2a1ff0dd", "metadata": { "slideshow": { "slide_type": "slide" @@ -337,7 +363,7 @@ }, { "cell_type": "markdown", - "id": "efa205d9", + "id": "b1e1fe39", "metadata": {}, "source": [ "```mermaid\n", @@ -365,7 +391,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dff9d674", + "id": "5b6a537a", "metadata": {}, "outputs": [], "source": [ @@ -376,7 +402,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d17d330f", + "id": "5f9b5373", "metadata": {}, "outputs": [], "source": [ @@ -399,7 +425,7 @@ }, { "cell_type": "markdown", - "id": "a52cd8ee", + "id": "03111cd4", "metadata": {}, "source": [ "Exercise:\n", @@ -410,12 +436,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "b9fff728", + "cell_type": "markdown", + "id": "770ff8ee", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "2bb6f609", + "id": "2b5a4c10", "metadata": {}, "source": [ "- run the above query using `country:FRA` and see what happens;\n", @@ -444,12 +471,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "10ce55c1", + "cell_type": "markdown", + "id": "8c590516", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "aa9b6e0e", + "id": "b6f5e0d3", "metadata": {}, "source": [ "\n", @@ -486,7 +514,7 @@ { "cell_type": "code", "execution_count": null, - "id": "084c57ef", + "id": "ef6d6d69", "metadata": {}, "outputs": [], "source": [ @@ -518,7 +546,7 @@ }, { "cell_type": "markdown", - "id": "ffb43ba8", + "id": "997a226b", "metadata": {}, "source": [ "Let's visualize the graph." @@ -527,7 +555,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7a97e06f", + "id": "d3ebc320", "metadata": {}, "outputs": [], "source": [ @@ -539,7 +567,7 @@ }, { "cell_type": "markdown", - "id": "d4c16a2f", + "id": "15bf95a3", "metadata": {}, "source": [ "## More metadata\n", @@ -551,7 +579,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3b41a3d5", + "id": "1871f019", "metadata": {}, "outputs": [], "source": [ @@ -588,7 +616,7 @@ }, { "cell_type": "markdown", - "id": "8ccfda7e", + "id": "5f1241e7", "metadata": {}, "source": [ "In RDF, you don't have hierarchies,\n", @@ -597,7 +625,7 @@ }, { "cell_type": "markdown", - "id": "c35aa2fb", + "id": "d76ae8b4", "metadata": {}, "source": [ "```mermaid\n", diff --git a/sparql-101/notebooks/11-sparql-metadata.ipynb b/sparql-101/notebooks/11-sparql-metadata.ipynb index 7e2b34b..4f9d880 100644 --- a/sparql-101/notebooks/11-sparql-metadata.ipynb +++ b/sparql-101/notebooks/11-sparql-metadata.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "62a56dd3", + "id": "34d851fc", "metadata": {}, "source": [ "# Agenda\n", @@ -22,7 +22,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ce896bc3", + "id": "f56d0112", "metadata": {}, "outputs": [], "source": [ @@ -44,7 +44,7 @@ }, { "cell_type": "markdown", - "id": "8d905bfb", + "id": "e65da8b2", "metadata": {}, "source": [ "And query the simplest metadata:\n", @@ -54,7 +54,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dffc0765", + "id": "2132df22", "metadata": {}, "outputs": [], "source": [ @@ -72,7 +72,7 @@ }, { "cell_type": "markdown", - "id": "5b0e943e", + "id": "0092f199", "metadata": {}, "source": [ "Since we are returning just `?type`,\n", @@ -83,12 +83,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "3cb42a5d", + "cell_type": "markdown", + "id": "91a74e0c", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "761846c8", + "id": "64c83705", "metadata": {}, "source": [ "Exercise:\n", @@ -115,7 +116,7 @@ }, { "cell_type": "markdown", - "id": "c9a65b74", + "id": "07971115", "metadata": { "slideshow": { "slide_type": "subslide" @@ -131,7 +132,7 @@ { "cell_type": "code", "execution_count": null, - "id": "20bb7dd9", + "id": "069a881b", "metadata": {}, "outputs": [], "source": [ @@ -153,7 +154,7 @@ }, { "cell_type": "markdown", - "id": "5c963a97", + "id": "6703780f", "metadata": {}, "source": [ "Exercise:\n", @@ -163,12 +164,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "979bde4a", + "cell_type": "markdown", + "id": "482c6030", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "ce3c3a9e", + "id": "3db34d11", "metadata": { "slideshow": { "slide_type": "subslide" @@ -201,12 +203,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "4a12d685", + "cell_type": "markdown", + "id": "120c19be", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "e9989a1b", + "id": "91a59c40", "metadata": {}, "source": [ "Exercise:\n", @@ -229,12 +232,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "688fed99", + "cell_type": "markdown", + "id": "0d3e816f", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "5eb31008", + "id": "561f67b0", "metadata": { "slideshow": { "slide_type": "slide" @@ -268,7 +272,7 @@ }, { "cell_type": "markdown", - "id": "e9b60b14", + "id": "9c34db76", "metadata": {}, "source": [ "```mermaid\n", @@ -290,7 +294,7 @@ }, { "cell_type": "markdown", - "id": "3c37f8f4", + "id": "511e20b1", "metadata": { "slideshow": { "slide_type": "subslide" @@ -306,7 +310,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a54311b9", + "id": "c6eac828", "metadata": {}, "outputs": [], "source": [ @@ -327,7 +331,7 @@ }, { "cell_type": "markdown", - "id": "c0cfc512", + "id": "1605ceb0", "metadata": { "slideshow": { "slide_type": "slide" @@ -343,7 +347,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2db4be00", + "id": "a652ff62", "metadata": {}, "outputs": [], "source": [ @@ -366,7 +370,7 @@ }, { "cell_type": "markdown", - "id": "05ad97bf", + "id": "5c8fd5a8", "metadata": {}, "source": [ "Exercise:\n", @@ -380,7 +384,7 @@ }, { "cell_type": "markdown", - "id": "104f1b38", + "id": "5b0cdbb0", "metadata": { "slideshow": { "slide_type": "slide" @@ -396,7 +400,7 @@ }, { "cell_type": "markdown", - "id": "4483aa1b", + "id": "27049989", "metadata": { "slideshow": { "slide_type": "slide" @@ -416,7 +420,7 @@ { "cell_type": "code", "execution_count": null, - "id": "046bd31f", + "id": "44cfa61b", "metadata": {}, "outputs": [], "source": [ @@ -433,7 +437,7 @@ { "cell_type": "code", "execution_count": null, - "id": "78c3d78e", + "id": "3a7edefc", "metadata": {}, "outputs": [], "source": [ @@ -457,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "67977410", + "id": "38b622b6", "metadata": {}, "source": [ "Now we will infer how countries are modeled\n", @@ -476,7 +480,7 @@ { "cell_type": "code", "execution_count": null, - "id": "67b9f084", + "id": "e06e9fbc", "metadata": {}, "outputs": [], "source": [ @@ -496,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "7d41421e", + "id": "e530f6ad", "metadata": {}, "source": [ "The data model extracted from the graph:\n", @@ -507,7 +511,7 @@ }, { "cell_type": "markdown", - "id": "8f57c169", + "id": "5c6a90b6", "metadata": {}, "source": [ "```mermaid\n", diff --git a/sparql-101/notebooks/12-enriching-data.ipynb b/sparql-101/notebooks/12-enriching-data.ipynb index 51c6868..13902d2 100644 --- a/sparql-101/notebooks/12-enriching-data.ipynb +++ b/sparql-101/notebooks/12-enriching-data.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "685f3d33", + "id": "34e638cb", "metadata": {}, "source": [ "# Agenda\n", @@ -26,7 +26,7 @@ }, { "cell_type": "markdown", - "id": "1b3ea697", + "id": "9ba4d24e", "metadata": { "slideshow": { "slide_type": "subslide" @@ -65,7 +65,7 @@ }, { "cell_type": "markdown", - "id": "32763e77", + "id": "c7303a4e", "metadata": {}, "source": [ "```mermaid\n", @@ -98,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "015a94fc", + "id": "bf9dcb8d", "metadata": { "slideshow": { "slide_type": "slide" @@ -116,7 +116,7 @@ { "cell_type": "code", "execution_count": null, - "id": "59865da3", + "id": "f11ca71a", "metadata": {}, "outputs": [], "source": [ @@ -130,7 +130,7 @@ }, { "cell_type": "markdown", - "id": "eae85033", + "id": "a0ce9a42", "metadata": {}, "source": [ "Add a context to map the keys to IRIs." @@ -139,7 +139,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e59e54ad", + "id": "b13fe8a6", "metadata": {}, "outputs": [], "source": [ @@ -158,7 +158,7 @@ }, { "cell_type": "markdown", - "id": "5ccbfb86", + "id": "6b589b41", "metadata": {}, "source": [ "Now assemble everything in a JSON-LD graph" @@ -167,7 +167,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b9bc5a9c", + "id": "c36be5ad", "metadata": {}, "outputs": [], "source": [ @@ -180,7 +180,7 @@ }, { "cell_type": "markdown", - "id": "9d47b64e", + "id": "58ed2a90", "metadata": {}, "source": [ "Exercise:\n", @@ -189,22 +189,23 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "cafa6de0", + "cell_type": "markdown", + "id": "70828132", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "7f6ef27c", + "id": "152bfd03", "metadata": {}, "source": [ "Now create a dataset." @@ -213,7 +214,7 @@ { "cell_type": "code", "execution_count": null, - "id": "54da4cb7", + "id": "242f4da6", "metadata": {}, "outputs": [], "source": [ @@ -225,7 +226,7 @@ }, { "cell_type": "markdown", - "id": "91e16d60", + "id": "f90a47bc", "metadata": {}, "source": [ "and bind the selected namespaces" @@ -234,7 +235,7 @@ { "cell_type": "code", "execution_count": null, - "id": "50da8a2e", + "id": "6d379d1a", "metadata": {}, "outputs": [], "source": [ @@ -247,7 +248,7 @@ }, { "cell_type": "markdown", - "id": "518f0b96", + "id": "d315ddf7", "metadata": {}, "source": [ "Exercise:\n", @@ -256,18 +257,19 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "bd4497ea", + "cell_type": "markdown", + "id": "165477c4", "metadata": {}, - "outputs": [], "source": [ - "list(d.graphs())" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "65461b89", + "id": "2165df13", "metadata": {}, "source": [ "Now load the JSON-LD data into a graph." @@ -276,7 +278,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dd3ad003", + "id": "e0850235", "metadata": {}, "outputs": [], "source": [ @@ -288,7 +290,7 @@ }, { "cell_type": "markdown", - "id": "4db3cf56", + "id": "874c5d2a", "metadata": {}, "source": [ "Exercise:\n", @@ -297,36 +299,38 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "c0dbffcb", + "cell_type": "markdown", + "id": "50e7f0c3", "metadata": {}, - "outputs": [], "source": [ - "[t for t in d]" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "59a88642", + "id": "0e3a49be", "metadata": {}, "source": [ "- list the triples in the `urn:People` graph;" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "60503a6c", + "cell_type": "markdown", + "id": "45508908", "metadata": {}, - "outputs": [], "source": [ - "[t for t in people]" + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "cc311ad7", + "id": "4afa8533", "metadata": {}, "source": [ "Load the countries vocabulary in a new graph." @@ -335,7 +339,7 @@ { "cell_type": "code", "execution_count": null, - "id": "82b6311c", + "id": "e929b26f", "metadata": {}, "outputs": [], "source": [ @@ -345,7 +349,7 @@ }, { "cell_type": "markdown", - "id": "4981e6af", + "id": "e7883bfa", "metadata": {}, "source": [ "Now we have a graph to enrich with external data.\n", @@ -358,7 +362,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3949b0e8", + "id": "15784de1", "metadata": {}, "outputs": [], "source": [ @@ -393,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "ac9e24d2", + "id": "027fbb4b", "metadata": {}, "source": [ "Exercise:\n", @@ -408,7 +412,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d0324993", + "id": "791b109e", "metadata": {}, "outputs": [], "source": [ @@ -443,7 +447,7 @@ }, { "cell_type": "markdown", - "id": "46fe071b", + "id": "ea37d583", "metadata": {}, "source": [ "Now we can see the country identifier in the graph." @@ -452,7 +456,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ce9e6aaf", + "id": "daf03ab6", "metadata": {}, "outputs": [], "source": [ @@ -461,7 +465,7 @@ }, { "cell_type": "markdown", - "id": "b6f1c90e", + "id": "b105e247", "metadata": {}, "source": [ "Now, we can even have a \"fat\" graph with all the information" @@ -470,7 +474,7 @@ { "cell_type": "code", "execution_count": null, - "id": "353d364e", + "id": "cdddf644", "metadata": {}, "outputs": [], "source": [ @@ -496,7 +500,7 @@ }, { "cell_type": "markdown", - "id": "7a57a73a", + "id": "b2ffb8a3", "metadata": {}, "source": [ "Exercise:\n", @@ -505,19 +509,20 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "09d17c46", + "cell_type": "markdown", + "id": "a472c070", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] }, { "cell_type": "markdown", - "id": "6c250d1c", + "id": "9a411c87", "metadata": {}, "source": [ "We can also mangle the data a bit..." @@ -526,7 +531,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f143fa2a", + "id": "119fd418", "metadata": {}, "outputs": [], "source": [ @@ -556,7 +561,7 @@ }, { "cell_type": "markdown", - "id": "b0105f52", + "id": "87438ab5", "metadata": {}, "source": [ "Exercise:\n", @@ -566,7 +571,7 @@ }, { "cell_type": "markdown", - "id": "43941918", + "id": "1ac146c8", "metadata": {}, "source": [ "```turtle\n", @@ -580,7 +585,7 @@ }, { "cell_type": "markdown", - "id": "299b9adf", + "id": "67a6682e", "metadata": {}, "source": [ "with the following **one**: does it work?" @@ -588,7 +593,7 @@ }, { "cell_type": "markdown", - "id": "57e0b26d", + "id": "6951db80", "metadata": {}, "source": [ "```turtle\n", @@ -601,12 +606,12 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "61dc33f2", + "cell_type": "markdown", + "id": "efaf1ad7", "metadata": {}, - "outputs": [], "source": [ + "Double-click for solution :)\n", + "" ] } ], diff --git a/sparql-101/notebooks/13-enriching-data.ipynb b/sparql-101/notebooks/13-enriching-data.ipynb new file mode 100644 index 0000000..5c8d171 --- /dev/null +++ b/sparql-101/notebooks/13-enriching-data.ipynb @@ -0,0 +1,578 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7b517621", + "metadata": {}, + "source": [ + "# Agenda\n", + "\n", + "- Enriching data with external knowledge\n", + "\n", + "\n", + "## A real-life example: kubernetes infrastructure\n", + "\n", + "Kubernetes is a resource orchestrator where you\n", + "describe resources in terms of\n", + "container images, ram, cpu, network." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec7ca5ef", + "metadata": {}, + "outputs": [], + "source": [ + "!cat guestbook-all-in-one.yaml" + ] + }, + { + "cell_type": "markdown", + "id": "07c5d59d", + "metadata": {}, + "source": [ + "[d3fendtools](https://github.com/par-tec/d3fend-tools)\n", + "converts a Kubernetes YAML file to an RDF graph.\n", + "\n", + "Let's load one." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d4645cc", + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib import Dataset\n", + "d = Dataset(store='Oxigraph', default_union=True)\n", + "kube = d.graph(\"urn:my_app\")\n", + "kube.parse(\"guestbook.ttl\", format=\"turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "8d507af4", + "metadata": {}, + "source": [ + "Exercise: display the graph using `tools.plot_graph`" + ] + }, + { + "cell_type": "markdown", + "id": "e64dc691", + "metadata": {}, + "source": [ + "Double-click for solution :)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "663a3452", + "metadata": {}, + "source": [ + "## D3FEND knowledge graph\n", + "\n", + "D3FEND is a cybersecurity knowledge graph\n", + "containing a taxonomy of:\n", + "\n", + "- digital artifacts (e.g., Server, Database, etc.);\n", + "- defensive techniques (e.g., Multifactor Authentication, Network Isolation, File Analysis, etc.);\n", + "- offensive techniques (e.g., Phishing, Content Injection, etc.).\n", + "\n", + "Let's load the D3FEND graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2111d8df", + "metadata": {}, + "outputs": [], + "source": [ + "d.bind(\"d3f\", \"http://d3fend.mitre.org/ontologies/d3fend.owl#\")\n", + "d3fend = d.graph(\"http://d3fend.mitre.org/ontologies/d3fend.owl/")\n", + "d3fend.parse(\"d3fend.ttl\", format=\"ox-turtle\")" + ] + }, + { + "cell_type": "markdown", + "id": "f7b0ce73", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- list digital artifacts" + ] + }, + { + "cell_type": "markdown", + "id": "8baa626c", + "metadata": {}, + "source": [ + "Double-click for solution :)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "3c6d516b", + "metadata": {}, + "source": [ + "- use the `rdfs:subClassOf` predicate to list the\n", + "subclasses of `d3f:Server`" + ] + }, + { + "cell_type": "markdown", + "id": "45b34b29", + "metadata": {}, + "source": [ + "Double-click for solution :)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "267464f0", + "metadata": {}, + "source": [ + "Now we use `CONSTRUCT` to create a graph of the subclasses of `d3f:Server`" + ] + }, + { + "cell_type": "markdown", + "id": "f4b8fecd", + "metadata": {}, + "source": [ + "Double-click for solution :)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "71bc7e0a", + "metadata": {}, + "source": [ + "Exercise: display the graph of subclasses of `d3f:Server`" + ] + }, + { + "cell_type": "markdown", + "id": "c7505cdf", + "metadata": {}, + "source": [ + "Double-click for solution :)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "692dce70", + "metadata": {}, + "source": [ + "- list defensive techniques that are subclasses with `d3f:FileAnalysis`\n", + " together with their `d3f:definition`s" + ] + }, + { + "cell_type": "markdown", + "id": "eac676d7", + "metadata": {}, + "source": [ + "Double-click for solution :)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "ec999ecd", + "metadata": {}, + "source": [ + "Now, let's list the defensive techniques associated with the `d3f:Server` artifact." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "356aac61", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?technique\n", + " ?artifact\n", + "WHERE {\n", + " ?technique rdfs:subClassOf* d3f:DefensiveTechnique .\n", + " ?artifact rdfs:subClassOf* d3f:Server .\n", + "\n", + " ?technique ?protects ?artifact .\n", + "}\n", + "\"\"\"\n", + "result = d.query(q)\n", + "for r in result:\n", + " print(f\"{r.technique} protects {r.artifact}\")" + ] + }, + { + "cell_type": "markdown", + "id": "1cae3b18", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- show the `rdfs:label` of the `?technique`" + ] + }, + { + "cell_type": "markdown", + "id": "07e23ef1", + "metadata": {}, + "source": [ + "Double-click for solution :)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "23da73a2", + "metadata": {}, + "source": [ + "- replace `d3f:DefensiveTechnique` with `d3f:OffensiveTechnique`\n", + " and list offensive techniques that affect the `d3f:Server` artifact" + ] + }, + { + "cell_type": "markdown", + "id": "6bd8ac48", + "metadata": {}, + "source": [ + "Double-click for solution :)\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "8e344e0d", + "metadata": {}, + "source": [ + "## Packing it all together\n", + "\n", + "Let's look at our dataset now:\n", + "\n", + "- one contains our application infrastructure;\n", + "- one contains cybersecurity knowledge, including\n", + " artifacts, offensive and defensive techniques." + ] + }, + { + "cell_type": "markdown", + "id": "0eabd8b1", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "\n", + "subgraph dataset\n", + " subgraph d3fend\n", + " d3f:Credential -.-> d3f:DigitalArtifact\n", + " d3f:WebServer -.-> d3f:Server -.-> d3f:DigitalArtifact\n", + " d3f:CredentialRotation([d3f:CredentialRotation]) ==>|defends| d3f:Credential\n", + " d3f:UnsecuredCredential>d3f:UnsecuredCredential] ==>|attacks| d3f:Credential\n", + " end\n", + "\n", + " subgraph kube\n", + " db_password -.->|a| k8s:Secret\n", + " app -.->|a| k8s:Deployment\n", + " end\n", + "end\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "846b493c", + "metadata": {}, + "source": [ + "The kube graph contains not only the Kubernetes resources..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79bf05a4", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "SELECT DISTINCT\n", + " ?kube\n", + "WHERE {\n", + " # Kubernetes resources.\n", + " ?kube rdfs:subClassOf* k8s:Kind .\n", + "}\n", + "\"\"\"\n", + "[str(x[0]) for x in kube.query(q)]" + ] + }, + { + "cell_type": "markdown", + "id": "96c09c0f", + "metadata": {}, + "source": [ + ".. but even links to the D3FEND graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b15f7199", + "metadata": {}, + "outputs": [], + "source": [ + "q = \"\"\"\n", + "PREFIX k8s: \n", + "PREFIX d3f: \n", + "PREFIX rdfs: \n", + "\n", + "SELECT DISTINCT\n", + " ?kube\n", + " ?d3fend\n", + "WHERE {\n", + " # Kubernetes resources.\n", + " GRAPH {\n", + " ?kube rdfs:subClassOf* k8s:Kind ;\n", + " rdfs:subClassOf ?d3fend\n", + " .\n", + " }\n", + "\n", + " # D3FEND resources.\n", + " GRAPH {\n", + " ?d3fend rdfs:subClassOf* d3f:DigitalArtifact .\n", + " }\n", + "}\n", + "\"\"\"\n", + "for r in d.query(q):\n", + " print(\n", + " r.kube,\n", + " \"is a\",\n", + " # shorten using prefix\n", + " d.namespace_manager.curie(r.d3fend)\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "7293084d", + "metadata": {}, + "source": [ + "So we actually get links between our application\n", + "objects and the d3fend knowledge base." + ] + }, + { + "cell_type": "markdown", + "id": "e57680d7", + "metadata": {}, + "source": [ + "```mermaid\n", + "graph LR\n", + "\n", + "subgraph dataset\n", + " subgraph d3fend\n", + " d3f:Credential -.-> d3f:DigitalArtifact\n", + " d3f:ContainerImage -.-> d3f:Server -.-> d3f:DigitalArtifact\n", + " d3f:CredentialRotation([d3f:CredentialRotation]) ==>|defends| d3f:Credential\n", + " d3f:UnsecuredCredential>d3f:UnsecuredCredential] ==>|attacks| d3f:Credential\n", + " d3f:Container\n", + " end\n", + "\n", + " subgraph kube\n", + " db_password -.->|a| k8s:Secret\n", + " app -->|a| k8s:Deployment\n", + " end\n", + "\n", + " k8s:Secret -.-> d3f:Credential\n", + " k8s:Deployment --> d3f:Container --> d3f:ContainerImage\n", + "end\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "9df5f796", + "metadata": {}, + "source": [ + "So we can ask for example\n", + "the attack classes towards\n", + "our components." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c79293a", + "metadata": {}, + "outputs": [], + "source": [ + "attack_surface = d.query(\"\"\"\n", + "SELECT DISTINCT\n", + " ?attack_label\n", + " ?affects\n", + " ?artifact\n", + " ?kube_resource\n", + "WHERE {\n", + "\n", + " ?kube_resource a ?kind .\n", + "\n", + " # Get digital artifacts associated with Kubernetes resources.\n", + " ?kind rdfs:subClassOf* k8s:Kind, .\n", + " ?kind rdfs:subClassOf* d3f:DigitalArtifact .\n", + " ?kind rdfs:subClassOf ?artifact .\n", + "\n", + "\n", + " ?attack\n", + " d3f:attack-id ?attack_id;\n", + " rdfs:label ?attack_label .\n", + "\n", + " ?attack ?affects ?artifact .\n", + "\n", + "}\n", + "\"\"\")\n", + "\n", + "for attack in sorted(attack_surface):\n", + " print(f\"{attack.attack_label}, \"\n", + " f\"{attack.affects.fragment} {attack.artifact.fragment} for {attack.kube_resource}\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "049da5c6", + "metadata": {}, + "source": [ + "Exercise:\n", + "\n", + "- simplify the query materializing the digital artifacts\n", + " associated with Kubernetes resources\n", + " directly at the level of the `?kube_resource`, e.g." + ] + }, + { + "cell_type": "markdown", + "id": "1b80bf61", + "metadata": {}, + "source": [ + "```turtle\n", + "# Original graph\n", + "...\n", + "k8s:Secret rdfs:subClassOf d3f:Credential ;\n", + " rdfs:subClassOf k8s:Kind .\n", + "\n", + "<:secret> a k8s:Secret .\n", + "\n", + "# Add this triple too\n", + "<:secret> a d3f:Credential .\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "7482a8b0", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "That was the last lesson:\n", + "you can mix and mingle all the information" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/tox.ini b/sparql-101/tox.ini index 2a9395c..8787302 100644 --- a/sparql-101/tox.ini +++ b/sparql-101/tox.ini @@ -4,6 +4,10 @@ skipsdist = True [testenv] deps = -r requirements.txt +allowlist_externals = + bash +commands = + bash -c ' cd notebooks && jupyter notebook . ' [testenv:make] # XXX: Update notedown so we don't need setuptools. From bc3d22b9675be4baef3741def90734065dbc2f32 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Sat, 31 May 2025 10:07:06 +0200 Subject: [PATCH 51/52] Fix intro. --- sparql-101/.dockerignore | 1 + sparql-101/00-jupyter-intro.md | 3 +- sparql-101/notebooks/00-jupyter-intro.ipynb | 209 ++++++++++++++++++++ sparql-101/notebooks/00-teaser.ipynb | 20 +- 4 files changed, 231 insertions(+), 2 deletions(-) create mode 100644 sparql-101/.dockerignore diff --git a/sparql-101/.dockerignore b/sparql-101/.dockerignore new file mode 100644 index 0000000..4fa1a31 --- /dev/null +++ b/sparql-101/.dockerignore @@ -0,0 +1 @@ +!requirements.txt diff --git a/sparql-101/00-jupyter-intro.md b/sparql-101/00-jupyter-intro.md index b0179dd..d418a5b 100644 --- a/sparql-101/00-jupyter-intro.md +++ b/sparql-101/00-jupyter-intro.md @@ -16,7 +16,8 @@ This is a fast-track course for high school students with math knowledge. Students are expected to type and execute cells, and share their results. -You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb). +:warning: While you can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb), +the rest of this course requires a full Jupyter environment. --- diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb index e69de29..9d3fe39 100644 --- a/sparql-101/notebooks/00-jupyter-intro.ipynb +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -0,0 +1,209 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2f4c88da", + "metadata": {}, + "source": [ + "# Knowledge Management 101\n", + "\n", + "Welcome to the Knowledge Management 101 course!\n", + "Author: " + ] + }, + { + "cell_type": "markdown", + "id": "60a617e5", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Introducing Python\n", + "\n", + "Python is an interpreted, object oriented language with\n", + "a lot of built in features.\n", + "It can be used as a calculator and for mathematical operations,\n", + "such as statistics, plotting and linear algebra.\n", + "\n", + "This is a fast-track course for high school students with math knowledge.\n", + "\n", + "Students are expected to type and execute cells, and share their results.\n", + "\n", + "You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb)." + ] + }, + { + "cell_type": "markdown", + "id": "ff6fa844", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "# Jupyter\n", + "\n", + "Is the course environment in your browser.\n", + "It requires a modern browser and an internet connection supporting\n", + "websockets. If your network setup (e.g. your proxy)\n", + "does not support websockets, you will not be able to\n", + "execute the code." + ] + }, + { + "cell_type": "markdown", + "id": "979f3e88", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "While you might find the exercises' solutions in the environment,\n", + "it is important for you to spend some time trying to do your homework!\n", + "This will help you to remember the concepts and to learn how to use the tools." + ] + }, + { + "cell_type": "markdown", + "id": "1f13f7a6", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## What can I do with Jupyter?\n", + "\n", + "You can:\n", + "\n", + "- execute the next cell with `SHIFT+ENTER` (try it now!)\n", + "\n", + "If your environment supports it, you can use features requiring\n", + "operating system access:\n", + "\n", + "- [open a (named) terminal on the local machine](/terminals/example)\n", + "- [edit an existing file](/edit/notebooks/untitled.txt)" + ] + }, + { + "cell_type": "markdown", + "id": "bb73f28a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "- add more cells with `ALT+ENTER`" + ] + }, + { + "cell_type": "markdown", + "id": "b2b12a9f", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "----\n", + "\n", + "Try to add a cell below this one and write some text in it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aab1361d", + "metadata": {}, + "outputs": [], + "source": [ + "# Add a new python cell with ALT+ENTER." + ] + }, + { + "cell_type": "markdown", + "id": "e31aeb92", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "---\n", + "\n", + "## Python terminal\n", + "\n", + "With Jupyter, you have a Python terminal at your disposal.\n", + "You can run Python code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae122857", + "metadata": {}, + "outputs": [], + "source": [ + "# You can evaluate maths and strings\n", + "s = 1\n", + "print(\"a string and the number \" + str(s))" + ] + }, + { + "cell_type": "markdown", + "id": "1fecd759", + "metadata": {}, + "source": [ + "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4edac68b", + "metadata": {}, + "outputs": [], + "source": [ + "# Evaluate this cell with SHIFT+ENTER\n", + "s = s + 1\n", + "print(\"now s is increased \" + str(s))" + ] + }, + { + "cell_type": "markdown", + "id": "cfb69cbb", + "metadata": {}, + "source": [ + "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", + "This means that sometimes, you need to \"reset\" the environment, to start from scratch.\n", + "\n", + "This can be done with the \"Kernel > Restart\" or \"Kernel > Restart & Clear output\" menu." + ] + }, + { + "cell_type": "markdown", + "id": "b3676e39", + "metadata": {}, + "source": [ + "----" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sparql-101/notebooks/00-teaser.ipynb b/sparql-101/notebooks/00-teaser.ipynb index f0b3a45..1e2fb76 100644 --- a/sparql-101/notebooks/00-teaser.ipynb +++ b/sparql-101/notebooks/00-teaser.ipynb @@ -566,7 +566,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, "nbformat": 4, "nbformat_minor": 5 } From bef0dfe0d7c8636baf9af22dfaa6f423a5b40721 Mon Sep 17 00:00:00 2001 From: Roberto Polli Date: Sat, 31 May 2025 10:40:35 +0200 Subject: [PATCH 52/52] Remove d3fendtools. --- sparql-101/00-teaser.md | 9 +- sparql-101/notebooks/00-jupyter-intro.ipynb | 31 ++--- sparql-101/notebooks/00-teaser.ipynb | 121 +++++++------------ sparql-101/notebooks/01-knowledge.ipynb | 126 +++++++++++++++++--- 4 files changed, 169 insertions(+), 118 deletions(-) diff --git a/sparql-101/00-teaser.md b/sparql-101/00-teaser.md index da26d16..9bf44c0 100644 --- a/sparql-101/00-teaser.md +++ b/sparql-101/00-teaser.md @@ -13,7 +13,7 @@ Author: - 1h. Storing data or describing knowledge? Practical use of getting security insights from data. -- Bonus track: Graphs and semantic search: mixing graphs and vector databases + ### Hints @@ -253,11 +253,8 @@ plot_graph(ret.graph, label_property=SKOS.prefLabel,) ## Transform kube infra in graph -```python -% pip install d3fendtools -``` - ---- +Once you convert your infrastructure +to a graph, you can do a lot of things! List Basic attacks on your kube infrastructure diff --git a/sparql-101/notebooks/00-jupyter-intro.ipynb b/sparql-101/notebooks/00-jupyter-intro.ipynb index 9d3fe39..677bb23 100644 --- a/sparql-101/notebooks/00-jupyter-intro.ipynb +++ b/sparql-101/notebooks/00-jupyter-intro.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "2f4c88da", + "id": "7aa138a0", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "60a617e5", + "id": "bcc8d2ae", "metadata": { "slideshow": { "slide_type": "slide" @@ -33,12 +33,13 @@ "\n", "Students are expected to type and execute cells, and share their results.\n", "\n", - "You can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb)." + ":warning: While you can open this notebook [on jupyter lite](https://jupyter.org/try-jupyter/lab/?fromURL=https://raw.githubusercontent.com/ioggstream/python-course/main/sparql-101/notebooks/00-teaser.ipynb),\n", + "the rest of this course requires a full Jupyter environment." ] }, { "cell_type": "markdown", - "id": "ff6fa844", + "id": "b1d288da", "metadata": { "slideshow": { "slide_type": "slide" @@ -58,7 +59,7 @@ }, { "cell_type": "markdown", - "id": "979f3e88", + "id": "5e3803a0", "metadata": { "slideshow": { "slide_type": "slide" @@ -74,7 +75,7 @@ }, { "cell_type": "markdown", - "id": "1f13f7a6", + "id": "38dff7ac", "metadata": { "slideshow": { "slide_type": "slide" @@ -98,7 +99,7 @@ }, { "cell_type": "markdown", - "id": "bb73f28a", + "id": "e4d37d3d", "metadata": { "slideshow": { "slide_type": "slide" @@ -112,7 +113,7 @@ }, { "cell_type": "markdown", - "id": "b2b12a9f", + "id": "660c9ab2", "metadata": { "slideshow": { "slide_type": "subslide" @@ -127,7 +128,7 @@ { "cell_type": "code", "execution_count": null, - "id": "aab1361d", + "id": "ccb5864f", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +137,7 @@ }, { "cell_type": "markdown", - "id": "e31aeb92", + "id": "60c70d66", "metadata": { "slideshow": { "slide_type": "slide" @@ -154,7 +155,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ae122857", + "id": "719b1aec", "metadata": {}, "outputs": [], "source": [ @@ -165,7 +166,7 @@ }, { "cell_type": "markdown", - "id": "1fecd759", + "id": "1e1ecdf8", "metadata": {}, "source": [ "Jupyter remembers the variables you define in a cell, so you can use them in the next cells." @@ -174,7 +175,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4edac68b", + "id": "3bfa1f72", "metadata": {}, "outputs": [], "source": [ @@ -185,7 +186,7 @@ }, { "cell_type": "markdown", - "id": "cfb69cbb", + "id": "8eb2517c", "metadata": {}, "source": [ "Since Jupyter remembers the variables, you can run the cells in any order you want.\n", @@ -196,7 +197,7 @@ }, { "cell_type": "markdown", - "id": "b3676e39", + "id": "ad1197b3", "metadata": {}, "source": [ "----" diff --git a/sparql-101/notebooks/00-teaser.ipynb b/sparql-101/notebooks/00-teaser.ipynb index 1e2fb76..3f9a209 100644 --- a/sparql-101/notebooks/00-teaser.ipynb +++ b/sparql-101/notebooks/00-teaser.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "43043d4d", + "id": "c9b66f9b", "metadata": {}, "source": [ "# Knowledge Management 101\n", @@ -13,7 +13,7 @@ }, { "cell_type": "markdown", - "id": "97353726", + "id": "5da74c02", "metadata": { "slideshow": { "slide_type": "slide" @@ -30,7 +30,7 @@ "- 1h. Storing data or describing knowledge?\n", " Practical use of getting security insights from data.\n", "\n", - "- Bonus track: Graphs and semantic search: mixing graphs and vector databases\n", + "\n", "\n", "### Hints\n", "\n", @@ -48,7 +48,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2d80072a", + "id": "ad13ef81", "metadata": {}, "outputs": [], "source": [ @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "b81ab319", + "id": "51d0f814", "metadata": {}, "source": [ "(and some graph libraries)" @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4b4a0e16", + "id": "4bd1169d", "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ { "cell_type": "code", "execution_count": null, - "id": "78750155", + "id": "d7196449", "metadata": {}, "outputs": [], "source": [ @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "8612bbff", + "id": "38fc8335", "metadata": {}, "source": [ "For example network of persons:" @@ -94,7 +94,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8a90766e", + "id": "f5d2b73f", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "393f7e50", + "id": "12fbc9d1", "metadata": {}, "source": [ "... eventually rendered as a graph ..." @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b9d55ca3", + "id": "6330e7cf", "metadata": {}, "outputs": [], "source": [ @@ -140,7 +140,7 @@ }, { "cell_type": "markdown", - "id": "87645e2c", + "id": "2d0257bd", "metadata": {}, "source": [ "Convert it in [JSON-LD](https://json-ld.org/) format:" @@ -149,7 +149,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ab42f580", + "id": "e1466b2a", "metadata": {}, "outputs": [], "source": [ @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "96e74d83", + "id": "b887604c", "metadata": {}, "source": [ "There's plenty of knowledge in the web!" @@ -168,7 +168,7 @@ { "cell_type": "code", "execution_count": null, - "id": "908bb115", + "id": "29a534ba", "metadata": {}, "outputs": [], "source": [ @@ -187,7 +187,7 @@ }, { "cell_type": "markdown", - "id": "54cb64fe", + "id": "bb32c302", "metadata": {}, "source": [ "And we can connect them together" @@ -196,7 +196,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a56717ac", + "id": "cf3f9124", "metadata": {}, "outputs": [], "source": [ @@ -211,7 +211,7 @@ }, { "cell_type": "markdown", - "id": "72a6c7e2", + "id": "82acd3c1", "metadata": {}, "source": [ "Graphs contain a lot of senteces" @@ -220,7 +220,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d6f74b87", + "id": "f34083a3", "metadata": {}, "outputs": [], "source": [ @@ -229,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "2e70df30", + "id": "74b75abc", "metadata": {}, "source": [ "but we can query them (e.g., for Italian food)" @@ -238,7 +238,7 @@ { "cell_type": "code", "execution_count": null, - "id": "96676ab5", + "id": "e411d48f", "metadata": {}, "outputs": [], "source": [ @@ -258,7 +258,7 @@ }, { "cell_type": "markdown", - "id": "c8ed6313", + "id": "c48319b2", "metadata": {}, "source": [ "and see if two resources have something in common..." @@ -267,7 +267,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fe2c9b0a", + "id": "f55d140c", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "b3ca6565", + "id": "97dbf1a3", "metadata": {}, "source": [ "We can query remote graphs (e.g., DBPedia):" @@ -294,7 +294,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2008e555", + "id": "6eb50368", "metadata": {}, "outputs": [], "source": [ @@ -319,7 +319,7 @@ }, { "cell_type": "markdown", - "id": "ef83c435", + "id": "4a4ddc5e", "metadata": {}, "source": [ "Provided by different organizations" @@ -328,7 +328,7 @@ { "cell_type": "code", "execution_count": null, - "id": "35924928", + "id": "d9442047", "metadata": {}, "outputs": [], "source": [ @@ -358,7 +358,7 @@ }, { "cell_type": "markdown", - "id": "3fd4627b", + "id": "34cf3d88", "metadata": {}, "source": [ "And their relations" @@ -367,7 +367,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9835b326", + "id": "0b1c2cf0", "metadata": {}, "outputs": [], "source": [ @@ -397,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "299b5612", + "id": "8e6e67c1", "metadata": {}, "source": [ "More relations" @@ -406,7 +406,7 @@ { "cell_type": "code", "execution_count": null, - "id": "db7e0fe5", + "id": "896eb3e0", "metadata": {}, "outputs": [], "source": [ @@ -437,7 +437,7 @@ }, { "cell_type": "markdown", - "id": "6e6fc2be", + "id": "565512e8", "metadata": { "slideshow": { "slide_type": "slide" @@ -446,29 +446,10 @@ "source": [ "---\n", "\n", - "## Transform kube infra in graph" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c7f05a0f", - "metadata": {}, - "outputs": [], - "source": [ - "% pip install d3fendtools" - ] - }, - { - "cell_type": "markdown", - "id": "e2406ac8", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "---\n", + "## Transform kube infra in graph\n", + "\n", + "Once you convert your infrastructure\n", + "to a graph, you can do a lot of things!\n", "\n", "List Basic attacks on your kube infrastructure" ] @@ -476,7 +457,7 @@ { "cell_type": "code", "execution_count": null, - "id": "110a5736", + "id": "4181d48e", "metadata": {}, "outputs": [], "source": [ @@ -500,7 +481,7 @@ }, { "cell_type": "markdown", - "id": "ad71a315", + "id": "e0b9b408", "metadata": {}, "source": [ "Get security insights from the NSA knowledge graph." @@ -509,7 +490,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f3796bff", + "id": "237e419e", "metadata": {}, "outputs": [], "source": [ @@ -526,7 +507,7 @@ }, { "cell_type": "markdown", - "id": "89151969", + "id": "d8949996", "metadata": {}, "source": [ "and apply this stuff to our infrastructure." @@ -535,7 +516,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b30dccc1", + "id": "f17c59ec", "metadata": {}, "outputs": [], "source": [ @@ -566,25 +547,7 @@ ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.10" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/sparql-101/notebooks/01-knowledge.ipynb b/sparql-101/notebooks/01-knowledge.ipynb index 6249bfd..ce73503 100644 --- a/sparql-101/notebooks/01-knowledge.ipynb +++ b/sparql-101/notebooks/01-knowledge.ipynb @@ -39,10 +39,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "1416091d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: rdflib in /usr/local/lib/python3.12/site-packages (7.1.4)\n", + "Requirement already satisfied: pyparsing<4,>=2.1.0 in /usr/local/lib/python3.12/site-packages (from rdflib) (3.2.3)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m25.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.1.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ "# rdflib is a python library to work with resources.\n", "%pip install rdflib" @@ -158,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "5665eb72", "metadata": {}, "outputs": [], @@ -461,10 +475,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "4026348b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], "source": [ "from rdflib import URIRef\n", "dog_uri = URIRef(\"https://dbpedia.org/data/Dog/")\n", @@ -497,10 +519,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "41745d8f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "_:anon\n", + "\"Mario Rossi\"\n" + ] + } + ], "source": [ "from rdflib import URIRef, Literal, BNode\n", "\n", @@ -530,10 +562,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "455e315d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"42\"^^\n", + "\"42.0\"^^\n", + "\"42\"\n", + "\"2025-05-31T08:34:49.896986\"^^\n" + ] + } + ], "source": [ "from datetime import datetime\n", "...\n", @@ -555,10 +598,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "a39c01d6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(rdflib.term.URIRef('mailto:mr@test'), rdflib.term.URIRef('https://schema.org/name'), rdflib.term.Literal('2025-05-31T08:34:49.896986', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#dateTime')))\n" + ] + } + ], "source": [ "triple = (iri, predicate_iri, literal)\n", "print(triple)" @@ -574,7 +625,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "a46f51d4", "metadata": {}, "outputs": [], @@ -597,7 +648,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "57f29405", "metadata": {}, "outputs": [], @@ -623,10 +674,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "a611a651", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "@prefix schema: .\n", + "@prefix xsd: .\n", + "\n", + " schema:name \"2025-05-31T08:34:49.896986\"^^xsd:dateTime .\n", + "\n", + "\n" + ] + } + ], "source": [ "from rdflib import Graph\n", "g = Graph()\n", @@ -644,10 +708,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "464771b8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(rdflib.term.URIRef('https://dbpedia.org/data/Tortellini'), rdflib.term.URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), rdflib.term.URIRef('https://dbpedia.org/ontology/Food'))\n" + ] + } + ], "source": [ "# Create a new graph and parse the above sentences.\n", "g = Graph()\n", @@ -1257,7 +1329,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, "nbformat": 4, "nbformat_minor": 5 }

kl0zV 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

-}7=?6&F1}$Z#N!qJl*); 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 z zAvrKEnc~c9?Y$3+&l$5b%N38n!vFZke|^ZDF>{*DDDnSZw}UHZ&dsp@<40?Yo69`! znhD_z^)~vL%)Ssb1qA$Aa9f)BaLO#{c)0vvtwFO4nD&5y1!IHo!8x?Xqp;0-wPOz+ z%>lkt4hH?AUMsHP?Xo{nExmHcU4RdE$6=uUDwui#&(j(V>MTOwwfXq1#O z$)wi~osR-NG^+1BUw6x@%>6~v6W}LuhGyJ1I8u9Yl|gkIT?_<>=}%xGtVfKyQ$uJc$?A8BiW`#Ei~MFrj!Apn(KpOB#HO_l`2fkVb4$18&V=6xy;C$ z6nQeG9nip(646_}VAs@`bm@h+yB&}_u;RI7^>1Fee*V_w-0U))709=2i-#c+&@rYh zDnRD6H_|H^kunn+(fcJ`c_)Q~6=VhqSBG!Eg860Zhp~A4ur~2#?)8CEY>Tg@0Felm zXD|vcqs3sOWzt$D;27svlR%d>$2xwrwzz?H09IKef)r92h>S%QfNEIjZyU7#>j|qrpWgb`P)W-r6gdvFotc zUoSW3tF@fD0`nER<10K9R=bb-#+4^7OTJ$E2UYp*?t*)ktM)eQUV6mS$(-Fy8`)cv z7w^@bX8|++*k4_~aQWm@OE8M&BPU8d@x(E~1aOnQRAO|afydWtm)vIP6&HGs zDJP(~Ucb9LO$4jrEDWGO9FxZn_pGalkjIWkIL$3+db(a2%WvkZkf*T&yAVXJH40UX zAQUw^N}eJiM2C)WmP|mS*1sDN-YFmVuFY#cf21`hq~5)`;odL6wuqu8Kol1?@4!k& z1~wYzTr{-VsE{k=8m3#Us^6A^?PU)dZFM6$nYIrZqeq*=B?E$KbcQRV8tKL)Imwx7 zt?nE`@S?|cY^!O12NAqX$gm~0*2t(i0I@WAY!Y;^%%Tn|APiSj&qd zp`=3k=o5*y2! zj^w$?n#@S0Emu17DFkh`0VE9pi4v5c^C&sv(V>x2Cg-hDLE)c&+o^lQnO)C&z5ASr zm{;KRR43>-8h`%14F~JQF)3Ji?HToFKWJ^W$SJBI0uofo^LLa)A_&nT1WgvIgiH27 zXY9#xWY=E5cyt_K`QB}D@q%JhjHwjQOPdogpi}T{IE$=NRngVjb-=F=iVBLe2p#B+ z{#a(WaqR$R&||mKkJ_1AaOKVeq^-6@s~pV(Dy3aHeAxJFedUAS8h2H1hJ z!fNWka_NJo7hno*-*f0l59I+n;Vf-2QauCp+(_S6}89*x{;w zd1->Z1Mq39H`IccoTrbTFsg`S2EZAYv?w&HNxSwmXWXf8V^zL0lL~$>C)=t$d3K6s zzYyD^D?A5pX=dJ~PH~P#pyfIk5ox1+`%+yEAD1zY9uyb)w_z~4Uybh1Ye7$vHF-$K zQY_-}lh7Hb0580NVXi3KBCVoyJPL+d#k8?A27y4-X>Sjrk^P^Tlk#}*L>^mmArCXT zQFiOzL|$i=o05y`s!u#uch@^GSciUbb@Xv> zF#5Q-HoEVp!^0E2_ct>eb0ygpXCoyzr7cI6b_bq(MlY9!2@FVlTY>IN!1@9>9ZTo=XtPZ`ayN z2vGzlD2cQYso?9qKmT)XU~(%`!G(kF3E8#AF~q>Ai#EL?$hA>u(kdg$P}j(%dZ+FM zsK(q9y%jyjGbG%m1lSf*r=v@Ob#ju8P)sBnnf@{_1E6nIf&A?U=r>09R_W83XkM9% z=A`V}0_j;Uc!0nJS{tG@oJUUqn8If5Sda5J#mzOS0?aQ=RBUOIBTEzI%o1RGRP!Jl zbU=yDtpcDqPmwHuuT8b!W1VHqH7If@QlYOg^?bD3X14}DemAo$XLMI;zqGs0ap(D6Sc!9 zzK3Tai#sL6w&3*-$v-(NjpIK?VnD)+8wNx>4HA)9^tiy z5@?J(*;@+6MxDGQZv_THoMMd@>X>c${q2v&jLTo8Fly~ZohPpp!JeVdySs{E_AK<}qY>Tm$T3N%W z3rJ|t=!sEI2$CF$u=w1AbL$Z1PdwP24!!F7I&k8_6A`vW)){YrQbYhDspXbaPf&pu zq}d#m^%O^L)Ya%-e-`b+a&MAL;NR~PUt2i6vn+XO$sz|4(=v4iqD_832^`IWhpyoDU``P!F*@m!OAUH4AR2U8yf`3k zo|(fz^W2Q(KGZIpzjgiG#S53u%m6PxU~BMV)IwT9AqJuY*D)H;qKejuMn*9gb#07` zx;9217Ef6i{$}*huh*d(-G5x$_2i)FSjIq43q*4-rF;RzgvV*eUPuet>TD#r#WNWT zEi$>8lH5{nC?uQ1M5D9I-`&P?&@VI3aUA`3+PWZpRo7M8n5Ob}N4`xgHSqIA*&1o4 z0VO5TF%CLVPKg91z0xTZYsAk1U2x#nCu%p3rS(}kmxrA3>;by9+DWjS09P!Z21pD_ zxB!NDir~NhnecDyn`921;(8tjUc8>?fxnVIVXx}r-B*gU`LLtEUYzUIcd8=bW)@B5 z@4j55D;1mR-npQ9u#Uyes?4_HQi_g4-F>NW!@;BX_lrC{eNdEDktCe%+%Lv@(#w%_ zk@PRUN>9+k&LgQ!UHd{7Bc|v(-K4H|ubtvE==W=1j!o2^aqf16ReigD7su0N zHtLBD;8-f&%1b}w!e=U-Or0n1{n4n(J|-Y7$i;FgHM857`=qr;TZ)KkUCF+M#w`_|EWIdhZN`2pL4 zXB{|grSZ`SOBiQqwS(irX~rAvI#0j8py52aC>-<+1y6Fe1V7@VQkIEm#Yxw<58^5sE%g!4>l8K~o?Mi)x%#`>>4bw_&X9V;-Lz zPv4t9^|J-&TDL>RoD+Ezk5Q3=6DurmPle2>nxcDZ4Q@1ZumtHnXsu4ZguWLnnkF&5 zb)3YWCI`M*;K*D;Pi0TqHXv#}BkB}*M6R6UggZ-YiXo`bB4D~_N<8B%bRC4;)w(jJ zUaeHt9zS@(aWqJ3`DFYS>s4YIvf`v8PE&0_S!KZo8zly25R2I8#rEk}o8Nwz=elY&UDmfH2lC8qEdFkSLIhCe|rQ4vcbv?s9 zrc+2VrBzTuL>iMD@}PW>MHFys@_DBuz)2k+pLPGtWAjy`DP`2iBZX*b#2|v@lrm#X zR7D3#ud{mn+DL0+WvT{Xi9URV z&LjV-Zn0i1mYxU60vB2vk>w$c(us{HC;`hVx)Hja(dNhIv2IvVy7 zu7#8-J-SNEqrh25>Gq%~e9i zBIq(@?~7ennu{vzE1UY*axvL6du%ObRPJQrs7gq^}Z$fjahmB5W2@`o} z^dO;!jm1u<75csO9j6C&(o_4(I~dt`e}>4_uBjD}qq?*681!e%22rI)AweKcFmzc4 z(`d*W0Il&B0}?sgY5j~;Om`VG-*H+Wv5vhr>W_4!>3T&BM3ZEF8o6NxxS)|rVv3^b z(L5Bk8!vU1J6&w!o~yJoXFu>N_t7}s%i^$!7OcgU1)-dij4|Orr)%5V$hp&s302sM z*~jN+-eg{{nba2g2;o{^jWEC18W?y-Y1&xSi0pAA|u35MR^QG{dq4mTg{b~W_vEXx(`{VEyk;c67w?V;6=1f z5~5wY@zD_qU_;SJ@TKdE>mN0mz14oR-T31-)8m(N@-R`6^o{(L)Bjn9<#T*eY6w z?}+0d*Ls}yiC096Ween?g}uB16aIAioY2w9Gcle$Xi`XYPw8Zl|=&v-QGRqLbIDy!ufwo}w=(JNcG!nz`A6W*gh{u>IJ(-d|01y&YiJ zx}OQj>!Q!gwqzpVI!GkI&~i#_k^5aq-^*&_mBf>CW@~jHBRK zti=>Ow=R(}QoBphu111#90Ae@Fb~^RHjLeC)&fS-q*&{k=}^9vm8`tszJSjl?Pj zpnw#G`&V-E!8c+0AkPsx&W_eKHEz9nEM?*t)*6{J!kRg-Du(Et5(J7$%>8b&4a?d0 zCMAaFL~^h4@;3X`1L^~jk{QcGZuFHPyx?esai-|yd=Zxs+daPsD~%B&I{lat?LOXf z(l})q_n2zQYMc#ao_fi(VnlJSq^H&?qo|f_#^yjeDzzPr=0HKkLHBaM`o{MO)v>0( z(Sxf|vEHROjwzcJPb>>Wso-^r;iN5^(7AY{3)njD>obpHIq+y*;$t}1`dnZEw4zew zdEAf)S^5B2az5+JqLG)no%F~(mNI7HKQdi&=|loKZoE1qEn&h2h(-qm=|GPTL!#7) zXLBKFQCnCG^3sHMXOc?NoQdsGN84h&S}3{I8f{d8I3h&|Tu7#vBf@xJM8lxnxU>i! zdaLUnX3B7kyLyhi^ObhrOu(epPXq@6k^l$`>2)WZgHcv;g+NL-iabtm1#G+mt+C8L$>n<&kJ6ZS+y4_cg)ELe@-+S@E(=&ai#81p&YNursEZHb2^*U1Q}o zKx#e2NNp$@1R8;YO}}bKsU@DX;AYtrwS?_llIkr&tF`_mcC!bEDdG)AWuDGXNY-?= zrBS=svKDI_xb%)%X1om2=FTZahzmqAU)s98)NDiJ1?Y9A=fsT|6-J&_qw|qOcZczL$Q!=+OLPQ6csJmuGNt|Wqc9wEu%3LJx_y>*CMe?>mUF&)-SeEVxRFnio zAsWY{3yuWNMNuy2#imQ&TRJkPM*#D*+%75mE#|95(|ctClhjzpxRe$o5Q$9iNJNpW z$NBuAPOow0+jp<^+gCd~Rnh0~=-vuCldV__E;1LWlFULR1|(WE>6HxvZRAC->frXq zTN^)XY`io0rZMF4diy}{?n-R=%P*|^yl{L|oG_PEhs-PyQ#I48vT+6}U&h|Czn z5Tiv=Cr4Z8X{_BS$Gz4?bMh)M<(xAHW#p6?%`Kx0l`OiwTK!xs=`F3MH)d^q;LI2{ zY_(o3n8IsGxueEeFFhI(G*IcI0~$indGqUyTN`gDzx&U@SBFMC=F!Mr(Z~*1Y8^#J zD#0@F)CUqsmVh*gY)FZTx6YcCJh#|v?NN_7S-{SojC^9kT4a?6s*R-7qYVIzM=hn- zmPbR2q=L4v+<#79cPD+AFQRk}r9U71B;822H~ucs-kYOO+IY7y`1SYq)HfSHZwx+8 zAKV%JoAldx{Bk7Ym#2knt-tELdpOu=M5LImD~!g+L`hUGs1-FWx6+|gjpom2ps2jJEmwi3>=81pK&yl0TS$Dyv z)@On-N|TV29b9?A99Jv^YORW<$Y)-EsJq&|-sr@}LT@pPJvN{n8s~Dib+XOH-e`|a z`fjH*L35F*%2WlCL)5L26Iv=r!p+z~A z+w50~C!+xk0qLXw&Z8w%Q5^;2=mo{u#!Q|OVw1;Aw0cHkCZh*eqk@bR9-{W?M+*6b z;G?N>CD0cQmJfe3{B-!$=Ff(oZ@xGD@8OrH&h(d_GRr#mmzOWT{PM+fQ}RA1s}HsO z9iE6zt>|Hfgrhw1Nn z*lLf~*UuYXo^dy0IaJkN6(!G_B_UcxG;o#f2^$$$Cv4Hk%HV?(Pvnxv?>BC3yp!UJ z99!H@(ZxRw?llH?9_A+UZ?*)2bI*E4o;4d>wcaJ9rY`#61m|d-CB$n1gm7tOQDLKt z{dTkS-8;Rd=6uoQJ__U8?N-4Mob^#! zV3eR>6Fz&4T^`*3q8@o5pwT-jrAaTgC6d^ff(qly+NFm7x_N7Ock}Jxo#EHR+ncvG z-x_{)>P)YD__TE%dhSA7cSESwcfeAnLNH3D2-Hf5E(%3Z5=B_iHEa|g%Ykn@a zZx6rPd~bMn_-SMK{_xYyw>EDkiuBniyZ7GaFHW6t_>|9|Iep#NVKFOcwO+=FK`NN` zNLb{Ka~`$e!_TVMFeFnQ8H)K1oa%O zi^dfVC_ulr+HFGC)5YT}PdoR$y@Q6WNY^@Eo`{z^@uL(eNaKyM%!MF{m!@pAdicTc zPClmdAwB%^;UWF2;qTIiIpJ_K*UH@0!@pCt9tp2Z+g5f0@6-~gsy#|D4m#bWL|Vep z>de@H8v-mAwX|P>Rwo@?d6ze?PS?QGX4FP{LQtMXIDfkdYf&|n8Of|x&id#fniNZg zz`R7_i?YQlkG9gxN0j#4?zz)~wV*m>(dA7mLURn7a*vv&h?x^*%1Qtqr4!}z#MIwP zwEX7gKWzTn@Lu}p7meNM`!9!g(&v7isQbNV7jM~zW0Sj9pq{T&qwsEc8c0_9qmVN9 zDM%T8h};Nf0?`n-V`!x;&G6+bCt*d)s!b#iSG5@u@b#J>lA8<;l@^ zRtsCY6L=uZY3HP4!3B?=sSpK6UDPOi7Fw%I-6pOzuR*VI2|{Q2TEB6nt$ zo9PQYu81!6Pn~IPy*$R2T3DLpm?qU^C!7O$DGEQ$4m?SFWG13(_gd@&r&`}iG%_d? zQG*P~6$eGMFi5C%WxMAV+M(0!BK9W9< z2UwmPrzwM`+JnF+(&#)AM1c~RMZu6qrlXvRNglB&iOUxbdPrj7wF zBCU)rff1c>B;D20IZ%pwjlN9L;r?$Qy!+tqAN=J0?FT=-|8e8NyZ8V7!8`ZAxc~8~ zGw`(g{TD7ToSk0U9SIpu%9ozp_j)=&wf>{Db1@ih{-3=o>y7Kk&VQw$mn?|l+Lt^8 zqGieE$f68Uaxi%jPHoa9o83Y$9EeYr?KmD!FhPJIK{mj`AV`c%oOs6jHV+)XQq4E% zHNPZPm$uZ+ZZ?Z7iHmt{Qw!bdzB=EjI{SB|WRw_^>P0R_=-5b+m4vH$=j*g!GAz&< zz#p`3^r}wfz_o_08(jmpyXP*fHCs21eVQ;As8Wpr7esJa5UYd?5>uv?3f5xfoIS;r zp3B#cztFSz;=uqNs8N};pV#7NJ8OML1)l<$9rQHXn3aS2jQ07;HZ1^`XD{;P$x- zcZPF9wrINXd3;9JR_0mny~S9JunSbDbQ@w^aR^`#Pcxnru{@56=t+F?=%eFs^O~&B zY-Jfkq*yy*Opatc{GL#51qbFVC&o$dA!}>e^{3UJ%hgIXtF3FyZ?D^KP6DCZ$vOG6 z1Xzly=aSVIx*}Ew8niRidTm8QJO@?hTkZdQ%mM6=eW`xNFrOL#grlme0FG-Fv|_|L5LqT_sT%tE^s%yL7R8PG zxC`AUk}JiKL<2-U7Lqa>Lq;v6H&`%8>s9lXZ2C6zhW&Z1I88C|z@Q(rrE?5~QjMUR z1O#c5jZ0fP9XQ93h$_JZWLcfp;O-DwKlPoe^>USV!Ook#mo&K=4R!D|b?~$hOOa(@ z!OFluYi2aILOUdlx70C`)f*71dlhuLvvy#fY@>MsQhwvID+Q8k8IGm~%_L zGD?w6#-_}K_`v3p> z@jH*-ee|C@RjGID*Sz`Yv+uvL`xQr&W*RdvoY(7{=h=)g4{-k%KNDrXe(A>I^<%d# zrIF3^*OcPJV2~t&QKfCX;us=AYHciX0YcW?%IIIVe>u&s)*C)!9d0N@4s8tgM5tJI zoM1W#Wa6&^<Os4FXUn!sxz|pj!PeJrumA9NJ zXQU+_$*fsem+Eq3P@cZbNTYU1?QYJ`={`ZZRN<6zT4{taPUBCUV;0R3jzKjNK5u2f z_z3R(ovGZ9>x=H&c;(e|yra*z|2oa_w&HJhQ9n%3a-3uWzuDIBx#tGI9}>?T9n&=x z@N;iTJ29z;Qs?j)=x*`(GlCHgX|~*Qgb2qDp}>4#4Ck$jpUr3Z@aKtm{ol4eeE8PR zFaLGx*AMU4ySlz=STpCcW-3v4Y@d;oP7!P7zFJm#JT$jl8V#Cz?*j=;$KXgK=25U& z!O>W0`})tI<6wSwfFL!MPlNsJ?tn2779*=Pr`T8~o#M_DjUu#4xL|3XtgEX@b<#seSVs zk9K2StbAGoWHdpDN){ahW8(FKCDESCtWxjmFsPSaZARBUH0$XP*pRVHdZlO@P?SkZ zkksBVU|buF{>9--h+E28`2pkBoJ=C8mBdpAT+=B?jXo=x{ssHlPWV zOLfj8n%aD1P=;D91;U;xB^mchWCh#H-T1cARf;FHbE@_3#OueA*ss5w?-}m~yIB2n zpdbhsWjq#ENDdNtp%msetLz;kvCS{*4^9))OEByW&t14X*!!9gD%p>@BtkzTOO_qZ z&J*awbJGubR7HvBs3^s!Ab5+NQt<>h z&oN_E8YzVdgv%@nhb!IwMt6Plw|_iuJTv;jD*3|r1dyieOiQB~tdQo(edg2?FObEVW22XQ(6JS?UfTSiU9~npsAm@IM00j;8&+SjHcoGDBRZr!BePADqdrj@L*N&Bu3qmrZ#Gi48g#&Zn9U;FDB`? z2Jtvts;gx%HdZ>@MD4L|{p@-jdkL`^U5K6|aiF>N%IoNMFf5%>!BU!q?)MMVq-syU zk(!^XodCL2?QpbCD0oGrbHW*`ed3oQ)-&s}c;-fb4>1h?yk19h3`^(ER$z31DU1nN zO0|S2z#auce2R`jT2x4F{086{DkUxH_HO^#RljC@uYaeyJAnY)z5Bxlj#vNYg+4xg z?h`T$I=@S;?QcW7eeXr+dv~pKBLQ;n5KAHI_T)KJv=F<4v_qy%F zC}sL%FI>HJ^~IEODOE3;Hp_q_EC|6J($dF&nNw9-E#FfHRYzvt?L{ZR%phpj0&V)N*N!3xb#!m0(J;qLEji8dUQ)$u_Rr9t#7W zh^`bxZ{v*%iI6gIr!YuDg*KLJD)LsG|IiH&JI(O-&Rw`WC!^iW6YM=tFd@NGTm$8n z0;Qe;qgYugP#S3z4q1^^r|AC-HYPT5HJO6bnJJjRw|)%fLY31<1(P;MQG^s#i~;9~ z%mGn~RMu7EZ{NE+=&x>mbMAs|2x$&VNHZzDVlaU_iam|KIS^@__S{Gb#tCn;#*tp@ z_6EZkc304ptq(;QH7UPhJe>otN#gbAC}0NEd+Lp1!uc$3ZR;PmzIpibt*^KKd+VF6 zPaeM6+IoNMcUxa=eev+^txvZ8Cw*&Tj`q1tyf)gCp*^{1m8um6%i|X^j47iPwpJk% zG&f$MtQOuhYCih7?(Rwh=bs;CinuW;`lmJU1|qg))W$a-?400Hy<<+_aUk*Qvxi7)QNzZqE<$5 zm1Q9nU5o&VNkCbF+H25(HJI8kb%y=2gY0s6BD+!?y(Ymj8LTqia80q{lxYD>dYa{F z8|WEuRbsz=;*vF$+S7T5%;z|sM7mJ%qMIQYktmvf4AF0tB6uHwn1CJ1>dbQ8wW?D! zNxQ@OkCW0X1(S)uQM^TBD8Qs+LJ5P2QN{{F;UIgvkL}K%y|?=(m*(v4er`5la&Pw- zfx_6z?(}4(sBr*^5Op@5MTK4T$OtHbq;(u+MdLs5Yra!;TF?Vi4WJM4;RZ0(Q8!7S zou;+&R_mo+Eq$KM81-+MDrO$)Ie3)n3P|k;GMGq#e7v(M^YH=~nhTfLj*-@#_FI>s zy_!~Aw*K%cw7bKq2y!#Q2bZGaEy9KY4v1-OgO-FVNd&bv$gFE&+4sz>0rBR9 z?Gpez5nLgJhGHoVqFi~*B(;&dPz_p}_W+MTaKGDaSesw57xi?_ zSs9lhATps7Ycgv|=guO;%c?Kei>j(#)xyfymg?YBl> z9?$5tKs8lJ!wxZ~Fngj?syEWpv?@naPq3p3QA7y_%%iVIvl{DGA!1ka+T3X(g41n$ z=2xO8fG$-#g{9&$c&oI;Ah7^Ul_11OYS6(vyF|~c=2LzjooBbS`10{*pDw?2iy<__ z{i~m@7&^inNTcHoA*|=fNXCWNgkc-9e202f*jMrEi_vGJ&qrT0?O`X*(VPQOsro<+ z9*pq8FeV+bpn~y8`*=1S%_>4JY(y^@D)-&DiK^yF+VWHyorxLrcspQqHk_UV@JH-M zyIB8-X3^B7EIRj2OF=2q!AeCr&0By{#dk_vlKrl&pk4LT;@b4P^%XzpJz4WLwIZ$I zemZrTeUF*h=@aHac8Vb;3PpD6zQK%a> zdPLkgh@p81n$zewDS@MlOC4yFqZ=!5xBK1OHTiy1EkAJk)TH!E!KB19LA1h3A*Z7m zaRyoDW0Y)n_GX>ZRP^N&5v~wDD_pr;9IRL>(+G=V6az;J6T>`ZR;1STyq34u6LW93 z4bbV2UD3@c%*`6?mR~8Lj2jajI0C|9M1(Ld{va^o7~8C=!Rw9Bux-2MG8 zR%$mBS_9~xU+z_{SD~}I4+pX&byv;2rSw0dfG;o0eOMtEYlkE89+9AlHPL;i-WsWy zw5dVvK-tKhRVVs9K58zx*~b0i#Vd2ndwNtgQv;u=d0$$%IK#Hrk5-IZ48M#FSjLkq zH3iDJ6BGi5fU*{wUtNLD8uVMsuwMDj@Bhod*h1Z@<&r5ugJ#Z{%wmnyb=mW|Cv<)^ zVf!9flyvI0N7ehG^#DnJ+B(`K{ zChL^uhnB8gf8MQ%3$MQR%EB!=t6rTxyc8Krw8u6r>PoqJ5uHQiH8Uz6JDueuF7{J* zbs|;q4KdAuPuYa@O0o3TBFY8D1UY1^WRft+6%9mKeTq-n>kG%9hMhgLl%A{*wHR3^ z)_&=wGL~>*8Q~#KA3IG=-Y%FAN1u+q+5W}oi`MAD_FJQm6UW@S3%%h}FW_jJ6C)V7 z=Av$n`RF99z5rmFr%{qxEN6SjSjS)Qf4nzw|%c(1Ub!O zGSP=x%lK?Sow*iZzAQ_zW(Wz%kp*HS=E26$i$>c`0>VrlJP{|(2(o_)U)ruIq1 z#Ydgd!T3xs_@~j{*!^BVSut$DsjytCKscg4aILH`G#*nYvnt(NzuNlU)^E1H*!tw* z+wsRQw?1rby_?8rAHKEq+0ifrPqybIE}6W=mV~4i(|Jk3A6K4lrcF3tu5W+5OI4C9 zg=^+AFTBzL0T$ZI5Pzap9n4caDulCclI5FA#}|*)A6|-#0!XVSKw*p_dV-QmBn833 zb1brEkGh@P-KQ3)Kb5j?(pdWsYt9s6DYT%N(p=e;3t>PU5!8Ex;$gHtuN!W|+dFf& z!NfaG)fKjr&?#F#37PRE$KipG$*vSfgC+bwdsp%t$93NSl`ft`>FtYB9b^xcc61;9)SSV8{$JS z3JrHEDJoj@nw(Ze4Tms9K{c+MelqCsDrNT5uPdOzc$1u?GI?&Pm&6cBz)~e;+1kCU zo7=xa@zc+SdtlLhpK={Bj0BBbJb*+>D}ssESex)vI<&cH(a7#gd3*>ov!b|9W1dav zu{@1A2Xt4qV~MJebVTL@{7968BS63fYKlU1gWBc6xP77faiE+dURNlUiIfCp8OjZm zl9UUEcD=BUrc{)Z{@;K2#UJ1PqhPe?q^6naBKeo0(ONoFmyY#;u46PuJ-m)Fcl1q zMioKYz$RKSBfk-cGu5>{qNRxLr(b746&R}wlaP2`^6fm2DiIkY5k*^|eLI+Jx;pdM z!6mLeoJU0F=c(5jOp6A+kpxd;qyklbl1!kQkAa&adp-@J@!KEWo;n!!b$t(Ksdu)Y zeq8~Lj!8w8v&34%0F-4)F`^jdwkUnJ`}5rozI<)>z1yT6^j=4ZQ~=E|Nge_HMSI=AQH2fpf2lwUn=Mp~I)@NELxl{*tq%fS%NMG`S; z$2@4zQZlkv(tbt@c!YfP^*hf$cXe&$<>%K|p1u563zGBs5j(<{n4r{vLVu7&kKUn9 zI>iXia$VM4{e0^N;5WwArHve5tS)ZUqY+GIW|hhuN}`3}HRr|<%7ZFe?XV~Ks-A}dw4<4s@QVgqiN2b0Kgdhy*coFP zwG3RKOJ<3X(oEL|X<{si@(c^&6&N7_o9e=-hDR@wUtGKP%*&Tnu3r28b1SPW3xx9g z<8}o#i(@7LHLGAwY6uRjats^?Ta=>RYzG0h+L5tA`-KsaMQLGxcU2nCU6{`NwZnYs+lj>GIhUP}B zkluL~#=SdZsM>0e`jZO(8h?i}a)NJn00BQ$>n~kU2WoD4sJxe z(q^?9KmXaJfngh(_Ifp%gnY$Y!}j_B?%lzcOz;8Pt$Nh7qj6nbX-DlAJTcQYaj57e z3pN1F$i*}BHal~KVwMXvbP0o-CeyngMpcC6(m>xxzUo$1Va;toJ9039>ig{wUsSnaK1&V0|0k+7ge^gJ z3!g7rn}cdSUT@kg{KoB{Rhuw9gL~JhZlOx8@tm}E1u4O>u41-h>VsDq{MT#0n99#s z#XWhNFSY&aOe1tyDi}?taN-fJn`)~bj<-LY-W(6#xb^K|&{oY86|Z2BcLtB!`~_YT z#`q<^cR;gvdhvY^jEA!xFJVBIyYv%p6bV=dbh&`ga!dYr=ZaLG{zfBna>NR zk_lz&OLzWd=bfF8cYeF`;m*5X{N2u{a}7dgFb93QP4Ci~EDKTT$}24B+}$mta@J9f zCNoQfF|Sd$7UiN|z-#B`^Mi?~$2F*2ZXnOlt}Bk(`#>bOL`uT4@e{ODR@3A_6a^Oj zMm-qa-2SxRBz_Fnb&hylp>z}!IAWP2T5?J7C@QO@N|c16jNYZ~>!|+>{@)y=GTwFe`g&l^{ zcadMpvQGOD>Bu3J5HFRXi~zC+M^leWB{WKQ!$na+_$bf)9M(;|{rMX+hI;SHeHWF` z0kFHWALlAc%~0hyt%Ea>hQKU$gg9Abj?Rp-nHEysI7$VP={}xbq|7F=7t^pSwnCwr zL9gFgS^fnI|KzA_+s)ZNQ zP#U=P&OuQyU=;@AC6l_R6-BveXW7WpnK@t6@}q};pij*NpU#uI?~}hPCn&Bd_lg0L z)-WTywZ=4XJ_2Z~}SFPaS8PM|<1hyC{kdfZdh-Q1*b}!RVB9a^8A|9#6`~ ztc*q5fiA`dO_{te?0x}8&w6K*^?rCn6Wk2Y9odd?l7KqH(PMHXO2fRcAep8*l`W(B z#@xF1%V8UCwy(73Aq`)>35TwW+rM6YQEA+F(S9utp_CA{EAmb;#)GpwMV^9F%6X=w zCL*HPDH^OaIDhHhC-KG&WcyY0qoB$AaK`6fK!(P<%unv|rw6@MS7U(usggEuD+yP%^Zkupk?W22`_gSuUf8Ea79gN!OA zLLoZzVZD#qNNM(Tc00WO)N0&xaX8wjZ!Is6lnWPxc#KPTn|5> zsc-KU?H%W;!&~hTAMw0v!>doexOR2+;=^`u9BA{OJ-NEFdU0j_dtGtiga)Quo(>qL zCWh{4$DRM=%_@S6iGR1Psb z`~&-)2{9arN>{#N+;S7OMfZ<#ZJmZ((cqmjL>GmPpTTpr2}2Jvm59B;Rji5U$=4N4 z1zu{7{ya^fxDCOv7*hU0&_(?ed35IXo6wIhJPww##OsQrvB7I5h;TZB7D;;(@qlt} zH7lAX^0ga>e)=j*@bdL!bnfZVp|hqQxBXZTme4ss#jf~To!i10>T45Z3_NHJ#_Hfb z(?!|hub-^CJcdCXn{!VOTz_PbgY6szyW;9}il|SC)lLcLMFMGK1n;deMde+WQHaz{ zRgVU+Sr4FYkoCqef~~z|L#lg_A8eKKQRM83c$7w{S{A|X~UtG$Hvp9ETI>9J#nnzUe7zG*#(np~Mps`>~QANPT_TFdp=YO5s z0I!bQo3ksRdhYwyxv#W$WFab@dBp;gsE!yaC6HM`F<_K(8X_-JNe(uKar>=isv{51 zwm99SKLwTK`{~yeP@!E!OldMcr^}KIJWGTe^I=7YfA?Q^KimCi_x;_Eci;ZuYLVAGXfj86gpC_@IJUKyp3Ux<)`6IN8ay!#G5)5p6X?7oX1ANIW}r%u8g3Q$+p zu_~&h!J@38E=dX$nZ{U10S(+TJ7ZA4k`sy3^a-k!uky*x|*c!`NJpQeze zU9k@=p%?2pXAoFk8^<(J4mhW=tmhO4c_rp_FU!HWQ-7w9+G{gMy{=%UAcf~dYfgla zI;N0^v;?gV*{F*4lHH%G*Fbe` z`))njz6*mRh7(SwuCQJZFB(pGfQ%gxmU-ix1ZJY^`Lxd)X}EK;~XgzdM6 zF^c?yrPMb&Ret@Q*;iDb;>efB`xcY2GrGB*%u@p?SVss$A0EYl36#jPkl*?Q z6(KAyDp1qua*s>-?E`dBd_%j=IC_z+1C1hG07WMr1o{Okusn&PXl+Ry?tM1xS-sP* zEjiBGl6~~+3aBN9qL>ZRfY($2I7X9FLV(a^Gw0*2?T@B6u3l)bw}Uu3qFOJTQsS}c zfhaEhSxCgr=yGnf6@mvZ7$-5g=$R5ap+jHP$Ge5P;2J9V@%f7g;l}pe!S>zFSI@Ky zaO$N@sj0pMo34BV!K)NeJtrYiQFEzPGWd@hLH5ttJtEwbZR}jgc`Cv^Yb&R9I&yxp zuBdrJ9dSw#0LH1x{yw)(YfB;&^{@W-r~mxN&;IHE-u(HA?+Dg%YPy~D4DC~Iy3Hff znL&c)PJ+{xN}G5}#%dw}b%HHhBE23bO}+iAwy(#3a1B30xvn@S<(){5T98yq7OnNn z$DmEHP~CYZ_Rb&Cq`Vhf=?n7b>Uoz?vOCVv2~M~-o(CH(r9>z0 ztWR{WDF3WxUDhAH8h-YfmuXH;9!$%uch{V-GzLQkHDg4`~nMtOf8FFRZMuUC1^-mz?8bM7lDHjwYeIl!7Np0Z+OA z6}d+^M{JQRd<7ryM$GfPtLNHWrE%o&pWZEAQ15aW6}#eVq9@KL8_@2S%;!C;0MsPy zxYTEO&+7B-;MFFcjU}ry&)OAE8(dI=<*GxZ622(!xC+D31`GzJV zv;RO1gFVk4lSuf3Xo#;#*BM1cG!WsG;+la${h)#{+%YO`(OJJVfz6pA0*}2tUJl}Y z%5}yNZ8jUU2%Zt;&@q>WSsSBF))k$^AE2>Ok8VH%e_lO18Bdz|Il8^req>_%P-MFD zOpq2F4OF939wFqs7qwu4a4Xe=r@S6P)NQffc6sfYlj$_#3mmcO%{wC#r00IR<&_5$ zIkQ?b55hABMHAp6-tShwEA*Hx_4Cy03T85B5#^fCXi16$JSa4ljLxohQ5I|G?{|K; z^9h>xAEAN&&KEz~d28pL3P1hsi`T22f86;En*Oite2Bk!{h@Dxeu$plL(>9tTW)f& z;iRKWr#dS5fXvnTFraElDBqG7PMZXZa!FL4V#CYIqVkr1q9H&yv-i zi$L$ljhZT^gSN>NAqg^P;EFqIg9k~=MDx3Naz4)M-t!sR`E=($9=ZtbZRP@-`4C(> z^NUT&@#MLp$pp%nlPsh}6AKp3aFN)vR~}t!e!h2CTo{p25|;?N!2&GtNpR)4;Gr(T7KiauKT|-(6T7g`+n?1$+E0SlnlzUjc$x{U(zR$GwKXSiM>ip zsRfJxT?7cwra_`OZDBNyCBLgi)?%FPXta~IFM0oJ99 z)6s>`n!51Q!<7PO8F3B=gbCAJ1|}>(;1)EKG>dfLVt*yAm|JVPKmX)kF04W$-SDBK zJJqF}W)T)63&Cp44CPD-$*okt6VJVnA+KVy1U~J%pU5OrH+Parls}tVhIHL>HHmiS z`^6;FXo&Z`ulgAX#TsF(vm9Z=rKjEqB$2*mKQ)3i5g9!&2NOmCH5 zDVWYuL;@ldgO*4$jF6%TQ>ui{0`o+--}coQjosEG%jSVoV_ox^>`HMA)P(5X5pa;6 zS#4};*o^V7AT+Cq!&PaVXSD;Z#Z}*p@8AA9QIL=IZqCo=-<_Ta>W+dehS+Kq3cvO*j^jluAM^bMEd4$+qHkVzT-HJ!aJ>CJw$bwnux2EyDtx#Vh!?6 z84TQdYZ#68fI3Q?4gv+RJMQECP8H&dY+O6?okY4X`*<(Dv0;t(e;@CuOG_6Mt=+TN zpMsUViaH-Wri7(!$(9f;MGUN%VuC|f!8sb5PPbckdR?F2N6dD(u*>B97NkoRkBJz~ z$Mh`b>WQPodc>lSF~NEFJUx9=Q$Ra;@_?==n|k`{H!ns8tOSdk5;St)~V_!v*FP91VnpKgswuoP47g2ak>&8*>6aF2p84Et#PT~^g|3EDrN zGyKiGg`d0tWCP?2?jQYp^zrD<=+m?) z@X`9{!RXGGg?!W8_uaha?*KY$=hmxXb6~R`mFl-K1UV7yl$D-|81GsYm{F8yEwU~Q zAKe^%S#LCa5I^qM8x8NwS58h*%DN*!rK)2C<~$li5{)4dBBrj`DrGcxEN^weh2C1X zbK~vSQssUGZ*LlYn!U(+bFo$|V6s3bU7sD{V(orhk2mN|sV)bGNx1Dd7wH)mA6K4N>zsQME$M+BZZ|D!VsX2V1#V+ z@R_7HaHHB~a}S$SUG2bn^PTL{*BaZo=AiBZ zYNHTKp#`fX*9042Du#vLzD*!DmC-wVZ72=HC1vyGu;k$ zR5fr9!<3tmF4jBhwN(@(6WTfCy+T|OB)P#h>n`RxT<`RuSNVGP^oB*5N!^?7fGC$5 zVGNN{9dW_XbV-M0j70_0L^T`RJby@;>9JYENdn zRu)vH8YO&8P%S0gGJ!ErtF;YLwRG_C9Ls$4 z(r+3ssUNKrH<{?(nURt^piF`DE;@0<;s>AQ{k0sE7d`lM{?bwdD)k$eqM}5Qj3UIX zrfD@Eh=4fdfpPEj-cUKDJs8cXES)<%!pQXArMPHpqU&UuI|tFuAt}Ap#2b#`=`N%h zU0HUq6aV)G54{LVyR|qQyUUs$x)flDUW-^R1CPFoFrusg&p>ftD(iCBr}nVkwZRAT zb=L|_x5~E&GRHJ+vHb@rx(mb zuL#OGKmk)`Rg5?TrP89jg`k~Y=SFAJ4HrR)mXl0H@7z;6+tkbR;upX+v+F(+Un!I+ zH4q`h95lLAWQfw?E%&ATD7l~)YNtWkBd=lvuDnqUSz$Ox<{aix zOnFhj;KS>-nzL}se!w!hq`n2{QnkZWIw=iP_6jE z?W)~sL+j$&;PzT;F#-(LTB`L=q$xg9QA}R(EK8!LxW^Qqdn~z%0gfPA2O@1ii5}C2 zteezTxY}8J`)co6>Tq3|AL2bSV{Q{)DVz+4c$T!$1Sk@m2ymMF7~&`@=nR+C7MD*Q z9+yu2=EcYmZ?GUiN#Z2M957XyK}!4c763TEvf^83dWkA5{=M}o*d(CMgtW8g=QmA^ z>Ut)O<`F6%vcEXE)|rW@m+GVd>3~Y(QSdHWerG*!iaoO&XR;!<&Q+bYe)3S89Q^F* z;rB*g#t;5;gk6TY&;rH_q9%C&ev#Kg*`#0d~TGK}CO{N;xZgqaXw_h1NlU*r}P8-D;C`tiKWq`?e;-zz- zFv^;DT8eRJ&v&~JpT|#M(mmC6ux+v{#WHA;?qLPRD7sxI2~Ry^R7!Apvund&4gc_P zefZ$vt=8~&!_Oc7YKpGgL zL8LV|J}bKa({HXryI%It8>_@l4PI00FSbap6idbl6V^*9xeN-&&>mw)oS}~8?Y3D< z0}}R1JtxtdkDNS5L(jMbOF;$hOzOMCfrtP~8pkb3T|Hjou=mzTwm=TL)uXu<^4jUc zU-cLhh_~u?yTyjuNqWFi@GR2WVjLg>W;g+o7^!hQr^dM~zrUJNe_LIB+9Ng|ktfW!uq{l)w>omO*hu9GTrBB3hev11WQ4c zN?8r@j{`3mAshiEfiR6w-hIbkxl=8)UiL0M>DTM6m!c83i7&;*f1LN%VP$M*J8nG;z?-z?)7Hom`=vrlRX=Z67u|e$&s{P%oaI9?U(US*&@0y+#Z<9I%av8&63b zGD=!bv-g+r`nT|fs9W|*`$1P_N z7-Bl0=rNt++@ujR6~6~rElI;)#i#jX_{GDY4nG>+efaK7mp`Xo757l497m;CR|0S; zh*#P&V=NC`$fz|85PiD1Ge0PnG!gY3IQe&TP<-O=Uq~CsYiE`l;@tFRr9cD&j&Twg z@j!qugoN}aKs>-+W-UL5m54^aS6%J&TFbsyKgAY0&e=P=(|$>Q=r&;z=!F{Tv65O4 zi@89OM*E<>jwl#SDVAAttFOm5ycYBK*14+P?pD>cO^kullT;tl{Y5Uq%|a~3Ht{Q2 zNg+@{sdv$MW2``!#I=zXBHT;&Wy6o_(B;G7=XLnA~*8Yu+Tifc-Y zWh_P{HY)=8VgGWcmpJjE-RgCE6|7XfwW=K-ZKbN#)?y&lgB!_V9XlSX9sN8>VxGv< zv+1^trrS33!f)HArWvlZ(y}**iZv>wq9SlZVql9B^)OC+w5Y=FLKmRHR^@;M^BAL?MHj% z-e4-#DrS{Syg7h%pa#5(8Iq2!$ncm!w;*_Ta;7og4mYtKQG__MBR!F~~SQ z(FyG+$Wn*}4M30%QiT9G2+wX$$L+39y<=t_}lj0g=zc%E@Wp7%T2N?#ZejWh$KXK zowi9z>{agNduGqNX>!=oN_QZ9zRf45}8e=JA4l}8vJ>*!c7%oSX>!M4}VoyKYY4_Wg zd)*knSA#pP6Mp6L;KRi1KBrRO(;U+TIhJDVv1T#f4aQ?hAVN)J&Z}b_O|Z`Lr7u-C ze9FCBRc|GJ{wveO;KM{U5&zX%>GWEsPW_;D>Cz9zIP|A|Zs>beLfI=&g_;$R6jXRB zqC&-JjS`VIyhy+Q4Y~= zNJp$likTH(uJo_<{Hp19=Nx6vS0fk`U@4@+8jb*CMm!CK8momd-dY_)&#bwPr|qAA zdcT6!a=-WW`d9<+)+7)ouXI#4gXRSzjS?)yRSRxCkz6nl^FXO$KF>Jy+%PP%ZU+DN z7kB>h?+?Dcb!WblZ3=W`D;lNBVO$W->L9rZQW9l|j6Wa6U&wUs;TDzZ@0RBqbF_rhHZXMCnuIW%CQV% zgAjw@jo`vF9$ZaKO(N7pT5x%+l~ud7*zFr=a?$f6yUWGtR_T?3nP%ezXfGL3%ps#J z)0j9yOy<_^(XSH&`slNo1O3a<{n4GjId;5%ZJ!l6uCa!a+d6!O|o9}NHa z-So`EpUvA(r>6aM9G6mEAQ=x@rS$EvSUq8Gx{A74<`1|4g zhd1Y=uhTN-wgWE3`Vthk+8CDN34yTy91utmD7I#X8DU;tKK#S}@=I^wwAgCwpr?l` z1&%wcFsBTe|7Y*odgHpT^IsY0Ig0oF;wRCTtr!mJR;&^rFUG#CO&*bRMm{q`SA2>r zTX2vxKp$H45}*;_#E@MVcA6APY}pSZzsjRG>9vN__Fr`Gku1%K!{H{kMUmnGtRXcb z=NzwZowe8f^GrMLX|&ELp5;Um$SO3X;2Wk07~5z2sXg0|peWS}!#zPpQ)4*`+#_l! zqnn>nC;&FkzN&O5_=!?%=GX1#O0g7MhZ)ffabYB)2q7+GbRHivt3cgWFt z&|ZFeRO0E{rMP&Cm^ac}4iYKs95z&X?X)p@{_nZUHj|A4?NIKchwZiVubg{jW$A|* zO)@j$D@M~8!c8#XD8*QNOH^>4E2@0noZJ23;8bJiwpi{b4K*#eQWU`n>6tYFf>Rcd zMJV9FXrMN48tP(Ng8Aj!ZIjc%nw%aJUm=_r6K92$#6>sL0|ZZ)B-9b?7*~%SeFgcx zzrFwar{ejP_~AOu=!Q3La!OS(9%!n%Kd1)7^hOPv&vzbLp65I9U*k>pswV#8fB*EK zd&5Bkr@K+uHok4@x_V;>-=E?upZ6q^w8?4Sbj{R(^+a#26ec2pQ-}dR^*#iSqZJh# zbA}PcS;c~H{^Mug{OY5>{QPH!-m#SO#=50_+3_IHB2ua#ED_=+TExJ#0uDqw8hku+ zCDvKt$rjYGJ%r8v#^`1{JbnPfyhDJckaEopV=5qygfgB9rLD(I#o$wA?W?*}4VpGj@~fKYE%09>c4;e*3GZ4zWYDF{P{Qk z8gJ^Nc>>0~q#@(M$Gp1qH%qTBtt>4#7=)PAlTOIYYo4b*58qOyGbq)IJmW$mgasGO zBgqrfb|862gQ+_Y@-8t9{5J1Ww{@iBZTl9t^z90Ip*j+TkigMJ(ZUERZ45lDi@KnUs6Sgx3%gDG?w5^n9w5bP zqOs!=Nn@1OL{m?r?IOT9iCUAjKNjk$p1*BnYCMi7`rw6R?$6K}lpmZ-3$GMOEP^L8 zl{lmOgIr*M9Tg5KpyoJNr5PblB)xuNW%caq%S_Kns!uLiiU(CvCK_0Cc>6K#1kwzx%Ey4tGnpWi-Dg+OZ7ANFjxz_Y*NZH}h z2mN_W>#d)(M~t{bfW?qnV2ekfji_U=){*Fw2Q|lqi+zm)39}1D_m-S1xyc0JcdKtTpW5uYGLbP%hqYe1ZoK zOPMov!ceLi0wYAQS4Ib8fTx|TfNvm-?eg-YI|B) z>JwB?{pAi{Y^Fy<6xMRs?8bMKwI@8A98?v2j9ckaD=@7mq>?_It3ZacbvG~&5M z@D%F~qnG3Zu)NylOHrVHvPbomeq&&BUgo}qcM-gEC0L3p7(o$e z;ux|PQx(4=GiX( zEib+DFqJS>Bbr>b6q1nU^Cgf#oeLgGp#|bDD5)vR<1+v4?LXbVdHd7JHlp7r=Ile; z5_M!A&Lf*m*#(?JrC~^evc!Q@Mi|Dhci2l$U=np_^+Hum*VGj}w|v>u-89b^n)y~b zv1&{rlbn{hZ&R=2iKo?$Oc?WB?D?6CMzM}Wb1%3Q3@D}C2b`GJ6%UXY1#@)d#Z-g7 zb!GF`mC#fhCed$CZe+r~y|v(EK#9nF9?#peXbbYZ%ROXSiZublCFg<4sBsE}u%20t zm5TvI){5e@(T&__;#K<_rV~d0)!1R}``@l)g}So>mrV4D`&+wO2{d7(UxfN2D}g2} z1jxxDAuUaI>;s=tU833%p{XW-oYaJgfH6nRDUS1MI`MWYvuP6P?$k<);}@tL`GDe3 zstP|@XxARcx>WfD3dlI1(WD7w1Ga*wG}9`$Mp>gNX49J5RQ(+eO^fEXKGrpc1-RL!I6?FWtvpV!07<5)+Nc?8y)*rmp z!hMh>-TM`Axk@OkwPDs1!J<=Y4b=)%40mZB&BjI*?{a&>_}Y@@9-s*Pxco{1bwV@A zv>-7e<;)o=F~S-@x>i9)))4dq-2oiig^-@#53Y2PVRLpo}U}dzlsn}sH<62OQ zwINws!v5M!*3Q)n=<+1qjilsc8=Xg@D@M^_h0>S|MOYFPT>~Ppl-%j)31;OPzx=$i z!$Gyz6tUttUNDUv`pfO!^#fE-cavi&z?LwXh$t&Ss8t_2F>UrvuB$AX;Awf=>sD}o~4*m3QS@rjAcH4wa5mfh;YtxnYD>^D_(G8 zbiLjhU2l5**6}-t<2O%+rNA=ggryo`?YxyXsI;9mg6%oWE1bSDOr6$syKeCKYv1A) z%^9GJ)lMM@(W)R#g#{dA51Cr&rBs3C)&F|ksAO+~*&M8QdZ9B|ht5i`iC>z!vuv7l zr=9z3a{V2vd)g3Wuc@&8O1D%Wqz*<CrB19=l8!?o-IcYGE*Oh#=yXkSr(-(qhn_Ajh-z z#?4sIG|TdWSvOrXcl2wj>wu;uawlas=mE~5$0b>cvnC;^5ThCCwc?l=Z=%;LHFhB{ zrZM$eZ?nHq!Bm-|J#~)fsk1m0Hj8wr;u+w`DoU6!BuHy5u?mc(SUSie3xC;cZY1BU z`tq}>-N-GRxz*3d)Zuz|m=SL}4Eo_JkS~|K)LN;)ShC(GlR2H6@4LhC07> z=|?L^f(V15c|;iL=1PHch5{!LQBo>Ck`@%=@zhr_66IMnuXDo~5%uBn;-uxt^6v7J z(lgR4#nL-alm)>#A%STmsk6ij1h_4h) zKq`%R2EwF7o_Y$BU?6REjpH$F=Tb~WTO;_|gtI=-67vGqn-@f&s-2>;7_0Z<| zuo+fq@8tGibiL`D{^-J}%}G6m^FUrG z$x@uDG*)XRdHjwcBVDwf21WQacUdX=@ju+Ta_6n_=V@l-&OfE)=G~{j2&HkF^CKrD z&6e-J%|)kFXIMPSt+A8{?F0}hob)^}H=*Ll(V5No@q@P2yCm5$M})<&I!`3vfSitz zb3iff^3gjFK{=9@IbG@kq;->>(XZCy|3gz%Yn4BB2HMr|`+jbB7iBTZsSj9tgyMJW977}|NPvJnlVFv@ zS@Sq`HN4n{M|>+ojQEPtbP|*xIvDRvAkoYQED4qv5uLTWG#O}h1J6Y8q()}h&< z9PQD&_tCpUfTfTc7ZGL7n~108QUyX;VA2UEQI`3>`@!8$?p?k2&b@1Q|1*C7{=I8Y zgXHvN&9G*YoX$t4RAa11T$uQxqR*{8Asz@~iW$XqR*v&*RhzD9oQYvx+X1%!y`eMW zD@D^qXN?C!g7plX0P16ytTiBsfE?p&rsC>}q%$w9te$;+Ijz;&;Z9F3S&WC5S|~=j zaKI22gjtFhP!j#Gtdj8yz1ma_e6O>bI0RlACZSbP?7g+ls!6>@yKh~7YFhx0v>DA2 zXesKcVq`QWCZvnL@1dHs!&Jx7KrJq`%_3c>c$y-`ye5jqxX<&baR1NV zwf)9|_OLDm!awKtCegZ^l32OJl`JFj)uD@d$ z304!q6)$T0zXdBe7&a}5#mp@K*n>#5jtEOVO^%4mp&cj8T1!aq5t%Q##1wb%-(K=O3|Ag3W9Mv9cHOlC-U5w=%){b8@Om_8V~18f%x z9D#9kf(WZ&6(lByf`vdC;Y4ef!V}?{GcNKI9Lk@+__WF3=Pq7(b?!Qw5Yy++uEj;! zyel;lWr!Ba(7fQA6R9xS*P_|wH#hxyanl_a|V)*C?1Hhya13uZ@Wiq<@Jy9PjT28Y!?gnmRiRPbLpF80^1kV6PZ!5subV2q=?}$Qg-NQRjuGfdOYlb@vPDWHnvv4q>GWozc43wMml? zv%YC}W_-aX(WEsElxmFuYmH}CfQ7snG`&=jSmal!ad)OR2B(ugqOPD%y*ISr7D`Vt znHuF;-$E1QSBt6QMsd(8MUT;=F$99L0!8FH;0ewyp1bf=vWwTwFHT4&<`1g{LK7BT zpgM3uqhp>4noPRVilxY}$f_p?WqWFG(B|zATZ!Evyjmy?(B#ee^e?VO3<{Fb1kf%3 zl+7}|eglU&nK0;_OV{$v{?~5}o59Vm-|8$r4n=p7IgNRDT8;Q%3cb4#dCb!%0ht-^ zt~S$Gh)uN)Aw@wca7DNYl;n(`X2NO4Sdk8G{c7vi_ut$4eCy-R)<^f>z5iBv@yT)Y zaJS*)gdXmF!Ku|7kBlm*J(0mh8i*nQK}5rn@{|#h#LS^_=4`M3Ms9)}?Aum)+K|1x zc>b013v(9>h)DK`uo~4!xg*T67z3By7_N-6M#x-+ENUNyD2qjG-EkSVgBS+ z;W6RWA{m5$;H`EH7}6NLm)1*-Xsjrz8n3SZVr2+TyGQ)Qd!*A>T#e>8|g`b0ZI@wJkwM$ia-ut{O-r)C41y5=bFRkJ6%&LUHYjyh7-w zXC5})-g7TDEknX#$250JuM$j0sC7DkWnASxJ*t^e!ltqf-0???u%hx<|?RZS?TlV2(VSQ(5{oVmQ zza&rH&qT6xraZSX+128x@~%DwH25ey4N_XjBYY_+H@qmYIzNP!=0;-PixP((A8nPn-Fj^Uo)j9^-`E+6za_ z+qwxTlu|FoOVP#aZ=tg(gZMyBe=aJ_<$E8;bW- z4=lRulcDG6fE7_)^z!b-Ox4hzk{;E`BTHgDB`Y-!!E`Y$y;>|eQWEnw^v)!wY_$DI zbL!EWqRi;#-)?@jd2jQJ&HwoJufF}8^h}S_YR_ykJI7@93_T^D-XSKl_hM74FOm`m zggTDgc}6W-3k-^BGW&#Ms$$7vbAFSG9l39}k)frKUl z5t&djXu+9vLUKYPg|bR~FI_sF*T63)C?RL@mUiY=#(aAtvTr}t-j4-$W>jl=>e?_f zb@wOHRXGujS{+fj6JMI-?Sb>rCDUM;XD;ZZIYo^(BZA|58^3)>c>J#|A@!_u^-M&j zT3@1!%!5Q{1rH&`0~EALo}@`JLQxLB>9;J!N6*3UkX|jA8l}_32?HrgC!Ber7y-|c zLDJ=X2oF=oe>9huBg0r}r7g`qaTP3|$C(UFt;Sd(LWsh|Xn}hJfqF|_I{zevkR=*( zty%5$&s@a85XVSXCUig(mh->uey-if?iOGzqClev3_~W(q0u<&9ip&WIYEmiXQ(Yiwk>8_3{9A->`5ysCDb%stW!92S$ z1>O%%>;sI=G>o3C7B=KsrlaYNKrg5lf+mMcEAADFqRaA?H3+!U zTf2qR&Fkqpj%DU`m+UIB3#loquw>lTGow|+0If10yh)7Efodp_+U+}$y{Q+~C0qBRDEWmHF}^l?MBL>~?NI=Tc^zTj_P1ZU+WyqpbKN z)7vJWk1hFpB-AQ(4QUiIyU<=~jznsLDTdE0-Vn^Ft*O^v`jbnz>aagpZf@-=W2ZNH z)VQ?oPQLsOtD|=~5=h&R`pWsUFO0ok`U~CW&28&`ly~jl>h;qjo^ic!=lS{9E?s42 z{QdjAm7}1Z|J(DI<}aO{Uwok&8ZK>~-gKy)VwU8ZAqIPSFTS>xFPZ6nRqi)y z8%%c93LeX?7DJglDd0R^%Rcx_&XG=+)lL$SvIxUr?cbE|=qPS3crLs_0-r^IJG z90P2D4%F+bO_4xQBod~Pai9{dRU#=a*}c=Pg3s^IxBvfh3%$;*BudCEcAciX46YeM zcR2Xtu{OtjpqX6g9M4xweeY^P1xWX;W(GBL)JRH|qlnQbgI(0rvC!+s-pURR#S?jS zXZuPib*6WqQL7tZfCS2@urd$druaG-R9Xrs-D|xTlDqncFVo|!wrxHq+uxYpJ-8F; zYQ=M40_5Dd&rD#^NuyJsCWww@<3w}aWX1h(7Y{?LdM8u$rn|bkv947N1Rh5NP(`)dN&5{_SRK}KyMB6+U7Xn7mB)Tp7UEQ^Pf@3k2`p1VF~P0Dz!iAo zxmL9379HL{bRhun9zkJt?CDcWC>wIEaLIgyfT=2JL?+NOH|q6MIq6@^4|-SkAw zt){8TjeHl-WS^e(Exw-+tI_pddh1P8Da`az0uxcw;I)*l z2;CcNOTEDgys;g81U#|k;L&Iom$)ZjT1#i>JM zrEw%WC#_Ug7lj3bQKkG=u9QPF$jf$CAC}6y>2>Q<9-+yzK%~{MBPGe+h-fLKkT7s` zf;ncj)}jb@x3;nb{j7%AA2T^E$iJd&S8LI(A=JN)4odER73#3K_6&VlCs3H=& zyrveDR&8&kZ%y&xQujNhR|_UOsTFDg;FvTLqw|y~;8X|a4|f{#c#(ScbYzoHcHT~8l1;W&;zWG#@9YGSPu$)sxTRCJ11a74RkqbS;)mXm^K(ZJKTO&SW1|Ttrne@ zWj$R8A7c1?iZE-D79&p0_0}MLnSC-S)*PF~EKj@rIpRxWy zra~M{VghNe+Jnj^2THUSbY+Yt-f_z%p$Tg#xQ>X73*-F^wbY+mc*G9&bXw}|Y<1Lo zlA}`&LQC{iQ3S4KFhL;UvTPH^h2EfdyZ60m<>%xxjaGkBef)-YJ3yJl4*cCOuZ|q7 zhrcaGT*6OvW$8|{{Qc3p=RZ|%`lsiwy?XBa)t4^Loxe1{I6Z+r24Jl=IpB)2poLUK z1uJ5dK1eU5AXv17`@!2EJh=Od2X{Yt@b)kN_x+zgxchGp-cB#SeDL-c5ANRkpI?6Q z-}ip=+>1Bhv8{X}1P8CqEmTSV;oDr8yEb=WZei|)*5x=%LZ%q>TJ;RVT4sXdsG>0- zElr*Wi9#{Mi$eN7u65HVu78}aMcgwL+BzBsq*r%|uNqDR7BET?DPayQrzn^OpJ&2~ z2*(z#zJ4)1$#9pyF}`JjvNKZ`M?5~+jOAbE$G8FZ3Fyd6iVcgP7;P!!}3Z=k=~3~r8P-cDZKwY4bOqP#YJmTes9YPB;|dSxO3 z={ey{IOFrUB2_^YwF8~)tu(ir1NKv#E)U=k+d;>KSB<0(*4ijJ@W{c@6wU4ZBqGXO3jIPYGK~Ihs49SBs^Q0d%B+ zAqE;%3dAAi`CElXl|@Et=>i(`w|&8zopbB|(hLWFIe8CZ`rw+~-u84#mcNy`)CUQ( z8g0*A?pLz{Y+xEC4Y^%W396t7?WMIOoYka&+ss`pm)eQ<9Dg)bAt&KotAtid0~CU= znjjb8r02}pOyNk1qJjHAz5m|*cej3>zP@w+r(2(GeRv$q*sZfMS!MP?r&epcHb5k& zOfe^-_sN*K{8d2mD@(NI&T_aj7_CTcx?N0m_0Dhr(8oQNthElM)}cV8)v!Cth^0b{ z7>Q9L8mYWvf@-(Djq-#NW(#h1_jNvzR?YKQFJI?Wsq6Im!fTJR0%I+kqYth`g%Km7 z4B7~-ghS7a&qGbpYcH+Xx9ex0rVV+9PN>5@k*=Q~&OferJ@Kxe*A_0%SkDim#)9L( zh&M=;m&uP0f(Jvihq9rRQAc2Z{nMN(dc?qZB7M7KKln3$Q||`5R{I!@290yZ69`rz zx6Xy&ZLZi9^$1<ny$RFXxApegH`e003(puq3Iz2k5^bbRKZ-PPt&#Ae+Uw@eH-G!>+nc}t_Gg>_zWG&W z^MlPVHor_SfAZXmZt1DsHBWa{{nMY$A6Yy)?bwW&$L;BS(=N_FM2FLK)vP`_P6?@E zw1iMexrRuAn@A`+T2#%x)IfI?`n}HcowH4UwKu*Q`9ykWZESr&1%5K(wTfth)<*vy zd)Lw%$CaJ`NfTY~_BLM=@GWD=6$)Myh#v9|@7g=PpO6~_e*2=bQAn+Io;A}Eu z1Q-Sm93hx^WXFjuL-K;swngtWTML@sk$aoA(M>j+)hv-}ilqe~VzaAwzEkI(=Xby< zWi_|NYeuE>MrdqpB^T{Vr`s;qve#k7AL#&Ls25a;L3`(6l}yrtzrJy2aN*4P?1f&tSGas!7yl3mU-YMBvj}8+JKrv1tc@`7j0tBbiYE`3 zgkYgP;aqtpr`od?ffIwG@oW%gFd_~lhx^*)t1rHJiRp3K+jPmgc$gU0Q?8^EiGK=7 z?YuS4QYyf^Do@<6VpMtRDx@{mC(aZ*x+`Zf+@GyX&2|CSMKr{-&}oIJL!1)AERos= zi!Bkh(sK95?|=6A=B>x?fAQqQ+fP3E_{pbtn_0Xgqjyzj@y0@2Q}rl9RK!3QBdQtq zDc1`@6T}!poK#{{^s9*tX5((N@@XHw*r@bsgJ~@aTm?pPkeYjNAVL6U8B&$(NdNZ3 zj~;%||F(bk;m0FAy-&x2oL`uqf4RveOv|{m1C_dZf+^DuSI!A>ZrE0y`)@T=KMdt?3ny>hMa z%h@I9x#uPgI3S=I*NW1l0mrEClqtYnHK(>tdjK947!hj(A=ViztS2kuvNiI0spnONu#7=l48A>hr#KP@Vn8l}=hXAUye?tKXK-I(T{yMJ2ytRKBUEZijVD-2rJN_#My7wbx%q#aw>Q7u zyz|3*n|C(98ELUO$Yz*ES@u3O$AVK=Wk5--Kp7epCGjsh%#m>*d9(uC%Piv;8bh?I zoviG2JGt|j|BY?+I{8}sDne7P<~F-g7QXZMSsss*b}_g;Xk~9l^VjZVf4!71E@hqg z4u6xmGAqh%X3`Rc#jIOqP`r~RT>X#l{;rcP_u6^K(6Gkb+-EO)_$U94Uv3N2oU@c#S zt#>cid^@z#OHO7jcqjfmvtU~B4Wj3gUC*!kR=if{WETJOw|%RXK6h;Hi*Bm)WKrZE z+G+d8q?OJ;wXu&m5Ql0vjdUkVx32yhWho~ZTS074SPIR-%fueyXr;2&#rCNIr%9T< zgzWtN&!KJdWyr4P?PVy2*BOuViNqknt1_c#)K(7fsEtNIBFiYU z(mO&3P#GwPO6234pKgAW4(cD?-TdZbT}fs~6G7U{hCLQa>bP(cji2 zU@UM5jEF#@fpN4_{p$_a?mf8Y0 zoHY?=SaL12RGc{#qi16!6INm$C?RUf-X!!)HoK1RO*;GQR}Xr=bncZ`FU-A3$8;$T zE?yUzXsI!EL_=U&SfsSFAvkG;=he0@Z_!`xm`55;dhJbKe)vr13-i}5E<6_*uOR^H zDgzD3gA^_*gLgPV1`pZ`4}5fHHf(V9qjp4k zb+L>`EVwir8qZc4M0~QP2gXeF%|azCFO-GrwbKHNqcLhYTUd@ruP&DH*u*SIZm5rb zwE*CX1m&1Pv|8^#bm0CJ9k}>$^M5w)4YFbPnpEWs<+XPOsIKZLj)O4*D=y-(EI;a3bt0sN6%T>T11q47i}& zJDgTPyXe?xg^^Cg_>~OigFmdD&gNUbC_5*!7ok|}71@KkzF5px%Pena*V=g$eNko( zvX^_sa@onQLhHd-&A{l9H`J2{Mr$cXU9|?IJrG2V0|;IcxA%-nfY6!iQSfnO9 z=VGw3i5!!3=~R56-KXQ3gT+1|%bC?o5KB!!IL6x`9S++!8;{C}+&nH$I2*WK?7W>0@4Wv-w`aG4FL!MJl@< zFP8hP({pL6ZR-`6(*G6Na^Da56go-0+UP#Ybv=uNe_To4Ra#aS0|U_nY2D8&o`1*e(k32-cwS2ILV ze(Cj#$BCev1E-dOU=9K$j3KXiw77&(>~y6)-RIg+*o`|kIx9X~?mf7dW~Cv6wBTx` zJD8Nt;!pi*ezfTcXTIQ3b*0>tc-7S}3)(m$s3O7`Ll8rZ1Wz$i4k}FppHCTD2YYOT zWrJbKCha(Uat{fvE{a|mj;(X?bI{UK5*$}t1GkP=qRV}F^WldN-|K(dzumvn|L>^0s; zk$i^$YeO3UJQV;TZ!oh$DhxQJg+*53N=1=h<-S{_48NO{OX4Y9JT7&vDR>lzgjW+u zL5Yd3DUv7{8GTYKanO!v8oY!`DF9cl=0$XApqZcFhq)b|a@Z3+GwtW^Eza7AW37xQ795jA(fBYcq6j94gJ4w< zf2mw5I^D83)wz)``tFG{OT7`;8t(r?tmupbqppTT_bR358FPxoI59d~#EYN}1}ZA$ zb2t7eQ52jl%ax%5&5_I!Z67~8bZYcjQq8dnxDD&Nx@QD6(nJqm7|jVqB=IZ(*OW$m ztVFea^B*7I{IAFFe{}#1+YL4LzSU$DmbzMEqpRXE;U;ZH4Hk$ccCfh?Yg0)}*0v%W z-^n{sZyg+E8`Z=hJ(rnf1&}!vdBtGYQ z-Cp8qIU=)`YEZ8`#I=r-fE_Q!y68IX0Xc8IxEYMq)w4%#{od^lrw-}s1Fg7f?IqqkvJTZc>xvm_;n6UXsHvf!e^S|DX#3(Q zL=z&g!=55+9n#TH!rmWY(|Pv7E3;}k2e(!ix8Mykz(FZxc?gK0AThE*FkFoXb$GEi zWY>Dd#veO-5n*z13ei&p9gm1~`UUCRAbZzbE%b?c34Iv zR~JX3nDSgYr;{PkmRk)<2t$d)l``cEbMuL};X>M3^>X~MqxIkz<2m=rwfTk1bLqja z;D?SAWLrGcGPey1QU$n zwBE%NB@DvgnUIx&+e>NuXcB9~@p37qu^+|LU~NzqI3Y%JO(l0;OX5=du`^anQ>o{y z)m!QKRnu!fSZ}Pyb8kI%qFq}719pnLG%J{BiM6KG+C=fE9J13D8C85j7$ZW)RM0*sFL6AgrN)>kZCQNQj&Kvq+_`68zd!fl zo0y?7Phh&a+Q4~jj1Wp|ZMjB_aN5CusmC|pdwlah9^d@!D>bu zNWU<5`5#UW-ZA|<(7E=eV`a=t`vjnCtD#D@0vFu~CVBKQ3^CL~jJyPbN`<|Sf5$HQ z*7!NpCW79(Utos->p}`bN=A^<%t^q`pkOVr1_2?eQtJ0g-trskMRvJthqASD;>_X% z4)n&Y8xQL^A=X9K7>R?>fH?ydVkqY*!2&Cal$x^tTI?#UXAr+#y)r3&+v@#1g!nB+ zQ)A+{baQoq^H@5F*rm2z#jIt(JwXHkwz5(J<=TUFzqFJO5!oHRbn1Smsu&-T5al&)wy+PPk>Nmb>m)`dI4c{KjvuE?Ui>Fyxb~^E# zvP%%ULqq{bPZysXov8*>O>F|C9au?NP>Kbg*l`7-(a}Iu2wX**dMj;M&QmD7W7u-$ zp_qXgl5OIv3nz}?rDOrch*1R+aVN2$NLr#R9Y>eT9%OHL--5#3zd4S>`nWoX)k3;4 z@~ev}!PrX(!D)jfSBm~Wd)M;Z=5^iw6^z%__`V-qbWBOCUwRECb((B6=e|f-Bp?GM zGvdmU;t53AHDaZB>^NzUh`(9=()ZF^&OQl_)SRBHCIHQRsw3 z+p8sH(L$YXwx;1qyYm60*08z58!y(5VQa^*4(w9(<3VaLI&t+XBQ@p(L?8x%6E4e) zoL}tSa_vrcsdsaF9cOQCOfrngIti9ynmF*&egjM#meuB93LXo|9Lu9(?tj+*y8p%U zwdEWAd&@uFa}uc|ZB%jt|1p>p>k0SRAVUCAN4#YkKog7z7lvgWNjzU#-dJ4#cO!^qEEB>Q1svF6%6l24jcBV$v#`*Z^4%Am z1GAegxnRdC`&FCKmynK?U@5LnA_?9`6j|Cz!wsT58dby+t5H^m`&DSor74d!%@;4q zrj)cP6IVq9U0QG-PmU_3___!c&HBg?7&5Sr1w+wKdkKWvq%;dTjGt;5)Cap>9s z>%C9QrzS7FJN3$g!BPg=7ivanapiVijgqDkde(8lbP*JU?Bz@sn4x zQEGMZ7(OBi->17UONTCE8Gch%zuw5k;I^YzZcL?bVCTr6u2~ zYkE7W>5T}l6iP{vHpVGwgW)V~fQvVf)|fb!wTo_C z`t9oO!<8F9Te&ET*d*>yYKi{>FEFv(=oAQae8n@xN&`7Tc}H#GLO`hidEh z1=gX9CyvlMe{2xj0B!5|cIL?{iGGvo|+Sq~(nK&xF56imG& zD43~f=U;hu--gJP>Wp`kPyr|)=R7rOLjg01?^9988V)|!HnU)7<{KAgdUw+)-DbnV zsi??~kA5;&;|^umG~|L;Yb|4TGro>Wy1fCe4UsR^O^u~s2)yHga7>gG z0tpm&TKAIG*Lwar>sTjsP=X#9k8)hFDMKCFu3%&C*ZuNS|d)m&Pg^V`X*cCNHLQ3S_K+g*Kg^5WFRGs7?6 zY0vINWzy5$JUw~(_~g`I6(jGN4^mU4L51Lj!2%2F56TP69CsM7H^fKR;=O~cGlUcExu|A8@-RC;(`bjr{ETlL zhZ&fI?vO5y^D8vv`SsxUFt}R@vlQ*17_~8rqXbifyat0X<(6teWY(1NnUhmP2Sn=| z)vLipv{@`T#OtS1cJnHG1a`q7oR~U$<_D*DSd4it%|cjXW&$xs5iW)eP7tS6kbnhX z;?yd^$06P8aBkxL1F_g4zSWqq|LW6~LdSqhOPs(?5}#5{&5b2o2>_c_X7TgQ-rXzR z@$~$)H{D`1ZB%-tU@C7E7E(v+>WE=dGa>?_NTNWpXcGIs>_1xmN&k=iFZz%Aj~o48 z^zSU+=zrON*uU4mA0J5FWXsnZ{a?lVcl)2m$E&+(gT%e~yF2k&U&g1zhaSW`_h0<| zFP1;4I?(Q~{_;QLorl$5f3^De^*WFP;r?GK{H4mTjR3-lQdTO*l;O%yme|LAj4`q} zj(vQ|__7OgjdwhB+>r2A zI3#W~9IQYF3~=UN5Q{K{8?{bI&t>m znCN+;oL1i>>p%wr7E6;hm1>5#cc}($MbO{*OfdrqR2Ws6TwoY<`F5u*lj437yG_owVp zeY#TUNDQb5iSZR;jB)M_a~e1#TFOkea^LPuH+#R^d|7x}O33QKdXzJ3SaPK}YGWM& zB85m>ZlWXBT*rV&fZ{Z(Ik5k){l_uky&sd&`&HKZsQ_~0MngOB?U(rV0@#nu~3 z4~q6|53f@7vdnT8NVMtB$zX|P9vOzC>0lzOrf?qSdUqQaW}1oXZ~Eo1^&u=59PC&z zdtc2OKuR^lL)xJQo=F?szECnXD0*u(vna2teYK6F?mOLK-|1TU6$5Gw=ElY(PAX|B zK@KBpsF4h@EI_Yxpk<%@ZmId?=6KTF8qzHeMb=BO6x1M67n8t1`j_9`{rYfkx;;|C#di3%HbS~k2?G`&k#>Soia>#0(x-dC)W+K_Gtsx#K$6|1UQHEk*hN48@D>>ti zYZ;>eo<-pM?6-gZ@w0o+zIb-$*>9iSY*cq2#5@1}=bt`{o((#?Y-uK@CXSD(2p&}h z$~O>O168U^gi{m{c1i~Cr8Y68P09rUXA*i(US5Rxb_{UmH{s)}@!fziVMutTNK(%c z_cj^?rBUFRY7-MluDx_5t2{CI`QYB*;o$Dzo2UOVxE%xB-8KUo9u3rrvgH)edTdJd zMaNjcMHfPV+2Dj?UJ6E))>s6-y^8XFbvI^Jluu6X^XXoC!%{H3@!B&XjFbdX#v~4k zMSKE@7CDQ%9Zb9Bmqr$p)}^1)gikjiUp5XRavW`$Qq(m<_OS=nm;vuZ2b z-}fKKpAY+w`@iqs=|5Ok#XiV0uVZTCM{_Iuf$4|YjkPyhC}!z}6RcsL2H_Oqf*XS= zRmPb_lZ&=_Ae-8q)G@r@8*j$D&-bTZ-Ez6~-etHrgroo}7-DI&qqi*P$~ zraBql?@IS_?`9+TXpQ6Br>WLP=Os1O;cmq|*bX-LY$Xe&QeC1xo$qpt9ayc910{_Y zk~2bO){;=)oo}yhvY)9}>1=ymVOV&jP;z3@M3@vV2qO%M@r_PV578u#L-wR!nD5#d z-#8gB`pZe-s(a6;-`7!t9^Of@L+I;sz$w)r5nYQS7>owPc={fYjVW`WF7JH)WP7gJ zif>!5sy`SmWDOpr`XLbr$9#+lz2}55Cn;7qco9uZ){)D6d%8ZE-{HypuUv|QueZu+ssWcbl4c;@w8jgem|rU04=s=!N)5%Foo zS^!6!;~ZyY1?^erF10(|rQXfy<~r*5`V!rm%wfF*i$S$CCgKK=Qj`VlXwcxep};uF z8i@!Ucu65SZi{IR>K2;&yBZ6gjWb9rkFEoozyBAk1z=)bv+XV$k?nhOZPcFS$+QXI;h^}WubLom#QC2 zRN>5WZ>-SXDHFVf7%|$YmRTMrCLc{dU-#hd6w$TvD+QEOtB^F#TLgwvZ9D~RH4c=R ztjYH7YDO3m=~IRh#5IjiKaHMbh}y<9N93^c)#76 zZjUR>4~^8V?xNoBNy!79oNpz}QnZDj783`~(!{GG5cmK>G7d2%$Ydh!J*eKess`Im z?`G27#zYJUl15IC&QR8M`hBd^XJAvTKQ2U5FB~BzCXc~6MqD)hRss@PW!UQ2shKDz zUj&l1>CdePj0mq3N=cECB1i~ewG&{XF?i6Basu`enEAo}crrL@c=` zJR80G(*>Qmi-S~b2YbF?{I$CJ$HP&oB?=^tBA^6O8Dj+EqsGJ!WD(KGW)=c^{}VsU zl{#|YE@jD(=t^M(sfmteI(Vc7#{npHK4>lj$vZw9{5ma47<@bUYVauD`sc>rH-mdm zuMHkQy)n2mcsTfG@L+JeG5Go5cKrR__`vP>m-n9jLo`({mpbiRl~BeDmhOWAIZUBt z5rW0~2iSl^l3K(Rm)Hg-FgT|)kgR&*<#y}Iw=wB?R3G5(z>V(-6+3I%f@0L1-7!p)wOv2f-5|qEuLAr5^oX_a9f}Fprl%ZuCD* zKl)$wKkq-<^Qnj-iN@Nwtj2`@yZ^~|AOGWb zAK!lCt)-b=4o(y8!zLw9oMsWoo{yRw4BL_ymyV)QsvMpX8K^^q2_3BovMPWiSWu*S zRyq5PT>gXlWC@IQ9at z#KEdG&5cWy|Iyj`QhD@2nZ!;lQYXorAGp|x?8 zB8RZYdHZ5#k4?<}>89^AKd4*B4@CH|7LZa6!5CS>DfUXTc#T_wL_l78${6tcb$Ib2 zN+jE3P57>?tDAZ`0KW(8>Lw?qCP&umz50E1ju7I6#=)m@kWe0i79M!O-V&Qdw)0Nv zRY}QkW48CGcYD##x@Iqi63umu1w&SurRm_KlHui9Ro?Y)bWpIin=tz=^Ob+VIqaSS&YJo1qUo^r`1q@L$!>< z&$c_Ag>H%?*R-9COS+Fp%Xs!$=}kmginP*3t5ng`lz9(Ic%1q~T!=B3-41&LL4;PD zZT7ojGM>GGFtiDs{`VhsOwZD;ay^`T=j@ruOEJg)>v#Wl49i3H8H)il+S(wAbJVdw z6r}bL%T(w=E2QBjK5MVK+o+BdTHR^*R+*%rlV_Zr@smKbGFQpZu-P7xG zo!(Z&<6bWN68T~k3^Z^jjnTqTEG(5+BdG#bL}Uef8=q7wRrgfW@1OLRxML3}Mldeb zw=}cLct8#S8G@xYM2dK?aVC70zNHSC@&1@cTR+{pA7A*>)-R57zt?MzDEb)b-`1TS z?QO~cs#KedBs3^b8Nx9d73uyI286M}(JbPEd01YH{Q3x_8%bM`)WbSSyl*1VSFc@u=kmhLPcqj2?IOrxgbgr3h@l8$qqMVD#4uPgtwYEf zjhgLsUH^NEJipYrv|g<>94k8(%bngxWK=2SA!R#$K$AZeky3qef=I<3Gd%GnXpDmm zAcAtyLS#)w%!7kP=-afvYGq1#TA(E9v(n6-pPn9*Um>29Y7`?;EI3AprzP~17)7km z)P}5R;q|;`e6r`ypl(`p`@5X|VKq6Mq*x8F{S$KbPl3C)D;lMG!klx=I|&X`X*{P| zbKwJyQ9#HlV+_}3CPJTOGrekYb{3B2pZaamE5%ZPP%_4KNGf2ONMi_<*h%6o$-48e zRIBwKtDBSgR_AeRzQ=%kExJ+^Ei;w@xC_QMV;R#b7ws{f#LhEClBGCH8bB!liW<$Blmcnw z4Kh+2nU%(vkJh*EIFH4VL8cBNQqtFQ;dF++|@4T#tXu;N&0m(_Z? z3d^wGUs`J!*AHNRw+XKl%INaT=n$HytXilb6lY!mAnS?F+KMzEpXP4Uls$FHg-i*? zsda=m=uqybJ~Se|QY@WC#7jdY@-!Yz0nRuPPbf1eZ^PBqYT0i*>UQRDtylHN@B1TN zjFXbaO&)S;E6|z5bfOeXvGu?##{x{iUJ^tS6D~#|u#3Ta4z{l9G%YCSXCs8SHa?57 z+uccn;jQ`IgWz&kK^8*HvDDUJuDu9~c_NuH1{<%WLq2bB<#1iz#-lf9RppKeDRefh zO`cn~8{p-d2;3m5jG&fS!ve%`+t?Izqb%;D(b275Cth;Z^y$V_f7C4p#jfLTBQh+- zmJ(|TCB_-1tWuI&$|(>- zjO7~Ptgg>)G#fQ6uHSAUJs_kzC0Gn96EX7N$hW^WS zs$8~7v3=HNrU_&MlvlqQ%Is9H06nB(1al^P<~U$_Z>Wk-g}qT6ms$HDI>^- z2JQ9+k{ffEZeG9m?%ezFAkRn7MiB>io>*g$al>pIQt_h)8%QlmvkU#>g3P#)`zil~qf)Qq_yMs(arz zc}!zX8-^ooLThKo+?WJQF*V*YZJ1z|7-|tH!<|xsa3!(Ms$GAz`Q_%*%|CAbcVdD0 z_UGH`*N0YVZr!H6-KL4ilUIzvcHyHA&vsk#Nuu} zl}>34Lg5IYax$^6WyPsC)|0O=(&{*A@>DgmYG>qH&Wm714AS&F6ja)wZhZ?U3?SSBqNno#7a;Sup1e5Aozcm%_IJU8;6Ma7-8|NF$Gq0Aadt4aMftoFLT->Ti|SG(yE<~E><)lMrH zh;qO|ViN}xVallPztE4_Z_ zn(x2r*j{ew687ac?;^ueY(3%vd&#v#l5-9uEeq#VJIYyB@KvqBa`pVt67(lw+TId- zIG;Tx|ooRPC6uh9bd*cZdas6{5y)L_kxWP`ojy zOI43EE~Hb`VG=J^snhtg77VFi^0L%7Zb37E)mf@H9xeCo^w;ie{Qk`ufNmqf39XI0 zLSCwk0+ZCV7NZ49u})lL!7(d?rxItit6g150}!EV0o^x$#!JZ+W5^wqMuM_BdhHAg zP8rt@JBVRnX3Jr9&rfenQ}}3h9Gwgl_pt)ywd_i9l$vW|ENJ9nAeJ`TSOH3Vkksa_ zg@mqOf!e~k3w5tOko!H5+r?Lkre}ySAt{$U`jp0bBN#Jj^DZ@6(eyj(ccHrnltMIX zXj(%1@p+EdvMa<;A23b({EodXrbJ zA-p+u6C{-0VWoM810gkh)Sp~_r+`Ij? zZ+_Kww(Qp=XGydecPokD4g*6e>mGx+5QGfgYUHzUzqs*-C?WTw%XfNJ?SE8tJ^&M) zkZLKaWjlFw>^1A@@RVu~ILQp7NX<~o9-T#LvzjI5`m3oxT@Xl<220vXFWA$ewf`-u9> z_WEBBKHs{(_4k9%<4gZLcs6*l^|Q|4KT-y{$tOQKt}MS2$?~6-UYvuF4D1uZQvHj; zr6kIz;A7-TFvgNOULZVOO|SYwY942yPf5#T3d^ub01=WocM>v z`t0IS8|uUm33{GPBSwFzKm;Mxw2d6P>u_oAy=!w9XKu`0I%zu8`*8Wk&ac+qHjlAZ zuls4*wGVtsb;)9FxdWjb)5Z%%Ot2gQvnhj_m9_-a>wMsAcRTeL?%Yw`UQT;lPCEox z45^~RaAG))Hx~3vh6+>Z_rL!@9DT#rE=As6EcL&M;7DZ zu%KRv_*Dud92Z(*fr9hEv;6pL8=o~F{I~IuR(q@K%TU!m8i&q%z2)8{2mh6!j+eJi zjkHtO362ax@|0jit)b2})LF=s>W||DE5{XefH49HDi8oe87DH!-Q4&jioN63JAVTa z?djp5Y#Oi8QExmsDfmy$3+IRDo3ve7tQ0Ck?4TkN3-d3Q$YY!@TZmQ~B=5 z0_jt!JtLuqXgbu|(f$b~vvI(SHPLWtv~rSSla_7)GAK>+OCmy6fAr;k>hiwW>n%;+ z5;WY(bynIA^HY{%@+-s>(yAB5AkYwFLm4!&S~JOwLSAPzrOk9*udd;=_ph|M^1T#q z6zF2D3nW-1Xxfh(0}{f$=QcXL!V$jD?R`?jz~?+Z8PV(PwS_~8UT<8!HX(3rKCKiA ztfNoieF(^67K2rUB-2JIOoYn{JU)E>px2TXyb(F9>75YUfG$-#3c#qf&Jxfbd#M5^ zjv6Ad4q4L@soGO5LBqM~>y}&cAT7~5MOX?e6HL+QP5@znF=Z0dq!7w0C59W7Pic!I z=HzfTdtSeKlVTxm;+qTa&rh)N%?FpFB2BR190Ci9f}z@A&;d;JvWL`*xu_6CXp?F@ z>R4+sDhuzNkE+g-30ct}6vBm>ixY5b9<3BNgRMk?TF;c^3QJFd3o-K2V0BjA z=It7~wz>`dl&h?|-~8jfW|PtKofCKLPINH6yBLcR<^*vTG<6YW%n;F-TLF%S2z?I1 z*P*)xF~VOzcfrDGKsB98F_CNcs8QW6x z#A^G04(82_%dZqr=|l`vHRZ$`9Z#nh7SU*fsY5<1)76KSUPH&zV!3}TUx}_1MrA39 zjt?i&IEhqBQ>L~{L#!29E!XpRn?donW~+K7`pPgZZ5b~u+Kg|Ugwh&qO#Xz#$Z=$k zCQ7jsTWy43+7hIY36yB96h&4OMsOY<&fwA3$6KEc{xEo&I=d$Bl=4Iysm3$#KaJgj~74>F9#Tu!$k3e7qW{O;q-nW1n{=%!7kP=-X6ap2m!JOf5Ml zJ_kJ}zfwE_6Dp(U9T-Je*`U2j)aStjMzWGnql-jewRr8pdMD#imTk3i*M+QOaxBK! zF=afB-kUNsD4<9h#)UtvHkft8R4zz-iF5NRu`}E2MyH zG>Wa*a%3BFA4Yy14&UV0{F3fHllq}1idSYAnx^Ad<+Nrl4>r(PDYaR2(NJ5Zu-WqDD#gtfQeU=)#)H{2v zvkvW)3fkEcHS5gJHw2C%B&g;#c^*wA>Wb z;96&)3#M7vd@Amfy>bjY;4Y=0G*O2kuc#-CId8CW7C=~$T%Rlo+STjcH6=|42X(su zOCeQUbIMe7R4u|zD~Y*85=%*$&N5M!2K`PQ&GkX*3Ry{>ekWAR;CyRROS`DlhNQ~Y zjH_eN9;Xk2*8D`<#Ef+ z)h=CfdquHvlmFe>r2VbzigBdDN)Et0vw?X&Sy=~^doVOB=y`3>ZPl>u&z!4wjMksY z_Tq@-Gm`DiM{-7brC0_-5tdvyuu35py)F@bF-`>&VV^0%C(|(wyX|zovcGWcyKXvI z`oYzgmR=)sbb0#jLR=hSj>Yput;Sv$%Di+T+SZf{gtO|`SA3_tGV$hmjXQjRmaXmb zD+bhH7Vk)nonY~#0W;Ji6TKvZ@|G4o{^+aQkKg<1oyY(4_`S#X9)D1M^^cE#AK&;< z_0>Pbm!GB|&zytqQ#Q_)URgTdl-TXlAIrw7lvR{!m~^5uE;S;~GvP21LQ>?j))()# zzUxmLZ&jmznJk$9bo6j^H~w3E<2M_(MxSoHJ^KAO8|R-c+4fw(#wIOPb2=cNU9OcP zSWH2QJ+cJbX#64WKyr+uwsJHOmesxS&4~JIP*=-ouUO~Ixn9#}b+9@A+k{w*u3^-e zK;lcP-VG65$EgQ~L!Qsp>cXR+HN*Z-y}dMzb1CV#kVFzniNcJ5QrzHxLfRD-d{!hG z2EBfKvQ`R<*1rCW>h;c`J?H^+{nk5Evs)WFK6N_g&i~4TsgzApAWEGu+&JzSrw$nx zuQX?Xhb$ZE)$U;BIyCcJ50+P)m0mfR&LczvGeEuchTYasW3F{r=D@D{P5q%Ox zsR@`{ns&`av(X!Y-4>$znCh((?GL@eV16L`FYE4i6Ukn>y!6`hSC*G9ePh>8g|H{z zS_p}c{yz&!rp<6(E2a?g!F!O7I><8Pf7q#^x&U>2ruLv!U5!5_wsdC?+w?SVlrdbM-C<-2vu-t^U9`|gc?{EESP^|v>A zZ^UcT-UzL=!PJn?9ePVo@*49dJ2iT1m-}j;x+@!@VlD|8I95zY-$F1!h{Tha)Dk`L7rBe}OWd|36~gqvs1*Ee`fkhjs+*nKSI~{0?W*rj(n2@Vg}G?LhML?hWe!j_xvMCPQ6@sE0BJf0)kG2FodTwaj8}G+`Pdu&u5&hOl76dR z-5O2s#);kt(OfipjiHzacqt976pm_5C@>J*FrYF7!XYT8SPl)Jk4h{IAGq|KzUoe` z!TJ7RrPFJ}o2{Lp?&&s-tXvW z3d&o;q^4X6AuS4AT8>XJd{;Z|8?{eOjz^B-WFzW}7q48q@Y2QQi*srJ)WG-k!gG%FVSFWaClr5^FlU=$dVm_(I8 zbl}QrnhMQ*)*kh*XH!D86uRjpx>VN&Zbt_18TMcHH{^4kAWKoE1aqUfK@d`s)-bG$ z$I)?(R%2FU$_lKTR&T98uV}kDvU`ObriE7wB^OpuYODmz(vbGxI7sc&mZ+>DDifY< z5iL!3i9GxBtzTbUY4!V^#VaS9L%YkNT_DU-v^m38IfDgdj<>;m=F}8G;v)Mm2y*AmwOF^?f~k!$G^GU z_ozUf5nd^jQU}3>a{!K5?u_;z(&~ojsJpCjO0WBMU-wdrMz3)LPB!fp+Y~cEm(tEe zBf?SaqScQjm)1mYKwyWEF*GZMF}+UvrB3YzUFa<;m~HgJUQ5Ymq*#n^bn=4aCLrV; zXo{HQgb`|-*CYqum*YuIl{o$3op$Z3$-=kcXE(R_w>AUZbj6EoDmA~mSn(d1lyb)6 z;AIFBu{808VySerKCJ>TLe`+E(Jw~-w{d%PfAqn|Peu=`(Qiig;;)~M?u{O9{8M`4 zx1&F7yq*4SrpdffR!3CxvQNB9`Q zcC8bS?w9XuTeE#a@Hqy?!~#*4!tALcK@v_qWj1OA2*O0~l~`hUR;irrcAyW;yC)}s1M$m=!VbY>!+j7Mt?YhDKU-zFh_&$22CkxG)4p|D;%;R zXyd4f9t1^#6Cty90bK0$Q_5;y!Qxc42%e1Je?|uX4^HzSWnN|}?HT=g z%jo#Q)|SzKAAcBs{h}KGVlr^{W()Gm%$rPTx#kE1PTboS$5*fa1&O0{YSTJNPB9Y zv|64y*IqCWG&+ZkLf>Ki?<&Vqj7jqN3318qm&So%AOq(%ATU|+zN-V@?RTnIS}7gX zZd}D9cNMn-Qpyl2O=Ja1R$J6Uig4+;4vaA8P*z~ybo#yPP1VuCLc%k`D~3`rM;Moa zXyT$*MwE{hg;6G+ezU)BlH_B{xgFg{u?*^k?`S{7i?3a{^6DJxJ$+#*7#y&rOn54y z%`UyP%BT5S7CEZ3dO@zW>VCBh5tP*Wx;oe$tf6Ydi-Xn3o3pS;k(a~?mN_u8JRt9qc zUSgh7t(IivTSmX$czg7DdZN+CX;(m#pgT6%oVn1H62>8AkqTTy{cSx2-~@}PHjw8k zZ?i6R2Ci8Ye>(20#f##%L0wEetp#w(EHxlqh^j7dZIIVMP?o(i`dz#`?{3^qn@y_G zf5Z#*-FPS@J6TW7xyp=p2}686$59#Ja6B@lgAf?(m~(c)Q((^|j$AH;13}dc*fu zrab18XZ{@bb;?H`1l=DEN?A*U!IS}VMhK;-iWa%X))PTN!v3eU=;IPsd*#Zjd(3B1 zXUQDqJ=G}O<)sUAB5;#OE5(gbgo8)UY3_)#$mulOo->80$+Aht|GN3p&0FJ7#vhLV zIR0?+tw~|c=G*a?`{PeH-#VHKsASznbD_~!(-lw|K$Wsd5g^ei$J9qQaT20`?m=4{ zh~rs}R7>4~ncDy{HPTh=CehP~ZNBI7t>{Wo1k2*RExgkvO4~$7MH1mCH4dq)!rAHO z&f%|m@gcjdHQzMJmNdz3lVdT)!377-YH2K|jDW{VNEH=1;*%Mlo$ktCE&FxjyS>%c z8;e!o{JF;I6V@l6a3IvS9`(hg^WU5Ly!aRD*3B*De2`D=Mms$|;#t#iH=cX-@|Eci z?{?Y;fi?Ya&n;hEK7a9*?-k=>xI{<_P)uP-ofncb112hHoEKuc1na{)E$bK8j0!Sw z=$aCfY5#p%a-}$iKyaV}VW|lVB6uG#j`mfs1ZUMHUh}Ol@A&p$Zqd-mbJtFfTQwh- zLcUNGIif6gJe8LT16YRWO9dR5H(5IOMc=J^txokf&~`9YhSaFqti!)ke5Huupn{8D z6sVwxi^z<-h0!SjcIfeydB|@) z$s8IU$w2-2axBJIAS1YxRzTpITH%zJT#@*W&RhPS0(mg}z`YJNw0cuX>l30{k3kLL zJQ#C||4W|()8VF(Bh7+EfTbk`MS33OI==A&kq%Z6{mfDS;MRe{?ilfkO(?A!q zj-x=S^Bfy*B-K7Dw5Y!nA=+e(-&tvy_+b6XM#A@-X-Wr~#=b*>rJx$DxZpwCc#{y6 zinI|1EToaa@hoq(574hJ^|~Cvr}&BywT4*}P0Ii_f{RU1j8LvH z1(Bs3#=nim?;n#D{BP0v{X7}RmMWFyn}N&Pf{RZB*V^ z<#zn|{%WhYHnn!+L>d{5QhM&yg+!c1x|Dd15@ETM3{NO1CE^qt1)5u#6<)hkpS|3A zbjNq+)K1UlOt-41o5GXrdDCqIEJoA`i9G{@h*d~ns)CYIBWnZBQb@JGe$&HbZ&c)% zgXT6l#ka{0u#4&EF=otZrx}tIKxh|2kf~8w@29$ct$K4%SHpMyegOUWCD2|Ov}&Jn zi)O(cqb6<2i%OYK(H*nDDyRkWEX6z;D=Of$YL*8pC6R_XaDW+7CaZCId?#8|6Z2~G z$D2PMKZv%~heu=nYTA@X&NY8`L#U8D@sdb;ECrkNy+=dXq|Obc2-pA5-nI0`c_r7s z((pP??)#CIWtp}VS&xYFB*=!S`;wY$cFWzQCge)CXOcxG$YPSfae^Sq7zi9-0vj`a zzZR6Yl=v5dcrpJXbw5g0H`#37=9T!6J{TmM6zOi%sjgd9_tYsyi^M@53l>3t6d$un z;!0Z@9|h$ZwyedOO68qT(F8>t2rrVya3QHzpv&syd)fbX-hcS%&b!S@tS>tFqmLT` z_UFg8v21)Cu+f=fvxopsJdUwu!O1fh(0HyWBZos??Uf*s5yEBdT5q*df=O+F60OR( z+UNS6wZ-mW)otDDy4j>rL-NcpHEqz@!@S>T!g^GrO_VSzvA%_njB%5;k1M@ zEoJl$w6F>5370U93wTDTqI>eU`gs~^kUEz)puY;kF?P_tS@~TZyqSwf#!e91jL|;x zgzwbk{IwDwQ<13l56t;2GeTt_At4wEAh~l?Cobkwowp>DO^!V!m_Ay6<=o|Gq*-}& ziBqMP=+e12uU$B|#HS3;H&0%R3?vIgW9pXUv9LOM5p<(pX>D2C@PminVO^NpQr{h0 zyKr1N!!!i^St?Lt${C0M@>6l1>kBt7UO)4pU>~%#&K4js$`u&ru`qNo(4d{hY9E}R zD-2|@>)gvZ_F8Xx7&!mu#}ftElqis&yB3$ooRFXuWr|`#hG4L03767yD9Xk*JLh}d z+qbi1b$@UNI)l;L5WlvBwupc6PQt5IffFOGUJ>ilf$w?p*L zIO`9rFOkEOvuhkEK~$$7A8IFzQGK(x!x|0E}`%pR5`PkjWWJNu*pDld`shHzWXasz|Bh<{enh zU4(AiggL@&)}-}n!DKx0ya&cbg7q6FbQ0fHEP5G;;zhLf^#J|u58q5X*IO(P!E(ZQ zwNP>rnGKo=0G+rp23X{YFfBbRI?^x05d7BfX5WQM^>U*m*&c*@2Z){+uNp~)XBx%& zR%lKGA)s|IK`4x~W$Qs2rg77z9qr@Nv~S8oy4(}StA^5q$aLQGAO&~YC>60xCV-F2 zWF|KUoy9v_AFjpa&V|^E{f$5BoE!O=HCy`Y`1d!4UBm<*2I!n$@85!bS}85&1?BUR ztX%CJR%%ZPPhMN;l#7gll3oQzV$lUiUhcc|&g1pIJOBJ>y)Qoae&_DV&@dIr0&DFK zzr8z{XTwzMNkU7>y(W2UC|AN!;lW9+gSEcMlSUh1l#`J-YA2DNhj2H0c3?l+wGJpj zf@MHC^;{EWO~fi9Fdc&kMRdG}|Cx7@@7#U(#m>7AziYn!Lnq%P?7WNLJR0EpO;#Jp zd(3y<>10abhdb}#Kfkw2X&$a0ceKM8V;T|A(?B)aeI--k?y*O^r-5XxKPoT02ST}& zm~A;FBF}tvM;uK>{HJ=*r+rB46-h2Q=Yy0I4|ouSb5KfiTEzOqGvK{^AmlLr@SA2Z;Jf2o zl+eD>57A9I5TI(;3BnN10v06(u<`{LG%-O5O>L1(!o~h*y@#cFXK~OQU`;Zc0 zVZmp(b0CNnB8rGV0d5R&yE=>I?H(cXAU-+nLHz0Mo@;L&BXKW3SuGG!G3~*`7&Bi_ zB_0916NHCIirP1L`foxX&N{2N%?S?43C3}*bvn(XVJblariArEXw9(z5GGnxwB_aI z&%6D&-0&USdzkszq7&Au1=DCO+Jw^~N#m5@Ndx1`bE6$E>h!><^JiE>T!xK2626~j z*y4EzQE8t6Yaw+K49&YWSPUsC8WGeWqXHdRks`o$cRjf0F;Dv;80V<3l8mxIy@Mn}q$y|zk}xnJi>iTFW53%U3zKIu-7$oAB~y5+ zcM;bvT)ncebnW`W>lgoW%B4i}8fyVGB-xlK1&0geeyKrmkWTW{;=OU zH|oO4Cz@|vS$u8jjfJa==PxW=UYL?(7m6445iSh! z;-kZfkv%wSV3hX(rX&L;Z7^yLJMYTOsR;l((Jy;E4RMEk8hhjIDgj} zCrh5pu=4Y5h<)q=?&fKW;*o{}IE>zN=pwVVX!iv~S<-MF^44n64hGtD@4+vMX+ zJKyZ&V?Wxp4rqcj!l+1y48(<)r6D|}Ok$#3M6bNL9*6x=+!(EFecSE>Im+C}UIW%b zYMF?VCaH*vhGNkwz*9+?5*&(zY+vmTSK&{d><3#rD0ig1VaApSJ^ZxR?U~Q;pBkZu z+VxEPVW{>D<$$rsSqz|<4U`0$nDv?mUo`QZU(#UIS-k(t<@Nr}{p)(iL_i)b<}0Zy zs1>Gxo-5zj3q-AVM4KsI7M;Trm6hqWXF+pDBPnaO-&h~s|NDkBJZf9*C*EqG zK%>$(fD*=d=4}&!$!cVVTSy#Y!g8c2Pi-#!KEaPKTP?X$$19o&PPNMf8!&tbs*?sfj7DvLzRf*J!=;%FP3%f!fZ)L6}ZhuNF%#Gq(L+kz5Opk zFAEZ_!3gf;hhvrMwCgXCmp@Ls%6=X(ExQw$YQb7ug>k|P3y!3y0wF9AZV02^Fj3Sa zOmVpNSsZr9re)f&TUyOe7_Sye3B-D45|)38G0!@v&dD zG0#N2rQxw$7Iq4QrFqI~Je>2=V2Tv9aUrA-B=bZYtE4G=pPaPK zr_W*_n62Wn2kKha(12Qp-g6dnVty`Ty4sa zaZdedY3WS$k4mp~#5pIVNQ4@tB*$t+P>f1=I5Agt7CjNNzc#qN-h*Klw0{-)H+vA` z=+^Aj0Gc+nW;-e~eKo+r7Olmd60bDj-g0HYa+$ywpBMY^K#DH@^Zs}kb#~XvU&i_c z`jEHE_c~Vw!?idjJ=zuyrJ8{yHmwDo5iWv}ktdok2LTyF(hePfc~{hze=YW#SGd|8 zt;EjtM|w}4YmYWhVa3y~0-2BQUSQB_)T1-WIttp`Jm#&n1j--~>0;64?ke0Fc71nO zptRjpJvYr~ul=e4O(Y6};amGajUmAX1~QB85LE=|mF~^^zaF*%EYE@G%|28nfUb2r zNj0O4a!HjmG`AY_@U~KzK&B$Mo7{V}7>BM4({hEe;z2b@_?ajkPG)=5m=$aBRfw*W zS}^0aR>>KkoK=?CD3qJ?8tG(?`svq5*Uuf}3V{4%wLoBHln@AMz)45B0m)+IpajPE zqBQLf?|=W}$N%`_=fD5)<8S`&s}Ej!W%JfkCfr;&cjdsEpW1wbPhY0Ty#eCX6Emja zQtd3B}H|;Fd7?ToTi7%4l?KS2y9tAo?^dR zOu>L>QDJFj4T~uV4Ir#h-qKVgymw=;5_^EzQ>(Rggsf@OdX->$qKuG^Nnw~FE*P5# zSJDOoR+kZ|27T~@X-J;6Cx%ILu+th(+> zH~w&MecDxQ`^G%vjk(`~wV)bfAyN=5k4O+mm;+lEb!JScxrBpGSj zoGP_Mm#(~Zc}o7I-rOQ64t;*smH-p9~jRN(RN0mRyr4C{NJ_9f~d-{sMZv?g)SJ_4T#&{`k^{GugK~ z@t`ry0UM^kw70@ZIN&tEYrW7}CTX;J)frb*>8QQt-cj_%RFsIJr@=~Y<3hXT>lfd+c;(!iCF=s7 z7_SydZ?z1J8ixoAVw?egeqEDzkl!noxl3lH2KdP^{IbIG=Mao0pTgo z6r#iYpW_kDWs&mLn=n}G0(!@I@2iajXEPGaZU^jvy4Lk#@-zyQR7gZXZnkMc(TXi zm#N8XDv$P5QVB_11A|?enE-xh^NO1{`~zkxKO=j$Y|(19T3gzHTGoNWMT6;cYJF?3 zy{_M?w$7Ywn;98&JmN+;CH}-ABF@*cE5$JgDJTiiczfVdnly(jJVi(dn^h4RtFT`1 zF1=&R{mo*uAyD6g**%SVG(&-!@zv=C>wUyojJQ=S`H>P+WwCQ0kP+B1&rQfWxr2ZG zWgoWU_dNC%~&uV)w!V5JEP;!&o7>8y4llQz~hC-ulD zby9w%fJ*D7c0m!Xyl~Fh093}1NJs^q1IKo13hO}3S z@R|ie;&nh#Ubw&0GJmsY{7%#S48FPT%bhkYOuIewsX{D8*Af}MG!=+;$~d7MktS^* z7RrjO6#b~&4|S)ZD?Y;gzDszeP&&qSAP^z-UMZo76*0oH94JOULD}i9{oNJ6X?(Z0 zUftOR7Tme>(*t)-A)nny=+kq@M@VP=&uza3?e@KM(DUwEeIuQ)dq)uP*61I;x45)) zD?XD?>cqrwC?->Ba*`M}M`AdVa&F7}-1|GN#p(OvFQ}{g+wRCwzO{R&(~YmVU^?#J zd&@Vk-@H2h_1#YUD9WDx*?U)(ubf+sFI%Wy9x;LmL{kxv^C}2I6xI|H;aJ{`64b55 zs=YRNP(^2U4H^&RxH%{%0V&lGthiA`NzVzR9#QLJoG1{DN+Ys}P^#|2=$=a#9kim9 z7H;&r8zYv?&85k<(W_nMMIRMHW#{3_ZHso--FuwX7lw? z;>{@{EQM7{mnIl3q6+gMOt44>jvUdMiR2MKdtHrFwD%_b*M=$oXaVX`nDQr)DAf>8WJYMm3=vcvdoOWAMA~+TeHh_iW#44*bDo{awN+j ztfz_s(#$dvZ8l*{VwN@h^HVk(TIZiXsZ4*Xnmq(0WopSfE#>~hRRktvSc+}*t26{7 zrC{0-PvRk_QWHZxgRGPM6Wv9%ryOuvNkb07A^2K$r8sf~nrRJ62*Qc6%304Ti}$er zf4EYAT7rEHlmgRB{i~Obztn%>{4I>plrn#Mxnke|2`R9&+%u^FY>a|^kijU5vz(~K zdaGKy3$3b~*eK1&xohux7_nA3QGqm!5xZ{C=`t+FHV7l)0dz_!j&!gj6<)210Z_=A zvK-}DVA>|fvHoQ-+F9RB%uZlBCc9D`B}Is+AftCn4G4$4W7Y)gh%;IJ%d73q$B97D zuD_-fJfJD!c#QB|pVED$Sc)$M?}Sy11QsX>-h!Y$QE&#svnp9DTMIXSTsMEapVk5` ztiomoT8o=8?%Eis;pPmJ+ypgy!OjzDDe~4!2h?GwTo6(cZe;YL7){l0IOL=mn)WfuDs(hIEEM)ZYknQE5Qv0%m5kr)7GSej^T^{eev!0pTBta;+q#wUi=~b z{`*f~Jbv+~7mr>%{r?RI4sCFQ$5q`lvdlwc!gN?lwS^c=8A7SX#G(ljNc(sb za1@l!Ye-n?)L}GDWvjvC)@pz7`(E#W;k4%BpTgd^uNX@a7ET)Gv_wpXpiKOP1J}YM z#b{RLX{EhzIX+>lGuxeu5m^%FTVJ3(AE@R>WV^*zil)L$OKcpYSTe|xUynFt6VJ(dvj+6oJ;6ypN;Sm!=nhbd1D2FALb*c$ zgQPMAp;?K(`@Y_4t+YEe{Gzqkv%c=7czp1n*SgUijq$V`w3hnyIxIAMnx{vOv-dO~ zUc#kH;kCoT($uEpJtaa3gOt_a(nws6QuO+R2d-1~n%%)CUpZ$J>g`6lRPh3JhG^>* zBg(17svxAqTw{l|JY-FGn?PYcwumpUz8xN{>H8l>Pb-8XErn&?86Q1QrzBDF6NTtJ zFe0}%aZDYyo8ob$C5C+J^2IkYr?z-=NA_=iPVL(A()sakKmIYbfHCLbarEXCXe})c z!4l-L=7FlL8~al2pFi^{Vrg9-e6_yi>*rr?!R>n5Uacl^Gt2nRlw>K+QfTi5!3r~!SjdpeCj_+=D>RAhpP8+iM$(srJmEx%k28ceC2@Wf7NIb?I0EqQ8 zZ)4gLMAX2pH!1lO?^DelKG+3xsoH5mg|^N*#25;OaieYUR-~c%tQ5dXdmVbMrH<|N zrcod?cI4nB@NNN?A_^!?lPJqABbFJEjDx}m;Xrs6qJRDEfBxk^K7HpKxf=bLt{-D? z6siV6I(qBKBSx(a9JbiMj~Gkg zC6ri%DA52a07zofL^)v~2s+fJn4eb5<9A)Ln;sq$Jfr3L$2XlqXZl7%>DP|RSR|cZ ztQa&-iBXmiXS5^S7)`Aco~DJlS;U~P{`-gDyn6KN4?q0o%vtEZVUxXheevAP(oJKv zryubNR7$l(7>N~2Sr*HK5L6JA$VPoI*k@hp2I{poINw{ZdK+U)(3=q9WL_{gXKLSG zv`ZCGX(z!T<3x;6X=22qIx1hFisr=$tAi(Q&3C$Mm9JZ=CNX$WwR-Un+up9XR-twu zS9ZOsd%o@K*#zaM%jRUZf*)GE_qSGO{)Itd#?=QwxmNR)JLR!`Fx%Jq7 zo5miUOnWrDMmYg>vFZg74s&T_;)8W0y13d%ihY3@lsHZ?gup*v#U^r{|=#uw!1+5RkM8!%I zQGQl$DjV(BeAoMs=GvK z@3@eJW3bv%WcvpcGlIO9o zPU+kJGJgCzb#5O|dp#G;=zLCl{ce~_HHoL?%@#=|9Mc>po<_r55FRUisGXg2R*hMT zKA|x_hVsW=l(~6z_57{(m#>Z1&g`T&#tJlJ?^+6{R0JE%wBQULF~$#!AQV{E3}o~Vw+0XD z!GpDKbW_GU+V{}x{>b{3N3)xz>c~5oncP3}I3bzG3rCDnrr=hpONvVxZN3d4SipuF zhXjoujfxRTUM)9O3|~EZ^`P~`XRjW`-#-4~^H=}=>Ty%rogasDHb})f6ciyUc&-^| zEClWoZ9}|xh=D8}8ve`6PxknlZzG6(yB_RY3yvEFKhQTG*Pv2;)?Qf6K)YxZDU+Nj zfkHHtNFbgyv3#Xd!#<5>4U`A(Lwzm0QY1kW>Z5Jalo;=vRw~|hDBy@J%0hCjABC|A z?Jd8}S=OvXJ;FrYR3R2aYbj?Ap{zjWQm5Cs+xgowXL}nn+*g&{S3C!d#oMtcdaG3A zyAR|qM&F)(6n*JOD>p8lUs+wcytr~@`T9(y7>A@(7pxHRkb5ey(nbU(gG0oL7)4W( zRj65+Sd-LVIM>uSHVS>5i8-_A|NJG3-3Gbq3;<(Q1;E8`7@07%c+HlhR{8eu++NBDJ ziS-I`tBuAiMD-hO^3l#4g>;Srp7(X@d{nlLZhUfY!?#vDwt{xm+y1n($9lC}wJt-Q zve<40A)+KBGV`WAX$e487CC*8Fwv&HaqC8zSv z@H7FIqRO>!N+U)U0U>1cU_miyg0zxnp}Lr;(^`uT+R**((V4SbGtTMh0yY1fPLW|L zu96cLtdvM9!)O35ZA6w@7cFp>u1dl z@;Qo^4uGjtjf`}TVr_Tca~3O=z@wGbb5LKH zGh;m|!BR{ukMXd<7%*pE^3=>oBniP;i?dS1sg3)7b-TAwjiqCnBb&<=G9kWVI1PAY zt)+mJ4ieemRfJYKp&2>BU8z*g0ZGUQ7q4AizV*TN&@oiLuTJ2Jq_Tsq&=b;X{KVNcstBTfmwwTIlJIi)%FcBVLs(H2J9wAa#MWQY&ab7E79 zSE0NuRrgyT4!*2A-~CfP_-eh=>O_;$xjS_wbQ4=1z$83Fl%+6Zf}K_pkr=2j#k2>d zFp2g#{&7~?;70GZx9h3J^~~9N5Al2h?E#s-3GtP}Nw5+|X>O%KUMH?EqeJ3>Gdgb} z^isbI7CH^n*F5wIj)PIG83AJi9yqny5RD+17#tCaqI;HAbiGj3?ZFqdtD4oIN4l;j z(IGF}vHqGZa&ZSDnh0+ue4TMrJK_Vah z36==tNZuIIc5m>#4S4?RUdmM5X@ZEu8u%$9EQM8Q6Hyg}0|Ou~hKa@n!`O(r?Qm9} z=~4gBd|3I5H|L@TLIs|33#6AT1x^Nmt>D5MgS2NPAfY9Z5N~VDa?WF@-1BFtkUe^P0o9pyVd}uVo&PXKi zv|O^~B;MNHIN7Y@N^Ox%;-X^K#xcGT>?)64m8U_x!85_h{ukRlqF{uEQA-WFSYrwp zA(;7mey7i^&-oo0Y})$iKoJNiMvH!(jhty0tKR%emeGd%$oDrVS|=mybo%U4T!3my zQ4o@H8w03-qnD*Ip{MbPuQQEGyn%E)U)AQ}ahr71bgdS;4S3jHIbr zrxbP~%iMk+T8pr-a*BSEM(s?iJwEJSiFB#rS&bdhX_65o@*S^jurZA%h)2u2gB!+n zCl4i$)3|g11d~8XYMAyQWR_Ry-|pYM^UwVo{agL( z{g3*e_CM=?5udF2oV~}(C#I(lPwE8gt?oV(ol?Eg#3@FDQp97%QQDAWwBbg2BC~A3 zk*P*!-nY)I!T7jb_$9k!F-g7=SSh|zG$96+0;PHnRdI~`{=?#?`o$D-QLyNdK8_;yq}t z<=;HG{Kp5EUw?4v)`QE};)^|d&%kpw_lFy&8iyM*jY%b8UGd&Cuqo6Ti5NE?hyiK? zCSY_RifZLNm0_J1dE06#^&bwrpbMjypD`kwKCl!F>{33J2BHY#4ipMTVJc0;hvpHn ze17**wRAP+f1fVhPA`8J6TsVdFW&vh@|T}fOK%R+!66Ko{WhA(*)V{` zsuxecRYFS(5((|G*FhjfjA4Z2sNQkk>3uf-Qek(Q_56VEiRemEWJpUXFf)=PB$VdF z86T+EQkyIS-Ttrdym9ABOeStr{onO(_Wu-fi`)H=Hz(^GDj4d4s*KGIhRQ=SHGIE# z>iBI_Fnk_sddDGMs)pQYN2zDvDK|ENhO|NxfN7Uk&pzF5xy25&20JdglT9HTC=ZMf zVJWP_2NJ9$j#&i^IN=dx>x@g&Us>VFzYkUm-54~YjV@IGV(E|Z>kL$ij~sOy1=NnfLQv_g2LP=c^XB`yXHilg9&)k;&J_QANUT=PJ? zIp;f%*w*Lb6YYc6Y!jUCo*p8#-;q6vL$ic9HNozdKBzozuom#eni*n*;SA>33+IT6 z&cGq1EG7`{e#&6ow| z+c2)5VVNjw^cns(T9acZ4!wM6rg0>rN#(KV%28w-v~VE+A|eoB2-O;4W`fTuDeUVk zwtU^4&aAd9FR&i35S@$XhJxqF>guhn22zov0`3lU3a_oeBD}JAC~%fR}n#O zZz#5bU05Z+Qbm9;?p)z0GVBAg!|iR~^x^Y0jkg;$EC)n2EyF;;`1 z!lhk4L=Zu_Ksc*G@F+CTOh#G14gO*LDC;oJg-WM!bPLRC9E_x#VQL|I2kj7=yWZX8E@)j_prxow!k7hR1J}%G1PrtY5p zwGBqy8E7Zv4-&?YQd7SJEH3N{uhB1#6OY50ASk1K105ssdE5F{g?gf~u zr;b7=Ih(2Og?iR6__+z|=+1XV4bJwnf17F1MnY4nFoYwnmG)W!W{Nv58S&Aq zSt0Tk6Gc5v6Tttp==bcMoe<)$kCbDj>`JkuoN5n&8!MwXGAsr#QcDzH;E+YH^36|w z{I@GN{(9@fzkK$qJ$o;le$EH~U}I*?vEL$I#chA=SAkNhCX#A~tjC6=3#ov#aa0A* zg3vf`r%^p`z?}2x9%Zs7cO&`eY6%vDYGg>R(-0y#!T=DQVg@4}(9?5~V{#9L2E;ed zw9-FZ{`Y&1_{z3pAbsfMvFgh|G!A`vD}F@p+CuMIb+*&HW_#D1pHCH)3cB5TwiW*z z7USPMqkd8CZj-af0xO{^S*+D@D=}Y_J5*u>mQRmxS;jgy7zjtPIfge%o5! z#P+yIHK{~=8-tJ)K$ogr%omN0R)k??gT{)+kdnCQo}7U!1JZx%&XoZU!f z{>L%Z{i6R_OnGm_Z#`X$co7=;0xKMwF#9pFts`nCnOaq<{>~YzG)fgXh2ks2eIm!j zXj{wzH_PS|IeWC^FjKvJC`P>V9Y5X2#G|Zjrimg44s1YDOc%X2uAzF z;uo|5ijhs+?MPaUuwq&LRwvK-h4yT9sy*+kx;oyeTiyDshoMr#BqG_mUYIf96l#va zfVgvfF7ICLcg+~pxJiTb#u}ub5??8tOdzWzbu18q0|jSjAfOqE zkzrOrdjFtd+eYQ8$22vi*~m2ax;spMe&u+D^vbcsTwqD5ARr=)!Wk0JD$~;GtO)0D zyEWVG^sdj<)l9qNXZP$4?MX1Zu4b1}5-i5mQ-)Nuv+-~$g)wsy3(UL+j7%1h)}rq$ zw5t=fZI2&e-d&KcgHG!y0hS`l30K5uDT(x&$RHi^BrUBJf`#?3(9u(PvxDi;R3wc9 zht^o0^Fq3hR`Qn2G#(eQhb|Nbk5-DC;6e$9v{zbd5u<3SIUr;$l{RlzPP7m0W<7Fy z?Bp0`Y{+;by;3X{ixG}OmU$(GaX9f6VsF!=n8~uL{a^HN#UJnXKirZYoZY1)`2*ss zU@27;6R5y3=>f`v^@1p6w28qLA&6zs+T6Xk^vTlA0pHcFrJGBiKU$l)d23T9dDYs3 zMPorKRiVU|&6rR0NRlZDG$4=w}D~Qak4DM z+EatLRMDYGPL*fg;ea%xE%PpG^x(Xo_pLgn_nlSA*W?thL3TVWyFwr>M&3F=lqrrm zHZm~J95M(q%Cbr$C!6haFqgZLNYmX!_>#GiXp{s?apfF5;{?3dAQ5m8Fh_z@PO#3x zb-KGewlE=n*}w^1A-qy31r9Q3qX8R7($;Wphz`VBrt)I=vxCIG6F<1so!jXggA?6* z>D95iw;JtY1+;0IQ6K~q4TyRsK^P{aK{T%^>u|f{&vfT{SF6qwYK+I@qdQU!hsH!y zD)?-AZE9P)v}XZcu8AHD#wz~Dl%t*~$~})}F{Z0oH@dEFRr}iARt?pk->R#FzVqj| z{cQVOo!Ay0hoU=DBe%C<%qGBE1E5k3k|-V%MnT1M>zQ^$b8v)Xh8fSgK00+8>d^bB z>FVlm-RWIzo==OYCJE}g6VzwRu^8jv90=;YGzt_-7f3!aC`Ih^I1fz+F7&Q9yK^ys z>(1@0gSHKB@1GK1DV#u%Mh+B%3rUi0R2252JJV2Sh+N8>HB0+b%J{fp z80S)@V>%G-Y4Fa6sAyV9VL%cbj3xsrvvz0p?~eL;<2&8c_1W=;nvX2tq<5Gfyu*fI zU4GP)Cm*l9OYawdLaV;8>_Im2uAQ^(PJF~E({|@ydUfX5@SAtq&5bBY`e!d4oj$s6 z`o!NC;}U(n^jb;}Rt1ctiVg#N21sg}MKO06Vr;qC8a2>Av^n6J=5%)(_F>_bBB_Y* zND8V0_n6DzK{&~6%&&vZy5#-lKi~W7o4ohZV{Mp9RS6O;Aq1@n#u5Xv!P!791#5LyZ^&0~___K_yIa+r>d}R1 z`szTm{vEJ&>#JW@Cw%vDt+~1K4tjV)Dw)D$iso%dP3u(ICQv|an+>U}YIp10j=FxB zN;S)1DnL2GF`+T?B-(jwBz9W5JPwK@wK?y3_OIW$n7&i>-|pYM^G5%6|K=97-U>Xh zeR3Np(zdy@*eG(PDi^p2F_)&4F~V$&!+;VOsEamEW~toqwrPSry->BFI(?|+QhWJY zEO~gczj5V!%xD=FV(YQhHgKt>ut110UI*v7)(VVJ>)Y6?mu>%Mqc*xYdg}1e7rn8! zapd^H#%pv$*>mvWrN}TOsUntxiO0`7Y*FyR6L9)b*?R4*z0GzECaQ*mCUm~Kv1jkX zn3PtkL9KFPaEE&%M@g_0*TIBCz$gZc$VsIoCg2%3MX}53XPRE{&E9XPUP*npLtN=Q zFLE5tiw4Ot$;*q<-bTH3?qT!VQC1;cs(S)?L7l^jT7v~>N|50!4ZT_PUMZ)D_H+l|P7)!u{q^MF8A|~S zlnbGRjggb!X%8Mwo0FB505ofM?PPntceUA_gDMOP6$`!V=VFjI)VsL43ux$$k)#ID zZBdF|o;}_cemg^=#kdFWQFKP$(zHj-5<)`^)pTG=XLW-@XVJjdR|ed-t4Ec$w+Gt> z#C=bRuMp0FEYr#n$vwr!OYgmoCz@)>RmeKV^R?}?TfJ-Ddf==lbkOSsbd>mfXzn=$=ZTR7)2G>>cT%)7eewmRwlBZ-y<@MA@RR8SOToZg0CEm76C)i9;4BRc z2gWVQyUx4+qx-MlzjE)r`0K@c@9fzN&zqXLaiXzrEHQK9=2yF>CYfK{9)V1$wlL1q z=pe%;NQgO#Fo^@r$zU;LO`V;FdSS9gXy?0(@oR*hpj@hO!U$`;!Qe^2lEh!NBF4o0 zjG(NE)q@^7t~vwNQM|Fd=oot*K#jm(q!EGElHGN{Hkt{+6#!m~e7}j88XeTU1OkfQ( zq-`KX60K2QS@prCTMsV(;lbrMA6)v)p1o(_IY$?V8>bqF8#9dwY45t@i&e;!>WZQN z&)&5($8{a&zj90KAUf}d7Ab)gL^0v32+}TTqdJd11~q6ffWaEHer2E-JLAV82a7yb3=$La2` zBhk{*keM6}5%Y>kOV>)1_D(D*}M@X)s&uxV56u%9mBwaw~4O z^yRt88^>QY?tr>j^@5?frq7esmV+`xS+6N-q>qjK%i2=M)vX#@Ef~5wp6TAv)V=Y; ztvj(URX&L>kpj&zP7op(B7+j%TFyLe)SWk<8DAYnTFcjGig(y8AH!gjYKD>Aazh2x zc_9^XkrU!r&{DbBs6yHQxBl0U{-OWh{VyNgdi2-*&->q0{r59(XaBSQz5X}Pl3ew; zhEh$}Bkm7WsWy2H#uLLVB_6d(MKQA$##1+m*wkj@BZ!T)Y=WV zjR0v>%aIhd^&2&r-|-k=_C0iAl<|BV3BaY!J={+K8{{e6Jnq>TDg~ayNF3 zR1Wq388yLN)U&bxQ!^JeGM}1oHfk3V#k!#}>@ZR|@09`{oN+=4KO`P}f!myAuHM8zl^nnoyN@F56kiA=%M z#65-x0`q2tf7y(u|KA_{;^FOwfBWF;>cRUDK6!ZS;qAO{@W7Y!%|glsA>}x5N;L-v zHNkjP6A#j9AC+<32V)Y^jWh?AuCIR>+nw&x`kfiw*;CM+?Gj)yq>dSH6s8O`B<2$p zo+YcS2IkxmZb&}6aQOYmr%%kE+oQ)SKVB(x$$6K%`<+Ohat@k@D7lgjp7@K3ecJ zh~T*7nhM=$WN;Z@zK8#4wqy1=j~ccCU95JRbH+^a5Vchig9fc*}bV+P*f{}29gS`dU zMGRWiLVjU5{J`(>xy4uBJhgCs@#Jd@XBS4Hx#NLLfmN0;8nyGp03$*vh}=k<@CSAi zk)Cd~y{nOzEr$TCCi0-?`p;cHI|87=8<(P@JrFP)qprLM8V{Xf!U`fSNYjXj>cP(* z+p|; zYS1t>DAR*dHMX7+hzgShO${YcP>-pElAe0is4Q>-U$O39t$t8(-jw9zDKYaw|P@>X=GoKk4jn{^DGg7weQ;N-1JV_3ZG zfWmEdymunLO?rh`GMb`M1X!lX^^CbZ-i)3YoDJ4Ay7H}2`&@Mf+PNQX-1f}lMakD3 z&s`EM#Z*M84aejhvx1-;IF`^}yC`@djYviR?_YlR`wxEo-EaQqyLaw>_fJ3l?q^@m z8s4WMTH6DbQgxApN+XPAkt#_^h(QTOg;z3&Mgxr}VA)~7vFgSw5wl`$Ajso^=lP4L zPn|wDf2PTB%M;lZ8Ma#(Q1C~E4G zbUC7uR0NBrR$6euc~0UHrjR*v^0nzGZOBojjlt6uLzk3yLMxhRGD2x(sIwvwt0ir; z!)@cE%^z)iyz#5e_cm`od%Bq|26H<{%@myN!IQ8NPjVRX_AXq?H6_r<6$=SC;ml-i zRx8Eea6x$B9&NO#HiuLD8oY5aDoGna^9x>?yagG2@`8BJSR{=ulvkjK@6<-!X|3O>UhTM6 zSig63(8TbhZ}jMOs|=GM>nR+9IP~`A@vxU_W#CfA7=)C`1!1XTQ5#9QaX=d-T|aco z%a|@et9o^ayh{&ry=1LBFQONV40GP27-}Ml#Upn z)TSs%qnX-8sK5OXmhm6D?IZl7Hhc`4_1QGo^Qi)KgbYh@<-`i-so;1pjZu!E-j&#IkkrJS;1#RM>A$bdWzij)TEYsi?JACAxM;7J9N{`a2bU&6oW_( zgKpgh{`w#L-#ogNC-kfSS5^P#{VyNA{pj8Pm;EpL-}FE4f0e(pjbPy*V#$Mz4xT}b zYBA>E$0p`zNCweVvx?6^5RMxe98LH|@&b z-Tyfcm5QnyntyVjCxb(eZ*t#-Am&W!y&lcKu>SPH54#+w)|1{^jf z!ie;SBx#(Zs!`^I`Fgkt%dpSf`Rux5&+CpM@s*+(z~vP_MrbBQG|CHOwI-4VXto>r z`xM<(TXYAQne6Glj~hk)WS1Pl}%_tiS>QZkL|VjCZAe7x}~ ze*9&%@dbK@cQ-z+HgBV!_;}-sYV*gN@1l>mweiJaxN^e>jWx%_GBkAM6TnrdTY`l^ z0uvshCwUpN#4m$TMkyj1jU_F*y49Pzko)douqP(Z%PhBBkE91I*gPXBF6Qy={KRQUG(j%>+hM0wXs~g23q8f)&pB z(5N}?6lRrh4HL{KerjZ$Y8Hs^Gbp&197_QX&S|0;6?u?EC!w_9NrF?v@y|2}_Q zbglRnCTowsIok{|4ef{%BUY+ooJVblN6iY#63T`5XsC0&4L>%jH2=2$S^qcqJJPYK3iuK#3O@xX|rJ|rGg zqA8Ib$zMUM`(JJS{}(Q`>y;XoF`I=}b>nIe>MmO69xQcxb!*wVShrfPRkg2P1L(a} zovJbWI1_^P)RI&|vxpAN0^9Tn{i`d>$>)lg3M zY@V?cIK!z0P(G?W^T-lo)*E7pmXS3|`d&f%ur%06vE-`MUS8@vPFnC`=a;WQr_S4a z$L-F2+)X^Y=^Z+vjip+Ozm+Tk6A}VYrDCqMK_mS8EUjtT^l83sXdZ8eZUj7lbQ+3ec&4R^I2TMnb#t8N4@_$&$C=lG70Un!fs!&%G_=7>Ov##{`2&pZ z>Q;RPWisD!KDXLIwXjm>EkZ->l}G%nt_&(F+cr9l*d%cn>aef;i!~(rz++yf=7Wxw zbLM%#q)1z0C*s|nGF}ml>CZt_y7s4M&Tm|b3MEN{d4RgB4@ zGcH1rDLR6|lN~Dx>DUk7?wG0lxQ_E-& zEKEpLGF4vS-01^y0;l#^o|WIQ7!1X|A;d5)tY(T+E~GY62pYwNt1$ANF`X9Hm@}`B zWBM|ACl@>DMiulVZw^*p%#ULGdc7Pxtz5KHC8`lWnyB&|KVilJOB1yjP1#90b5JMg zNjNos=E7_9Z?aLi{1Fb7F+oKm4D~7c=mk*0llQ@EbdycIWUJlj<)RL%Y^y!0;d^$G zxX-lKZV8rxYJ-iMKvIFkAh^fOR!Oa_&s}{-_^_QjGaa0WBiB9UhbslnGthxB>XHZH zz<6a?kSqZSv{AcC>bPog{Xg2(rS{7DovMAMy3kqwv=!=A_>-#Z+P(G)bnEWY(4@`L zs}xVYQE6Jyod~UB-HKA=)q~!F25*5gh4wxGB_J9Nf~>JksT{dbu6x zQpE$3FVKYH5MoRuL`#H=UPnS{qf48*i&lQQcA3fR33umA^A62y?ZBg0KMdNU6u7{2 zz!Qls5F;1~I_U(BLeQJ*AFk$2t+{H~U0VNo6kEk~OMVKX(2+tchSt%xxO zClYhMT)w(jKF~X9;B8?F@F30ztwShc~F$d2r1_+=nenBL0 zH19>_S~(aH3A8&`UOEda9y;Bt_3GYI%Y{lg@@_A`!ph(ko(jFKN4<3UNn22UJ^bxj z_06pW^=V$Uv)ax@%Q@eUH(p#gcVTYv{N+op4ZlSvvu{uS()qu=cy{6JiG_=QR*H@$ zDG09(Vq;uLOd?vsCQurJZMH0<)m>Y5)el|nmFnzWZBtXou>9Oq+jfFbsudIrw-G;3 z=Qv5yGr_Gek$?^p?J%CQ+0lhlhd(-c`o#RXJ&Gy$@k*g%OhlEO*U~!?7y~LK!@s-0Fn55QOYXik}IBymN!9+5OH{(*V5wm= z0+-x`W?O|_tLLgS>-R!#sUAzyW(OT8;~F53-F?U|=@sK?0tBgnSrRRCQbi2n3=fKf zF_Ts7wVb1Lj+3d#q!>AvcH_(E7GHVutgxdHtyryXC zo1Cw+H(U#&hZj%OofS83A^_Ez4@N$w;lgonbvA0F$g@6RyTw0+92QK;p6*`dQ|=qLPHpRmDO7USVCIb{e7;T8kn0&8p72cw7Na0F|l5mQO!-pGTlI+rKl$bNhF}aS!4i0dkPLPY?jP5 zva9v|pUmBV50)~E=E|%W;P86^w&PK#ABGS|Q&1s7AQXcljUJaX#)7oeHXE~y-+ogs z)hM4My_#^EXA4Op^w&L5|f;cM!|r@kWn7IZ*;{K z>sB==XTUO4^Q~Tuf1Dqz6~75bI+uP@3>)Y|R)=v;YRIGgKYLfx8|RUn|H?p@oDB5$ z$IY@VE3zzEOUX_)mqm4VHTjCe8E1y1A)i+EI$7)`33AG25oCb`UIVMZvQ}BIY{@`q zU#a0u`Zwtw+VTuPhCOOY9FeaeLNgRO9M)6aT~%H6JYwv^Ctq&#NaSmMlXGrN@9nTzYQ0=lB zl>y5F3K|JXK^9RdeNDl%kVUt7%iz+_%aXk-ErsE$?Ub`wYo>s%bvwxd2no_g6K!My zjmQ@pKBNe)C|cXOHM%$YGV7m>9*iE2?vEa(NB4f9*n8Nv`Yn*-6hKw$P6nN3Oi2J? zb%-fhQ~_oB`sC5Cw(mT;wf&d$?9TRs?f*IR`qM9dUK_=Q zrSs=6wY$W;w_G#usr4PuQ~?QrNFs=Wz%%J?^cV=SMPd2spq~S=)d^a|HpY21opAQ} z(iG73ZpS#MiW8@Fg#Y;kXI_`ohs%E_nA3(2}V6Q#(R~B=S{QYFRS{y^>2I4>^VOiZ&S!5OyJ_pyf=Po7O6m|?luo5&(Fc%0NCk!!9m`LNyVD8a+66lAt~+hMS~R&2 zCT02|GM0jT$C$L#8;X$xSJX#2*ccASHP(Y#ZQ7-IMAkNKy;?8@i6}s6xnlE1bQ_W zE#897eNjV?fAH(4v}>Z}YW&V>VY7y$6&blT)M(;WTBjV1mcsE+6y9DOytcHlmZI&c z?wf;nQ1y6>^JVv-F8ryv*MPN%1`+|IAYM{Wm?xHH3MqqzM_$A(zdOyn^;sq%N?ZS! zjOg5;8Ln^L-OP`%a|Jh>BZRzLx!wbaZRap-wHIh5jA9ye+KIWa9+E>C%4AAsiw@kC zt^4VK7)%ZVwB@Oj80bv_UF&uT(itTbf)`3f0*;dux(lKq6cyy(-uV7u4?0Wzkh1+7 z`}ImDc>zf7k*B)l1t>m%=Hv!A2#iV(0pcw9%={Ic!W1gTlo42Jl(sGwO+2o_puf7B z&dZ#f4BOo98Sd>5FkvmMR4R1Hn4<=1pvDs}g7i!aFN(_DKgTufrDL(%xwbJl^EwU> zTlRLml4st|PY|T*moxZuqL%%BD5||95>Cb=HkxuTqnFNujMAf@S2;tO+yFaMd*S6J zhZlZ!d`!>zXV>B)NeC$@Wn2nreLz4k#%blFFT32BAb|?~&eaq~EN?(FJ2hzQGBe4v z_S&%;V?l%s31BH{rjZDmr+~~^2Na7M@}7M9__HUUq>o=8hs1@o;~w_5Y_P{;_MlSh zB_{30OhwI!Pmvgf@fAum%6ezZ3bfz-`&f!Lw~_k85AQ`(@jX$8_Z}Q-{lYRu1n@vP z8g9@S)B+R$qSi&#q&K(ztA{DzTy5{vo@JR&o39p40Igz5yM)v}DvOZ?D!_0qI4$b6 zbg(jjrq?#ioq!y1cEj8>(zTA4r6-JK+7b+$q2xMbV?+NmB0jmDC*Q1HiPE-->;6_ z`&vPoxw+4#tXB!9;{mMmA;v5;5op>TQW6TtsY4rzIKY3q^UKi}qpx>v?R-4?a`dn> z`j;{5^xe@{JOA`DXM|2`1XGsQ9t~5iCn+DCa*`A2Ob`}L^fYBL45TjW5_%(@b7Llp zm5sx()nf``dP=we%A?asuwG~EUh((iL>l?W;HrC6+R_kHj z4Sw2swP0H2a-E6tkRm<|L<{Oj?m)1-?3QO~W9_?JyFC$4$0ORNlH!FqZN6GGofc_p z4OR#T&KU^`QHq$>XtZ{|^1aDY$gh#b=f2@o2jyy-(W3xUO28ZFDb+nY*|DO zkvbM4cv{pIJz1OntBbwR?`{2Im^ltT%vhMaW!qVo^CxIw&R^u;YshMpV@%0Vq{1U; zllEKbB9Bs0bn~hbTQR1XSqv(>tMB~H%ei9X2Q0tw53fZgVv13z;ORUBMnOp~9q~a1 zqDWC(lRO1K$VYf@y>o3nqtTC@Yp~W&o`bV)O4+ec5-#)-Ji?ZhSo;*~q%)EjO=BQN z`7E~zG|V$8lIdleUG6;?B**sHd1L%u)1#T%Ui2_wwzh}& z`Sb%6p;PTc%5%pRmx9n}Wu#Iu!CeY+sVMTH$A5hC>63qa^6STUp8V$V=bgv*9^ZNV zhxG8Xm)~-f&McLOx=4FwO}No)fNK56GJ-|~pXmxYw>16Y1g%mmC9p+(32Shpzuw^b z_>QW*;CqHKko^{{233GF)~5K=2aMW43|>=%QAz=as(1c)M5GsaT9A;3t%B#G-g)+& zr=_DX&5 zwfgB(=C5`Jn*x9sh+-*1*XS$&GQ=QLAXikYzqa-HV6#cPcy`fsOh?C{zi%3E(lK^R z9kZq>Cme%k$9VC*8w*o^tM!dT(Wvzk#TXOJ2$}M@D3YVZC@gB3r*w+uHb?(F`qSu} z(O07fqpxyvW^U8m`8YlQa&&L>pfm2;{LAQJet2u=H#@h|KcjC)_jdjveaRQ2uXn#F zH+81(+WBPXGSu~$4h1CKdobeXWzMge(B2D9GMn0;l5z3Yn@qZ%e`_@WzI%s zg9w^|v=VvPWm7H>NslRNIXEOedwqdJ(){LXfiub~>wM&zD@8!0eMym+2|ZHmQpDW< z&Gwx~pJrD0%nrZ(V9X9b&D{SYQrZ`&2hirp$5p?c;Y+oCp8H;<3WUo5mIDU@fhsO3 zhO%bnOU+=p`Dm<~w~x?h`VHr2eh`%5^AjFR3=|Q!JVX*6zvUJFxfXB zq!-`%Jok3xVv+A3#1G%XJqzv`cC5u1m8Oh?Q&B2IVsJdG)1haEl-++$$zff?n|=km zT^zoKH*aM6^I7U*dR%fjHc{4vg!*W6)*>FILCA%)=ma&yDJ!K#;}vDPC|4Q%#}B#l z!#v3PV;212%BAnK#S^NGL)yDZ}F;P+>y8ke5Yw@T316-5Y(o^U3JW z=)nFnQmZG*Sc&fGL5`BV~QIP_PIpqEPICh!A zgn3LI6bpZh@3CJko*ICA?QJw3to1xS7Zepq2e~bpg?anz`>$Y6@wugUul#)Wy7}=J ztFS-g-;i&91+tff&{2`bN(&{tUeMOk+I;xAYK`rRw%e{pr`{970Q_JEt5@q4TV z&@pB~LAbbjyi&kfMIXPGs6dAOd zEYGq&_t>u%P!*5|u7hHZ$e^WC(JFLYL{ZkX@ZMl!c_VXB><69s8?Jb$o(gFFK6(^kwzI6w?Q2~IDJTg z;$U`-=Q6o@`JJZ*fBuu3?_GI!!NxWtP!QTfAQn&xf<}Q2k|AnvMJsmu?)Lq0Z{qFk z{~h-y{&}j`^@Vk%F8nH6g#OWkv8nbM;f*6c3Snh*mPiUDq-{U2po@wwxvw?7n|s@T z+Wz*y4(Zlwj=AgjKy+&T#(T}8cU-cdvTlZUPB4rtrqiK_wKX=qZaR{1*edv*bSK;c zb)D;F?i~gJmDPePCzRzj7kko%C3Gw*1zhV78|XH}^=7z=oxyI`=ISc;I@gCca5a5* zx4#LinfbPNC^MMd?PMsKOx(Rl%}Sr`WMb)L;#?5bdK9C;WuzwBw4E8Plyb?%WS|CY zkvQyyjhpSQ!^zmnX5TtY0bT2M+;Glp=Dmr8GK6Rxm4b1mm@2x|T*Kior~Lhc+BjM) zkEm!)Tdx*OK~l1%13D8Rok(2BbU1}TSo)8mR?}ZN=ztVw?;d=V*nu&e9J^YXD@P8K2syz)NXHFOy6pJxh&$uO$abS`ZRTqAk zE6&xAbLp2I^d`iu4~YrPsS$&mYczY02`iDMG*|`%wSnM35h;w<-T(_mVNuKARcr>$ z)_uS7O6%t={O+&-g`;VtYaNeqN%DO!25HlR&*Tpnqo>Ak-R8zv34OCYQ;s|0oCKrVGi)FV6d31) zvMK7&fHX+WC~-wOE3R+d?tg&ojr$3YHYRbdbvo^ZwkTZ8iZ_me)dV?lk~8Cq+Iz3| zT^IbydZ!1Sm95`4L$~#L;}M4ISxOKmLf=!*I9EtKRAA6r)NK@yvKS50(+J3@CB~%B z#7N7oKrRjdR);N<$TKu^PnfP2MzAC(64QqjJT2QOtrjs5ZHOtFvUneQ8_D3a#k9@1 zy`@#T-wWiV@oJHD0u>QaO5;5ctGuCF0aG;BtxJ&X-CTt(hJLRZPYCRLukx1E)*)|Lk2&Z=6SR{wo6=g9z^Lj~oKg5-l+jDZ`YV*cYR^yP6tuIK!Rc z&}*G+6EJoSBpUs;4$aU+mpl=9>@SAMIqm zxboHeUw=3}kPB$``_d?C!g#e%ChSB+gJ`6s!39MX^5AmPt_;fW^yQi&)ANznnS`U- zJ2ZNV;L~y8Ey}>aOK%fXSCSR+^qX6016zkqllD6w?r{i@TK^Ev8KHQzo;&Rm(?A~+ z=MX}8Uv!5&p8%X*ZN+{{=oRwsU1)$)R>i;ovd}UFF;E2N7Dgy92k{e z!a0o~SP&*h7SU)+Vu0v9x4{%O{4QhPwO3(UMA4)iPE0u*FkUT^BCT&k;sO!O@!(S= z5lEy~3t6V=ySxdo*?PG@>|(ohV|;`q!m{4P7w3UM&H|^_bCeF~9iml11y8(Vh*1SD zxD!Qb$IW3D_go$18MA}NSuS=GWOmZ~5Y)Aq7sEkVXw@07~oBj>)n9+ zy>)!|$OXm$Vxr|$Iz5v(jij19nDY`1jr}1?*A9YE>k-D8bZQ0as8lAMVOhmIhqWwi zNkvK$fBan{(!crkqq7Kd8m4ociyT6w)=MmPglY)^Y*6TVJmU!{Ar`t>#U$_W5901fX)L0IyGXoJ_d2Dl_d=a9=Ny3>(Eh|1brMZt_? zo<%o2v|lZrK^qpS(x|N^OnFI=*{CB|mK4>j{psWX zdGhhUKKb-FSFSy{{{s_=TXRdZQl&go*2Y5)d&ndrwE(+7M86J#!3E(R4>Clpq-Rb^ zu8}yS%Eaz&_j~Cp;lvx0Y{Xe57?%>ugT|{xGCB~w1}7ZLCmpnq7j7Vq3UycU0u<+ZSU^X=<*U!StJ@)y>EArh|*jAHQ85YL%# zjBzHVq=psMm)^jZOAj6EDX#X`V}CgM{9Vl5BHd=p`>BtpGHttMku(==@yg7%>Cs*yxNSlULdu!woR<_lX8;JlG# zm+hOQoz2z~!utKeMrZU8{QcI_5U$?5KTM>n_3C}t7{crhI?cxy98Cw^#N}$KS!+GO zrq~3j^Ncc+&P^Fe9+Dyg5MIWK*09@N9jw8$3{%61PEeknFkUT`o_L$KVXcH$%2|;j z66S-$kUy0`xrD>4DwIx$jb7*vzxv13;gxIm_iwB&+D*g3TCnjZGqX+i+>nYFcY|>p z;I*EZ$$@tq3}Yk`h5#fxVswIIQKEAR-)X&tuvf5(Gl=`;;(uj_$6@2uqKTj=S6)h@ zRIn7JR!Ue!374{{ZnHD|DXzO=e`P$LZP1LjdxkQXX*R3|)*CLZ(<)2Kdj~FR?-L>P zY4H{v7%%rW2k$@^W_MpJl@nb}_w`{&C#+YCWwb81$dslIgdm)F352?kC_NO3zrKO} zL`GJUTP-JZrfnl%Z_nkSrn zJ!9tVr_k@a<$=uG_|0lzV-_P)o&F}mX-`NLfZjUbNMq49K78PCt(`2|9jrCN3sVp0 z*JrNGBL=L76u~MR92HD!Lo7|jc>qalrfNn=C$#fGi#l#&zZqBitZe(B z?P`I{nmBn%X75G4)XJFT5yvTRQ6QhPXhID6`f7UNub69yj)gP)qM7C|G80uzX) z(xY`~7^a_sv&uu!0ecIfA9`E30ZjV-e|1E_d~g=358dst3W&VC*T_g{~nod2nM;NLIYyLDq> z`TCu?g~dFfe8#qZ2$5TLev;EC` zk3UPFzIgokm1}NgKZ^N53iYqQ`P#yrJ5zf8&Nux!2T|P#Fx9#d<(dPq9HKMsTuiJk zF$AE-P+oSOf}NGI_(IdG^9;8s2aH#XBTC0_Ed0ZiM9ladYXMAaRI)65g9$kZisyVgDCsyUli*o`_0cD;4ei$L(eEE@j&}M3 z7>ssSrd@a*=m8?R2WX~T;H6usGc8$*a~?A4Q^aJX4T6FoS}`do=h~LZS-Ae_;h>$) zif(Rfi5Is}xnX)Im&zXjyVm_cGmR-)R~i7L;EA?NVGwBgG@cvP>#zLHBCb2^5AL@& zW^cXnDxIRRl%KFZe!??hyZ5RKukEW~rRSwzi4{HAI~1Pfsr`*!KfU5r*9-5y^!oKz z7Y{zYp9c@0{;Bzoy|g&L_;OCdRs#d5xQL)skX%I?Mee$mNYSgJ%7?LtWjg0Kp*4{y zoZS2m4ieqVvCe9sKah~+Ic47nvYkqh?RZG4y(Q>G3r8 z`0f7Hak3$O_ZqY|lgHnD2lj>{9JsV?*yNd2;+zCftp`Pxs0B)6rPDx&vqBKbBbNrs z1gc*f4hF+%7yRej{^vjnWZ!btAbOT{KdhH1j8#E6#|+^t@%b`&))ZDe*lev$#J3F> zcor^jyd^6^)+AbtQhHCQFhLXVICUH~w*<tDUwPqAg%WM);`Cic(9LnSUrGh1QG{*=b8^#&%RmyR$ijCL;hgCO3^;8EEKr>mOO zI!Au&Mb}>))2F1^b5Z^o*Uv2qJFNjJe`Pfu(Wes=ok@6DmCjTZND9k5xD+fG$ri%8 z>xI>EFJwc!F8CQSJB@b;>RQ(m)FJZd3Fk^G)-cSivZ%ODCy=qm1nKoDr6A8p!1K6n*(3Li&;1l)_1A{ldPM=y z5)nu=#5n@qIua9C#G-4%w_p`RH+^qwc?&n&S^0Uh-94ayGmQ@Fob8#G`@g(&aE2Xg zF$NYj(Mod_z<6r25UWoB>tLa1@Zghw{@I^*K78`aKm6rC|NT$@@$)DD`-{K)@>fqj z`~7ps6`mldeW~g~%F~210jhN$Z@r927&u6=Bb6qgwS?yDgR(7Rp?@`JE>>YySI3^h zHhTfX1TPx6ljf^N(+8EM+F>OeVfyb9jOP}Y|DcX@>2m23Xk?u(~0BpYe%LrCtM zt{TN?wbZDkQu9bq3b6>7Ce#cq>gR!1#Mv0Xmh+rHoa{-0P z^Rh~o;p;1jmbbtDvI+iw>=D=`(zT9Ttfjl>tOm=_kp2Z7 zxeHQI;XryDy!6IWSHzU>wmUf5>9)Giy4N3l((8^sYX@w>N?I=WdTz9{a)K;$uA?xs z6RIARuuy1>lT=^z))L`9eCkS7FfVt>IViC)c~v#!enEkUormp5DB@nZ9;) z`Y6E$?w4+!&=PYx`&K(dNC&LUnk8H*Z_`$98C8UNk)p9Ofw^C|w?@D2Zo&Xy6}o$3 zXdOuZO>tptH$47Ad+SLecqf2g>z+29KA0$gh(;5U>#>X=5SX^KYykZ3_P_0Z@Njqg z%iRw?-Q9jTE<61BpC5hx{8GI&iYDdNrI#xpDZ6ht3F}&CM2Nv5_(X;zN~au&k)ltb z3oRRMv@lV}IN#}DcP!aED}|gD{a6F^k@WE~cC5tM5*ZmMPNL(GjzA@;g-DgKgp}P3 z47T7w9_5iG2ahI{n-k>(x_iic)o`MYz`Wuzu^b^h^IoJlCMYRYQEF)SgJ11#@9b{> z_wEOeo?b~cC&z`^P)^a8a4gcbPDqVpX;%r}Q)E&o%B_n&l0>~}QF-}wcy}GT?d||O znODskmZlo9mm|m?HD4{FX(!P_N=z}d1HxUF^d%xnV8NcM@bsMBRV`jW`>U#jm*?iU;?WkgU67;zBBe(0o4;iW37 zLS2S-ck}A^b+I$s%`R1a@!i)JZZ0g%-6BB8TC$zWPv&CDL%y2e^p+^Lr4;Zf!$rP7Cpibt5ZR8#$Xv2{>5va8K0{3OyoIm@S z3a{LFJAKuZ5G}u4EpW^j!f1f3|G{%74b{Xc5jg=@wyo~%2?@X)?;kI`IW|`_TYlQM zdf0-sm})~r;^4}sB`H8F4q&YoTx(J`3Haso#7)dIPrI#q*w44%?LM}k+X}eeT1dzL z-v7J%0O5ojS(5=hMmhV`Ca(1gW06ph>4b#{!V#i$WXhzYmzC*jXFqK{_0yx{gfHt# zFAK|#Sg#gO2Ra30R%+&*qFNAx5Ht#vHh>}xj|i(O?B7DhjJ}s?-2zp_C#3MK_@?{r!g_{jO=9lTEOCLa;h%y=pMi9t(L}Wl|(M z<#|k-Z3G{*aPE{!88YX$UicL6>0J26o9BWH3o?xh=a;JnP8)`xf?>`l03-DzD#4?) zvaA4VZuyPY0M>hL{Ca2Dlw>|bN#;=t)`A*>VtJ%U3Tp&$F-4@Buso{S`7*JJrS=N; zXEmgcL)JV~?2?R&DnBFlO;?Lz6i6IZ(ke6|$^g*?9i5;q#W*D>zS4)T9}d>qt+@#O zVXNI*7z|(lM}U2*Q2SJ;XjbCrfDh=*lb(Muz`0SVJwki`pS^4QZS%IkLyav_F@q?uBAWbkerL{Y&iS1=*=c7YQm8M63KgY59Y#h_ zqp+3STaE-F0f!uY+311ujaKijA8V{$=C|2L|B(Dj@#LIIhd@Z8HRb|4M=8^qd#+7Z zTaWMDh5o}L#h-P0PhSmwHqrZWppD@aUyy!}%q3Ju#8--_7gigMgtI=icrfj)M?8WX zfM(rFUhQpn{Eq3hw`NykUM!QI@3s%guMkg*u%Mc0OAxbI83vjfkE9ovdNgOthghI8 z_e;h+7b?!n_3QOpue^G#e);-@`t|TrOCgCckeC)bgnclaGDLiEOmfVG%LDm`vDT>59tvv~z7)p^)K&WSi1uGzA(FAmRNvZC1wkJZltacnj zm~}{erEs#e?u0P#hzJQJ0xGN#gb58aD>J@YnUth27v7%0-NJk{a zfQVyOp}?`rDk!^Z*yuAP6scm|T<>+d@j3l4a2{q{HtMLa4a?&Go?kMfFTysY6QNeD zYgQ>ixg;Xy&B{1!gp6L@Q|chg0ld<&w=2`@R8>XVU}Fou|-N+1)%4eh-Nj$q_O)?V(*od$Gj7hA3Eu`AAV899s@ zGc@e0c|mf`Og^52I2Y?(KrTkGlG>#()En!4Gc*{q<}|D;pv zzu&nB+pGP*YPZ^*d;JGnwe_uC-|2td=+>@O?f!$tZf8W9d34|3i<;A9R%Hu?U8*gX z;o*$F_d*86C1+9?2`r@1udD(S*lPR7Tj%cb;(q=r(?R)_<4L4qhDAR^v^I!%L_sso zQH)lz`p&CP2YRcCi?IKRZzg9L+UME%{5;au$*>e_izEo7U|_J9AqdU1gn;7lj~Qxi zjM8)~YiPD2{BG2!WkGT- z6c0$Q5J!i2a>9UOw#lgo0vifk2r6Pu=Fc%J7F+xUF06cii$gKsmhqGru7kzYS}t@t zn=YEz!|)wMW30nP>0yvGtJbrBBAHAto_@#rXQPi=*^EDEB)zRA*nFaq>E8CW&DNWh z@78WM6H23Zi=SVMsc`z~FQMImw`#9}?Y)Oca8B(o<$U1{@$eZ-0i--0KP_U`4#~p_L2_IL3l-Z-dS%(C+O?87epz;q8H;XkBM=oYBW|i zzW=&vL+#@2cGcY1$EmD9Q6sMYF;EFTG!RR0$s|tH9ouQ`RYPVL_s;S#h2uf|f zV##W7lsEC9{7Uh3Rx!l|BiIQBLyB}OC>7o-mPLZux%ZY&Jgbu$gBIH;F2HE>0pXQG z8Mwp_8%YA=)X3zI8Rj4?*K$r4%n|d?sqa9aTntzY5=<)agd#vW2d1Y6NoufVJfP^m zFvEr$f`hgkvO2U=_h;w3hxck5y%FtmX^Exr z&J)EwWg@GWcAUt<&)6Nd#B??Zh%fe(Uf}?etC;Bohmm7SQ=ve55=170B{aML^Xm`S z8@?HBam`hClZ$Akw(UcK(9>E;41@HsEC9Ub^VuuM25QC(sCxj^K9HVK8Cd$fzue3U?H(M)fjpZf6nO`D|VNs|T0do~Bae`Bu zmNsf7B{1tKim7#$Ul{z;;Njl;gKyIH=H5HC!GpmUgKuhse;9ne_v^iP(l@7e0e-M; z;)U8#P`~>6`i<-L6trY?PUJyWs#?Smuz`Exozqr{=%1_+PFWjl)=2#pm{t=KP1#Wn z$i+U$3sCqzAiPp2g<`}=WQmtS0_I41Y+~pb;|p<~yWlok@vpCX=tRLaYxPbAXWtZe z^ZMp1w>H*a-Mn~d{o4A3Tz%3*mjWy$BVZJ8$}z!STC6}LAf7mu)%|p#@{Lxz*GW$^ zHF_M*eIYfmyLUqLnEK7=DtYdmZ$GQ(@h}jjnxUvh0yyU)MvfwNi+LY}HOf1Z)j#=^ zN$|C*YoTf{scueG-d_0l~Fp z6e)_46$;}yssB(i_@};NeX_g1_{u_DbWh%JlOC=VID=7?xDcsn2vHx5vjQmh%oCZ% zs@(1wn9ZoH#56g*xQBFKY^4aMJ8UE|1%|wkPGfBhA~66rl4jNN9>4qey+q&r=+j3Z z4=KDqJ`-wnG;D8KZk0QvC{xfW)f$g^R25={z{p_fl@Sv8#HJk2f7XS~@9skLyN?>f z9cf2McHv%|~SR(tCg*Zhw0?auA$?jgA2 zn>=lF8BW$t5?gwQo#8v22*J^#Ub^{|_c*;@{DNk6Zxnf*I0Jy_cJ=)%2a=Hkw)UhipWOvm~`XazAiDeua3ZF*P3lNlk+?1Z<+*xr>plfEe>; z%^=68*@BLR^G;X0bpFTmsvbnTRPmyoMdRVDF~&NMHDbamOKsZMuFr8x|E23^pHq#M zRmKvk^kk)|K{WrM6^}6+*A@sB#xuzri+01DW7J-~_M8SWUcE)J5V!EH`qkGi)o+mr zxTMc6#l>jPuuUsz81s%pGUqPQ2@*!LLalm8Wt>DvoA!4%V5fQ$4796idu&|pT-xnvHv@URup44biMK4~j}|1vM5$n-OjQT=rtY8p^O(0DjATWgoL9!zU|- z&0uFV1>^+7+F+1M2ymET1T4Q69giHDrs&V47JXy==JTyZ<3+1Q<3ue=EXAG?MS~L_ zd10_YloOS8alF4pgwPAZ;6CpnnsE`9BI~$zR1;}gKp~Y)2y=h} zC0NkB7X6O~pAUPzKS-=&wZT88M(@G5ga1e^;H!hb8+F%W z@pZo&e6jcT;J^0n4;~KwxcB!X%Cg?}Q>TAQz5GiDJ%#@8nSxrXr9S!w;W<(=I&|x! zIbt#DRK~@$Agc;LPP-GT>HdC6TXZ~aQIuaHo>9(RQW>*x8w|!;*%+P~Or(fOL{OtjReL8I!sb+85(P;U1LY)Q(Nl+%4lT_DuXZMo9uZ+Ns)kxc;=c@>V7rgYR)2M$@6HJ$OlzyHhs`|v-1 z__vRKc=zECfAhf)AAPg3cJKBxcI21p*Jt?f6fe@#Zv;wy#IAn6&W!m^mYfs;m1FP#7fke8ibf~wou?mwutf66h(4(PJ} zdX9`qo@x(# z>-8)3>-D8Em^-qVf={vDDCLQAY1wDA3LZS7Rwu2Ia>V~J_o&}#SA?gG`n_@X31Q;2 zRTD@3-YCuqDbY+*t-)c1MW86vhU3xaTu?{m11>F;$E*0Xhqb0;@>egM&Xqfzl&q%@ zFGYqMVFLm#TtvkOsfp!^YpaRO+ci$!pgZzvB)uNX_uEm%r}G#Ck# z_5*RSj$$102J5=e|LiSDL@a(uV{?M$vcvK#1ypJYLQ=12JfWIK7=v|!YpgPBBl{eF zqZxeYes{mN5d{v-@9vLLTb#d~Y@DWLMDmxpc~TEq8=iah{%12Ac)SV~Yq{~BFk)p? zZSaf}7ZX1(9216TUEZXI|L(m+A>(_~kzdB@)4A@SO0N`4upt;^OpNwC6_{JkwQ>j; zjiFvv%HDIU?b|Ka|0H#XH;?+E@s+bE-NfNp-Svw^hJM~$+?93}ooH*RPF)QUukE$jPus_o*<9hw#gtTJ#Xoa{jY9Pco zG$!W#QMmuT+ z798hsHC$>nx3=Tg?8&F4x1CZdAD3P!mWo6{dqrF{h!|N#C6ky&c(Hd`Tl88x{Rhpe z*16YfbmN~o{Rdms%G&KCQPeW?d-+#0VVx?-Vu+PNLMu!(XzeT)U=czVu$4S(_`m;l zV&?An-8;};S*w<8IddP`BN8me)DZyA4R^pH2pSX@3K?Q}%<{8pZmmSCccU6ku`TCX ze%9J|2(oGjwugA&R{V<-&Q3L!%|!%o>eV#iI`?!c_p_|vPzo;QQPFS=3`tq8(t zN=aat880lg&bj|*?`odgI+FXp^2+CEJ>MUDvSmxM%96|yC2x|;R?iptMDW1@2s-k~ z_Qsp4WVc+oPk_eF~mqmaC z9v=GF)6?D4{p%PS1dg+O$CZKaZFSS;)1A$QyxhE}W4T{|rHFchxyFoPB`_#pJP>0c zU>yU#ETW-@O(beUJ_!ARmh)DI~EGyBpHi*L5gwB??Q%jH++YMQO z-oXO`EQK^6NJAJyBDuyAV?{tKMjiE3=aqm}uXyOW?zUfps=L*VadzEQm+i~l20HQA z^?Li;?)Eg!pC#VUUzpv`HJ5Y?l|f*QB{0ssr^L~8W=%C00g%XKX5IN{=dWhNhF~ov(mQKH3~ORgV;%9DNR<`Mj7{B48ESCQGFd4l&QwQ%MGAzZ` zV@f$S+$cmCVuDHnl*f1mlRPW^Qkr0r$^n|X>HE&Ie12YFrwOnaRpS*Bf*Z~ZFH~|0MM~$T2uh0k0}hVD6q>DiZ2-;G>dxf~J>ukK zQhKFeGH;BDAp=r0co{(i8)HKiI1?tT#^6HFH!)xx>j;|W3b5!0L~r19tjsw^M~(@v z6v-IyDeI&HiHK)f#3&ylX(`A+v)a3$y57`-rmm}V=_A|dw09uLU#`!GJLr!WZw8Mz zi)H-cdlz|rb@t+)j#07h0OJ%}O~JDeLlQ)T#M;~V+j;xu7pf&@ww`k+8zXH5(k zIJVp=W^h)x*Y9+j(z+38YIE&pE*?C&mXbNPrSNI!zMWG`1s4 z@t}#OVq@#3eXC7PE-NtSc0~3IuoP0CW_4g>B$vcNKqTm3B^aVm9-qwc*Zo9sv!n-l zBzmAR;gup8FcpBYk%n7M<0{nxh+@JKmsf|j^U?Re+PS^+)y_A|V%eF+vZ?xsogvFa z=z(I{2?Z)tXoakDN{AGhYsqLjRX5lX7Ple!2<^=a)A4xr@~jzt$J+7O-dZVc7)MJ) zg-22#V+dCaTL(laW^oo3!Ok~3e~kZqwsUvqi=990eD(dWzJGVZBt0?Xv2;O>KDs&- zol?CaQB^46JRqqF2#J9)1(qWrRn`V}89Kuc>Lb}IxI7k8*o8h}o)ldvlFT731VY+# zK~dZ=jSbNuv7926RjaZAo4z-Qam&=%?8_y3M3k^ke5G&-B^^~-I`9fJ#{>&;kvhQ2 z*sN64zJjTHpQlo(d%ulOJ~@t>Ho;QmD|y;vCkt%=j)JIIhag&Z?krMV3qpieS_O=) z_e^G`4zBrLyk@-aV6*y}uh$!}>s$T%)ts|hu}@d*nOVkugfL6dR+1rVSWrq(;4vO` zU{LDf4G3kmE4)6uYuCH38Gc$_t2ev714DWrFmDo+ic&v-%^TtAx(klfs z5zRQ_EvCvEi4`^$8!Qu{m(1(r>TV92I*Q#xHNo(Dut@W??qQi7T{8q(h_Xh8T8fQu zUIRzgg7U-}Yh(11mxc~7T+za^u%|7{+;zuqWu;d){o$u?_}QgrvfVE6DIqYJXH?AL!YoBvaH6zkRtMvp5KL){ zVmyU$G$wdHC-#__rlvcwmoGe_Mzjk*f9bXBQykOufu&$5!L3n_2r!U_YzrKiW7rXc zc-G0=`Qh!(26TpZhqtzU$JN7I)%9i#dWpeoGHEfHrc7t7vzFcDI4AWKT1plsO?hCe zpEE@{8gx4Wto!c_wRJ1&6r98wnwQbTfGbg28!2w>qzkQXb$jXW&@{Dg z{;b-Jua9qous-~_S*zC$z9!zwAYQdsul3*PcJ5ypnohm8m;1ke{Y~%Uu9x2aa(vIZ zB;n!5?Q5?$@s=NcQorA|weQ8aIliU6-|hHwrPs3JcPbh`Z}JBE)mGiv>J2}RU!m{& zu(9=%G1ks$`bygD@067`ZabF3o=4b)O9_ajf=X+w4_acX64wXwlxxRn7C+j#PPGc1 zZE&fyYDw)mzstN|fTf70FvuB*~oGzU665n|uEk-^BK~vF=aKbWey;N!Dy^;=ztg6IK=ykvQ zaHC!}E<8eS(S-0yp_J4qqB$_*g5`!w?Fi*5*=$snS-w)g)qTrv_BV#Vt6ps4-f?rR z4EY%jgWFY|7It3AG-qd`*Fm1RFT~^1Pcaj3m>(Lv1F#2-z&F(KopS9=D?P2skkM54X7=3+6jl)x-sA@CI$zq+7 z2K~&sfo!-6HOpX7-~%GYD5QnN4y5+NfR*5~Y6tF5VelK(s&D)nbjIdcA4gji;<0yt+XhJ5WvPqfnX!BbTULYIj_d;W;dF)*?2Bc@I%`vu2VGYcnaJe3a=DN zLX;6e6_tj0gEVMDv0~b3u1yY-uQd?Xq1o`A`bONER<{7Qsug&n>*36m+7I45^W*%K zSx`%w4E3}Hb9$HVT#_x;10R9+flC&EAV-nW3^A!VmOg7mryO0p?`UM4uYMe#Q(c4R zEoiCgXH6gytmV-;C6%ms=x4~Y6mzBwLzp8;v^Gj<>HtWZ0f1s;k=2m2T{qwU(~a71 z)iGF~ddk1pp7;W^4NQ|^DX_u?>nS)2U{T_AGnQzijPk~0B|QGp^#kg7CnT#<=j@=3o-LQhcRoIwuu|xLm<1!~-MJ8Y85o7L%-6oz&}?y1JLlt|wswna%9FAL~-( z^U>#HCb@rUq-+QwS{K1Ei}4amHB6iDG&ZgaxAob} zab1(imqP_vj54@DFd~`?CY%97IcV<`SD9=Amuhn}4WHgenKXVl)RsNYT)tz|0C3B} z|HRuXPR!xZnEXq10aL*#L~Tf8CA@LoIm|TXUSph<#Ifsj)2;hseOSx=H}|M|Tz17k z8fjz<$f@E1X&HklN~Pg04Wh})!d&V0w$`h^@S91qd^3GzM`PV)R>>?kek`IR?aF@Q z5#7S9?8i~2xgUs9%}AW=8ao;7eTwfeatN#dh#>;bqG#{l@V$6|43*Rv{Me- ztQwP*uIVJw+p2+T{d%)D{IKr%=U!Mlq{XQXbfX2H$r?Y_y0+K-JSDAkLVf4bsQ7R= ziZvxJ>Yx?iXv1~%umT_vY#>fsmq$(d!RXfRJG=il`okXO%I^Es=%dk>qc3)Uz58~2 z`pezFZwsgVLksz|>fCgzlgmT5eRXb`aFuG7l^{`6E8v!S&w~d+;(o#%!8o%Ts#C95 z0|%WOzKM@g;}TS>FTQ+coa%FVeDl~fDYp{$D1b^e$WuxQP|c_VL1VNJnh*tsnZUCW zco+K}Uv)!u84l)s7PY4CDOifvu3o%w@yd&rGFY(p39uB=;AHecxHn2g6oH7i-%#R% z<4k5D`eG-pcUWsupJmng)7$^@+Q9d>4rFL2lX^*}`AjQ(VH^|rgbv@v1DH$K&RxCo zVhUkO{F5256snBFgd1rnCQL;~B~VL@me@J$jLym_jQ(|WYxH^C-0tkY8z0?Watme- z@p~$RAQrTZgZgF)}U2OV;j*m9`rLOJv zr?F-)w&$?``IJM%SPCykz|+>p2$4QoRjDjazK!zt`6P~l_riAF_#4oFQ1yCLjzt~0 z@139poEQ8YBEwQ_g=~8aCBZS4W-Q2{GHR_PF=;5rDwrIDBj#H6PTi@d7;v%XWm1^uxFx{OkfElM2+qf|3|(1xnS4V3x> z;%*&dQz~#OD`Q#59ix9AeR&SGW$pS^2qZtJ?ve+8p=HT!j{zdjaR4IS} z!A)(E0!_#=Wxy2A!TQ$Od#$zC`abWCH6T2*93zF8%SwRK%*?CT{qpkGl=NcbO0&HN zTd&S;e45S$d)3;LahkEIq~UCu?4!)D>&equ$)=A$ng6MfD)ldx^vO`nHMk*|5r&wu zgjvm{XIV9wg>J9CHL_v$h+Wi4a@cJcGatK*Sg#aI9w-qaE)ygs7sw0eIipUc5*yM- zSRUo#`RCs@bN0n+h)VrZxedtlqG+e3OWqaBrea;E#?d)vP`@*x- z`&9HYDl9S*8I|a{EVot*krc7LCU<|~EM3e4leYM728v$x!13_3^_oMKsX1S@_i5f#kmijThIO`j_s z0lL)fLJ%>))QWnhy+H)iV5mY4F$-C(w*IeIq1QgSm>6$-s~gw08@;*v9clNQemXf3 z@Ip5XNIItpNMTbM8yJ8BgosmE=&bXOZaq=ZU7izU9(nh>I(^$62D;Skh>Q_2vCb=D zHPT!OrkLl%3c~Z6)S&~5t8nwgsn%Q_eBXt~5$ly=Nr{UAQ?Qr^gajjuVa1U4;DyWz zpk7ECJ10(sYPXYznUp4)nUjZSqM@=4L8&)zp$u|_$QV;wgOD{sqr@)mjmlzSxNs9% zE6^EBjm9{-r=BN_44fqAIX(({&%z&uK`8YIVLi5lLUaqO;)2f;_nMLfiNLc$jPJt= z#H*e-<)=vIiLDvX`M}2zio=F0MN!&dAb=nab4P*)>yebyIDzuU%7z9~FST#1Hlfov zvsAVAAkjHqJNUjwd&ezVigQdw71t7RZkeG{018Y?#uc?FtIg%*FV{`y%k^&K%<9V0 zYNxvCd)0|ky)hbi(umQ zmWSuC=1EjGx9PC)%Aqs>!XwXEd`ud@gH7f$Zsm~6u`Y$?KA27@sHi;xMz1ZTXb!h39dmdw`a)XMG>)x+Wx zo@rh$c*kW-Ha|fgv0gEjDkj2Op~OJUJO&`tr8ZI-AKt7|@0Hh^?X`_N%Z-;ee*b!J z<4&gw-HkhoL(0RGAJ$_;w2HpP&oC=;Bh;-v+Zlpr+sSbIm1Qy~Ua3FUTY@w*rN zit(N9QgvfTZX18d_A^O#GgtZvEA>x!D%iGe^}>(0u}VKL{tK<@^{t+rr}?R!8|_ZK z#gnG(ZhmLs>V+#94gdU3yZJQGroZ-`3kw%sSh)O`<M+dyAdB*(56`T2VBvFw&Ypar2XYgzDE5!QvD7X;-7ZLC zIcFNDN1b^^v;5=5ukKf7wKuVgb%=wvrm`W&L~%6#Ss$@pDV9chO*v(PVUILJCgv@a zDdHWXS*JE1SDKs*byhj zAgn;Utg`SzGqJ_4fopg259p2;(3y4rDTXXX*%>P^3S4O}9dJ#U2Cp2F*qJOopvObP zF*iBWj<#)FuDbwskI3c_Pf-dUw_+i_7!#|o6o?QYhB%=qAcjCW5d-ZUe1BA*_S-!U zc8(98`D^pG%{qZu*V&c`@|cUJTs9CvK?02ZM)=_~yrh2PYGm=;j;oz4#&qm8(yT zb~p#h1f_!_IgxVV+ZZBd9w_ezv10#nhGPst2o2f>iIERR@tE`}C62JJET%J{EBj>q z9NLlUJ1d3FVoQZ3fd_+udxunT!a6E_e4V!}Y`(Sm4}(uq&q8DKjp$EbY`!^IAACOe zG|4hF2JhF$(zoIpcN3M|4$kU>Tp)&qY*56BoJ2XyGc`9{qI)~=BJZ~*<#3 zFi9-6nrTTb1Hui$H0G}Y<>{g}eXmz_mwP8pb?16r`y~(@WqP<-;vMEDtGWoCl_ad*gsPQ}p0;PJ z=ZWvp^u@oL>WkxOmpY&%TxelDa4<#(?UB<#VQ-Dd>tj6E`SRBCoCke2c+iKzDD@1* zF%z6BuwEMxuqRpzVv_0`$y%Dey0aE9+UX`DrMZ;b5nq?42fRC=E_OXnFms+u?uDgT zd5H;+p)ct8D(hUlUA0<`^U%1w@owEWIW!$N_rT}2JWYnB)LV2w2w~?Lr-%Ru&4P(R zI8(yltn%%J%B}h9uv4G<=sC(Tm5$g4iT`tMA~-}f%biG<`krSPs1Mv)ZUS&jQUFC9 zrKzt!n^tY(y-DO4vu*MjAj%uIT`7>kqQnUrC}<~`;>M;?LL_X=&9Vw+NfZ$pRX2Y5 zAuRhNeFiySNA_4pCV^e(fs})0i~z|%HouCX1vsN)tWA~Dm>F(R-t_pnZgb;5w}#no zOd(L3cZ}_-gF9rtVl;h>Lpx6tYS3cTg`$dRLJfDuVIrw9+E_%4;W7vH^OgDXpF7p{dD(3? z!hs!l6#IvlmOGCD8-)-D>v8;|krWuRhBL2taMSsK9#gR$6VjM{sEq!<4`6QKMkXrd>T`nM-W1s(HU60=;-X-s)N zXe9{sAuH>7x!rBAwd2y++AU~F#NZ@PKOpOyp9%Pv7hXMg`MF0drG2bJ#xHe*pq(;t zmonaJh)bOpK4_vG7LH^UJ^KIAfB(^&{V)2THTu8o|L)OG`uF-DKf2X_FcKxtv*G8I z4Nr%s(0dq7x>*>cm)I~TJVC}djX8oC=jM3N#dasOo6EjxCXLS%r&@DmzWug)OfX?7 ztekl(CBh=^5=bM?6DK`0-VtfD7KN&L@_f8PFRoE5bA7buz6gxMQS2QWL=ZL!H4~D~ z!)#1!nZSgTkVWiz0h(~Lo6dH|bybJrL7A#zQx7|jWjr`yy;3X{w&0D>f=Gg6I6$5D zmQumEQCWh=gNK{98-rhtkJ6;^y$>EUe#V!-7~GBTe?0i84rUK?x@zX1;u&b(C_}N- z3Bg(+0HhH}a%ECmtCG$E=OHhOcwE-$RbT#n%Qre(3^L2UQ5SvY3bC`W1?>${sTWy= zC^DWaWT}jis6;ey2^?civItz)pq0)RFQ${mI+pT{)2&|BY^Lu1*3tE$v4e!EHI@;k zVoXkwZ+`>PUceW7CM5PLguTY8Z(7LI$!3+Ih{~)Z#QsP1*~Dl4dyn2eoWrM?$94u1 zuQ60g{lqDaB}Enl1QL^Iq=H0@YG;VZ3dX*?wV{ms9}jQ{neXY4sIoxZs1T0>A;J|XF#>z_OH8Ywfg<+P}$#P|Ff+$niLEA;(l>8yzCF0N`7ez` zHMV&>zWFebjXfWM!{fE*X7W*HK~?He5O{DJyl_ZTq2t;htR_y-AZ*r%;ou(!pAUXN z`1COc(%r`3qru06`|%dHY;|R zq)TK2_dq4G!U40|IBhh@9g$+eAoAaA{rx2W{A$Oyt4`xeZ{xkDZ=7>gr)qV3ReZTx zIS+Q}yA2y7;kI3Bgr$vlt5&DxUrI@j^9{QczpK%L#*5HeS%Rvw=>KA9@@CSSLuxU` z31!Ej`0n8Ds}vwBuu+nUKnM-o5y7Po$Rls4%OXX++F4y(h3jdTY^-fOuuE+hqoD2M zxrwE?`Q9<@8P2k3G47I3Mm-nANo#>R$>OHrgAXdNYh&@XXrUE|;n74LvDscuXW-~( zr~S$SH3B0|4G)r9A%u*%Lj;$|%pt>StNuI8HZb4FkEZ8MPi#hjE_FMH3?hQLM7B?{ zvLNDy57v39QC4BE|MN$;`s@7<(jjR7{YL+t{wMwW{V)3W(%X-I(*Iq5y%GQT8 zd=*^RE>+7_G<<7%C#lADBg=tnpUwvM`E})S6PBVHT+9!^86Tt*+5ri17mG_w1Q}%o zq{}g~Hu0kIzI=BQs`CwEkI-b?f`y<8M5)%^Asmn}L`guP1Tokdf%YZNG-HYxXMFsG z&}^Je&D6U;vxg*|QA;{~Z{d|IXI@&kuQ$Of!J>tH)_37FojI>%7hasfikV)ZzC|Sa&+pP+wGZZmi zhfv3aRv>>H9X4JulAwb?hJa8SBnRz9gjGlnGLHe=wO6WEylj;i$;Z@%=g;LH`T{%5 zR|;oL-wjWLHQZsP0vJlXFxnHY?7q|}XKd>vdIrR%F1_^1#f58^E-#!t_oE5>WqpsO z0BS;Fnv!I~VzgtC587&O0=10zEIQ+rcFQk9H+ABS^FYoY$2}g$QR@|hsURpxsb|bs z6)fV$ORiWdyJeL-s?Nz;p1Q8&HhS?>oNKvwi(lQp4)aOZSvW%56QNQc@<@8et)|p4 z(AI~zJsajp^dp?r8T-O&XSL<7*Co6^vv)PWab4H_UwPoF1uW-&e|S-FBrBFIkrE`! zhPyG&{Su!woTtnTWk@SWs?jz`TclmIahn!S7O9FFh%Kac>{wllyp^e4vaL{{e@5>e z>SIU_hnKvRI5ZywO2d)#=JEW_JNJD4POC9T+)V6Lowe~+9n^K)&)=KUSCdx93y~i=Kh_MC7CgdgL z+*;l9)#zT;iG~0Msfyhj{dK)M`gEh-J%rJxRi_UI>~;EJz>$ zxaQWWz`;6Zok5^-w9LdSLX5i}+=*JhtwVgiVVQ%2W{dcW;q=IB7FeS6!IDKRCCAo) zjxkTx!W+!6s=X4V<PWXX?J>N45+g6n-PoKM znV4>!$cLmmD@9ETuQ>7^1?_Mu*n$dDut2auc}rIRX}sY5{?k6jUyK_Ze-pnQdpv`K z-mI|8!fmYe1|tH=Vnkp%Ij&^ZNb@{RDZe-Z*1hiC-WByy#Z=4%ZUoazNGzPPmS7z? zPBpD8KFc>@72>B(b3Z1C+DW3MLdT?$ATMy46kI8aX;U1+k`gbS7S2%0i8I^;?)W%C z*YvNxw&Yih?+;e$>$5Y^eCkYoy29%C3j2a-<5o|ddFJe;>&36=ecjqP0rqp%{`ICG zZ}Eg_+|3_cIDP8%$*cF9?tXww|Lq4$r0}TxPSM0{KVc>7}SHR z<5J~oFzka(e^!_L)p#>8d_2?it~Kc&Ei881O;-D1Cf|pcOI5>B6l7YOM^s=~fdWjV z)Sfd#v)b#PX3;HFuC6XZ7uFUQ>sd<&*w~S3*&H_SFPbXEVsv9j9yrC$2k8-TD<}{V zzzYvq!-&vxO+N;7%`{BsJEEO~s^n(rm4X?-Qlgxuh%yI^q=Pj$$8|h)vpTVy??w;d zGORXG!K&}aJLvfq*nQAo?kvedkQLGCDZ`FQSfBVU` z>4$NP?=BDSR3Vl^OO*!$GDuEjj8lLDP^=U%lsSxb>dE9_r|`S_?V%J!0c~ zEC$eXDV(-KQkv4($tBZ3WFpteN{XKAk3Q)(HwMESqfg`MGy2Mn$45KyZBzRR{*NPB zAUUofV&-15-LWs#Pr<=?Y^jOCpg@vgLot=af^agc?d@dUUxi+}o6tY9nmBoEZfr=* z*-V5rQ)5**D$JzwacpkVm{R?f#!F2=BCbt5C52;(raYoUC~rgWMd-mQT#LVVZ$H`S!-u*ojArWRVfecR3wV^!!bmpv}vSCYY2e|o_c+;lRm5a3x<* zkvB+Xx9jn`i5h*v?Q1pVXr_0s%v8edXcsD=rpO8@6+zT{Y7;>tr;bpHaDc4wKeN`q zR>!*;PV**PKzHG?*etzbFlk^GtLPmBq!fxcBBKOI0G!8mwEl6TVoX$^8#JKXSV7wr z-)#bLKMVpnidC%roMCMc(v~YrDU(KXVx0t|^VXw1iSAM_15{n8&ey{=81o*)A7SUV z5S-e*a2xV$kCUfMvJ__)F!2Njl=!KY#WLb8rB;%H%{sEyKOPgw9@cE2K2A$v_F^I? zP$|_B0ag-ciAIJBXMqPRjTD@D9S%tKHAFdm?X>ZmbwIqJ5ek=HM|7S}7HjGl~%| zY1TrElTdd@pF(28eq$|Vg$MrT1l!cnGaTQW2Yg3ligiXJ0-EW7s5QZOg{g;N5d+Qh z%FfU?;F_s4kQ0TN_*~%=6dezTAumIWsfVk{V|fNk`*O&!X4 zdc4MqJT=#eJdRG?Cww47IhQUx%MKmKCX(n}>YSYIoNO!^c-hH_Lvl_oTsr&4+2zjp-5r!IsFZ4nvNRqulyZzcb6OFu z4B;$oD#KZ+%co6hP+f@ug1b3w|IsGKha}F{<($&yw@HGfxPo@bX#+|VAvsFjS`Ij2 z5PgcQ4M^SEjPCa9_cu0vZeLs08uncb`!)fVLTa%MIv8LGLC}_BE-k~(N^MwH_l~Kf z^VaXL4F)ZH@_xo0x5}>&P=h%2*eDO)NgP01rHo?+J7P&zY4KvybQ4ehk*2+E7b5Jw z5aB7zr5eY<#0W<^?pYv4OYBnbH&=qAJdIobhesbiy0iYp`j?OXuI20J$1 z&K`>ITeYZIuZ<;`)5Hm25P;NP;6&3hW(Ua8>odMPy4#CK_1)@PfAqGERXf?V@5!cFfRt*BP&&F$Dkx@xV+3)Afd!B>fXhns_nN+o7N9@6>)W+3 z`|+f<39uAW>4jt(yr)gT zG!?^C2?~tGct>if6bmut@hrZXm6SLMy{lbteqdK-SG(o7o$|Ph9qs|oEdne>6a=A~ zvEUW6j9MBbQk)PK@RJU?{0Xu&K(1z!w7kSFC5#S-@NoRW#i&?fymlzfkQqZU2#bV3 zJm`@3oS9~jW<#14A3x)2a|0gyP1@kS(w>NW&MoXH$x@IFPDEMC`k>=8h@w(4?>Lec zJY=mox%}X>z8UYdJ#h~D;NZc(Ei4W6Jg1i=ucfP*A41ZIc{ zpx8U&Q5K3%m&9#a9&#j8i|whiOO0X+)Wxb7gvC@4z(^p(t>FxLOG#kLXR+jV`ti1h zX+#mKXJxSof1=gG1J}abzUG~wDb*ULg(tx%$ry4RYXJ^x>wWZ6!d|qd?m@2_!T_R+ zJZz7lJ=dXk7Go*G$^++E@)+zfmXeW=b3y1r^cwFJG1q5js= zA5DK_HX-yhyo;64(ZIPhh6wMJ5<2CUG#C?q%c}ictxZ3fx_&lEF`?Q!ehxSTz0r1lWf>Pv6U>(;+?XT_)m$+_@SbHXh#Iv|6`F*5QY%N<^7 zx~{pAqOY}`0Zq*(>gBI-ocm1Mr0@!nbOO-G%Q)%EC(4|^O)8HHP)?sW>h<{pxDWVDx!&wn~-92&6_fn~1^+r zP0DUUqgXc_GeS~KG*5)T%y12wDa?ZgpHEB>A7rxA<8vUy1WWHellZ|C6P&)XbeYKa z@SKqoIElG(!htXz2h9iquB}1L>&yptaBIxwIr^$!Pxy`PvwJk1mOr0O+`0wpQsq+) zi9o;y%!!vqVQG=|Mq(>TmalTQy8?si6!eCpUp1AlPNyHjto3hhn?ssxu-0iMz|1s$ z+hD!#CX(5Z6l+XW6Na%OpnwC_&KRwNi$Si)+ad8jtU?-{`=*^e+($RrX6coJsj2nI zYX?Sij=T&~L_{$Sl>4j<`{uo^S9(`hd_U21);m1=V+xIY@<652P%(MosjKhJvp)lm zVqJ;eBBq8q0n{6c5e?BzvGM$Hc`Rk8uN=Yt(NmW$EWbPZk$m!V70cH-j0_Dp3U$1@ z#S*Z9v^Pd&$@lrR`MIXMwrc8n_Qd}2ipuvovA;=%rP#(GTv0?qPz(h2277K564;q| zoMyRMefZIupElclT=C4$vP{UX7)PO*HEBh>z$U^-RBDr;T*c5WD^}a^&ED{%d;P0* zw9!p8KACGhCVG=^ASU1_RgLH#Ax}{t4B5bv@@mx_JJbT}YeN2{L6cs7b*J&HY`seHStMy;3-;Zy7zW&=sf0cM87Zz8q9q`lM5`pgPsK|q=RHLjX zD8<%tlk8VHuan!V^f{$*uL@RCScpnCAx*iqlx2GHn78P5>Aje5= zeBc}jDTT=jZlHVB_v>D>E&VtDX`aJR>~0cXDU@6p4L&%bv;^T(6Te2$H8sH^kptze z>SVlTnp>_{s@MIE`rA*^t7h0-Yi>+5v$pu=HpuTT(PGd6c^|wr2#0{F_L2h$07NsM zMSe4p{PMjz^&V`;d4lkBqpft-H2ATz%u^*;imNa>Nam0=90w+(F;+Mv5RPx5EK2LI z9)9-lzv9Wf!tQ2&2W*OU#>yagaMGDX{_BP2($Ww(IF~gl zJ|>8-&ac^2J?b?(n}JlzCsSkp<7)=C3a=DRi9Li6Bte2wl2{%AG;l+tS6OJjUHg6y zR{fw|0zMbreOvG-)(>kvrP0-M1i7FI2{A?m040dea`%?NLbHwUZlYsH>+xYfD-4_0 zj-3r2nkmB)^Ha5dF8)$Yh*p6kYCR(sD{8rLiebzWL5Rxo70%aYm;McvtnAEHg3oi< zX5jNroZ;xDV`oooIJ*!UW$2Sju zmE@J>%dfxp#_0=}Pn|iv^vsi-C{S#><5Fm&OUE5062MbTZ14slL$MRqi>yS=8)@s1 zgW2sNlI>(TkFR4lDY#M;t)amQ=_I8hSj=`2KU2g@Xy}&UN1Eoa-!iW~69^8ZRzCCJ{h>{b2`u3iT!+!$~~b7!yOr7#O75;e>UE>`Q`fmvv*~^aUI$DuUzQan$*6`lNQ^u5^WJBXL%7$ZR8c3 zw}oD$P*1kUPF{im5(LQDnJh*e3>;(F^!8)R{C=%}0YX;11f3v?jw?fgL`dz3Yw+XNmQmcp(Tq;9!qWQBdC?5|!5`^n4 z9^$M1*2b5QrxtwmCN#qc!r~rSh0+LFyUct`^=St&mLlvzTE0Rl36%N}f&k5sX4qhi zvt|>Ppcz2*hVR7q>6Pkq-}N zM%FkXjG~wb%ZX8(AZ7*PN@nG`UENgI>a}if*h$9nwf2nxDJM2HW%H~VtXI2hbyKebH0e@m*~RxCb}W=+G0vVD&%MIj zO6(}}l6Y?j32B8`4$cE`cW>6Klcg&CM74Fh^)!#PLvnqgGR}d!R0R#Tib+7uC}SyQ ziI^HOM|gBkvV2XyT;H1HTDF&4TReA3R!z&U7)XJmTNzLgB9XFUi!c);wbDjpx3okQ zRJs0Q^XE@otiOBT-CeJn{$PDDwDD4ePP1O!>fQBsx-MGGs^=Z7+Vz{w`cJFV!$G%+ zmek&Dd=&+-K8VjhT&rG)fGK%D;Zs_|152aX;$j)`Nw_fiDrJ`R8?u{EG3^m?!3wAhD6DybB%$Nj-5ckG=jv zeEY%Up0@Z{K6;q97o1d)7#^R0ruA^3ns-v?O0X1Hj=j->@Q9|Akau^|NDGe@dAK(h2>5m87a+Ak~7A@CZXzDgO`w|2TyCr9* zkuFs{#Wd57TEV|-e)!JAw>DpD7xx^Zo`XHYR;*^yd1|ayoNLT5U<8yqEwolBtJ7)pn+I=?z8(E; z^wsE-(f!eHTM~vtN5ZfOp;G;^LIZ;oc zSn1(Pf%71crA9L+yhA8L7mNokz>p)&&-&)MGl!L*b@FJXxJ3)9D1~&;oUs6bIw1t1 zQX`oaWSsNe-g2GlU5ltRQ;vxp8v~j-^E@rNVjQE>6g??rPyiC5KP4%_hB9iD$!hHU zqk7nbeqzh$9O*4}QydxSJGo=A>}5gzPOw)@u? z?NdHjyMMiSp>o8{MO$x7v=IWL1MMewH$)4PCQq^kkLuNW4YuW=rz!ULCm2ckGhym=Rtvl<_bIBbD`r z#G?qD5|Dug&6Ub3EOpnQ?flvq%EepEXM|S@C5tvyQ9&h8Or1l98AiNU$N3;`R~6@4E*g@=|jOgxeGp}`Xi%<7C;z^5cS?->~NrnO6TonMP|XCX}ERk z$uE2wjqiB-J#pfmuBIj^#qE5-H+TFpbUN#2pzqz~=32UA*Y_dx!Q==3;PlzEH`18c zRw&md-uYASJ9-jiPGI+JmStafuFJBoUcWT`_6NTyn-Lwj;!Z#jN&zSBM=FDt-7JQ2*Y0D;;(lZ5Ekep#wUqtF`vSGcX^g#ZjV=!fY^BZ-gdbhmLai)2$kv&5kx!fqiGiga}%6)5_2pRD3oRGPxppqJMsK1=bJcA zdD(nB@T2HTQKSJ=5vWYmZeX|!&LxUQLICmxIWKnmux9GjU3SLs#Kl5hbP4Uy134qT zQY^t*gTNzA6haz;GR_1R{V|`(5HD@#g*94ys@>y{!EJI=a(+upje0-_{QlASKc^%gUqR+r{7(Q ziwj)HptYoi>*$*Y>a9j15FGM`FYm73>eYR_GItGe>viqMwmT!eQZR$Xjv9<*yrdc8 zJRrrW<&#h>iw?<6$eQfx#>er{ueNCJvD~&re1&i_B#jHyN~#HR#9Ao=3&beG^xpc2 z5809)rNqH6=DG65(Yk&-d&oOEd!2Li)_bif2bkk!X9 zfcj2isv1P|u&w&g9>-mdb!Hmwa7sy1PSthp`b8t%A7{rqJrM+YuF;D_?oDUg@rOdua>8#)l_P*|v*pub%C8 z36_GYwXx9?5+VMHhL>xIMp+snfLWeP(6@U>{S$(|)7Ex-u5OmALAUyodbPggT@632 ze*e}luJr0|FTIRWb=eNOsZ}Gr@hjDxmBewn;;TzOZS_mdGyUpxGpHxE@H@WeD_8gX z-Og?AUa8Iwd$92<=vH^2Ux7=`V?T;8p3eCH^e(BK+PLakG<5Z#+gnfN)F(gmN)_#1 zdLh)eeN}IM=iu>o*73K+FQxYg5svtL^B(9YzklofsT%iu6Om%=Ik~tgU+FkWs#J+B zvW_RNa^?wjBmhvBmT_87d{*9Vy0U)7_l7Nr`92+pSqT>7YJ<}{fDu9x_z9k4!!d*BfU~AJ?F|}qJy#$v$TqnL@(b{t@tLTZ+@=w zfX?6ixSL7#T#}WO9k&+~;r6zxVe%^r@!$x&3yLtyoV6evxcIg_C;%3+8jnXGj6Qkr z?&v=ryggHIejbg+&#{XA+@}q(mXj@a$E947Z(g=2P^m%_q725uD5L{6CWiUQdzR>p zwaO}ouSLu@GmZD#MD0FCT(-)u7*I+SlgdC-H?WY>qj^0GX^kS9GT`7w!%8%xU@kvMR0nSez5$*o5`F?Nnmh;uDSo;<7hJhs} z@wIc|1ESto%mf-h@IRY#Y05E!i%XY)W*cFj6E@kk(^nP_Th%u93EsrBZzs z712_3`V90ORCV=-&{P*;-8XRJ)JpHjTCzj0g1NI@3$Q8H8$}GVQfR@s#XQEo@iPxG zSn@0@^xZypcBVV%-+`u`3p^CMvkN|@`jgm}qT*nlMgs{4iGzvZ9#~^_mN%Rp_I7{b z%e9I6J>MX+(klg1MFZfep)MGXbfP^AC}L}4h=a2xvX)@&w(q!l<6d^eQ+lj1O6r@bjG&sLphUxBZ~q z!m#(T%30x+qUi`w#+U+cISI%ER?JGJtimB{p6+@BW@Y1}X1QMW)zSc9P+fsrLpXWK z50_I>7Zx`;$jK!1acSJo136Qs#n^LVHDFGew~jbPV+6pWn8Y;b^s<%l6mg%#RU5X=XXMWP3(kh1ab{duOj^`>_5re=g! z2&F*QYa7zMl=DVXL$t(5W2z0wYhxMzYW(TL_Y&>(_^S!&_2ZWQYW!h*@h`_;Jp9G@ zUTXVKyx8&I$6wqw5%9u>H>Q}^62AwVOHa4MN+0Y;l(e z1(m3x08xsf@@FLwm+EF2Zgt~t@h46-M>lbP=q+q^x@ij_r5ZvBMlw34F{IQK(!SmJ zIgPF=aU?4@31RtVsH_}%1vvz5-&>$ARXy%;a6uy{iA8Cd4G0JUTW5^R8mhV0tDD+^ zt8V-1TGzmGw>mpqTN(E1bw8*Vkxj;XjU1=7W_htuhCE9#7t(l7y<+hmGS(oXVlZqy z7C?R0r1O&|^}71=+IPB*j}LjJcXz$>-Ft3^rKB}M2X;qgU{tI}N@?kIyuF+fNJ}NK z@kAkl3}ori($dn^ZL>eqPV#0y;G$XiAB_ni>6__uPm?~^^7`4UmoNR<#eI6cPsLdZ ztOXg6H{J%y4AaaDi?NqL4b2;yJ=d%Kcc0fcx06q|S(BV$ks0xoq8X@`0uhkjOQebL z5Rakq<{qgf7b-aG*@*$&i6hTueL33rKBwWTYkx6Ee z5r*rmfvnZKZlD8o8kWgT8o%yX%!QdtJ%%&<3XTs`H`A4&T$ zn|zYTrZAtcb<;qXYMtatGG_#(L^~IQ4>Ds6oMF#su;3xJjSwbyE-vJdEdmI=GX%{(1>7I$fFZL=cKN+3mmETG7t|zBl<&f3Wdk z19s)aspU4ia7}c!|TLnF6L$(*NN;OMkY#?APS-fJga>0qRwZon=;7>_ElT+kuwZhd{@v&nhz)#+Y* zWvxz?+-5O*)bWbQ@?-A>vMj~fTfzZ{=t4P$gaJ>34_Y9tAdeU9QoRa2SRTT>;no(~ z-JqQnUm=>B2CWDvq)m{L#KS9D@IFM3SkbIT_3Uwq6uQu;}eK&X1Z+`x$f!-}1sMk2y zfsJQy4biFgE+ZVXb*Waz1=17^X;jwxV6=s3!AT>XFC?eh+WUDL+T~ozoVPVKUoah? zl}-EEnmQr9T0AAuxr>?R`{_(PZvsZ;EO;hp(LCVFV6khPdQl?WpUhRhZBSRMUZ7e< zt&D(_V^L4I0Be0nMrMmp{fH82%AE@=4w^_)K81Z0Ht%Umr(S5ysbI+@1R|Y`DL~a_ zNynY$<-w?bJ3aFprgvE!thN2y9qY;yl*x9NWG%=k*AP(K<(Tr^!sS1GY5a=$&lA7Q zg@tPi7Zxrr%n2f`9(QJU%ep6Ya4yi5Y6t{^3Y1Citd%q>B*I8^Ob`)@?w@}QOOGmj z6E)c#7ePjKT_*?Eb+R3VTCHHx6B~k!$e9URdS@|Gp=1gOijs@pefayo`rZBC|Mlsh*o0IgIIDq{vWSbUY zHL}*C3?df^ql*-P=_r%!;Ktda`~KxYe`S<6#I3a7F9F-Ltu^o_F4be(!G@g4$(Fg6UR)(hF z0XURxr;o$+f9^M1T_hLUm6cI5@Hd*vxYmv)>_De6N7H7_FRkr`eXVlZsI*bQg9#`# zgXod56fe@Cb&>h{>g~Y_zB!uWf$88aT`V~*y;?9mf+Jo~iB<&1Xo@8XFhwO`C>nfO zXfCY(st;{*dHsW1OY0xqSy_L7ID*mo`-{!FL4R>6{oAJJeAZk4sNcgy9HnnQy3;Pg zokd8`9ktCh9Ht-R3htpbN}#^KK( zVct$GKIkk%>CnZ5=&E7VRB#rQ(UuuZ35YNzSm~uxM()Z8^QhpEUgYuqBQZX-Gmgqr zVT8H(#^Xzmr_Ts;=0}&VGIPjCVI0>f&v)EgVianvm?e>NN(@L|G};7l@x~8p;k!e& zZ+68A>D7WMM3jOA&NXsoO^U1{5ljLEWsA(^MA0dIoO7%F#o_v|<`e;w^P>B>Ffule z86EuO(2H0E+>S@Bt|*LB3(bX%PK0p-wKq{J0g@Em3Y_nqd>Pta`)2Exnicrw?t9JI zRUGz5czc$=?IN%FeQNWCS&Oy?Z!9Qcw6Ina5iF-%rD)ypvR;*C=wWEPy+BVIO>LK7 zEucmlCzT;YVbDx-3L!)pIpNM0^-iz)vug=BNDIFchHA~QJd>hE z>!fEil9VtJ!Yfd z%qnMu5Jj9t6U!+3c^f4>UPn3VCMci#WzJl5YIVn>0t{Tcm@Pg;VPx>23@CI(HX{9a zu-45ZyeKi~{CR{OVArbOnAAB%h=xTZK!OS>p`gSe0xK#Wy$m;oxTjOn;|P?h&M9qk zN|Vy7#WJ^%DP$Z3vq%;&~T1^OPDz!GH^S zqJla@1eHaN?iX8kdx{_ENNU|g9JICh>M&5^o0Ejiyd!=danJ$EwYTB`QY5_@%^)}9LV(k`Kzy8=Txcd^!mcZ*Uv3nXEWyb^Ltn0 zVhtr;MDR`%#gtH*2A9X=d>L7HyOv&a8MkpeAU~X*!df8^>sj&hnxX!0Q9o1Ak+sIelaO!#=d( z#xgd2XfC&l>mRg3oFGJ=J#RQZEXU)_mUSK#NwgMs>s^!{i2;uma$h0_;ZhVN1S=}) z-Dwt}f3)>@tMr(Qj~%i86Y%B~iM1AfFxGM%8BshY%gun0XdH4u zQ&e06|7mc8<_#Q%Jr1~*;~h%}K4pG54tTj!-X_0lJfmQWIAKzxWdcdDbCfK`kdo@C z_mj$O?RZru>9bBeXQwhuneDmEwso}Wqdxu2bUN|*Ay1!3bjF{o7B;5^_aXq7MhO>l z)gubYlNFY%D3}UcEeu;7470-H&fxB0aCb_u9#m^Qq~z5`PZ@B~5h$f-9WA@Jz3||^ z8$P(70=$*s+|VggHFS6I+Z+BSrB{okXHHP%lfN`Z=i};p3=*TXL>94pZMBg$BY+`> z6Q^*xgR^VueMU{aJ7K8QjKHW0$O9PeQs$(ix7tZ!4XOY|jb0nS-1v`&Ki&9p+XPsPXo|9& z@Fd0EhH6hpI+rqv5QI(nb5XSQj~n+NzVq;{jbCqklDzqs58vqmtwRxL&BmoxU!0JJ zMaC(3JD6>5MQ`Ac^Y?sDVekV?~-MX>;_YzEruM$n9 z0x{YYlzG7+NE^NM9<*1SVNuvUd5f|$?Cx%%_HzqWA9o{HLLi|j16JNJ7l{N*tnqC(%!Gp}5~diva%OA9kfF!=*kgJ%JKw)>3mkdixaI{IL92Jee*T3mWX==WRL(x{i3 zN2I-Ne_ZzOtjgiZ`u2fUtzJ11jDo|_bd2oMsIP*=4oJr#}>2IIMN3KUo@EDy!hbR<9$^t>< zl@THqo!%a-thHagzXZve^g8z7{ob)`6JITy(Fr1C&=3i?7>!mg5S|Qj;I^p$;lY27 zwh9S5-Rg6X!w+@wbW(8DC?W>0MdqZ{!~{pZLra9A>DwaC(SEx)o)wxHwCdvO7twr7 z0bQwfktCauJV5f)!3iss3WBge10s^5Wbga#4G+z$ZLhu6_VONp4n069eKMlKSSJ!cC7+(1=L9HRRk_< zu0~769VbFlETUVzf^Glipg#_jjx?J+sysgEU8)wRkHTF*!9Bqp}V-6;?q+ zB_tuVbh*Q-+j7C7Z7!#;Ls(pe`9#lMD6>l_vx^{WQ8qylt|(9jLZg<>JE@iC1O+SN zb-#*3*Fy6KI2g9=(!3rLM#z{g?YI;c3lH)P0oJ1G4ROqC$7A|~+}O-)Xq;d=iXv36 z3~s~fGUlbfXNT+m>L&@Wb`1Auk$b?1>4tj_Vz_5E6xA9MZ9417BIJ=T&6MNTD7W6K>6gFImUniSl(Kvg^*wZHASJ>=Fc|oeSLTH z{^q^S-)w&I^;;)Sxy1ub4U)vy27l7_uliwo>q%aAH2xp|`1GG&Ie+ou`P0vwz)Y!= zl%C|rr0=!-ifpDP)#^7=@SaP~GIOg}I&*qZ04hL~@izXbznGls?mS zv2gL)nJbqUvRkcDknLF1DhGAe8S8ZrJa4xlATw71pjC)Pan8p5hj$;o+dTY>jsI>Q z&CR9<58r+G*2BNt_;TZu<_{*m`*h=zKb#u9c{*9Lps~qYiTHI%}_<3 z5*+0~7CC^;pQoVZZ#F;Qym#W%>e5p_yR$>o?ZITqiCIT>vOSob#-&zIv;`@FX+?+v z#!ZSSGu5L85n@qQ;sD$&u_!J1bveh4xi;%JT$)gd!IWu*~ zYdo^};$pTGYw@K@3K@Wz1hiqATMy{G$U8wqQDfKU7hk{KZ2sNm7n`4Lew-Z4$D5yI zCo@s?I$-DDg@}7pNOwo5R(Ygk$zU@kFlZimWYTk#&MTy*$T;*`cl&1YF&}iBsh=SB zpO#)Vm?@|;k%mlP=YKTGs;kE-(t09_k#{n{{Z2HPQr$`}X{GJEO z%eO{;bN9V5TjG4ii>?=Cw;haA@~g$vD#eZEKr!KJAc9v3-+*J%?jqI;91IuRsr5*^ z&;*KOgXTU+FD9i|jiry6^50~<17v1dYrq?1G9c$gH_>O;k~Ef~2eYQ2j_c9f2bfdh zt41?w4Kn|ZDlg6OkuwveWi+5EVwyWUTwNXQMJ#l@4rZB|ofKRxiq0vjtzpV5k{p2Y7S3P(fA+4eIjSo=|CKJDNAbR2@-T&LW19j50qjchLhUOY zOX^m-B^-DH6jzNalS)mJ$xO;qaq#3elT3MR%nZhcJP2N!)?XNnGx-@=y9K6O-D>UD z7Dz$|q0*(hPamys?Y%C0t#6H4Uj271g#@Q*n#5xP0VGD;c!z_-E?8!G7J*{#)85_n z8@+q$w|WoL*W`w!YJx`ZVej+xkKo&f>o?Oe!)_2{5j>hb>coCS5+p~crN}cGqjSo7N3dfWLTa%3L|aV-%}PYSU74k&R_fKP z+aagSjSNbz7{>@+GlTW25OI`+mqBj`b$P?PSg6gDl0V>WPYqp{wn2^bX1 zh*ip@f`dM_-uj)N-@Y##f_#;vb6R_|=A{$S(QXB(@( z+_?2s`hNAt8@Fz6tbVhx3XlHH#;t$dSp9o==-Bc1&2#zfNfzhS?8Vtrvvac(vN#Gn z3_bQN@>Sf=@|}$7p)1uku43?rnM8=f5DOusAOUm2O&+7s8!L7PkCN-{M0~Wt{!VhG z7+U1001QRY*aa5^cqT^spfJs2wz2THulVcrnai%uT!y7r3?`St!ZLK+7(@U?>sa)h zU<98D%vSsIAD;<}@UERJ)zaknm(Soayi(~3i~TF?3fRqCJ$L@kzCUn1_%zMx`ljQ* zo2#~$T5Y(+8Qb#LUVC@$?BK=Qt%cpFNqX69XHJ}X{lxk2m*XOW6Hdzz3<@4hwBmtL z2+l1gS=9_xpTqfj8hBbSvZ=|4hox5xrqWs)fw-hnNTmWrl1YyeL46(XVH#l^ zq_u(Gv8-`ahNZv?D!GuBP(ppg7SL2)MeyxtkXZzZ%clCE26gwKZk1mtpaDDV5NxxC zdS^u{LJ~$v%Oek2^Qo3Xd!_Ds-*w;n7V(wB8I2ag35LP16)I?k!R7T@QcguyHQDu6 z<3hL!R(;X9;MeY?JA3~-vZHG?#=Br3$&qOx@Ej4WIO0cx; zrs?Z5*jGg(C!fKNfL*G71aTiVj+{G0l$8)ylT;i)!INj-GnP zahA59TKT|K%abd%1@4z(9ualP%ODNNtrSBJUXjGyGff#W$VVa+k%YkyEDOVvowf-J z1Bs(UX)5dOX(ycRfrZEr`CRReR=J6 zyJI?Qw=W+%er08QTy?)+03VU$W!^qAL5`&us~8Y?;@D|JMMQx_p(*jHw@ca-{Mv(>TXGkb6GOr)h0-deuvLzMyC^MI z7I`ie4chs z&T<>R4p{I*9%D+?pL|u%Umj4vZ4ocjMFCz$VnbCpQfDpv!beMm36da^6>V-(R>5@} zOJ*T}o140J29j2XQW+1n(aSB^+#Z@zt-(ZruEeM)gs=g-h_PY{2^L+*8-i!9hU-n! zc=PGFl+L_)9vU_JV^#XQ?Ui<|M*FQsQ(#rDR}i|=$b=+OkkmCQb(9=@9m2C3^V2cG z`i=El{p9{XZVqwSj~QD>%ZZxq7-tMV#d;&OSHUxegZ0t|X({YSlzA^=R>jdKb9~jT z*8ZzzLD~(lTLoB(D07?<2zitYR2fShCPWf#B-1ggXt(nc3yP=_c3yxvHq z(Vuuy(&af14UxOnpX=xN{~NgIDx(>vwq;gD*TD!Q^v2j_gCTuY~X@E(CZ zK~6cU4l_d?IRFfG=iWIxcjD5y^C#Xq`KRN!>PR_PozN=CU__uAya3^?);vV*Vmg-3 z@&VkHYN=hpeUFfSQjdvL=t(4m;qPY6P((3dhRbH5v)%CVL#c+t4ZIBg zAB|Wjvm1L`$V;`621S(<;7dkMWb~A$?jvfk@nYIJBy?XoueX^)^5>J7IaOk38&^rU zw|>dHuU|TS_Kh(vNxHjI}z z*rCC5RD#8zY8N!b228Uk12Q@~p$t~cI+b;zH!ywuWM^UR_F}a;hy9$HuR6)jEQQnt7A->#M};FMM7z|DWVJL-km+n|8YG}+(3nViA8hNN%siS~tcX@l2V3 z9YUd0CkU~Of?d^&i#{K)aWV*>%3NZWw>;nlfbHL;wjHhTKdPj_Q+rZ_GAzYbkPyMj z@-*L=!iElpmm6udHD;3+Wx&o(Sfo3Rr2fmz*B`rhB{Y6_8o`j{DEF*8U?g-~Gi(m~4HI7IWa)^C#avIX8PchdFRq zfTf5k<6y~ih@fIXF&d17=V?zDk%p}Lzz5y0y7#-Ery{QIo$miU`4GN7c=E$1x9Zlq zgVL3`14gAfq=`h)fv+ZmC224isFcJOQR`_|=IcT=UoDPw(+$LGX*b|AcvAHJ@|}iP zD^~jsf>Ld8N?IX|)`JiqP6DS;b2RaY3MY`0jDz*J)<}kx5-5ng(GRCu?MFX(ztw4+51q{; zhE@kmSWU+=ZGFSGf-HyFxWwH@B}X_4>6piq1Rm*M2b*mS@hjtEQ`# zAfkGizP%_*QRW0w=aexR{5))(B*an1Bjb|dyh_Kmt;QBi4>UoD zl<7f7B-1kmtj}dvildO6F$<>LD}|g1#0VaPmqt65RW7|`7R*Z3nXd< z0=ii3Ty&s!&Pv3n10~c#L@dA^2qf*P|y%?_AN$Vz$aFyx)a)04PcL!#Vh?N{yoc&)Wx z)I8X`=wH|(zEU_j!BH_D6Gy7lR0rj-axy_=}`~BDd_J1FJ@$Cuo{?6>&NPet7 zE#JxT4kJ>kAVCQYezH+64eZqt?udJ*RVu&D>K0w9mYu2EO;dFSPfzOP?7khWjv!L1 zBasnmk+#k$=@G{sbDHXJzzaut)BgUhcenR-?_TeI?_mRec)0%4-WR=xy)V-^xAa}3 z_wo8_@BaEtc-}X?&(~MiZ}jd!nBU&x9j7kR*_E$ffM22RS>%X;{YhY~Eg_U)p@TID zMP+GLqvczbfBdk5=wwo<_mLvU%r`XyvMa@rVJ;9eQG0g_n^K+OC>V?xxQQqdgPanIdBuogT4(LWReR=H)z`dfEW@Ak`X)2h z!0~GBIPRO{I2oQ&?NP{3r=!BycpoVSk5Z^$m`_9O53vQnoV;uc(0|KPJdBeuSg)w# z#2Koz(8yz>C3}j;jJ#}z5+w_P4OChyV3M{PR2pMFgOy`e+AR3v{ zS;rz~rLzpTSM|rl*NMAn0o@|LQaBwVSjXVCHCk(Aeel6L!xRtBO;0(l$I|HT!;X3G z?CDE$2O@z^^tc52)B7uiPY5L_^#Z{scFMRwA_);w2w$_(CO?80JB8g}^zNE z!XU-9!7PCDKw`iVX%n2%T4ZH*zP-2l?I-vDaR1K#-udw#zWns1AN(mcld7a^_T~W% z8HY)sqB!JyV1`B$g$>RG%o$D`RpVl{*lKT2o7h&xic|>wXm@}h5ev0iB4bTRG(M!-4DB>2q=s~Si!L^;l^}|>|pJ?(g)OC=b z(Y=S3G}H_aH?<{d#yk)x4kSkP*Y5h>=J@{b@kjOPwNc&kP*)q{ z|9WpY{&>(pGyZrj1vN8G)m=>ZgLhkfM7Cf{Re%a@v^FwY2qBn@Un1i~OmZ2ptbTx% z-mu=>^i6eTe9sROQDEv-XqLKtWdA@|G7fp}j)ZM|SxIf)RaS*gnn zKNvt$txW2$byN8&YF)H`>DOthw+0YViI#8%=c#~%^GWv6HVi&>cn|;KSGhj#b*Cyv zj6{xtPN^z6BsAmHXyuvWOb4zoiUtBx4_Ow$^qXGY*!9!ve(;`O>;Jf(eCcC!?Uu|! zFMyF~mu4~8)CO+}V-7{gC5y2rbCMEc0B2R&pX|JbdE;JPfjM_&_)8)0v7TY=43dgq zEeSYoF&GRM5oNPR4-Bls)}({}xspV8QV$J=^T_BT7CnOFnln=*ga;Jq?jHC_9d#tUFQB$Cv7{P=T*m$9{c=mQb*me|O7e#(lz!rD5- zcyI{4sofQeZ44GG{(4S;rHFC}0$EKsPuD?$C?*g$m=YOnLl&Z&CO%JUgPP5ip23O9 zWTy9(-}EdUoYT@P#S-Gl#DoeC#FA*|4T+(2jKBotA?s@Y{0O#gL5l6W9_=M}5$%!x zKA=n0&LBz%W(pgoxiCyBn^pr;ZJEfrCc0Mp;p0cu>c~N_|BOAfwZkMHWSkf}Pl|`g zi~n0CS&VZ`*Ex1++cVdWVdX&?CzLQDuMzD0$PaprzZ;*%be{jHu413`O0l#IA(B{F zu=gw=fgz9}C04|dELU*@>U6KuuP#D-!n@7zt6#P^gqxEL=t%Q7d+di|ZYum5y2)n;FsESs?n&qLy}#Tw?QdVba_;7}>*wCO@W*o+ z%3s33rt_KxB7)GE8Hri&@llSjv4xXaHjhV)MThbW?fZkdOXWS5AK~>jCQD8nU^bvw>attI4LaQ+S{lmlqiFl zS4TIu5$EIPC!c>_Z~Rf)=uUc6b(+i}M}4V>`^w7MIfr`kXr;J0M1YwX15u5M@QO+y znGh!C(Ku@?@>+j$kJ@t3Kln594A&} zT~M6q_xzy$2i0ob8&>B=Nu>2Hh_KXyY8A}BjUZh~_M85l{>)tMbenwi=OoXcXZ>*3dNj3$=Be;Y6@hq69JQ2lgrw3M z7?o)ewT#}v9g)ovR^a22R2lVV_efzc_45Kg_fWgw-OD|02Vx9m?QRSFha28pi5yg&R zr5x8BgGa_Jan&M*m#@EU@hl{mCKpLhRt#J8jL2JO6+@isz+%X25OK~Sn-zO)K!k46 zBG~m?zQA41bK)z7Q!wlm4=U!dIB;n^2})yZl;%9EC2#+-zw?vfl+$PGrh!p=%cW$K z-1me~^X1vu!-QFicFcJ#1)h31kZ@9gloBk&fJZ>q=-(L_7;uxoyX8(th;;o=PYAU6 zIq*K|m17Ag7|cCmUQp+(6_P|$X==?paO2SdE{V@ALcNq7MrT)E;SQs#=gz)4{l723 z4x^x?z{G|i2(>&=hq=(y3P2q3BTz0t`x)yP7upyX;N=`K?J*AyQ|XLDL^4K=m(o}z zC}brb{V1l&#h0t2xeI5e>V_)SSC73EyzqF=im((_t1&kMh$b-y!OTz)NK#8!3~sY# z(XRKmq6vdubks)8;refF^i~{Yl=f4wIAd`B&~k7iJ>9v=DSC zD&=|;G{m&WDkVLM;WABY>0YqdlbzgR=@8mo7ECOTdPK%<}T9unq&L-UU0MYKgJO?V0JclUiRq z%Bt}>QY^(56UDi+o}?x6Bp59bAni?rIb=0*eDmR-fAhh=eDlG-oqFRIJS+OVl$n={ zD>qgyu3TAZVa$?jvcKSjC`+Cj*bhm$hIr>RRg_syoQjn zU;lLb;S-wuZUMrgOuMzr^8AQl|ANO@}r1!Az_QJW|WkTuxwyGMWh?Zbcg-J^f} z_GkCLeem1g|MQps_v^pwwyQ0Op*a|xQpKS}Doy|?hKvl%8Lx$Rg6pV6S&H+HA51#^ zL%qyBN1X~Drh-#A7weoPiFlj}&^~^IK((PVMj71dyd~%3FUAj=;jQtb=z9m7>8m?_ z)79e#)s6A}=#x)h@=Y2;uMb?G{Dl6KoREv2%qqnZ1Y4>FoHL1-1CG5BF?O}_VX2id zmQ^-uzW>Z9`rKx)S0>x2-Wjd+n@#xfyaC_ob~c(i)KJ^bfvHLsNe!{BRnM-Fx$l;+ z9g|X>5g;6Lf-r*wAt)(~qLQi*VuGBbGd&m$Mz`WmO|kGSrNioi?L&g?{YV!pp65ab z18H=8V&5qC;wJHG)cm zt<-@k6kldFCim~u)!W_-YB#&wZ+i6)N_X9@n=iT({=z4G28B|+AVkOP4&t$WjyOXT5BmFvBs&$YMi_sO-1;?4O+8HbjFhxZ4>=X%; zl}(*pAJolo3!3UellZHqDs4+y_C2X;c!Zw&d59P5Aut_+<}6i`B$k|D8@TfhgUU)7 z&h(oeRLS(k_gITY@UX&Qx_P2qNHM1{IA4&(2nXZ@1rwwuRw7^s1oIGpV#r!j-$30P zo;DG}_3^!ETk2lFZn}N-FS5GnKuMN@Ok;##d<+b@BcPQ5F0r*S^{0enbxS|~RSl!T zSHEnki~acNu+743LWS1Z=;slhFUC@I8Dq$DMjg=#fO2607$A^5x)&A z0``phzzvF@DN&T9WiK=Skj&?~0|f+lScg83C3;D!KO<6XliF5(_{| zOC_XsA!hM8ke+LX<41dgREG?jsuR<~nIB*6lU^y7nn&l$krvDts{;)t5T%$1F0ic1 z>ndzCP`&B5`Wpj)Vd@J!aE^G|rtj@5or<}r`$>i z#bbs=gSRSZstCj0iY$JnbIqOjmc6<;WW9zubhGtwnSsfZ;5mbGug45bi?0yP#O;|F zYq`{c5vF5aC8N&J#AY?<8%{ETsV4(($7b3sx; zv5HB(!@&s^gaa&av?^JC$R$d$YW%2L9sg6my3yYn->YCPVsmXUzTdO;ZGY;GwWYot zSnNPIx8o-hr&4{wNII3414$y7Hx3!+9Wf9j7g=fQ8K^hM_Y=QQ^<+4zwMpPaUD)K^ z8_pMDDY8^(BDoA)InM>7h7+NcL5?byl~7J>S9P%-4%0gLEB;P$p=~@UYHt_93BmS= zPGF88OA%%`a1(;`KExv&odMASSWHTYS6M`^TQC~+jfqh9! zoDR!ZRL_2ieMyIbQmi$eDHUT?ECRB@3(K5TCXvI(-yuh9%wW{>d*f_R+Xgy&wVd{< zy%@V6>2k#r$Rlll#i-UA!ibZBXsZb3SyAp+f8p2r&1U}&eD(7UcsgSTr`|BlLAFYu zLpMmwEFF5~7jp|!x+}F+t%#KBi$)wVY_tOI17_CIpd5CF292{~=PUj;Y@T|fci@^S zf(S~tb;o`cJO8RRJ;|K7{kSusXJRWw5Mm&LJoid^Whk+pU`+y3+7PsfbR|=;?oEa)9@zHdPwDgHdMnFYWSyps8T7#ZTeLGWaPhE8R zebl`DNEa)fG|FIy0zu3woc;0MWYAv?oU%!_qyl#yi|93Cl_wQ{?*oeQO2Uce3JyBWyA`SeB(Yd#@cgQeYM_4$d$zj;d6w6nS$Zm(y;Q zw(HaVRC}pK^fYO^K>Z#eoEHhsm0&5Z(HB@@2zSC$9a zMRc)aklbdxDJ%;0f?)#+$6zn!fy!a&V&Gr{wwgMY$Eax=zdn`iby~5Uk?Fgw3ilM` zQgtKR_&~Wa0#m2CGFlpiKq4Y_R*#rnuY10k9zp6fZaFosJr|nBxmf9D3T4D)-Mw4rucb;OYg(QR zItXf~MI*o|U=()cIEr1_QXa;7rH6kZsM7q5?me`l;mqN1Q(Gd3=D-(0yv=ZZ>#Y0w zR=*X0`k2|T9^RgJ;cJO;GbL}c5KGZj*2FBEa%m99!TMC{L4qp^h-DT1UhKA8-`nCB5meLp*$igEiyQ1Tu?%AoE1m({YKlb`F=J0-Il*G?uDG-O7rC6AYDLiv|~>u zo8d0iLT4mlj1vwNA?qn;7=f`?V5hTquiCZoy?S|C-BKhDOIiwF1vPvDhn5JR>%% zHnP&GE)PG1t>LZ2rM9*lV?3OvnU-EDo*JcEg#kwlx6X6oythsZjk(FX72$ll4b@AV z;Gn(v1~hR?EiL&0P2wgQ76Z#%Pzt+tM@mZFIbdk30h(fU@dhDl zjNwKGVniyPxoBPt2%eSe->6>gng{Rs2ls~`RsD9ilg<-eU)FIR!@AEAWhu-M2!QgI zF&tFjfq9L!vlItx)nTSTuomQ4h^L#UKd!tqXZqu*MPqxXKVCe06*JT@`;p#UDR71X zjnEkk-Ug7yV*!LokEP&QVb_-L_#2zPy<{zUJoh{;zhXd@RZ1i4y{8IkEvd8yq@dc6 ztYMyda3<|1)#-rL#&SaM*qbU-c$DggMNuO_p1e0k=!7{naawWL;c{LervfQ z{5S#Dr0hz848dW=gj31}tkZEtZVj_B4hNZ4pSkd5p5SntNycrYJd4{r9bGCoEedp_Uwtv5UZ~MQuKRGg%h`pDG^cgfy z-M&M0w)}PB24G5+g$CkW%+0hj#7GQA5Tmq1)DoIyJhtB-zn@RH?;atc$lkqUwLB0q zt18p5lq!k$j@y zUvJ-upZh4PcKquedvnq>X)pVHB9zY?A`@iHv~XO`@#r-4@l~Q&o2}JY2t|{$6$WV% zy_%GPdy$nIT}njv?coO<7lZt2r8B78ZQo0jK>JNxkNw9%<*tbsn~j^*rzgfPow%Nh zNU6TWKpPXR5Jik3sXalG;NS%kE^nXph4nhU6+fpMdb)bg`GL+O(UqbYB$kK~>JU?k zNkmN0#*yg3}U^SPn&tIG_T|b#!#MPJfSw&1QSO|uUYUVw%))?so_KXV~ z70+_dL&(ZYp6?F&n~+pv_SF1@GZo31KK(hKllD~YkzO&DSUYNw4@`3F03724BmlOE zX0`qjE?g-(C7?d$5iPZXOE{-dto+Yh$8z3QSp+wDNxEoXoaJIC{wGA`AP zbcY7=zW>oGhKO_;+J zJId2;24*_XBY!ioGPN+ZoEkc!j>d%ii*>;;ZI}r>k$fnp6pQ{iCdOW}ybE{d>$(Hg zYp}irTf0HRT3uZP3!9bi)$7o9oBcQHy4UJ<-2C87>v3c2lsx-+!P%juTdEIUIOkKa zjsum3E2OMQ`?y}BkTvTu`q}8t=-$pRM)#h1ZnO2s86MeTIllBDje9+NaVgXj6(jZN z{B;Tg6g89)={S-`NbK_HU!RXZaZtC1AJiS+sV;N|HFT<&f(}v?6F-uY(Py3u_3^un zlZJG*WQ%ox5o?LiO6nN(n-mlp4j5yk@@&O8Vtw#mo!SrT2e+D;C6{6U0rTXILM(-r zIZu^NlQ0-jNkt%nP|j$uL}%4jcYZXwJ^Fm-t>uR2!YNDxG^Ogo1!4%0a8?A*xweu! z%>vNCL)P5+g?`&t-4H{YS!&8tZ1nSj#A)Fbqv;t5iDu1$b2ujZ9x-PC12&!>dXW>U z`5bviSBjSkJ(Y2oaY_9m(+$P+@kK+(TFNTDHA~wrXcvV$U~(kN`IM>eXxgYQ4MVU7{hL zInFmZdn^}_z;a=VG*4o+Yd=7WH3d{M&&W%xh~bQIN)(n{X_HrtjV=SK=ewI*eh^i+ z|L0ibM9aVvpsTA|$<}JgZN&(QP}}>bHismRv!PQ7D)a zUn!i1dm0#k_ms!Hl6$UWB12gk?azAbzhB$+f$u!HHGpfKe!7m`>eT+heHioyTiux( z=BN0P%}Zu7IIFk0T(EvPCA@!6viaUgGV^ad!#mNcZP0qGJhU7ta0Yr=0fGq^b8`6LGR)WIXn`7 zsU}#etTlif1dAvJi;fL|h7wX~N z_{qPx1l8&we%+v2iD*GRSoeQ9F;jK&lxy;am{`El;;}336Vs4VU3W-OjFE*9^Y65t zX`EApfB-Md;W|8tu!$c59YNl*#pUCt>WrTE>Ug=vv7|`*OGj=97QQGpCBITU?S6fBJv#{@cTU z`NxN!{r2JKZ~y83{b!!LvHpa+ALmyt&A8Wzduw>S3cX|~m{Oko(J59OK$yB{BTP~o zP6RbdOTx7Cc?Hy!m^k!WgRvsd+rC)Zgr);Wdt_INB?o4OBoMP>23~nf7@-sbGlFDQ z7}hqgL#OV?aH5IYXtAT<1?Xo@iLVsS_z0>X8OO>wqP%hpOt2m)ASSD<_|>mq1Fp4} zi_DL;$h=p2#bAcOm9h}UuswW<_wlVig%g;nBoeY5ViYdYKPA6>MFuqksNIU)3plQ~9 z`QRVWC!CdFA*ksHoun?LC3lQ95gxhtuMpZ$ljWE%w9j0G&G=)Ze}N`zzGvPnhR{Tv zjyUTOLy9vZEJc+G@X|YJRCLq|0+(8FECrJ~Z-?nhs|R%=t8#M+C8_?c&XA)f8(Mfg zCxusvBo8DoA{_RVI7S#(Mr#FJP;U-N&#LJe#3Et~(XP1o@>AJIxqRWZhSo!Ru~Hxe zPCPF@2x7GhR&rud{Lg8kWEN%P#ctaTKix`KMQ7&mW}d0#Oz!kZ#H92}v9!V{OSP58 zA>@J!0bC4akds_xu`ms9_6PB;4L>>n&C^v`$VYQZe#LnD#M*%s#Y7{F9ab8Jgs_PT zO;)97!}sbI)YZAQ>%KqyvOTDVH`{I4=(d{pm`*FenWduxgjtGq5J++g9BJvK0_B0p5LCLu%Sa&37@xL$^GNu*-Bw-o0eb!bVxMnTY)(mtoCoiW^a}Ab zhy}qdMc#UX0jwjKNo<@m#AbzNuh)Li8Q$8czh!y+H1HJDP z&95)5ywH$ekKbA;ZdMV*aE#amLqr7UDc8YS07W71nA#`XUu=K6edp_&+yAqDZ~Nn? zekbiIUVA*H^MVV|GilVKQr&h$N2>f>ON6=U0%Ht2vJyi!=dIsvR+EWn-3jPXrY)YDLsA?J%YWva0p{t>FiQ?x4Fd zy!GH#zvY|uL6;By0ll?GAr?bxIChv5NydO(HBtHVC1$wZOD8LK?@W^N^~Oc}M+5zZ%`yxjFj%&fB9;MqljwB5{;fqjyKY8QtD_ zYjkJy<>>b4i$q&`9OU9lHEJOJIRs$E+NCW~k~pnIPyw*vV5QSBY~W_PtTiX$lQb0{ z_pem{?e6zKvpRk&)rHkpDvHxaRLppO*l+tm{PnBXFPy>r+3E+C?QXo$tNYJZ?LWNv z-b&A|$E2uTIp43IulpO&v#r01I@+&>|CIh8&1g6Ju*z*#m%2Sy4L@%CDt>=Dx&&?i zY$9q~gSxYou2g?-;xgSnxgu{Y%}vy$7UY*GhTdzZ46>F=Y`}vT;CxIEi2{@rD880X zT#aYT-k1{~s@)?Lr{vgQCh6&<L)&aZ@aq%t=8-m<|J_o%FYvayO;6^Iu#3(Cze)+4g*lBHW91R z9%Udg(eRcc>AA$%1thf~hnoy!yHEa651lplIWC-iN{8EDxtg57ReW{j`>&o~xk?%u z8R@l)aS1y5WRJZJmN8;QjPZp6iji|!>l9a3SNhfULC;si&#(L5{HtN7D=a(23~qxE zOOd6_B_2i@B#Mb!@RD(DQ@{@z#NnQ}V}h;uiThsNe>#uc%B7X7XJ5Iva^X_Lvo?O! zVn_fvW{^s?)%Z87#Q(E*ZM|(>+4-*!eko9lfqlQc*>Rl2%_uQ!XM*-6So>xjiy~cK z6evZ3I7vG*E!v=Hk%wtIjnM&$6rJ2NnK+H}pypMk-X=dFlm3kEedO4rNKsqfvP4?P z4>oy3)5q&uXWjN%-?9)BFKwBzS-JF8-!ql(%o-|uST992zXLk%bKr%4$i{_NiX>w? zAX-lo#>6@GV==(Wljzq_*72{aTF+LdYRCKQrMA*$tZ@1SEeh5m z!vZ5%U<$%fLUl}K^E&O?-VUmb%7JTLi}zIx;y(f@J&T!Gr*+x8UbnT`T1m^e+gqP@ z#wgtv$LuajG`mkb-lK@PR5O5K0D(ETQZY^vqa;{PgJzCq8SabgRWGrTw6<>b;+1~u zrA}3olgvwT8~ms7pC`ytl;cycF##To3rZre6mv!mLop`KLfNiX9a#1?4UOYDpy%cx z%B2eDqiad?$;MKF0#^?C7*SZji0|&@J6!XhIE#~|4@x_|!@8XQue)4upK@HReDvT0FNa-AMLJ2_~2aq(YiQ;_cdbbVp6Y1UM zsi&nYH$TQ7lU*T>4hiC&#|cS9xu79B21G$cw=A=|;I3`<*C56v_nW}eo8En{DnGqE zZ?fu{q?%XtWV&vkd+c@ag{gWTMR&}>(3ENqwvtNXF=32il!l>|3<|K+Qe@FjywKf% z)&*#L7lYV?4nuU^MR{6M{=7(WmHuM|$fxRQo@B{*=&j08%Uk8c%5Spom^-F`PM;JCTZ3D$0ZGdYWM z`kS*pd?YGz<>IwVSDpw%J_bOsG8ie+U_Bs76n60$$ADbwgonHa$I;iRpW^oD^U)`x z&v#zmef#d{qtTss>9f(@c;WXuZ#Ns37pR7K2*^s+OK~cFpjx_UVI+$FgDD@BrUZqo zaPn$>99!L(xqN++H>F|zoKgLs5ML>p#!GD-i%CMz!AHkoVqOrV17U2)>Y2UNan;Pa z|77_OH^cUmEej9CR*IknuQ>)VOk(8%rjBvMP0ZX~Ue|Lp8+U87vAduB_oFY9CAquv zkE1V+ZQ0>?(pb;wl6fh>L)9Xr-uiKRhPsa;);I|8QjK)T8Wo&Y!BPrHU=qBQY1E40 zER9@&UUzM+E>5mDefY~Ax6IFjCXp^yJc@*7)Oi3PRN0`p!aM{ubRIEud=1NA<;5?@~4TS<&f`nxVWp$IC z@1((%eltk42pTgEMyX~5Oawtn8DYU8O0bK8GD3=SO0sOs)4mnDJs(BhTK8-HYAvzK z`c{%v({*_GK>A>D79$Q)8Lv2Z+y@gh)yi|HDM$fX^_0udhT(jUUd`&0k|x>RJ2Cb^ zbcHB-jDX3&cm&f6#XQ9ZG!D+P7$7V$Kh4Ff&n+rHO?_*nxDg^u5R?#(yaX%av*L`_ zhzFTBh0}>9p$FH8H`2c8hN9sSC>o|ESPCk|X+WC@P8bkRRR~;q%?$P+vz+J;zxv>Z zUw--h&p-U*t@nSp`Vt?2^(Y_4uWH5 z9d!X6&VJ+ikonkqPWEXrnny2o|4wIAPLFSa=*#6KW1dN4xa2W;N}J|FKu9_raEz=N zI^_1(g&N^_;pCUUKJ)Y|h@%;}y>Jw;c@hn?BQ`(~mN4T3ca~rq@;ZlZ46k?lZP=*# zYhybNmM;??KL_7s%bM4wG}hBpcekC`hSKB9u=fI8s(B)r4J2<7CU>H#+sixN9 zENbyfJ(zAyTLeS0@c#ROD_Q40G(2aZV#i^A3vRZFM(JV87Lp1nu)H z>l4B&hLT`M1?GuhNd$tG1{z~8$u$yLi|6WgR^Rt$&UKo--zRRZC(tO?4Ns&DNDvx~ zGDJ}kz!*(qVD7Sp&8}>{U;o2@8Kah)-J8QUR6U=@pf0S|>wF&Yk(_!Xo=Ki@uslmK z2P=Y%9-8=Q+^L~VIV&W?k}9lnFi&ST&viT3ThGVenq##^FbdOO1~=%xh*f8&49aux9PUq&1i=!(wb@;#Ot|OM|HZLcv(- zL@+@>7O76^fWA?6>Ih|Z%EB-9BeekG-5&83!|9Yn%vdA6wKmmdbl~3V5a=$Phbz#W zK)2sMtTu~Lp}}lch2~Oui6$V1u|bwn>thIJoOO~L!i`5Nuk(NVU$(#4{-5n{w(s1# zwf*tEx3)jr{8hSec_+d$L{?y{``yhqYu-?hVOqyNH8(r zn0C}O6HVh}|3{*8#gC2wMx2&P8i_3-LJ@B$cHU)ni@EN4)v4CDZtt4m=4A2EUTj)| zrJzP*$Xr@WrMVAWazY%Xgpv@n&0A;kt6Kk(GQROZC*QsIdb}E6MxFfa_Lo0tZQrT& z_M51scYf5~FXCU={(Sq(_{k6A=i=MPZW^1!CL^&qazsmYlyYRSH$p`XwF=_@NJouD zU^#PHI=bdNn^3jZCN^IdU>()vPC#uevgIP*rvUd*#ZZ;x}PjyXWU8;Xk)i{qyfhM2{!9u9`3tWtG z?svQ$c!t(*!}>U-0L0td==lM3>hZJbQ<;fUOgi~I?yctwjd6xNi!ou7%ZgFdW6uRg+maB#kqu4b{Lp4_-~8j?~iF+?%TbW|0?6_(07<}C<9 z0nw~p+V9`}kN^Ad*G;$O;&f|FB2um((R?tgvGUvoj8#zFdgDA$mK8F5``*UZ*A{xU ziCgP-f{!6MSbyf6U1~1D)2fJhE^aRB#X4!FkEs+`%W*(Fu}lOR<5_J?UWI$>cfGVt zVzbGYk04*3E6h@;t)kjf2wqFdELd)oiMfkpjOxt6@nQVVYS^E@3S6kPk`K@0rF(*& z;e2N@DZXMfEoIVz$yXHE5#eP zBqBg5is8CKM7mUMMDY=)RB-NC*5cLmYOUAp_}8i%{Y2Z+Z_dh>JHnekMLvyosRA-% zFd&HGfpJ8;7#diI<69gYWF;7X_^{oQwO{oy~q`^A}a(0eGIBdKYgzjFSm zX1(trt4T9ZDb*CNl;@nAcqJx%?>p5tzwJr?TSBJf7(+{etM{tZ7R?vF7XWn4J@lW1AG09ynIHg(?ovvgE zjH1dqLm8#XZhOm|)>*}XpF(2tn;scD@#lWwE%gJ*m0}o-;L2K~yummSr_&rLXPhya z$BsGrO`@gW`G=j?M<4CHvGeykzfO$xJ8!o}{}%sveROy9*^d|Ai=VnR`ex_N(Z{2& zcHSA?NzC>ij6RJ&y*2u3^wH>(op)+x`yVBHY(&+KJ$jt>=<%pXq2^=46pblFd;ow4 zMnH!EN&(SIdXvTeIX3Yy*#*`#NIcorcP{e9ddWGl7;})(iyE)3&^jhTT43(88h2ja z?BCpMoo_?Oy|z~Q`E%B%3*x-0#Vi4qqDn176bzElu?9koAk=!y1a>xWP~(qTET6_I{eIPE}FF;S!lmLq%H4q4=$P*gL#c_ zFJtjC0tw#;M6QOpmcMkz)9qyZI|4Jm^cPwsjyxP zoj99GCNE#-wYoy#8$Odq=yBO2zG6628i%BE&IAvHXu!^eAiWJdi$V9<9&|fx=ybrY zo;i1Yc?q~1m>dN z+_Q0x3&Ox+Cyd3!_*5uxDzKQc<&_1i&fx4*5ueqq_oFe`JlhPzJ<2fLesU}Y*anRZ zHI6H*0}0WU6BTfp<=1(Qjh9~Q!Twrp*AO?o0YmEmCiD^$8N-&ZJfn;ebCL>u|^E2P^uMK@t;%O&zTJg^} z0h8h@MUx@pVjK~aO$SL*X^cIWGTMS*vwY9QZr*Na4OV^Yg>H0_zSl|gR%yg@d_H?A z9n)fmM!ClZ`B0T=6{m`mV0mhUBF-rcR#PO9rZSIt=6okwtZpBwjXxbrWM}l}BbD|u z;p3hI+qdO@R)5&z@De|%zd8LX`ofnlU3>27OII)a^!%lji&y4q&t6E1bws5jYk|EG zhIt-T;(fq0FvNM*fz#z`V4>=Ds!rdxJ7>;0zsx44aeN0(9!%q1u7lb+YqT`Rkobbc zC?;B{KxIt8a&++e@CJPQR)4aEYAN+^v0dB(6npnTU8;JLBPTRhiU#C?NRigyaqlPy znMHnc0s3J3gRR?5wfBk8zWLSOX|zifP$3zp1B`HR9D@we0|Vm>v@uy7WIldl&+m@+ zHhqRmu6^@u-yWz-RZk1Am0&>wr^X;BfpRJkNsCRg8dIJh4o%E|{a{WMrT2?nPInab zP;{jzT1!D|&opON>tLb}Bf&f8WXR)rS%+SCZLQmes^eok7plgFEVT`pe|j>FcBuk7 z!$}~-P{|p#&L}Prr;>`Om|0U0>oJd5gLbEBgMQSoWLkoSpi;~!N179@Y{V5HHKrm- zh^NM8g(c5J2ONxX^x2F|LmJwzMBUwe| z6=+wj=O-vf=N}fNRgn5DIVBXId4TRG#8Pyr(?U6o7;u$%RdfIs5eOn+k+rP->elV8 z-$scodD=QQrl4g_L^rPrJ*lhWEIp}xD91SXG>LPm-mygfq6v#GK2QLc5>}y6Vj@#n zGcxra>;pW*E=%BP@eKKC!Y1`^)uDG1i#w;Z2RNw zPwM?$A53gsdu;0?7yiLqfFYKBuqoA<7#AuU!v`#Zm>A)67vujBB(sQQMTMjHMxRf! z2K;+`@yY1xop*MAp4bIiqjyIi#h-jW`fPN!zWnx?bHlYG)~wk~6BDPJSl6eTi?Bs> z_fBRUMjdxJQ-olt{wXAxNXwFeOT?Mijv!|dR+!1Giq)UN&8<&k+Uw`AOP{WTzdY2( zT9gFqT%LIFe}A45WA zBA^y~pVzy%{kPknMhBIagl@mP{qen9^>e_5(;$|YcG8fTl2^ND&1NKfit_(5?r_)2pl`~dpoRu$L z*=>Thsps*j?x6o_y>(>n#vqZ(i6>T~S;$CiUn!R2ODXq)D@=(LOdBhx(Fz1-60@w> z`a-+9dDHg>-OkqUI%9kVO^BTZ?6mkw5#`pzM>AD;{-3>T`Hky3@Bhk$_Ds(Ekwqa| zv1L^jWk|8TG`{m9uQW7)j~~ZVSh;(*><9CGV1L z059@i^qeb8n$Zl0hdh=v6t4jqLvbE=zTbDx_x^p>GaX{oqYIQw8V|$UmQyU@4}8a2rjklwdIOJaD9?0E3WqE~}>V@~FBBqZ{Db z?#$VGfb__aJ}JObL>042St6tj@pcuUOmv^Lr5=>eiifwp9y%ItPZpiJgR68%SJjj9 zD+Ls=S5!a<3aE;Y0Rd)22*)wXI(Famov)jEbK=LTa2OxO-|bd)zH9e>ZsNy5)6~)8 z?=~(Cj<~u@{D&vK^M1AUG`HARfL*EHS)-W3K}V|~M6?b-sj=2@tD`>VmHV3?_%mml zA$~q;|IK5`m4fIzIKzMjiA)gKap01w;Ee#8)lBtf{J?F1rXD)^R^mLEfum46qO-?T zkXQ$8oS}#dPFYY6D`{m`V&zn616b)EGflV3u#S9KR{qmEuS|Hp=37V{@;$ zw%iyQu<*!ok;NFb|D#mfz4teLO7`9l@BQ8W=hgnt_W$eNdk-G|{NDTfzuN!Z{%=#p z_S5}4`@gOB|06#6{d+%*|NqJU=lge_LwX&nzCULbx;h?Q$upV~U7A||hL9{($*6w_ z5W$2ZY=Si0Tj+;D8JAfp_^*EaFMs~vf zy}G`!OvQ$h{hW#&j7+K0C}zCZSOsAWm7o;ICO!f~sK}b0JAbooJXBZqKEB!1+wDzQ zPJu7_#m~bE`8g7@g<>p4S1Za8b4&x#20;)?7@ZPL0eDuY-$o)^f7QpZ$JKLnxoLW7 zl*+D4*R(wQywu9)pYx#maE?T)wW zp^f7h^}Q#=R|+REAra_cKoe;VQc4RWg`$?rtm59A(CkK`$0%n>WbxoWKP~mV%U3R( zzp%0XT27GoSa_vK8mqw*WO0ZF*$YcFVp0I+-k7X(@+%!Q@%?U%xA#7*_CCGkclLf= ztq17teiUDQVSM+aIa>Ltqx|dOF>gJWko_*NrydWyP)B(tKBao(jKRn;V`-ql5U;#6 zj5uzQR`>)j@5Pcm|AoDe(_K>}rTvwa!WJwh%rhE;xj?xKSZj?Dr(C$a#k^g+<5Ne$ z30_<>_z#D7d`-bzsB!|uBSJ|R-3MU<0gVuffr5*_QJ>W~a^>MtwrcNheNW>3{ex|W zrYl1zp!#7)_51_;MFK2E6(i4F&>978kH;6_ieLX)R&F*)(d)G4{#7 zPs>YD-f6Pdo16zW=fd63MzE6}P2!ijl-6fWpsA-j1_#xAZUyKgU{$JDDxG5<6Ur2d z#~emPGOeReDDi{dg?yJm@_rEKStt4zy9`&K*5-nenfF(8S)npK1%qO`=| zm9#tn%1ho~Z%6UO87JNFCwfWtYTw5z5DU&CU95PHBf*p;%n`*E2IeIYD!~Su#YfgB zxONYi?;QG*4?FN@#aD`EjP12%*b(L_2!TZ^^P0eP&?*bfXngiQ?LRo}Njr z!<0qb7@%BZWdqd?5Mk0~4JR~hcVq9v&DuAOpXxFgbnj&9-tvfK4(w9(3yLuujTomo z#wCI~78t<>TkxKq;H8?cUR;UY%JHKXq%qRP6#^$wT7M0JIx7PZ1v&!88D-K_l+|ap z-bIa@^jp{biB3m8cMV*5w|5rmQq9BOI3-edBM@Q$DJ7#G8Z49H%3?rn;}hC=j#ce= z(zQ3HiA)9!d?7V(G32G1NC^%A48{L^@E$}EoEWMtNSifKyxv6cwxcgMH6wiLQO!%d z%!;lU$!NNawa5|xV!g1!NfzB()$yg*t~M}*+WGjp6)8L}F!l5ec9gma16BIhz)Tq$r$F^rkz9wBOYS_UR* z0EwdA4_QI!Loz0)UT?4Oj-dPEz3RKswA&6Q@!`3)i^p~I#d~MYcJ0BSv%Zn+wA`sj zqq)kGY^ffA^TBDy6jrG>LNEeCYo`cuIIC8=|G~ZY_J6m3XaDp4|K9)TIn36cw&Ol? zwssLLrOINl)RG7d9BV^ZFwvA#g@hB{WHB_{|HYT@-v4Cn{!j1!=Kkl2J~`^}?l-J0 zhmu?4_#KkMoR(c3`ToITcuKX#AukQ$@qocx+xVNsC^#gz_}WJ}Ol!taHV<%j2%qT{^P)cFXf+H+z9_#hC zo9u4FXkb)4mbX7Gy<#jCiC#XnI%tM`^bfd3X*N2TK(esBFw=~eTJXMmtu}2>E3%AU z@pMtLOPM+Y3!IjrmBB*0%QBapIt{gbSEXd#} z)ifY$O`1$%R$GcQJC=5vYi-k>IXgPh1%uT#|GE9kGia3R29v>Z%bXxyVBJUhn8{?2 z3Ce1JaCK9i+wEZQKcQU|)UUS8SAZ#RPJqRbD(U-HXV006XSJe~Ga{mCCO)f7v+>0* z<7FonMnA6Bn@Rn}XE2`ILi%XLy+0(=Ihn~;!qSS%rPLXPZ>q^v-`3r@hU$A;9>x`HMgT9@Bfob$D)-fR)i)F4XaC0` zMSrY9?lFX1su>bvqEm2AIHBB*9T@E`7J)E~WxVAHJ<=@ms&QGcmF2Qvtwb`;O9#^j-mxM}{s@6mU9i*`qMWw@xCtRB4DlwW3ef;ra|(W^?!ay@ zBp4jL_Cpe-Gr}u|G8$KIOazj~$MMEa!vtO-gPH0JC~dd-olAbl_-?#aUtfN}@r7KU z=^b|ZcQ_WV4=(lM@cxM%(RZcgLhPV(pakGvrQA=816F zSjsHcrOFpn@SI}gC?ebkx2&u+01ZIFEgtbR8(hC^H zc!KGa>B;KR`1gKy_5XbN?)~3<`PcV9Nz1L%TI+?&uYVRFe4L*9yf&5hGt+%Ya5~Zn znVZVXFf7$ULX1&Dr46V=f~4R~@Jv}|EXisrvuzamS{FaKsmFH9cZ<5WhqL97vt_Xq zOTncgfCnPt55>-flvyH5J3Kr|{RgcEod$+6ZA$Q*tHQR}FTTW|kGjqG=V!Vs> zFbIngfN)MKM^&H}r)Ko%L3@9+E(J{1FkZt8=q#T@W^;Y6OW_-$T)O-=#X`J|-(G+1 z^;g&5CJS*Y-dnu}m!0PUPN5gdk*MFMz?ainxv>8f}}jsEoR2Ydf8^3~(butS&M zaZ1hyi?S4EA*Er+S{z77E#pR`#G%ie(kjcwuQ!{!^(Y22bBnM~E~oklQJP1zi$_dp z&q7wJK@b8^Vwl9z8Ak##)Cpt-mfB{O9Ul)$oa$i% zjrOMRSD?M)-kECx7?#l;R}qf9i0%m#3iSezrc_DmghdE5gJT2+GOfP>DY7zgZntiH zwfAxL(6OKD**uYnxYf2nxqbhOVJX!Xti9rrL@xla5DEigL3@F`LN?2Vy9C>*aedkT zY_0p2?^Ckn?kL{)L(!F@NKy&KN@OMHK?M@saTJ0;1k=1FS1&^oW|`i5`=Rt0T>61vt}wsYv=EN=C56g4(#`KyX|qcTb+a2 zrt4caQ+c|A=FFMO<+3csnpv#D1n^QCYFH}IGwXpk$+Hq7sXKhUc7FGrzB9a85=al| zF7B*gYM;|+Qt{6_+WpmKI3eEPUt{!CJ&YZ0eG_?f9h%4=TSYQ$gXg4IiYEX@ z#yF>)ORpIm#m*u5T*TI`xHF_+#QWPx_j#CzZV5wM)O^H>M zDK6sQvOJ^2hS54dzLuyknzfBKjO%6#x;Y>CiA)z;!^>DjhD_J7GhIs&Db*KG0;M2u zFx)AIh_-1kE~r^vbO5`@hHL3fu#ewDjA3XS|=y**0D1GfJA?m9(RFf@VU2SjFep0=W4!){? zH>@?P>ZbqeThNW+X7xJQ$+zND)A#;P^;W%IU-zztZ%z63i|*-oLz9J*wGW@X)3=Cy zJ^RIa_PPbnp5CMPw7x_k?gmL2I0lV?2Z9_mhJlRsJ8_L?6*Dg1@;jqzzS?MS`065z zyla~}{vN->^{#f^?%m(}2CCNVv|s$>8q68@DfQ8+KiHQ|G!Itb*jC^;K$U72(G)aB z)};-c-cm_%bn=zeg67q^-QC~UW_L2~cOF0DtRE~y?ts#h@+$?DdPQ;YMkEG0X+7p? z$09Za6O$FQy|VX7ylNO9?y(?a0B6dheIZv*2IT$q&4d^Ua=fLM%mBIOAC~ypmf-KvP3w zl!h3#(ZkE9ma0d?T8HCvMm>~XDV9=sZ7DGxd8W8j+QisQv*fXdtV4IB?QZzZ!+Nm? zEDvfDnvz~AmKr-ufl3y^Gd#M%#t7sjqC5s%d3&6iP2bg#Zl|8G_ zu)lbAG15XA7GoP@9cPUf)&aKCIxd`Z9zp8QJi#Qrmp0BnoB21oVE(QD@KR(TEm#DP zoKTtzP8AC>{t#>pS0@-5LDADjX5)=Z3sC7lxD*wSRltIpfSIAn0z---E0|ZBX62ps z|9St;{y*OPtC2&cuAGbU|B z6Jm$?0|QrUh4wqE-r+mEJ1Hk@i|U&x4J3 zDe+`!RcxlG2&?5h-49D$>(;iNtDDVg()Jag3-Oe!LX0IVB`}tx3T;=tQa4RK-m2*l057{bbPN!Yf8nFzub= zN~>THrBbIrRT&{U$|_s>WaYs&+-Uo$KyMRXDU^&t+Bu75>H%~RvosrYw5`l(nHBCl zyz#FOZ+!gl#zzlt{^H@ye|z-PPagf<`;Y$q{!1@keL6FBFp>MK?F)bP7u6@GKl}ce z^X<#+^X&`mhOcN({(LIX#cF6ZrJ#hB!7FK0T8tOdQ3}+DEH!*=-a0X6Y%1mZ^bL=N zSBj(nOq9?N4G1_EycJBwfXzrMT$Y!g>s;$ZLD{8d>hjn-vgvJe+mS9+Jm;y2k)?3j zTH_4307e?%*jkoV)qiEUvIzZ7?c&U_b~#b4WH!kD-Xu52wgi6G2B#MY)jWs4iwujgWm*bPx#00& z8b-iUqkIqo9AuFzZ@sg1bL-v5dw9*_0mqoTGV3RYuCpnT;-Q6dI=OnXB zbf!2<5!cel7#}NdF~%kcO_dq5XzV$D-6p(ZD0LtzaK^lh z!B4P^afGPA2=m807_}SCzV91}AM&JggzcvP2eQ%ZmDip`4hO%{?97?=r8DjE&p!f7 z%^WZ$nfBa6wBz1-M?JANAS+|Mag0}g&ifVU`auVt{{qk}7Zy&xb@t4~g}GPH%%7=o zkYmqU3a3%jP|GOQCh))zwg|X1UMa`2*be5Q+iE))eEG@rVDw~N9_0DN9kMIM(guMT zB8CD(R6Ao7D58vxo-yxU`THVdw{9^`Q^U=z;dT#VBaU;566+Ag#1Zcl(gr+HS}-A1 zRt4ws5?oD;=6p}M;mOA+=8dlZ58M0!q5w7ZHkODSNH zx2j(Tvc5!cr~8v5Q8*aC9q-$1UAkvPMFW@61zO?|71Ap7Vl))iF}C1g;$DXKtKo)lwl(X$4a>1 zxm6q!NwQWh{^09(zkcsecmMRquYdXV&t7^N`Uh+Z+Lzj|Of>|@NlSK8p~U#+;KTe~ zb*iK-YwSbcICuHg)8`iEUTdG5KXYlSrcNqHvA#OQEytJ%sy%~1v`NcB10zIb72Fm( zrk~jD`;V&#%{|3lOE41xEQHi!rX*7iNw1?{VHyP;Qw!n+guGjd@$Fzs!xzI+9Hu|n zA-`fgwPc0_uLE_QslcT*EOCNefNQU4qAB7KkFLu(s&7K4?vy9&qtCY9AKf3_8-3b}zx-kJd3^Ey*6+67-MX=DU3+>% zdSUeG=!?<)*67#q$LI0Y`&;j~Mjwvu#W%*ki~sEX(SMJ=*!rL~`h8WS_#%Gh{l_m% zu6w^%?RP))Let6G3zHX895J0JJ|o)6kl43lHfaJt%s+&2$cuPHvfSX={_uL$i}$2` zxfzByaMjG+t1u2msb;94lmS9yFfosb7F4I}5>GASA3?ec1dL z7{5k4miA<9s2^2%`3Z5Ndnmn(BVDR@QQdH$Tv5%Hvl1H|grSNAMn%?L?m}<{1B4fd_?lP=cWLA%T@oBoPA9>gBwKiJwsnK#}^KQ4{2-rumH&vLWP$s0cR>U*R1%h~n zvk=`FET<*j(`k~@s)-2a3E7an2RO&2SBPamped(;SFGU3Q;sx|L}G`Hp?j;C3s&tB zIU4<~Zyw=-`J2V{@_;4M!g-Xc=3GjOj9>wW7->n!DyD6lPuRS@+Oz%m2-R=H)?C_9 zGrc9IN#thCeC#gMa_lWw#jO+G2rD%(ZW*!yMeOr9GkUf+@SS8sQuAiB26Z3l(u4?0 zQ6*AXrFmMx$D{-81AsL_r&8b^32(nki4J=ZvfdE?<=WL}Gg{Za(0=Rm#rgKR3pFOT z`qolNgrq?Mjwg;9qoaLASP0EI2|n!P5u5=@>LF*R&|xo9sE1_X$CsW7B$v-!s)3^V zwo)i0M=GWcF-p-CQ4N}hXz?%>4)PeE+`ulSojRTP(+}zz{+ldu)>fiP5thOVX)}U} z&I~{^<1O+LUnT`LGGyh3F#?_k>s?G%JJ52y)`ea_WjWWH>yP8DiZcopyTe|pl7?$c ztVY&@liuJEl(v$EAbeh5=fYY)`tDZO57*-JrosCi92DclOIp< zR6m@x5_2BBaZyurP*N+Z5wXUJtf{lK*Y&$bxaG9kb>&pMzv{c`o^W+~Lm|?&1ivq0 zB%YUWO&4Vu(h6ZN4Ce}|5TYgE0z2mrHdIhgvSvlE4wrh%n|J#@4OHE4#_adOMN=cf zQdotGjsqD*6CW{`Oe>bkCW;A8V2>3q5<~jKAN|^;NA!(nL}7CFt+|U=>iRz4D2?kQ z7=a>D?G-g1q@tc1K@~v~B*|)cS%z!tzVAAN<)|F%P0)9&ZNZhPwqOU;rK%^f5*YE| z04c;N^~M|HFvh@j)(Z56x8Ztc$2CTydC#reYC9aI+M%VBMDbuLkAXLM;MhfFQ9y9s zIQm!r)PZ6D%MS*v^S$`vYH!dq=0I)<)C{_GA5)~iYIVSoQk=GqF6D_iE+S8Oe~}iS=Z-l@w1y{82d>l zo=UD1L}R66+UUf&Mv->L5+F!18JN!E51)_6uG3AogA?6t&5@i*B(zO-rC3_+B##+K z5LR%eEGD2s+T!aa&1#cvcNd49m6gd--*%!9RM8|hNRA=7O>(6;21J<+#28I=AWrKv zL8dSTEAvWoiP7lGcl({Ika*0iXQ*h**LMe1?<&fZ3+nD-EJPS%X@vn}0R_vPQyP11 z6a+3Y_W4AK1f|PZ{_Kbn7hZp|GxQk{C0?0dApB?%B`Qp;WX=QeqfU6#@6gN&y@WI7wfjI70+_7v}Vi%DWajEjtU_)F{uWewK~^t z*d@QR(zJB!8_^mOmcl9sC@Hm6Tm-3HP)bEVEpSLJ;#n;nz10}oTj+jyb8L5KV^NN$ z{!OQF+KF|s@&PC+1HoP}0PqwC<+b%3l*&@RA3}^A6Z>Uvu-5ObZ;UPFK9(BT)Dfns zUoG0DIw-NWA;wO^U>vNWk`uug=2}UeMRR(-H|VYRelTO!Nu5GuI-SiS!Fd?;G*96? zeCoh)I7)RxgCj&T>8U14TMd*G&lw=^P}p;mcgj2td)Tc$Ng|X!ljehp8h)PXn&hYY z%2GT4b7Pnk*kXqh?+{>Pv2;!-k=5+C2Hop1wTEu6jt;Kz|Fi1x+r?K5r_u&_OspY+ zP!mUAYMGX`|vAtn?!p4Y6_ zyDQyA=yzXwIZWU8d((S|+&!=)L#E>8eh?rp0A#~E3;Ha@QsGxb?h~nw*l7q3v zuDaz@s-jWZ^JxMxzJPEJmjCx(zkKwo5B~hmUwrfV zhu_@$?3+)2@%%W5q^PN%`&syuDi97{cpsSc2pB;MSxkjCN*HIe_&&}L z-}argI>$WLj*F{(MJFW1%{K*OvMa@r+31Fmbd(UrA!adDIpvu57Lly0^6{(tX=c4C zS4?kvH~^#0k=I^wijYPE3_*@?K^+l_@hqe6I^EW}?qIm$S9~iz++Yb-R+`v(Kl5z6 zO0pPa?>%)?yJ&xBCBwDv9sbg zZ^bBLVX3#$TdlbJrZxIYRpr1(;QHujrAoWVu@qm6sHO3YHqAvua@% zhH&ca(y-HwK4A&24Pgen6|cZaDQ)J%TQ9~^bX^R?ybqp%6RC$Ok+8)u3<5)WH@@S< zVPW&O+q@m0xMB^v&{_2T4ov4_6BVcNNkMz>Tx`3Gv=sRuv_o7dhpA?c5=rC1w$VGM z>8u>&Upv)aiT~yzM zu5_JwtqGI&8YXWOUMZATU=#>bF}a}uc`YSZl%;A2@>xdtNj+w+*IS-Zct)ug106Q= z>5(?Tlj18xlp&?Hh&EPIrL-|T4fzPb*mLEwIN%o6AsUOmi*NmF=(grzBNby_jLilo zt@M`fB6dZ+R39;SSaJ};5f*bdY(V(HVkoEr!#kR}wnOnZk6(Ie;aYTEgQZsd_+GcS z+Kcem-sCc#}=^LXur z*f>Aq!8}B%G^zJsNkArDKagmt856*OTN&~y8>5f5Zf?C(ErUvno9@(YX}a@#Hg}z@ zqnWw6D;us-&0^F9k(M<(uCN!t?=__Y6`Zcw`k>ShFW+k{sNrR0ub z??A-#S|dozEJjOBiL02_XG6IfPvu6pvkYIo7oW+G4QwAv@84+Oj9P6S-la+ysK?62 zcoe8{)=L=}Gtzo*L1*={Jox>Ck00E9@W=ms_rWL8cQzXM+_|GB5GmA=7{K^wrYN(3 zoJ2P9yu@fM-M)d$YG8e1V{mPwwE!zIBCFw$ZHoCBk$;U0OL65^M@Wfg5=rNb4whM? zqCL`6?W6BznGmxqZHUp*<}URaL3@g!De?9aw1BIAe zV}U#b9~82ZXBD8@-L=hI{k4vRy87@*%@^}e=??jo;;BS5zFQV^gC5CX-XsObK3lICNa-J z)L~MrC;?cSabVsBt5s0J5rGv`28XP2@WY$8AKv`=!<)Z-ZVCD0wJvq+8UN4Twe`kz zUFW}Y(5DtKjeWo5At+_bHf!Br%6jOFu=b5QB01yEg@*OyNI{AQN!=EOgBnd>rUeQi zbt^}fttb-nFwrYL{0kN0_GfhOp)N!6aJYwuqK4*qFgat+oO86kwfA1vZ+#zCWeSIU zH!?MKMIaQk3|3mJK~hRWH1kJw@WR@>BE6@RW-Ju0EUrMS9|c>*`mmGnRUX5*`Pl$B zvoLR8G1f&Gb4&>HNJ#A^#J7|aOCW9wEN_;`;O|#_ai-m0^S#Lhm#53D%fofI@am%( z3|J%()i{}U!b$3+k=kmJRS&QjpQJ3h-ucHH#h+h^w_hGPCdI1n_EMuw=kW%t!Cy4A zm9vn6nF_7Cx;qGW{SD6KxP-%4(;j%ks?2mP^(8{zUUI&h{of15BVVP_CmlMmW1_1IqY)4{Cv8>SE=a@>kjEILrCyROf9;*Y z`rwP+;EQJB(P8}W9n!0dr3Yn{7f6u6eLPhdgAdnwEQ7SMB_{%V*!aFrT*ej1K1ALaYlbm)=>&2(cin)0zt@0|6woCRydvtI+S1 zwv7JW5h(Fc-PfKtq_lP9v4U}r7&=SV6Y9sqdaQK!NVKI$Aj!fZ?N7{(pR(wt7E0F_w37wmCj$7zxw9I^YaTADgvdWyVixo3xOTR-grzc z=28SHB#{OL$}46#6R)^E$f>yOJMm4tMSry@SBr&~8~veGT)Z*r*WJ4YUpbz$zo$+m z-kREw#(Y!BIU-<%(;iulnL#0*o`h#bF{8OQc(9#kUu@eFR+6J%ycz9s+ZlY`8|B}9 zvDhh#bI?jYg`LDFMUqZbjXC^2>O{6ZJhg!9Y6Zv6dW9G#0$iZV1j18Cvo^*;7LQoz z`ybA|0W03MTjk(4lQWlEjkbd09>h7*uvbd3F0MjR60CHH5sI)7)L|tIA(ktawfBGb z>776Q^z%Rcay_cqYU_oeaty_ef{(~=PRV(3@x6t&7cR`7%P4r<2}x}gF)DdciiT(^ zSYQ@eFw`?lJxmj?iM!A{X^!V)Mx)bZ1WXkG*&)EXs7k?vJz)X9U*a8i6Jo-O2x?dbQr6Hu@a`7n6a>=1%z_q($#Uv*@ zGa^JHB5g|AcSHupQLd?T8fk@;Wt3nSv`>cx;XzZ7n20=fnSa~--R9lR2b*7h`|;)< zzWw>PKid4}+nWu~%q&znPr&8~^d@EMrR0*wtqUU|IHVzmPUZ~+xinb+pby31v+Hwj zCx&dON~JXv;|D=pEylX&Vy{)2WXd(C;EWKCdkK=nKOjGmYjP@!?in%VdGE?rw^#Q1 zHa;e-w92Bp(q3w>#TOrR%1--_KW~-GKPbAe+U|eQfwgEbw{Q5>mFs@H{oB7j)>cu4 z8A%CtQo)!z7FIv1r>HA@!kzb)i0Et+&x!FqTJr%b?m5ol7kF~(mrri}CiS!3{LlEJ zvF2xK!B&A&S7Rvk!XOvY1P=oqV;SPI<#FAD%Q76t>Fb>@-WYrpW#sj7kvk=nBh$|V*iWE!Q5V`%fh3IpfI$)w&p2Xn-}Z=PMdvsFar5Eky=WBtE}00M zk4C@$tB6*^mzxj2{aHg{F+!sc z*wu@-XKCVXe#uFzZOl$l$HRRwGXo+k!Jl$SCP?&RRHMbaB zWAcd97a=}myEWInQ7-vj>iL@(ENU2vs~2;X6zgIe04t$@NMX}7jexx5+|!7x$fM7C zyEO3$BYw@=op$Z+6kSau0S8Krkk%3A95BWywjc;WI=;%A_IeFg8&bRds;&>3^ExKH zx=?Z+T{ugqw%j<3NQfqxN{!9YWXfue{OJE5IqbIIvy_V3*_ zUb{i5ttJ{16}ZHV!~>aO1wL>uymp*q`TLEU%-D%=^eSR4Ld-jcbigVqhO~hoYn2x) z>v%WuiqLA6(e@}?zV%v>D%*SI%HZFleHl-!3%=}iKk9WMA{*aAx4#T2qEMdL*wM_N zcDXU0!$VhF>l~p{XcG4!2-I=SkV8}vWHibm*Sq4&=)VkZ$474%ISzBy>=s~MM5S~( z8X*#K?L0-&8OE#urx6la1q1O%d84~LxINbQeL~jTELfL2q*oWrXiBCzXqGaeF=7@e z5YeG`AP~(;IL05)>36qV47+^U?m1qA}fi%DXVB zsOb0)ikS%??=d*1)Rhce>go;3Sl zq8IY7s|!X1NjS102nAkiXB^SsL-4_8>B771gk`zhdlIO%%5pE1=PJwi zAO33VM_V_yJ|1oie>=Qi4A+Oh-TGwf=5S-{7sc?$!`~0@4Id5fzg7(YDSqOc`1)S_ z{HO8vqpeShtxt>Luj6;`r)v!F3?I!6zZ%||8-BKREB^gwTc5m&nd=0h(F~T;QlFkV zbN%JxTw9j~QB*@V#5jk2qn2F0Y{?>|V7mp(0aTeLzdxP8kR=njH>+6ZkGBlQKMjieOr0eP( z5z^Y=gwWOzjI|2X8>1Yv%4d-zttKd2eyNi}>-O4M*z-iHUvs`4aK2UHT~`TdG*z(2 zL3<-L64DVO6e1A)Wu28r>9*Id`(D|N-kpOJtA0B(1eiJ zWq}IqqQwH>sK87Z!>kM*rt*i975`Rwy_~#OB}%OrxMAwphwACM1Z(1I2`1KHuZdz1 zeO%-{aylT&70|4B>fmm11?)6vtspK_2Pg5~6bwqBL{OaQAun$NE86f#6(s}F=ix#hul4SLh zns%@IA+(?@mIq&_i6osabO-B8&1jeE^K$ZNm&wws3$_;+n+UbSl37PQqtwO26s)%{ zEAW4|yV718eEv86@&E>UP4`4d(ODt&HE1P* zooya`*q)eBjE#G4x0c#ttn()?&^hzFPHsRl8>yN)QlA$MLGsT5=NPC0m2_Dq7u(*3p*KsV-okP9edh;sc=!Y-X!878~^l){76NXE0 zpe%JbIARDQB1jWWV+?K|#@1sikIZL+9scX^-tg<;S6jD+_lJ*0rGNLgZf@P$`bm7h zF?=+s;zz$3-W_hF|F`u?sw*tgH;dsP z;$^>#7q}n4d1rLVc=6%A9~8rXh@ZSUy1~Zq;poF#e;Yp%FI%MR6vNN9K2G<3aif1u zHHq>2pS=EOe`%H`DA&H!v(G-fI?~jqjQT98BB_wmn7*7?A=OoKrGR-CwHg~Pq!ma; zBO>ZM1}U;qAB%mL7>y?O1c=7-tF|1TiLNe+iB{4WgPapq2?x>w;S`YZAhLYE#Wm;+ z9u=3{tAq8&>+uVhqETZX|Myza?)EzEwW{Rv4%6@y4O^Z9;2f#e#@=BXjYUi%+?H$4 zt-ykDhCIuwFleC5fe3FDvz`UQx#C$^KDl`}4X(TS)vK96 z@^tuQ69e8ePjDQTx>{n0r5_cu6xLE{vP-nP2_}kT9*{l3A$Ww??iF<;i)3N(;#G=;xQee{c>jFGdKulgE-GF* z5Fz?LP64t6fj5$;1WAxOD{l#%Ri6TAd$X2}b9)eh#S78ZgfZZ_wy>f~Q5tPh?-I`> z4+aGkZJfLzBP$=Z2DiJVFG2@ega3fCd%%3G##r5N;>doYtc|kAP6y)+C@W2nL<-Ni zHQ0*n#PkW>LKo*>y-hOa36Jfu>B;J%CWDn!a~!=6;8;Z)(gIENU&`^UP~yAo)plnk z6_)lUEXVEm|H~f(bJCXM4(Zj!5{MG1#5xW8&?Xv}ObFuz)`-!(VNTG2r9ON#Mg%=O zt8?bD+#$WXSeoen2XMp^N>j1CVp?&HI0Is`OrM37xig7=)=%bGOz}TGN1Dv*?g2eJ z#8($h%ax@lm4|rE6R$fn!7E{{h~8fgnvXwU8{Br?WnV0J2J3&^Xs>m9YwfD;veUXw z^J4iEk zwehGy8-+&abzM|)XQeEvWVj@TwJ>Za!}m5BzD0c1a2id0a7q9egnZ#nwFqA2O&LY4 z7O$`4N_Po6e=&fb@8_`MjefW3;d--#6XcYw9XK>QFc+a(9ZK$ldrLyFXpMHt#u%&s z;Zx=&N_6Pn2Tiv%2zxXLn}k;jWzgOSEp3Xw^Zi^TGV@zTi-NNvbFhGeCnNJau1RHt zsMGmRdqKXn6ZX06s&Ta1C&SK|bf6pyJ{pZEsn?1ZdFh2_&@931mUW>rg~UnOgSQJD zpUbWm$0!`7HZy<*C(wKExbvE$b)<|;YazE>br!ODxU`KZ`lJ?0cC)#7Qhb$YrZAa0 zNoZa~2HXM&5mn$OqBexi>3)FAm!H1iGqQjkMYXMAA{kvVMtH|>?&2lrcCVg;A%@p` zZ)QNQ?m^0{`@X0REPS{>2B zb5u-dO@IflqYy+g%cv%*=u*Wu5Sq53WKRtxld`J?(i#?oNeLH=K9k~dBD_;3az#kd z5d2e;$j$;@^^4f;W-`~Vn{k0X4%?^Ah@RZjxswp9(e*@W;2217)PhG%E#)pM3!!LM z@$7m^CSd8_4d_i>G1s2eIRk6k1Xv5HGZ>r{$vtZsc`#D5d|aIdeY_i%55G5PM}~u! zs&CF{@{z`CJ8jDFD5ha4I8VlY8ejcE zo7gGxtHm@Ozu>r(0w8bd(LyS((4b5QvgpQZJj(E^KVJXOKVAFh$3K2|ALdM6J^R|9 ze`EX;^RN9JS2W3HQ9>Fs7F*%|#|^!o{>pM9^!w28qS%7Y!?sa6{w87hU|Ql%9S%H?f>ngU2D zntxyD_J4p+cHPa&;w>F#@$Kc?)=K{-@ztU!2wJew02A6$0*FMDNCJYUMQEmH>t9LV z)V5F@dvh}T`hFA8wQ47IumMwq$+ZPx1(gbgF%FB1M$PD}N1c+sywIA_b6Yi0FB(5tEo@3L zkwU$EABP^eNYH7^5%VgnqAQjw*u(WT>>~8;U7xsUX&u1vbO5sp&D+tgRY0wbXIz>n zyiF#=7@fO3C0G=oN)+(_e*LpQee}b}?|k_9C+|Q0$2+IatS|0EdFwcoL61%@I}MXs zMKO*U1Y!s{C+u7RxD=8aH(f{y-<#Nb(1KgWueP%sYcU2z zywxd?@B*CmL`J7sj46WPx~M7S%9B}>E;QqHpU=i(TW@qcz0vGNI@{5%RX}Ia=Eg-K zr3}slsi?82gCfj^A_kLQ=k5pnVSc3E#Ind%|6aKMl};3FL!??qV)8*&`;fel5{?4N z1N<%|v*n7KSsuNUe!uz4z#^AH8?#3=Cdy^m6v%*>f`* z*^*~5nM3qQ__*gYx?P@g2*l#JBh zjy@ZGlGg?um`iy^F3$+DIV$0^Mp{~O`6_bxouRJQLhnd0EOP5407EB;6-1L1#Fky; zJev-<0NquXeWj{Jo`#!t?e%qZN4uP^crL$MOsR-b2@aMSNXfAa(lDh{a6uEiC7Avd z4p)b;2!lCzo~%f+JiOQiaE~WYos$}Heen;)e2-C^^_7XqY+dq2GUuSRx%-q6zC=B z_fEgD*mqssZN7SrclSY6EfaeB~MJd3M$Z#9>3qIA7&1&tlApkbycN-+8~VF%FZ zTNWkoofb##qoV9GLf92T)%xU9*ua_NVDf@FW3&tbh!45?RmP?k;1Ueim+#&foI10( zBah0HMI)-sV5bnDZINItrkO+qHC4b3@ha(j!kB9mD#e0D)0m^5k9VWq9Niv$n%9zU z%0%|#8f$;^n|-?;n+TuuNpgkdx;<5sYV}(&!g5(&dhdhKk|<_5i!pHG%J$oK`&VE& za~Jitu>wqlH#_cZIoX(Ql3p#A+C-I?=^4!>1!Fb!7!-3BXjuXE+pq%ZRp+=KHoj~* zA+Dz^Qk@iBEsBN(bk=g1xzi^F*u^Rfx6d zTIH3XF$4)Ra>kOam0U0p@>Z-O5|+iLi@pA-GnZRphuxN}CuLU)B#4mr4MRGo`D6yh zgoDhVNP;P;id1t^788o=U;vK!n8eu+n%@<+MqlrncnH-MDtQ% z36>~Bf>o;M2J+iD7~<7w*0!zp&W(zm%dQ$nNO6$IoR?_Nod9K2U@5+3zAO!Y1G=y_ z(M5DDTSzBDHZkrpJRu?5Znh9Tg}GAW1l0jeP|zebIo97+&g#W*qV*WZTEKUS>Kh}HlWZRZQJfn=s1lM%5|pz={2vfAQ*Dw=uff&k{*Ao2 zV|(N4(U$uWn5*1DjJ5CzN=#1K15k`1xr3DM38jVC8j5PA-|B^CsXy%e<#@*HYOmkP z(_i;*Wg42*W=@lH8)fdWtFAz(wa81wL&QKsLV+64mT*Y$yC{t>awK1EM_ig%b8-A! zNvn?KdoY(?#7+*Oob)N;RLRf~qiEzpsTip?EXcABh5MhU*IVuPptF!d0{BNO%JYr1qYcYKCc2A9_K)z)x0^Hw+-xS^^1<8Ou?z4G-aLuRMGTB12!;I zG;H%P8y`M+d*gR`oMYqmgX`(z|Jb;*Y2fB4_bW{q<2i^zEFEvMIU(H;<^FMoGSw=& zHBosa9~&`e+bCEXu`Q`iamR<^@}egBHzQ zj=5}>UM-lM8lA!yi9*q6mDMr%RBO2vR1~!*el-;5p>uWs?%wsz%a@wVtFu#wljTl# zHC#ANjBXm z2ugGz1^7i}&ri=HQk)otv}20K!!lq8y4+_f;FX%FNr)x_vC(^#KJ=0j^b~0bS{GH3nn8Ab z=~NuwIou7jV~U& zv+?1^?Tt?lW=TmqyIB*W@3LvR1o2w6REE0%QQE+brjbd4fhR>J(V3#1yuD_ar4zAAV_sO-5K2M(R z=IGYw^Oj0_-gMRzuG*GLdRxp?qFJ^2uYG30i9Tqr6_?Ig#w}F>Je1AD4#zdJ<{630 z)H{IIs?D)#)1_DqZbXk%Q|Ada0XdN-PiQeghtNq@k<@DA$zu4pu zzQLu=Q+DO1^WC-3{{b$|A<8>ZdQg`3zCgLx>X0RYfQ^!plpyC;F(!TB$reZ=i>@9< z|1kPIw=sPDXQQ8uK1y!r=EH0I9^9PhVqfw4*PW25)fq=T<(yJsQ$)u8j0hXIV z<6!mbQd<|>V_j^k0IMMlDIl<%1?D5Fh)z4lQut1&ExW1769Uld4?FjN*}z%~JMaDd zFf(5D+fZ+h6J|5zS&6ry>9l$$Kyu^zPBP_BIeNm4og14S&Myxlv6SBzb-TMF++xfJ;xRK|Qs|HcZ2*Da=tZ~X1 z1L#6ZAiV-xwC!&6(}&ldtc=e^@b)rg-ermwdHFDzwLai$6rvY4pKRBmYP|+zOhj&( z;e<%94H5s(-qrNRc^v7#GSGPi_xHyh0#P6Sh$PyOZ+$CGbuH)0{5plkQe)@<4n$n;=sArpQq$Nez&?%NbpQat7JMXFj3<~jwO{8 z1#(-&hKKitUk>jM?+-uvK?(8ejhoM>Iixv@_D(FOqEpvzl&3;!niC98ymjCtrJhS5 zDTypv6w&Viwr3SL4?WeN+ltAU?dsyFT_6sql0l-=n#f>D&^9PAp{R-U1HJI@^}Dv36jz6^Sio0ZJO9z=+;?15magytl5(^8!y7x>%|F`w>f!C{4at;h*HuNG<0z*;}Y73_>10x$HfgdGJLR(30q z+i>mS$%j6_TZyTN*Y!n@fIJ;lD$z(Ky+}EUCM0S>SlK4ii_qCUd_1_g}xp^g&*= zcdeVEIUaZ2aQ&slg-frGzk09RK8Ppe|JzIF&zwJb=EBcvqsUd>A7=x1VKix^4V6p~ zX;8?bk+HX~_pgomiBc{y-h=nzB_}_bBw{xtb-hGbOdQt<@4TQy_&`+RyHe;xf{W^y z4{qa?Zol1Ke{f^Dx(faA8q4&JqKahIcsgr$cuwf$9k*Ov9A$_KLHn4(1#yN&8NK$XgkZ+)tNrDxk&fsm z4?lSL&&N)zJy}oQ6f6&WN_QGUb$utL`ZOKS&NCvNO5Z_L!lv{<{vljJiL*|h7Y6OZA2dOJ}T^SAMP^)q`DqtLzK>=(}F>iz@1dw0_QRCvh3i; zWMvsUt&?l*CFoT+bDC?bgK(-*|SE|IC}`FEV|Z&KvCq7fr}pFNFb3DCIgz;UovIuxJJDndNm@O)m@W zlwiKHUUl&5OjXZxT9~YuNM|V~{)C>s@+dpil65h5pi)ZboXO+(GDTMhL@J{wqh+N1 zQWkv(5L#=U(7M!hu+*K@g3zd?>;>^OL)JyuYlfOi9)&X`5i{_4n{|*}DPJTIwDrLr z+z5&NuXP@Ow05JCdFVyF>Cn{n8n2|K$|Ra6l#VP{e7R;6m@!!5HA|x))rf>0tRZQ; z_3DBdq9r!PbnXQRO&AKo6skn)oh|AlJpIkzDz~U zfZBi&dG-{cC>GUu(m~b!zjyv^@P0~LPj=VVarM}V*gW_99bB7Y#+vW~u_<+ToLR{I7gxKv`MuLh zX<{S*^B9XN?!yl@-XGo{e%9Lf&G560o2}s|!!I`8-?*{y?(p95Zu&v``PUoowub*X znr68>{Oj<4p1%YwnZq&lxw-6nDiX8@b%WXt>?w69t)w#}OYw}1NX zH{ab#f4=+OZ@<0!-9LW!564cx)0R(PxUg_?W}R3asrq3#y`6$iU9aK6`Cw@ZbOb$- zEEp>UxWsm&ENWBBpX=K%zP+3NzIhn_a+h0$8M}y9$7u@F^RVb{ZZ0Tio3bv_)&fQ&6l!I_80U?k$}$q8 zf+A|Q&{3gYZEYkBD?}d4MW!qhPeD~Iw8XS(=)%X5; zi>BDKHs*?>PYE~45-7PdnJQy7)xgtNMFK0mwGLL3E;P3H2OgckUtaeavt4~0oehQr zVY#y0_$avnN0{|N6g|6Vw}h;#**!?wjs{Aa9;6*eZnIu(EYqV$HF_HfLuY+%4F-xH zoGDX0T>{sAyltjg*>eC{_uUq(3u<6iSq08fg-S)ixZ>Ul!H~P6X0jhf*9)fr)Gj>bt*md}+MwI=#mAKRu3KAjsf>PQ0#M#>PBr$!W^e*u?LZW*f9#dUl; zv(u_s9I?;LeYXK?ql)MNG;$F&6(M~OhDr)b5-ifR>~~k7-J}II(t_OouHt&tfz~2kgZ3`M{y5EMBu{0gG`mdIcD`D|_%x~e z`O$xvh(ulg2!d-8si#!wzOB$63Ll*g`ccDI*RB#+yQKTk_qLc!@zl_HEUw+CGy;U6M?yq z#~Y2ano%8zIojRU0obKLlvYBlFOKQAr(dwVo9_F zu?WY(d;K=73yPrh6d$@Wc#D* zIa$)r|0ZNIT|fVexuEM4czXV1bx{l4xGX!)EFr*y_X4=~d7+RbMJ@4*urm0_<;56- z4_mz_%7D9{$L#_;{Ky=oWx;la9qVF@AqJbLy#u0$tM$16S#gh#_*8yphPLsFR#?=aU;2b<3X}{BNgP>S5)tv`!EH z*ufR(Ezee(Y0|n0^}MNOtc$R8LFT1WXo!+I5`2s_Dix!WS)7e(&WhB6s%`iGZ*+UBYfIHPe}%D5iWje|XYL6_Y4^=c zbZYw!#t=MXXpAt-%XG>T3sj}lvW&r>?NzuwQki}^&+t6B;j62=wZFG#lQdWM53O%% zK4bh;GuA~|bD6hNvfyM$5uO^Ff&~igJl$FlvyZL8htoSXndY53{Y;hyzjpEU%RFV; zm+9q&b8o!5aG6aYa{0aM;$o!H94K+%rDMjSLPsD-pD1`yc9s2Sy%{b&;Be`7>(vGm z6kygg&>_W6R8A`jUTfoQS-VWE+SRqH(`c_9tTML4e0AXjl~tFF22X7|9;I_26Q&?o zK)=73c}VH+l#cOGg`*Tn4HoQ3|aTDhdNGWjdzh zL0s*2mSD7{t>3I=JwRODX}{WlauWy_+({l4CYmbH`;?>xrdd&By)gI^Isslx8)x|PFCIh#I`+Su~gpbjn%gH(oj4=fnXBXQC=$_Wy{P*kE{fnNVgZpj-her&4phhCN6 z2}oTJF+x(3I4h#z$e6?sP%vdJ5K%;2&!qReHmV?BN^g+<+M45haAURVFF&|ZwwTk> z(O^bd)4kC-4Pnn*bfI`KgC1uS;@JE&-R}>g+8*UntO+IDorKDh5wBC$NU-(2DyAja-8U|mSP zveatoEYax!MH{Jw7z{y5%kuQ|(1z>%(I($nmqPj|mHP_yV8<<27stS<#VD8nMp)LZ zN*P*6r<-Or6ouG;t&4*{bX%u-ReyDGZ#{pFtwmhV*BTA~I(+`M7eKW=C;(-s7)MDG zVOO3<)HXWn2`{>LI@MiC&hcx6_Ue^ZH@4nb!`^DQb)oWmC{8wozzOH}9>%PRc1!^R zQcflz66#_)&oxFHeFS1yQF=Z6V&m5EtI>LuPa46KdCL=~qEp*%l9yPewYI`Z2wdfD zCIppLffXrQ{T!}A2m3gdFEoeBi|K;DnysNX4s>0&<2phR&Ji1gA=+{a7@R_aE)*3D zFJXGg^s-eOTMM0Z`uOy#VC!W1DRk0Ty9Cq6_j!$Kgj6=d9M7UgScFVn{}Ik`&NX2w znD35Ob`O&TaesuHG z{AV6C{HOHAPh+CAVOo{ zoA(~x+Pu?x_(5y)_nUVfzO#8ZegDbkont4~mY=dyp8Dm5*Up`rxfL+wMfB)w6Daeh zBBW~jQxxFAcomg%(NMvivw3-hV6rI0{Q^2`$+WXq4CL{1-CT|Bf_U6`b&)ivg*8fH zLTL@bD58}p zx|n&bSM{$nRhAc?Sk11oJVCjx!#U(p3a_;CN)hHgljuZ57ric;R=BX%@3#}tJ9eV& zrk^TDYZiJRgD2zGtBYj_E_g|!b-)eO1SnoF?^#>@z zPc&j(Xc2>zf;s`ldPf8CKCxXLG;&k)n4YT~bh@nz*niS{*QlB7E6Ja1!g|O8As_-} zk$ON*BUeF+n4aAji3mjx?P7&%zsA<9=z3Mi`)fMev-|Oq_9(ZX)I8dhw5LSveU`N+ zfl=2(sMgXO3&cC-xzu?a35gde&Toz8>_fni@9o*_o;%f@0AtH6ZapGunyaJ&{1Sg0a)i#H{ zu_|~+snd>wAXo$OoC=&bk^6sFKKSm|zumw3&UbhIbpNA2&dgp~d;sOhDOCYctI`oE z`sAz9BwQLR3&WIKN~z+^Tkk2dLK4Xs^C)W+|J)*!Vf~Y3H#57~-yYMW731%MjAKlE zP0{q&OAbsZP?)8aFJ3XMbVz+GStQqX?LxQgq|wRMk#YRiame-QH_NXfpcpYqy#R|X z4j2WBMGOPu(@r3@nP}4QztK+=JJZVZzu9Cg{W-d6@xq@Ezlfi2*Vl|T_fEQKw7d1U@kic_kJFD|t!?wo zbiIvNcq1C+FXH1DzkfPi^825?Q-A%#Kg`UUg((M3%|A4a$7Q8XQGCz(!nT{W9!V)Y z%5rRatE4p>98tuyHO9wVMU%8P*8rt?ZR1O@;=BE?UTKH3_ZBp5mS0mqK@ni74k3+n z(RroZ6X|W@9@JTl3lJ8dDx>79Udo@h6rj7_fxK0MO+j_WVJ@h}&Pk87NK3AxDU%=_ z&mvG*|G1b3o2HEyTK8lto{vw(b4+**p(Mlx9k@@_gTgX~ltWfU=Y(RP*CIB2vyOhF zB^xoM52lCY!TLn|Kq)18OCm8by)v#tO?8@qwb9v*o`WTvQ(xy{o$-_lmz6$$YOQz@ zmc8p#Wva++3ZX_>f$Ghah_&U>2Ql%p6^6!|;X(5>5oVot)*Bt&5aJkBLD{U(dLA4s zK+mRipLUDs8i}b;qJM0=m$q^ljLEMloPok!3_Q_Hdn~vR2Ei^j^*yB2_vAwN zKb?4ZD;&~mH^#;LkaAej@yEdjYegE(#7f41AZw7}xzexrFTYrUFF&pC|3nS8Jx|*> zyN|9pV5d!C?$@oi@lN)ad2Qltx3f4KBOX$16LAUPIP)9`whB0xis`I%InEc4_seSi zia&O|?De2OGIH0(2D!1pWGOZUS84{>N+XCxmT9M*l#KfL4EU`2!U-QQ1@VuV3*D%3 zF%oSj5gv6_+z#``%IJ-dPH}C8NxMjdi24DSqY)oIY{DRVg%x9(fk z{b<$Fc12Y_5um1O12hn1h!31F!J?I7(eKBUXzKG?-52_>QudY(JHd5(ZawzwRP7tZ zxvA1wLxndsNbfW_tqEZPB;^R{Jf%y<-0#Ghr|K5n2hKKpFiw*ESaU>nO>y*5$T6&R z4h0A?{#Zt7GJdYI!lfNTOt$hqcb?YD;8w zAVzOe`u>EPDj^TF+wH}4>o$+tzP zsooH(Ykmf2jiC}dZ;etUfFagrF&3RJR}$~%73daE`Ht&?UEES-9j#!{G-f-MaJQ{s z?74!m9T<(ZggFWZQK?mkMv71zm4q4-xI|fXj7!C@p-Kl{Dy+0^GP`aO+$_JQfN~tX zXC?-vV7R7QdCC~^1_bw6NsS+~xy5rYlwZDjX{le#pNDE?Z3N!d?RaQz$8>m_YL75c zQ-$x0%w{D9i+lp{M#3O z~snK`|S{0YwzT!O-}R`M?6?RZcofei<%Krw{}|UmN`O?&ad{EAh*# z#o+D1&GcaK!QhLrTE{`2CYew{*@sb*!*oaNSDcciQcV?~b59XP%7yp^+X#d~A$YEx zvss0`Q`VCB*gcq1f1V&57D8!SOGMV-{O0Zd}xbuF+w}a7p zjg!Zv*Az^p1JznENx^B5fGE{Qf~1OytTOKk{IEm2orvBwmSe(e3?;+>#s!wP+exIP zv_eXvm9Sc56<_A6;vb<}S%k8?FliwAs2crz$99VZn_>#7`YMqY)?rJDfK_}bTh`TEZ@v(WvS-Osr*bI038^Idw1)8J{UJBD+F zsW4!LAVvoj3=vphCz#GU+D}!kQ+dC!@p($Ag6WzezpagKcDu&q*BDQs98gK3fA2M8 z0U4^I+wYl-$9!HVUkpHAN}5OE?+A#4^)WOYIH&i~3yosSjR5#Er8X!ynD{8Hvj@g=SuG3xk#k^lJ zzS~MQIC+Ksn*>da4VmGOG<1FG^;eT6+;wR@q{jc@Uo z>A1DWPCh$-7W2{TcRR~_(UtUTkIkQ)KYsGeFB?O{M2ruxH{Jmt>A9vLh?XX>kheRh z>>f)CV9rO=w$irKJoJLuI2=v2gIi}6V#-USsKVgE)_ayvyo1fI*({KZ?%{!8vmjdR z_u7W~C7a?QwC9Xcf*?>EZF*YCsW6Xl0L|iHK2!SD{z?xPzkI1%ul2du-m-_qtnI-@mWkMmx^C?p|bt>hU{W-&Ue?+Jlp!mFBH#ozPj9ZRoQuAE&fkg%vI4Q zEUm8DOVwJMJZa(I^*!B4*o{>s?SSDH3C)Q#GBC?MmQ1mrbymq|9?IqQ52q)UQ^%`5 zM%wZ5EmUPc%C0GnIsjn;Ot26T(K>#QjWJeO?lNiTmRDN`;$ZmvBUm)mi>L)wIPQoJ zDt?kNKnw&~p_ElwrK7X`csRkz_>5<(8;_zP+5~k|)pOE&jajh5ljw@LXa@plW(`A- zm5JztVs+6M&sJqRz0XDfe6N@a*jgW|MNTdUwietH{bo+?|%E;zu&t5`jzkA{@?po-?{(l zwfk@V{{A0t@B0d(w(_}Et@2Q6s!V}upjsJ(EwRbn2{GQmRB=S|W_r%`QzB=}X4=iO zp|xC(2E4my^ZiM74RI7mV(zuF#52qscqBb>(O2;yh9+5q#dp${w0DQshBr3Wqt!&; zX{X4YVtDi3i)q)%4~tFqlZUT0KRdV^y9TbQs^OH}lFnKpDHA4Wsg?8$n87&9A^G<5 z)o)*Z|J%!-eS7)8W@gXB&#X#M&Yhcka_*_QDfT8&cCpspjOo!9RGR8Z;uU5FA>|#S zKq(7eAt`VnjSiP z`s~Q);9-IB#F?j``se9#{^1X6EMb?JP9;yvmz)WVgRy{^r$OaOIF!rfg)iTakbm`F ze-iWh0hjf|H>F!8*c4Ri947=Ub1ViqR7<3|27`=oCaXR5R4+9{xcKlHu&GkpnVBsQ zZ$H5(pII`%(^u>qm;iDAa+cfR-Bb^mb%e$sFJP1ihd7~L8_cOT3bJOQ>OFP_1gpr)#mRs-^2m0}WP3@2H@&I{>z+HjrKReNo4Yw%IqQ+x1qW+F08 z^(F8?A@Q~|B3U|gz*z^xNM&qR)qFK&MS4r?S7v5yuf=qin2t-YA(#?TM1>ZfSVjng z)MllP*U=}%F01Z!JW96j4t*2kf$>BRWa?lPb<49{JUi`r#(b=8ljya!=}Ju01d*?AbdPhIHZy280Z28O0tfU^^c3k z7d=!xnA|ASqPp`s+HnCkg_JpgfLaPnAz@Tnn;N(y+{utfHI+EteF6R6YJ8Jr5g(@3 ztoSD_`XZ!mF5fFh;@wHdF|W72AA}up2j)1=mTFV{C6NK5dl%yaq7K?wZ=J}h4V~`)#;=(83Ja5p zLr2wJfBMX+$4@;qcRFK1&$#@W;u-Oy7&9G6kPMq(ltaPTR4+1FY@$!Xitm2)el>Mv z>_!XpWFbC^aOPWsaq%@qQ!*cr0HHW0S~xE`)z~2wpU866e<0Cc@>OxxSAGGOXJ)G@ z9FPfDHhn$&BZO-w!#GM*f(Wp8P9X13Rs z8F!na+bq9^fX3L%VxdV4u_?kau*N7tY*a{0>{%Jt!G9;>y}K`^{YWjNzr#wrl1Gz03bidG3lW5kRy!o~w@HyjDuyAD4KN5Y9Gemqeg07t^F z&drTp{Qxi|C=!v-!Rth`8E*;Dib7hsDUoD(BQfPtxw3^7Z=^#Y-e=Kw$I~`Ev>VU% zyz%TO@i*0k=tBtQwHLv=K%?o=(s9edf+Sg^&(Fbm@2dE^#c^1K6&O*9Lzzf8*d9=B zE6PMvn(B(g$Qt1>62>yGkup{Y=A6Wu;G;x&Lk=3{O*F37K@b>-Fxc9VcKLXRjiMrt zwsvIu%=(L6FopZOlMB&J^E0!y<;vXaBA*GOY>IR+#03I?jgyKZCt{GV2$;l*npL-{ z{DstH&@!Gq>Y?fw&<)j2BPj)L^G83DptRUwhirc9NABH^+yRuPT7w1W5?jHsB#LOqgSAp?DU@SbrGgWk zmBntStg7O~Vt4(+j$H)1Se%8bc&6N_lrHqs!0x~F{c@*jd7XD_tM(w@#ySDoV1?re zVn7Cm9N_3lGNX;mTXwlIc?nSUCQYukW?=`jut|JP;UtN11!=DxBT_P~kZ?>$iYc>M zJzq~iZ~e;3`iH$GDB{u6uNHby6PL>MtHrO^KkhoH)<2B#OSz?;w7s*Z!JIGFrW(Mp zGF~Naeh}Outa#vvD~^HX-O$H7y{d#`C%c#YLg!+c3SraQhBP^bXj@0z+Q~Ulj7`xM zGT>;$oyTc0thLlQBD4%z#YZ{lK3kpdRAq7Uh4^}Yw3&Dkv@~Vs4+OLwQhDl4Ezhy(*_mXRhp;gpj zp*>^PYD|^oX&GJ+@ej@;ju^Z(xOVsD!CwZq1~(E(d)nvq>D|l4;7{@SH{!D&3~mpu zr>FL9@TaxvQ_FO_1FW%v8OA9$4nr`3Na6)I!b+hz%`@$DF_2hHi;t@vf-}bJCK7ct zz~0r;oiPD6Mbrsv2?HZIlG+FCkqQ<;a4wpH0HQ!$zumE43znFH$bR?zOlH4+ZvOZK zVZT0g_UY#-7UFsQ{M_kho|t={{_-a^|A7a)e(|Qrcpo%4js=re5T})P6mc*9pS^2o zj_bJ2e`ShmGu7`$Rs=cA zi-A!J+DeD0A|pkM%tsre6s-LhXRG~2_zORHHh1;P#g%JkUb(Px{$h)bpFOo263e6rhN6>JqC=HL%YZQB zl`h)fdA2_sufunThy5UZ;W^pW;s~g$;YLU+gpr!ibiAlk+FRy|a9n97F1^Z4xcOup z)9rVR1|G_@S#z?h#nCYWPI@jZdY2dEFex#`HJU_G)D1CT0sUTYW$bY{&PM7r=v_&+ zd;^BP0KFF`!|MxqA|Dp2?Xdy7{Lt=Iz||Vzg5*InZYd?mNgi@`kvqr~p+zOmo)cazl7Z5gr&&$VE(Gl(=gH9x>5Ivt31t|D^q+Pc_4c`P zV2Ai>;f!2y6?_aqS`UuXd@PYV?L*n9@;5V8(0j-|d+W7UuBGEj-MhEJw4Fk%MAzk& z<3gEWb2E9294N}%m?)eVWkp~dr0{9+q@khRK7sZfK96NrkE3ADTcf3r$R+odi{wgi z&5SBqdU?8;3~|Zg4 zDYW*egR?pzBCNA6iP)Dd*w5sWH}Z_ew~4t6Fllfj-Q2IilKyIw2O;P&;gl}RZx+b2 z5_6wUUEZ+C8IOTdqtn5RK#9CJ|%(-58Cv&5_2A--BTwN^n&C9NS8 zDYNMedx}~@AiTWHlsxS&p8Bq9-gcyG70+arJ+J`Q04kpw__Ci(h}C74YBy;n>8)@5 z{`QGe&8XA7@37|WfVx`stWs7OEx6Ia6U}V$Dm`(`T3M7sTFo-=y*ijQ{UP}DY#8(c z_D+umTff@O_5W^Z%-;N#5`osDj)Y+F;3JKWNnrtXBqVvSz@cn4>?B!0Xv+rAIi+kC zTy(X)orU*rWmk)1L?GVDNDWIj1=qm>rHm5p4J#v&|Mfro>Bm3$^G|=4$;f~6!Gn)) z|L+%H95`{jp@(MJ_t2PuCnHm-G=XuVL?GG_gAf_2z(GW*siLOL+qgc-K~!#UA9o`H z`&hiOOMtbIa;K=4RxktU9>F@5}p8ofYf$-Dmd%fw;GY#SW z+Xu-H*?9&Fi~UPLs?{Rlg3{6{;WUXTsH7rNPq^dK*gaJKck}%nS6uf(1oMsPYEewS zyr3!&uOV8>h0B>Ks|Y50UsU$L1^ou|obilwy#M&@AGK(5o~2mNb`US>|J=T;LM^5= zKHN84>Ga`FpldbH8k;U3s%_Fd?yXc&3uUB3#>(hmaJ(^k%yoaHM1Bb74z~%f7D`7z zDvyjvrL8lBQDFIk5R9=s6$TI4z~Rd3Gb%BiyY|8>S6gaJ`GM77U;t!jBN4`Ur@3HU z2?0QyF6zX6b<}K3)_(ui02lM}beD7c(b^%uT0Dc5nN8Uz?@9^{=}1ZDwF!_AEsEMN zZ*Ki!W9#$Y_xnk#!;SPW&NVoMu=T6q8z)YU*N^O#y-gdnooyBAhBoG#K$an2tDC5N zW`=fD1nQID&veZE5F|weWyyhAgUUMePWPJue);qMdhZNw4sc_TK0a}3qa%6S6W&Xu zS&MfJE|3_6P39+u4boW|lK&P-@MYuA!?n>Mk8R$#K56=I;KmY^AJXp7F4wnhwNtAM zE3rkAS9Ed8!8-{kYz)Q`0Zb-zi{kmO-~Qz5+n;@X`^~R!-#u~awQp%bpH3R+rIjly zFRff$S(FAkR)h299?33bs&&QcV6EYqrJZ_os5KBqxYOW@vIg@!cYljFavZXV5ZKO) zJ?lD_S|&2Li?ABm;5FrWorUsRV+zo1u!<-jm@4XO={NBEe_C(tK$WmgL% z1#c~l08uEg)Nl+`0;2}KE$TKqH-Q^-8NFlgf|Z-w$C9hXFf+DLL#+V{OhltXlujam zWTGgPUxOR2zrBb4NQQZx9ItQPX=}9TtoE|T{q5qbh0|*e!2^ik z18Qf4P}WCpjm5GZ3oFBo{@Mh3Tknp0r=f9^WnHyhuVh>Pv|Wg`=myCMq9T@a8bTD@ z1{Qpbz@TiE)uZ(N5R;?O`>Rom*x<0AtjZuKcLuIA$a`i%SSHa*%p z)?gUYo%VU>66_-|-!8pcFoj9BA_d^e2ktPcDzEOirvZ;?ggQS`Nf{1$lgmD_fRpJw0jG z`$OoRh4E;~mg3A~caj|RPNYL^)^|y-7EjAai~<~(}-2tPZlL3o+RQ-u*wu&EVs7MQ z_G)#wIYLBCVUFX5p+V=+gIAb$gUECeizbTi=E>CQXVdqlpLed+p|jdgfTvb%STLLf z>8M5$xQ;?fMlIDK1uxnR`_gDU+T6W8{P8R&BiW;3WwV?`fBC7X%B9sS=P#|EIgDxa z(d&c140y9iM>xOAMl-=hiZKU3tujaqBmieYMwSBZ=(PvQB3CZzqO1J=52x=>Kb(Hh z*^fhKKU$!vRTpcCBjBk`{({jGq>hGZ$%8dzj{F}!`Qtl(_~jq}?!+l*p0c8>Tv|EZ z?W@>Fy>1&OwHgvA(V&zNF(Bby3#+KHkyDyH&B6im{&;tImNNaC^cK}PKNoBvzo-?+1w7y(tvcA04pJ-42cQGiHB6Z zgh;MP-h#zE6Gf1I^@DrA`|6#q-n#ecy-(8DuTPwM{MVk1J$YKU*ttuqt1op%>Tu|F zs}|MjHaEb%b<`Lh4AK~FipG2h+6K#x@ZJukc5U=OnBDNR2iKw^WI*Y>64Wy4FdCtG zx>&R~R2KOytDEUTd6)U*;qG#`V8fQ>ho(VL>a&~F2%ySF!A(%wc_E2a zE~K!Na#7TAb-Is(QPWJu6tFCYBo-~R8-|9tS1 zA3lS%CX07nckbElv%CwCY862*JhAC?@{n}I2^u8^$+a`AXmDc;gH6b!_ua^IMUkLg zinZWI1>gg9k@3J#Y0TZZMgyQIYnRV^l<&W_bCdFaOy8S+F#Txu?Z@}uy8m`AjXoc? zYfESJ$m$T-h(mMV?-jIaEpya+u2323Nkl-2QV4BRn4rrl+0EA70gg9bAN5Y-V6ERj zaq4C_fx9Qn+eKK3ETcO8h+3uC-BV4O$ke9EjUc%$UDVWne&gho(K-%b(#G1>LAnUi z9kQ#%l5+tebMA3(qVbUL1kNmIqZ`olXJf(Gm1y>{3Zqqswa`i$F({ux zZ>D{UxuiFFGlo;ZW6{LMrSwL_Weik8=d1R)Eqgz-b^CeYRU>Jm5CpXf4kQ;g!5WDW z((zc<6qeQa^k}k)8?#B@IbXa>xE)P> z++;;m(a?N<43qJCzgtqfk2Kvj;nhOvI458j5{E{EicC>usZW8K_wfjqNnXDC{OjUp z&s^hqMs?RA%r939T;Q3#Nk`8OGUdGx%Gtm);ZgY=z~K&2%|1$QTQ7p&81=@Z&1}5a zhP^Cd?DdDejqBKZanuZZqu5)CO?tcUr9bQs2E7EvxSy0XNwS|@=4Lp1Zx{^T=%xS4 zVee*AiTuwlr;ubYEA9@Tj6|Nik|$}4&diDH0AI8k6-T+G$zhGcX5L<}y|xam@|+a4 z4nZ?wLbL1 zsCRiX=wa_N48!Zmsebgy+*0wwa~&W0KxHq&t=0r5W3VwA=AuU>0Hc=NWTqxxM&>X$ zc>xBYzuBLwU36ySxtWa}c+~1g)JnQ2sL~+N5o(kTMoMcHa46A_tsue) z+St0&jA6WWXRY71lk{){a0pfeE|O&>(3}KKgQo@!2t{Q~E~2EtL?vZe#C-4ldmrBW z?Y+Bs_~5G_Z5v^EX2T|((k!o~wct{#D~vP2h-6#@7o0OWw$teogH9KvzRxEw;5szD zA*5>#nj2ep`orYetZlEW&GRjjOx;Kpu{+I`;OvYFia%?=;>_x+msVd`xw3dnU+1Pc z+VV0_QOjPwvU=&_O4hTQN&P3IQmZgV8=*Zh5NxtA=s1nrcFmh1Tc>|I-LT-SB}D+hjR0W;b6OCAhUisT5o zSPKFYz^;p;wUVf|U>K=oJ9!xSm7?CH*BElq zf6=`UEon#&hnw6IIkZNCpfe=r%;Eah-g{lYl}F_G<%j=#@A}*K{`SrPyYk+>e|#fe zeEIgP_kQ!vz2AIr;0b=t+XVkXlbcO_aAh})N|lH*%Pp3|DHS&;!=w;^Na8xPBI~rd zKeQ97^Uzi`Zcjjt6n3-LE}n+wkEz)(#tE<#RTE9s5ReGYC-+zZry?1zK{=I0@eq2@ z*cxVGkVjxpOp;|O&<;5wkVZl=p@q>xg2db!#Z2Bz)UUM9LUr0VFF`z*Ch++RmWoAZ z=lz)FyGek>s4|g;VjxI)4kl9D1yLG1g`LYf*-sBYH86P&J=e3z;$wR*9*C|OMNSD1 z#A0lykSs_g(@Z5$%A2fM^!cvofW5SmA{-}sko=NuL8m7;LzTBacM@VDx*R)WB=aH& zf+5hr1m(&BM_h-jop)j2pn1AV<-HRJQi|C+9ozrDNqnVf5~5_F5l`d26&y(#xOH5S zlxxh|anF7G^bxd$8LRQ8!xGXWQ$je>w(}Vny)`vjB!T?m2~EX#gCE;zHpp^Jity zTUz$ps)LToqCEU0+%^H0LdvM6!gx@IbEg7vh8S+G#VYu$7O3OB;k86<@_gO#DbZ7X z7wXRNTEBwD2F?B8x39ngv-tgX8o)1Y$jH5K`?DutCt2NVfS92GbqNZpFa z5*;^rkq7Hp=)e!_N$fwZ*NIYA^2ykC^DUqe*%jkxc_IuES}W%SqeMi{6M2G+G+EUY zC+g1X@M_)nkUCTrXY|5H`*fJxp12L{QuPzj_$JgDiG&oGL_^#gEk%fCBG0M}ZrKs+ z((r1v)EmBg^N-!t{z@Y8-(K=PbCxF|J3)@67;8bXV?Y3Dz$otOBCvQ?pg{8iPAGQ~V2PxVSv?bNSLEVq-Q0Zh^8J~m{n^~t{q~oRm1Hrvr~|Ug>S$JbU8ou@e`bDFsnrsk8we zcXGg-GV56IX}}XO!n4Xlp{dSZf)4n)CH|g;UJidB-wsKsmJm#_G}3qs(vavkOXdTQ zJ{U)GD>uQ$V%fo;+8_uJV*}NPKq|r1E<J#h}au}V9N z!STcr;<9>=FMKu0YsQDQFGj{u>6K#1JT+Q6X1zz0#zm<>5eA^O;aM$#=ej-j)#UeW z*{hL8Kq=bX)uig35#-xM7kTVdT6v9thXwu~y8yQWQK}gVA;qlFQp=!?Bu3f*ngdfF zyCclsMDVt=_Hk3AwI5lGhvgh84^Al}l<>j@#=KA(oXE->tpBo|^Zn8KXY2oS`|mdm zQJ&^mh2z_=9-HO8Dd3Lu9GMjyZf)$^u1BT19lT|jrDRwjnwn@LQfjT`gxb75<3%vt z#`iZeJKJk0rrVvGg0$FH`4s~ioN|h2$2A~i35yOJ=1Mq9bXEpszNyY%x?i#U9bb1k z!>iD2E~*&k0kn-7Pm0Z$m&=|k%0i?iq6jDsI{qI#X9!e$K2IeH!e%YqGsDk@AFTS0 ztA`&{r~T4W3KfJ2%{O|-$lHNqtlASo9X`f839%SmV8Ti!3`Z6r3??pXEeulNc~<}2 z3e+8F-0*6Doa;W@mv@PoZxLT9oJ2_!4SLS7=UgXBR-ytBLA0cMoC+*R>(Cu^tYy4S z|Lwn;3QktU(HQGLJzObpOi_^BS^R-p=eUz3OL68p(Vj@ffE%g_H9C5D0&zy{MzO+<+`FT(7M|KO zCOR(pzWIGl-{YNbzit*Qzv`QnZ&jUcyl!CGSN0M#i~bwc!oXVJ?{|CEpI`Zx)A2`L zcey3OeG%#=N~t>j{0s32(chTN+nX9o$XFWn`#-$gF8$GJb227~KRRpj(LQ=9##$Oi zc+hEbv{Td>j;+Twm5Rfjh_N?>C8s5@vaoGn^rN24K7Z!?cjo_^jM-xs%4b1KgM)M0 z7{oCl5(%oUmBs;%?o3uF^kT1WY6q^0$8~kFYhbZE;|+KOyaBm#EmZ(Zsj!H7D^mS{ z5J53xs1zs>Q0=9TK(ohM8}Pj|59;S0Lv6r``3onetvWy<%QXmLEwxfbWC#+;-IURU zrF)#Ytk|JU&>6pH9y>XIFqW?|=SU_lIDY#!elcEyCRfmv53@ zDVSbUN5Q)^(kh6c}lHAlvS@`rKhxft$ngm*n%<`xJ;ud@k#Zv5rh@UeX& zx=*gA?e5FV(o!p7qa?}h2MI$68Ey;M&w4YGyISEqN$=y6`$y- zXG1*!ZQ2&#%)&FH%!~PQE!6=*1wuvwj}8X6B3cMcGo?AD$l*QCGj7Wt(PN*+lI39t z`grCUkHksOy>NDn1JQnPF)BJBg0X=>Bz4RxrvkQCDx*mjPsBo}yXu>Imu!71Se>=M zjA6(em0l^9Qd%x(8rEr9TvI#{6M|J3Ij6IlUzVW*m-{Wj!POZ(#6D_Ow+XNmQtdoa z7#IL^##odHZJlL~Y3VcRJ_hlg(2QN5Gdy>t`xup8DVTs2<|-b1K3JlJCq8=0iaPEb z$pZ7D@AWoHd!Xw1#kzs&EDYQTv`5cx9w`n|ZT0NL;LV{o?i_rl@+8oUHBu{MIF8=4 zA&QD%Uwt`jv52LQ}ISr`F6HFUC@IohHGkxMH19nt}8R zdnqxA5a%(1F8iha{VCwH9Na!~aN7h}3aJMYyjE5SMU7R#dMzn<2;f9kVZ++5)~>I8 z690a@c4O_@t=FnsudID^>(%)3Pq%)u@r577%O6*3pWS*RUVgms;ty+|u6=y#%B|Pq zyFZRU{{F_7Z={#$9e;>#T>FRko*%7UkKex0zVpV~f8ToTV5ahpSP2;U!Jr3CQ!jO!Y6bd`V(2hA zHIdle;xQ$k41DvPqTPg9jJEe}!9pM&6Qa3bMmVjIlHjuDBA9Mxcx|byx|+xQUmX(2!+~9)q3%H~g?anNC88)JaKawF{%o2Af1ziX`LOP(v&Q%{`KY zI~%X8BZ82u+M)&DTdjw`t9( zni?juQtx(WI7&5zV}>-t*b}9kHpnv-tWh!`g!Wk4uwe;KNe2U#2hK;=l3R%t%d~YS*cBxw}fa}4)y?pa`W|x+~C(AL< ztSOry$WoNS8qKt%N(iq&IMBpk!<6^n%@OVuJF_sgy<+X7731a*#f~_Kt&R&adf3j< zfCDI&H;K8a7k#gW*&K|oLnL5w(ajd9OI6RZpyHvdiN%3}GLjO@9S+9Cog+u}PWGU& z^=0T+C+hT({mQ}3PuuA*t4CH5M-pmUrn=~ffrF_z@D8r*W+LjvI;km7(<7v0Hee+J zXI2E|g=8wrwRFDv9&|c&f6lMWogAzTQV2ZsjusSC(8<1&9E$<=%5tP!(8>`*v^wZSaN^0H}QV~oH;5bwsErwS?Arcn{Rcx zy+LZ~s`}m4n{Tarb!lseD`h1OAAPs#JtXwlQYb!pwBXioofM;bc(f$SQhESA0$-be z)_#C0)vjp63rP|gpd=IvrHnw*JHVXqtR92)e_Q|P_N(iEx_xE+`uZogf4zQV{ex=# zm+POzmmjQucKg?fw|lVka5X+gruNP1M^Zo?k73Mxa$Wgcu!^;c3de%;Bp@NICd?*s zU&N8OEGubpv47dyOLgB~^7pBR{L-XQ`vyNUo|JJvcv|P3cc$r>FXOH^A&d58#qaV9mM4p| z5N(4PN|otE3M?f-mJmuYL_3*CnN_&l_`ynV_->~eUaJy)e1B!c3ORaK@~Fi`XU_PT zkkEL%OZ5;lNuqHaJ#iJ4&v3^j;_;7DB99<&zDaOI+iEs;bwB0vTf|oir$X4_0D*gq ztx<*>1sYKyJV2HevEW~dM_Z>qBL&=t8@ow(#ZVebL1KeL;=JWLC}fD`ngzr5I7~Bj zo5^X(^Bg;Kctq6cvx{-@7-{dl0u|R9!pvC3(!dQv#U7_LD4k9^G94ri7bd0O4sJ>V zX5*$bTqsY#84!{qVwm(IMTj(^TyPe!BMA1ytdqJ=+Y;PM+oH`|XB~~>)%!Y{)q5k> z85LkLs#>t1B9IEF`c{QSJpLs1SfY?ML4LleRu+cu4zKmLRU2;35JfvP(^*axOyU3v z6SKm28w8I?Omi4-3kJnHVTrO7yC5khoFN;JO>IcP6i8lIXx%i`0@O_!$<^@X8)EW6pHE%Cfh+ z@wU|u{IYLGCa-MYep)v-b7+i^2U8b4HCcp55!l-bM6qTV@1;d5NWw4#Cb(3{qUex? zJYLZCU)_FX{iEBjZ;bKmJ#5N6uynvIGPpxZU@J1kx?%+wEP)VixCgByQNgnS2IaN9 z&o_(R4vg*~vvcTZ1{fxHh>hZ0s&p6!gdCGPT1grNMk7Hj0&$5Nojll zVdLryj5y61#X&H@|IgmFHMezL=f84B&$YAfmpqBKWm&Z)c_cY)^P<_8wWT9~0CNDa z6`w3OZXQxUwbPk2(@B^#)4GXTyR}_giJb>XuN3qbGUNV^?hV=^K!V^VwPF2t^S~E*0)2o%jV%v!S{Q2%$~q^ zwuNqc!%bduZ)%}S+bz$`v0Q0Y;K*nd>X}E$QfMKK!%@LlOq4ZZ3eo7=Wmf;VNs+}y z%P4sy2QVkRQYbMPq&)-StrH$`hlCbXY2c1#K{*`t>TNFb)|Vgpd}B^{rBD)rEk%+N zzy=vWif9+4MBLiEMMuL?>L!>{nXk3=x?```&BIZw9RL^`B^hQOF&8Wmh+{2+@hB^5 zzwpi}BrSXO+SMz6wcMP3^LLfXmkTb1H$vjzkVFPia7-J|0_KNodlEPWLgYnL{Vi^L z`iqr4{by5EC@(m_L;sHcYprJwIBIx=Vb;a0ZPLrHTPg z#EhPMjevtm4{BC#;#;${La#SwI<#``d|0xE;%q&ud1u1=i?I}8Kte?yDzpKkh_fKI zichfRs^#82&;(8OO3;tl_% zGJQsBnAv^UOGH_Ubf7{RO#opE#8P7^NTq3r`MStrmA=u`z1kaJ-K}o)tw|;Gr3jxX z*5CZcda)P_(FN**f#6(3IADb-i7B@SLagQ{>kR&4ZJX5n-|XpkJ;TvSKC1KLD@Btl zq&$kbguz%PM(~&@^7y0*pxe_E`C0uj0k$}+zkV`udcG*9zh0ct19uz;id3K)DN5r5 zY0^4j;!*r}7PrzU8V9o)Uv}>NpygIN-I?kE+)DFMm#UsnDlo)|wU&n|gb1c2z=*Ka5jkZC$ewxKP8D3gzZUOu zSg%iswZ2`*dU14jez$V#Mvkqdb||z;b&G0Dg9FAX!6e#$flOdB0F}{1WUMC_zH%~>_JxJ`>D?7W zCoM99Xe^y4Ry)7}8-k2fJa1}e^7F~(Pu@!h^v6RGniPh;Ob6BXsvnps&Dh+`R~xDyTd008M8#U9 zEClXku!1=pVkR#UR$L>F@+xj-d)l~dmpuL9=JItTb3hlX-E`Ltc9v^rIJGoTz&3#5 z++~p&To?@dz1qwyx!E^#A!j5T%=bjI!Yf5GU=lNVr*O>saOyV;mPU%sAhxg0># znBmL;Ws7O{ZkRn1ECrQB>^#Gu!6@!RuvlW|H1pKstg^!OQ9VfGgnKvr9D6DHn4H7a zYnLuwy0Y?C#+dYu>`HN@(K#>y#uLG)OXO$L0c9FtOR{{!Ya2NTCKuhkowf>MaKNB zKK_~OXZICjDZ)YlMbt|Vf*>g)+>8*zjl?LAa{O{4K<~xtE^qT|QQeE`yy!}iG(u2N zo})mdF$@vOiQ~~>8zQp0iYEU!`E>G!$ybvHPu`t;^yIzC=TCkTt;t8#;w3tpPu`C| zeiC2t`Q(dg@~ikQzWK?!$KenNN}J^QnaLYVUOp~PNtjHorv5-u=7lq8m9=b~}XdRE`=PCHuDRZSPF7}=U(^-8~6uh)sYxog`P z@-ROBU~!frt`Vce6HgIBX=Ns3X_XBEZat@m>sX+8x>e(3bS%6a9tgm7u)%F4~x zu3lcb^t7{krW0X$)nZ62a)ENL1oqLoQWdar1RU2guSoN4%Ng{lM80P_Q)Ssp0sP`O zNS>x=Z(k{v;%l+M$VJO)k>wQAw5Ny>rG$WxWn|y%)@#rV`@I9YGS8MpJw(UXy!=Y> zbRlprDZ>g8#<3IFS;Po(Jh(g>!@Fxu-Jf<8wnTJ9JcPkCzUB>LSEjRiSdC^wn#0PpiqANv_2}TV>tDi`!X$JcbHHRV!dWe9^2xVF{z^ye|lTYYy>E>$>=RI2=k7@|6!R+j;i zF&ULa8j&~5^1svi;K!4X;#VS@`r^sG$%Dz~b3|s(x%}Je%K=CKOF=4CAtAlN%roXe zSSJ+$1H^JCKtdLY<;=YEYtdY}X8Na9H^9TdnLV|h`GuOvbC4{D$Mm!{;OscOXR%N- z1Dj&~QObfRoGK;|wpMZLyye!i%oTQDfAFjS`}Kc*{mad-|MlO#e*br0|NP5y=QnOY zW8?G2%9SOV(b+mc&C87Tfu&SkB#;;sVeA+L7DBW(Qd{FFmLBC&5N^-eSJ&ZAjOn`d z413Zd$^tQ6*VJOWpyaVjhNal5kSOSkvN|AQ5jV_RDJ53a`K$$8m+MZ`?~Om)s7+m6 z-xzf+%XEhG}02-)! z^{pWcsyD}<#h>Eu?sj#t>5qS5t>rVdN1io>++X@esnRHYKY|l zBMvbP(8fV@7=hZZTVhT05C^DCif+uM|^MPmR`HQ$74>5M!O{)zRwhQB&WA zVZD6Gt3WA|BrVnDY$SP*G>h@3E?`X^c;~ry)UoIeg5cVM%A#Dkcza5qu#B^S%Tz)` z?e^Z?l-5s0SBheMU>Oa{NM{5^Qlmf+u*7I>eb$-u?w##_diQ756*Fo^d$xeiKe8&x z^Q=(N=dRaYCdxvjDPqbp58PO0!3yFGk_^vVwFKnMmZrXQe46-yZLhUn!mhA!%b? z#T9a?O9k)^)s7hdGTs2Tsy+Vob&4`RUg^wT@>!&gV~ z&x{|^g`}_S7FVE~< zUu4$EOGqy4N}aJiEilgwn9@g7Acidg9;`=-Ybm%z(s;*M^vpRX9R|a+Vt&!+VQX~1 z_s&wIJ1e_lAT9VntPjj9Zz=bL0#G9;3wdkd5`##h7MXm~b^)HeF2F_Ll&VZj2Q3Dv zEYr~^gTUHz<)w1g=&U^d+W5oig?|){e4S2(r$2e9E}PLe6~pB`f$d5Ag7QkHP)pG_ z(aL)!V+d~}@WJ~4Sa7777kNz^*X!Oe-c*D$%}noKP?-w1-5j%<4{o>gO7XOW2&{-r zMOQ%#iB3RUA_7<`vy!uipFR9-&kU*?@#EvSr+s3Bc$*#5uO9x#nt8PO@ZO+Wdw8#j zp`C|8W!7#PYr2Ew2Yp(nf^19eHLC#S;x5)051t1agFc2-G{#m^WQ=hHFv=^|47Qs< z20LtV?MdKwOigDnF4Z@O4G}E5nG|(MrU)XQ>L_(3WLC*&uok`FHobMb)9Ub(M|09E z1=D+Ly#iwimqK_P-3~H1rH?_fQ+$Yf;nn9uDRlknO^SuMiEpmF_4XSpH_3uC+H~z_ zfQysJBZoyq1Y2zp)7DDN5zop4Q}M|(r+)OkH3tWngISzQl`atKd0Iv62@2kFB20); zCllaoRwmi0M~xYn{++fPpa9avQY-|QVeCCtCSY!)r-3sQgbk?(B)5Bd@-2N@PpD1` zd)$rJj?dDkYnS3eb&i*^{iY{uNjoZ*~VAQw8v8RqgoxdN1v% zUF~aU7bm0xp}qdGSOR*cb*eN^`Ek#oAIyxpX{h_VcZJ)EU649W}QWb3-3{LUH0ddiIL2 z6jj5$;@B}RL17Y~c_V`dnYN73tT~UZUvGW-_@|G5vUPv!_wk=kAHVm)dP2_Xm~g(n z>;q1z(!?}@d1;ig##6)sLp=Hnhmvi`syYAA)Xm;ApjmPWnG67ySso$r2n72 ztND%Vy6*qVK$~vj`hI_8QHYjg*_9~;qU1$3!nt4M6NfYE45dI?S(M!*2HXNk(WXU; z*liKiaFbZ^w=LNVD%&Bov(|)x{29IXQKE+A@bOYtB!}V%;D|G%-g`Q~bI(2Jo^yUD zXiox@M&kgGTM+x$CwE7h$7j(0!3txkMt&`;zNqKJM^X6sZ~&(IIRd3K1d7HNE3+B%;Bu_ovF_3^{U<8g_uR5 zLWla8@Kffav{5Ly&YFXO&;BQ;2LXT;ER0GTz?BfjG8j zn?sb*Vl0I>E>eS}PEFauA;t-2h;wZO;w^1^XzxFm{N?6OM!VGb5* znxFo)ZoB*7J>Tgs-sm=O8j>dFhe=cCrkeT&L6)K{nNJH|0VBe=5W_JlS)xhh(OJkr zdHKD54}AN?$*Mnb@%Fl0hlN*+q@^5b$uu!3kpMy}Mo2K=9M4LBPIuc5Zq)Q}P17$l zPSy6u#jVT7a*HZF_!y z`Xi>!PhB~EVS4KI4Yy&aF`~X}DI^eda84;qtgwh;?jS8V?gdwSgk-FG6A5Sg0?Fm` zGpDaiGd%*2`j(}5n8Yi>Q0o0vSRrK$jcY|mvtZa(9lhO}W@Zkb@bA)@ z(^qCry>@1LY6N=e0gJ&48c9up3|?rAsaBK`DrhuUGOKX^ESQulc~M9L9`~?KcGayU z;u|oRYMfswc^&vyH5_*vcezQM84nuc56 zb<;qTovX;BeDzC+G|z1xa<*tXLqq$XpBkG!qvtWAaIZj>YL+u8k7Z&k#c=$e5K1gT zL>lcvs1y9%-t3R3{etnm{#-W0tXHkaq&t9HBGyTe$i+@)PO%N0XOobNF zOY_JYDpd$+s$^hCnH2cae(_11y>jZp=SrE(Gp5kT;O5LHML?n7KRAeC?whY+%I zNoRXq-&rS)Y2tr7UZ)LtXGohxSBRuU7+mz-z+jvby+L@&xuc5M=!|D2@Y}P#S6%J& zPn_&*J8PJv0(MCSY?fXrm?Wg)c^Ut?(jF&ms z5uIYaF+zJ_5G?`WGU`o;uaYt0H0MNtYAv16&H(jmg) zW=)t4&iFvN*fBgAAs|BQV#yIaCC?>1nL2x6|H6~Y=P!&|Y$Bs6RyEHKWdc!ZAQ+2T z0HS@!Y6E#Xb9=h`mn9d&-0cJ>$2fJf*TLnRg;DJ;|5=-I?TNC!s5QKlI^`^H$Ljz*jxr6(&zEnsI*^hcRx zlmj=!OF^k(aS=jZ!`*)jzN=m3?^fQ5-+eRqYUS<0XM;Zt?zUFmUiszVerxcn__N#T zv-P*X9o&s?ze=9<%0HzK{&Vohl{@KYlXktaXxDq*h!*Rp^+JerpoyaofKpkNQc7aO zDaxvv`^)ipC;3vlRh+Ss3xl`~>83|6Y${1lWbJ`)2#&2MxaUjVLM9ySI zhfmWduk~)gVn4Mqn}%eC#%XBd{ui{4$2Ppz6x1demSPKDTO55r3&?N=f*L2e^U+0Q zB&+JSUBl3^-1Q4-_0@9$;Rw@$-cccGCq z{qb0hCUVUCSL2BqHBp|8?Qv$LUd^G!h7W)0koXnjuZJwgG zU4o^c;=mHci@}n{HH$3sad)RNj^oN@o%yaU{ny%^81CO&yYtD~o!jwsA5M5CM>7RS zGb8aS)f*zLumN%85deo6DQc-*0C1XS`GseDz5@=LE4(F3ZEon8)S6wm`1;w`&riLP z(}?j@c%?{2@Q{i&T^r@1J!ipk5?Ec>lE+|vzIy{&KlQ0EWLMsY$tvApGTwF>mf|X` z3>tx8+WQdWILkdkIv}tPXBE0U$urs~-ci@gb|tx!d6(N2m_ao7f_r z>IBm@wM5f|#sl=%WtzA&YFy-)`Rls?Q>r~uTWc{lhFPmjbmM6nw;Bir#P$;1+0=(} zzMA#DW=k(rswzhNt_0&@81{6evqglZ$SM(pvW6i?gNarGBhQ2b$tVg(xoq(#Q-@!+ z`0D8^=xP7*P?{w@Tq$snrdLtKX|(JdOV7PW+5{lj+ANoA^*0aSTK#7A<8=zahyQ%y zWbgVxoy;G)(v0;=ABjw~6bTJC^-_XmI2C!LZDXhh5JP?S_R{iX?H$8zmJY0hHp3 zfV9yBFzO+Xo^kbqxY68=Tg-1(KW?pl*;@U5e1AWE|LfIn_T4z*RDOe;l=^NjwD7S z7>_h>{^hoxg?9VqE714uLg!L~@8&aLvRMDam#0phx)SfnwyMQK9gS=>Ib-q?89_k& zT$-F;eacU{9~?{P9)6vptP7M;;FoF^bn{r+fElF0IVxgMvbvyo6b+w)p zIyV`$_#!(}+tDsnKn@^$>fYs^%INDz>TLX?R#O-9=X`$H>CgL7tyl1_Ck$=h2eff(27S)tX=a{MO>~2faS@mp_O2I#2LV;!2 z8<%(7`R}Wrt=@}Y_cwJR9kuO#b7f5`mTA(!A-|NQ*|mo@;OyYsh%Go5>s^RmCgaEj zt%Xv;p+o?#bP!TzWlm4~YY~P8-&urq>r}Vh_I9zl5$}>pIi}%ecX82gtA`o(CU9cD zpiKkJ4u0QxVZ4cKbV~KeaI9Q(Bup9-5e=6ol$sEI4&y|Y{d&{)eATIDqY$ThVAdxP zoLQ*SY3+m&b+0?suF@>UI|PCl)#)`F4dLqjOK6XxMajbZ^^RLVw(Ry>7k&S6N8b=} z)9CWa6ighG8tF`yoSo%Zh_NM%V^E1=H2@))gN0xgNpW5Y z-A2dOV#EG$yxQGzXAV6TTrrA{(V!&rN&_N^qeKYdeRSkPUisYMcY}L_?^f>AJhAIz zGVTt(9{jO2_?N*K=|_XFS8fmPuDt!2Ja+KK%2I3atMpl2(fQ3J_cT6-M$Z$>Qq2r? zMM+@5A+fD^shuL;5FU`tqR?u5=3mGE<~udR@gELE{r0hp`~aq?CjJoAT#kC|tni-I zt8hW288eo7@3r>=t7xf%CMJNu+~my@TQ31y{_s{EE=~%r_Rcl2Re+_CVlBLthRGm> zwo)OZM2yD*_Z+f{IHtQDnD4fJ5GMBCdz9WBCAWGN!XSWAgf+IXdq zk5E&~QHWbu4zjLlO?76kSM7FVTe+;8vm5hSL&+~$AEE7gu6F0N$PqCE8*%&|(A`(CHlo=`!WSy*@txSBlr~`2aYNC~&*oEy;)+W&vBblZpGjPF3 zoH~^#V27or+)*Qsa8b?0Q?HFhRn6!g^ZMyZq2t_vBFUo1tyxK}2*HFKMYv#Dro02! zdsTmah_Y=G;vUU?;c}zJ7{<9&>6F#UKwyKNlEDNANC_e-Qix<_V$O9tX_)bRv|Vq+ zJH=Zx*Kr9^hj{zmM0k|8fE{F5imeesB7>1}M9aXUPso+_(lLQ#mO+_H^w#sxZ_U7s z%12xH;C8?DCbavD)sbhFJ@kEUtTl31l}zgRPzuZ1QvZnVM3OvUjElxPkIbmr>-x|#VF*a zU)<#=c+$7AeGN7VvJ_=*f~1-lgFMAb(TF+&8a$(%WgX@9p|b$JxUJlp%(;Gs;;Sv< zD}_^YP8DdRy-@-ya-JqX=C}5PNy=* zrII}#?_DKYjJcyAsYFC$MJ*vFSb-@hXA#Zf!dQ7bl>n^V9(+BxH~4IDe?lxcULjfo zKBc^+)oY#iH>&PrQu&eB$7cUzC(KKg zF(AS?5G4XQ@Q@hj2=$BvWAdh%T=Knm&3N6`EAj8;_dAtsIp1pk%?0b1-)}9y*Kui| zwcGjuCMUT~c;}0?Py<4Y@(E!OcQ9iFvqXpZN7z6R7_+z3^W$ohgLX$or=Cy${o&1s zP4_Ovg>c3M#wa*v36|WWv}MH2gU7%yt3=4RW}veOt=D`zdOtsEP4%NY)L;JZZp*hW z^zJ(FeOX!L^=>9cXo|)C-RBKS4s^s5{bP(B&jrP#?g7#J_?WDE-NbY^qP$Y}RTf8R45+5LmMS-e%I^Vfxy61eyZ~gfD z&8bU_T6_;_7@m|}F_7K?6N(z9sbE3?$QaOZ2@I<&29C=kxDHT53^NkhgWrOBy=@De zyDjh_DHh`!M6d!mt7(kRg;kb0%YhLsbk-V!pF_7>4LYOFrO|LyN2S|Z=#24Hs-bFb zzNU0rzlP~sSUFk_|E-lq;#VvPtGNuX}dRY>B%Gy4*f1&PG5WDD0;*WUQW zN-Fv9%MqH7EX6}PR{DNnWD@n*^Gk(=v;}RTamaM{3zSP0 zPRrDEZPG~sWC=mWu>dpFLuwp?qHD>?o>LTQ*{IL0_IYUGhjm6iVia7 zC4m{OsH7xNY4ZbH=exbp4c~Ij93h;YlwB#7F-u`yAS02s)FR7`QVv_6mh@#Yi;w?h zd@ts|zaHNke>47W{8`%0^4-Ia9^QWV*E`=HJ8R|fRz*(0VyUK+ejUrhC+uQ%p^@Gkz1g| zl(;tmtfGFJ$#@N-TIlKgvbwG_DQf9 zQ*S5@%-En*;)CEWP|ni6EzPs8{)hdlj!#$*(vprr8>GzH<+n$CrEpsBgQvuBr?E9M zjdcnn;$L8!x8r2|uj5Z2{-$XO`zRTcWM)1af6*){kA|hGV@8v5FBzQFC^oA^e#|X? zXEoKybPzuQkj2^)CVL^N65Ho=zuNOH+z6c8zBkz6SQed4#RstdnBce5; zTrm$ePzDNRjTybw-GI(&uOE8d&1v1?XZ38)QO4LS!9q+i0!bY~oD=K0kT!K-fw3xB zZL_*{$Dc+M^G$Qnb*Hf@_fE_kv{m1es!8c*CW4K$uhx z@vH$CAK$U>d;4gS+f?W9iIYj$l>*6$pj7K171uGn;m+!ap&`s@oz?7f-glwD{qnC^q`N{47d2;)!C%3lmIa@Fh{Zoah6AeVZSU>-$g;$EC=2$akge6)bB|^}NGR`ud zZdbGEZkEnR*fzHBcKz0^3Fhl5RRtuM;;(6Ra%UUU>0&HJ7nG(7OAMGh#W42-6N9x% z$2OD9sP3#JCaqpOJa{x%cge35Pop$oo9=`>X3hg36hwqn5N*kviv?s##L-C~#OdWd zqSSHIJFH$?nNp@}KDZPWYXBMMD3wvHF8W1<66d$qgs`kGluJIw^056$LoeVvYw7ES zhHv2Wn>*|StNvypn7y&kol>VeU&~#aHxF2)niWH=c-TV_+65u0l2TcL8HY6KpQBmp z{mR>owCTNB@ZKuVtDEfafx1}r0#Vpd%A#o_D$r=kSPUnaj1gj(&(-LL0e9qxAMbTxqF-B9R%)f@s*+(6k|#v zL=feYNlyew36gn&@^0GJuE+SZUsoGV=6OA}W5?I;4SQ)UZlm7@fiF9QI1He24N@9Y zBohs2v<<<=BqHXf#2G=dG${19|D*1_J?d_MS+|Sq7Tz_@?uXn5cCq>yZ>*PCYD9ty zN~ArQfGE+3M*YDqU)kcBi|1bX6#_~z4>Cw%G`8L{Ej$1=(X?=mcov{H;?qD|I9+(P zo9)A1pj@hOMBBh5!yaj=xU$F)qBI~PaUO&Ehn@4i8mhkkv(8#ocP@^S_^Z(XI#p*4 z%&qv8Ew$>r_+|;U6ndqoGSS9xKw3u)(9#FwJfILx)awaq10AZoa$=jZ)nJOC%#0FlE*m z;wko0#C%zK@VcFlS=b2~YABD++ToxGi@B#((h855afpVjLA=YO_&5U}oyqz>58c}D z!?^_~q*sciWf+N=%~=x&SDG73Sum7fjq-RsE^Xg+F|ph^8_o|p%k{A8CJv~2`>yYI zp>|LW(iP4@tXz$JlZa;_J)st?x#K)LtXv1RF3&lxG8a&#YUPyF$N^F&80mp)1BOtC zfEx+(+kSoWeT>s>|MHcULkzxJBIKA2{_66DDOSFDv|`+>LYNxoBn5Dsa$zWD2Aq^U ztD<=S+xy?&|I__1?tgy&4-f9#|2pk|yZ?Q=pYOC>tr(WvPS z(#2qJX~V}4S?}E(Y*y`Bo+I?d9Vp0Rh^+wXL(C+xV_ZVelzSIL3PW&~SK5Rcp3c=wd?i!le^VU&lx@S^}tEtl_Dv;j=`10h+|`gRKS8Igt_=9&KrXP)BEw4 zG4S&f*RO3Bx0qq!>{7xWs7qB(c?|+PZ7|^m93>7pVX#G7vMl}*_v3e!84Y8gdbbVp zkAUZ1`IQ0+LM9#>qb=qVOJcRR0%6I8qghKm-so*rb+cmRc|B+vgRV*eI+}9JcDCKZ zF6otG=`13|JAqP!7MN2`2G4*pDe|^wzX{v_JFEce!MWG#wzM+u+1w+(LO3~&W>r#& z04pLiiGNs=C{=NgCJWBX8&A3CpCxxNVR9GJ-M{pC{ZpMX9DsMR9x@SKf@K^D=Lu7m z5{d&E}^rvTuLr)87TMVLUMpU~DArh#QKmo@vvnh)-{ zs&k>=gAWt?&VE9=-6PNOn5g!&?pf0|Rg9$w(?GrT5Ho$lwWfr5r5Tq@Q*P7(m)urQ zMa2zGt+=fg7u>iof||7QLs3gSM?7E?A+*8~oz-x=Gi}i8`z};xX3La+`*&^+io0<^1%Wi!6*^-eEMa6V&*Zf9*zMep!TbV_x{ zP-{2@q?7_J8KOaO=Q&0e=k=DnU-@ATTWxE}X;76(FiJJUX~YrI3~6fhMco2EFooG0s( zMJIH11FH07ZAJ7b717<&D+E&zNgUxMA}AEn5^F70^e0*d30Z}xwO)MN&Sl^0uUF8C z&(#@j_|DGXuElRZsO(1Pt-;eLZn>C`K=3-RgiCdT3Poes$>PIGg#`=TOBr7pL-Hbv ztE0M#KQpo5b|GWV3Dp$MN|`g#Of$zs?F7)JTE|56A%YPb-AYI=3706wvL*za)y_Oo z{0j|%YS(w1?{;HGR;~N~Vf9q86ONn_ivPLmsWU`cjC}Ckb0v|Yp;<78gO}PM!kN!1 z(ru0m)GY(;D-rx0a&NN>=~Bg$UPtA_jykP?IEkpFo^a#M5l96C9{^fm+Dge)wjucB4KFeCK^I(66e^c1Oj$F~k8fEX5WeCaKsm=c!>7 z1;Hi8F=0VM;Veel;V5ZZOICg4Lc~4+mO^SQ2TrUD+$kjx(Jdt!LT>*Pg7B6WG#JW;6F=}#W;s(g9Vd7eHwpZULb8W$4(lb z)gODc(Y)E!q|_aIcG9_dQugPvE5$JcU@itiidgF@k<_sm8firs(`de+NTS3TbmC`l zdQc>#csZ+rnh!2SCHh1J@jNNUoe@mOgvK!wQyWlRWhFH+>EHhPX%m(2yz7U(y4eJG z$VyE;d$9BsI&9gslLN$9iZI0(92Syk?U@tNZ~C+tif|@(=-Ye!^`EWyE#v!xjq1jp z`?vTe&%;%6kg#@sxa*_I@7_8egE#kHeKkq>))7QEZ2sYE7cO3SzG5>y;a2m6M^cI% zQM`NYFDKtG{)W2xaOV&o>f*2Psuh4l}@P_z*KAbk;3PV)O63-P@=K(X{NNlAaj*S0de=&s<)6@+s`8xo9sP z``-^ksb&bT1Xfx%`&NQum?5tv2#PeyzX?gR3Z09aHzD<=LAQp^<(pOQufw!~fr+!< z#LajLmDj6y_UE_;nJv#!%)v>^sFVyjrm;5xQ|+mYsW8c7A-~Y;_O?ulFxve(^IP^^ z(ksO>=0w_f?xe)X2jh6^(qj~OOmeeW0UrGF{`U_)e(=!_OWA|JdvLqukvlCnPzPXB zsxuzjm_~^p0n4Z~I3Q1iW1e!AH$gOn`om^at(^fsQZaM4_)6gn+Sm}3C5l-SjNn%L z=)?-Nw(3sMhP3yMFYUfDAF4vFQV19W z5z=g-4J5i24c>T%X%H^UNId$(hZ51efs#fkM4FJ{abwb*`xn@eCN^UkN*47 zCy)Q;-0RT)iT%v-mF4qOI=*)okJRk+VWpo;a$YA!Tq#B#(rVMs!{&meGe(OD~UE2y`i-|MXX@bUFgy$**D z&&=#deu2Ky%|4D}rwVvwYI@V5DAo`~IPw~EPg8HbCBUr4h7uzn_hxSAbDu_;-5>6B zE=Q3;bF&m5_kaSh-f3-~Wzr{jUv(-Gkz=Qo%2O73Oq*nWLS;D=l~TRYntF>Rb*VQ7 zdFlV3y=&`@x~+?gRA>Pc&36C}uD z5g>s#*eqfJ*#JSZSzp$UZ?Yd~z0$+Ku)qfS8L1k|(vTbud)N|5i6emI3^mi!Jm0CR zbN!BH=#4T8Vzd77VVmHmTkqyZ!NJ$V?!nJz-JK^WsI)IYZB@r9k(@+EosgIe4M^6V zRG?65BO6u8T|(%FqMk3V`q%3UI-z$4*B7Dt(re`ebK`V{nH$zYPLgC>oW0{(L}1E- z3^oi2;~l3?cV8;czuJEPOSc!WxP0q+k;_ug@WR)5KHeYi{p!L`UM}WtUwFA- ziv023KNrx&BK?_VC}Ou>E^<(}=-26|p)U_x(idP23x`-0p~1ay5i zg`Zq}Zg}yzmy5JahZj%pztF|XFKl>{g=z&s8Sh5sA8r~>yb-91$HY{fTfyLP*gF~4HdnDKz zQ}8ALgeYh-@stsn&c`antRanBEN+y24`sJH)4N;FV;`3$bCJ)09S`hyF}6ili9CQf zO5&9SV@*^D%qX8$Fg8jV41PWMeDHB*j@l6hdKRAEvkfjC1^35Hwa3S-cIr@Tod&Ng zB+C_@5`q~SX)qenK1P{sqSNQ|2VvP;f?~BwAB~wZes3-0$qo&i0H(S9DSH2QORz1bXqDrR5v`J= zNeDylgLQ;j8f2qD#9VjP<;YgOKbS^MZc=)&z-$&vej>KE2u9G9(4e@aIiREn3X&&| z8ilG6MZ)H9Hvjwk_rCwz%?HKizkdJo&5t&}+Wh_Z?-rY1riWh?oBuv6mmL<(Za&!j zuN{TVv&ix>MV1c(T1!m>iWJZW4nZ@@MYK**%2`ZqW^7av3srHs4jcD#G3DdQhchKQ zHYM7HM_c{SgvclHzu*=9Z?eU^4Ym-Z=btAzpSIn6RD^AjP3D-4958xD2&aY5&b?SEj zmU>t`+DLQOb=RPgks`O;@21ls)T}u|9t~IIi79ex+Z=HKCT(?wMu{w+}nJN9Xb5)w#YDIJ=MxPfl=uY zgJU{<0RoyvzTe;F+GkYtt*1IuKTiyT#2nZ@qP`piGEYskOE!t75srbiw7~ zDu&Q~_zkR8`KrCNrnfIy7hSkJ-+^A)Un|q+)?uyeRdugl7H`zObUUw%^w96?T#h5y z{NcsR!~Nr+SC3Xco^)Zf)fb-32rd-IkPHaVXtEb2aY=1ZLZhhV_DrRuyR%NGskVa= zxwXYGA;(b>?iDN zcgluiHI&FM+KgU$2Svdc0k%a|ArRvTx0cWlKw?ab)C%gQZ#ID8)=IsI)y97m&;^&t z)CycKyBqiW>m&3e&t=KRY290zDdPdSx7ABc9FNEY)r4-B4+SlSK%0KqNH4eJ=;_Ap z7u_F%>m$=CXL*T6DDNx9*7yo3EEPz#LvPaxGYSz6q+^9ODh0Y=e$f& z_cJ2Awn*CKYoSk;fKxKr2pTLmUZPdnPfJ~Wb`d+Bx|{apq+>tbAJ%R9K(=qIC)*Qf!NF;7EiCjIjvDxM(zRhQjN#KR3d67%2LB>+gOTVn3syInsR2g^6l27MzwU z6Ns~%CpQl$RgtDGAwW95K}rC+yQ8^5F^D}wk9w((57A${ICnrbh#AYG_*CQh*XGWR z3E&TJtu1aeCe#qPNQX1w%JG0Pt^R1x#YUY0OJ%oo=|e}Vai2@mf3|JB`qsp4V+YV} z)s7KQ(WP@mJI+MJXoORm7%DZ8CTbVUDu*BME@fWFl|A9U8JY(q^>@p!HJ}k9lX-dx zH;!V|hWZFrBwvn9(<3%Nq0)2KBerjkSo_Y5z`4+#31m^b;H6E6f~D4@5vUsxMBIY1 z>KB)=gB1+PE?&o#tcsN{^XSmWBp$Ql;i>CN(`KH7A!@5dl9L#Nj~*rEnkoS4TulE6 zhei$FmwOAVi~ZsPbn63L!dZxJTvBeA^xER7i1IGVv@KBXn4&&;|9~``_@Plh-|K0$ zFXj4kzayel+**VF#)IN^y}WV%;r(=>8{M+<4}ZT_)V+SUUVCvu$yyFe&t|i>M)b6m zREtO?PX`XBrX3~BI+y#zG%GfBp5xX0|t%@Pl=f-DMQTv6*be|iaLAM$m&-Gj? z@5w&xP5^yIGYx2~s2Y{E(pbSwL}N@$<~4X>K@;7G$8+%Q;G3;`TkmeYH~1u1Y0aW> zCoUQ{0iw3*V+;?0UDV&mZzVzVzDa(ow0+X|?jE z=&{&~O>2FzjzH9$8OD?lE|B0PqY5-66fUSo$DkIx9T@36xMUkxQ8mP|a8)TkC2< ztgOnPuHxkSmeYl1(<;dwvTKWFT9_!AQfVEsAT;+n3Lso2Siw(c2OSeyu+Bbc8q~D{K(dL1dK*<78P;c0SiR&Oi0L?3${^9(8CYX5?_He2uV$rp;uJc zU+tEKd-$LIvVij8{iU*k{2xnDt`s+*gT16tb+336I=%k7`|kbp{^YX2!*3p4q3jlm zWxmi7mf!uNgv=YBUs*oR(s`g z{mRG$xT%_gM&$e){DCdC0GXr`qGEz;6&$iiP-5-^r>GmHjQ{t8FaGbh-~Q?2U%&L) z-G!&@$X=SeHuGVpK7n^4(pEt@$y@=_cWXtk3=};U8BK!Z$a6`kwoR*341!@ zNGCN9?<_=BXZWO!^QQv(&GWY}-#qpX^0A;#*+u?D{%uu31ZNeOO1O~hF(s3cP4bMa z$YQf8omDxH-4gqGkIJ*OCe#GE;V;wU!I+i8GC;=jvGW7qB>=KM$cQ?&QG~d+hPqQa!jt&d(=xI3t0b_Te)OD*0cU1|6*jjDg!| zR1nfAN*f)Vy?3Bjb~gU43d7C6H#9ua~}{D(`MD?ZaHPyHapnTyo?&EqG_^&B1)GzaR7Q3oJ1iF);}E@|yU^3fZne^e zwz|wIQjb(Q1I!RXjlpbdcwk&LinZmt-+C|I=Di`?>w|o&|C8?i!LD|K*_?pAON-~= z4WdvmvqS4An_vFrOy5YC_jA9RfHnlH=f|RuT&;kZhn->@U+&R0M=8qoCxo@&jWKc<&^le|2GOI-hf=g zy_CLp?$$%=BJAwg8x1Rxnb+}by^gVHwAB&IEF?HI=O#FAxyzk^LOO%OG%8y=3)OrF z0zSN77gtJH4JG!9o7j8Qzc#Lvb%d%U$(_&YWOl&ZM4+uvch-8AO#HMZ&|I#_d63i_ z!@X~Gu6+0Rm|xPV*RUE=H}`5^LZ|HQW>^`a)fpE9%(JnY#Q+}-RD0%RY$s;RXgecq zI*3|plxH9b2$WG0$4RtzQw?w4sbEMVC!eR@)XUx1>5v_Q)Fg@8G3wwGDth_($ThV?LG3MP);yKFA2wy-8= zfihssC}1RbP9(FK4h#l5G=lX?*-uKA&#U|rrE#W?Rwp0< zlu#hkCMm=>k-p%G?kpwVyW9Q&(0K-6n z_1f{qacu2@@qKusu0|Hg&q()Bl82n(u&I_rQhW{Bq9~bsRZqRuRn=9`^BokmUZG6N z5W!1Aoeo?=V1cB((HO&Qkyp6QFMGFOnDQJv(Olif+cA#8w!M@2m&a`mH=;6ko|KC48b8a{|$zIn*y909SS)6N~ z4onb8(2Bec4$`K|UUNx>4qmYn%vgKn`mtc{zj@=r<(IBL-h7^+=g1FO3!XPb`Jjlz z^pT^)kW?Ib?js{*(ut4844PMPdg;(}ODY19#{xSsszqZOGxn>+6qNuXI1N-pL$i)H z36OBsI+l^uUK@;|xd1&3gMOCie0&(pPi>j$3%hJ3yzA0FahG-h4wb&ahz{C8;6SLz zgIdnSsElV?CT}U~fBfC#{?@(8*IVyx{k++FubKSA#m?s2 zQONaJmal|6jn-Y=hH|`WeTxwzr1p+0ODGG`Djx|%sSK1cq^`qScJd?aohYqIY4fH$e%O}m%_c3EFyao)P?u5|5 z)0+z31g4CmT${4#tI7MBI$-kY)_arx+`6~**N-U#Qn-0YB9MOT%Og7sXl_3*k}f#K zhryvBtMxD!yz|MSK-myD3tGew40=ofq)6&C(^PETo&0w4Nfw(sJNY0TV)xSX-)|;= zKmChLIVvV!cjAE0-oZ+5h!2HXt%spa39a;0uq;Ctyztf%YrJRH!U-k>RYo5@CFpCH zuU~uVW-6sFUHQ`m-G}KjRs)D!1PUN2DD)Il-5OHqs$?*nPWSkP zCqm1I&-Y?o>wM7@35sMzA4nCjp%hq@gec-!QN1!657s+kl^4bNmJ_S&#k$h@IOWQ_ zl!8-dm}Jf&4T5XIZHT%^Fz7o~$XCV=78T4hsfu0Bu=`@ADu-*l&e*RSQ|n!V(@PtT zbQZjzUZK{?$5?df3wLlh*KY0J&V%(n9viL}LT(_-Pb=mTtzlF$fixN|tq(;)xEHax zhUtMbC*)`io0a}X+w0}0JHe}Qk30U;7x*A??U}eUz3^dO$G^1WztnqbecM_A#A*zZ z$zZ7!0%dx1Z4E-vU7t%|v1$9Eh4$>`XVVq3wnHh;L$kUvg4{VBO&1?=`RZ9#=}Do@bSct;)w6w! zS&g>T8Ug|DV$5T!A&|%^6CrXh4mUY+MC37x+c)Pg9`nhO{D8IKc>;_Op?ORv3*|JA z(o2?7CM88t^?YIT-_u_`e0%qoSKb^<#W$CgFnOBXoF&Vc>R+JuvwVDTp%tsKO z=$%)B3r`)140Cf;o1)@$o=Liyyg&IO-#z5!?<1+j=R`Griuc9~?}duts`e}s9Uv8i zqR@f?HHr((D2=Xc?d$w_I8G_Za=`+{GC$O5>35U|i&^7UBME|o)IbPz=|dU`k&!tI zlF%ZVg}luw__E7z7BJg4ivxI8G$z)|fQkvjoGN9K)Voal&1(r1)O;i`zX)gP(5y=E2Xl zKW?@^dhqu4XAjg7kk@*n$jX?gJhdts7mPN6Y9gF4 zsEgVbI})^K&h_Ue$Bqq7$1=~Dv0E*M5~K_&B@)6gFkYFIuLcj&b3=+G2ix*eOA_0y1B+Y3akXBf#mw~z}FVyX8jV@Lr?TB?jGQe3$T!@=4b zK!1cOed%>k=|o4R<;x9wv95K#=z?>GD8(}kjE_!>XweeN6)!3`wtw~DXVZS%yW79s z{-|r39*<&X0V^kME2lN>le~;7MPRLN3Eh3gsK>L`j1gi^oGAOUK=zwp!dyZokGJ4o`>v# zy4v;7Gbfxjg8QI-wA$Ec96AA1V|k>Aej2Y9t7dT$uh zsYuEkH7eETnlRylu(E7)=ye>XubIAX6R_$1!IfSQnhUGLcC@h$qci7xmlz+a$~oAa z)rdz%^UN4`o(VLRL>`2Pvlv(G!`vnY9FQVg= z-wiE5rq)}uMMyz``&3v7rK9vpk>oE~?z|{Iti!FhVAw6spZMf?`SSb>%+)T3RtL=~ zW|0SN&{!!MkBV~Xi*B^eC$o+NEWcmw4xa_n>obO{MG=WhcnR+q*OEC6%CUgC45zk; z>R=__%6zaJS+;p&8Tr$x0ll#w2M7ML5 zgI#3~m`YbsG@ZmL6O4pLZIv~s(h(i46q>mrSGfgl(8oI+``Z&VCTDF|3nULzSWwnjsWBkv+8;-&1*J^VtWOCWIS*bfP6Dc4s%;g5SIn^ZuAu`lF^<0}qAQV1aQ8 zM0(6Whmh)$qV2F`q%dgGkMqNEAKT_449BAp^frHW04as&sQ>3y#11fKHQFY{98Y3Y zTpP;*vBGlBGsA!>s!nd;n>g&Z(};LG>z%aCU}KPV{YFbN)RT0!tWTHFzN=X5LTc9| zIf<6pzSc7sMwbd#P*xgAl}NufI%pyoEtAMx8G>t}xdG$QZorvy?UGmjB>BU0z4)28 zVJ)tySn*6qA0uH>dL6Y(i6lc$mD;-_o|EW>jXvSwiE#ij5JPFPxX$z&HvxM+Y%aCE_Ki2D#OK{B_XI*a z``fY-Yr~Avnpm$HSQ3o4nnmWLMsJ{KTx(~d{(G63ZXuJ;4BOuhHQ;d=tKw5Xd%jJ+ zCHn|7)~m%+0Lnl$zi7p+2WEZx$kX7_NCU_nN+@dD|2g*Y&KP?gG1HSRLGQI+EufNm zo9c04MYNQwKr}MoDJ|AY73Dk|<01N-fOTLVo_cx4cC|n%<)U&*>cFiCnz|@BRg9#R z))lR@UmFaD=?G|VrxH7-*DxjL=)WK(&GSrQ_qAj###%}$v+@~dN?0PiCoBjVAw}P! z>+g#xeQQ%Xx1Qyz9*yF!rH34+Zw37pma`No@_g6{jtAgnM{Jo%Ymv8#*~ox6v?#PS z+G&_d@#p|WQoIgUhj6>!jjui7OwwNa)dC76y|`d`iPWqd5)vbkq<2+*FSZ>R0343Hwk8_<(v{v91j?zG!cVM**lg^ zGGE^qL;@m(yFL-xZt`j|^AKWIm1 z&czcwB6GZx%F>JHMWEDrN~V$Z)FSa*hIEcZK`pbv8_CO*RR8a9{^R%WeDc44`&UzO zo;#~g`LO7;k`5b4<^ZX65f2EAXcdx|2!jIh1-0{ndCAL2u(A0Q==IuBgUzM!#<;&w zAmezyqsL%;)Z#v8N_DVqIo!3(&T?1b!i?=n=F?Q?lRE* zxpxj>-%6hVE~&DakcS1d(n2~?IA)1Y&qL89&zsP1ZluWQ($g-wYwX_e1G3XO1J*<8 zsMVl^jLLKGtx+L5B3aa-=%VR*+r!Nd`^{_ZhKF|8?<5GY2{=z zD2>!CDjF>?RkRD1MSHFd#?V}V9)>}`#csp?NlMhkW~_x*=6)u4nFTtmkwR%s9f3#< z@*;RsvAp^5ofg_=ZS%KxHa0&Tj$pL;;jMO#541!1;1Y1THEY2(B6y72fp*+SsuVZK zkZ6qw_o5rE4<}ztzTWy#Gx;D3!fpL%^7-WJUH4eeBKSYs+p%Z9Jo<=}`?ScEA3|1e zUw5kXbVsEnGD;FHvl^vJ!3~u{nF%C|I&T|r`^~(1vT*dG3u6b=q`R$G3#O2k$$$!t zF@or54PbDX=P`ELsO7?6M^sZT?qa=mJcPgKLgBC1>U&sDx&%{*m|jMqY&v?R2#j+P z2$G_9LMn0}Gs`xQqyiuJ47yU|WX6u=DbRkH*E*x3UfC2yXkPv$fic2@W-NF@13$EU zU?%r{-jv>pqsZ$o?~Ni)r@ejS`c0lv#GCZy%B!zkUb)E@1d05;YjH7=SwM^?l_4r1 z3IM{_6Bf>Qf_nI{`#9B^zXi%=C_QfuF&My+m- zT5SSP#s*T8kSfSz$Rv}gf+=RENQHnQfNd~-kmvQN^%u~P-!Xf)z;3x)t=-SVvO3?qxFj^urQH_A&B^!kzEd6DN9W}gwYd_oN|eRMu>8Pvtq#0{g+{fyE4l5mD^V)RSzCj=OC8=bb-hWi z`c{3js&CX+>+4nh{^qOo_021ruhoA^-@O@M#J~B+`qt)e;@`X)BgDHKcppr*`1JWx zr_MCj{mj?>gU7X4RehSI)X2y9GI$hy+O%>}Ac1hm8pE@#=(}_$@s2c(z&_LOBcdyW z(IOcwi&NePBnaaa1TvCRhoU=>b(2KpySn+y_$#Vh)V`aWZ*E>bFvHPk%08O1CpyJ? zqiqaenYR?1=+Y3O74v}-Vm-?0cG+^FJIrjd~5s4r{BJQ_1oXR zIUEFd5gxDxrOAxPhW}#v@4o+;Gbf%qapuIi6H}%#Yd;CuBX&<-!;8UVmyKxRJS2g2) zoG~Oybwg_vC^+vJ(>yROSd0O%5h~)7m4w>9@~iF3?{8newte}3wy*qo`|^K2gvc`^ zWE8{OrpbGbg^iQ(Db}0R0BO0xHb~_`bK_dTz9Q$q`JQV;a>Tb0&1)YLR!kx>E{wc zn$>ZLI>G&n{fb;HAi97Kn)7Rq+5HoTA0X_RR!9$52%JMmI-ho@nfM}J^D#`23Vgir z73A$KerxN};HxwXvBN&L)_=gad-si;lQKeM!^y$Y;ed} z=Rr~HvZ98+zw^=G|Mu_y_tjh9zW(cxJoNz+MrqotIl5O{_C}^yX^aU~J!D=EMW{N~- z9~`CHGOw~+{rXS!)%wf&Z}ms@C-r9sSlk|o4*3F-2R|Ay_sTL6no@2@!~M_q4)>STX)xxdzW*{`>b9bcb9IxR%XDm^Md&(vr) zMVzIGQ%0mR)G($sv(dfe1P72(VlT4@15b6<6T4XTbbqPaYs1ABbgFge!NnAgR%c;l z$SnXPTytZ|M;tE$GQE3tw^zUpfSY`7l8>c}xn}{WRGXOd1nIz($BA(g3xbuTUhu#` z9O1#*lRr7Uk+}5PrML*9G`3U)FP#g{aBZ<<#48g>mLu>zO;pRTM@4FHeBK$^n>#<~ z&C3y;O0{*53`?D&+_1shE5B(N-5GAaKs3^sU!02F|W`Q#-ox&!1uYzzIJsOiW zq7~LQ{;N|x;a9sW$lI@XECtna@Z2zDC`4BUVoYi+w~6#a-ZjXRhL2`4t1|jf{bT zwumIpf&{HK_W{5%k=4`E?93`Toey$vmJ5^-hpfVqd8@p`&Vx}rFy?U9-mG=_=F%Uk zoxaRx6TO75`qkOiKlOdP+Zh?ZXpU=cu(!WN3qki75lcf5F~kQ#q8S##C=CP%mRX)% zYi;3tia%2T3e|f2KRW}fey!hW=56Mok8wIYrP@OX#wn6S6nU;CG1Lq1C) zv~Rz9vGpSKs`KAvG2qzo_LM}pV5xkKnyTgq$a_k$7+=Ob0u;2vjK}yugSWwOZc}qh z4!+CX&eBT!HOe*KSc9W^RZS-a-Hmjy;^`ql^l%*`5mv@X6_^(WL^L)>xbFGvlZW40 zJ9+jlJy|JgoLCcmMo+j_RtcgICI%tP336mM0tGc9-s!DYGsLpOEd`Bs!~{OZ>i+P=4Ndd+vh zwK{%ujqaogS)FE%226`fu@%p@OH}rrDUN^%>Vp+7x~?H>+tRaL(+0b|UUi^4-EXBq(K~DQ zCPAx)gV_f?mw>{9ik5@U$zys*60Nc1%n_1!=j{f&1iB`NR)2)B2Ph zFz~#rzkBN36Ng_u*^^IZ_;jVv2_Q;X61+)m^`1v}n0m^jiWtsVu4Lj+mR9Uh_&WWN zLX^`#Kl#j0Cl#_zmxG}LI1rXcK$KvL@I>{Dc?|!NF!zArC)+-PhHOj=Xu?*XNl^+( zBh-5ruYR%fQO8cUyJ@DQ@-aAG|HtYl-T1l#tG=?!&{^_7suug!`d+WQR(*5n-xk-? zzw^^hLZTb0MZacRP(jC4XOr#j_@%XOY7dK&LG*{Lagr~*v~`cVx>??|o~Lk&23VMO~Ff@<)F zyCAsZhDno^k!>%W>a8ad=%)Q}9-O7!a1?7t3=fG9L}1|2qG*RTH6oGtMu$C%X%kGh z(=27U&q~{F=@o-%CFaZ;=YczflwmRSmo7LRL;tL!9-r-{A(!KYh6{7n+0tFYD}~ZT z|4MQiu=gsFU=Wd(Y;Yxkk*s0y@48kkRL?^6H}U)wh~cyeAuaeG;Ih9cL6(DgvH2O7L?P7ajBe= zMj@@0*G3sZv!?q`c2}3%u)Ykv>X}yCZ@ky)RA-mtm$g>ZzZfo5&n@?%<(BuUh&M-h z4Ds1STc!yCVImY}Hb%TQu;7^Xn#D+pvv|yBN?pv^(q635oG$GhK3OSj%vc;lT|;BY z2GkP)R$%Ilz>Wz*Tw+aR7H} z*37_;vomRAcD`l??m|$i4e_)};iW>72}?MaBn`D7ppMO2kDIIU!KW4v{}@jmA52eH zj2iL6bD$9}#-u|UERDXc6K#XB(>IR zWt^c5Cs;WR1S=futj!FE)MP#R1TH>*?qIrh>4ZZz{P1FAOj>=zg^X@0a$Xye$c!lg zL2Oo;bQK&dL2m_`MO62hd>@x!A*dJ$jC##YR$OeaI@Lor%x;qEBUl>h#*}-|Sjq zJQmS>x66K-BlHMQL6@$Hm<&a!hA8DcV+cI6R7*sWW?DN4(Z!-!siyebQmePJe(bm# ztIITIejkF}UBWAd(t59n4_*(O)}$tcDa8#(DsNNFQXf`(D;pm~4`QW(az-e339l4N z;0g_!9uUXW2$m9ul3@u5sjPD9;Jv}uTW@T=Gx&J$<<>h}uYO1Le{=A0HF$T(_kU~a z%HV4H;owI4=5POD>v!=@@ePBojveo>+?C@&?VprlNW}Jtq@(kkgmM^5HPI*=j8ljb zDpU-ejpo8S;tjSqi?QvTzX0vA>`otoYu}ZPo1AnE8GfmtZldUJx$gC9eaw4%>KGeV{}Er+IsYo{b?$j5b= z8aTz8L#TCH$7mpJ+t9|bl)$6J5}mg~>Ab(Nabu^eH^!Tb8y~D)Oq?ng_GFJDXjtey zfF*46Ve+$kqxTSFDZ-o^3L@wj!E@5eC)$>ySvA$Y=wRvgt&CS>9&+9J^VH-K8 z3u!X7aZ&HRmnK0|sxX=xgqg+)4X4#X2cLXa$&8^{Wu?W9_m*J|s%NZiIp0}N;jV8s zK>eUKaSzOkby0GM(PHU*+$^#Lv|!D&A_0c3>c+##lrHVU$)N8^)x9iQjx!6!S*bPr5%MoA{r zkdq;&r8Mi!4|Bcp5mCrHZ5p$#VxFW9rAq2pFgy?l-VtIAB7~S29|*;@5J$KT_4N6Z zht~u*{P0p_0;kLx&nR&*gbNsZYIw9M7J|&QPk; zIH!szAVhd8vr1s+5>4P5EcF{=$RC34O(%vN1G`lH2&OJt5@oPv2&7b8koaAL1EyKq za4yCVT!Bt}+gJ-;1L*$c*L%cQ3TLz=*kJ*Rb7DM58(lEMg62+>Easq--FDlrueUC? z);Hd*T@?3QKOjy%ydEf1pvj9}8O&Uw$ zLySG0rGYxlBtier-nI3{ab)Me((qFPM7wpr>_cE`Ez4R_l3~dkATP$L8` zLqAFDcw-28NDu_bZh$000@wy(#EP(p% z07X$lYPxy8(^co3I_LWsA_9n&;S|U92WIb|&A`~DcNQ@{76uNrm}S+!e+--JFsxyAj=ql%PUm*g9h=T0UFvv&Yh+rxQgz-TZ=OjDk!M)NID!UC zkX1}2e;Z*-=A%N_2AZPudly^Hthb`>X3r&Vth*dhG9k-rrHXl($ep=B{m&g zDWs0cERfnH&^dB4n7*&Pbt0Gr4wtx1H&_auKokPwan%-rNrS!Nh!BdbG$<>n|G&TZ z{D1%Qi~srNm#@A4(dsjP*56vX+VPmbB;~3T|CrAsQtTjJQld!^ka*-7Qic=DWB?#M ztLPZNJ-P|aY43{YLy;rujk7qHI-ORUaYixq9;k%?T4PTTk=*4CkF^53_rCwn@4x)* z?eG8nw;#u^?j>d2e@j}scfbEt+tm7P{LY_$|83uOd=h#AkBwNdk3o=HqZsdkb7?A( zJ7C;!ppbW(GFgRsu=P(v*EZIV``Lu2$X^!OuoPHG<3yN&MV50-K^rbudlbr4R!DQh z$G41cI~`PEZy2V6LA5d3m=54Ke_PjsQB%b=si}VRi@K`EV;CQpIhv&ukS$kFm+;U` zOd}H!)ANsMPE3vaS&*bXC0@mTW)wG)8XXr9q_qzLtRa>n9P{W-QJrIDtB;g&Zmjz1 z;nk~kzixapUadDOJAm={N!IcqjH~H}YwhNu*(RfE6940e^<>pG@L{yeD73G$5j|}#cYr?CJqVDQM2-+D^C`j`TaS* z$zwJ>)?G-5e*c8f{m>OJU2Si9dn#P_eyxk=A0G^+_ltjESbwy)LO#vAHXEZR-r_kk za+^QAaAE143rn-_-;4%NgMIpMKfH3`%J~cNZcAbG0uk?>6jD)>U9B?P_$f@x&)8>y-}ava?ku&U;FaGG;N_fMN=djG#^i2f=c};}ff~ zpnIA9u}Cm6IfqY%qUYs5e)+}XL)oO$&6NTd5{-&V%uGxYAxYAyvT-8?U>;Qw(bwM?yvjl7#hF%ekx?vhbj-8H6e-22=54E7NhMVv;j#fBttAX!YtqbK$XiQ zw0}r)^8Q1Tlj$K!d1p03I5u0%0Yg3mgf$`@G~-%Pn?!v8LJZKA!^fNsVyYF5J{etv zKUmv%KGQ)J1pKuR`6d^m8vK z;k54nBBee;FvZjn9ybsWN@@zksGw0WRA&u8KV-08gX*o(&`lc{Py5*5DQJZj8nF~z zYEy~8$C%Gh=@{c8Mh8^b2(-^y0e1d*_mkZ}+x>Ls-tL{9FRGo-cK>wulk|D#Uv}^8 z-hS7AwXon4B8rwpR=T=2~KPYz6_zQm-{lJX!V#ZGy_9Shzh0!pm2 z+FWP2v-Ucy2Z=-LYQ3`cMbphi){0=Y*6u-H$VGOTJxehc4uJvYA$|@R1r}&T+e*R- zWDyp=y8K zYU+CJwby<3^PdzD`?ArjD#StiJp)V)^D1TwKmY;_CV;cXpa6MPI2+T^pwC#(M#j1y z>r&?f9fV=XTjMB_)`PZ$TS9}Cc^%V(>DsvE0r~E35>M*Y#GZmkWxoXrK@})CONhk) z1i2U}T4gOaL@6UhRtB>DcZu@r!L7unwEcC}&f@&X_Pqyp9^88Hvnsvv*YV$9Ke+wk zS+}s3x;@P}S@fi@RFC5E;4k%7tPFSthjokd`jdI-gYV5&4?PDt#Dq1ttki;-qpYtFrNK~V!p)1YFigVI!IR<^VA zd0TS(c=yik&v!nnc5m-|wsU{?)0a^dRV*dQi1pqxQx)xir_^^0k&XuJjbuqD*LjL9 zBS0K>JZqJ>TsJHAxQ=Fx+0(E?c_(RBt8NPXR|whsUW)w&EJlF zst5J^qw!4sbNXEFm2r)Ic$E5wamI(35gVeAQ^2FI1fdBd#^mV}Lh5gx=P>WR<8+3| z-P|;DK$p6mWzu;-#Kf35^`o(*_Qg21i0%bIhmwWtOV9B++*KT%iFt6lcaWoaMXqi5 zVLe=_{7pZc{HPj?;@3l1_my3Z7Vtl)-fq0}){n=druyBjzqy!#ndcx-@WJk0x*3>D zU5+5itftI6Y%vEZn6?Utu)*f>g1iC4dL5cHn(7ZoSDn>!jQrZby!ndJBurtXg#f}hpweh8fM&J1 z#>8$M6T6i64@{5ev1@m8<|{_i#%Gg7>_9qW2sbfBaZZ|utj~HrcmDC=tk%zW@9cc` zGFnIUUgHt%9c5qp$U$UEy#)xigknduW^rS-+9lHXU>Qafy>7-0-$v8i}F1vg6Z9?Y;?_Hq5`jO)8)%lBhl>U_qS82VvA z43s8PU_~ehtGQu&tRf4!8y7Lq(zHx08mN0Fe2mN2uRT9L#&@sIz4-|sV^r2@WeF(2 z8VsUZvS6)GEu|u_9WeE(uS}u(?(bV7C^L0%fE;_i;S-<3y^6=;rvF8TEJfH+2%HHb zVh*Ml(VhqD4ae37me;4@o6VMOd%gOj&GANcd6bkNKHRjc)$d*QevmkOf4`^BIBx4; zzF7-BKqF?o^^_|UC}oD&xCB$2Mizt3Dy%@W?)PM9ANO4JyZ-6i^^Z6Kn+3Ym?Jxu+ zbx7pQ#u^nQ0?kw)${Cfl@La4-ytBBD_<16R9?#qpf`b+;1~t&&spUyKkV))?2!spJ z6nUF97P}TBN>}?y{oUQQg$?IDs7Hk62Q63%D&Y}6tzAGwN@R&aE`h`$;yQb&fe&7L zeZ8+n9&gy`a61-bOo>B8aTKr$&Qlft?FlzQ5ka$Nm!WQ8W{_afik|95d6Q0wwMm?# z&%J#-YtkuIyhQwXp$>4&DW@mqFZKi;;g?7Y>6~TGa+$a+xC{#Cof}_l64&T7UN?!L zFHiqu?+mnCO}>BJ7bFiIhAc%{Ckl5P0u|1Cfwl1j35Kmlgrle6_e@7!yC3g-wsSB3 z`6j;nQVt}0FFKOp^AMm){mHsiW6+qHcz-dO;g$(51!aoZto`GSdLsf^ulwO-RQam$ zEAje1I{sh))y3&%%()(F4K9{;>z$ypwdlCkE%gVlts&Gis+Dp!c!8)14lwZ{PZIQe zv`@YDOSzU~UyeymHKFJ_#~SSpBS;4P0Hhb?zF#Hdtf6+Ji8v|By-^~WdH`k}@n zwz+wjOTA8Vq%Fgg2&0n3l}8|$VKzn>EKloduyy|?*!eB&^ts)McaIaW-R^_B)b$h& zLVL~)a4Z7V%(l(H3QG~Pj_!8;HHP`0?0g=B{Lgnk-M#Ztn8i?%R>$gW1meeN4_$;! zsmH{XDsYHlnwCNf&H)=K06U5Z$!ZS2TsO6e7d_Qu|8xHLkYo4IdCarwe{)C|`dvDy zG>j*@vtX=XX~km9BY|~{&a#?X$CG%yL>m2gy1ULUG!ETfycikp zFvQhdP_G1v!KlYvL0sdR*ID7f7zU&D`*h z>I8VFq+@v^y6YxM`VO|f-TLaLAGo^u$<{Y3TldEUxViP^^njA?45b00Y2?3iXlLd* zCMkp?U59qB7UN*)Ib0SprT)XcFoqzfwD1m5L>XZs`i=qRvX+DGf7t%jgWKEx{ov#6 zdx->p`CLLPP-utZL{qng>Lzg&NkLvKiXGV_i81rT`#w$kBX%Vai=+M;Bn zj{`buH-}lV6ki=QmNLXO#sm!kJV(@W=Z%m&iv(*%RP@pW27806e%!#OR@*4=o4tuLqJ14W?uo&a?Y(KB;6lDGPH8L}MZpsf#x3F(=1*b?rk!-5!+CxSj1 ztvs4J8~0;-Pw~_qFkmU9o-?5|N|BQa#3SXf1kDJ?!DXp{x%lZitU?3T$lBV)MFj>6 zyIXs3kI1w;Oj!zZ(B5KjR&o=7JM9?aF&*Mcd&r86FN{Bg)DG80%h6H|AEoN~q88-# zPVjS`cgZh@%~`J)%M>edW~KGsYhj5Of-$B5kjm){lU}^M#FB- zm9v%W;mQ;XJl!chr>HsKBBq-v7Kr*Xl(dJ;SOhR9#I5xJk#w$gV;()dG zJn6f~Y*v7_X-?isB7GKh+M6&~YpY?yu^$W%D6*YlK=VT51@JZ#o{rD!V78N)2*s#+KZ@$nQ8l=^@6uBA7wBRl_i5C@QD)7DP85^ zLVljM1cnF8SCi7K#nOTenTZ-%P(DV<1TeuYVI-E#fV{Q)(K`^jyB|Ht%U_{K)81LjU^uPwZuAe1;DzFIh=K@cf`U|tEzGn}A}%W0y5qMgfM z!uEDE==3%^mxnvU+&&M}caIn}ghwN1d@8^-Pg_^R+jwufLuA{N*dZnt|W=8EXMlF`#o0 z!7-rTGS8x8Jfyb~Na10L(Cg~ z^E|n$3=`zgZGuxex;Z7hS|~wql;HD8bmxf|Ml0*k_!J7MqB-2rzmGm0{nzNL(btdO z9X)vT-sqc0A9O}vjvkD@=!`xbeUbk1O=t8k>BqzL%b!NyoV)P!bDmY*{nZ=m>#w)< zv4vu+li^mYZXqa{%suhcD<_SX#N~U!(NHBqiMs9n=hj`wM^a#WW7u>Ne%gT!Eg#>a zE96H@vJzyZI(Qu-%Pt~iQPfkVRIoByMvA6fF82D^KqvG%H;3EvZv+Z+o|u`(zh1^y zyWHI$7GW)_LRn3@B3vjXPzlRulu7{QQWmvf#K$HxD}j9;nhNELQKAt04D?)@r(r| zn6l%LPi`+#yn@cPd>?4y1#MeXFRV2+3zS+-u~LX=kt63S2nWe6hXB!ocA+SFy9nK# zUiW-w_YZ^4de(C{?B6>-xS!N{2gl4$!%3f23no`p*NB=!lQg|LF=Q$QC&Zq}mg7|Bu7S-x@B#LTq zF)~A)NO`ahS`(E*F-eQ+X%kmf(nGceYtfOzDe+aJ842S?a%v&iK#Y?-GA6X7+*43X zbff&uH}+>D&cKcGNTgBBIBvAGloMu+QOaiqg2?3xH*v46|LVCAgWkGwV@6kR{B5;R zFfF}{PA3!$O`be5>4_Df47Ww&ZjU|~eV0t|!*T6-mP3D@J%ZLr9^)jBM5k77q|yN+ z1QQ8x?`4YZl_M!HO%A1KSN*NKct1s^{iiAN-wZc;nbfk`Jlt1o=|)d!#_m{Ds`Unl z@rXJyAx%&zOJrVZbk1;7w0QXn^c{pe?0dLrG_lsDQtE#S_a0X*zM7I=EtZN3BN0Jy z6AhO}2=56OnxVHvErmNUOrP1bEx?nt01t?-7EaB8a|oVCQJrH6P5-Pls#_OWxm5aSQcY57l zBW&;7?p*5K8Q;*GPgbE#j-2Mk*JtjXJz9*l2!r$~eKM$R^0A<8UOP+iu#wi;qBQF1 zC5ed$YW4bdZM1hhzs5Au)ryBe9gQ@_?^b&P$}s`PIkd_a1$%FW{_uxyF(3Wy|L`r` z#m?Ft%rwHYhJxFOZ*I~(SCq9#I}=d~o?M6aT!PnLKqksDftn&Gay5N?`rP>&ZaLvj z0zK`WjHOSwCxusyB*^3<9E(h&G0sN}QFzS9`e+ef|5|rr_u+PXKJ;a97W3&Vr;)Bz zJfvFclukfEi83= zbJ&O7kD)g)MZA))_e6n%jF-C4NcW&H2cAT^R_7!{@B*0?DoSHxV9aY^5kYyj!UF(? zspowe^!hKJZW&C>0*t@778RvDu)HB6xp9(eo7a8(H@4EBa~HZT8&u97irDwh$S?gl%1LD5(}K(-j`i9jy4c$EFh9#A{xuAHBN(#P8YR@ zez5`F0Nu_G4B+lh`wp?011Vb?e)^?(pJ$7(7FkP0Cet(~y`0`_D`5NhC$F?c&Q^Q%VLq`+}|%+AMEsg_~3|DzGXOL=x(ON6S-?o9t`ZX^7j!p-oZ6&XM z&)@IDs%Kuyo$Z$vRu;soR=-#Z)g56n3N3_iE+6jBOjs&;@*?YT6NaII^rYjX3fpe! ztp3tRUxy@Eizzoo`xJ!-7hi;`-JetakNpetCZa=4zD- zh)!#tw9GN*B1#m*Qz0XiCH-5&yRf-4$jhTG8`Q$25Yy7D1yd0Wg3y$_5iTP}?jYyR zoN-=u(L1{-pNj&&kGrGmPUvdSmfB3T{VtcaF;j#v}ZbSr9qo$qs9QVsPK0U0&MJlH1N=$ z&-SHAW)RH^KnT})bT_|H{_~pI9JDrQY-d0;$Sc=lZ z0X%B;!>JIxLu!;%kW>Vdi)Vx}CXz8FMmw=0TUkNA5#p5Tdg$+Rxh@1gO9Ydbd zFq9=238WORsM9uP|LJv_{+Rs7^_yNNj}@=>C7YJ?>9{80T-YnMl2NLybHZ8+f<+Mm z8ttjGToGC{KeUr_<*N<)+dJ4D>|oPv=LA>2=rO;1H5>72MHCDP7^)#Bt6mu$zgjb8C@CrSWAfii7FNLr+`8*M1q=m;{lf_FR^{SI# z?kgRqk_DIbZ6`3U)i-H9Md9)qMf#~F@e;J~5xw?BmgC0L8r+-dsq*$`x7~p{ zNf&-vg0;9Bi4?pW=mU>h~dKH`rTBP97a$~J@T${o%ou<2U{#wE?$FWDV)H0G%)0~~Q#|{pSQ5=w9 zEv8NqE&~Vz&%mX3%5ounv_4Q@RR2s`c7HQDqjr?yC2%40bI}7(*Q%a3ItB$`fg-ok zI_{$&LF+soUses-ybImcreSaO?)U}1Nt`Q{juRUlmtZsxk`pRi3SXiD%Pn<9O84W( zzxnaAfBVa)e}5XS`bjcJljlF^JbuOr_j&w3ekNLXWBt~Z8!w#6ai;rRa9U&<)>TS}FG_0`Ym> z2ZD=b9FDK{hxhYA?w6%V^r%JmsmVEnDMkl08JP#d*LRsg`;C@kj&xe=mhq-%fM|Mroj zPiKuMVS($7lhUijGFZ@#B_ItD3sUgti58J)6MYfO^0=VB`%&B0+=udw8&_Vva((S; z!4;(m;Z-9EPBRdm)iXbA_%Eh38$EcKaI(fg6*KqH{$G_cs@c7-mPxiig{Qll2kKa9aVYu~- zlkJOtcjL;{t5+_z!|@As7>>ZEQfCAq)=P;TRG`s&rj?{Fd1WVQ*=UsOZ8vwD_DJ?g z`-2DNR}H90)|xRDy$&7_Ez?XWK}>`)lI^YD_VA8tHV0cd_-;q5Uux|;1a__ZQIBII zg4T1TwbWF5LycFIt1^yv=yuiu48DJG?!wL-HrKP|BNkcIn37*Dp4{>nB4<)j;?i$a zip&L~2?benZE!enxYgcIIpO;`ExlSW4bxF*Vz>nlR7J_0GctL4jIwCh==EM7H({_( z8Zqw*1GU2B!s=O>CMcW|LOII>0eDO+P12SqSodK4&0&V0$2UHQ0lcR*GvKn#&;oODhn0;V#X2#kVs2~3FB2H_1Y5wf1#EuAV93RYM7mXl=N{U@5R*f79oYmNAu{>t% zb6R?pU`pa0btt4lB>{+wDWw+@HBrhIUA4W~OET|-|9$uOYj@M9_e%UGdG3>Nt7dIy zO0gDO>Mddj`M5<2eXM079uu z+OVjUQ=YQCvMxf=ZqMF_d!O!o^7#F|&-cF0J)^x(&Ryv5&uh26yccW;j=-l@Z#Ys# zb-rH_Yzn9;4br7#Tv|g}k=|VHL)SOCLUpOZ?%gJA{_w~2T*Gc>t($P&+G)1Z|9cDX zYz`-ie{Ht@%vGtBI%845YBfwKZv%i(2tdRC})ED$mkgTf2BVTe_B|dN6@ZC-f?InyTjwE`@*Y5(h13RGUeU} zhJc8|SkEbq;CNA^W_+aqacVhmMeN=ZWM0$Ks|FK-Wg38MsX1d-Py@>GWc|Pvt?xc* z75Plso}PcF$@J{~w$yc!4edihtVP$WfHAKfDbK)KZoEnXSP+&JZc`5K^~YN={dULb z1c}$Q^lHHj1QoC-B4a6_aT?GwtEKc3vFO(M=r^N>qyHH_=#2hx^x32LMh{Mnh~uoj z{pAjNHa3+iqlj}_I-*Qq(MIP|itZf|On57c60S?bW~W`^e+dlL{Fq__=313wRypmW z(9))W&>?ebOrW3Mx3blln?I3RB%6_sf*c;pI;-n5Ws$@o>DA)Ng$jWn4%b|u6 zm*NT(DN)q&jr`p2D(|$uRdjX{vr8xoQkkNJ{24MuIue=(KGj!kWzQRfOSO z_wXQ-9khiPs@ciIlpdHarZP7^R+6LtoXHq%~ zlou6r@?GA&pZ34#-{}AEy(|5%`Zo?8@fV)f&Fj=RZ&NYa0-kEMk<2?oxYI@(Vu;hu zpu>)eu~4-6;8Ld>r!m*#$6OobR|_a**4SvIix^6{ahj#Gjzc%Z+3YzUKE|x7zqO=qmB}U@3})qQg;jhu|Q70{P~{uFdMNsXUOSJ)Q?iF1`epia~=!_Wn)YUNK#G)t71|5 zJWK>U*N)A)0^7c}B<&#e|fRr?{va#Ev&0xgK zZR*k;Dh3)m*fv!{ZFzr|GZU3f#vatYst)Y1z_$*CTAk1`7zN2m&y~hpM0n*TCYRht zUbH#4-MQSEcMA~lyUq{uX6;M6G}!@hY4_d;OltMS1Zsq_L@-IgDG53x>H?EI-M>yK zuRYwa8$I=U;ON@J?A}v2ZCQDkt*<+HExBgIVfbl<1s=K4N-_~6kwsIqi&>4D%f0!` z1s10BHakrqH_ERPP(#p8+n8wPHI2!5L41@k5XOTpN+9PQp2aE6`u^9u@igm0FxRRa zvrcl%UbVmoAt?wP-vn9_Ct}f%SO25_m-nvpzqxm{|9SuG{*C@u{p+p%hxmuj@gLsm z-?;bwbc|$Da*tB5YPCv*z=O}rsRDig&x9nXS)Oufi<07*?uyU5aG*UkWY4f68-lr3 z;@LB^ufKe5_Jz5>9Rc9r8EXNQMi3sP;VED^8)*pA3eJOakq)jq zI^7G;pN2&b-QLA!X}nD2NY?253X6kRcr5VlKkA92=l*Kw_3*cAH*elY>v3MSyVU98 zBOdmh_{NXU&K^5H{OaA#!sDQq|J#pF&z?Ryi_cmMjD_eqrn{b7F7y6XL?l`;f`cRb z*w|@Gp0pb}^Xlml$7S%1Yf%9jRHVkMghz(CyaFvx41+c*6j6NOyXMUXmYZ*{&AZ;A zBMVd3ww;!gMu@N$)`Wq$j#ilHF_!S&un+;0L8GN8O6E7VM9wUDv`;Y9s5#A?Q9%+>V{v`%d1m%UJUR)`BNl!l;l-CrFeM z5@rMqNttsgj@8@Hbj4#EtvA;l1^qC~IvQFYhZWIkX>N zMA!E-7ROB)3WoJrij4G58|6wNd5m!zu*HndVd$8IbSZ|6=Xd&(?l>>(G%m zFYa<>?8TWgn@;)E!EC1;>k+9{5N<4hNsfavm_5_L7;1^PE^$}HdGNAZTK&qk&aB?N zXzi79`Q2c zUoGugeKDGgy!QlzizGT?k_uca?=`TZ+6$(ct6vSiab_s`akJ>1Um3ZL@{uN(K}~IX zm%f4JW-B>XW1P5D%mae!l(IS+uC!v&WAB?)r~f?203TE>!^`0cHS9f8xH%EvI$ncJD;yz|K-}-*T1{+%e9}s^Ot}5 z+1iIUr)7l+u>L#2s#dX#_KIjrZAiwVA7EZ4!Z^_`LJ|AG!<}-iPHG*$)c6jDCqpbJ zqa4Bg{VUVC>dh3Io26KbuQNVxKMqPnYoZqScO-#QB*A_ji9B&)BKl`WG|uEFt3@q3 zO#X<^wA%_8FmI%FL`BGhVMT01?F-F9b7`deUZ3XMk-G|>#gkYblC6_oEtU|0Vo=7V zQ`{o5L36;YE8iZL1*ul6sFzmCtv^WVfA-tr^fj0 z2Rt?-8hV~Z({T3O+=;m}GpDvU4@0u6#S!x|^w%_5pS1G=t$jrMZkWVi*X-lLZLT+s zmrmT^_TU+70Tj|{3xVeyqL$;C^qyIaloJ=UXr1V(W_k5mZZjHp*P4wtKQJrE%HyqJ z;ngCkG$j~u!*N>fjb;K#mk5>zwF$Tjb z&3VfG=3X)eA=x}Fplwms^T(@y{HH(s*B?GPbi_TP_1~Q;*37w?qhrZ=IXyg>Kt32} zyDR`-hexe;Sd$`^!h;}$f;Sj_3t?pN#+#xN=t;NKdJVb}4jt)@X<64YFZ>|~BwQ*t z((A=njb>69?-C4=oJ|;`LJYyl6udy&T{J3st^Z~J=HdRY@4cIeo?HDJt^ThD{Lf$Z zzwY1a-<)!EPm=bO!BwkO&T0(aA{dOtjUk$8;k?%gy$CIuD1X^4tbW{EZrbh#qZSYz zRGc4~`yUQoIsdA9!M~Y%<;CN3=Z~G5nL9muZmi~PgrrtSJoiCZ=arO1Vd5>hB9<#} z3`n()E8@pb?tMl4h2yVtMMs2(`Qd7T3y`?ujvAdJGg9an5XwlYleQ>FJJwl%u-sg3 z@R1=`c$N@Lw+QWJw{ZJvCbsA-FT+k^iAc5oKMiigEc04l!*8UKUl*Q<*~q!>}qjLU@W7VLxvjS3Fjg)XO!WYa-@ht z#$D_})9%eTL%ZOnoi4@fVe7?L2`3Qnj8aWZj7C~dDRCi>wyMBwQ6uaz=Q|Ixl(D1% z(GMoZ*jzI3y!Ih+Ds^JqW*UGfqtlUd;)*UbFEk$21`pNLc0Qi%+$6wS zNQIUWQyDhMZiEYgWL23eB8-Az!mb5CwYfe z@)20n>IbI&nntHEAt6%mKryV1UMlVJGerr?8?L?Ry3_5(lR(=(3`VVHq!g`UJaW_s z8%PW>C$LI#D@~bZH1pj~`}V)SIiNgz0nqZf<=elxeEUid1CNE?a?=~nAZgU$!L8fD zaP?(zTd7bh(N8pzXeecgP?cEBi`=B*(iuaYFG1feLbtj79)6Wu>`a4!#|;Ly5MwR8 zT!L28XrVk2L1O|&1$SBsqeM}+%xjlmx$PEF2lKSVeE0U1%vf;y${2Rop-~pC26r%p zp@PU?{N%}jpQ%ux5T9y2ih{}HT@XPAjUTL4(Q!kV-q#&9&n;ctlTCsbt4q#FTF=o# zOW=|i;S$j-C<@Z?7>fEE=Ab*}D18PT%Xp5`M<`b-oMS1Opk%aMF^?XFGb2PIlJlZT zwm)6H@~5l+dFaR`_edJM(zJVW=9QU~c;co_yE`r?4PjEP9~ekRAA%M-QX?}hwgJYZ zWHuC4llmX^uiv|J@89mdf9QyZUDlC;#%?>9?_f`S9n5~ykqx-i>WT7-Mxk946e#mf zQA@!o%LPkCDaQ)~?wwI-#=4auG`~%;+;Fk;NOrY2YC)27L}%cF6U>=pbe`$LoKh5> z_h0v~_rLCciMsXE!RD#!KbTH*Y^N-XgZTBqOrRL-uiE{YzzLZP*h)caHP-~=Mbajq z%TiG!g~_l5r5MOEp7rCDET`ylfI=HOiRgBtt`{aTZE&gMK7> z%_8Hm$ba;IKG?H)>)u=a>wA;yOpU=7A;(5!YIP;h#8F#7N}b6M95I|Yk~^WeEULga z3x`iN9=e&UY;nr`z2|qY8}O*rkEDSsn&~)|W5!AEM3huW>QveCurO$iywJGzsCk&l zmiYwKM>mMC8cq|H_7S5wrELsKYY!=skauJk6-obm^TV}UAAI-8FV^1veC-$S?ge4* z!J3>Z3n#XKrA}QaMu(b2E-54-H3o`_G3B*ECjqLc7Iw_NvFO^Zx!!}8_i?Peiftv$ zXA#$Ombeizti=_NyB1Vg#hJ32FrAkpYn`;Qtf(FD&gXaEy8CYH?myo7pVpm!zw_I> zSMPk&y7Q~MZ{7Lk?%Q|1xbqo4=E5#pg%jsyXHV`kuRQ@CqztNRjS4mj5nYtpC-BB6 zBN(wM{6Blw(i_*2o&QQhn*ae6*ZVPxK(tKD8k@354;$l+aOy?1*}N@uvzd`rRx}wT zgCxi#K@tZ^U?Ev#79QJU8{?Pk1?_FC^%n*Zke`vNOG$2$m(6OHNHxuCm?lM1ecR_d zRp}-hk96&^aGJ^*V3&E5GNmm}=ZmD3wCm9?zp|+-QcQR7*4pKn?L;Yr`#- z$}@|tvNqb7EGFU==)qrfXSe2yx={zUb+SG4XHR8UjHAK=L5vxl49*EmHHjzQX~nR~ zI_zb|q zt@E39-vfWzvVMnI`nN-l#TZ*9G!{x@z*16)y(Qc$EgW)L)_DA@@h9Uiq96H}o$)_L zKl9G`^YORiuj0qo%Dh;=cPfvs=C!`X9Y$sEyr_vRu@kPr1ffvndkTv2c)I6d z-=mMA+Qy2E#)^EXO0^1OX&^+mgi$S-x0(tkAf%~;kT*KlJNs&y*d0|!b`G8|-txWvU^EiV}vR&wPhZ|2u zY3;0nS=#%g&XQS+gnm#9tZJ|0$deL38b@Ldd`fkR8f-i`B&|@!S>YMACWvTrOqgrW z+k#CxUzxRB>iBjCFoYTgqOTOMmcsE=MdUzQ9}ux=ZIF}FDaAy*hO;j9m95|YqHFtm zR&y=_rVD?gPYbUQNkZaf?mz@&2#!~}RURcr&=DkQmOp5!H){Th(b_Zi z7TQ_6Lv`I0Ay}$^9wX;8MV=Bbkr0Sz#lbKKBxGfkZ+DgwU*Grl*19)3>rlP({k{0b z?NJrKj9>IO`fL5oJ>~57syXa5O*XiX;}Akrj3;w z`|{A7tQOnjrWVU#rIE%e$^g-bKbX8R-|=TLWcr&2ck7_( z%kj7458Kf8Ipjm0ym&P_WZ^*vwcWVnaxC z%Uo8@<){6D`|eJa_=l&Q=C(fi-0Gvd0V&lGh9QlgBPJkF<~=CDLV?Ew&s*t8bxw5_ zANNF1bEV__&yR%C_3Fi^)?})3ksekIM6?))SPl}T(>BILglc1{@eZabSa;}9u}*W2mC?*oMF}?A08_yVNGsE`bb58vtvsAH-Qf^M?S{icS6KFw zV=2HATM1xdfU1ZEN*oRG+QNx*L}qadZbCJJjp15K=C`%B zfCN~Jh?h3Hj+x8%MuX8w59p>M50x(GnPt6GX(oPvxm4pciV+DGNJP63yyeoR_Bcj_ zH#RFeSsD#D2BY=O@9x;{J2ThC=$f<}k*pdm)AcmQk#CJ!m>TWUYgd;qUs_7nSxKq3 z0gh4?0q?Y=D0NXIXDC>gnkX#=6Ks}^8H^J1(prD2WO5?!rPdlA;N|Q9x>W6qV@`Sl zk}DAm(OxPMT^#SVu~}ujw{8t@-s)U|UO(zuJPJ4W)a$0QCaNaAS%5;$;$%%4QvT#7{il#^U~YMEh+mCz=OnL~ zdMRxg9j_D5zhON<)3f;ea{a&E`FTv+y3y(xiDk(Qd^B^zV@1g zSc+`4unuvIl@Ng&i{phSrKSqF%Co!6Nthk?C(H4bqu^%KhiO`e+->D>3e_e7mZAy{ zGX`EzLqr6UAgzP70X&fHdDi?}G;QD&XUSq1v@1V9f7G|=(ra(LvUHs`%^0SKmm*^& zr9^7!SYow`S6wuB(mSJ_HFNe%V3NpX@R75Lheq1ubh8nd1a|7MtQ9m zJdQAUV!T(&6ii#=I&}7DxBN;06$l{`@#NSeOhY`HCLT(R zBhY#5AWPLocXb4vZs$c9n2|dm2c&R1vMrs%-VIt!Vk|{h^0crX!0WVE3pFrw`P~@im_A?K#mj`7d#F^SgVjX6olb(#)S(Nq9ehM z#G|=(>B>vjSD0?Fg!Lm!@zB;72}BXAv?Lm7uU!1cAeT9jJ^7ExHb3`jjd#iu2M%=LBw$cPB4XT}(bGcRH5cAka34Lr!BX%-45mEy@rIHX zQ3jR-%7Xw$mCKs--56EfVb@npIjYt{KY;jShwuua6hu+P4Z|_KiUuD-bk?1So;v3& zZ$J2BUZ*watUzxgI+bR|QWD8hzbHQPc94^Fy*3H36xHa-S?7d7)DRh*A=*-}0)oIZ z_ZDn@nRvWr(=4^!zxyCMCA?B3wN;cdL5N|NIt|2-AgnUcC&yW=%;$UEn>YPnqhHMq zn@^YLlMm)D`IX`cjtl3s!_IoZ5RE3ovhK|yENcYyjefreoy%}z6E?xXpxa$LbI$M2 zsG`$|FwX4O+pgxd+{xMd!S(^8R7<=tO1jjjhp3AtT1J!XO;j4KQI>w^PU zk}H|!-pMTGIF)C9hxCfEwAMruY!If_3S@;K0D>AtZOFR8$N!pUkH=q+KN#O1f0pQW z->0z2 z{$TYdD?Tw|3~zLA?(!<*i#$DF`>v@@udwb9NzC!&tzKTf_UBWt7eAot-rml!9p+UB zH~WM57SEc#yY<5IwUsNFOuzo1-#d(=q`&sU%JRyKiNmH88m=Q4iUA-WZ@;udm?|2m zMpCe>I;nwbwO6Z(p9=Nb?%Zd7Ddcj2>;|M%Lj;eeP`CGR0nhyey8LSZXu9Xv*JokeMp8U(Id;P4 z$Jp(>JlYslGuug{Z0mhmcoEuZw%^Gyt)HHS@*Hw4)PZ<*4Mo8!jKpGx_%6-O0x_|7%V1`rq-5rnmd)v-O7QyrkH{zx+&8ao_GTdCo!7!B7=yRP=bf1c_Y$Zgp@Bj8sG+ zh86NzrP7tC^tW%ptbG*`UzzTemQQcbe#$6JoR-Orxy7`ViiMB8S?X#$|>;|G#GYI7=Ohxf%BP+aA9yuSw z94@5JV)wjQ4M#oS^PM-lgVk>3x3}q7sC>&Hewbr_fILg_PD|_@CW86kuwn6Q1js2$ zJ%_9?_Vx9xdsVk{<@Ttzkv6t&-CJ#A*?H~venKopml@}kVANpg1jZhO1Y|G-l{Wx$ zt%}d{9oOxw+=6Ny24~K7_i4wjm&w*EM;Z6M>P>R(ghl5k&`q?ATlxZS<5lvLOVlc9*LXp4_3R$nR`0_b|S0#t;u=e?b(cT(?A!h9dJTu z;Eo3)I8&ZbYOJ7MaN@n4$7_EQ*5Jk9A%DvcqsXexQb<|o8A+DM@A}#AZ*SnKyRiIv z%?Y*K;OXyv!==CqkvhMe_96`#`snZrZ8+1>P2^cs&cBlzr_wA;$*vSf z2}7IRQIFlMs`iEfNGpz_H(Z4JYZ+A!=yx>WIiMo$D`Z?y~5hhVgz zL~-c}Gg-S3*5SK9c-ODG{`-5Qrk3Cq&;x?Yy%H=1)da~t5-p=m4}xee zYz%HSxA7(+mPPT06I_J5aN&4raHJtJPtPvJMH@*47cp#$PBkE_0Tb)El3IH?A1*@H zZ3)NSc)ZU#oR=>?zv5{9@KR(zQff8TY2uM^B1wqPb^ia^ySCoAuIv0)26`z_l*qnc z`cR0nWk(Uo2%_SoeksjJXO7ml&bsZjzD1DaBFpW5{bc`({XgyhZvXfD z&yHBwTE@TDt55Ul@6B}uGxVrbzfDZnk&m8%YZ2cD<3tcxjyi1E5_^OXPI-g{Bl-W} zHMk9II}yL0#Ed$)cx1;5t!;)SY*>n)-f1_8ANC-V}@bVgQ<7{~VKDA&!=aG?NaTNoTwjJXO#X!-A(#lB~hue>(i= z;L}9blLk*OgGi~ZlFyhEK8Z}Ru6X4<_YwshGy`KiBTOTTfP}1Lk6Zmg^Zer)IvWrC z4m|&O`}C5X$$8SVj>X4Jg&qx`e(Pnig_$r~UAuSl?#61$wn_$#WOCGJHB%4uBDS`(|{<|4o!lJ3gIka zj9ZYz5DJ_dBN)l5mj9XEsk52NzR3qAoCL~yltM`@~jNVFW!Rrp{hH6Pe^P#>fP%x!AtkYuLSYWXVvJ&V$O9Ew-76!O zn+iHReh@#gi8l-Nc+= z6YQ_PiHLu3_{)Q5hd)i+IfuXOOtOw1QR-X{weZzSWisiG&IwwvmT5~tVc`+c4uci| z2CEdvqP$koS8FhDSG~%_j~|-~Sw4d|IrbmZEIEG(-<4C)8F-iKp)+1+BoOmR0mT*> z?3hGe29g^j4-<>TvdnWYR`Fz9c%?{s(S#GSYLQxVJ_in^iaI@4}$j?mc?( zbkKyOxmSB?8RB9`4+}9nJWYy);5rl)H!$ic!9>O{dr)$S zCLYuyy6|Z`Bd+#?Iw`(VG&xe5avw7umsnb@L|Q8)h)fwz))XkzkD*R$l1@LNV-<;1 zj%Zg%oE`)nmtHBBg2haMfU*orPCc@SDH8GZ)Vr($$a_9sa__TVHQebm{g}<{LgyPI z>S^Q+SJkOzZ{1U`kn#93;*f82zyFJJ9d%KL3}&_OR23F7(^6 zk_(_aOOB-gD-pEPfwLIXQ=@U}2&C3A&oE@wxT_x6Ex+Vd&{hM_Zbh8{x>W4|tPK<) zZFr1OvG5A0h9DILp2cT#yQ-@PX`NrU)w)Zsk&lB>su>1jkrqTz<)XvU!C|YMM$*_I z^%A!xZ`@hCyrGEEhZiHGHRzxn^*D7uT10ICVd5J?vPuJMdtYw%{f-&-?zdIEi{z6h z1z3ux#YAdtE#iSthH*5Pj%eAdNvYNu#|X9+FMQL0YCVsbk{9vy%?<_nscFtAn=kaNf$p961(a>+I4fww^Y=F*}ZDYd6eXvv@B(NkpNbIG@Oo^;Iz}G+7|I_{#U;pfAJhqKO7s-{)z@}7Z zfD03d(FCjLz!=epOKrg#t94cv=fNijpC10?@ZA~k|o}?4MakOvl(}Uj~{`}f? z<6pB1wcTbsB^Op(Vyv^#A{k6U@~orscYWP4O}E;GUi6;+I5gjm z-~YhZ{_)UvW0+pId&JI_?&OQLR0EvlK)Jz$fC9suP{Epg1p6;YU6@qDkkU5Xvs8ZS)KoBgLm4|ld?1i zOKVvc-U2K@LVg13Qq>FANrxzkv9rPi3#pXUE)kCLJVMFMD&AXX%{TS)e{FN}h44S8 zAt}_7fJ_R24Y9y53T8wUNO3wYl77^z-}LVP^}63NzSrNX9-asn;zf@A37KWZ(-n3` zSGW)YN4L86gJZgvbiMe3x_W$c;(C#*_8vC9c#A8hagV-p^9Spjdi?Uerh5@Y(?9#p z`pxwlH}C#UF){?D1$fHFKvhakt&fQ?BTCDFAd9HvLwMj_A{*|!+w7zzMSlL07pc-_ z%$A^Yq8V$t3`?;UBoJvJ#&_N;N;pGUN@bX!l4l*q9#27URQIFTfHUUERpJ+Fk)1k6 zJ}$vhTqVI2QHl)$CKX4*L>C+o#z=U2e&#Rz<~gCJx3v7|hnr_mf2kERWw!3M_P=bb z9@o^y8eT@XR*ak0200Jf1dJRqo&r(Gn?Nbg8d+Pd2i5&y#J6(;Vm|23;Kx^ZWNP0u ziR(f?kkdt2iYy2pzzgF=NS)1=#-}o!iy{s_Yp>Sk<7Q{?X}5y3_{0XqXdw51d}D^=_HIVJW=Q99*Y4ql+YMA$DrAA z=8YkagETT|2wBy&%>lrmvku)s^fqo1vhiX#8;!8$5xS)jNxee8b>IHh5Otjdp;#-N zkJ{x!;0{@ERuUzcQd$Hpvy!X$$Ia*v%5M2nYO(OnasdWNP6@CSQXeR%TnXVh)0jzV zqSM7Oh1NP`LF%BhnbxLsR#TDHj);98wgt^gkJx75QmQY(#7N9L%q0!L6t+SN8Ncuj zi7YCdQ7zuK%kF1A|MLkeCZ$&fX7phKwDN&z#kkfgIN=RdfRp3TIu-p8s-8cUkWccV z#W)+wJpYbT{6xR?UD#Rv{V142Q}`Gb$G^W4f2k%A!jUFMg5d&5?x+zg5YC*@dF{=s zy{Nx~s*bl4+Nq>-_h(ItuNX}Q9C2b5lAtg(2(kEZN$(i)kb~w%({n59G0uS6r+aD} zuFenX6d9J{N_lj$)GDU}M<}phl;px=<7pn-b`RX+%G)U<`{OoyL@Pw*)yH3Z6RX5vB&p(KNb=g@A z+j#SgcykKer7EZ-wHgT!CWfAfV#8SsGNfWQhM`%lc!QODz85ds^d3~5#4Y>$=hcfZ ztIh!Gm5nC!t9lE1onidCyRup*Yc(3~+nKjknUBtKugIR5d?!{Q>ry=dEjSA_#xjm+ z2b62iBnzBkc|^Lpq$CFKuid#k5`)o)7b620r|k_Itdz!C!DUPw6ai%NHal+a{YTUJ zpt3RK^&Q`NKdKeDs!pSt59d6jQm5@7WL`3PB_GoH;w(km0&waKxL^=Ck|xc-Yb>;O zGH(}pWl|eRDnR*u8!aq#v@pLqJ&AOw;yI~3_S9RaJjTiz(3EPc4FjJwOA?^F-G$nv zDgU;Hf1vW+5_2a2h*ikTi&CP9W>FVJ9_lw`g7n&2iZk0*O&{{aRSf zT?_^grRi7YIRuVPRuI45bX~Ix^CxLE9<{%<4*%40`&Ys%MG^}}xX3)bxt)$5o4=g4 zi04(uMoOf}{F?t8LhVh|@F!9GtI^fdkD`nI@YcQWzI$u)owe0l>#5^?jxLNtQmP9? z(D(#fDgf(X6T_g65xpVAdYz>o>tLbweINaQ-9~y#?MptKZ-K^vE>%0msnv`s&1DP( z1PDYG@PH8_dGl0I-yc@pE_9))eSPhEsAl#X$z&1cvaFAtN6OKXxJ&FeS~gudXKi~5 zZpFIf36G(P!k`?GKnMlvumsOA&k9V|ps`!imP)ra;S74^SCT6QkrN$p45L;v5urnl z2+cGCp=s9n<>RKa`LKE5>%C`os{=hSG4f4s{Z7@}dpc-#+YI6Y2xp456#fV_A;AK& zk|NIoL)u#hI3|rc%OBkE-KIC}KkjTkZgwB|LHgZR(5)gyv&Rdj9fYRzV_xg=D`$bz z7})$%)3!Nvf@}YrAQfvBMpDIl(;`S30*W~+;P}=XPqS(dd;hte)&=$AJw~@x`<6Q3 ztuT4>sRL$$UaF492*)^QK^mf>a|4ID3&LZhs6i=Aj|;Q#*Z`IE8gXzN{G`(vEjNk0iksdi8m z6bIx%D@`o(LR+o^vDg`tRb#u=U3ve-msJls?{uq&4}EWtc2dr5Zn;v{Ig^lTmK00z zWr{~MIYq=PY^{l@tdk%lvs7hG&i%O+7_MEnr-~3)71Z;0QXh%06iq{f02GLeIVtx+ zh3IV+MnMzjvd~NeTR-k^r~QS;9kxczOnmDV;~&+OK;3(GrDIXM>9!2Q0wR{FvxUVRV>S#|768d8{2H zM)0(EkYaAK$gS@BhkKuoKDZOp+_h>j-1~K1!Ti>|R4SwMNlo7(Z98LRprD^gAoZBI={Lr#Hdrb;y}kcR6LqK0XxsGY%wF-65-i3v zwQG1Eh_u0aV>uTJb7?q{c|B$OpY8wm{ul9QyL)88c8^R&rc__3XOvT?g=JFPm|$ov zv9f?1vss%*>IZ%Yo`0Oe<%T75}4bM6+*G}InNudYTske8s&7Gp8OUP~{dNjE}+;5@!# zIKD-U(ySuHyLP^MC?mgy# zUaJN$O#Pknn6%pp(i|r3aS0aVYGSBPu|v+%;EDBMD2?t~Xcw{q_V=o8^)TiSkH#$S zvZwxSwm4M*C!sFYJV`}B4j6LOg4YxoMX?uzA)2>$VH2u)uyUvJy`JwhcB`{q{r%8) z)5-1eO5GOSbJPOniL(@Kjc`oq3@1c*OoH>CFu{YQj^t6uZZ)+Vrg7r75$3H=OHX25 zs(e6WR_fE90kFX#YLwyJ8D^apd5#+`JCR5p>|cw|=~^FlS6ts|@EnXF7pHsa{Ay z5e|wXI$Ad`u?EeZ)-uKkSyuh!N56jg(I+pT{PyLO-@JVC*~=$CyLSBnyyk%5_UgUW z+p8O^Z8h>-R%8Y?#X4h%_KZ+Uf|u(5*}JmdxQ^`nR~mW@ph4|Ro+MF81 zj8j#o$SXFxNd4> zH=E6(N(*UTz_Mt;CfnybRdtr{d`D`>IjL6`QU-i>t>g|%jFOe;u6v2{S!O@q`cX%g z+TDKDS#IGq>&QZhib_KBvfoC4BY|P7_(-MF3FRzU?OCQT9iP|6MedGyc(HHS~OVKo*qISkv1zHo-A)S8j zs3K0}F6Lfct=1+=3)=-`#`PeYCm{2x4)VTv6^a*DJ+ptQFF-&{aXm;M6(Umzic_zR zwp3?v4Nt5LQ&75Cpzd(p)cKu-3ELIoCEUN}WY2;{svC(TGwhE2!ZJF2>|VS?z*4VtoHM|NH(|_9=yDh0uV~MGkPGmhufbV9^QnZ!!RE3mUfEPR^F!j33V5F<(EVEv#xBGsj z8#)!Vp0K%~b-6cOz7AK0^Wu@_d@q7~S8JByt+nD>dgHi}mV>RunUDxUt@3&D95W8t zKY9^+Zt>A(WGqvBX!g%M-_f43WHHXcBj-GT;Z#N&feIbC6VY&)RYV^B%jk=Z4@O^( zK5dPDHM%$YX5+(+zZreg8r@I-@MUZCPxYUSKHIoG`g-Hm=-Z8tHg0cx^lF0D$#R7~ zO7vn@?IA8#yoe(9^ZP-m3q!r8)d3UHdlj7%N+~c}LcNkV$A!DGHCVycrD1Qi--1qP zEkWhG{c#(v6Z(ya_kqvs7mIl3;9u&bo`*oS*9@sAR7<4w+Cd+rp)N~xGxnf$4sLV@ z18gW?2i_qU>kH3fUFv+n(-2}Hjw^_f7|tw=SGL zefIqEH#4@BOc<{e$;ha7PSqQPQgCib6vh~boCpwEz1{we8?}b(?1F&i9yyrz$l`}> z8`$OU=cLhsBbun43KWP2VvSZb=21@CN8cRw`?%(Yz2#ve*Z4f;L5hW8Yt4jMub+rfmXJw`%$Jz@<%oM4Ke+y{=hYr}e7A(Y7NluM5EK;olAxtRd zIEjvFBsz=C`NPNG{_vl-AARxLBgby8yoBD*g2S(x!$0dI(`Xbshr>XPkI`5F#UnsK zuqok`(PYK@&x*=hI!V2%)148 z#~#<#HctAgha;ZQYL~{0)~#>YI&!g_{`1!HHSDE7ISvAwnq-{tcc zPriHl)LR#q&YU{;)X663wKJc$6xQfO3Zqa{DNKygC@};0fLc~$r6m-vgl}55W9K59-RE{gUzou?`{5m^ULwzI-apiS`okii_y81 zcSorhMdXrYEo~i>hkw!9_;B<^YxEB_Rbuqz=$p}JqkFB6w(w0C1ue^I4-HKgI6VHvZw(Cr_)AzSWJb6T|j0^lFWB zoK9aRh*ZXoMP&1cR6^AQfv@u1EMd~@j^6ugHeQ`N*9Bio!eblmY|lgS0fLdSC+VZ z=FDt0;)N6#&R%@$T~3vHm(MFMjDKn=CQ*4#s0k>T1+YO!W|R;?ILMp7@8gw+cd*^m z6rS^hO`ER}PD3 zrVv`gBl7`@^&x&wPV7t1B6C0i8b+LCByZ8}-x`!IzGuxHo zsEAF#X$A;DN%~!+*OYnYG|yY^)=59I2g^gaG3LKDTT=GA`DU8|OCi-ls^DU}e+@N; zxuA&^ETojg)2!4rT@xvX^4LuNX7_J zIpVXPQ@Dw}^aM0|6wh%sCv8^>q>~X6bk>Qw>0&Jc)dGSGLGY~oMdzTse&-tam5FV1 zO|kr7y4~VZ=QPr#j^}L%$^9^LRu7Xy`d>9xLNFTha^*|Cs#66Bs`;kY7) zX$ew3tW(x2#M06LDl#wXVixk~YON1Ry>K*=EHe3nzpmO<%Jv@KS%v;Qh2ZA;-R0Ha zZoyJenb4d{E`$l-B>(}RvSswa%RCM7)7b4TuYXpr#$6DR*L$r*!{fGVotKXn>g-ZUL=dDH`7R$Iv&{Max6%ytguo;Wc4lL zq>L1^;<%qZxb3Se&~Keg-nQC%aC=boS0CJ-7@O%&OdcIPmz-#!+pSP#QEg(Pg>J{1 zvvYX22gKFSoIQE+)cM`-!CVI@^;D;7Cbu_|2<3wHf*C55M#3V=YUk845!Dqua;(!Z zME9O$Oc<{aN#J#ZRf17EQl(N3Nf`_EBdAjvlY`{dy0&=@t~3#8Nklr|ilyKRmEeUa z>P3mj0^{|zL{7CNK5sS24`^Yl87&R0D8U^OYt?_Xrh?(%26LBNFJEs3K68|SwZ{?RE@6Rfq!on%O5=jxzydP zrbauU>BaFu2_gxgrAh~aCQE(&@ziSUZ5@CG?Wrbl++icitOd(41#X3qfp|(OY7>wV zEu#=LW@V3^ZZE9Wto%-Ybue%7dUHN^D?x6vU@52|88{lKr%nGe8*TpU=6`>8d-L1x zKG?js`PFy7tQV%XHh;bO`Q~raum9Tod~1j5cejol8?HWc|Cc)qJS~!?j?86BRTHZv@ZVnFrn0rS2NGu3_t^ zy{hA@WTdTTM*1jwkXx!(>*h-j5CZOAosdnlOP?5dz1Tl zZ4v$axw^9pBz|5R+S3zwe{%9&QL}}fo}eewcV~-7?;J^iJV>HZa&!SbDo1q;z?3st z{D)_fZP@y=>T0hhO84Je{FFC(mpjScP1&#*TaS_mZIoidrdK;cv>*jijy!90AXc3e zpRNp>n$LmGDHqp#o`PKJZc;`=IVZ#rVQ7fPI}|ZRj38o`{7@g--Q;0V^_$V7=V&X> zn6DI0tw9Md(=ShqV4h2FSkUQxU^0vL0mJ^FS3zBUdO8-^TpPD4ZkQ5(r$P3EZ2!>wThC z8L+j~O@Z~|ey=d&$iJcT%0NqU#$P`8V>sFcbBWy8|%NjIat5b>qCG2&hkW#u${Zh_CN)xI|bquaCi4j zRj*Y3YVR-=dzOb_VhAa%w3Mqz1yw4r7%df9Nu?V;e192wPnNl5v`_Kt@`7=bhQksE1f<* zne@TciP@T_#PY%&C3hlgXJ|^jMk1p3h7ry{N{-%9304A!@53d~mAPZ? zncYe;R1hR((Z!TwQ!aRPDbtn^g>^b>K<8Y2emc0^>mKxd#?O@gh^m=A&TPco$wJs$B?B%akjkz{d&#!+WNnxk92jBu*iLfMO7!7Cau3w%r=}}KF&#pt z10`HqV|_~9j6oE^=(^>0fLSvqF1#cy>eKHoy>)pG6{h}yrC@l?sHpjDl13IJaj2vU zK`LcbR%rgt_3FV#H*vLf0m97+{gh7M!F#ADtGMG#pDn80zjj^pS0C^1fOoMUMj+fv z!5kU}k-2m`D9SAA=(AcgE8R{Q_Mp*;e9o%ewE0Tm3;@(b;S~>rg0tziH_@Ys($XwF zx3#L>K6?7$*LdYhGQiKU_ux*a+S=&13Y}^~CH>&tG5g*hbMJy2kP1C1BwtEC#He)I zrmu+!L^Elf3^7v+IHAzTUJnL~rMjCs;Lcgug#AkKlvGBrJfSBTIF1pV79#y_1ZFYj zE?(_k!Or^KR)4U5XK4}kHiyAE$EQ^FXr{O-^Tu+4=d1vroa6>NY2==6i-jN zPH9QXQ>eu#LWm?#k%C--n1$yGR1f~V7CC5Cbq{{AWwE5i4Ah0LhoqhsND(VdFBOPT zZ_25M)-6G$vqF>Oo#ks)8z%g2UZV3lK_BuY-#SjyXqC zq{)d9Dt|tNk-AMOU*3Gk(mPLY$d@x8!puIK52@80Ae}YqiBpk7bSVjNJlYzftY%pH z+j1ik{M=258S@px>9s|L)k*Wxnz15ArdVFW}tL;GKA_Niz8t-Tf%ZAPIuYtVn_) zY>zF$5b$xIXLsM@^U|u=bVR?(L0Q#*Q+;~+tLQ_2Jb(FxXXh_Hb8dEiAsKgL2r&#v zDHpJ^QVQvmB8YRrk&A|4v?J0$;jF6j&4(GPR^B1{mO+lgXVT)_<@v>@BKtE0Kq(nW zN(orSzy(bKXuP>2KUCyL$Qw&|wiVw{Z+3j6Ild2J8l~M0%&iMpiYP@=OF@XDEXZKF zqFzWIuWn6AmQS$gm+Jj@TeVr2jKxkjDa+l2+Fa*`w{>Wwmi8A~&86De_^I?|;7b>Dq^D@rnGwMkt;Xm!Dspn>%~>WmV!NHR#8|4aPkM}yVDH-j(M|6{N^bGp-h!mP{?mj*Sgm1bX(0K9j4=Vj!b%G_>p%R?FM)m6Dh*ZOCOL#)@grbJrW^HTi0=KgGU~|fqKW+&U;6b>G5K_>AK6wP z4^Jt3I5##3C9$+fI}(68r!b+x$dFYcHQVd_G!4htp^-ibdw$}LfGw+6iltO2F0_nT zGJ+kUE_jbAw}D!gRjqgi+6G)Took1x&QKSLNO_SXlRuisyvUZ7E5|WzO08M+9fDHU zDy*=GTaroPvT&SRdgVsa-JZ^~KlU;A@w3gg09{Nwkl2KvS#(*Y@hDBxuudoy49^OF ztn^;;mEQYzw}vz^rp!B@%o|^qy&daP@+s-D0?s5yI!Hq_*MJrAX)YGukALx~3L3MC z@Gr2`V+O1~eAE%uS5MR#`GMd=&PVlRrLb8JP8cdkh#rX4L<(YwVoW-2veLtYF9x5l zzdBeQ+#P&f4fOtE=CoNltYVMpHs7P8W*2x0X@e0b0y)X!J)<`d|2V(;xRL zpdpD2k+c*}$}ow2NJ#F)yO@IjiqIqm8UjjUJ3$~5pG^gevLc+&sr7%obnVoIdc*hc z)SI;?)Gj4y!P;zu8tUC^@j;h%+#ZM3wO467jIviBz4>}&Qs%z3>=jA_k;tdv_y z>*(Z0AD5e;Y4kc&bUXyJ21$}vzWm<$JA+RLpRK<$bGo;3ScdCR0|%-!T~0_eF8>_b zhD$L|tn|^Kp~^54FeNx%f)Y4zDr8nnZUI)HHFLUg^Xa($PL}DlpX=`t%;k)8mIey| zjw`2$BZ?#GAaJR&vigHN(QEs1{f)|Z`_;_pcJByIr)vBWnbKtY>9iA@V!lKN%ULb7 z)Y5CFoM7GnM>;xRS(bWl37W36(!Vovy0dbaC>;}nWqd$%>*|$)skJZ~OGBiH_AavC zyXbV`c-`R4Ld17BZr}eZm9^b}|0rq?C9j&NrtZ=9+QaR*lrqIwOMKAQ7|Wtt?!Zxt z;*Eg?Ls<#@wQtt$u6?`q+1lr8U$1=>fA{Iymup{r|K|6vZ)q_-ux8Nd;j(uab`Ok7 zIb>CuxGAEeO{EtE06A?XV5%jf$2j>S=+Wn1F1~Q#{M^-xi*wJ-|71iKCOu*)d_H)e zTFQwvL3qKqjHdymOfko@k}%N|S!y+=S=*=J92swi2gw1}wz2O^rE znnmL?uXOCCr1sHRh9(?$G5sm?_F&$2tP9CUkk^)?fISZ!VeJee-o?L>H7?6LegwVA3<|mGsgG$+8ZVGwoi}*T?4! z6`P_tvV!r4wJXI@TEz|XjB7+CaR@wN0y}GT*fb~ij9mRbX-llXI=DCZW^i}#dHmg% zRrSH@v^Zpf&h$NCDy308;DwOECGEC=DMl$vgN^gi&&^V29Q-Ce*}cKHgS)AOW&QQ| zd>_XrU9BY*llY(ybxhXZ+0-%lb$rj;>Hi;1B1ec6Q70qBJDL5@bxK&IOB#>h$TDn<{oPYlGzy9*UhkyB}HxIdCJR%rP7Bv}{98FI$s!ZZ2F1f9U z6cfa17aa0bgB2VU;#6QHT@WU(PQOZJcdER0y<26teZ6h!P=lq2&cd}S)7|WU088!u zCp#(>hE-;(Gz%Ix*ked#mL`>1bl@SHi5WAv3DQn+?X07o z84oPl$XUZF`d>Acpxqi}3s3Euy+%_EFJ3W}PGBDK)Q)OyHSz{U9G#?!hb#@8bH3H- zf6|3f6-ry1vd|%H>dCMk@=yFNt5=F;{0A#6N%SJAW6l%qu(eKeLbTjgh8_vc5hO64 zx$@&ZG8oae8gc7C(G14<*~f0nP~xI`v{KwCM;-%Mi$G)Rlu>{KA>LaLS<~z;{M27> zEc@CGuyNV`aA&1{t=8(cR$4b}H(IXN^eYaU%k}H=gW9GU-_X6;y1t{mbx4*=vjqRx z=GN)J<|4`dzaFwuwsEaVJP^20LIfI28tx*kPE(_VImT&DBFMz&Ijd(Z1yG8r|Z)$ z%6)^neE~}m)!G=JMC_?08X2HMVFfNQ#C+DhwDI#zo>l6VM^e?xW%4-3iWWabRLQ$v zMxav46d)D|_Q^k{BoJg7RZL0dJyThGzwLX?^o=X9!`Gb#fcH*pZ(F`nI4vgv`=H{z z&#~|xWSTsUaRk-uD>@Y~;ONZB!|(PR?RTEJG{)^bunoG^?R@UptMRKwIGpL>ih+}o zaTWlj)^`y+GBWxUEShe{W%-+DTHQ{sDtQ}Ml9V$4d&HccqEmGrB}v1pSBj;#fk-Bt z)s_Vjjc|+W0)`*5AMK}wb6t^0NhcKh+`-7)Xv-e&!TPDt95$))kgofOTAhn^={tm z|F*wcZ$@9QGiKxQsFSTra85;FY z(!yVX+Tvp^{1@xXzT1TBGpDb$cgH)a70B^rbSDn)%rz~=K3d`dJR?YBj-1n&N#{8+ zj2NBOGw^)xmB_5#$hLu*??+r^KbE?r81Ow+1w3bRp zY+NcJG9svbX^dm7Qmysj&jueIhnH9!^bDi(R~AOZ*sCutM#UR~MX(Bk;mUx}5e@H9 zKqgPX=4M=jOWhyU79u|N;hDe3((s$!DSIe`j)1$Af&>LByyQs-G&&q!31pll7*R>H zDEM5xnIazXn2Jw0wdD6{$!}S`QY>W}e-@1bnxs0l(bym-4Fux_%j()(>eZXxH#;M> z$EUkFY=nF=F%5M?=Y3|#7An58Ed6!QmmVZ zo>^9PbB-__pBz;#EY3eae}4Ad-n(<>5|*M0%mGT85ME=>lT?IZ)Daatu~`=U`TqYd z`Su>MTU7<>N0hyv?8A0w?MiVp1aPpL62SP(#8i}b9l)W#vE?+5{j>KCtScwBe zn(FA_YC@2)BJR^XS^KXCtAl$}(VdCg^*ewmrV2AIP@B?h%qhw&GN1{?6vC#m{ZLe7 z>sEbv^QD=W;?8MzYQ1U+y4QTI)4J)~zP{A#zEW$oYs; zJ8tuOvo_mo`j>0-^N-$mIh_En42{Ozy<}s=AvF~JIJQ4_F=L_uPME`qH3ri(DOg%6 zSir#dSWatl@D#E~AW3|{SO5YE zNu&>?q>M@?X`bzO|D%mJsy>L@N7b34bm~kaC&b;$E8Q4@N-0w?GeJA20#`wEhX|uA zwKCX%NZwGA_o{J{->lzWe`o#eqfy$Mx*)rbOxli3DPQ8>M#vyN7J@1Wz>t#Bq11?& z+|kzlMA)Km}rqjIkA}8Xq|=dEQ#$z6bQB>=aG_XwK3!NiQQQoktv;R4Bf< zYj4q`^C^DFV=dQe8tkY=n|vX`xho5o(u~y~K7Rt*i-h6CN@YDGiU#EZVmx9bG}b1s zyzqJ|mbYmjjpbd!#D`m2Jh6e8rJ{jCwe|7z} z^*1+_fkw!VADRz4r1zXg>yhy~99u&p=nz696JwZ^R-)#^Udm9ftf7voB<`$j-;l>0^!~Xtg;$i&eR{) zX4hf7y41s>`4iGGyAN@TZ3|e4sH9Tb5UodwDT$a`q&N>AMW4s|tPIdxJ$_`n{{bY5 zEgft3W_pr(PDg#m3Aff)wQC2417e7xU)yJH;YC3sT9yw#JH!UjCv0w6%h zcuW9MIzT)u7$-j3Az8joz1gf?f_k(2xEy~v$MNX1#iL;SyD@S0|Zhd`hAs8zFGP4WF`^9a&4#pss)pr1`-jB z*NzvZPA@?h!X8UC`8a}Y_rvcPZS_ia)i_cUjOH?W&VVr&7?Zipfu`uP2*=B?x;E~t ze@T^VZTivl20xssbCWn%E1ebyUNMJ+QciV1j$9fRg>yxL*Cv~ur%A&@|(eFmzj=mfHFnYA{@#w+Er=$NFJ?NyrzTNnwGy3i5@#yRHFQ1M6 zn*QyRWJ^|G3GOFJil2Y?+__6LDw$g5{=JjpQIz?Kb3<0EWZYBmQrMgY&?&yOj0oT< zpiIGK(L$%Qy(H$$bA{7+T*$C>JdU)5o9%e)0J~QG(rJ~u*m7M(c_3DpfR0C!2RaoE z`Mr7@?shKUf$mM{?`TS#EWnNX7FgMuFk{DgqJ1A0a%>84J5Z?A3+)+=fC_n}N@^RG zU@Y$wk5tJdto6a<5MwhGJd|fTHufyM?>%ym|_xvNY112K@w?;s1>)N+j*lm=r-$L zc2d}R0sD9Hdhd3VM~QY<+f)BYpZa?Y@R<#Lt!hRh6>(N%YO@hUgASB)f+_+nDr&&$ zb?i6LJ$0tvYr&lp+%3YZgfgAYK{<;O1%piD4GOjLJe}Q97eV<}vo?fo2}OaQn8y0_!Y6)}jp7Yhsc+CxYYFa!sg_C@EpStafyD{c*p6Bi%r<#kL5Q2SpNnG8C}f zwoKq$t8>m<6I1lyxP)L`=CJ7$?is?hDk?cZlP50>yG`?A6hjx=vwt>4@o#V59lmCV z!Q`7if0KWBXSQRp3rMxv;|Yl-D-K7`45EpGFm04gK4eix^XS3GM;o8ztm+S)(Z7!# zjDFbo)yBu^&(9Am3Epbv9$x7l7**;J5C`ChAk(HBy#BtRm5thxdHT!YmN)F<7w%`6SdO)u- zp>GvkEs~1q7@SVW8VX915oJ_cjnp#?Me))3;c_}|o_@D;IY#Sy?oH#_D!p1TAuvwS z6D=i;!VwLEMimik@I?fRF*p3;Af55O*trZXV}EfN``b~e)fHy~C?rN9(CB=SUJ{6w zd7YfzvQ~DFVg2hD6to>_*2Nb60zCTL5GS*(eLvsqyJ8!@pl^^Jr9yMezhfyanvlt#55mm zb1h(InP*|#l7q86udfod+8mQ}DYT>B3mH6W61k4!fhfFek?%});~z%f27-M3aQtabh1@?)nEoEYyclTP|BDilq%^3 zCsdZLka{r>+jcu^Fn~Oz9VTYzFOFZa(0<}>Laaqsf@H=p&s5Zu1}}(LK}N$6bP+$P3!SU$ z_nSfbSZ&ATEP@@_fk>^6=$tYO-ledCaqW>|din$Plrvpa`M3njH=)~Lr#D#Z_io=g zK5RC{b~6yi(NxVdwP6b4wR&iI(9E*jam@n_jE2mmM2r^7)+DYp{l=w>4pv%^<;eTY z@6S}gZBW;$9(awG7?d1oGJ!~f07AUszK9Rw;0D|rtTgQ)hSvy4w+OEqO6LS<5x7kOg+wM9q-QKW zav}j-G?e)Fn}2@x(dPG?KWu)p`Ea}l@GqTbA3yuevoAKkJ;+s!?ds$`7wYT@RjoF8 zM}u~GaVw`7Z1P+qpa&3EsV&6bXJ4)KE!~5 zxD+%fM;HWOw8v-kFB|v9wYhILJ{~K~2P>QA}D;ZWEVeSe~t>Q$N9(w7L?g$@( zH8Gm#tjwfqQIzleIray5XW9n$7S%mlF<;595=T!0HA6oi@s|^z7<$7%sUp1Ujpb$)1E`>uIqzzozfK;VWyvVV`u1ilKuHJm|<*75P zZTjbEE8lEKVh7l@>c?ni`;*9&*_{%s1T_$^LzE#>#T0SIQQ!zdT5Et8f$E2Fv%zj2u@U?2DRJ1R z#8xL2Tx0~OL*C2j-V7o83&eI(?Ri&6gJ=oQW4yg`L`on;5zWe0!#DlYW0I!J%+X#qGd20c`s--gJ}oYwdyAbVLE8w zPDUn(Ct#d6Jbfz5x}PsT`KQxQels3RyL0S8Tie((@v%jGwP-4?IHArNrt_$9Zg^gC zik#+|uw~1v?)28yaMm!A=i@^8?7i9tg(V-)q@A(`^DwZS6kaWonp0z_$?m4HDl)5r z3M{?A94#tT-MZ1NHn(my-FENwu{alIlkaw-U8{hWX^%Wv4hxELWJ0r~kTLlv$($5* zgstBnU-%b8?EGx~eptVs?iM@Y@0M1R4#M>|Y+eliwh*UUeFB?Qi8!GZuwW!(!bF*z z+?=5=Vo+^-GIy0$~fvMCj#?i z7jB4zqC@c=@J(!xbbYkYV>;`zPCI%*) z)0C>@mZk7r*@&pU)lN}cWX(2zxB30%cbk9Ne4IWWZGN@+cuai$s*_%R@a)&=49MHq|;4tzt~(alpn}AciDoAwceDBSn3P zO9SjXXu{L)0lH1+18~r9nw4~Ov-dOQeVhBfKl3OZ+Oq^%i?U=U_X9B{j20#@$WU5D zri}7flpy)>-oO2L@4tS$_s>6m@*k(pEW=N16D}>iw{&Ug%2Mm+&7H{IflRfo_^6_A zRErcSPyx;)@6I{Jfw>~8$x_#ksSTaUY|WkC@Op2s3b(NnuyYyw`u)&rw&c}zuH?0+ z37eWRpWd;W*D|#$c}rLF&JR_<#~ClD5N2;4cNm@MP0zSD=UfBNO!X1O;R zSscBL*TTEC#hIz?h}7zc$%|aQ5;QrR6haVDM`eXdCyXR6a;~H$3muEoVs@5%3((bSC(%X@TB*oW%*nV2OjeWL!`sxPXvfjAQ2WU z2}SAf^W&<{j;z*JH-luf*}kK_7#WH3ROW>2YH_5J07e(B49syEI3Yy1K!rA%%;OY3 zUj(aWXCV*HDZJWC{~i0?&eEWP83pPWH_i9CKs}z4dH&qn+@IyEWz`QK0N)dSzU&yN#NGI+QYlrCcauYb5|j!UKwj6Av^`)$>1gv>=iE? zS?7ECDNNT*2l`ra`JhE~PFCwq3D$zDr9ebW^5aRBi4HYL3kJE7MY-CunBEG~53m&b z%?hMD!_JFUAGk7m1dU3@&rChWj-weatKIA^&RWDFA+4SDjCvAGUM=hxN{o4%UpT^) zzQ2#n{$$jat}I=9^XB-XRsraYB93Lpb_t-t;*7 zemr#K&(F6$j>$yZNnULd<&ZLLdm>b;L(Wn~K%$F0=A)T1G#;ImIUiS|Ls#$?tWGYt!FIJqqSA{RUz=QzDkFf9{Q0r+y`e z+3hUwW9zi?@v%53MaoqhZLDGoutU?mt- zDT^p9HHwqqIFB?)k-M;StKytRPmx)6ENzNUrsCZG<;}&%D`jXzn?w8hvA4eO$1?XC})12CDDFkIP1$4lWd+U%ZszXr> zF}#}$|C4*|oY5n%b+Z{dlQ`EZoe_a3nmklu2s06-BoKi+Z-gx>sI3fd!}8i-W&QrN zg#;~@dsvWd;;V(zhX@7(0Yy9*iUxcj(%ZS09!4Mt19Ct;6GDYNp_l8}>%ww3@+bUJ24zLr_ zZ&Xel*do1JER_<`A+Z{W30|e2H7~g%3Mmyu^y0gnx7T_rz1yAlhW(X6r|EXiLgRCL zOS?{W?)4@!g;@)=CdnftDP*9crG+peTIun}~ z#)pKjOy8fT1&ttEDy@Ad$be_M`4APl+6}sV-<*^^wa`Yz3-P6C`37|?bwn7 zN^yg}7;E3i6OuE^oEf>&QyjZRinwquKwAe0Y5_r7w{>I3c4D`d{V*}mhk_ct#ji!s zP49QJymmG=*kU)wO54YC0&bsZjzD1;Q9y{g{v7AwCcnn{OGJ)p}%J#(qL9M%Q_c0X(O{86JQNg>lSPhz~aF zlFzT#H(=OJ86WQsV^(^lU|QoG`0gbx>W0&Hr6Ss69Ki5(pXHn6hu&@Ad9&5N=(#Vt`{wTp79AOln@<|dna8U%B~Pc z%9u%0EpelIFRBG~-zJb_=1+X6FlzSV-O@zG66~VaQl*j5JEdz%4{T z35(GjI2eNi11-TB8coMhDg{+PRKpElT^qSHvgZ%# zu@(Et?s4?%dAZ*HVk|{iGq5_kfZ&`rL~t7@!NFjcCN6Ri{#I=U?bg_sd>#<3ov*Mv z57k-G6(cE3z)Tw){XADZc*_)vF&kk@<=scTb^kB#zcTsk{;U7}%H+LvduL0%|D#ln zo_sp_U~)Hp_C_`No5_dq)A#Rx_x=y=zj5J`c|>G$LU$I)5ul6YpmNX@MTu@lF*|^q3#>p`gw15j>Mz?4WYb;wy#I zO68RVDTx-6(!hlG*i+(z7I~|Ee%KnHkCNdTj84P>o#PvcBP{-&#idwJ0`VF!IPaw6 zjw_70i}^>uhGgl<*T?S zKaA<%yZ7IW4*zHE%D$K*{&W2F!^sD`Tl+3tY6d4CnVm0Bp1D^s3#w9$B3uS3wZzPD zs~zH4Xo{uB!e(agu-QQM{ELU|;6kbTb6#x3%JbJ(*RHN4x02!4rv+FFC*|HzjH$*p z8h)!}%-Xa;(gV%Q(V!P$+Z^7qw|jokU4G}y54r!H6JRl<5MNM(xH2T>+ggIapcQE0 z3C@CarB|(lb?8Ae9N$TMcMj^>J71PKKc`wG#8PA#km$~djUhK>5nc)ejNnWX8M5wi zu8(?kvpK#~4IV`q^DP_aby_UX&F&+^QfxUz4kHZ_WW@=lA}FpoQ-Mg7h3(FdcK-d| zt2>|Vd|d7P;q;0RYG;Viy{;i|cTMAmeV}MqyXljjd(f_m7%7ZGWGiMV#HCN-mPFac}P>|0CIz;wZRg)LRHKpF=Vl z4+9zyCDs_6#bJ&WrH`(X#cL&0E#BZxS)b-Rko@@!t%8cgj(8 z_Ttp+#nB-v)v_2{sGtooEQT98AmP0Yp1A->W)=IMgL)f!b+7STy|ca$XR3xpx(24X zElhinF4jG!jquiT>lBxcAR&#X**Fl&=6$mA2!l58knY1W<{oxw+zmkTnCwC_w z?A};Ujo+U^7xZ|)-;oOI1)J zjk)4DFe^wviX(|n_Kjy=xVrk%H`Z4F=-F>An0sl@SPY;_ z_m@0Shm`b$QtcH+ltqsrvbdXeK4}Yf@9lhi@70};HpZP=8YZwttDiYrF!+cAGC`yHU^zbc#PF<2IxYy69h|0grn9g;aQ*( zj3fXSq|IAx`mmL_dbZhup6k?a8A_iEQ7P6H;f*7Jc$><4=cJI)`3Nqf)yi6f+wX5a zI8bvib;It~TeJjA6qjoO#+(F8G3A<@=wK{zjOoDB9wec>)7p8Rb^EzFsQt~+qFIdP zev_79#AZr#r7#Mkq`+V`qCTX7_Za4TqYREQ;*sL|cAW{v@z+ws^(%ASI48G3W2Kz- zMhHg?bxJ8l2(bZK6r`kzJFG)q`&24ERB6w(g+thG&Q*_ezR8@EU@4|bFeRl+#&cv-JG{)50r7QcL7`bbHoV?Laat05M|~AiyGT z#6IGK(?6+a`qVkkL@$qgkWaPXd4Dl~QwIPog4 z&1HlvtVQ_M#At7umHB?C%1kGx89MnBq-vC!v z4yxyCZ#Ra%*9?6cOpgD74(y}sWI05bg=kCUr7+Cn)VHiSO{O|TTkSANlGU>eTPEgi zpWkUYWajD^otZwwOz#n2DV)q0z}`4;fE-mMCO86d#*t=@9I^h((jW>x>9=ul{rBoO zmz*0t9k3WY8-X%P5rc(^=_!vs)+$C-G{cz_XoEBp2i0mboU1BMZ)n`*yUAxe<|n|B zzcf^}`|;x(k+F6Tj8gRwOc^ZGU@X=iz-q;m$ChHMA*)IWTc3YAerM2Z`fhj1akz74 z#a9ZaOiL_SOpCPCI(QI5#MfW>7-#1#ReuKRVcN=b&;ssr6;b8aEFOuj6h&o&@lHu^ zrB~5V%Ya2R;%PIg&fjNY;?J$Dj}L|ReyTTpDb$soPq%$$A8<-F#}Gll3TlM3n0SL3 zAc+K{m_ydi)L(!0+Hdau{r~>mPcK}$z46E@ekD^N&#YXXgS6vYIZRz<5h+y=*Y3xR zfjqL_Vu(h@ne;!7ZbD>{VSL&Awds4+i_jZInO?Zmo4c@>T8D(v0zBF=a4qPd+bhIU zbUg*f7>aMZaM4-NXbK1kmRUqlRx~$$zj}JZ*MnyK&LYyh$9q>0-}A$(J9(T&i*0Q)WOC4vC_XXs4x7gz1oK z^?Qmvv$Frw-7h`JQLF7yuTDkAc+Oi@-D?+uHEp|8KU9~&`QF7p9)B_z4*jM%1YE&ATVP^+Xk-5bNIh!@o#pb#*h0 z4{QJYT$JDtdbgjb%xGBos4V^MM^8-O-OPONgHw*0VL$#&6hwb|o7_I*LwsRfY^og8 z33gw>mTJ9VLX)5rjtUQg2NOM~aza?A^P08VfJiexKZlr};FV{N4M1e*g8|gU+0OcP-+DOQX$`SGx1n z-Il3zM*yr;yJB2pf^375i>(jeBIJsDO z56*>p2S|v(5#mT26g`8G)W?7rTO}3G>J4c|u4V3CxP)W5MZN@WTC>tC1vAEu2)F{~ z2pD2KW5^gwJU8CtHTsNT+fQBnpFR7r^h%feo}~k#~Pt_(@Q?;_`ZjT`xVapn!_i6x1U9CwNNK0q zYhwb`psc~lr@^Efyoc1~`?57*xdh?FQWcjTiLMkyDTHvTw1m8MAt1+)51^H|+Gbsv zt&gH8wqa}NZGTbkaOawzymBCxa{?@dR2lA#(m3jD{KW;e4ul3lDRNmaX1be)+pxKj zuICqV19g}l!q-19!BS8i<_bA)0w>rr6mxs*0NFq$zpRYT69LI$A-UlPqZk5qlkCTg zp!dqJ7*JtF40b4Z0aS>foJe0I#61|SI}Fe;{>fncQKD~lXSeFxY2M*X-7`R!s+|vp zQ;}L_jHfh6XLVpI{*F!}D|Oo*-`N^MU2TqketS5+Giab0-&wC0#c>_7hpiSmK$e9- z8>}=KY%xPhni$TZm}Vj4oT1iabr)QNx;LzztB1p;`mZZ-q)8nqts6LrSs)Jnwr zLsP6Z8d(de^PCzUv<|78PDvfGrtE0r-kc`7&l4{NFV4q*Z*$}ShwpRc>dH%Bd*RB; zvsV|S+3im)g@iB`jWspS1Z^oxeA+Qz^PCApvKl!qL(jor{7$n8)iu~2zn{j<=1BR^ zYez>eMan`M7Go=eH!f{}qa^X*gdjAx&XD-!tQ(p|n+X4E@{6{w?Y+snlaD7KOn#oW z63#4+Jh>(?++M;gXx=!#s&q8SN;Rx){31*`%9R5fm;-MxaVh}I8YjL!8f-QftC+$* z1-0!rzD^wBX%Awrqggr<@CQn=7-uaN;lg7ehG6GKu+~tmELhjBTj&qgfB#B571C_f zHx4dN^NX0z%PT!$yM4m3aN9lV^>42I;nefu@0e8I-u2SQdFtRse-Mv&(e&M|Ctp~7 z>TA7A2A@)&?Sq69NSDHO2xS$iqv~`>EA~_O2?;Cr1oT` zu(_BCd2FWpGptg%=6 zw_)4Vn+LB|kUZH#vLFOL-$>3#uNX@zC_<7TqY!3+{2zPQ@*L%r-T##?R!LRty6=Zq z2#gs9g9$Rp>|E!*;6tr$ryp`)WrJNwO`I$yRjD|cEJ#h2hawZh*v`cGF^k4qN#4PB zC@=C~E8kO|v{LVd(d(QbCP@ZCi68Ab}6*QlP0B3rzG(Cix zr=!zCsHgHP##DObIRc4-6oxvEEOuI?t&=qCvf;u1Jh+oWx$Qf@W);i))7g++DULj* zGfpNVx)}CSqo|W2C?pXULFa9M?RA&n`w#m|m2cSEdCBN#hJQP4tK9;2srpIGxDJR| zKpHs|tqNz@dBz;0S+3#n&3|}&tW%u%Y*i@iP)lfTy9dn!`s-(dfSwVzDz&MAz!kceH zZ`kjrrlE1y<#WrjgJsz!z*0zo1;eFQ5kqeU1{{)^Hw1vHv~32(U)d0+v`CAJv+~V|Th&P!lkFen7-&|tZx^|7 z6X{~T17Tfo$_h}L27)C@>yu@`gk^PbKgsRmSKY(7_4D~t^J6W8i=NcwA4^PSs`o=BZ%Q2P>GZvRz$C$EYdMY zPWRM@sLp=jt!JZuvruPuL<&I3aB>S;0Fe&7a$FNh@_1C%KUx2B{hRpO+$*&o-g}oLT8sJs&@)T7LxwdR2-& z{S*e;jagbWBeS%5@!ihiEJa*M!i0jrFo~g^1|;JV_5z$$aHKm*2tTA@Uj1anuqnx; zu|dkfiHvDK4lZaBEDJ1aI z2pr$p1y>G4qcDZ9ASTcl&rH92eq7WPUMZ3hv_K7G)JjGi=%A#=z!0}W9_7SYszYi} z(}R_Qmh$F6J+VPs5wOxC9!UqmV#KrT=|XRL^xIm6?6%D`o9?g@8RWbNYwP)IO0O78 zh7i>biQui2hA9wEDxn0mBCCkC#(qlIjzJVN}S_lSO}~~l1Sw>M+^f}!pFZA=BbOF$gDQ3 zjrrme@i<-?-ERBkYe$_Q@R`d;GHs+AckMdcc4a)|#hR#4+C&+obAl(1Kmr5_gMtVy z>r(dd&3}1(^UmX&pFh6wzx&X=lhJmQ_@(8%t$R%C%@$-zbp^|4v?xN@T4gOq(Ho_8 z)X_hAlhtlxx`X~oG^Bn|PkYUW<@S(vkCS03uvB=)2qD%77l<|9r!WJA(7>}OXU_D} zpe$@#KtIEc33=C>O~DnTs2t{qYvYKG8Mkp%Vqsl0=9*+(UE5w42HkNW&QIkIBdiV4 z6~pL_QNbWZ8PybGP-w7c0$~g;k4FwVuOrd+G<8=RZ3)f=4fjeGUe9JIA`e+ZT0qJqKL^SM1H>qTv9@XZ zDAgkC?&HnMjBfX;CMUs>476r7N881veiP|Zy~9!k4H{XACHGDdBuO+5G8%H16==nO z?yhwEOM?cp@H}eHztC?=uN2Ibm~j_VZV=LP9*l+%{jpcbnyg6xlVZJ<{!%q=-{Tz2 z9TM-&(klkja|tQJ@-bG%RJfopM+O_I^QgeqK3w}~_1o1ytleDwYW3dg{k4zRZX7%A zpN&^PpIha>rZ(M=i=<~+b*m=m79kPuRVkxr5YibG6CIqXAq!d%+rAn77dHeiMRJ~>Bw-#Zg z@|_2F%yuS~#)((DZYi7A58ha!rfT8ud#Bt>bK=KCQK}(UgHVdGnCdg+y@)zvDB*yS zwplgO^?zIc?uYl+zgz!${mb>=|M0;NH`af@{#|SR*Xwudx9`XQzB_ijH+;?^MFv-N z;!mT~m-@X#mL`)cIvcK1&2nj6j#BG55l8@dVlg+~apZAUqOn}rUbi#4-LK|r!1fY7 zZk1mdpd4WnvkOU;jp1X^&O4hLERZxRu&nE+hrfID(WAe6^!E?%J^JOt+pUMcefa6a zd+~KYzV+#&UmiOSz2|Hs7A`KFm~J9wDj3N#5jijw>rzlaXaM0b1`5F$%oX91XfN|R zINEKWoMF4WoMNSEE!cDb(SU~KF7q8*ZAU)J?p zI=}e(JLi}lQ;n;CWGNofGbVXFLdK!!ejPI08EIn5E~w8kl>Jn>a@C6O_2b|1tqWk2 zV7je8TTH)6>r$s0RDa%RqdIyup=J^)66p+`R@pyr6@Bshy>_Jqr8=vTbJ#M8K{8Ib z4Olpu)~0K!vThfDqCOhiaeHXcJG3`Ro5fd*W}p%g#z7hsG>uN(1%^H20d$sQe|_|u zYS6b=Qs-!VA~P9KUAK9lF*Av?4d^xrmSPId1mq$9udS6#n{?@;7we(QdMhBM8WPhiDs;@YR1C?9 zj)opH5+vaiHh6{dFKkpiRP4ob&5XaWxwv@o;M=UNuQ(3rcO`ss?H1D=Xx!Z{`- zq4A6h!W1~bif8TpJ3Cx~tAlZFxiRU0>!SSJW^Xx%4cV3A$T6mg_T5vI`eUsQprjF! zAgZz|ouLPv(Wg+Q!Kl!i+vtO~(Od8+)(?T5#N2w$v=vTs@8b(N_d#T3+vnqt?7`(B zWD+yZR-BfXT}_Z-F}8tmr;tJ@2Hs$UU@bRc`m{!shC$!h zB{$Ja|Lw+)I(D+%?N^=4Ex+PBgV$Q^Zu~fnU$*QO=v?-%wibuh`hLILYyIi{f4$gU zPJC*AdjFHw$+s>c#N?|DI;C;QMp((%{;i+Bc)9lHPuRxlVIVT*s~b-B`8;tsq7gbn zHFGgx4kX0GYK^oM5u);FpKm3)-uU`_{qFkL2h;i_>QHX~yXy{z1=t0h@^)-W^+gf@ zED(*FLm6R#5+fmuhq_7+p+Esx$A)lJOK zsk{Zrw-YTWr-@*BRzS@^tDB@(j3uKU$1^JeHZe-VN*JRs(!>gncJD^@i>F&0??!*I zaB>I#sm7*t&((jPUpP6&Y1WTcjGOgX8cWispkPQR!W~6X2mwM?o9<$KnwV|7*64P> z^>gU7&cU_RsW`7P?SW8pvMft+wnBSqoN&?DVwwtzhAJhKTlHCGrsUa|t3gdU+j_R+ z>>Lc^kBVvf=+5+2aWP+wR(SHI#><6yem_8lOiQu%Byh!W8vhrV3B`lAiLfUv7s@#6v&R?s8ezJ2B|555@q_Nmw3sdLnY zG43`!U^#dm1;U6C$Z9OS)bTVL;R6PmRS!JV^BW1))PQ%U-0NEx&zwGUe&Nj=YSU-J zD@M{$OiaLtE5!))7GVR@2L)<()Mtn67@oUuD30N{JE9Ba=Z`w+kU-HRO64SyRvR4y zUMHEbS?dc`7Wj^$IYD0F#I10o<5Xw{GP)!J1a~E08xyg!% z-h5@D2j(iY7U4ZtU4_QL!W_|jHo(Qm50AGD$kg-*0ION08;l)Lyrbd}Wm9 z=ifcB`x@nLa46Lp?Wxx>*%t(i^9*q%0*x7-h_9@&<$3=uw5Q#cN716>o?dt>$@mgi zdXg~_(+ltKd@8n51PxAuH!?z~7*>R9E2%?T#3!Oz1J6G>!l&8lmZ)T&`tN|{I02TT z>H{STGc2evg!5?BsZ%l$=i)rd)Ai5RzgfS#{?+>Z^}7eu)JbYjFe4jGGx_YcqEe_Q z6k)=Z_OTRy;r=rb1b#zf)cA)it}`e0}L2>S0^NR}80#5tNcz803lYgv10h zV2W{|I%~D?>bj~`PJITYagtBx%$=Wm+8}A z$FKb$e)3l3d`|@e(W~56Mk4r!ti9n3!V2N z3eE$T9%xoobM>ENZ1cw$-F&@zFUB`ttbVq7?}bIFvsz}$%VQ@(Q>ZkI5<~+Jf?z>7 zGa)F(t>y+x9kSXxFKmoWUz-=h_fk6DB)wuRl`~WcXORiY62LZqr~F3br!BJr(5>X z?N+xx=yg}Fz1BJrAHRO*`smhj_xn%kk4N{f`{mK^UOjf)_NQPt@usU`Q}_MxO5x&6 z1<$=T$Z^XY5mW$6oAg5FmZcM;Z{zPey4Cvm@JhGe?yl6o!>v~D>Cn|Vh-u{L^Z0hR zvD9%(@jJ>>r(yl6Ub?};N$c71eecD8sfypbhpJe+gfjtzE}A{2bTLwmEShy)7<$dc3i982pL)WVsd~@R!8J=;QSta(pJ!l zwa5icmBJbYDWbpO)H5stOMy+67QNvUF-J{;I(B>PtfmurDdINimEtLbb6$Aho;ejW z3Im!U;yn>2?1n?ZFSSnn%@79h2SC)?)5EIcVTXB7m6+b~d^Ov4Duv0?EX7+hA;D3U ze1MmPIvs>GD29zDZ!g2!S4W?Z?ymT@t44QQmpYfBm$uGK=((*q!t!@^Iy5pI-05XBa1+^q>*Krl%R)^@kTiHqORENru)G_ zS~*c-1c-qFGC+`I62QU)2n38X_Bft69y?jIz11{#@-~M5N2)F@sYy1Q)hvnX7TbUx zGz9kL`OZDBI`w@)DTsRZ**(FJvbm2I`>8S92^4fGhZp3 z9ub^ofRrdisA4YNjsX>z<$^BoWkkYWj-=D&8&_{rEW~Ymd+pZhgkgU3!G)-B?Q>UO6$rjfJk(O+4Qz6Xs`-w@nz&#e|x3gnEGRs_Yo zw8XHiMtrk=Z{S;?%+Nt{tSPH33m9+~PbEo2K&OH*!#`m71*q3K9>G<0A zTEow_p|*a}+5E@vWsw{a~q77O6wAs#{B%kuf z>o3ZB0O?ZSvs4h3R(-JpC6xvU40*?dB`Rxh^Um&x!I2kI)1dB@@R;NWl5yh|A}Np; znpkHs<&NnzrMEIxZ^TK>vygntZ~EO01n7d!5nBF`5@E(b@OS@F+Jt)0A zZoX19g{D9ZWib}Wkm?CwfRm0Va(VQ-Z}@iIuE)fJ7O#qUZL<9s7Nve+Lk!f~#vah5 zjc~;X)1IoBCOFL!G3a%-nl-e8A_ntq>pAHC#!OcVqoWZpOQ}PRzBPKn9_`-Mn6v;qKgs-=^-KN06QCHg*d-FA0b6gZ9 zCC+LYS5xe4`}J=0%l4sM6Q?a}=WSi=vt1#Uk_y0yt~Z8f;^NodheTXwC_z3eWnb>K zeANlnDzwj>bBjCTKgF}BYq>tu7qJj@x69F%EL!~7bC}`<|CI$D)O}E1dS* zykU|Cri`Fgf;Ye<4i;yPD6bD6H6Q%mz*k}T$PFLGAHY{zovlF&>i82lU;VuE^aS-F zRsYx+Ozd80o_0)i@~6+Q&6(D5fGYMbp^f)kNC%3Um=-*9C|K!?^;tbpZ+rOguC1%# z!&VD6d-sRG-}e39@X>lbNtoW*d1BSA_b1=WHP8jAy@ZNyz!WEYsP zNZ?mbS9I;ot7{i;$5`~U%YQ!Mu0wjnV)&f(k|VEGO!}6B!-}e44HKAT6?FYhdp$`C zeETpRled;N-K+#+2MkyWDaA%Q3Q0a4;$H*>u7ZOF(F)Z1d<=P_~!OBhK? zm&O~TNx*`{#y`i~wmPl4?eEv=1ni(j!hD;14(9y(%vTDhw$d1BUHnB@3?f)+!yOSm zK;HGB9|;U>I@N5pou&)X?%or6`3ooWkq>6#fY@ikQe=%HRwB)eWfWQBxn*8ztzzj0 zS?T?z@5b-h>E27vwX*5E@e$h94cP3!QfzoujE^#AG1}m~amX>w5Y@rPxEz#big~QF z)`{Y8>x~3MZ>eB$j19qk<|~HNDNYCj>e8}jx>6JZi|w;TA@4#_!wiy^5#qxgUjFDt zoc5)YKF-IBnqQoc8?O{ehbb4_}&Xu=sUcA1xl3w_ngO6wCD}^!;7rfC((IoEfC9#e;Lzs8Y=H1#HI5?s{;$k{Y z@9XtSUcG+#(&e?4w{z}MKQ&!3iZoWYn$nmW0|O+3MH~#l@vD%vGB@ZB)(3ER_cHLl zOI6EMd337WZ@)r7HSr`}l2h6soffL4<6J5nBFvE0kv3~n)s?#6??F|!t2Mt}_h5{x zaPbBrbMJ@QoEV2=Q|dR=5Mf+ELNLu0R-VUjKo|`Yg)E)%>w`^b4?l)U!|c5jcVs?x zX6L3G+GDv=9GPH2875F*78#->4k*@GP8x;sF3iE5uCLp5bhGa8Ve4LR_;7vFiSXDI zLo^Dgr(~*~hv}hKEX9`-jj`d1ILW0@7O=8hNhyKgEG_WSzwNv~`egL=&IdaWM*p?* z;qG?hN2AYo{_^R{x9Dz}(4*~YpBI%{#jb;KeSSgJ_ zAuQMe6RiHEzwvSiR#(0wB*qKks0$GVh7_UP#&+KlL>UN` zC;R*OtH+-=j`C&WD)G-hez+9%ou3t$sR)(&k0nOL*I8NC~Fer}FNtz{DgM`&i z8*Ha~XZTgO*RQ*Ey)nkZF+VT(hitkZb& z&97RW?jX@eE$KUtQ4a36Um>8e!eB{IgKG^sDQtQd6NT~KqmZYrbTNM3R_&8}9Z*Xc zn;yz^vPVvdW=j4M?H=ouVwp}1G-tu4xn~yBU!>}N{_6AFCwPsWc?FkU% z;@`54UGMvLzq;It1%EYs)T=gN%l100eie-{{Ho>qe*9kE;+5HRANI4)U^9U#^(beI zbtu+Pl2TW|6ZVY*w2w?Dl+XyVt+h^*}9qEt!OvZm^jx@G{x7nUfC>2t& zKmwJF#XmLj6xpmr)T^6m18-Rg&t3^Xvs@{Llt@W}0Y`L@1jojPk~Fv0J~lWx7(#RN zApRrR>?}7JkGsJ**@~s$3Ylsj!9>ir!E%k5Q!JK0Qd3G6nD77-_39Z9o)_n1Nw#^i zQrM&jNGOdlK`I!6k+3Pw8p&CnaO#uaJo(*|Ppc=t{_bzT`|BtF{@n*petYH|bf0_o z3psFHxxVtoat-Mi!TT_Hiv31`NJ?xvNwHC`jP(eD*WjtjI<3A2E#K=8KW-n?_Bh4B z&U86sp9xDLRh%P`JOb&GwyUvLX(EAP1t{y**2;FLdpFezn@hTrStrQjwkriPBxT+Z z6S8)JIc=@h)G;8M<2*%`8!&KnwbBJJ=^oi~3E(&qZTn4Fh^oc0)A5Wr?`^7~!7!l= zGQvinvk1iA9n|jZO6b-b0PS9E%i4>(1h5P#M{_Mq!n@cB9UzMPU!UhLS zG0S6XY1La>zS}G&ETtc3k1PA^SBhtB$wjRDxgpvyOO=;YD`C7yY}xse?h`4_o`b1z zx~WZG6;aJxZiXk5rk$<%O3x_SsVZD<4;d)19jP>P)- zV5gnu5&&BUN;1!s4TwvMvJOecMHj06@KLv+K&^(qZ*Ros9X@Q|yAS;(!|ddcFr8s` z2Gf?hfiVGN9(#6!2yseiA-Tj%8*f5Z8vp*Ue)Iioe!> z!V8WWZ?3HU*`GAuG5vS!Z*yhk=E{|owUsH+Cmq(QxnLBTpMv8Mh)Z2B1{+3$VHjyg zloC>UPF$cWdSuoh(A*jHDY4tnR zJDpY^4k(h0U%+4~&Q4Wl9PQ3mhnAC|H|ron)!Sw$5Jb*6nZpuHJ%v)rbFk|DUSe zYm<`>4qtgWF)z7evLNepTb5!?Rnoa*((piuB{AM89ck$Z^AbZ>y0|vF&!9gF4bcfyIP-q)&Bt4#qJj< zN1j@Yv6Vr)G_mDUF&wzhIvw7MPqMkYD88g_n7RAfYrRr1l_B1Xpbhv`zEPnamBu-& z5D&ADZS+~p=OU4xzxwtOV;eP*N8*KM^0k%o6ViC|Xr;IrN@AvUfVg*(NhLJ`D!kz& zh^*86-P6QtweNO)6_e6xQZH?#HK1o}e5bzDo@G6AiZx5Iwm`jPgvU4=UskO+ML1}I zc~HjYNz>hpe%U*7uC={P^$VRErf+DD<6P);o*2y2+DA<9BDM)Za}fg!MVdI5HJ9t9 zjphDQ)$ABJj+w3$M#`n60-RJv5}6dEd0+xG4J>aV^QjycRBzV?+W!7G52mTFoVFA( zo2J=*BbK5o1ja^DO$2AaB>_W_Hj-*UDl0RL{&n;}qu-4_+4)5^`sdLnqd$y3AN^D*!e|##OHh?Cq@9SRpUP=T}IBe{~Qfdu_t-u7+8^t%0M8t0WOKC5{sD4I{n)k zq%HDB$gQ{0pG4!f4EslQb_Y#Z3ag4}N)lp+Cz%H?jO9d`SV2-2vhG)GB*7@?9-@W! zY;_|`bnE05x~^ZmdHMRmy^TflmKpav4q{g9M%t5fQfsg^$QT?H4>9w^n1N_kbf~+q zvD8yMc4XLRzEU_f1&@ry4#_0$V5EjXh!m6)ktK6`X#g&^w}UNz=3J|D^#8yoO?1+*mRry9^3Dmo+5^&9LLF>R$-rmU`YBufW;Jy`U4h!)FhdOB(pPQ{1 zK|^D6=Do3j6Jo$HLxdF4B0=nIBiNW!Gt`nwnOTi=D#(XJIY=B&B zikx&P2u}pXCU2|#<{hY8(Efk+uI)F@YP;yjE-9>@ObA zOd@p#*t z#N+r=NE}a$JzBr@t^4{d2W=5-Uo#LB;wwf|QENDYG>;^_B#05D1tQUm=QY8ejo-2V z-S5utwr@^HZgmdgpZP*_QhcRoGGw9=H8w`FDVAl49wLUeF_5(`%k@6{%T-AA6X;Z@ zR_m^ZUFMY3ahw9%7S%1NP8DM@x+XeF?E|MQ#!`e3%rF%(+={qo4K1Bo91XC{IxfrQ zaYT$+br#qU~2E3pLK0d&%sardt(nEdyj zULUI%wOP@DWkm(pmFk^BF}=3J7_1~=R6C>q6Uh-3DC@8sbQf0ZPNzNow9kpqt@0}c z)JB6%MbO?VO>vCM4Od8M>zFrL<>cjhso(4Ri*KB7_XnQ{{hQs*m;!gP3Mz^M2ZL;C zck&pZ$iy`eq_QY$%;i*!dHr%UbH`4swEJXxk1!|1SBj=r9Q$ZUkoVC$V2hM@(ODoI zRNi^Y=C{qw=9}iL=2mmFYW|_QIlMG{ySdZc7+xM;X+CT2RLwsQf79F=UXEY)ZF7Bi zb$F?{(H^{?mmXOGer38R5aJ#rV%h?dGF?k!*h*^@l~U%>qQd&8=}5)W!t_yz_D;xb z4SDh9)2B|KJ^4b}osb6@6zfA8g)+`6Y+TTU(-f|%80o}BDeG|FFCoG?n&)xbc39g` zVV6*0LU^T6VicI6(p%|_N0xtmhgbjSa&x`;X83-LhObr42k|d=hnJ3> zF#e&&KdxluCnC%#0pOFUIGM>x22iEiq^wg&#vGV(Z-Y}-^O&a~5j91R4}4LU14!c_|UmSO(&h6-Upc?fsjG8om8E*MTc;~Lb$hdRue3M&5^|wxV8p0rT2bVY6F~(QKyogL zw8&=FY0qs||Lx+mVoZzqE)CvE>6LgM1`0$v!EB&{aVK<;KIXcClB_slVJ#-vY3%jbi9zcu_IjIaQhLQ; zdPKR=K{E*;;=`!}C>6K@mbdCZBI5d@`D%D+csaHFj-4$*K+T0!4(mSoAo1-9i21KRmqlIw@8H$1v*n?Ck zARGku5O@~9#`ACy>|#1S(W_qegVCE<+I=>$O;xv^?Alq5#TYy9gtLMo!VTkK0}{#s z(u%08DEPlWsJp8xtDWkZey`iDy9?DBSaq}F7Dba>XC8_;!f{LKO#BQyN_E9Dje=#E z`!w6igrLF(u6d9&Z>IHZufMYB``!4K`Y|(y>hvJ70S#sowH&S1Nq&cLrZh{jc2o%_ zrP7M0-P#y{N*=r<*fE+lp?GRFzO{jWqrJkpzlGW{>6Ky`V)o!D;@&#XK{17pW|C{e zz01P#$9I1B=XXE-^LzjH;~)O?zrX+H$G1Kn6-h5HK7xXHt1Ekn40cAQSZRz)XJ_Ig zuhT(Ka6uYiQI9C)S%JauZ=0LLciO_(oE65lz*49t1S<+yuym8iLX025$CM#JG%g0R zO5!KG)n706q3+u1FV6USB|c>r7JD6t?>WZ2e>ryg_3#xdCYQeR7eNo$(mh5Rq73j$ zHB<`()^Hb7n}B@`Wsp=EqCznlgmFU(lA&?CU69h7?#T~mG-^H6l9C>lkA z3Cw$8xZ=X=fGo8Pf)hHA>$6jxgU%YbUVrRn_~ElDPt3Ew6_8>Lu|DQ17Gp{@mC=6i z_%|xSI;FBSr1|^drRJ;QmF8M=dw6;HtIajOe@*NoqnGatFAd*MCwM-qnzx(V&F91S zo3DTR!aL2k!>d*E&xx^Q^#8x#vdPSoA$kPZ7VE1I#z-nP<<2?7C~}?!&nTmtT-5nQ z;(Ej~F(Fn*?bjVkpXJ@EU98QnxQ_@2l5c=yl>( zjZGyTN(G$nz-SJdg_B4ZDjvnm>O=?4yfZ3z9Bcrv#0bRmN<=TO--`Lc`X{?AdTo*@ z5!zalF>5j*x?&_HHo;qjWS~^&=+i)Gg9xKuW>s;{!g6hD=vFH*faqseVD@FOlrYmH zv-OpEQfj&kORbGd3Cs1>VP%xEY^fv7Zl#1saTHi3nt#$-8!)BWS4FljX35TAq2 z@n;7sy>8-Un$<--T6|V{_|Fz)Dbh?SL%GEUu;LV~)zUCUuyHmo|2YGl`h21wuloMM zJj-BdXN*%yp^r?7H4o#RgjkBMWIF+@yrg%kpp;!97{1)h&oG+GhA~U(jJ6UIJn>uZA2v4=>sjJF8&Nf1tD4`B z_?T}twS={wa(zuwcUwLd*mG+_EWeYhIt74ssYGi0sE$Wpb6bFp4kk%XPT~>S^ z|GBpY{b`4aTa0(1q8XQ6DUgPP#p%>Ek6D%k%asrUQ^z&XEaTt@E5}#rvjp2f@&G!K3aXkShV*fQFOCFW9}?0&l)N`>tC;)hK_f=ZarSzJd}ar zSP@5!Vvi$of;Y3TvkmG}?eieGCBkV661;cFTPZ2EUh2H%oU|#lJXnJ2{|iizw#52= z1^(;JK`J878g>=vIL60`YB3(Gwr2>m6!n0#Ae<(Scw@BTjx!>e7EFWA>aILr_ZRAm zdnvlNHQ6c4xI0O)7+(_MwDEyL?9A*qGW2eWU&juvPt~_XxWAK5hP4XuMkW| z5MhMJ$RM5T2$s?SG^U6ym_W1GztV(Q)T~YVs+Rt1KX;C|Nw5@DiVY1;CuRigZ7{^j zfT-7)Fq$=DehxObb-TT>t6=j}!kPOq?k(~w#xn%ugOBgTS*CnydkW8ErX7>CJbsja zYHl`Pj<}|7HeWQiQzPWv(NOsp@x{;5rys??eB0bf>vjjR5RiIO?IiA&_SIfdE7h~; z3AAHI8KkgqmRJ$h%u1&m#aS29Us%7rer?TnT)lp+I@jr~!BR>k!nVrJSm;Ju;I{(5 zvlvSe7D#%dg)z)98MMJ^9e_AS38<`-)vqi@pLA;d!VY9wyl3f_>VxLk z7(rwFo`}?((S#GgL{mdH3%Gk|&B+7Fr>D2(ezE+<*52ID(r!C_^6bgKdFI74Cr>|E zMi}e2jecq=B!DR9LJLVS4{1_OS?>dOHb|b;9C>xA59jM{H2!AB;z7o|#S`@S<(u0H z>6Kz>1aT-xsgxh}y;=MvE!K(~lr`#es_vQo`bV9W)Ua8YF=5zR(<~v0j3U(MF||y*k|;_)d4M_Hp={BlAwzd*H)c)8Q`G!e~gC zqD%>kkYN}FE-*+YJX^c;}H%vp(8_z$5SbjSSl8zoTJV_rN=_ zU5`q2+shz7@8d z(F_#nps6-NIqg}{O6Z^zAWv;pBzvLPUs+v%PHIR^Yv#?jo0x+(!8QSwLn^ro1PhJ5 z#xzKbj1K7(rjS{?QTPA-`#0}@egFFX|M>pz?*FkGeR|{m*WbT$|I_rsu@lh$nf=De zmrp*`^2+SP800`zs82DwH8v42B9Ew&F-M}>^O!XOWsp^mdcLzd`0jGmTk_vs?#3^N z4h)W+=&U``kfx2Q4=}3U5%FSOv`#t8z1JLj#L~JaW-(hgl8CHf#^%oON;S#G)ZA*m zs+!-XTP@A!>1NBr7w-%&53j_R?=+t^U$r!%b2K4aiesrFa={2h_llyYl`)3m2(WcH zAd7LbcQ`z#G0hZDi)C0-M=b*;$Uo7=tBJd*wn1o_nr{ahh^$6qk8}GZ%X2eRutj z)lz@`qwntY)&?tUy|HxX@Wn7kSRMB;@3SN9r5Y)i@d&K8F6L+22*aE+G9ZP7&RX$& z4wfPQ)Y+T{Y5GPTM{NydD=+Yv@QRV-3LA$t)q+WmJPurVhpm>3Wc811zZa!3wpep0 zjY%7^?y|Qx26M5>DM_R>SaD2c2r+Q+QT03$4CirYywd9~MD6d+nBS7|ffdJ5+k4(R z>hnN!#VBfItfo?Os~u9thg77Ko-jtTa@l8k%XN2T#yVyOkSeXqpd-Rwm=ENH^h&W* zjC0Mw5sSGYN)WKf5Go8ZA#1|&Oth>6-|xdpJAt>auE?bPO7Vn{=)_`jZ?WS5Ryjkt z;?$!6SvB-!=)mh~oul?++ib08Kb)R@7gpOXSeGiFK{}Wqh{Msfdki>GK+!dDMp#yD zskt${ng+->%U^BXa*m?FDbSRvixmnK^V}DaJ=jx<}`3=Ff5Odn*v7n&E_CK{`s26V3$`ED<3MIwGCd zxqBs%794-U52C=HiN0&853tgym#WvmK)3q99g{qEQ2eRUT4J=gXB$KJK|#&IR*ztZqa62MxY`(+;j zQ?_Dzb%i8nk-P}!Dz-H2(ay!YauC3l?6sjd+1*@$O|pS@vsoC~Ad+QWEL+k8tygOJ zCOs5^1(Tk(^<7&*}QA>r|an_0<#7fKco$;pLkU;ud@1+cfZZ zYABNTbT^cBV_oqKQ${2YI2cZa5%BaQiM+BZYb|o2_x1Tu4a#a7;dT4mZ}8ktO0OxH zf=9)Jj!Xm}4NqH?vL=VLl4RNN2Y-Fx!S(-maN(=}{q3#)x&F)N-Y}Ov?3*EXhJnam ztC)sMQ)SUAG8-`tN`ua5uZ5M2Nr8peS*7H!fel)|)G=%DGOmEig8 zH$z|St1G9EKV#tmYgJPT;8~<@&)+NEG7Asu9Md@$9iD+jQymE$TLGRZC(;F^z3>Ei z92i4HW-Vf_Z6MO$l^7GkWHXj+xu8B-;45~$Fpl&Wt*Kd!W7go_R4*fT*jW-CPh3ja z2B)lfGtaeh4D?J}M!jc@I|+8{!L=nPxDBP*6mQBT5rjdMI!V9da5t=&U=OK(Ch|uJq;OCtM zHk~l$t)nw~IXoKal-Gfq7}DiAtv3+rR}_1Q`NB(Pym|RxpyDIsQ)T z_%(6-rc1FYxZFEOT=aGMo<-O=!HM@CGwrkLhECOkGAAAntHpLR6kOAU*c4hJEJw;% zOsM8081UFo2%adFNy)y@xqb6=uUqUZ&Cr*j|2SQEP*z|6Q*k)-AK9E~kWVfH$+jcf zWS-tUl5MI7(lAV=#lj*+g&By`2 zv4(O_G&YntO$=BLDI#G=r;G)kwZwP-%&+gCy>$P~=l9Qk`ryNh5B~O(2mgHIrB_dw zr&H@UmiPN|eZ}-|)0f%1aCBks!hwYut4gx2Bg1WwI;M)xM!Bg1I^j}v?$yAQRdMw6=_*u9p%R$OJQdCn!6b?_t7!18&aQps;Kyb%HTxOB(H-N=hFV@XuxBDz)O!6np`0jdT)cZ6qD) zc9uV@rciyXg1k<53)!P*F*rW)j>2}U zARc#&2jU>^F_DSrAV#Oo2%eSAW8sRa{sZ)?-$FU>e(t378iN_Y-_lYsDvb#ao=pQ$ z67mi^oHa`yGN*>7I8Y9YH_9rJ0?ne`rD>gFrxdmyJp9%hZyi|Jm(!?tJ9F=Yd*|+bSlqpI_jmU`y!Y|l-#zTX^qYGh-n|Ha zIeYJ1+b(NsOxAOt)l{qiYSh;@Zlb2q7 za@aRz$lf@-XV2bNUFKDnsmL_d7fmF#m?DcDb($)XxH>pDT4SGOvq`r_!FoeiM z2ddjU{{8)7$%bBku{`x`QKs5mK9%4nU16!d!lqDtIMm&Ho;*(Jdhp*=<+~5}Z#Hw) z-l=X6hPcai{pnZUK5%gS;=OKXGnl8-UfI8A|L#49|F|(OQF0-v7M2QdS93L1F1e;=NxfR|!!MVc}D=(y042j6RwORR_=AHha zm)g~|n+u!STv#K%rf`CTZUT3ar|AGE*G^y#jynsAX617%e`I{|+Hh%c*eg$iuD$f? zU{=vLO1X18B?T*Q#-A#|#<)h5JUK$WanuJVDPr)J5t_KH*9tA`kO_?EiyGTb&Dph+kbV6lbE*APORQ0s87yC))}iAmvI?bW zjkXoO6REw^MA#Hr<6wTrJ|ap9)`)P5U1YIt>&53MW7W?;#GYRFvT*o~4cJ)KE<(O# zHr4|RPqJXfs$%M)HO0*nXO%V>Nx)4;ii74-5JsHK>#7;cs(*6%d|M~E372?Wc8!6g z+!N`oLlS9fFjqopjiuLGWl`)L4RA@g>)pz9;GHtP<)$`E zY-iJ1K+h@LhPvQWG;XZ4jw{3jk;XYAqVhc0yq&W@|8WSuAI1`_+n9WN8lc&&y2f#C zs&vd^MV$)FD5fm(5=H4WrwCb})xdMNS?rk;)fm(Mwp6;YBxUBqo?!KCDwPSj{Qx&t3*dZ9{FZP2Z8%tW8Ua6M z4Wotz%ajXQj>Ud6glm?={)u|~p)DBR=E^ras9ukDV+EwhFvAGA8G;*1grz8`$f?I9 zE3~dk7BCDYa1KCS!ootSB7yHAryH&r}=gzzjx;*oYKOH3m! zJPF{-=ebVhyFC*+EfeP^W9&8JYYL}yL4%8AHL`-k#3hhdD!AyBQ}bkII8(fSqO{#% z%0leT;)#%T=kOiUZELROwzV>BimgV$VTOqmGAe7VrkZFQQH%j+6;hk(ICx4`w_P&X z#Dh8^yv9(bV1_suQvW4nqj8i`cxfV{Sw80dGq-B$?JM`s{?+|6zy81Xe)HhxAAdKP z)&;A}{MrTl38wW8;clpskt!>KvR;Z9f|Hg?D+CVM^OzTIpD?GoEmPDcow^C(HHI>3 zilPoia4iDjOmOObP@G7Wl`_;1r`=*m#LMub*EVL{#B?!5giT>(UV3H&=g8`)nNCe9 zs8b{|MzVHN$C-zIfA_Py7mIsm?|ppl?A=SnA12PB`foqId;O1Es;I4D_U8kvseUQ! zyta-Y?V}AA=}0-}luBZBmQ!+cSe5VA{KD&JfH9y&BHw=Qtm#`m>0&~9O|cAII3a_S zj2j3UoD?>Ag{f8)W$mx_yPfV*w<=9FE&glG{{|bZYsA+S&Io}$6$&PC%{)`aNA6v4 z#5nBjn&j>94O{MvmfIWI?w>pyS873hd30s;`Rduxwb6~$_gBx1uC1O~J-hl-czttp zV{~EkC49eGtiHE;ZgjowRDBZ;PY1$p#pvqjLIHobK}$9Qj2p05}>h3ZL;eqpObx3TMJeaK=OVrklA@ zfAZt;u6_h>ULIX79*r07x<>NLf~LDaH~Oj={TzO&Wqb7@Zb_2xIgjN9sD4)8(_>`w zWcj_9UbV+(So^vGC1KCD_DgkP!K1bxjMJMjoga+^UG2 zBYE^a-K9{K!%p#o(1Qqd_R{{&f;2B8n^H5+<)N$9{9VI~W8|?Crs9OY825GXm-7YZ#siuPKri zF`^VRAz%Zxp5tJGl#VhdbykMO{%)08m@a>6j`x-?&7!^_2+Vx?+6r{GTg%d~mtj*} zJ)weNf`}#30>U;*1CAJ{imI`lw6@qFwWKbpMYsC&>7)Ivvu^uaYZ;0y7a{oJAZ;7^tZKX7QopR! zUmZHKFxY*QIvL*7Q+t}j$s9T1k7v)Hcy)H}*vXmMQ*rdi7zx=3Nw$ng?GO?G8)TWc zh%gLoyx|d~Nu@96dl#KqsEJn7emHwxJ&os8Y{WWO_$YxGGc7m*hH4QU27m}};$OVhv_doXslYZI?r-4cTOq8<)&||0JaQMye*6{Z5 ztKrQ!O>g*zbv3~+!@8+^uM=QHpY9n*kSFY%otXFxCp9>$0UF+#;=_;8LgC zAIz(EJyf(e_0jgW1dh+|Y{WWO_&DH>DkHoGL_4RQpc%UE4XN#Yy*lLeD;2jz44lFJ<_>? zCou`$r14J1_8=j^@tOpSD~S<2DKRpy7Io?R<-KbyH9E0x3TSFJbn^;kgDMrY6fy+7 z5EPrBTQu{WV$Sw-8~)dipPAG){Pm^f;uaiUjDS#3Ql*7e$~a7oHNhjsNzvVU()SwS z``^|Rz8|y0e;y8d%=%wP;t&7-vaS~>RH2S+|0cT z01%#3z;dk9X%#b8wN>}-jg+aBFJB5KLzAT^>NhW8E~-diY(3{52w*g)z!1csv>+gz zHfU<#y8TXZt~9~hcGJqFZDYD|0kaX+hFgRXqY7B=4dY4%bAnI{>6OP6r7^5k)$c62 zVo()lyJgiYFO}mt6_IewgR(yu&~9fIZ1Y0qB5Wmt$a0Dyb{b;`spKjuV`pg+!n57O z=iJ?E7sG|kEH0K++3N=j5==-jcgfxT=%Q+uMPL2j+rKJKbgKE{jrbz~e)vfdPfLZD z?Zam~m)e8y?CwX0?|xXW>vw$Moxd~%@G^nOl`?M~iDl5(086PyaUM);PE3eaNx|Og zr*+oltF=_iTD~N_T>UP#ZHT|DdvtuT*8L(jc39VCqwXcK`hEQ9NHdWg%UB>#&m$Y> zkUq^=M1jIPKq`Ad-s`&ND!BeT8#33ED$9Q%TwmDZtoKhmI{9+}M9-{Ly>F!yeCP9fc)VMo@6LJn=TTUzi(hVUQ2S zO)$|^CGjLq57gngh2`t2t*UChuuS)>_oMVR0-h^|)G1&9vKR{&yh9~%i108KiaAD; zxMF4BsIps4xnlc40=M9bZNNHL_;`G1h>3(y1HiNbLF}M*5~hu!d+_^*??3$D;m;o2 zc=+Li>&1i59=;b|{@sHwcB>~YJTT2b5_{r~1t?d3M35Q4IpbPNAeh01;vhdHyhD;W zH|4rG>5We3l3NR|)`F(j2Un&udM0FUSUOa>QYB+6ePF1BTuLQ{ep)<=^<9U6(Y==k^6DzNO$mpjZFfN=U`2QOHZke!6;jPq(uxmtQlt#8ZU)1h$AhS zz)2lvX6kb75oU37svHJr$8CxpNL)wOE*nShB(iZ+OESlyV-{FUv_}f?xX^q4AJZJ4*>I9qV4(pD+ z@}oCTpBX)Qx6^(eDC5U|bn5u2qp=P>7Z>BLagZBGm1Z6wBelegV#uIPy1yR1`@2V1 zzkBrVt-5OPcl)L`bhquW3>QJ;HjKdpw#eXaF^yKE!JV zdD9Sx{dmW1n?AH@A#+j2&^pNlf(9_gRWOZ&1LHh|h^0+9ZR_Q0Rj+j=Tuy5zq1q$K z_$@}9u3NoKFe!i%A|e@#gFT7#j~!R5&CcuTnT-zX3-LkE&z@^=JmZ(;0s$Qe4kpAFbL0Uq zl4%9G)+l(OW)F`Nn4R1GIRdY}dZF$Dy9u~>ak;=@Ed`LwLW+q+A`X0}G*(Jr#FLsK zuKvenn$fSrlP}lOkvqg!n*<4(Xb)*?m~th_BBPzH!J^KmN1IQVE*nKHJTxLYx+XkDh9ePh6_y82IBni)x79mbbj(6=OqHh7TfV8b zjA;(m9lM?JtIuA{T%^519Q)YBLmPz@vK|qjtmn#$r07+(@7-Dcyc?XkYg1qNISQFJ zu3sjg3`N~0)bOdz(s*pabF z7TNJu3C*$N$q9%ZM+#&{0>_j2fg=lshC$^u1sr%OmGI%g6eqDPySTO?gES1Ts!Yu$0BNcfs%=Oer!+F>6h)t}YI0GWF4VM$nY^ zJ~6!a24Hd}#z2F(4^fE`LMtYLfiAe2RC_~`4A5!S?bu2cPqvs<&_s7XQ6X&KOmH2E zON5M`Xw$vc;IUdZ=?n&zo4^F1;ndLaLAegd51Qax!rz^*41T$DRA{#$Kzt zQEd}+0E|UiV_Vhjqk+zeTc?|G$&?k2h^5%e*rpj1K^$kX`DBnC0ioK%bcwfiKjZaG z^YT`ZPAC(JTz2*HxE0GT$ywkSy)NOC5JKOcUz^3L$P;rA==5C63C55wCpeV)>R zwlb;F$1`xrmKW|Rgq|rbG3A&s2njJXc7bL|o9U;*jb2t|Yh-_QPfE$ItE)+gbDmWN z{1oMEnUf4S0E1R?(kaMM_#qr3k>{1vtZc3meW%N=`%~5K532cI*Ud-e9{aAfV%xRo zp1sv+x5681(N}S7p>DNi$8Eh$ao=1clC#peaw5F((rN`fLJ|qk)VL{yUGSIQ%hIknd8o0qWX*FjWd8 z(Z+Lvmo0UYVXCPRSjG7p&KPK8mo^^EMpEWv_%Fk+qX#woCU{aeR^A(aF}zW%ytnfA z!`sF1zk+}D(aHzIuZG_azughPcQ4KnofdhGb<(#lV7WJi5zG;R7(j$U%OxQSLWq@d zJgri{7ficWUAxpO4;{I*sg8ECqo)a|7uvXf*??-|9Mud`7OQ9hbr@QzA%i}x>CyS% zm#HQwNA6uvkNBC+YuQL<{$c5IQM8s39Do#52R{j00*F?UD(9e0i*ZyLl zzpdOW#Z1q*suvwd*Dua@%do^%VO4Q#P%VUO_Rnl&6JmK;4>X^IlgQPBOqmcE zD@z!_N;!%gmcfJ~;*^XN@se^aPui{-RoJpPS@s92D#NvvV>-FZI$eHHniy@P7Q1;J zb1`NTD+Dy>$Wq7!)L0P>kTqDMq-Me{eBY(%(A)jsH;ixLx(?`Ev6J2iC=^#(cu4_( zTmgy!u}XThhf^g-&+km81U1pY&Sxh|gmW4~7E2B^isNb(MP37F1$H{gJD(q@#j+P$ zOi#(Adt4oCF*11+=v=W24yZHGdnQ9DXebg`bK{`%LWm^qbCk8zR+r219hMl0Gljsk z-*Q90mvt+ciK|4681LdtPo-$k_LxX+j1dSco#b5%e>41Q_&>wn55FCL9WxT&uUsA8 z8r}#mZ>?Nic`rQwX84C<`0L?~l@Fghy*2!D<^8o6pTxAr@XIHMeLB1uUVax2{vdq* zo#7YZ)ZuK?4daQ}Fy1k!bEO(HW*oLIc*vMo3#5oMm9>+K;iRh2)qh|8TawVNu z$c<*f4GiI+(89!IfOLofoTk5LH;oeu(d$oDb#aS%ZqqElGv>KHdo6RZrdAN6W8JZ$ z91*E00xl>x@gyYM3hT>dSlX%|okG{dT$pS#H38iVHZ5Q-qzrR{F?8BvAqjHWJEkRN zLg}?>oqMzq?XeTP-+XrV=*;O0$IiUj5QxXi%Y{y2LNGNtxD?beiL{p1D5$w&Tx@{O zZCI@OSBK7b`kkV)RH?fkyQ*|W6&2zc((>mfym!&rurlrP^73u7 zP~82v?doQ9;rZG*I+u%9(RUZ))r8keE%(MuJAR zQX?QSMLZVrQ<~Ij_^4V?i>i0%NL!EDSHtyi-2=iFN#9o+UA$~0g`}Qy7=AJh4JQ;M z3y>2It&I%WvRtmL=F6pWaZvZMj^$WOgJ(l}uvmd-&dt6)dwS;N){r)?VkWi<2mzT4 zu^@*W*W=Aao#OC7p`>)_*^X{2v(PWjF1WH=E`QTBxbvWbo8}fbFJUgS&{|5J6NCuk z02hE^L^P6s*t9|CPZ+0%j#PU(xpYv4FWp$ILpoRP7@&@7f-pvsgb)lntBCRpD#DXA z${S^OzUBgyO%e7q2HRp=W5e?0!YPP1o+=YmN34{Wgh9xe^o$agq()9(8O*Ex;kl*Y zk#u7v_SE!m`vz@T!)#nVL5cwFqyPfO0e`|;BCw$lCQ*AsG}2!Fw6eX{D@Ax-mDB3z z$=HT?7BIOIqdi2-Ix4ggULwvMm%@<{2`FgAPi?_m6 zw3e?`e>tKVroyvp!jphez8rB2jPgOxh&XZE1`n0FU}yvd+sf%p7<1HY#l(dazFO19hb=TFW<=`peh4J=I&jHeWWG{mH&z zCZHwj_|?n=TLW$Yw}NUO`D=(9j9^O-Aw_qZUEL|>)aW*py z`V)DmtnfIdZwMDE1phM0k877&RjxOsyzL9Q8y_2P#5z~_42DE$NU#IQInM#HQZvgn zHEFSax6`|FvDYfyNcGHA^!BFcjaPZ=ksTw0*Z;F5HP}x;>HO^1=B`z=>c^~draqDH=Hw^w^R7i4os=y zQyYi=6=g3Dh78Y(v&uw|y|bx;XOtdBV(k_lx23rA5y-@JX>3edZIdGQ99ZSb7sDKS z#VLUTL2dt^y=!Z3>$=W=<&0mNbn4E&U*1efl*Q`iq2##ni)ZZ{btDK!0Z4kJC)mu(d59+MbexVSR#e-y9mx+Iy@J%6{cpNAB*y>&f*aZ*35rJ~B#45D!}YDR z*Zo^giWr3w8>m%0%TnEh8{Rc3nbNwv&vO3nmR~WT9!ZMRrU2;!!!dFV3|XOwR(W$C z(5+5y-H(#5mcd+ux;Ij|Y+aBeOF&JBrBqv_(lOEn9&noPHdf=PCs?NS5|}Q~w&c+> z^|^0LzPx<;%;q&-9HC_{Mk+&d}-A%a?w9@fo#zOs9%9+$x)>lvohj z#?K9Sd6Zn>|x}Y!Yo8P8VVl$ zWMP7*N?L<4j;<15#R!3{>fKG~!0mq9wDTgIIJnfFmDAm91Rov}7tK3ca1@W?YT`vFv{K|CnWjkFq34&aTD!82|p^*E2P=~TV> z=q^;(H`bbd2R73@6I8ts_J=2##xzxG_Q(fBQ=!vb_e_6zd|yw>ADozcK0PbEZMc7)_b1!QYEb$HC^4viM(y9gfLuy#TrWUE(W+(=aVD3Ow<0 zg2mK%Yjs4JJF2r9O`*HCQFox*y!6Vgc7R~sCXsRJm4fL!r8)?!NC1Yl^c+dSSl}U( zmh*dBpR=`l^sv7Ebb7VvulJhGW^-f|cRKIt31Smpx^Q)Q_0m$(pLzI_W(c+v{(z(* zRAM2t=8AbQrFYU;0EDxcX0B}X>Mq>$@nmUcz|3F9cyfX`e!0r*ZS4|YDV$V>;1H)6Vc-g^6i9+n z3PH$o(9?37$M5buNStlM4K)9<^XcPv9)Ga&>CXL~hdX~t%W95hnNai~NMd1YdH8oP z6UxM^RJSDK8hgsP*OaSxaxle#U@*+!ti;UVzXqQU{yg}2@L=%y_It;g=5*2h+9S_9 zPr|g?zdP*o0pgfn%hbR%09$A58x9M$eeY94m63gV`$kt)qCy?AFzEU``)G82Tjdczr z=maY@$i~CnWgY7m>h)&h?Q}Jh?LsGY2Som1J|?|VEC~ZDD0U`o-V=;)!Yv4=g<~?S zA+_$h+77enlZ_JS03dRu;I+|x7o;rlGtnrV0&v)xJ=c_AG z^!weOE!*gHOs7h*6k9G0Lh;~b#5pIlc0e$30x^PY7LV*}J?Pp;|8pk|&>ZVYsnJ4! z9F9}w6#|Y}T@SAiFoATj?r9Dx?W1rEEKu;qDJ*zUihG&WxYSv1z8h@bn>eN&F+b=L z^IbR;>xFS#M&B<6`NXDUhR* zx{yz{uQMXMQXGY&P6%fZ#WJGGEVGtc5l9Rxvx3SP-`iT)@>Wz0!IhD5`^tE1kzv23xi`SYi*sc5R2Bdib-b;w3=sIDn zQv?Uh6$?lOZ{jbGfMaTpaVNT<3)+dEF02eR75yNlhaKn^A%O!m+##=|4M6jV$$#X# z{?3N)z_cB%C-p|0C;c-jzEU(9HIh-~Ecez&XuVTZ+vx5RiL>%PE5mkYKaHjLq+*%5 zZFxj+r6}^W&(jBHgY}-JeL=vL4_Z5evwYj9Cfrs{s7_z2Q~A~}-eQl1#&fy|OOch7 zxDap8l>1=u_hX@VTmG>eIOH{r}m zytY+Ge)@R3GzT8dV)e=1BnXQ5#j;JF%HbmtsZ?~wsLCe(p#r5zdj{A zOP5y)okcomqq%Te)8IS-%~X)Xxtgr-ENz;t+odlrhMk%1GVFr7SoMNM0*FKsS>-W8 z8Z###`l^=CMVE`UWQqO@9d?>^`l<1^Ywln+2QFP&dh5*Pi%Tn)rW^*tcP)j)F(Rlk z!h4fw9s>7<3&NO1&gM-If4K8-=gZ+l>cgEsJ^oFVo<4r>@jFjOQL7*9eE9e`J72}e zgPr?7eCd^qBbWd=SN&~WkQ{O@95zYg^qA}7*`sG$xVn7itt+R` zEni%k5}u_CECnx`3IZ`cEF=q&pIoktJr-Z1IkZ&NkL+knhY)r=!u zs(9Agcy1UVC`M-1g5aEMC5Tssj2rgyYtmB8}P~F4-!p8q8$6(&Zm#x9cPa?B6c`>lA5A3nLXwJ ztW>+=C)Z9BVPlvRl?@u>H&Jcea1N z{azKn{O;h7gU<$^ZvSj>Z}3GGU;VSe=Yt2;;9h*mFXMl_xBb(>=M^T5Rq>y`-hRIt z{C@Dy@%i@8)64#C@ayV_$C?In;eGLJy2``FyHvjk7tBf=)f+Rfm_WiI&(g-__{j3) z{{i@Z>Gx)XQ^3|%KHb2UfFaJLqf>NN#zLfS>gv9e4BA2<=1IgK;v zB-gH`D$(fpWP7L{&jiPtGc|7%=TfC(oY)`;3V~XwDFbAp`yhknz~-7OTChfxSI-#ZXZ4v^e)Y_s+;fBXKo|M=|(-~8d*Uwm^vKJI<< z-{1Ve8vU&Ey$u#-8|;YK{b9jn~c+t0)-Bg~2g+#6+Q1)O+Z00m-&6hvZTEpt>ytnr+i=iaz& zdUt#c)%oVpf7rUZ^60&$TQ_g}>$B^Z0u32q+F|a=F{b^cT8w`nR0y4N*3n0#A}yUT zEUEz~d8_Acrb*;>OU<*@lg5Ns3Z+R~L9qyyP(+XviLi%a%P?@0N7Qrl{5-=I!Xz)% z{FKb+q$pTIPtehzRGr;oczv+|D&_bYxEY^my&Hs|(S@G9|D}S5}A`MbbDRU;#i7 zpe#n)noFjrVUI&sJDLA@%`!|^!nGJ(>d-P+auJ2;&7bV5oLxiH|LfnP%}%GAcnrHKmVE-g`0b8OEw;=QzVdP>AQ zytGo>tQQRf$2Wb)cbndN|3+Ok>rHYVCik3fr_`Pq!`;Ev_KSd7MxBbMl>srakh4k9@b5@>ibWNVIvz&rolU`2jE%c{x1-` zdH3rcGAzc{2tqUsUSMODkt}*t8Y?ES)pPEcUZ_;@%Ibv!>Fv3?vO3Kergtla0vn+N z)`S7ViFH&Nu49lxwIL|W$-MzxaL|FeJEXd+k8?hyjkx!TxF^6aRX>8XLt27!CWV`_9&XzI-Km6{G4mt=@}==KF;BWBKNLLV~53Qfjm^*b0M~RNO0U zFyh2B5%PG9&%{8z?spOqs;_!aTUlb-rF-@7L9Js4n@yATc5=<3E~%Q4onR9J zEQM4G<1IEkc<&e%NMQ%@0FPmr%d2t>z8ri#crds>{PU~9$AixXU&QC1kCl@Ttnl0F z%>JDRGZ8A)ALX=-fu6Nia?T-b3Xaj9R*G8&Ir{T=zSsA+UwWn2TKleekj@Cx+vqWOI{7M1!A|Bq9>yQ>` z5^O2sgaPGTbD7oI@ZDrdb;@_3x6z-y{ws}Qsh7zKDVfYSn=>ZCVq86z9t06Co~??4 z<$*GmdV8&)$M~GRuyXY0?2KIx>GBGpSfS?jr?LT|7rM`+mto3i*O@VHpa0a+w#`zN{@DBz3#GB`Eu8Y!{a>B&j4MsSFQ{ zGh`^jRDlPW@tE6#%&U>#tY?oH=3iv*V?*X*Iw6e%~s1F zHt#&u_0H4QSKfRaN2FJZC2Y5;Kos>9}%28$#-oCuM|yb5w##C7Rh%_Y^+i_qLtQ=N9Qu=EiB)dAIvR(*^Wl+ z#`zf)Un!i53Z7{2f}m+7vE>m_js+;kQC60E!OY*e`f>%|+*q2lDYM0Mn`Hr;6)80+(0duaRKP)W< zLzwppF`d;YcK^4ludcqn`o{g6t8d=_ptE}Q{`;%1#c$ug|9`7*><5d9LaCNb+g_z1 zrP&^&Qa$p9G3yC%%SDQ=qVY+)G6U+egU0xz38mWSA)fe-~MfH zes1unL<@6c4*l?`J5Ke^#(|$9JA>2c0BKoObCaOE0jgBHz%Xj0#~3TdEhucL49=Pu z&66zmyhXMRG7KNB)&FEWAP_1x3a($*5G!GDZ|t)=3-h9xG&4 zM1Qu|_Y39<_+GbOAUkgx+M4P>aL-2vCIR~JNhWwR`vK?#85ZNJ6CH~4sWI7ktxR+v zs1!N`3}I(&s}D(w_I&DRa*~Y*@kH8Ie|q-Zi3>AKPe`2AA6beA^Eg_{=-z>J7<-LD zd8yNAFy!sGK5wedb4%T-JKL|Sx#k9=qvfmTxm*+ESB@#g!h5GoFkD!MwRQ2BVP+7? zB9uBAKkrgaW&I4)ZBBPSeEH7R&IwrP&GqkGjraFl{C1rnYf>OTnl$B8qy>GXUv%dJ zF4YR*I0Z%siIEQyEZ(aq{w#pxO6DyF>~@y_v6_v+)zC`HBY(>CZ_`ckE5*}d>KTcr zI>hshHKqm`ErqaFhs+J5vla9Qb7n))I%k%A@0H%vLq#-;m)(`RiJ^%)kQ}9nuDs*D zBgq!)0YlNPVvb-q984i zN{|4KAm(fyD@)4u-Mg0Pe^MSOnYr{r2^kZD1-^BcllO%zJEY zd}X-@g&YtYFv`2+=dJ0c+F#Y+$Jg19DXdy^Ft*8gU3kSvT4t$3X;lCUlo@Jc+^mrT zgJ@R5{ku>9ckK_KuHCx+mv?`&_Ug^Ge|u}~oiCqy`pU(}Yzv;9KD$kpogEof$#W03 zMy6D09CaSM=;@mP6geX>6@Yy-1Vm*i&H1I2T$scHI@C6yrfONXkPb!h8*(eg&;&DyU&{PTZ*zUN22brvV<$Ru1!mBn*n zwM1U~zyyK7twhmr^eXxRdE1iSt;@t8Cnn-{TT;6%X_w6go3*G^uS0OmF^)WFqbLbf zcx|!Lh`2oO$5-7>J&wIJ-|>)MP8x%1!wlSL4YV# zS(A}3rna`))gI@3+&HdGrb6veY4ONEt|QVb#gbZxSC4cSJ8Gl1!jZ#7GU1WTyMpfi z@!P9+Z{EF~7;e9PtDS8l{k~~# z({FF-tqKqu!Yf5mBB^-5@wiiFKnAM4p;9=ofo3I|>dbik!JQX+mwNN24;^21jxEj4 zn*M|Y)G+0%uFZO0-xd?8$*bLCoZYvT15By*C{C@xBI*whAOc821$Q)<;3Yo9_7lAX&L}CuH$SG-n5|BCz$x}<0O&5liIvgC6d*Fc_l3gi|9#~-15$ZLuI5?7w zZtx;e`uQC$?p3K+*GQ1RcNgS|ndv9Ax%c@C6bo?yUzk4g!n4yC=!DC!{_s*{z^B;- z6oMf}31pRI6oFt=p}a!57)GpFd!?G&`Qen<1N@RPMGUgHWmP?2ssbvmj z_06ojzjABk^HjKR=iUyE5gtLMR7X+=1?JdFt$pxH8%h-S1S^gqD_^l-`n|ad7OQV= z%q7b9aq{f;%x}{%GeLx8#&b|KSPA_y8FGA-9VeBcTs=c_j1l%p&rsJNS&9eq1d~KGfjp85833=r zV@(ZGSzHA_TdMpI%R`#>T(;|1w%DFFD!)=Zx#31z|}Y&ILudB55|qJK&B5 zAF_`6oLR6v|IJrv$4oV8%Bnr?+Z^|C36_FtwdBGQqy?8&FvJiJS}-C!%>(sZj3j5` zVTJDG3eV8i4VnD61Hm(Op!~Nn36^5&5OMKT8XZ(18YBxbX3}1IY%Iyabf$Ob-QN78 z%u`c~TARrmhjX*=O40OSJ)xQrD*OnF{9<@Eg2simq5X1zytp=oD%+hjbs9y3Xb#n^hP z48)7LCXojQKtMUKC1FzRFm)+Y0M$4JvUjP=nSa=uwnj1`hXA!eO23&tyA&5DY1$lZ zHRl$&G;`~KP>LxDc>|f>fA-#AuKxSl>%Uri?bScs{^g#N4v3nR0w0lG9{Hzu5-z36 zB4oU;oikDf3c*CHEQrOB!eN|MMx8OP=9D!ZAHPj3vrT+MEkEy;j`n0Zmg1|0-~u5h zoX|LMz{CfKHR7I-tc`UKuD|`@`Wp|f-F$HEe;!=_mNy(RqdYXbNId;aoIetP!#;WzL1=63^S`fER#IXQFeWPH?8TwZ!}IoJe}OLg1{9z6r$t3LThLh7dxHQjAmK zeAY#`*qiOmn`$s=n!0sBw<+|F2(J`MBLmky9zBIUBEfSP0@F-*9lg-JEhoz#y^_jV z?Ogm$*PCnzt{6qfwIEhG>s6w=RGxZ8I06(N<|Pj4q|I^DudIbArRGa{59V#^R@qZ0 zpRWmIPEIhaL(f_Yr&B7imUM)jN%hZUBdXu|SVeD#-7C;y1+*%kp0=Uvd8j2HpB zRPDgh;4Nn^-Ue0(Y@AThMbicoouzhnfBEfO-(J7__1)jy{d#ZM3WxfHk*X8WO-s*) z`i-{#!;eMxUOajJ^o#r6Gg#UrJcetrrunF7m^da}z}RYytiSuu*T4Vg zn|sgM&$a^V$LPo82kS#{l&VG=6HZ?wc*KN^UW|4IafhNE%39uZ7A~3ju|dNl?2hhW ztL3`r3Q=@82KGWQho}wlizc3mK!i}9h^(}B)i-zksqF;bRe(4wyHX&D@YrdkC_*lJ zpwep&USkwkKv{c(A9cuejxQ}-Tf%Cvx`9%M6^Uz+GH~?qCrTzdtlgp&c#XEB~yHi?9$?kEoE`0Y(G`O&kLs9O6NyO-AGp zcM%Y>|Lp@4={nPc6@zAl#!N=jns_>WbeKcn91CwB?L*j>h`V>iEZC~$;x5X$PnKdS zxHx*u0do`YPRFEGX&)qI0W3#((*ZMP-n?{WyKRvBG%$MLP3(yDO0guKGb|}5IA|wW z;^VeKN#h8DEG$p=r+(N#HWy=VSm@35<1@t9&wx)4U3C^scj{3QZ($35rD*X`y=|z8 ze0^xZ5Y?jwPu!3{CVr)b+VHPic074D^5Aq<>=@HhEo9L_Qw;mGY*I18q<6$yXX5X$ zEN6VqEI^DZQ%pG&k{`+3;Fla*aGW+MQykcH* z50@>DGXl0T!?tzgQTdhP$_nTz&KY z2c7%BjxSzaeRK7-`0e{oJ#99cS07JmX!^zJV~vTSG)JPR$Pw{`@)G^qgH)ioY2^M1-LnKd;1L~v?(oz(JOMQg~$sG*`9JgQSq!l&@2z~c^6AQF_kLa%p1xf9xD#J~ zw(|A8>nk_Yvci?y@kc8+R=!&KqW%-N>Y~)_UY86bo+N43fhZZ$njiZBXx6ULE7dz^ z4VOY$W`YO6$^{>fJ_XRyv7KEGdzIkIx*X2Fu>W0u=TDxvP!BmyPq-P<1D1l9IBT&Z zUV2AOydJDH2w|rk*Lf_KQM>*S_3N{h+xM;}4ckkD(B_P`+2=D6oI;fW>{YPA*rX*i z{tALx#GP>5=go^9>n#pmF{V30bKE8^52pe)H#=;Cx>WV3kx|jCp-Ksgs4zOX=+IgU zE@aK49W#Avd~eWFG9L^|=1q7M>qo#`6N;2IK@qDMGtx;g(KQZP1R6gSeMT2Np05^q z{i!oBScIm9nFJwHuTuVh_O7fsuH!oYm0NsDQbwuw<&7IGQe32vlv1S^)#;7A!r%^T z21AE@;v&a(tR$wBvSZ11M8{Q$sv^sz7HcEtk?LO=G?URB;?tV&+Nt+@sLeP@>7|a-q1yU|h92^TMD4KOCorP8j@f>Iu z@w4_sg$%5vsuj-m$sW=+3QuE<*c4gGXmD7fU?pLOncxM%3<)mS>P*d8!mw`}?eRs{ z`cPXegS66CU+eN==z8~JbuQWX@)HZvSCkXT7FaYR8pl%EmXM z06EW<3L1lQn%X?6o6ArwLZ^7HI9zrXVNYicBl>De*EQxGq7sjEFP@UT zpl}OYHpSW~K_rNnAUe+kiz$H@I^rM0hdiQ$M{%l6vfQWRkMF?w9?W=5whQy-W^9UZ ze2RG*k2hLt$$}LGIUqD>%Td;S@ItITRyf?VLe7zXFHMl+aeDIgShlBfryMy=BH`no=?X@W3dvlv_4N+4s z@)%-5$ar9wQt2^4hR1|agC}`XFT;0+AFW*5*em<@;oaef!+Y`fkA{C)?U!|WYyPxz z3zE7XVcI9vhRkl~HUMktT>(2~eGr~o8I%d3fW4hc|xz@WvMp zufPBGKmYuzx9`q`X1-@GxjD*>9gtuytY(}etK!=-V5wq4QYZ41MTftwmxzB__x(SQ z56GRBpBKa5uUuQXzH&8vnOcLpakMFsCiwQti0?LbzcT@A=vg5NqA(RCVn`{W4L8UO zm4v2!9yMUMtj@#5__|QF$El-DcLXy9YaNdnuqmX(S#VfNg*{V*QXwQaHdWme&)Pv< z>(Lx;cdIhyYQ4%8$9(6CKi~dQS;1`6Xc~g*ER>r15>2!*OkxfaBWsk4pGvL}(VAuX z(#g_9zpf4(?9K}CPe3a0o$;C?$rF3MG&~LbQbn9&!cv0}^D&~$RS8MVQZpL+y?-N3 z<|$f_bW_I@(mEw6@!DF@1h{ocEfEZ8$ZPySFTUo3YgPF=bc^HN)`M${ur^2lBXd0C zN6;~zBm0C}EH6*VF=$iN0Z}EKMwW2QJr9a_71L;hf#|H`=2Cm1rf!(=Up&Fs=Q`sx zhSC$nMF7c|b(UFfVlv82612%9jyu!=Q$leTdhYV;H8tU^8~+62nB%P26x*2QdEu~= zjxnwS)l?8h9Ysd@tUlS1_F@bHe&nIGbfIwnd-XSmdflbOl;CF?RNGz+nrzF)STjzM z)s71(ISTTCOSdZMSP;uztw7A>MmXCzgL`V$F%jpLEGKSq2S0sA4+2wGoJhP zoU&u_Zt90gv>*^_7-l3ej~%Cs62MOBJlXccz0M*$cPd6NX-4ERQHoL0ahix_3CShb z*^yG@QzF-SMt9FPDRahP(bzu#II~nUqK&eaOYaQQRL4j%kJWUkCO~dMS^4S*Md<&r z(*@}G)o+Z9>g>rQYr13K+~U>N5HtfgTT3OEJZ7B828rX<2YEfall{B>KVR}K zSN8v0q?@?c>Ga=ALN4Wun|xdM$V5vv!&xJQ1!ct9KoXr1!PEoSNx;l7gR>eK7av^v z@*jHR$_Uf_tWCjo*Qo6p14%ds#6(On9r6SRZn*3)l%Rj#U=Jl;>7?gwfLs>17x*BDB}h|xG^ zXoxuCu?7zoTjq^0S(~=Qdn?xy8_AvFM=RIUs9rI=pZH4Bh|BQa@beju#1sX3SztAG zDMzIYJO~k^cPpjTF(OP1RZjCPDv}r49oPRuRnB6*C!6YDXTGLr@`RgLpgC|Wkib$> zCB3Gexh$%N-uV$V^;w{|mk*c8^9JjHZt8X_wXqZ@0Wil-pkOhLE@!wDc>|57%k%wr zJ6oM0VpYy^Hn+M_w0hKfjj>d~H4VrG=Od)pXrKlNQ!y>biZRZ1O#CbHFFts)^qmTd zW9?1~e-`%ac{0-6Nd2n#k=NWnbS`m|>=osJ-PZ!x+;tjzwZXv$;~<96$g!B~#!o1Q zV3o`&be;AW`?p%ElE0O@)J|(a!-V7Q*U%iA}-<%?&IKY#r6p_3U6_BGQrL@`xWoh5`w zA5*3f6LD=^BIdKeeAa@{;a+DUiO2pBy6wqeCN={#o0Qnt1z&Hy#&}Y!lGeJzC?E=y zbH%JONuMLH8M1tJ@X_+M!TseQ5AF;;9o!z=U4C=JI`q@2sXTvXe*VNP=h^Po&jfs$ z`i?Nf#)pGx&WH{1e2)PKM3*ws`K*rUx#-Q^xuSi(I0B_@cl)0twaNnr-Ha(=Tc^SV zJ2u7G03rYgJjE6y7*1IHN~0J{LRKODrJnCBwTmSIG zKk|Zqcl_M3qsPx4IeF;#sYGx$DYhGdqp5FL0@@I71?L1);axoAC1Q%8kjHA8F144S z)&FC6DGgY4YYp>_?sQipbsCJw zWm;5K3AU95LJg_mm`BVjCl}EdJ21|Lf-e-F)}! zyTAVC+P{7M_J15Wc;&)VF2*GOr!7a_W^!C35A8TinmURWm{Av~lYuA3CQY4y03cY% z6F^*@wz>Bm*-w$^fQENxBT-W~6153PO5TA!8^`j9!EY}A6NQVMR#{7arc+=WU_r{LDkfw6a}Ic za!hf{iLy44sX9j;u_S92?s#Xe-knR!b5I=r@{1&F5T8AyDrljmhpY>(&gK0$dKEN7$EYl@{4 z%tZW@vm6tiRAP}M701cL8Ri?hVdFz{Byz%wVezW5(sr?n}=3j&B z5ozuqHZgr#BON8d+IS0UEiB>$nXG$ozSrr0a4}}~MgOxp&|2G|8-uB)DYTi26M@xJ zAkTE^Cx6>xoDmx%YdrN*SV|3%k{}ld4FY-W1<6{nKHDjalTa3V@?8tCFy-^mzX+m%amtQi}k%VQGD zgi!<~RzNT!7#<&1$Bc?6Zr;pAS+!HPeYOWz%2xjml^etCGRhdPYF?K~b=i?py{c;; z&wNJXdqb+RIUG$rg%EEri$}Lpl#tp@sMH2HWjt#c;^FlVl6dF!55M~H?XQ0M=3dul zP1_i1I?k!7Da&mFabwrB*aq(fkLj9-`I;lf3F(4UOl0Zf4BuY))$q>Buaa7EZ{aDs z+?EaJ`pk<6O@*)2>#1Z68_lk0u&&3Ysh?0R1Jgtb4pd^tATSQWqj+rLtjlb0bMQgZ zOfLpM9elWaEq?M>gI^AAFTXMPbnw|Kg}`6W1n;L|mopowrar|G*NVq57?5*V5zDa# z=8%oIU*24DxzK4>{dcc)7cP%0>rOWw(@V}297AwDak zc~tALGePD?wIcg;^q3={Ml+E{)GWhN1?m~`MDTd%W17Xs@=AN5^h@RI?e2HfVAX?P zcZ)N=Tfd`)JS;h&9ux+%hg)*dyMad!J-`KvQ4k6b0ltPDAhzV_Kw) z5(q*(iBwiAdF|~z_@@er&bOMP#VhgsSFre4@p=S$DeCpaNqxhSN*hamnM}vF`Cdr9 zbAV~;JwkCOC@~;3QWyszF<1i3(#-kE6J=RJRV+Z&g=z`9a0yzi_zj9!5rVezT=EOT`fP8p=<;L*# z@blp(X>_m{zBT-4csGd}?9ROZ{$fYXocGTFstZGP8vp?5J6*2(f0a& zVpGHILf`M)k=^h6{qX2(452YSzx3vs0;iG09AONC0(Ue}>A-+-@p`dYBl?5i4gR!z zWBF%;yT#x?2X_YlGx&V<%v!z{&#E_yx<>P9G5FV2X3k>p+xW)^@r(BccV`8*X-J3~ zBiPgjjWSFs#efKFHNjk2W0{E$7-yN=;NM2zFZ8~=7en$xp;L|*wwgt=lY5Gr8?q_N z-bxqZztv)6mE%5W!WT@R)y5KuiF`r)9PlzKP zz3r#psT;%V^8EaZ^$gMcn0Vr`cia?O&M=c&I-;y#$YAecm?1Q$mY}RI-QV`SuZmO9 zb915pam$Ucy6nAxVWd2#=$2jLskx|jE)W@uc2ge|%76}*Xr?6t$`~lH2n9u?$m;67 z+OB+2`QB0@m)vltj27E#QIv^1tve6t)Kpxb3cu$DAewrH)iNeOR2anqB0ys_qN&qV zO9ELH)|H>cWI83(pVo_$_hvh-Q&c<~3r=H~0j&&XSa3-NaUOFcxW>jqJX>;HW}&_0 z%1gZm*E*&D@>Xvg_45qbEyx1L*{~_F9w!uq)RytUBD9VxWh_V&^3H;Vc05qOe51Qi z`WfHR6FjaP?bi@cNd%xkQbp1REWFc-2TrL`im!?|Zx(4dZ25XIxHDOUga zUiuI3)YYv|QVA>dRnoWWD%k25vliI2ob^u;&!)af!BcA;$3ZA1w4n-9W^BymFwUAK zJL50*KdXOmJ$Pa}{aeWriG%T6x!CT^o%G!#PBBq)hSXC!|IgmlG)H+P>A%v!d6}*6 zj~fDPj2AEg_I#X(tg0+{MXTG>A7D7yp7HL4V@?|z8?n2WC1N6Gy|FV3_RRR(K44!P zal_aBC0o_9p(V9i)s!W*%zHo*NOZrdCo3y6EAx3?kRi6>qGjp2R@;D6f#q&=WmVQd zwu%YwU2YMDA{%&PJZw&0MeIUv)U@3e&r_n@y@a)>O3O9)6zQQ2k_gLKw7`XRLYbm6 z)wEdt@ZPg(`SI06ZcVVj1n1ygZG#>ROa28_pp>ZKwXizs=nS}`nXB`|E_8kYH{5@``%+3X@ zMbt2`(mEwPGeA56O(Nx%Xs2xvqPLp#O2eC@bl~0E>x9W*n#HpAGsK$Por&!RojoDBpPQ?K@?tyJTnqp-~?sU{8 zML}!@gj-k3;p~A=wcR*x9d(&%o@lQ$my~!zoD@)|zus%E8=f1A?-ONv<6a z&KY2AOF?@HO;$QhBn~@;oPR}o`rO$A(d9dT^|fm}<>c4swY3YEUs=1x=iI_h-@Fo; z6z3~p(kYA4cywOsOax`T4AE#+w%7a?b6M}iDcpry>pS<+;oGr%wQ!0MGh1q8QYpuy z)P^ZfAz*SaMYmS3!khiMl5A~6w(y$Z>9W-#sDNkLOv%%iRG1iq4vIT#B-KUwU3v5v zU@*iJr+RJNb-aDY;*N>!NLL#k5@a3~kthTasG>81cp8&~DysQhy*Ylf*B_2LXZssX zZ{MLTZKizpN5w+2l5S-F64oMXEf~*a)Y=4|2QpHCEnLd)9N;oTcOE+Dd&6-TyZu4u zT4l5+!a~A65*?#U;arrS z!Eq*LHq;!p2=??XYw-xqQfZ@%UdI65AX?5OL#3gN=yG^_%KG|;UKrk-xsYiO^&fo` zmyR#(LZs40EDMaKgfFu>Ng+8)n-z^GTr(?*`jR$a(D#{|rnQjcANIYm-|hb_)U~E3 zt%x+HkK6&b$v+Xn1*Mco;6<7YSH~e|ue}AKfK*39^s(}Fwr5LMi=vXm=oHQoj*cf6 zVz~%{YmLO&qB_n9dUvPPjXPS(+8tS-#y+!lwLofyxe`YrL@lWgH0?zvv~)VeqPes5 zp}C7En`1pd-CEuLrNeDN*P5NxjwBlc9h3}#25TTtBo?$Po8RC3!{%3;pKpGa{$#eP zzdU~D@$WZ3d;G7R&9Acd^y9bFw?Ewc$i`VmKE)lCm6A4!tn9CoA)}Y;|vG3d~2h^~C?%J8x-k4Lv%Wqf>h6l$4M?p~$%~XtnIY$HIGO8sd zH>Lt$hdzP72gBVjj=u8x^4V*I&Xe584_6DEKq;(6XBgM01y^Xb!>qxzKJgOI2)`(8mu2zN-pg2vuv8JLArX0GQlsSQ(IWAYNLfZ>cnLNd zm(|=CwbEKL9eR2}(&h4c*X-ieA{l@<48c+!^4%7CjV$d`$0#o=hHUhEqlX{#9)56r z(Ci+ec}kq|lx4I;tTX*E&)VMP!0$SbJ#og)B543m0H`p; zXL^KV+<<*`Z8eT-Iq$g64_67C7Z9`%GSaLvOh8AKTtIH0M`DYd`MCl1AnfDJwV3Yc zmXl=1Mx0%|S|oLlE>Dh!D6FEntP!=_1E(FPR zq%j$)kqko$k=Zdm4KJ*~R!pZMH}g)z3-!A(FyvgM4atKwf)h`W85d1-T$T+6KzFMm z^<`VndyWe2_SLHelPm3l5iv!i$XJZ&D-1OK)mi0_arfore)mofhbaf#do!+z=-SM) z*1~C=%O!T^821sS_bx@Q+)E~+EbGTecD9bWKcw?ItPfiS&FARIn7f3v$hr^%q>xov z?$f6{$P=BBz;y7YXdLU|p9Z-k;unyr33ZZ)HU-%|kM(TrYH`eTncjy?m?@1WLXtq0 z_e=#*hGSN;di+jqz@OgH-9NPJ)7eUu$*C$`WG6F~s{McXM=`1^FTH;L%CRj|z5JYI zs=4M+Yor)7Cdond3s$* z34vs3MGQy)c{;45=S7TDZUDok`vYNVOZoa7N&B27tc5j`Raoz{Tt%=}fgjJj355@-0R8~()~t?w=Z8MoJf;Pr|79y=+JmD5IwOX5G8aG1<>R#ldmUV zOg{ZyiR;1S%SXR&wbNFm_h(OZs_jO2%_NdMG3Ka1?=_JrY6woSBD)zv_ZEcy0H+%A z?R3#GH^Y60+_r;VYkrJm5exLey5zp3cQFLw4M+;EhztS!I6qL!C|~1U<}PA2wCRtc zo=TbyrD&)yO67ye2OViq>hb5zziocGdB3yy?e}G1XdmIzE-Z;WS&j3|$@&PLPAuev_yq?h^T-Z(Vr?Z(r0>UK}Q*-wwK z_5SM(j?(*u=2jDKL${f}-1%${P3IzRxIxp2<6n0|e)jIko41?cDF3&g%{Z<-TMXyf z>r7qZr?(!}Hbyx*%9#b0i3+u26l`V>lR+0X4_tZpr@p^2>ZD)%+~DB{&2>C+>N@Oo zz-W;(-f*|l z^m|LwKV7|AEN!6H2b=JWlxe0+LK6*uHQdP(ET8<(ckg}oPv8CS$%F6SfAT@+$$x$K z{&&B9^2hYo-#z*0#3}e8`uMTZ;I%7jrx!9yXR|RU4_?=PHO!{0ezHGEwRQwl3L1@( z#ATgBZ@nX0Y7T^|q6%v|%1&eVn|tfyHWglpdi-`gs_jD&>#0S{la)9gh#(9y^+x_q zkzo0^Uo~#LrD(i+ig0F@H*=|+WNjn;PKEOA>sO7Z73mkG#G@DB!7J;)rvSiY7qH|t z>d{Ei%)ds}%pSCU@TE7N))!_{k?9-PqT-}9S{q;r149(T5-P1>TFY3}9CjLpH*Pi? zP3NUs=^dvUxWivBIBWS-F>)1HP{cIdn{(&9u4?> zL$&<0pgsJKlllAYmutK9x_2b;DVCd4fBaE5=cTnXb9UtP(W-G%l=>h8!L)xBQ_8Xg4{~9oVM_QSFPyTWi+7;60fWCkJsxZv z@9Wy_9ZGo+zhsou%^V@J{s0l2M=2%sDch17A#GeukkOE$zoHBIXHAM%2d-I9hIC`k9>Ax3 zlx+=rJH!6&6|BZJhI9sc9kMR3^p1ywub@2hLKc;+(<8#IX;JOQ;MfKPD}QjWK$@@( z=vuRrglkK^2!=(^MNAn2RUT1W!HNXBCSOdxp8Rd{AbtL@9sgZDYgvF#we4ue0upZp z@RZ4zXn+x=K}m*1y1>7>5$+7r(U>LYI&U`E!%+tZO}E<&hX4Z{oj4Vnqwm64jkBrz zf~9O(YtdIqqXk6>W5NPh6@+n`C?lg^^4{f$WPIkwjz7P2^y6zON4Ykoid&l#MCJ#q z1y9o`1dm4B6m@7xQAZ8{K8Kd7sI4 zPpKy=PYZFUoMT1#z_|fzQ7bPJ)ogjG_u{2~ws^Hjf)J<;6)qYfw6L6Vp4_RjUW%gQ zbky%%-=gMiDOH!AirBVz)lf#Tn1Uka3{slw<(WIBSQF`|_mEaaB5s7w*r$gAVt^-;6#h6+EAM#T zT3AgCTpFq(1xh24OnMJ0vXuUmvEN+;591lKp<}uC+bn!Pzw!*`T8pz@D-M};L|QGi zCDYu^a}U1E;$|daU&fFhu@j*4>iBwp*nN2KRs*|e7-xBYw?w8E4O7mv;bl3hL+E+^ z$=v0YK~rl%z>PshxEEd#8?B{+8|`!DMi$LdP5xu@;L-beX1z1{m&wP|qT*+d-bw%X z+sXe<9(2;Dj~~6;nf&wQ>qqZ>Kji*S{?4O!52qB|a-AHK!PZ(rttmSa9E$;DFjS^U zN@)ffgUtz6Q6zp527|u;yAF02^Wf)ZaQ?z*i!XDoZCk%;JZaPv49krOD1{D0L>YMG zocp3w`Aql!*}InCHm~gduMpmJGn(A@ql7GWu}PForX#8Zk1W{6@HZy_uV(N<@*x-~oP zr4F=f8m0X`3a2~zJOvr8J>n~e(DUdCZKRUij z($D6l_npYS0xU%|FrtKYLdNKjaA{O@h-h-@iO&lRFI2wO>2~{R@6`FFF*}~7Ym_-3 z(Y*pJM3i7c0%4#@P|Db#x$?r|v@4#7EbsQl=I2YBpGTYDXl;J8d2hqFT(x=c-1%xu zac`$gJ1v8%c`nfyIhJC~jWGnGJH%Ox%V|8tUOFL=qZYF2e3zg~e1m?B1)eT1H~+lu zimntz;YdJ|=;+L91C9yAeW2J`$@3cLUb}wzl`~k|8>S^2z5MRUcUCH6>9LWFrX^Gk zjE%9r@WLyKu(q`|>~xp@G!YT`Zg06-+mjHAPx3T}$!l_-5e`XuhSmBRjwJM*xBA9g zPqR_!`QmSASGRWj%cDGNcdgTnZ*k6a+|8FRUYx&vaenamyPeiiP)z^rr7IV&T)24s zXT{KH4j8OcMyeRvDVx~KZ4BYltXURQY2sAwjhG@CHe)im9b;2@FOV6_yO{^RM91B7^Z*)M^i!2m(x$*xdK1l5Nzl$Hgc=T6|?JpXSzZf6fO^e0im;N(; z=`XhLr;m-avhLCC_&>f)pU&1Z%<62V>lvPf3KpLz8E6K3JASOL4~l3MncDmxuym@iDeaBgsu(gxRXh=5M=|Z@2vb`SO{(OJ;WGkYdkX ztV@-T3N3J8peglCg2o;!bt-;pXjYPH`;+K!eZBoz^sSOVcJJKzZvVNs;={&khZbx~ zjMoHC^C)ymb%qfRQUptYFvAH|N~#!7I!`ppV&na@o4vK0jfJXZe0LohRpT-&_1m3y z_xHdL5;yBKJcjeyeWs4M`B`wskB6mHYou|6vxtn8&Ps#?7)FpX%wRU*8azzWX~*L@ zyr1J5yvxVJQFLSR`iKH?da+U<6b5SuSWB%lMjOv4RwO!_mWQlE&DGLE#l6DHXw#;Shra;1Nt3VoWF@f{XI_;Xd2?udVwJ-=D3JI$d7g2wX~a z1t9GtO#Jy^C5{h_=OUg`${EUvGPeIAIuTzzdVl-N; zoz5H_U1zmw$Cn-4H9tF>UIGHNl@Pc}7lTj? zJ7S#7Bcq>hM-ZFqRd1k5KJ_MIf^5T(_)5{l2uZA%72p`F=YFKeI#|X6&+1xU?6siR zxB}hYGPGLbd%~1ROysi!(!Sw>{W2`Zl`AcYr-6EdETx2!=#68O_O#i_QnM$7+UV5m zl}pFHS!e$8wM+BwkP(^M^xCDk5N#P~ESVE7SSmF4foU0nb0VwB=;h7dMftn`dGGHQ zH#$|<|H)uG`79!T=BGH9i{=1aiuJ`?B^@&ikj0KOn)W4uAzTHNmA6@Jz6-A3J$L@+ zGk5$kq_1CJTv)t1e>uZ24+yUmNs0~QmN>$#vB*cWs+o-VaumbqEF`--3p?9mXd9;s z$UK*LKyJktN)c~S#voW>J+;D1NXOAY^oFylGaqez`S2H8|B+}G{&wrDt@{suS+n~7 zV(Ytycj`Ys94gt&%=rnK^IV`xHHs<4sF6H++XN*dSE^ztWu!7Lukm7+(f(TJ!R@|l zSDknLN@G5BZ>A>3{XN}=Rds(?KL$sKac3yF~DgmUU!Rsr^n4Y*a!Dr%>};O|0FsudD5 zWdjouBvDTKMAq#sA!%D<7D4wD8`Sje#(c{_-CHuw>pP+5sWV~7_X@ETU89*IHgHd* zA_5uiAYdMd1!uF|_$J%}yJLiU12nQ{5>!+RP}y$VjSPjNId#X3VZ)kbp_uWO+lB`ioR3=&2`7P-6ZOPEcT!4;H}Y&9g1-C{_!qc6v)sDMn|P`PuX*-yW-b`_V2`K%N-e zrPhW~?5UtJws*m6%SGbN$x*TMh=)Z zJURhhD&W#&fmdT$ehHR>YBe=Hx_4Ft=VG`aJ<=uu>K(Oma-MWOho5(E`sk*~3zy$M zgeP6ikrCT6o@tBa)%mBr`~y9e^;;{(&1x5~d!+?&MleI2a>`T8BW#)1f$j7fuX*39 z+Dnbpj@x#<+0fZhTILQGWg*G}Y3BfWp#oDHxZzUqAQhn;qpZP$AMSkk!<~2Y8JDa$o8fhrpWCt7)88P-hMtkK#xpzkW^f~gaAy^Wczn|K-cUI~_B%9X$nq6@;c zRy0`4Em0!v3CDTM-mY!leH>?{g~*L6ZK7MPA9kNKww*g~drytrnT~a)OD*$aom>Sd z)>I>0R95RaF~k^1(?!NmprCk`^?Akj*Q4jYQ^nmM{R~iq=!7yEce6b&l;trk6grZl zwO4?phzi6M<%A;aU39V(rdl!VgY%xC$tK25=wKeO^Z4SJ*yq>|?r`k$>MQTiv^{=b z_>o|3uh2?)grrHA1#*fhgH%vi4aHlZJbZua)4HkscBB6AL1XKadM)Iq58r=o z6jHnTBWt3uv3qN$&ah{IRH{hexFOM*bj%Yjg%gf@gRS6*fH=c5qd#3;KAxe`7?8d5 z%IjC=7q5;u+V!iJLn45)U^EZHdu~`j6i3&e22Hd2*%taYVTeQc^qA{YpUN1JT`7)6 zML!Ea(&@fV?YCNWZxM^>- z$MWlPUKfMLC7}nbz~TS+nW)P3i#HapzYyfQM?tDsy`*-QdK;J_1W0fw24U%i?|CO=j9mQ zfU3RTxa3>D4L@nj_pERCQgGI9+~`(O$nA!M#>@ToGMx2ko82;7%3#oBrSkOpFDK$zv3W9Z-6YDY0(%n{PqiXL>qCf2zJD?*_%uUPA?aZ+2ASssOOFUPc zOM-*rPDi9A1ZpKQ$l@%A=Ry~Hu=(#T59$6}I@6o`X70`*%B9iIEr)iy#Q) z9Vb-d_y7~0H$7bEA0D^LR*i*z)%NjVRO42JtCU?uBRaOG*Ss7k#bSIN=Y}&SS)eRl zCCq_!zyy|ZGZh+I4fc0rjhV>z>)zidqMUl(uH%$D?k3M*Gd;9+OH;;b3 zeQ*1}ch5K7r>(25e>ONf$VE@l9AaKUJMG zKdn|zqHdmEwHOkNycS+FtBs>f3lRd=6m$rA>y92TWrb>BkHzd_Kbz)%{Ji)u(xr+Q z5H^}}?<^HIns~#4j6P=Y-a}UTcfd@&>Ro!9jcc8?eha#3kaDrV)akWgBU!Gc1M9wm z*0dBNtM1EqB99}dgm2~~u8RrFz7ru-tWSWb5E>ywk@cJfh5}MlaISsUXw%lmTVHN{ zy7kT0XU9$~e2ndZ&!d}ssJim$}>JFyiz2U4vbqxcyK~G z>ySafNH9XlJdW$dcCPdfRqh{60Gu?jhnD)I_|-@GjhBaMft`j zJ4WGMs)Uwt90D;IW2uPKiKrns4?+c-)spjDqFQg?CmzO%OM=luHI)oSy%8=L>q8$SuIc32Ci z#F$Pvu`o`e#h80ux zoaPN4R_k*&VCCIZ^*P%!v8OwP$lgFV1V^cMBpM*6jkMIzcp)JleLXPNNgz7Q#7HRvF?Qi4H@3!whdT;yQ zqubkGZ2v!d*Y+D{k>&rD7Vj2yzwE;bCuFif%%B){v`^^NE%{8l+v>J6o2*8{WEe&W zX?B;{m%Yu5hSi7#?UI2E5E6JukoKwFc}t%2k8IWFkaXMacC{7~UFw)*60T_fve9Uh~`wy{DDbhurisa^i`a zKD0UUMmt_gQ7qL%9rcb8DdHC_0tbhcO$=1hIh<7lINI$QcRkyy<2CViyY;t~U+=)` zt`6Ff`e+$-LQW@U81cVYdhy|t7R^n4^s}JG%EYHwk2nzJK}w1dLpCt#ys)5{v3V@S zgWnFm9NZp!H@LO6S#xRr@8HHLyXN38@zM9Tt|ykw!JR{|pl-~t3^VKin3d`oP#g%h z(W1wJI!Of<9xF)|36PcOT2ad7t5@0E$afhIcG8s1w!~ts`43QwLVMb=v zz@6Xly-wd>jS6<6eY0baG|tm8w+9dG2-2l`=aq;X2xFQPAGk(@f^>>nj?FeV+6j#e zN6Zc-GW^D?%P+pU#Po!)aQ%^mctmGAFk!sWT3BL%GHi&$MtTk^%Y<0m=&wgrsYigc z&D^0i_p57%{EG1eYn+L8puw02XE=+8H*-NKn&;v!!A5+~c-HL0nk`V>H>nyt$MM`D zzfwFYpokymf)S;ZWyEl-iBk-iusilkzhj50AA0Uge9NkTxplVJ{duQlyX|i0YHR&6 zthb^S(@!!Cz3yrYE5%yt-Bt=2w5m=k`Z|5zSzmB)wRIt0V!XDIiEw+&(c=@7=cDuP z4&!1bIcKGE=Uy`Fy+Z;#rpjv~c!*~dLsVp$ypJ;{(d#?2(c9>_YErkr$Z{h4`s6>N z|)krk5jxQrYP0#wkNP{buz5d=nAJLKZ3uW6WC%dpyoW=!HiD4!?DuoPD% zOyZScOhoU-V~nC*X&7KYM8gT5Ub=kt{Jc&ttuL(Is-=!NrZ3 zD#yHb6x*z$_2S(xu62AX{vMaR+vWQo|1h?^^~UnzuJYWGq(&OKL>6dfQsan@&dt8^W3(nsF&&_r`AYH6a|4$ycy3NsW6G& zoHJQ|`45%OfA9C)*2)G3zDPPba~(?6Lj*;)*jE+^9Z z^;9`LZPa;VOikvi+fSgSsJm$9W1ieCz@93>r7{$2qg?!w)p1#MF2UOOpY-+_S0=V+ zY@QN;XXvjSmtQHKX==4(DE{@Sv{@jqlp7oEWrVZBb{Fn`)ah3X%WxUeB|RZUI`wOI z1`fJiA}mDJqBN6(S&LPWm{AcJSHP5USl}$4q23tT*=l}idz3aWI?GtVG%iaD+eZYwfip{q#oLgNz36xSzku;i92;v&I5-^n< zQ%nSr-uOJL`eonSuD|S@WCb~`Mnis8#0bvCI>)gmQgDQ=6;bPWK=G!>TF#;rhMJei~zY@52uC zTYYFlYopUztI|-2d!JlN&&FS%T92Q;GRASfBX_$!DOfeR+uT6GjCtDwVpXhT5((~+ z@(d7-Hj)!uV(mS*-sBYnZ1iig{^&hTDV)@}9)aFix;wM=qtYwI(pU(dM+ZeKNl;+g zfe``m^i)>XZMpKj9<(m_ZemjHxA(?V;JOXI8EL;OMzlkMg_t_T7#0EqwN{%nEi4)d zK$(yni7Y?VRjnTkmfh2O=lj&1gUr~t^qv8j-UJggQvx%joc5M$esik#<@x0kU zawkHMORp46E`+C+21B*9!Sd7+XpOMa36?vi^>MStQn&58S73U-%j4?2Q*zAD+V3(d z!eV5d(~fGZw1+gzMpGrhTQ7npStIm@|1rEd{Bro&@Xy1q?r#pi8s4rG)%V}O|Mu`N z^~3S*@8XS=p8jkhzWm$m$39FyF}yRpxuZbh$jEObO};_XR5ey~@T|}*)k}pH*NOky zlBkoya4#HS0mdMOXYbb$3;3wBR+CG8&qA*<#zSYHuAO+n6G*?Gee?MFb3a`^`#0y7 zo*Y#pRl+0JS_-E&*jwk7P%Qp>mJ1{;x118oah5xAck`O>8CY@OfBT~=7@luqCN~DT zFG8g{1j;jS0}8^W$$7*Rix{WWIG#6{YY94ih&tWWEX;Z=j7hE(M)L z(GQJi(li-5tBmYg4}ANi&mKRm8aKmezo$5t>YUX=V}X!!h$)DEs1PDr5`;SI{fr|y z$iC@_qcbO7e|?G_acF3c+Yuu_%vPmk+ra#)L-;YV+-L%s~KkOn9YGQty?)3TZG{Gtl4(80D;$K(nH3 z(Z2OH`Tj^Y?L=C=jo$5}cjHKxDxT7o5K5fqGGGr_Fd3pDOya{fEA#gnw0(cQ>QvB4 zH6YtXAijUns}1K{4Rb>-)4(a!oK%YgJcV5uW2xPTsA#-+U}+e`j8vQ=HA|xjEJVlP zF)b}#I25vl*I&9g!3(NCtrQAd&n=8z5DLHzXBvV^op{bz$Qp%n(XZXTwVgY1(7L-B zdiBk2Yk8wRz0bX|`X(mgrc1LJZ_W|8M6rQE3ZaFzMn@0A&}cQ};BC6={hvc;d+4Iw z)d(`*o8KJpY44O@DWK7cC(LjxgB3uCqZ(snZBRtJtOb1ba@F?JQ|6~@rOwpT^H_A{ zC@RZ%T!?`YYO#~?n?yzeQ!FcP{ovDw?>>C*;jbUuc=-N zKltzTy%oRw^1**S_&k37Q+#cF)pIXE@98>tCZ7J{#l1Z4&jvERdCISfEBRkAV}Zoj`~S&A1VkAc?Z}HE5gdjPJ*dwQ&Hl#U0`+hEp?P zz;N%aWjOi_5lM!H_FSs0TD`mPZg&QB8f#-_Yhy%qg*XNr;;M|UcVJ!{Cy4_Vkcwvj zaFx|n@mjTRq3U%;X0S9!W+OQ!y;3YGQ9?<=0HoX|8Apmy#kjR-rfRl`mz<;Y^U^Nj z%6UmYFO@S~1`*Fc%9sHq5v9@g=gwQoQ?ZO!*@%t z6jaFtAxLoJ13`*LD1+w|dlrPw0(JTB$Gt06T(YgD6kqQ6OTF%{AlhjAsz}wGQ=^|x zYgOww=>j_RTGhG9?mr9a;XM&4))fjG5kR}wkQ zw8`VC-$6$;X%69?9Z6&IE5#Gyk&A>jD2*%BK@ma`Q-pI*^6H6FIehfMzDP4+Yq#vH zqikJhPK$lwwtK)+tTs$>VMy|=Fp}Idq!d_(9MUwe@VMJ{P%H5?R;JU{^fbfFtWoKe zV(A$sE*Qj!(1ZkLxzj{gVd6QRE?@c&)p((S}~@?B%L6YELy)XvbEC_AJ3H)l6=K3M^T9);Pg^ z)KMfDfkgNbPVfNf^B0dl(E5`X-=qRhh_$ARD+Nwy>QoAjO9CbcAe_cO5RG!IvbK~} zXv502YGu1s@RI3~PO zC=JIX2+eHZRK~4d3M()tKs@$Y^bfCA_x|8}D`}*~Y7=gmb!#7&UMZM?T4q&12n3@J zQ${3>t{kQTLl&6JYtX6oVSt(+r+mJGp(C;@#?b_4y%Q2Ut3VS*nbkH(qY=-lEKJj9 z`q8%URgidNU3~1-Zg1V6bhoV0!koE7dm>+`mlz|?l#X5i=ME#B7#f(wS{tS9Ok54M z)ark8;lpvt52f>{=5bm|Jbb%6v-%@T@gO2Z_Z=vTdw!Zqpr~fT85#o3+b7S@_w#Q|x5Gw-R}3XE;k{&tBOL-#(s^(?;JDI4Rvh+xW#W~^C3ey|w@&LG zpBMfghq+Yis8%!}gA;uyp&UEr03+>%7bKt1Np_wD7UQ|?~sC2Mxtu&M^vJ>~`O zA;@x+9rE51LxBh3LcE7;8r2@K$eX$PkEv?o{yX>I9)30a`f1n0?}sbh zXw~U%%qeoal}rd;yk^OPn2LO zu0qGNL3+iwiC!oY479_6GtIon>Un;p>Rqa?RVy&5AZKTh)sdIa&%H-CF1}JUB?Jut zLPC)suBZfUf?!I-!yzm5|4&<+gWH3fgFA_%>lo;+wkvW;qbEBf{=0!GRTd?A3h#Rp zH*v1;o#Qb#^CnW+gl$D?u_jUhv9-A;$CwEe(mESucxG(IG3<*Cgmz! z490RnsZ|I^7l^X)g`k}YTJfxgm$&@)zus=WYa07!Poa+ruNcb2D!W3tm zhb$()m*T?gb?Q%rcI#(x6Yh=D_)VITMQZ2wsIw<~6h`v}%;&=f-cypr7+YomOOL2^ z&LEj$^wAUXSYe+PLVNVi%}3Wie{}tuN7w)J(e+Orz4KkX``imF@Qf{*R~BDid}Z;~ z#XZdrf)b;(oCw*E(fr6)p1mO|)gH$TqK0@ujklVzxMhHXAgB|Dp5WToe^~z6xnCTA z`Ri+MoO$!YPoKnxN3yJsFR&CpuZZ-HrB*cUU7!kEuZ86Z(>&sq_;mM5|E;QNkvM=G zJSMziD6NxLq%jjHAjUD0)TU$?_H?!~^f{Yeg)u(0Us)k+L};)Eq=XPL zW2tZ%abZOWKH#iK)XT62oxXqWh0ftdCK^xec*paO;#{h9(glHxz+8Lpu%?_#gq07V zk+vuJ*nVjaM$@F06@?~j7cUi0r!hovM=U`hdS;9$MWUBYy>>`)oi`%;{6=&md_Ckj z^iJ}AaqJp6_g4Qn)TNpSiYXO%;sgg{ShO{$kZF>u2U+?YU6OHvRptIX=f%6G0*uHU}5 zd8JyZSsAXJ*llT)foq#oYg!S_kMQoYSZsGD?##}=#=V>Q$GHp788&_xx_?E z8z)P96Jxa}LI8_j7^^am==i{Z34GOT1VOoKwLD$CxM1+JGctRy&F{ z$zzr|xp60k_#4+-udgll2JPM@*fEMcaglhpaWh`-?XnbOP9xUIX`FiQI#w+hJZXfUyl`u0!^Idk?JO5aPVT*VdNq>Ubm}`C3aG6|J^lKbSH|uaKcHJ(*-Bs?=C1wKUOztKoawpsm)<`6 z*7(i)z4l>{OyBm>;=O}06n*4m<3&kO9ZN~4R(QB^TMO%l&(u$OA3l|~q+1HpuGCzVdqZLwyOfygSX z`Oe1g`!Qe~cB}5vpx5bd{G0Q`)&;1#!@0$XSG7Bn`5afH=50cmGA+j5Vj{Sf*kXe; zqQQ9Vad5;lmsQlf3ae}NfV`%^?=Z)7JH%HCr&BV*DT(8Nv=%(V8KhG>x_CZ|LgrE5 zcq>}LyZ`9#e!lTZYtZg>dzY&2`m@6;vlUySrvGlcmDvybQvD2=3(N#^AmbJjtq$Re za={JgkhR?m*ZM0R-);Kso`IcldcWOvq>B~LB1{1z!6?-f35O*COEn_eXO-`tTCVQC zH&}tk%o?pX*Ie&%bir14<+7UiYU&B@R8bZp&6LwLkrPt}Mp6WvQb~o24y}f)7;E!a zo1bm|Pb#3;{IAyL-=%tr`o;g=d+*`Jf7!fM(9>Uqt&Lf4tRQa`_oH0(k3eFMB2#>45 zMVm{7LC3jVec_3abDp{I+7C{>^~es5m!K~cm!LCCDJX;uF+p>Rd2~8$+>2z~o=ny> zv$uMKq3`yqiz`jn$}`~aOwViX0=rcGoc9Dd=X7x3C{{5TG}v>>fw?S~=h1lIY8yLj zqkhLz{ieIyyTC42zkn=BV+Bm=#qo)Pk`f;OhP)cX#aCh9@TPdl|c*`+x7+R=BwEuLMN;CrMeD@2VWWV~S! zCQ2Ae6yZv7EaD2Zgl292k7KiwzMBr4cXzFi5pmXS8IwjMK8wrnpr>h%1z3zKNkei4 zb_^jxK`1AX*3?ATQfC!lj{bS{`RKn#pSDK-FuFCmohnAsK<4|uXsVH#=E=jEn&~Q4 zs_|5D<3w~`xf9AdVSQWxfyW4!Kvqq}gKHnuj4prm;OgxM*FK7$90lV}qdt47&mQ=c z>J5_~YY+@uAq5x}95zU~;H}K7rP=)D=8b#THh;Hyd-GO(26X4qk}L-OzHc9U@ulu6S!oSYsRJ2lt8=|h(>8-S61Q0gR8%JaP_ma zc&`2Q!PO6rW@r1RWal|?{tm(=wi}#MjS)4xPLzU;tKayH0ev)EF5Fp@)1}mw?0WnXFQkG;Tr@GaW@2_91sjznE9h+0G zeadZih_4h*g`L;YqmVqYK}reCm|&>%+VCtUeba|4RlDJE-4o8~9IiXWR}3da=%lmO zDMK_Bak2Uk*QOAlvJy70_xkS3ce`7I8m0^`X@Y@0n7g*iuM|&BGz4rNVjv_Y5&@%u zYh$AE%o#H_&-L_17v(R(1*Asr)nLUxp7Xj0YkfbAo^oQFJl>5B+j?vgS>qGu-8okNaUTAqdK&E9 zsm;sSr$q2?A6)y}2UkD%`o}lE{^ifUe*exBNNs(0{_HC+)OSpOo?M2EASBZ01=RF6 zZ_AGDg>tb1YA!$ti;cs^$QU*nsxS`BIh9o;b*7(USU<-5-W=iPkKY;-UMZ5E1tBpg z0w5I<+6f;R@xp`A{9vW0x~8g`$}92oN>3NgAARZRSgFQX>1lehLewNe%1BI{q9Cys zh+{*k@K!rdvew^seY;wUZyWa76FBf^bQNxm*O^oT`?Pn~-Qp`o)KNt=Fo8hG=s{}A zRR9F>RUSded^dqs+1`m)t108(X9vyMv6I_HSB#|BI<7;UdecY@VI>m~_g5|rMQq28 zI;E_P;(GSvo`w8B+WP(z->+7xRqrZzx%Ite-@1^*AFua9>-&B%>{Q)B{7qZweywWI zf^KWx4%1hM@y+L;->#tJyN|BC-K`QlZ&ckS*Xz8{iXQ7AzK%O8#xG*>V!F=@@trVi z#k)fk&tN%zz3rE(7;z1&OTOiQxCT+Y>#fl1*Y_Owc9>i0UGn`zw9-1=iw~6~+JYGB zEVV8#S9ZB|3c3)3vTq*aWE5(=b8DfqTJ?SFay49@_;~SJ-<$PT2l^}N-swF)1aIpn z8GouO8qC$?sz)vT=BEsNYYVo@4_;{bD&4GAbvj9yL*HI+#phpJjlX(7-r}KUd2wuF z=p?14NvY`s)W$481KANkR=TVSSOl5{Vhr^hOKCVbYQSNPv&zEGZQSe+H*U7hZ+v2X z!=n4_2mKQPFI7XzEg`}?&J@By2JA8R)<>5?(X3Q#e4tbPjZb=U0nb-U8z05(5BE|c` z`Tq^p`(##kh_4h*WsL^soaYS1=q^Nbqx)|YnE_;(muk52VIs4Gc2cnzl!U6WF2`E` zrl;Q~;a#ePAiVaBGDn%nU$+6W_qiykK-+(}Ofi-EB6 zQfE~Sp6Yd?O}Ol%0b6dlKbv104C6Cb{hr^?G~F|Emj4tdweE#@p)M+fqSN7! zV@?7kT8Q8ib7^#V5zWe@U4V8ks#{%BbgbRov6hR(+1$`J?-&d-4s)^A5lM*A5)q%2 z4h4m-5p{(m0b}JMma_r6>}?19HMy&pDFRCPOBi!U_wX zm9br1hi(V@yPDp{XE4@d6$!~O2eqK%zp3NupDiMa`8U6}aQ^Ik@~}(zD8_LpRSJqM zkAY7NUIk#ut+P5h%OI(X8j=;n`eCm-i9KMpE%^+DI*%n+3Ze+q8BH1D8V72n!-V)m zsjmTNMK_}l@BjVi&gl02UnHWY`#-ITnjX6cPm-l;mK?;HH3EC!Q>r%_DQs*$!4?KCwsIV=~Bf5Pr+#~xn#lyZ6yTENFa=d zymH((;9_UvdUtMcrCRbszcQ&Isu>@--?lPQilx{ZZ3Uq`dK2Ib7u*uTfLauN3X_%a zKUouaB&T;8B~fE4_L$Q>F1=DLtu;(Ai#RChKnbtXL~e_*CMGM%3#n3ZW!SJ~9Dd{7 zCBb4)L);K8!%iVDnWG_fFgn4633<`{sa}+O>wNsdlTsYb65ao_dYk-8@$`Ve0FhQZ ztYz?E3B|_7CF^O{e76hjG|X#|Z2NA$sqLJ8V(!Q$YtAg3+r?LkX7CEf;2U9yy=PJ* z=MX0pq-J?pbg7WRsD+kjBp)6vQMN?{-G7(sC!AqM*=2`XU z>V9BTlZFprFn7VPM@!IdCu7j?P#k@#XJ3R0bx0#be9B&XhpEEKYl9s%!ATjvn64egR!8gQJ^DJpy}|GY7a4-5e-pcqWdlaG1?eGv1BMZ z@ds&_-0Ei2Pk$ow`6~s_Uti@C)ZDI^Y3^v9c zuw(gXlBAQDpkVZg4B&hF?1j@mSY&#_(yD)CDIN+8aadWNz~I7q!=wv@v0%6Ad3yb& zmlu7<`2JwITAjYj@QE8@xcC$LM%nsdhN9ej@l68PadSxV4UzYu)I-Ae_rb+bfZjNGp=?P;>}%%lIM5*D_KsyOcPU-d8vO^pmgtm_9r4Dm?D8{&u<%=FiWcoZ5>ZP-%z+oixe!d6(82>J#7W6rRHG~}_Dt9Hy8g=6jJPReqDtkV6d{(F{i8~jyr8rt&QM7vM2}#(CI<< z%WF-)>mkN!Z4+KGl!`c_4HMC0z|w0kXtXg3BSKi-IJbvmc3xZifA+4Wxve8R{}q(h zQBA)eJ5iD?D|*J#*p=C+PIsS{AcBAjAZDUjS)x4gIH_#nlv7Dn5@jak*qMwaJGMub zY%OSQL1-tf`A5gv~{3pXxxd=pyDs?{R-(Qh?zxeZH4j`?ZB zTh)k3q=tDj%)3jp6nC$JBtR)a;gcue1ks*Kj5ZLRRr#}6g~Iyn-s0-V_0aTv1fI6a zuNYA6BC}Kqr_zf^gOoG|t{e|O%Z@wV?=Hby7pRYuWL4!VN9i=TbIeCIqose~afg{< zMVaVz?2!`XM|COHT$Ivt%6WQ@TH0h__~gJ^6`7V<2~te|V;8UY>YT>DavEF2R|uyU zD5KUuP&=on=0qmvl1lBPz^s!cTyMHgf4RBE?4Q5=s8+t+U6gHLm#Uvq%qi};rY;6U zyfKyusUGI=9|Iq z*H#8!to`laar*b+;PK$IYLfZjL3;eLG5BEc)!Y@znlT|V!c?T3=_G5%j-WB{@1+|`;1<0mS8EU zRt9Umb=Jj%r3g~R7>SaGI>_=gZgig9?uT}>^Q+ELh~1lu@Z?UioAJo88#VF#ULzn= zg;@%<*Isc6F?z?4YLbjW%M^_QG|P%>4*%upKRkVBc<<@0;l1IvM~=Cx2kM6$Y)EXcAM818`Z&i z9@Fz^_E}7+{$e!lW};M1s`{vs|aurlmJo+3b@~zD?I#?xY>y z60~62dNZmjQJyrA{S`txGlAKkB3C>KjA9M(6e6_|q?J+-E1Ab&(#GtmqI)b{3izU= zYI}oiU6Ynsth8B*rT98296F;d3gIOYR!{;?S9QrID^_j2hIkevVImqK(OD(6z$miXZwH@MDX77hg9n3$ z>G6lbH=`WY;y)+mLMRrT5A9iP%{cbqjjnZ*k&~; zV7n%-+;?H{X6Y4!iNPB!JX2}$a~}++tm4FyipDI00!-Jt(W@ul{Tb-pbPIeF(4}g} zy!YCKK#bCYlfbCrpcpzCRMsr{7xiUlpa=e1l7D-8>*5AwIIWBHCKc&z5n?I2oJuf6 zMaob`!;>8mEGnavRWYkf@8s&;jX^>$crfR3PdTi`_x-AJu-19_uicZS&FdnRrJ(EpEhCUw31+r z=UxlKSXMpHMQFnkET-qyuRHCk%BZ(3Xo7_ zL{!qc5UdBPobxi~^^Sk}aN0nqBvXEr9g;nMPu|@&Ar_(=3D-N_l-nW6Qj>hoh}CZOFe!D3uB_1Y61D3jC# z$4F!rjMo-fR_#t~wwgC?G?P`)TK#=^eOx455h!-m&Xca(n5(O2U zM#h!ph}ttQl}%*zL!-ZVP;^pi)eWUY*bNVkq& zgvI7YTzY8=pK*=%1TN!Tsg~le3{PL)3n?)f;ykEiNr16Z&<$%pzeK;H8P>_6pNZ}I z%;}e0qF-IG6bu8DRaLp(DkYTD5WFSK2V?}Y5^HZmtJUl^uycnB2mnPgy z?h$4*FLy#J@>PTZCjnlpg&qjC0jg1n5+I=Q$awUgIK3wZmc`_+9`7voeg)N?wYQNC zk41S^<(%=l(|y8`zfFpz_<943GQ{X(@I;8nEx2UWX~|qxg7^Cgtk>(pkr`>w+zLps zhM=YBHMO=%$qJOzgY{8aZ$nlo;i*1$+daH_h z*RaYFY@g{+uhCt-?H^@VhNCBhQEDJr%*Gq*U9`;8WNBGILbLKK!>@*a8a^7{AKpuk z&(iA$Pj3ys9^Tv3!g9dFUh4I~3y@@L9$o6B zKR=2vSM^hqZn_*`%_OI3hhSD$T{|8e5sX`JeAZqM=}x-Pbd5{bR_}(*)5&W$?3KA; zlVK^=7Ve~Go-0kf=FwPCLLl+pNtzX*UrO8K;_Bzk24201z12sp<;LpWRtuIoi|O;` zr24zr#$yI@r#Uh$2Hr)WEK;68PuM372-1MIRzhAOK6ID9`^P80>2G6dsS)0N%=jkZ z6+?+JC>;q>jgp9pN7X2wjC(>wRu=U-E@8XbSX}+`*UPJSyFKWw-o08c-Tf@xDWWWe znKP7Vz2yRfi6mH-&UPHZ?X##XhW|1AV)*#!O0p^+CaW@8l#Ss(4Ieg!cax?0Fj<=S zhW|JG_USt>(-}Cd?qen&?OqTo)-MDr%qV>4oi~(1df}~f>3GO0&0N3zaDC?~WY14nMILo>{oOaAx8B!W35Iiml(yMoHn!XyF0iTB@sxMHL8lj94S8 zh7s-=kid*5F3ZWeTGcmS?=7z0t%u?5BSf)9e5G(|!F7aWd7^R2RdtL)0PeUC(PtT> zm%IJma^o^~)BoJ*-mL1Hm#<;tBKRsq&^Xr%s<= zI9t*!vImTc^~nZfOhgh1_f?vT2^k@BYiP{sBzyMJ^E=P}>-oFSK6-XPJw9oS-guCH z`0wZMKl^y}WBT-yXaD=`(`O$aIR@RI_^4WVbK!VxF75H4+6QW-nr11dLHVemBC?dq zAeiJ@Q^CPyrOVDhy8R}$zx%M)IF~No3Y}i#$+x)l-G|#aP{y0vMy(H2*4tHRjRptB-Oi_JFHQ+@YGkufg2QXnw~WGp7jS4(F#g%N>Y z@{mzx`cwUMGfmuuI7zBeYwaN^tla~B!npJbv7{6zmo7*Z1Vze>u(W!Hs8rs(o3~*R zw@s<6={aB0M*TwirFy^(qt0t-I2VyHts`jUkxH~Ot8hLU5}j_hV%eT|LiPGA`Pt8> zZa`b0E>%52wFx|;^WG~byrWtN7Ip9{Z@9-9Xnpr#c=CBQO`}$+)&G%MQlO8x48Pv7MxtM`&4RM#l)DQY@RkfkUa!?YoU z6E77=sgqNwwfB?(Gg+l6uT>YqW^WN1{dRLA<=0k97&;@AFro@+kO>jm15V3K1bGKJ zmf{Ptq>B|#mbRmrHt`xdR3FVwpq79D#0<_U!JpfRinFw9N z?vwv%PoDiS*3G}8v<~-b+#m&8w~n4|I_zGDnr>-dO`x0QSBj?u z3u%Wq9YBik`rybI!B335{KIMGgwt*i-SB#=DCY{DATIZPd zktrJzh{z&t@HEV+seJD8UmXy)+J!5eDs_ckSvY&~jfE?Gf+akU(vR)YSK5db2Y)rF!EqA}7HK zt`(q6d$=Z?2F7jDpRBHxYFv9o#C6m)d%YjBF?IjSp0imy3bGX9sI}va8j@UQ%M>9x zfKrGRUv*Ym>tv^DAnmsrV_aQzLThgmRrTq=reA({lo!9X_S?0UjZa@r#lpB3Mn|Cj zKYLg6Ti0>j|CI-=BWJ!pya+@~j^)^tRm(z)Y=kp2XQ(TZ_o?skQK43m6?;)6n>c7t zG(e-Gix^E?8EujV@yCMFR-tz3TGgWeMQ1K$>5+VT9BM?1G_NHJGC;n2b$(~goX_8x zS21~}i?l1tv3V>V{j}tcwuhIh7u9MmmCrGtq(0Ip0w8#eG=+pZ7A2duKH0jv^+jgx z9!*}dmXa2aUCJ;_`ytV_CdL03(fHO24zz0RSkU~VNge(i#RvOp%e*EG1`+)Q7 z7gI3Ts+@A35@MK_kp&$MqOcL7=F*a)Fyvf=?RpdL-HM}T8OBd@xG;;$`K0E53TusX zMOlq>)Kn##Vxu#Lg5(4^n&f79+v1fa_-4aWtu47HpV4H` z6^)Q-+#Ru6D^Cb1TB~*uMzFLF*SbNF^Nuf8fjG%WcGXtf_ zo4KM6qi+5eR;IZFkBP*O0JX&q;Z;MamC@;9a8Bku9FU1bjpWfp>xyQqwtn~U!>#|` z`f}^5ZbQ_U{Ti<$G{P|xoLZF$OnWW7l+>j_lart_VSkE1Gyi!}zPD-DPM^mWY~eeD zg|WwWoQpBo4n7!li{A$U24^SjRhYHA@uU*vA0W+oF!|Q%1A@~o&|nNo(1wUi3>S#9 z%+aD@gK>kS^zt~o|C4d{cdz&RIu9D!&k$iPtWjb#%yMRRWHK-Al$q$rMh33vn13)C zEjPH<&)&Wmf8#UZRU)aV2PV@mV+<#nQWA7@Lb8x9`Xb`0b!?YL&HX!FN}+ey4th9u ziLVw;MucTH^1z%V0+{0%gv~oOEiI~iy>Sg!R)(WV-t~B9{I}0PoKFf(efEAApt}WF zji{!=fr`0{Sa>C_c{mTiUp_GHY4*fU8PNvYCPY_e?z;opV^!#*t$2XhAl=XnG>0-%6X?E z@hoO$*_iyf5;Ok4fBdKa`{i#=ow<4SC13UD7cR`X=WQ3Qu@f@mUw+R|!BMLkG^jv? zp`a8Ej0uoFI2kG9q-^G+n?`A_!FX_SxYD%uKDpWSb(kYkhna&-t=>q7DO?cTX|I&P zCk(%BF-D_Wd#X%e8FtYo5!^w)VK-|6(Fqo@0<&ECxGUK!Tnn(H%^fv3@V2^=Jm z&Scsxu*i?`nDA?>?W=IQ@>6Re0WYmHKv9sW80J|~j_DrH-A_fg_nYGz>5*--XBp_u zLuT^!sv~j8x;LRSx^rF$kMy+kYOzdFjiog3=p`{KI1tIfiyi}TTGU^AvsrcEZj6^V zKkaEyULZ)_Ex&3&GlYuqsL=$5Q3P#cMD9@NB0%rmU4xYkICW-i&jPVmZc2~*1vo9d zS|o#Ykp|%eg7y?y@@i~UUYK+R7Ma-=R-1mq_KVjocFV64P(!2@gleihT0kuWV6cH0 z$wLT*taRI*t%FP3sjXRC{&r8A_RM0t7y!ILL%-=}h_D)2RGM4Q0t?1S=D5tasY^jf zltm4L&FFOZX4|j!eGK`Ho5324Pj^FOJ2-#)0QS}Oo0j2Jt4|aW182@8@0#o6YjbOr z0%;hrMP-g_aJ_4VX!>rF7oeuwDZN@SMX<&MiOD7)SjvG)7ia>MBNk;QV3giEd;FR0 zXBJaZ59mHO`CbWDgNne3N6Ibg5Ex-fTbfXf2JL~?WE`==gCy+L7alI2fA7MZS1!K) z=J((Jn;A)r?j36ZltefWo}l%SXp2N^DJ6go;EI}pE)3UU@D8kC*!<77YlPUd(Qc}6 zV7hqegmjXWxni>fSc|HXS}V{B33o(fj&;incUD@hikkM^aBaMP?^fI3{X3Icvv|F& z-KRZ&uLNsBHB@V3EoW34!5vHZD#4L!^r2{YYi%-GUcL9p{f~P@Uj)%z;;V%dP$t7m zjR5LZ;6iA_0=JPH@>Kvwy}bPw@P_taXoJFBBP@cu?F?!I@#oGf~7z zdJb2I%cJzvynHim{(j^pZ5WT9=z^K6kjcx7*Qb?%*SNPB|*=f4$h;O!4_p=-fhrdUBhG&v1$9Q058VWx?6;` zs7AsC5!9n_&H*~=i8B$TMnjAI$=sDR-uyHthX$86KM$t|&<+;bgywRxF-z#05c0~X z6*mWN*-ZePkO03N?gPlSQV%T6n?H2k#l?dYl16Gc^x>D=BXU$ zY2j5P8MHIOfaTH#$}Q0;R*WPnO?^?J^z2G={W^};hDp}~jPHHccQYI`J2zW|wa7AJ zxnhzUijr%|twk(E)CjMGY@XRwxfD31x zp;AeKQYxZ9%wXlgYm zaFwv33Jll4qR7;H30YtqTu~>@dwA2~a!2zqk3Hq<;qJNG@-4db%N@Dh0<1<9lKZB( z0E3Ds;({SDKnm2N#aJ}1KODCW46ec8eDX)exHMdE+I{#GE$eu9PYAeW9^D){)?%FN z>E5GZObhL}2+mqZlGzW&7bR%V4p&!)?G1#LwW~ROd~uRp&%yhRAI=*R=w0`juKPa1 ztVBCGc3z{<$$5`Db6!c4w}v@~oR#h1c&BMwTpn%yOOvw#FbNHez%|(JlVjpRn3}!VBTG z{i^3LKb`l@pO?O%ZEkK~BQNr)qwB*_dd1Uj7&g9p`Rv8T=}#XGS6&3s{A1r;d~@-Q zH{btWJusg8D0H-5BH>;*mf}DSo&zyObd2u|@dh?)W1Py@^_R!-ygcSN67NL1R`FDb zN--x{%#FjU>&FB^r6H>9_870j%{<;aoEoF;74LW|-abr#JCLqbJR_yzDP~qcMN&O4 zl;hGE#H4=VfINUCQ@GD9Y<_b=j#A`MC}}QVxODEyqOdcfm+q0(c*JA@C?D)uNdEhrCfunOqt&HfqN#D#k%3*RKS{wZM88y+y%=k38Mk4u~THgdkw!Zrap21$(7VQ+k?{{e~yrfRTeR z91r|eXqVENNe;&#Lx+Qy|BX$%HXJ-@7Wac>_c$F~7_M*o{V6=4uMIx9ii4{NAs0`! zf3g`5l1=MYNdMIYu^l|wC%vQ80`11?aD)Rl+5XOpNiI#mcJ1r$enLLsx1aDtM1vMq zF}=_#G;Mm@N&Doz_nF{etQ#|$Kf&?sl0~f|#=OxBAPP^T4@@zs4GPC8RjQ0Qez?-y zX!=(E7bA_I5?&>eUV@^6%Rsm`LAt;VO@<{%DxT2(?!WOh_n_auvj*4Nj^|DWv%Xy-F*!IcjZ-WNTPe$(nyH@>-Wl|au zKst#o_&iDCQ5c!Ln4)_3TO(-0>2ni*b@S8Ag8J^{N9i(6Ph6TmRdBK{jk2QmKC-OE z+Ink^=K$6?5tt(g(gfjLia?6!_1=K1unO&9BbmWwy!re29ch~9iCg+y_w^(qJX3EYjR*UBf$&#d0zwlz$tkjVYby^+|_(@+RjtyXyg3V;CDfivb6M(y+N8O9VAS&J0M ztT!v&a=Kl<=2Qo}*13^@&07OL6%gx=-to|TT%X^;eoUN*rzwvEcD(O|tWtwgyh#WM z3xaW_fp~`;G@%BpH)Sj~(Ar+T;GO*Wuc|pEWSbgCEPoHfG+-%{zWS*0bKL-HYvh!mLFboZ>=9)Pk|7v{sBb zl7VM36rp{2DY@M+pWHyPBSX!9q;gzSva7|>OBobuEsR4&xzkZdVswNce9>0nw_R5On;?9gTaBsMe35B(XHz7Lgif12e)%raW~Rp~$ifH(;`gIq834 zI9lKQ&C))kOef1TEZlVR93fVsi$su|Jpcj5hjeuW$7n<)Y|yf--y2%ULDIa{HJo;Y zFDGPvzueWIl3g{9(o+eRr=U_XOOZM&K?I?+5Jhg?S-c4w&1gQgmgaMr4$XY=7Hgv`I^F>;?sOn1qz8c!8;1SM@I z!d6ys9#C-y)^lFeYS|{|6Yt;Yr>wpO*T?)M)lQ^q6)$-*(O9rZGItn>4vF@W7#E2v zTII74^XTn1kJ;Y#-u`mfmvm;Q{A%$uiqZ&_8p0t@{0Gj7a#4D2RZ(m2qYwY%(d~bG z^x;20x_vAC`S_#H9{>EOkN@$DLm2!&zi{Du-|0Rv|96=D0hV@^)I+as91Z0w%UsL_ zx>gM>foO~-f|x)l^TKJVeb9l(GPd~f4Onr>ZMwPK;Gh}&0NTMKY+yT?8Vl*~w^x?S zoDWZ}_JBrVxFR}=LFOI=UW<0^Qdv} zFYi{Eoru&bNZ^X2r74;X-U_tRL@Grv9oczN?tAmoNt+%ypS-sBS)P;ho|axUmU)K+ z&D*>w(@yH#ugL-riV#+GRXA*$cD%fn0x>vV*7gWQ6FY=g4P`Ri)>EmeWI=hR6);B` z$jB`_7-fU)N)vN?w7)sZh7T4Gg|Xr7OK)8{``**xtEq|N{J=^uBH@ZEP$C6#OhuAh zFUHVDufUU{PUywWJ1c8&>dexfQ#Dn15c#@eeFbTEdgz(#YH_6LT9ZsEZz(~F*{h~Z zB_D}+zk9HMpF{PE?z7p4>W#(AhjgmmyTYkbSLl_6cQ2k_xWZ=~uBQOE z??1=C=_5e5PzX)T|JB6rzp3(sN*Feyd--}*=V#!3uL)1iy@wm4dr-+Y<(v7_yn*XT zX>_m2JOm;3E8oL)`aylW9*pkwC#&lX2Tfesz!jZ+XZ6kM{chFGp9h8&-r>o6!*HYO z^l&4qZuOc0;I;b0X0o!n8%FnT;a>o1U0!p3F_Re#>O3p~{~hb@laE@Vt1`j%BSbwl z&>ejWHA*P$%z(w+uRSS zZ*}(OzH)gEk@LP`yx9>rf9@JLWX9&77gq|L5uA&ZoPdymPR2Q=ZBihNGOemX&X4}L z!SxLCQ0IPcqZ$1^pq2R$I-R<|RQ3FNb$&P)=E)&Dk4vT#&tY!2`(hN+OF!m&La11u zKqzH^GEaaf&mu=>68{x3hHIryZrBXF;m(aoBkgwPq(vfR7f!aV@+$?@ip04|0hP^K zq0l}j;4CBz7F??WPV`^!em6%CXHh0D;M|2aX|wc7!9>uEi~)a0fp9V+9iu|YXc%t= zrfcBi(HET>>TPb@0?pk^=C+8h6iyG+0hmCHV-h3yIOzgKENx1yQe(^AYPo^hRcq^` zy8-DDa&${}95Xvwt-&JTjAbd`70|Rfk7Z%nFb4 z;!1%_RM23E^_tt5A3~6UGAn{7zLh)sF5DWz(v{xr(cS98uG((L~MB+ zcaUQlzJU-cEf0(k78xhW6U5f)7*)<_>}_`Zwifoq*4d`BWwZQB@nnR#Ad{ws&_q3n z__$)^BBheHRT=0-7=1AqeR1k^y`Xo033~Sz!Yf5m5TntpRmM4|snB}q)`&dbnH==^xTBI$n$5R3Lx82IDyo6m5VVv6{aGuSN?eK< zERB0Q1U_OD|30{I_yhmmKC^sfhdPYBykh9Q$|DyD)z&b|oJ`CSncJ|4Z#9|wgE|hn zu+hJXTliBJ`J3A*!KP1t)TA49o-Z_IljVdZW*$w%A}u`qc<&5Hv8JSG5(6r=7aBy2 zo*NoPh$+}s?3ehh*9>Pdtxsu(rP*Y&dC&g~?Z~kRUt;^-SbXf+FIQhun>IsMszFvJ zV}(Zl&4HGJgH=AalPO1RtIhxIW@*xlI#KFs0Du1Ex79gV?`>q>tBoDGX0*&xL)bjW zZpz}ANvO8(8_;WGadrcxRBM3f6r%x!k2~|pBriP#V?hVkN^7n@GlSJLYQA}$U?+># zuqBPiED4t4>bNGHdtww24C_R4(NTjNi*>41BJ|y!>wsS$R9&dnMqh`~-MSm60)k`N zfHP%?)S;vVkF+B040*9OI!-7R;L*Y`j9Y?KIi^V|MAAwdpE_RETCaZxI(2_gogHqh z51aZ<%)`;<@uNKTi09Qqoj9a-7iTfz(NZtCj4=deW3rAq<(LG8TTC0o{W>aNzwZ0> z*vz6SSRBUeatgjpfTfTIo4`axJwcC>F+r_Q$r^m9V{DZt#0_I~?>h898cvgq9m|bm zp?$k(-&U-Pl`nuK(rBxLMzu4F>NhS&5;^RHKy&(27_ zPL@`RTPD8B^H3R@4lgwUsU0C)Cdz%QQhT470Bh*}@T)1R{$pt}7Q59h1)y7?E>%5c zfXK)MMmttX02!DH-R(}EiR$??v9TC)b?AILvtcRK7AGj>oEYn@qJn4bHk;n*lN;IH}_QQ_0Yb}Fc)i`Vm4SoyfxVeGK$C$Q&f=9X0_3} zVLk$heVD2YJbp@d*h(){uyy9t0l}B~mhF1-HrSc4hxR{{F}NKmGlW zpZ@q?KmGcrzy0agr%uC*{N$_Q4qLvud}hw@*-7p9Q8^o(tc1=W;5m$R&P;3yHHL97 zyfe{Jbg6)aK&g(Jfgk}@sXc$kZYj8D{2iBThjC??FcZ|BUWL1TY%=FUJs5giICS2s z-fnX91iV!(54)Mqz}LCPw_k;xA8y2M{&gK(CqCmo`2O>&@z&_;$%oG`J$?W8-@K9U zl3&UU5MA)~=zb<(s4{;7UKa8!M7({~OSP||^Co(y{W;1onJ+M_W@sv7bM!x7slrGI zNuja?N-R}eSxJqhB6=2BEARVBlWBcpR*BYP!`S^qVXOQ~0aZ+aRobJ!0+x}Goaf4C zJ_c>n-ujEw?vxt`m)E_ta`^NM@2#A>ws!X7%Ib4s-YHv=7g!3O;lY8GktR#6H@WL5 zIS}Y)8rmwlxdb1>js9SCw>xG1cI2X)wH2Q1GnOs#E5#GIGKgjf(tF_u2L|3nM!m)z zxmAHk4?~zi9?CW~7jF?c99mep1&>nwaLSS(fg~AuWF|zb6(PbfV`MA+xLx0PTDrZM zl5qSzh52pBTd^)xKCg6uOzh`vVw{GktaBQ@g+NFv28dPH#KGwErbeftIs^Unn?np? z@K?N39sn@maHMh zqGu@t(}ZhuI3>C*ZFJ|+-A7+N`tDDE^XTED|NGNFJbH-R?fzzCUsb;2!qt_PON*MA zBjT^kRHIVmj!^_@cv6BX0}O4V3!YhlFQir_7UO>$e>HwMzCZrz@h6XeIsSV5<>TK} zcDfYmLa8n%<2^|RRX68#xZ#Y&OzLZ?6s^Vz450o6Oe$_~ zPVx3FJj~g6{my~>6{BTO>$Aa=K5Q!al^%?zh2+k zVxaIM&qwx&$@VwnLC;s%m|WqdpnbB`%kMpxOTHd{p)2+Alf=`@T(!B?YjBB6t{3k7 zeC7SsHD;!--}E{!qbvDsKVMy0J+pH4FN&dI2mz%@6Y3)|OgRQd2^$#+x)s~W$93F@ zKYV)=J<1z({Nvr>)I|2h6W6wyYqk_i!R6X29XS_}$)=2{+Jm z<{p^fj&Uv>X_d)wc*W80y0!1k;-_4=SGyJJY!+W3oPyIpbN?ke%1kDesYazVlAuxb z{utBWt=7KjP*$_OfR++P=QDardW(gQ;`BHZ?ak? zuA^?{EO&d&?H~T>hyPe)QeGyLvRQh?V1kB3jP=3u5CY-O@FWA3!nB)?u-fYcxQ%*s zI&Pbdu&E3yws+oKbTcdQ zcDk068oRcKa$0!BNHU?61g(|EfWvcqMx%@=B_`YTzF)#+-H5mAZk|Ng+>TE&CG(iw zP8O^!qmP}WScyp$;ah6*aiD;EDI5TW+W=%T}edy1^biv#`H+{HGe5HtjR95s4 z*E^aKe0XUlh~`IuLzCx~%nIxeyzF#JaK$KE9Xat1a(rx3FoyY{o#viB=}_8rm{q4* zgU)RTy_pn>C)Igt?~`v8U@4*@Dy7k9lS#)Eg$RO0&ZN-NK&xoE-a-f6S$a0uXTjug z_)RZ!(J9rP%v(kn;Q&!;YP8pxQCCwJtZwD=kN@RqE#=qaKb$)4uJ5b9>~B%-0TD#= z6GI!^-Xw0*qC&lvOjD_t&|IhJtOoEBLmqTk(1~f4tC*&(&iSy>{rYyCKf35-r4#qg z{=Hd@#Rw<#Mr|gAPKr=Z6b3<5r9_o7dz$2U#27TMTz&tjGH6bgR*IWtU=^6axJf1? zPqoliVPFB#wF_V|rrsER)?Ls&zxMI#CZtOh&v|rh2=SCDC%sn?t>A)s<_!&dqh>gy z$Y!>|SlKr5?9~i0Tf4Bs46~K;8D`Q8MS#W3vEVgOV+_Wk)}Rq*rd2t`#n`EF7wHdr zoy=|5-*#ks=x7~zr)#?iOHmC*d5Vu!CO|Sa06}w4e4aZNVk=bN>Gsn4=s&yHiq2O20l7<+RurYPL^eEJ-BPO z6pQf%Fq~3Jqw+y8&M+)i5zVvrQMO9;{PXy$@wYih$58#t$A3M3@c8d0eY0Qh*hE{6 z?~cD5KU^CB4&V0e_^WFCpc?-hzWu@YA^z=y@pt0~2iA1GN%geM1at?^u63kUZ$AMp z)!v+;q{M0BC~9udo_pbhamk3*C)t_l?bPWo#~>-T>!91$NGsaAiqpa?MN(iOmLw5O zBnU2{!^jzEM{_*TDmAwj@A&oDnK-T8ImJVHMw>c3w&f!W<`(&t;;9TEfJ9LU=;{l? zl1&(BOQ(|DN_x6WTy4~(J?Wqyza2`cFJ3-;&cpNPu8|kb5Yx5Od3B}GX^LUE^2({e z6;nZK!yUH{e`&`f)WusiaD52f%vlhQ^%&1Z$gvAQ#Wt`@)z4ZHlSS(xfEwWwQ7O}= z`s8$MHTdN0uz}I1Fr3v%C!0d$2ka?T18oD}w!gz2U(9 zB99}TDn(kT%JJNN<~IOt#kyGeg0|KqK`0Z_Im4tUDo}>5tZ9|Qd@*7D!svd}jW?=Vv-Z$w6so*&XQp%wvk4#2&54~+K@m}WgG_+5$jfNs6#0X z!-Askb=ZXFhd`T=E>t|tz4X=rKm=!jCCa?hoB_H-a!*a@2e(Ph1ac?j|cU` z=H(WHn%f?TVS#EvNisn?COM4zKOjZy@}S?0tkSwRF_IrHyXZaben4$=yfmTYK$w z{T7X0ndiu<#A}@ue*b9W>o2>|y4LIaTXQ%kn5t+GPkI{Q%v<>VA}mH#MF_FN77$aQ z5RxpOPC=E@)STmv>?=1;FaAlNU5bmh5(L*snivWN;k@@jX(FjNL>|sZKBd}QJuaN` z;|6B=^`#n6st+ziMWy+BC$U8y87C1XTm(jV2wvvdz{#I&y*+s_`Eu*6$?qp0O+KDH z-1@t;=VE>BMB49mElsaxAanEJj3)-t<8R|RGkNe@lYH2{CkJC)s)yWbLV*jcJ&Ms5 z<$@sKfhrP6R(9mt=+ka{rSIEzwRIU*`_P_4?j^-VT9=v00(F28i_s0*lNfF>jdfZx zW}~01J*S#`ku}0Gc{F)A`6TVzsWk7=f$PlF$HN zC;&;U#(@coIU*QivRzNfck6^oiBWXYC%@i(_`%@b@wg8Q%L{M5^y<>W)#V!Bq59Nf zNVGRqWUIBtbc$R(OmBLdbC> z3};k%j}8?~L~Bq56DQuCf54pnzOma=*@#{@re8jvs|<3IAZvjk70oyo40BF2r4k2v zjze=w+3AFU)dv@&B1!O?X@NmF7Y(?Hhl+VB6mwbq+JoLYblSHDse$kIz8qL%8s`ua z>=9ovoJKpMn2(N9%!)Y+DqeUzMCS}e*NCtf)_^QEUSMq`SJVP`hC7QH zXE=*4@y8G^!`V}ZvTFaBnGSn~@*DXThaJ(CqUdn+JT0RZSt%*URDd_qBP^Icq&u_S zn0ey-r1kF1>p#1EGNlGuoy3Xd&w*kB8*dp2S$K~Ba{TD= zpNxMyelY%g{MF-k#+$A9ht2V4t?@rR{^RlHzHBQekH$gUJehoX7ZRxrnrCp=gd95EQn5QC5$9GBZG zKE|V~Ggit8HFv`ELc+Ksx?&Wu0m|YPhdt*y+Q{hbV;`?OC3v1Y_^a{%jK3IvHU2!_ z$eY!Tz1fN{@yc$Ee;r@aSE|4KOLdKZGXAgeqht38FLc#2w^97)&=qSP*IH06O&T@{ z5{GC-;;UsgNRqey7w(Nd>{O+L!P@zP=L}R{_K2?(PLGARPIDia_MS-ZIA9~ZvI6<6 zWPMc$N_&;M=h-Yw)z;4nhwe7T{TaEqb^~3gb$}%eERm$8U5hpZq?ETHKr$(^x^S*+ z_8#@>I#FClb)=M7oJG61IOz25jNbqGMmh}# z^KD_R>6tMlXUYfOE5K4jCGyw@U{WWBbubcXK!CL17V>sC{eJRr>z%Fpliy7qZTz7$VueXa zPBHc*P@_~970w_Peqh^A-#u1gnJw>LY9i7%06P^X5+WLkvf$O^8Q@Q4%67+1k6O+8O58+g{;e+Rm)8_@0! zTi4pd;h+_tZrR^y4|esPHF3rHG%>RaRx^PwRZDGvX-ugOmTvB0jk zJDp1}g6Xw>;``3;igFu-a}lnSVJWbNB4)Ky7;)_ZMQEABDg^9h9F8sl) zrkaaZ2iv(q{;+!I^sDF%-?)17m6xvGc=3-Gt}ZQJpQ$E$5GmFW9webc8%?nkCN<6q z&A31W%PiON`sjn|gMYr^TW+Iu)2@Qswc_!BoTWN>(z{dFm6`6wK~gNmH}J&g&9v|W za{!64@g^YZyyjW6Cr_4Gr^QC?)+@cP+vvlfZgQcq26G+CdN~$iY!FbZ4R+XTV-Y5Z zDjAGV#D|cTpkC+>+bbIozwUTn*t>$B87=~)6&-;aj8E&^(Bos$9CFTqk!Ig<=0$BCsOUlo+YL6g*e zh(%Wa*Ld^sFUJqYo8w30&&HoWe)sYHsg}ZH8whFCW&R-e0oau4jH1p`sW8zXtx4rH z9}rUM2FcTzG|t@mZk%~moP5z%oaM#I`=nQjr?Hf23WReAzy)aLcr*u$gEd*c?*G0A zZm>4`py>cTLKno8@JgYyR!|YVjJ_RCoEtiDV1hZqEXrzz+Sy4ki%R%n?R7Xreq*=v zO0jfE3Qq{JMk}N-ih*eSc~v}~MrMt`-AE0d>%DHT760`0gXdo8G@X^_+mg&-38}%m zPzf!e(tri5gCs;sEG1Q3aYLxnS)CT~wpxMP8~uHmv+0Tluf~fmNIv{9+b4EOuM|s) zG1A~A4^AnesO21ozy+27Suy|rJ^b+7fBo-o?*H>QZ~x6VZ~w1bjpinc(V`9Ab?C#O^?d7cyT1;*?zp;WqRP-8f4VYn7KGQ<3QmRCqE?Kh z=yIjK#$GE-kvCvuyiI@`jxo+#KX|XTbSpmC-RILY?cYDzxCHZEf*KK)!YYO0EP19X zMioXgCRBtuVCE%phhH?NPktjw{UHBOe|&w;elc~4)RaY@eDiwsZad$tqpdk+n$+cm zr@8T6+yK=NQi`&|z$9bI5K9bzz-elMYAiKmbw#|^9czMTg^&GDnT!im-_l17^+BsM@xc7lefd!IS>$r8shY+M8m;^kQ#48sA@d z=nPj|z0ex2`qpxPQu4Sd<4=vqNeFz#+FQV54#7kqvAg#ZlZ z<~*)e(>wcfaJlY#;!W zVQE+E#c4A>+*sl+`ITbI3>d&1Q^%FXNCfawyFfrPopo?;`hI-R(Sv@w*K#muUG1#K z|G(I?y}@k8iN@F35AZx;mZGhsPtA~+uxOiww}KHt5I2$%o0a*v+#3#lQL&rMng9_Z zrHJSS>1;U!FXC?Lm13!B1TltAAUzV2a2$-6!hu7e@>&+Z{-SL*>{`3YJ|DqBo|axI zm@)KKRyi$&PCQctiy*AWTr%Xcz}!7Tw$|>ithVp@*@Jkev=iY>+usAFScc!w5xAo9GC8!Zb$G)8LGj+hbq7{>l%R{JQb|!D{>V?1+=s zmZ8!+tXJ=FBv7{>b>ZcwHM;bE@pqKTz3sU8DDT?8-Rs9kykvUrZVY2z-TmhMUgs!~ zr+@bR(&EzPG+JGZi?i4&28x{u!5zK2n(*e6WY;~cvx)A!%w!U?9)hBYm z{hK{6D#&?`;~ZHQVjVE@(rWLFqw&c&p%H1Oxg&(*tX7#S<#}l-qS)^4tJ_W029UfI z|2y&Fp)-Gk_ero6QwpFlbCwtveGoxezy_QL7Fgb%>TcSRI9MA#_kwHo@E(>PWJ-9Y zP%;GIG*?0kNC#WZ*As_$$U3L5&QLnFFZe#L-BCkR^sjz_x+V5z0bXvHfIpDbd{ z-y|l`$-}L;w(cjI&?#cgvmB(?({-LeoPM$V{CrQaR+CEgTM|m517VFfRuOKPw@3lT zX~z~jTp>|b+20c<_p5gyt}I_Zy&2K!!%L9?B-Y4tpo;3~*`+k0Bw4B6#XJ4c zgWDT}?b!BDTSM{_ z=x)Gp^!eD_Q zN1(^vBfe5NqnqcMp^9iN6UCaNB2gX*;8B)jo_}*TJ4Lt;>|*s3 zAcRFo#!yy7pF=|0$%&mwT%cJo?7vTb7o(1M)9!)RQG6A8Ms~B(-9kU}P+(L2}|8mxfqvSm0UNwZ-^(x99Sk ztEd>HmhJCiM?q84E5%Z4r&S;vDI{2cpp9o-5zH{pTif}{648$BEhhj#~SyZR{ppS^48k?T6nf8~Ok009`E_d_c_L{S5BNP-Uu z$VRC18eUFMH`P5&SzK9S;*H@1fdd6d00Xoa28B40qS&z<%3id%rO2JUCX)P()afzF z?wOv}nK>dk!?_el^)zStUe@>BbE@i8)pz)4chIE~*uj$fYMS}kr_SdVxXBw+?3h!}%&Dd7$kLs0@~ygq~*ZNF1x z+GkE>yZtHw&1zZ}n2$zSn!7O>_d*fD9B^IKa1BGe?@f%Sy7_-4=q{iCx73)mP-A4u zBooOvgxygAlz78Z%&l`pmFy1sYdr{)dk^k*?bG{hpI%_YT3{7|>NN==CSjFN1c;U3 zqhMSf=Gm-AeC~Oq8l57Vyrs@FVkxIFF`XN$Y&1o}NKZcg^vRu{Ke==N$(=6_yBN~Z zs-`MSk}txymULhlvs5M*v_syZm&c+s(xY?kinfWTNs*cCSGPZu?hkXutA)}z8l^LY zBrT|R=-1(R_$e+h#uS-Ic3vzqxYd^!bx3t9h2)60&SV zq@E!@N};1jkvr-w{twr7MU|quD7!aH-k7IXPwsBHHw*eSI=+-H13N5Pi*wMHMjkvd zIi4di5buOYDn(+72E3mGH@Fpt0q^DMtn#e4cWZZywahh{i^^M%F2=iBu@>J%j8Y^j zF1VIXSR0bE43g3ab#Vu4bAIgGorMbXu-fjBdDjNk83R@#$_OVQK{mmczqRJCfjN&ig#9Qy9m%?zKMbdrI zA?{f;LH7TjX*8LBA0K@w3?GvKAcC|oSt%UI^4}f<; zCeH;y5Sf%Lks|;3O}vRWaVuWWw=`Oh&;0x5YP&HQ9zTy!dwe}gU~=`(RC-|9RlXQH%ubU9G~xo?&zU8E2+YWr(&b3DZFJ9gsw@X)R>2Yw|u02Mylv92Yb zKxah?#{eRFqYzwR$s`RVMpra1cPcpAoEzY?x?F)-Oq++g#bi68+YMNYsMO%8HG&wb z748jEa;5VCWECA8;*f9U1qXajCta`wf!|7f*vF+OH08M?)H^U%N=2RHiF#f*693BN zmxJc&U}JKxncN#SmxhyH_kD{d2v41kbp)d;w5yLS_HXH0l2}U>L1su}7&Rh*Ax>KZ zMrvDBUU9oQHF)qZ{kCbFwr;goV-=ixft;W#yN1N^D*yC+N4o6QY_(SZ+HE3}4#kWSAx8Sd4nqe0?c`P44vjw%Pvt17_{QhbIgFKB- zYQm+|D$sy_gFxTTdJARavF59bPG4_(u`AK4E75vx#9DM6r!W;OBhql;q>?-u3Xr1r zMKgG==4|$Orq=#YZUQsOLNh%O?9QQQ$Tx#=HQ%hz%%?!XaE$k@V44{%Y2wBg&22q9 zY;l$AI@e!wr(*`@TFQA`)jUC#c}p0&8epPjG$z84jU|-3wwC7+KDgf%jPIjhe9m~a zPzI7)|9oUbIO0uE36~RVGy`8Y%<)`1Y~A$8ZnUg$&`u>1x(c)H#e=iftHm;E3pPXq zPXzC*W}GJhQl`Y>9t%U1$jX{89j{$x>J#xo(uC9Qu2o?dBnPLLti(fra4rQ;qe_We zVwIQ78Rx)9Uvvm`bv#@j9mj7x4Xq!HFszBa*gtln=Q>w^uTR<%Th`+owRZ%lu?m2b z$Vm_sBf2adRV+)=PNg+=E~4FjSfWev%zCw8I*`ae}F+;f)loLs1QDOd*kAL&z&M%&P{EHXRa9z+Tt=NGX zCwibZ{drg_St3cI=+aTW5@=6OtSR2GB6*}~;`)pCm)ACl02*0!^`ThEfHaDO4b zsOZu^Ku*3)!eg!v4|@gRhBE|xM0el%S#CEStZ=NKIpHl z5Bd-8<{sATUHG!sB>Q&z)dDIR5s8R^Q7K37lv`qQ@WO>5+8yFSPg1`6;ZDyNteM1L zzOic1ar*z5{IsZ23^+Gytww`+Hi2}M4Ue=neE+BQ`M=G zmP`C*o}0bN3+KUWBe=3F8nrx8;Jhc4i)1Z6)G8bSlePo{aljpCVxqRVdCRf#izXOe0f;i5F^V&E^1xB6J;PXy|;7li8R3rNK zmVdFAB%*QS{QQsH4DD*+s+fsiPtUCL+RE zRJZxGH8}R0tK)t?$>AwDhtwg08&d4Lt;Yj)wmEiT0CeHz2*@dzAPGS z2Wc(uh*>|QlMmdxaO|A*s=+kD6N0WRcP{EcrSO(9?;sggC$QS^LaS^5{953m;ko6+F>sM)v^h!byh}a(1o!HJs4qS z5J6}vx61AZ!?ib7+=F0gn|pB$dc6-% z!6=4{{i_+o5BGu0=JWu#Ku5m^e{k~j>GyK!&31BZOoQQPWly*pEjkX!X4sgTVP8bu zviF%Q&lb4+dH5Th(c4>L_|c`)8U^TlN~8pclX zEL^8#F5!Cd6Lnvob*c=TS`K+4sNhlut~mj&g>=f(XnZ2Eh(oFEwKs2O{oX^JK<-?v z>}p+G9%0QxT}!>BSsnMxfiI9hJQ z#mg&aS1z19|J~ruS+5q$ocWExTY)Glgf(H9LZ!v~3be>kJlPL};czxQIr32MMXu(# z@v4zbHabvDl0afqF^?*9)&yr0D-)}^J=mDs?X}QJ6YQrAZJYUO;Y1jz5<-bY7!jK5 zTo0g_W=fUGzvMFAcD;?8ZSG@Us3+B7`Wznuy4hbwJCW z({F$Er@#63m*0N=?Z5x&$Hz{G4Asna2QW(U z?yU;_&z%J?TS9bk75b%%=UBZ}jaXzPISW=OIw&?vO#X$&2p{OwDLVG)F zpG-9fyMSyTl7I8|tHsmm;5@O0Cd3jr3(9cjMF6LuXp+;Vf$M?4zS*n{Mm^ZTmrWm< z)ydsq?p|+m{pT7iT~1%6!ta4Rc_}k#HS#e+Ruhbl6J=p{RHD{N$_2 zXLx&|oqU#0{+d}q+JoDQ0BDuYobS*D3Lpz+Tre9>-ldUCJrx475M_zNAC4rj`8 zxi;!N(v`%s1f1c@2jg+IlX>KRq=Y6L9K@o7V%&QBgC?}iY1nXswOn%EE|WOq*uNqw2bp$DbuetwkPD)-*Z_G%H#MmxKUm@Rtp-s3LVV4v>a;-TrKcPq&>M z&h2D*<=S?vYsn{s;?XDK)KqMc0?>TWsjPG~9^wfY=TE($)Z^LrPG7vXAm5lTSPh0H zf(hvaQwgN!!jas5p0r4@D4gjJhU2(4o_so5q+HxRT;FlLyv=;IaAuhsh{}LVB)S-Y z15Gr^q^v1YFdL+1^LlLFgb1Jn{%{gb2hA$@7zP->Hu!aOVK59c@nW~;ypCL43VbasA$lRXPgY4w zT(T6yUKMiMmZqXAx>a<1`~5C)_WJX19_d=*ISCO%Z5z3d8Ut=2oKlGsu!I)X$glK{ zpM$M_z-5UPPN&0fj>v@CJtb0R%vX)3=FT_;jB^m&2^oTQQBse<9%ca_TxZeW8}^%% z(-{BNtNBdDyw9Gwc;)olXI9TF2zz(jaW%AFMky%e#!&CLq{2Ch|6Jk(DJs#pg@!ym z9>U~TFqr9s?KX+mag*2qb}jvau#OuVnHCyDb%xXfZ=K>K#G;Ajr-tKxY@0V>I3A7Q z|Jl2`=cuyd{;y2w#V;W~-yi$n;=?k_VpsyW%6aVb1s6#(WJZGnPb=76r?%EkC9b&2 zPF2=a<%@Etz^=&>T+2QTyu#=WUbD6TN6xtj7)e*7BMyiWx=-G!9T1NAYpf-!J5LrN;1;V-TG=LC*ILDMo!cxN1ZP+uWQOayHFye2Y{r|aR zez5#t<>CEdr@q^T2P?L^Fzj@DA%4aOzj=5)?uLU-zqbH`bNvS^QS0Ho&T*)gpgZiG ziJyA#UdP1GFzi5e<-)^1_T#IgjH>1M!7jjGPK4P_Sdvt>iyF#yCrtNl++itbm>3g~ zLkNO5Tv1CT*Mz&cALLQ}uC9!4jsHCUGCuxke1G+$`18H-{kenY+)JDFW{as?8~(D* zx^cNrfv8k{2oFLri@ZxIE*Attma_Pbn7lfTG@EYV`+ZoRJJ|2d+}X!WoAC{@E5(vK zfkTMqT5@G{#1-*$aD@!r^WE+sD6t^i6uY zrwcqMSz~C++1*e$x-Im@+6e}Efviy8dnX)r(Tf$_7_W5}f%oxY_Z;-A1;5-m=`X_K zrjcipbBa~MjZEWj+kKGp7%}Nq%yYBDh}nolseX8djS9g^@0@0aS|O?C##<{xX31B- z>cUbZYt+oI(;0|4Hp;IU(7;uoLGTdW)99v3O#>HRNM-YC_>K;JzdP`k+u^dWMAbMc zy;3ZLG0C4$DBA820mNJytC*M8iY%wp^#+~!D9QBwCq61;{mi975w_p!j&2N6&G5zc z82zn#0@+9v>QwXwqyr4t2@;JxG1f3(asT6-Nw$Z}Ea#8BkuuA($4)n#HKjKz1p*VL zP*B*Sz>)UBU{>n<9M194gV_wio$+~}*S z^W(U%7y9wt7lzNq)Gv>&_XjW-T|YP7P17=&XuMC_{PW$kT)~!V0B2k);~4-)itwNf zbxa_Hj0?F#$DfaDsb}ZTEK=|MF0rWHuc>KBjWEj&(ZB}ntq7nwrPflT znbF24Pmb>4js58STjas3-@FtVpi()?xc3&M#gc~Lt)`Y@hqH=uXDbj}*AkWP%_HaJ5K z%W{6+?{&{D#IK2|^6mP|Uw@O*E5*_Q35-amDI!#a=+`>#0s_LM%}N;8BViV+1>fz& z8*{^c%4Ba&9`9FJv$IT%LM%nsBj>3BroFbvQs)s5C=p0%MY0+}s;)~puc}UKZ(gje z*R#!$z()BM0&0;{TsWdRp)9(ufd~RBy0jLvy!zpvojJ4z-Pa?hKRo%@)BVfmAFNcu z%sL$X4+?RIa}E+~wm^gnYXsV9+THa!X-MDDHxb#i7BMsLzFvx@_(~+1<(f$ZRFjmp zp;U1c13{I?XY=^uN8djB>e0RUSQB(U{(M8J?dwV99z8uje|(SSTV^24+!CE)y|Lbb zL)devP!P@lr2?VAwS}y$^u>AMz@GP=!^8Mt2K}{t|9MsBhJm*e^|1uiE%^gViK(`F)Bs&R^N61RD*1w+bVj0FRcg0&cJ@OjVw#C)+rZhsFV_$=zBOE zm=#J;?FeKgw4VIi)2mNEe)`$dPdYC~M*YW=|9SdZ{o~V>C%2z|`sAyppFO$p?BD8DTs?#X}FzlcxLYpy=|dhHh*U$ILA!6te>IImT3+VI~A|7rUdzZQKxJ%9Gt=|Wrg zh7tukv|w*uTS^y1z+kxIo;c)#WgOz>OLXuYJY;f2U#v&fMh6o5(REm^y4%r2w{CcI zVxmck#rR4le2~&;p`r(cy$%An1n>f~Dk;_su}!DC^L7ZX*Ka5PzGB{KlMoBhb%=zx zPN@#g1CcSDR>;Rl8pjQdWworISx!QUcXfRD3#gW-BP(!CBh(^0>8~^huozYDC<}}c zn%q%q9dgu4jxeV(EBW*j@cq=S)aebD`@Kt-Co)lcvif1a8khXDiblkX^)Qhdg&2!F zNrO%$?p8`qqM4CqBMHuSr-m|_j;U>@yLW2%;}3S3?mN9nz<<{!ocgEMp_s3t3@2p;3_p8-U$9HR{mAiFA{@vAI z#+ST!!5``$zFoaGzMWq3tWkfLMvhK)tm8UtotA%jse)M5$(lDFy}YJm&D&4E?1sXW zt_lo_1!Nsjns|;Siw=;DJ0(~gvfSIlzFV~&S~F4~I0;6nW)S2#3!d441f+@=!rMU)xP*b8b6!|_WB1=L}p5H>t7^EJBJOQVLn z&^a3|$0AhS?M625FKjb&Ut5Z?7~v2jRE#YKr?d?M9N1u;h~6K~I=C~?J+}zX5A6B+ zjIn9qwq|%6Gu$Y|QfRqEMtWqqG~6*xHO2-I7m8Dy1#NYu4}P)U9X21qwwP{%>3Zpv zf+=H2#;{@xjN?EF#aPCj)k?-xmYX#GW_+tN{-^Pms~^SK^V=Af{%;*x-i@JUj5a@8 z{q^|kmZf)wngO!`D^)FsUbhR#d+Zqj%bek!@H84PbCXYz0Sr3TAU&q(HK)LiZidSC z_Vjej$s`$z4#@$EW{UCe?Z=AKaWBji%H=XBN?1i2r~~#J829C@12f*v(qdq7j??_hnHGAvJdRYdZbGgk6B0)q(cnV zu%g(qxQQvms11Z>Dc+IuRd*ZmtNoQC%Qqk|MOTU_b+i zz(g@(@{x`Xqhyv~u`TN?DeK%U$x@twGtZd->X|Vl#=pV=jmwwQfU|tgpH^mcqo2-D zM%O#f8!MoxZLvjp8p>1TSd6h(%n>1wr4|m#ND;(@rFk6Z-PEfUZ>K%xeuYlUb;2u! z(g(>gQyd#)JO(F%aNNa^Ly)|4l{$%gb$n|rp?j-MyU$QG&2wu>Aw~&J zyaKN&W56WWSse!7UHg~suHE?V>c4+?^N+J>*_u9JnZ#hW%!7t)lCX3LLuD(i)wo!iNfD+3ocfc8^ z#%p20fFM%n=(O#iYuhiRa`&1UZS=>vgWXNh_sez4bUntn9ZIpeZF{p6OYzl!oK~73 z79qAuD2PvhJIkoZim8rPi^lhtd!4G^nP031z0Lp@d#Q6~eTIIb4oK?c;NsaD@A}R( z%S{8MTw8+SLRfEnz*L4Pk-+1E6%@IwW4V(s><{0aCUB8Rlco6A&Mk=J%eOL2Y)lA$OIjzsnzxe zz&oR^ohs2%+>KCz$Jou$_#hSIQ4az#CTfAmDyKcw>kl9N%6Drng3-Mzera^GbGEYQ zdrQ5Czf1m+J-^0L@bJIq4%)$1yVXoqtXlax(noz2Co}SW;teI~i zJ@vtdFV((eyYB;QrsL3EPA=lYO9EK3Ar?sQ?USfqdCvOQg6Fa zjAScg{VsYMJIGGG5M42fTwq}|mRxJckOM5^0wjqII?tt8BYLg&bRlb-58XC+c>!~= z#yN~VW?o?A2@u2uQAjaR!HT*ruGc^J-U+`Hf&@0${VeHy24U@g;xUV*{z;9 z`C^An*Nb1#lfUxJxWCF(`xkrtc#8*2&t3lE&rW_gdGUU4@l}va|Lun-=1&}+KmDUZ zTmnjryHqiyIYz+-VvO)k2`eQtS%=Oa_@$IE@9tgSZ!*BC?LZUd@)p~aK0w~q;q>mc z<-LTsRNE-i(e-l*<7fx8<2o_3Sml5in>9RXe1G+7CqAsKUah-WzpQI(?sUdq)KBg` z8)MqmKh09xaXw_l>IHG1A>fs8k^^AuL;$P|1t+qO+>Q;>0pNvoIs3h5&}LpMa}CdW zI7+pHYm5YTUb*P=DisWqTsX#q3M8uq;|x^YfwD|oNtesFA% zcy#<;&tA;77G_T$ZvdrKQ!MgCF^2>R5QH%?%%B>_Um=OJa+KBLfy2Z8u`eB(QL0byk5e3!|Mx8{CDxc>Fo`Q=*IB>EzgwD}n)%8(r`@O9b1+pIN)#kG| z9d`OE! zWLJt~0LO&n6ciCAkccBu!rExDIL)$84}JwM)rV}V)S3DHeg=vd)(Ni=N{nLwqOB0v zXn}-RT5F0BQ$ib>6_S`?suZhhD$eg+uKI}s6s7CkU|PZYM0I;zGK$_7ZPo7iuj^qh z)jCcwGEN9Wi3*;26`YVNSQj_rtUA!2R?9G~Pjsd@t!a!4onD!~FL#1T;gupOsn^l^ zYh|3|##(`?03tkqvUwTli@giJJG#+X=#Q>1_AU*UFO6 zHj-BR@PAAIrP_T0hcEnD~Z8`hb# z0k;umDcW8T;tW`zmh%{kYNv@41S=Cm(yZ|#y`^|jzg#`Mz5tt>hh~0LoPo~21`!s* zN~j^)5Km01cH{_)z%-{SD8p$M=hI<0Kf1mI_1uMtc@=xl+iMkY`N=gMKq zsD}W=T8v2QJH>)4OtYw~q3e46ny_fFso%7Pa~pfIPI#qI3d(T67BR+^$5t>9GDPEo zvBG&X&_>tSXd>G9f5%6Y>x5SdrF1S}q?pB$NW&#CU_p9~w8%TfUYq84Yi*k2=W_>* z|9|$b5#e^zXjEwEFiES1#+orXf*|7*y$$ydawRp6oR_jWaM>qNw0;y4Tf1Ka%o_pTs ziD;f}7JIX+XAVF6C7jb?Chj4GI}V*v&KP2imuM!|3+kAX7M(zEg`hIL%o@kIQBlyC0_DkxKs@ssZe0-(% z@nfg9R(d~`;%(&HnBwi>rxinCS#5CE{er=2;tgkZxXHa99+7j3@4ek$z4uOkwSTLB z=idAH_qYA8`?vf5b?8WZV#hok_xJeRYpdb#Ex>6J^Q;~^)wwY#>drl(>LR+pi)mbPGeml6m{`TPJ`mY9G)jMYK zsd`UYi{}S156BL@yj=HKWJ>wsq|%ZRa0bbuP2?82lNfWx(X1xh!7uS?K3o4_aI>}k zi@~kBHMowl;!DG3p%y;z7lS+N?+sRmJw)|OgOBmwZ{y3K55B|y$XDzC_}u!vMq_Mt z=qya4*yf##0x8+V*fO1kr$>uYhI_%OiUCMnpi7b4Xqs@zToRDCkHz6Tw%)9I^Ht~Y z(v@mHF2_1~__$-ZiImKy&HUrZRh~PdUQ9@-qvM`2PPhgi0t-|U(3YBzReW+1mdB(I zHrvazZht-~<2~~YttX-@MiCG_Z^6<4+AGe8NZM%hr@hM>esVVU@I8l>P4(8oMSQB6 zE+aaqR(_uGHWuxtz(K=2kD#TlhXxwk4ytqdbPw};W5VU*|I&+on4MB=8U_H0LV%6XHl z1raQQT!o&7uL)PKAFFGFYk1yn;edTNLG%yw)_`N9l(LxvLVIM90GjtopXFN~)l zE0p+X|3Yi+@2jQd-rDb~y57F+8g%!w#bTQjOY!Agf&eR+m1u4-rYuu#IPWW@tXB8S zYd03xZglWrM{JAPyN9NI!tBm5Nrq$@byQFh(cQ)u zW!^C5qgP_j!DSDf$&HOa>L{|eJY}`8oQ)e{?3Klbi>sh@y4y?L_QFU5Brnjx2NR?ShGZq7 zj<&zQh64(>9$S+KI!G9+$5@z z+E11M*FKVDt;!n!`QYjYfBN*F|L69pZ^f081%d7)=osfCTF6P^JZ4PoLl+GQ84fxN}li^-MY^&z(N=>Q7DyJEnbd_>rY} za7su}Xiz1VB%;9u^})ypOxUc_j1x<3SZW=Q-QIkK-voT^%u26yxpfBZ`L`;6{?SX5 z*X%Yv(YTFcdl79h6MQs;7{MVaQ*XjH9E2m06S*iLXku)x@S@`Mu~A*TI$N$m+f#kbr-7E!rGTtme;QJmSAb^+I%%G z_%_{0OhMP?F5)bO8xrAC>Of?@^vB>2Q8GuYQap*QlIZ_@xJBw}J&1Ip$GP{Uk+>;~ ze$i#oW`EpT3kEV8QX>MDVUTNoPmXg^hU zTLoAOX$sz&B&|pSEE*gtrlcj0^}dp<(BsAP^(4}Z=(a8S^Kofh^-P26F2h{M$*>UE z;r2O}bc%JQGS$HbSvOk*!D!4%$c%m|D)j)zpwgt`u~kz-}F~E{$W#h_pBKPQ?Fuj-OF5{iW%kc zB9B@)1s07;MJ(6U;9o)Otf9N7Aiz8uJ7qqmQ%2-Ym5j>VZ|dUAsBBMV>%=qqV*;OZe&tf^;fTS7x7+x zD?)p@PC55l$KX6H!dQcQq^O1;Ci=k4yv@t#Pn2Xa&cKX_V5u;gqif}e(o9ifnanfR zPNF9ed&}Jp{wlPGy9&1r!)*@mE(dt55KEyo#MHamHMLX<5+fmC1OsVI$lH)HzfyJL zhDN#AtjKto`L`MAa^iVGQB@@jt0iaX0-UJ7|s#?HX zZ9?(x!7}yo?u{L#Sd6dN0E}AZc%%{a39t7kctKk-kGoF zW9tk`y!Au4xB{)yms`hcB?U8`6549(Qr7g6Y}Q%13@GJlAdbpFV?@P84O0LXwBno? zDzmba)s@zncq#Tev2_X-V(50N3$fWvybt4JXGs==%(XEp8sjNCu)sW{3cVZ}OiEeF zqLbaueD~0ih54ONaUC)=&%bPW>N5&YL|2MpOq5EMESfMv#8i)m^;Q$7IpmoegO7$= zaO;Wt-?i4?AAGU?_WISqcY|B&@2tN&_zYhh{CfQtgWK!x;O~7iSY3Z_{q4c6=eD1r zF=TfuP}x6zh1}EVvk<%>Xwu$Et2lZxlm_jRlIIv3@sPT?b6nx|{Qf7Iwj;CO40ti_#zhn50!*Zh5 zU#)cJ6S@OcXDPNjlk-K*#WtpCf086iakc{esX({_DLmy&Qj(kt%If5@@`A@#P%?{1 zy+cQ;CZN0bxmBCQSBhpxfeJ4<4Uv0?J{A+4DfEw{!~T`Flowa zwt_h-y;3Zr@!lHa0#z~*Ru7X)(dvLoS!WHfa#d`1dn-#zqiD|d^}qW@%_k(KW;nj- znFn%aepL12itjz<8@BMPnD4;_j?R{(Oa`C~G<8NXswE9s!98fZ@87w5b)~6T*hkQI zlkiHRL=-iFB!hO=2j^vC%6S$Pvw7>-FX0C+tX=Cg4TSq?AlxjyLNJYxU})W;L7DR= zg~US8+AA4Y-m1q--A?QEZfAZ0zecS8*}I7v?(MEewt-ztKb6q$1WKaT3cpj5fJBQ( zIJ9bW==Y;)`S2XxQX4MRnXa#(T`es?`tj0*xZK-VH&Tzf+fq$FyT-?hc4hZyOzat@ zQeJ5l9Ty;&)|>&M8hoNWS>YJT3UKuQ>E1j2FZ$p1Kk0woU){2xuu*LAyrl~S%a zD!o=g6G5rclv&CI@t~|zEGq%f!H*o)=x=n`ja_^^-SVG;DNAF8SPE?bOYkP)M)IHp z-ZCl?9SIM05GAX|>F#&0OKacy^AC4d-2HT9SxEzOu75IFnx$aZ2bMFT zgYq1`7#-xMp48%I0fKC;)ard z{sYtAIuUi&?S3q_p|^r|WUt!5i8kU8`9 z;@Yjd?{>Pr)4dQE8R65 z=iL`QK&R$miP)dD7U6Ptc{#oW<$+UgyX0Dvy8%?pph$QMj%b0`RH80M0a07Vxl=I1 zTQ`oLdnQXaPMkUZlULq2_ZLr&(&LH!=ZXjR1544_6k`%x*+7^F0a9yEwWV1p^0~De z!w>#je4?~=Bdpy(BE?pyvn7kru15FMkJ-*ZH%hpsp;>Wb`N9+!hIt|_MV?dV0w`)D z<J#?9`ciE@z1T- z?xCZk8wQQ^+GWF4&MXZEogE{!NFh*RI78h=lEOV28Ubzg1jx6tZZ=vO(Ym6tR zr4Ag%qk=0%Q3x($sO!D7u|#qcNIfgeaL-uQa`jW)cBnUN=goO(j_epX$4RghS1nP$ zOAt~ehfpHIEJ%yir$~^sAnHo%%?di*??3FU-8kQUv_QQ{H0~=0wWBDDVRqa*&_r75 zI2YE_dI=GF7l~Msmn3M63rA4%k`@+$?@m|zVmf|$4gBSED^2=Ro~-RoI? zVtn|yEwmon&^psbuKDxTF6-$nZx$nO^A9JAvKVQoH?pW`xZ}E>Z4y}mLZflaWm)Er z9g`Y~;Nmyjg^$$fA>#JUHTm z%?!^EXfBV8?HVIEmy*tNV;l#^(cKr0N5N!6flwwD^UiDxoygA*81&NF*oC?; zAV2Wh+1H;*g5d0lxiQIs;ir{Dp{Q~KjEe*qw}94x#M3~H7Fo6cYLbA@a}j^9+1xk{ z$-S+BlrrT1*}JypIF9T5SEl$Z+SB)GKcocFluT2k7+#zzzo`0h8W>`C2A*BO2A(J> ziOaE-D$A9W#hIlnG*1vXn-}hpnQq! zaGbALC&0F-(hO(FTU-c3{|p%`!Qn6hjX8_*6wg(vs3WcHkJLqQej&NG7&0te1}Q_p zu{4MW863Ip(3u0(FD;){r3>Dl(;fnpSnJ}8o_RqjD3LZRo(daUAsTo zw$}wM81*Ke1Eq#?rBcP1bUOWfrRa2f(#MXo-+@oIABxobXTL|>b! z+10^|LS8kk$-~UJM-TVfS_8#0>)j!j=`hl$bP61hkycCUq7LVtDy63{d|M6GN?zrgvx{bqnExPG89PJ6_UW%5dNS7-Pzg2-{(bKa&N=mGgx4BL5Y7mY$iqi< zN>k$$%|Iy$Ix4aD>92nCr}y6c^vAD!_T!H}x$(lEfBw;DzxmJ4etqZDSAOz;Kl;O; zfB2Kn{`L2t{`%klbmz{ew}1BO+aLVz?O#0N%?`aQQKv)?id$QS(^@E&a^VBXFse;4 zQi>?7l(I6aqq(m6`WODmNB92e-i^nzkLL6BMt#@Mf*$#UFtybrV=|0*MtDZGf5@~< zQ>~FdlOS%|>q6MRGze{lb&<&NPR($!UI9Of2o%)e}QNCJpaeXXj}UU`v>{dYOSpNC7#x$-TeBs zGnX#RetK079z;{ZkA3~Z*$Ypdz5F+=fpG{_nkt<+>A1z(5($iWpB_6J<-PmA@+}`% z%uwF+^|zC060S9ygjt|ltDQ(C7(-yi;5MV z$+f>g4`01Y(4)F|`N}~7wnWqhuC=fyQYhk$K!zz`#z6oH{25V+qn!^<@BA@Pg^s-u zJFf~g@Xta*^^$)+RHvRC9)$Veru5^-zWSv}NJb&kR)3H%3{sv#>NH2lX`KnqQRWEQ z-=KCv=~kXT_xSrlp8n?Zh^IBJA>rcM0*5ULh-sT*Z@vM%3rd8y0Z0IjBJrG3_l#C2 zZ}ii#4-l&#lwMmfiFQPR4;I4a%#1k52uOmRlqhThzRQaZVkSGl(m&Gi7v zPp9;B+RwEg9Il%$$+kFC9@vzGCeq53@eny8oDxo?%hLO^w)>m}kDOwn-r8RK?n5HC zdhU6GIDZ~Jzx3>-Z!JBKYm905?zXsaY$-N2)f|we24vOfyDtjvP-WDK+sX-ce#8(MwJTk-EJRgC(K^#h!O2c_2*%uHrV5t=DO z!g^OEG7~yqjg&ZUiPFW%8$%eE)o5#SbGdFQ+p$@@d~D;>qatjHDx?N8q;Tp02_?A@ zjDXWJ#s0Ne#(=+^$QF{Nfesx%r=ElcLTMkBBJ`DMWWI05=8zcMB8;@7#5l#Aa2PXe zCGl}3L6|y-%0t?`2n!F!c`?ka-=3eJ-iK&vgzMZMB4x%*Uz} zVPb76gfwa9Juk!b4C&x1C9gtmHETv*8OSv)NxYoo7OetbI zwZx&QRo)>*X%`HnkZD^g`igXp#rs_|vTKW@5)Mi34DzlsH7I3)o59;|gN2MEPyJ}` z?Y$5EpAYW6uy=d!&ZF!B>reUxAy+LpZB=I4=|#A==UK|NVhW748MVkE9A(BYtwS{~ zlgqg&o8zwDjvs~eu<+WVX}LvQQJWf_vVbIGiXmy!jGDNli2uZKKA60ok6#8VcsNZ_QceW7%AfsVnMP>xAVOtPk@z?L z)%)))lk;kQ;Qy{vF)n91J^HS+&Q&masq0*5+G-6EOd(+*b(9chWd_2gUYVHSX;fFx zx7Um15Q*%(I~|bn4`+v)l^XB7+pErrw_eSOrv=crRZWUDXzU>6)+iqMBK1^Xt;*sS zU!N(5<+RtTDP1hQM=DOIUy*T>_@H!Fcx{o)fcmpYN|6~vG-6V*Oe&cfr{ac7&J9j) zzov$2`?qrUUCzr~#a-ga_Sx>H%+dsZO9p7wdVCyGpA94d* z8^qe`n@X)BNLfdm)>dPg5}`3kr?ravBs`*l7Uz-k3f7nOFJHX;2zf%M-_{xm$uZ9u zLIMdXoj}YHU;-INX%yZ6d9|fh0~^Bv{>S~?VsFNe zzdU)X7_Clj_6?;Ez^Z;wdTqfpC{>bh=IyRO^rqPy<_$2RGR>kgI_Ij>Q=S$7-K+Zz z=$FbtSzJHrP90{Z@eURGinP_l-L1`{Y>Tutlyjm9k%&6%{b~vsQXsfgajAQ~UJYS% z(uWUcr&8o}MPpM}^GqLDHdT|y#TotR(nkkjZmV@5C{SUUwaocojuOQLP$`wpcvN@D znQHP@X;zX;D`i+7Jb5D@B|ac{y7K=pFhf&$@>KClqcRZ~wbG;MB|V>FqcwI>fxrdW z^4D>*Ds3@&E7>UR=BX!5Lt-bx(}*B_{KpX{Q#QsLH}-Kv1asur1)7vHFliL=<&|*- zP9@K%thPuqUWqj-8;aG0`Hb zdiEXf86;;Xzi7rV1YE~s3+M4Vo)1W`3*@YEN{}c|`I*VhEtMye_cve*#!WqWy?Zqe zzZw~Kfuc*fa4aedxBJT7pLnzXo;UpOB)hNrr+?gi$D90HyT4y}p7st`7pLz+06NhK zVlB<0iYI5Uo!(I6F%&b|y51y5<9SegonXh95DdpHr@xqQm0K_zt-`WOu57?KJnoNi zG|o-zQ}&7DlF10%zcu86b8hDa?>-^bo8~sC2xvP{HiU&CK1yTQ*i5@j8fgqQm}ER9 zIEzxkOFOT6&vN^h2VKj?(7kuj>s|DDlI#L$f|z&qqMU?_Wo7efpbFc3CiEUbCj;^a zrQHSAj9ZLlRCs;G1G+Z$pOlYQb4YgHw6OD!`Kc!dO}@YhN`fC>+#4j{g${6wM4Co5 zLY}>nYSMvl^+<7Y?fY+5NLUokT$Irifl)Cab!RkUU1yhd4al4+q_KhOh02@*rO>LGZ$*k0z zC&$GI9h7z#SQ`lh#W5u<4aQ|MRF!vF^QIHz1i226bRp;g@pXY6$kZAYEFes&97vdY8Wow2unB3&fqV4C1CTFO@6T%Y1bDT!=fyd9!)$G4CX}uMv3%sN+;{ zOdQh^Qh|ix8RDD^=~SBeb2=*C|E99#C|Rq@jeInDx5~@Wf)4sVe^WnDTQA2hP{vAu zi(B`0EgzZ5TS;#7s+io&NBQJ-5k{bz_H_5hay_CAvg`s?Lek8}`O=fyTQKyOa^C*} zRiKGZs{O5{tD8?Gg|bPJ5A&Tn$;M!E)2h0+`8Z)?bG7up$HwHQ|GxDxY`pqh3 z*HjMH7j!=M@m#HnJSt#1(Kktqc2QO&>?c*lbOigrYEn2j)_8FAH4HVzjlK#oHQY_) ze2;GQH7Hb8JB~T80M-2N4hm4uUOjvH;!-F^oq8OybQQdq?#7*7 z=EHE#ZIx9yOupl<8V>(dGl668Sk$Y+!vLWRJz^Qh+<3Q@+KiY$@}o0KjUrS_nMPTQ ztNCEyCa(_$x!3LWwYBBkji*=GlzHkcMy;AO$g&HxIn|WgC{+J0bf*sU?N{yAW}&Lm zmfwe_F`WLOpNHvONp^y$0wrWrVevcVAatS(%biyjwDj~y&g~kUxvgB&j%8=56JF+u(?)@U103}D&cI@TywrPZ2&HpldI(rl03Oo z7cg0Ghoy`fUw$ea31Jt`GiodFC?5gmWKKxc z)KqKsAU%$o^QgePKpZS%E-q2B^V;OC3cPz)EtpE}eX4o{4-2pp{2ViwM%}Taz&%o! za?iBtpFA`OF@K(q9_RHagFopqx>vd_YM`&(Qt+}YZNf*BROEDsI|KN3? zT?FgY38JEEw*L^i`u*i4<+xnUo714js>>#%K^ut9YUZ&XYB}sasPI`yy}~&9w?MPAigfJW1IpZQHjuR z!C<-EAF}J2EAAh=gW~H1JEJngq9_W^t74?`Vq^09ARl>iA2U+Y--GkE0?rX-7npJ( zRi>k64lk6|79?x1^J38#2_MXy9+qGi2ns3)L)ZaO#-sshESKDAVlyK|ly~%9wf(Xh z6?y1RP~(MRPw(f}kBHPsu@i)ubj(JPb?yFg$`SYb-CMiwBzOOQ_rLGHnC$*+_jkMR z@4j>Q#U{3({ve%)YlKX@Kv^+@e4H8|%|K$;gJ*4<^45JY(`7JoP~=^pZYfi#j+)mD z8S^4pRr~94=DSk;ojec3BNFTaK|oG$5#<$MfbE~IPrHK(2#m{6R}SpmsKw0HbzAch0gU{s1OMQkCd=h|AZmso6ywI9Ek3^SD*OQa#U^WN`ZZyzKsCAL zKLnfuGtOP}5#RS?&tYUc9=LU(txPcQCPY<8_g>k%vv(_WIeobIcCz;`dpDc=$4(NL z$0O|@tCwRZXj-YVxCIH9)yl^DXhW?)NdMSm0~XbxdbeTD#;h3vEj2P~+0qwv z5&w_N|e~$EGZ>f3hKp{*v%ICeWxzx)H&Y~!8P(6i1^wfOdDFQ<1WW3&o~w1iK76U zp2DSjMm;*X>(Sx0;#v78M@|`GP8p8qr4%qvjoyDH_6YUmVs-;gnV(jCkplWV?v#F8 z9*umqIHVpMbJ+TE+2~$++K2bFPl6W#)@CY!Yg!6duK1$QKJV(%9DzjXKUZsCOrs}) zIaAX#1@Y-4uP)rD-#%eY9-^j91<74qkBn*jM6hRB77UP!SjPhBV?)zC-?2=rTPAgv zxbhTMm`>XUeLBk)rU=auJ(s>xU0<;(7)5YwYl`ieTyyIZ%pa7KLt|k33=PjyEHgX> zwGft};wT>1h@ILj{#a`3-q2oK5O)sLk!b{uuGog5xq+rQST%IthN?qnWv=)o!lV^q zcC-R1K5@5MRbI}*H6h7L7)5aGDF$Vj%NH(wk#4~5Lh(rwC+SAGII z32)fgvCkO2F$G^SCcbLEbV+7++P zQ4TvpUfId_dR`SJ8fNKUV5vG+PQmceaC7+0aC7J3C|TwA^oQ?DjibK~pYHr>j)0Wh z)rmOk;-El;RT#dayFS-wUMU`>y_iX@tT&Blxy!4KlpO$21b-GC)4I#m<%3QrxSUWL z#dzgxTsIrb4&6DHD|vuq@2lSQ;xw zYrTH%7(5ZYL0f~S!6$^DCFH>aNH^$zfA|MF*T33=O^&o&E$cX}15yN^SoI)=TqjG# z`>mWMBfyb8$&>rT2Ph9BD1bp*@q8SpT>G9oIV7o%DN~^M1)(TK(VX5Cat#$gdmZc| z*jFv6dpg(o(p9pSQ0tpCLnsY#dkd!LK{sa?X0P{Qh_*lXAP8W$?9B}#JnqD_{p&f6 zYh;|OI?iK38tan}oiwJT|tXLLjr-}dC z`C#~L=i%@v{r?3RZVg}1Up8f7%aMZp4Pc7k)nank8gdluARPFPk2NRoSQjr-Hw@m% z6_2I_mg-671R>?bS~s!IfGC1r#|R9=r6n9A7ecJc zu}q|M&Fu%u*_pO-G^ghgMVj|n6E#YlEwV(;I~a8qw>h5&R`m_6v3)zYFI~BU{P|B>T7mj=$_{(o)bV9 za|Put#Zgpzh9_Z$m?SL7(5O5ror-Fwq7F$BO#3PhpvEOUvq-=4IOq9q|2Ya9HG7FN z8cGp} zH9L}Re^^m~KgTlUKA={C@OUW^VPnWa*fP21jKO~lo)2CQz8gHF%hZ=(@O1EhgYW6W z_2KIe2Vc)w`sM6Vz4Xt8R0PM^)g7pKrsG3Jg@NJe$X65x+fWZomn*GtB_aKU>0*u~ z?tRi6hLFpDUHN?#j3PJ=Oh3>N*KTgAeyv^~Lk1P=INT4P0PY;qwxGx7cdZng?G9X6 zCJE_5IHxI{4E+eH1DHWv1m~8?git()JnRL5X1JDxRYh^J=_WI=tQ!fSyM~Vj-?8g2>BC;qS2x)&PXN8|78m;$2n-T9BRY#CG@;v8%9+1u#oDtC%VxHrAA30E($dPUrHhMqmM)!r z^N8<!fW{T+DiASWS62n>s7fZiTpb{o4?JOV)*6V&bzdI`3`EqYT1)5?d@uaf0+8k3(P zALc}t^f$$n0E=|hz*1eEYtOI<`*bv5*3d%s&OX9qvJXBH+!?B-V7?IhSQEWY5WQE5 zp~s*V_eWCbH8)1Z|HNS2XDshc&H!U}2sqM3Z>(^Z^GB0j{Yh{m#Ok1?s*o#$c$+?- zeo+ega>|^Z6p#pHZ48!~0~~>yK4zKFIBGcbDXBU|Mq?an4bQbZOSf(;vML@9i34tQ zMbK_yc1X+H95_zFtvr790;cEwF_iKZM=2CI0HFvDEfaYLUwh!?Q3_Eu${+#(O!}TUmT0;O215L)Z86vC=)*%sv5n%~B3Z%}*&icb=H zZ*zgV4CD$C7^;9=1nbbnj^%NUUFb@o&OZ$|hc9@4!_@dpZ@>N@Wtrj+{dw7HUYgjdd#=O=R3cmZ>P6x?tDbw_l!R0DH9PLJ|F$n z=Q|&iUGu)5D$^Eqetz-YTg%t3Enk#J=*L|wepc;G#JEJB6Bv-M8O6sQ>$%>BeYxd5 zik%(6PXv3|SN$O15^bB>aN{t9pwB$z#+r4>B!}~I5KAGfV%4%RSFY(&NO)S#%c{QW z&Rf&y31AK?if&sfU#0M$2+Wi1-=$!YB!uNN)(3^8gCeNxw+eG1yc@_i_!{dmy^AzU zFbUXDv#V2<|k`Fl@|q{1SWV229p> z1w;tAxW1OGchWAwo%0}q2z0aJakAbcAlcad7**d1B7#A>mcaXY2bYSP>;6VWUmq9# zlQ}BmXUK0mNz*t{c0^d7u2?2gx#E#G;y6JI%Q%@=)g>2uL2;}Zz=bewDcJNhTQPLs z2?FFes*iBsT8ifz8dr?+Zk&Y0r+GkH7%<8kw*j&wsE*%i7=>``n7)Y>Tk|~EFrjK; zSA%X~+P3ZlCf9lIVwh7{sb2^(IymC2IX_5JT$gNEfuazGJ?yy-VyTC!hfF;{*u#qF zT0XM0fUDa28lQC?5ydP{4Oq-gcTRxZnHvBUS)ej%DI67+p*Ceqkz3@5;D^V1|q~~Mb;A=#(5_e$A z+P~o@sSC+r9ft?-6Tw~pJq7d0%g4Q>_%p&0AbWbA5%c4i+8!!CO=e$CL4sR2AyKPL zF#&m2eA|aC$vm3$wSc?gdvi}Wq!(W8g`W&B0<6tb48!v+u9B^#)rBkge(`CVvQ?+C z<%m2jsXi?^h@c1tRZWK)hBo#b$F-pC8g$R5sMyp3L&sd_(kpv?6##_@Hf2xCZFuck zP=%rphHaz;8kbLXx%ltD{eeKXBEcp>JGr9Qu{eXE2nIF7HXOdwt-)^w-wiegPY2Hj zUxL@4Ohi+q^4w9#YywjRuZF_fRd9L7*O?MxNIaZue<(#rk3!}QfL1ys?Ly@b5mhXHF2tA zFDbir^TrjPbiG-)g)nY;fv#|=xn751pG0Se=`yXi>XW>oa=>Z)gir@j0DZ2+ycYJT zMbj;GA4aSqb?h?ZZh25m`M3{Z!pc|K#a-vQ?&gT#3WXx+``oaKLTza;J9h+D3D_$r?s~W{vB!zX7Uwi0@ zU@q`H3@xs+`o*kIlDI=a=hf%QoEizqUk!h=7z$v~H!NE<46e>M!{3)Bl0O@Mwetb1 zZv6G|tKpO3S2FS9NQoB>V2a??geo%mx*bNCbz2O_{W!gm`qHR7P7KnVi9EiS!;k+J(p-F@-TB@$;8rK>>5}$xzIZ0Uq z_cIbPJHt7Avw#a>+|gCn!J^zdz4gV5nR>9|@>G`Da%N;8U6 zKtCJF=wmx^dLDH1guHqTX79SYo)DO)>)!V7Kp&HC+9Od55)k1@O z04E}>44Tx?OfH?7sU}hNtA*T$))~Zp_=IrhYliM|&Ha}X7sF3wz)eBg9q>v!k&hG(^Zwg4ICdifs2vhn68BkMYR;Jn9bcd zPQrMN)#bHti|!JmbWXjiOv$XNaI6MW1kXr^j>VVz#q`$GjEqvf(=P6SWSsxKejfBe zm+k?I=YAXX!{QNwRkzW_zQ0bF`{Gfb{kc4gw?B!BXOoQZyjh%4?#Sw@Su)R37e`nWR_a>A@zRzM6eh5T7dX!+wWk)`f2068WHd>WrfIj zro@eKgz3M8h|USEwgiPam1CX?g}<)-pyBOkzY=h<=QI zMAPtzmWxz?D1t}ZR%{z{o$eku5x7qQNm%W!?0EQtPgka~6v3*CRNseOZLe;`2_j=n ztVY?XGjvFLva(|P@DsrvR1F{TC5$fi;iz9)quj3?gw=^qQ{ai<4M9!823Pgn1(?#O zW#jXb1IhPOEru|bTevo1o%WE3*@`$94z=Hsa;4knURS&r0VPh?o1i)Z7h_WY}avrq%aZ+(%T2F<( z402RFWmQOHEtN@tc8+@_Ltst%Hpj_{5GzB51`*c@&1Fa)OdaIbM?d5|QD+ph5DMTB zE1IDOkSiPIc4vP+UA>;!+1i_*idDZlfpHdbA)E(+VY*z=>cyFeTUk*k`_dm_Z(j?g z2u@XG20rGhby%d|nYs9@OLKHmWbm?@$o=?zF^>mpqo#!>_5fCf+{JVMB# zgU+tNIJ&gUpaD7d+FxO7_ z5@adN>ph=3P4Ru)+_6!XC{;6C1)>OkP0Kft&Q&mSJ4=d3#Gjnpv}#X8W#FKW#aReN zaA-pnIyTo>yy^Ag?N2&*+>1t*V;>J?_D?2gDQFzp9-dzBN z@Tcm~Qn}K$Z)W{C!BJVv(b!K*hJ;y$7~F*(ObBTautrGIjiU&n^PopqnO(6(|EajM z59!xQ^OQblEzeQzfeg1WtKOS*;F^;@Ec3>y6>v^~lpkbgQJj^x-%}9MRCjc0I^yh~ z!yDs^r!K2#^zaAa#WIpRdLTG=`PRGUxn|3-8kYdv^-5Z~8Qx9i{i@mQ4lClJIh=xpW^9o zS=emo7>oEWZlnaoxSqH2<+GTh0c$|df;2(Hvst0rJ zF|(#|ruEFdd&Cbow=zW_xETcONQ1$M!4hK=!w9TK^y0byXYW~h<2cg0=T|g%vH?=6 zs;*aSfk0e|f@xcih|=!D7onbHOEcY*=^oM4$=)>##|e-GxpYf>nhOZG>q)3X`l{wQ>kMI4c`nqbTFuYEDi6HV?X7EqWEb@h0 zZ;ASgcYcxNRUnpj$)Exb=S5XJWgEISxYT(c9^*xHkQ6m0AMav4ruce<$zza85ykYh z=iQxDD;G+SQ0w=@&IcUz5{p!aFOAOh1&N}SZ< zf@x=nX&C8LsJ5WzK&H*j{l%-sdhW2C+oSgNU_PH3q$4mpLzW0Jy`-~eVe{Bs?76Km zk_?+yy+KpP>-zn0!2Jf$r(O>vy0(@Vszs)-xk}d8a%D$eYe^K zBcl-(t4Att#%YGR<$9_!lNjuCA#&5W>?d;}$O+N;F5%6qLF(viCfEtjnYu8_ZG%q(z7bd~xaWjU?=W7l`24V#BBUA7`{#JEJ#6cO0xGRr0+$j{cd81n zStVWYZ%GfP93^b;sA{d7_lGX&6?@VMz(-&kF;Y;*&$DKpKV5@J)-gI=1Q0>j6wq@l zperRzpR5e5Y9qDwQycKDsSxc|J!f)2R@rV|Fius8I>}R3s@RsTxo1*RY)-2f-li9r90cb>E4#p;> z_FON}GLgB_cLjuGO}G{^oq*zE0aKbfH_5wUkZ9Vq*B;Gp#|p2Ezsg-w+_gH+FGK}_)b$W z1lAzAnO9XP%mX*q?9wI5T7WZD!VCun*BJ)8HFU56ZPn?7;-}#d;Yq10*AHi3ciZu* z`KIp>y`)gxaK%ZLm^D?b!e|X7KYsApsG8}z>y{=g)tDCwn;MXQ{NUFC7HB>CdMR1* z-kD}$C!l&I!4!rt6R5t?upNdlWw$#hM)il=6zG?AY06Fm{kyr!EBJK)q<}T89!Oi35W(4(=gfS(i-$OWF+ozI#pz#a4?O{c<30d2? zs9k2MoSGjlgu?G3c6F^dg*T7eRZ)nHM}wTm%I&K{D+a5naZH};EtA(gNtVP)mzn*` zh0ZvO&mYrd=2N-j)!36-6}+P!<$)ZhW?}FJfFh9BP^4vhSk{S=_Z?RZv6-whi$25nTWb7q(arrD&6oa}f%5FJ;EGWDm1cB^I zPeJh7Dcd7|^ROV(2NEs%K0tmjOZdy2YP?75$+C&V02qPd-blj9F|5&b70i}H=Ghd4 z42tHyuH<2vLp~7drMhmrfVu3HT|G45Z>z4Fi2+A^evI+${U0G38j%@06Xq0&v!LrPxJs%z_q*zuWp4^&oXTK4Rq%o&`)+- z1$pECtvAD1X3!7mB@9yydSUgT3U|8|ZndoQw&}rdG2#WX&nw4cDcaul+avzbF#X$y~%ucP*wTq+4G(NCjx1uOL^)ql9w~34;jLOtNr&{ zFPL`9n5MB$<#FUc2fN-TTwBXKd9Rlju9_bg;@(spwE@;-eq4w<-yr_e{-ALAnW`<0 zfNBIL8!WWrCtDmof$pg(QQaG+qZ3&p3K*~ppLLeZpVk~_$nU>Le#V*hnuqDyIOj8D zFIaqTS!_7h4D$;uKEEus97&?G3l^Va77Lv^na;-IdjQ{CWoIKZIDIes8b?-lLMOX^&ym={EuA39zCh%=Dgs}d+JJO>9H0Y)bNSqxJsTb_u2qx4U3tR5r#?MB@cM-!GfI?zUDlhP*t6+Tih? za(gDouDi-7y0?8091)0Vd`dAr*BQq7(*TQ@WB6oWTbz0Y>J_hs?FLN*!g@xPL+Ctf z!)xw69JQ&|ENvvF3Q{_wJ$)u8t0&4nXx?ucJ&`74zQW-B>4L zztnUQ$l;B_$e!!BFJ5zr_nhN2o$;X7u?Q~SyRrX)>>&k(!1KmmMLP`saPuCCK<{@T zlYM{*w}$zd?(w|VRAi=tycog!olm)%LTc+;N+n=xhEwfaFk<9vGjTtj@}N}AcT_&_H+PeiNA7z z%o>@ssZ0E;*$yQQGjbt@Y-s8wY0qOjdZdnrTgdCzU<%nMD5G0e25_* zHZzFNCLj0CrkgoEVZ<~6WAM*WN^pD4*o+bVld^DUjDPVj(mhH*KPF%V{wb3>uh2|u zG2b=DIxlo}lxQIJ|gcd3z(_TKjOmnRYZaJZ-2tgr?)VWpM>4UAy<|L*P27 z+`_Q;<>i|g=Xtu4q%(x{?)o(-?c|<%+>vYoA}8U_7aR6WJ`$V3=cl> zYuVd%yhbEP-8gg$hYZZUAc*m?Y{vz7N4hYEcW+(TR-7@E$E-Nlm+stMy0&<4>H74g z<8S3vD9va#mkuv5MMS~`>&^OxHac=$<(7er?g5+<%Q>NAmg zEJ&)Elh|OCMwx_KpDJN3Lk#{Y?+~LhRT}bIiy2O*>33^%tNh`o}%RvA-kdlrsdB1%7-djs|N3*QDvg)b+Uw5ul z{^yXb=7-Z{5TIFBhEL#4llC4#r+CeA%u8p%iBeXl^1(xS~3B z8<@@g@SEo!J^%2BFQ0$>!&lEg{o(WEhp)rees8=O52qRsG2^)+S7R zvycDd2cIo2hvS8pS8lhP`r$^frfwpv{#R}3L|rC}z?HnyQO!pFHh<@So%+ZqsbA@nMX&np^3iftsR|~X4^4+{^1e%aUlp6bQF)bER}I^{y7@BdlH9wo zxZIqf+?@6t4pd&v9|NQSUMP(RqAysrkz9Y6>vB-%;~K-@T${;*OKvLKJ1)uVW++u8 zy2CL?1s?fSEXy|MtkBV}=NQR&QCf7E9Ur!+68o*b|uIl6s=w*L` zH0|?niAMNo45iHY5K1nl$^7oHm|-8*kBJ|Gi-1&g_7!*sIY^7XfO zwoLaJ>ek}5Nw|Q$eklCU{_Xn@p8et3x8HyG?3-s_B;Wt?*&pD+AK~x+G=Kj-dG;+l zfA$aGfAs8&?>|VM{V{p=88rT4?y6p$n62S&Ie1b%3RL^%iR*6uwvoHD<-O!%g(q`lqcgxBeUc z_x08{Pya62`ef_(TVFo?c6qI-jfsvO(0K69;)VNXgM4Y z1{{QY%Ib;6cLTLRyBc_gJ-SMPOy)ZQn#BSHX`bkLt-tx(67apT77$VJsZdD~x`oeb z6=LP^V7aW|``p#lX*QWb^(b$q86#0@?i7T3R!6MCFEjqhVs^RrU-Eg`A zVe_l?mTvF?Qq|55rfz<FQ?%JZLS`6*`DrXtli+0$N=?o-|l>*&C+TxBZ^xHYEOIuYQD#3lVRHlujF^m^WBE$syV{ zhNT#pILQz~GQ%8#dT!wpVaj17af*<##2XhUtwT~dMXB;w8swc3L}d!1Az@%nVMUZl za7q;ysfLt6Y8P^#3=s0fNNqLD7-y1zL?*mpkol&}5(wxlq*yAm3NsTY{lUUw9!NtV z$5twHS{N-nPl=@5IvHn@%o2`~%^>Y{62KQ2VT(d`&n$O1&LoCIw(V1#PgQL zkuCxXm{G4XA=3-7Jan@0(lG4IF+!&%5)?k$>5rQegg;!}De*%U}>F{DNRYIg3IS!E!PpwW-X1RN1{D9tV@a2LKv-tH3EbLb1YHKw^}d6e6QIdJ^_C z5Kl2kt9KR!6d=nIDF`w3n8yk31jWpQc0j}}Z05mUDo7+SSOD-|G?JbOnr3O5DMhf! zh~rLb&=E}qco*zdB*p{12xj1JA?gBA19roI1vehDyEKyf6&aXC%peLPhJvwIV83uG z38JatsfdG#q>g!Du}ls4TL>hb3#6i4Lg1RYI2tdh=U}9`QZBG2H4uLRr_ zgJh8GAc+vDg#y1q;lCQ3JJ@1K99^8KUUJB_2$tZeK-smjNQaV9jU7hBsyN%2V7jcZ z2$E??8Nh=vg^cu=z$7@Rexyl^^2jkTTpZ945KS`UEtbj??ILAbQeg-k359SD;%)|c z1eP8WZODHWa3zkOK$zvQbYQL^xwfg})H!b*qm;rFIu5zOpiuh%>|IT-rN>eJE0#B` zKwbS&-6b{|kIjd~jFZ?F3xuq$>h5^(Fm^m1B(h6DERc|3#SXy&MT!I>5G06{mG@5A z**}2%4xYLm&s^WR*Ky<;Vj(QcALq<@`*e4GJWqE$bqJx*rZxiOHLjQ%H5wFlWH2k z+@*IJ0Afs-RZL9*2oF_Rlvw-j2#<<{KTavzwf^Yn}O^r?P-X@4F=aouDY;AG1UnLmAnNti&92Zkh+gT8Wz= z_kwS)d35yyK7rke0o=O_dy-0Kbih?uL?y{lFvlSyCJJu{c3A-!L9B=9Mn(j#+r?Ts zTVpo<0CZJw!vr|Is-NT(ts_e-X*&6e86;C}AS1O5X>;$IQ|Mj!3igRdP1or(3}YIr9$MlZ~*RXe>?3V7N}@HY-@< zW*H_|%P61T6Mu1Aby*Y zS4@wj%SMKY*%OdE)x7sbts01FLw0Oi zT5F?I4Z2RjCghzF@@k6U2!nz) zzME6IIXxPVO{E~AmDLcEF>a3Hsh~n>ogxEazIsvtR}t(GV&&!$L+fEowIC#d(iQH8 z_@X<*Z-B-y9>vT=EAlWX1^I!h61zC0-d zCFKMvp`)bTk8l(;?oCbR&I$OtbeNQ7Nk{-#u?@r=GsvmaZ#KzK31Pu-ckvx^z~3rn z@+EaDuiyIB=~QmNdgsmGf90hwwN96x_sVa*`prA9#Xat|ufH7junVKV83|v&c#c& z{gvN*GM&etxWB(O?aBDxc=5`gSoWlY`O_J^_`)APU6$xE@bDWHQ%^*E&p|Qu|Ni!W z-rv4Dvd~YZS-0Ps55Bd(q_PcodRbOG;LsH)6u3kP)J;JVEeb6z-I4?_WN|tv_YFXY zOfCY#&cO7~L3Eb7ZH&~~o(ASHQzjt!0Xh#Zw=}3A(iXtUShMbIBMVlsxjt~Fo~Wjv zYBG^#z*wu$I!6w30SLk?AifJgEQrV*UW58vUJyC78)%BmG-y`MGv+LUHvo2>$0&os zvy@tZAon7&y84d6jxweaXed_(`I)qOCEz*MUD`M)#-Md}Y(+Y`7ChE`Z!(WjPn&ab ziP;mIm8CH)ILxVjX1`kZ>)Cw{@O{jQ=bA0mm1I)MjECknFy>4PHVhgcW5Q?39=v*~ zU{raZCdnz?8pRrED>q3RpMsOClE%yLd{rfl5yHba?!J6gFZgULuIJEO=~tvKy!-mC zZ{B|Wio)=h(-Gc!;3@i^z2gFv%YVe4rpp)azVpJnSf1&lzHslsTT}17KOemR@Tx-X z)+2lL;Dt}$e)^ebRA_JATQJYZU*W^Q`S2${{qqlh_|xxx_+$M0KR^8OhyVQ3?_E(g zU3|~C-@o_pip1#2>-)+Z>yfuR`QYDP_+*Cjp6x3NptbMc|Fy^SU;Bzc=hNqUx0}z1 zaPI&5 z(l`B$`R%9ryjyo~z4`L1cW(Xe-OKCpjY|T)-+uG)+z5M2#DmQ2mKl=X1fAP@|KKlMgKm6ziAOGdY zfA-P$U2uEpSwH*hpZ(;&zUMl`pZysB{tuTdUeO`KI6nA$w?Y_)&1pbkSg?`qnAKSHmiGAIda8J12DX%E~J{{uQkMMeSqb@_ssXc#^?Y0um1Mu|M>4Oe(jHLSke1>!|T`0 z{q3t_yx+Sqa9m#b2R8)02k$)l`k(raynFwKt$O#SAwDCPd&W9{09d!Ad_J}DT)a57xHs#ns+KMAyZH{uage3{h1=bOv5Hu&f`!r)&tb5mAJQMdkF2d4@S zq1+m$e42vZjl645BZj6VP{+NdN~V1lczjo1G)qFI@(3y|$S~oZCdR^c7na(LdzVuh zHicvMghpM|_Q^$#_;JhG0?wKjkCgTb5>djsa`kKGk+A(FwAn9%Q)Lry`=HYgn5&l4 zIlCBewL@FmsnaQOiCQi%C8TPpxb~$XzDN_-Ru$WZb&NS;X@xm?N2h_Pa*8d4uZ)e# zE=n3f(nDFf&XVEpo$&QFi4DqRQ)yd{+4#cREX@iNKF9K$^^lQLZwG$|9p{w}r`tMc z;J-M@Y76mR&RkPY52~{-lFn>1vER^ThDFVBPDAK#y}_Vk203XiuZ#4vA}@Q#{<~JQ z$x+@rNE}9q#$@xxUYS}weof0_RSA0&RDx4^Ry@~p*5Ff5DH&s>F+LGL#q3E{(`6_7 zCUZ*0OY7uqYcfxgpygU{^0}yFSb#R52?Q0@na)^9UNLv&*l~fiR;2pU$}R^HpO7GT zZ#Fx}>%RZrE_ixlew zdg(#LbOKyo{D?KMcFsVktE9_zZFtn1r_!TFa~AVytWKX*(aC``A88wa`ik zEpq9R`5tK5TbXT3X(xM%~}u=lBlKL`G2$u%y0TT{dF0l@n-4$jmfDy}9@6v!)*Eo5`92S_J<5=6dDIxP( zOEPooDHB}(#IRr6ULY|69f9Iyth|bPYo7tu<^2X?3Jg+*`<*dXLU44kd`HCW2>2MY z1QphM@w{bVZP07L3BYg1c#JfOM45ApGp@{4OxuNb9hx3djne zZw@6vBVq<&5Jgau>|EPGx+*w)PL&ao5pjZMB0Twwl)e4;l;uGY8{)_6sw0S);&Jor za?x$cPOd2nH=E5iMza}YU9-d27orKl50ST&;htTJ$tfd9bGp>y%2+dPzdunI=(f?3 zc@dF;yJH3ckYgTg0ZG8y(*TC(u1T?ccm@ejfJWKX-VHfqDWK3{fFYfQWsJiykZ9w3 zFRlh|vX3|LnuFn%snbRGkC*_tu>l#DwGpVWVBV7fXuEpb9a$~Nx;9sElMW7?$}tf7 z?U9%f>l^GrW1Mlb)S0L(z2!~;I=ue4#Y17DIG4>wwVSZagdZoK^HnQyB~UutQpJ%FrwkFH8==xgRXmNZ)&9= z4*~;q@-`DjG{Np$OsL0_l(ttP0#ismygCejp)QYIFDzCj(A$t=JXugU%}@0GBJ+ zzQlE1!S*9H?vC9mrRg5lN~WVl zwbVY{?^i&#YvqiTOh5&r^wYEgPsI!}$5HRuI}b~nfSAcM5D1K%WtjNR=nLNV*M(J#YsnMhlm@JTTmxV88v}d zAUXQc?gC2oP9SX4Q)mrp?U-mVOzMc$eTHQq7qIf;EiJkQdAuYb|5-qIV zK;X|5g!P0)fWJ4viaVg!_CwtaSmt3e2mKC&3_YRP(HU>L&I ztghTtm{czX;f3_9G&cxsv7k1BmC^u=fOnLTO9)c8!K=X^R?S7U3 zY;1Pw5fFTD{kDRdgM*Tu1E!)4VasR3&Gv?k`HfdptKenSy8oVt4)wbTs@`Jz09FWK za?sVsh8J$+D(^uKG6|4EoHp|N8OeGJ`b|nC++0S!sBkDJQSoEySqHp*tQvG;F>A8X zgr``au;+~k&jWB3fTGu+vlqnngv{Om;j>NlzSK$l91$#nj(zE_FE4#{f1UXCmwxGA zCmwY1bK&j!-XSmD^y|dWv)9Jw{yOoK@B2l5o%nyNf5UVCb>elvwJiJf#7giR^6Kxi zHqD$zjybXLW|9BH-j(%OR-MX+x?RiL~NE8suf-Z+9NC{CC?XkJt)wfU$?KDre z2$>`&vh!ex_=O~XN+e@B*f<9A&~3?2)z$wfYn@xuy;VgQ?%e`Jc%ZB9J$3dud-#UE z*SA)!9ubj1L}4qV%2a(0#y0rnK|(`Vi@uWV+#nGqdno-SEanvJ4I)S@fd>^ewu-bX zh~%U25;0~ac&`o0?@Dp5MkMq|=PhiqN5Vp8L_tE_qTMr~yilTbk#b2*#Ad6}KEjtG zC{r3SO&o-9Y|ghDyQrZ=xEsV~9^Kdk&oAU4-2+lq`dFewwudazz-ekhwrbdIWXppH zWp(g{hdj+S#C^{C*c}4c2)?oO(h z1;77%{MP2pKU$>}I45g-UBUti`%+Gqb>$m+lGoj%w(jO@&(APFpPz{!CY9aYHoKR$ z=XKV1ckWU{*idnp4)pm+X!WghuPr5$@3!4r=#%+k5==g+x;?w~3)8J%z^x^3ec2OD z4{#kp=FOc&n(wyfXRo8V*~k$)dzIGYcfxhBapQB{_!(-v%50BN1Kb}oL zo-2iZ{C7tm9e=ehbbR#j8j-*zI%EryV=}ygl(4T%l!5 z5oPq|InIMw-sQquT*7~FqGWu`gRoRG-lRLks#@nn07yW$zu25^gQ;}-;17R*U;bpL z?jAh+!R@xjl)%eRpL_3}`KfU68gat8u1hDZFsF~aB#6225R-oK8CS~H+Qq#5V0Kpj zfBw?FHKv4b@1IVq+sA){KRK9f9zV;SgEaz$Y1+@;Jeb$FcXqZXjqP<2zRu@iR}n7Aw39pR-cuZH;E(Y`oLycrSKl zJGge6qrJDjRJf+o*^u8!r?U1>)F~cken$}{l9BP2Gs#KmKbNJYwO4ZabM9=%h7sMqZp*3t6Qu>Sf8b&z+Nq$XVwK7Zzh%B zpb}l-Iucn&G;Anc>YifFRY@mVdOYZav{7wIT4zj*)p^4+nuH)SIO--0(r-)_sU^lj zQ^YzcD?RQX1^OyjKd8XMH6IbtCnJ5;l}c+A$Z3|kUOfy#6Otey2rO}yA^F6e4b`e| zSxe*fAQ}z=EoG%@2}_POE1D?~nz++}HpXnx23f5k<2Mf&wZwu8Lj4tORFarlM8kMO)d$r9$6ytfxiHalM}Y`j zEPsXHrLJZWt0oHtO0HdmSd=Oj&PBu8yR5R3W{@yW%E89gi6+Hj@x61eoI>N(%a-Dx zMoNV-@zSJ9Le)~Wat13W1>>t61X4~|4z|N)c?=C%S7hfFQ;O_5J%~;<^{ir(u<)LR z#x)1Zln@E0rBH*)K{JdN&&XU%!t2^GiIXqd`f9K~2Qe zRR^~+X0x;#`t+!APbDd{m0%!UjRoe*w?U;MDJT~TrW1wVTS~>HRIPAmw}wGN&@FcD zJLYfBB32WGk2*FC~3<3QY@sD<@D1#w0F#6U+F=n#KDs`d+Wl@oJ z`Iy|1+D_KymiwSmZIz-3@Qboz`jX;S3#D7I(j|m_gRn6K^_bF~4NX-_xx&39Rd`eq zLLP*T(Y^PE*XXJ%4+klX4I(x*iJ7=ONUPgAG7w{KSrHJzSd$v{RuPc%#AHnHVyJnV z2^=jL4>FAS;1f@_5r^qP1Wbmg0@j<#h@hfcZLPDtdr3w0Iw=0O!XQZT7UrHuz{S_z z$P9o~1s>T9(ss%Ywz4=T5&_oV3rdu!T3J4?2VrA8Mmi-d3uId`%yjz!?}jMZuqOvK z5|t~mzy}v}lNDMaU{wOkoiYC)a&t~CxMD4vK$Ofw#h8OCK4sP6)dq>`3hJuD`s;?+ zs9SHEtdwtuQ)C^cqo@K&+L9iyM+AVf*kneeeppRMQG|H4(EAJ}87# zDr1(V)I%C2)6hh5lhkF)%Ewx@jH#r8Xo-~&eUN}F$vasf>N^I*+iH_eNy`8aM#ic^ zps40B8bn_4#5h>tO)7z+o(PY#cxsf-)>jziv-QPMKALCKSD}2izIrI1ljr>=p?nak zI%-@e-LZZ&LRDKU!i=g+w;sXqctiUH zhKwRl;=$gTghVjK-UkIUj)tF>8i6aGpJgN6YvDprf}6dAHWLf!#8mc81gpA9+|WlD zOVLU<2(s)mGBAT|$kvRIuSA7_)|rU=lUZkwyWveq^Jk*UF&NbgV%gS=O@VxTS7Kwf zuEfS{eKW8zTi?0)|Jax-#W`Nu-B~Q=i(9iB>7dSDO$(lC?u^CJoEw3Q(i}%WKKkhB zlgIx&J9_`|_l`b1`pwbDkN@`Q!`abKjy^m3?=|p2-%Yd2o_GaBa1R#tl?T6E%x}#X z8@y=a_@Wi)z`sn;fD?qkj}CwS=-tDg9scI<*N@)CPe12}KRNub!~cEs9>D`^V1d^T zh?F_^04o3i9?PfMpJJKeahJc`Z1Y8${$LFq@X7(-CBZ#T-(s%ZO=&Spdk1&Yy0!t& zi`%&yw&NRKdd$zm{j}gOrwy-4lbnc`y!h5N|KiQ*EO>TjH*MeMx%2Xp6&%1>zijje zzuc~C$N%eJ&o6-ou*bIXg1hb3S(mNA0+!!j@7h-qo_5|A4}ZLeulMKMb!Tt(+fUnF ze6R)|IJvap%AK0_W_aJWjvLtCcwu*chSA!%*&cpy*60dW;FTSY>3sR7+sh?&e)inM z06*!PH|Oo{eD=!jgI{d#e7D^`Ze|5OP)|Dn(;*Rpc5>CaGR*JZ$Gc(5puILfzGww1 z@WczIu}|w`zk&+5e0r>0f~C8^f4X+}X3O_pk#Fd`4}Q9sU3KA=XuPXXc3Tq^ZtMA( zlJ4_Sc6tQL?n_6ZAr!b=c4zC_@U*S#!PC&8Pu9)Zx(0@A>pB>=V<$n-+U)34{_lUD z>@6@OAO0&Q{2)L zB=@p$iF>*1kuQ3Q3zlNVOH6-yXU=iCPl)GbuHv$Gu3_0fqh-I2VPCWBmo>Ly(^oFI z%3i0>H`v#(*1vmyzBt%F*j|ltE*j%$RzLg<)B3cj6+G8>mcXq`gQazoeDQ*>6?V(# z6uq;gePxlTC?uX~)~FKGpbSs6AbYjO_Z$n4DXcEZbuCk&e#D?k8&?vK3}i69cG+!K zwt32z8d+i)1L09{cwGo3az+N3$*!*{=%9)&*~^9R7>eX@n(%h`n7_82Mzq#(XuQ+k$`Hq)1_l8N@8=qY*Ad@=8%9CR6Lz#9Bq< z(91!vDy(>(<_FchBJzwp!i5~BFakmjDymYMT%yK!ZscLKTUD`0C8fy0jAE)*K6r1m zDcO(>_Dk%z1>7;_i0)(Nlq_K5*kk(0& zA;{v0Xv7*xjjdR1Sr({F8HA@RA;ywZ$6RX0c2R9fNxG_4srW-AdU)f$T}z8MCx!H|u}ju|B3=vH)ZJ(|ulgHR%7fU-WDtOs#1 zBM4@Unz0_U@fa4Zb*iaH7rIV^B&d|k-oR+V{&(w*jH&hBNZwO=NP|!*s#~R_D-CS~ zZ<-J(+J>Pg!C4zb&IP+7NM9Vai6UA&eG>6&})&+)=nKK4e!~d z&pG=+$V#K6Q`zGU;9ZpQrWDm&hi}I8(t|Lf#>Z|*zgq)R6rEhj!iM5~s!i5G;*8di zxUxITEP@BQJXfPYXD`N?IEJplHbLM&+?eTv^B~O7Wd2I2$mj=QIWS#YO_9{1s`f^Q z5C7j)(`c;>Qh;0rNrrUt1*0=a zSk~bM@XWC40S=~n-AQqvl#LooagY)bBUYpjlE5~F7!otr!m)IP<=94XV+KX4I)MN` z!Gly~4c@DClAEEw22sjJFFSi*3u{O-VS||t*saLb>p@!-vB0V)toGEEmL#j>OK7-8 zk5L*%m}V)Pm;{V`&B@5hLNg2r@)zm!m~~QQMZE1A(n#yzwD3mAkEJ8C8QyS=sV^3; zNk)U94~b*e+)E&qvcwwdD9I4y5(1GP0)5vFW-uYT8g~y#Oa%yIa*3>4LR{PkH76?z z0wJ=!7fd@psv576KsZPnkPo$9R3M#TqlQnlwGPsJMeJjZgzKWJ6|Anvw8~DqXmwFy z%!=>StHx{<-Xkv!xeHm6Mj9!tLUeIqvvo*egD3@wOXtv6m^JbkIuXf`%kCR9*%0OH z97@dyDU*zt1ZcE2g?FpLw?SOOUSO?cMF~hvACJ(;YNIukB4L6CHKGwwxF*Of-%6@h zd&I2XSW}E0gshY;Mi-02?HlZ*NwMi@kN_rGg&oAuq?HIsc}tNX{4BF=2m+WUYi&~< zGbToIhn4i6UIarZs=?%jSx7Ktc@R4v!muEEO7QwUH8SHTmYgOVThMY)aUKN-*D-1M|ysAiN1A^v35t65Dgf`Oppjr$Pfrju2 zD;{n$4$}VZWIxZyhA{LItj6odAS11sZ$hFc*~ zyrC4CC9^x0CI)7ZflSt6^}$6-LHkt9Yl(dyN0$*Gxe#D_i*6gV7!j~a zp(xumiDw3HvgxssR#r$kN^k{s(IT^>=`GcC!=n%(ZNU#FnlT2lYo~iGL0J_<@VX*! zjmdCBG^6D)>!g>Enk}%A0ntivRT~3KSvB>$FteYsuwnC!n_pgG!^>~neD&o&d#Y~w z0(BC2)h}Kr5s5mM{<1oW)%)S&yXoz>TU~zp7wA-cdSm+NMSk*!r*C=kd>!rx?QiU- zyp8+)@k@V&bmX~<7jCy(sa*0FC;!#*2g`n$J@@j#?yK#upPT*V6$Kn7Ot@?FEDAWD z;b>m02RRv+>(qmszVw$?5Axz$X>qGPWjV-nU|=Xf>Rn@1MnbS$yK`MuW1D;iabrV#xXZJL3H^Clo%9~5pNhio1$(?;}N z$`m#)MJXkfYBCSniAy?3D;g62eS@FQHs`ot9hv+0ho3(Bhez+O;B$Zd==+DC zOni|)BRY2tkh{FuPM=K;u7Pp!<%3@=2#}pxTg=ls(<48gy*i)ouk$OZmM`J-i8KnW#T6$9l~xvSJzL^j z{63nTJ{eA~h10(EpguZap2@JUFyD(|t*1p?6Vmk{+I$HxUikiWZwk;krEg5WJt855 zuT75c*2(_i!JWzeuzTh=F6avX^Y%~IC6s3vcjEZ1!#t(^>FjuNbN-N-FXF~F?$}@| ztnsnti*xkiVuWjZZPE1J9DQr=8Dm%*LLXQai{y7C-vY(9th1pk1o7=6A#Vuu-3M3T5R9L(Z(H) zkGWBs0~nK{wv2J@lGmogX>8sXmz!*V%lX5_>BBKWYQFPF+kMgJJ*bgk@}{5vcD&uE z`!`0@yG0uuT|U$XS8DeabE&Db@qV8lfBNodpRY{%+U~uO&+*pX&g0omzfpEO`-aig z^2FSYTs!%E)ST5uc4v-$eLVDdPF`hY3Ro$#9?=RI;kR8QJ}RfCn>gp0~i9fdQ7Us*eRW` zCdGkJjgxauhh zYo9uiYq$iLDNLY~QW|Hxq%1HF#ifv`&x>oS$rfUHYSEb-l1-T-yA|meMJHxLvI45h zXzfz6F1w^fh5)z(O{_zw6wfJ3;#6ji-(k8MI51HJD#GbRwNn&#$}I$GOEp;jW(`ce z8$$hLQ7|ZdbXVpAr47i-aCK76EH~dwl@%)4w%Vx^Un2~ZGLwAXxkc=d9b?$)~aSEw+0iTT%gW6v8qaJ5xQ8m z>_nmjh-3@USJt6I;`(&LabpRyRkh;iL=}q^m?%g9EOVz|-Wr4F+T$c0uzgM5a}Ycb z1!LDx`q=ndnlmY-46Q3Ue#iv)4?=V8bA0I((`j0&QD>!MYAr|QHL#1Q9Bu0Whrc2& z5``d|pavxXS%WfD3Uyz%funjoEtAsldg<9JvOC97-!e^$H|2{8BFj12>BT6pjL#flLsl zt`yNJJswPzbE;Tf((rm&n}kt>L~+=aVN`4gT2q*+Tc^O}z;9ZiTcGTTWU$Ss zN?K#aT!eb)Gm;Q0JYlR0bfv1mUj|aeZ`e47ytGcWHYA`i^u5F4xZ-V7wHfJ@ht7uF%RBCF0%bvsT%WQ3Fo#^cjILri2 zQ>_yJt^-VLg|yW%_pnojhNP+t?9wYBr9zN1(!p@fTo09O`}h($cmN1EC<;qKT*-qY zA|2LULaKEiQwfdETO*sA6#K!#a7~Bmm9tPSol+wM-IbPw6b|0E^EnBji%*$?GAWx* z0hfSVxeld|f%pLQNM^$3fjQ2CI{jV0fga6IOX6)6rc*| zW$YX{m7U^K8=PR@Vs=iZ=mcE67^CJWWfxPY#4lVCoQrDc#5FHWQ_@CL1FWxikyQLD z7(9S_CICSs3E&!Zu%ZG@!q0C&PQBukr9k_fDHs9_ud)=N$>Oj`REvbq--%oU*jNeM z5egaVt8rGNW*jwWHq{A+$pR08xaV z*Gy0Z@b9x36BlVKMp)>S#y?hK?;F=-hGz`7xDTLAxfr8tW)M+y;`avzh9z>2bqnj? zr;`e|R{_8%3xv;^rdo#21(*q^rB@oZOfV*?SwMG|9#D zJ`WY;;wk^MsVD}v*n8g`%wrP3-ZqvJWi-kslAT@|Vy`%clhDIZUBv@=7r5YFS5x5$ z>aT$B;@~SwzR)N5Dj$GZA(Pu0H1S9SMgmg_0gE`vU=wKIp5`_?|vnG zmzQ4o?zq|ehlS_2%vm9dd#}IpmGEQ!{_NAU-<*AN{`UF1|NZ#< z@%fKm_-0xSnO(i${PEcneEMK=_R-lVXTLi8^!&Y*1LyCZ|K0fqXTLfB2Q>2zKL3b0 zH+=GE=kMdz&(7aH`z4>|d$#xT`;}fe+ddll+o7L#<_B>A*SvT3>qYi`^n-tYgbNm@ z-$pZwesIx~&EVmCb^q|_gjp-M4jZ=b=2q5QEPhoIZhMaFFs^eDBi_=Y5}kG?^Vfc>3Y-;^U&JY38p-mz}SL zIDh8>GzjkIDDleo^TS`<%Ey*>j^m)~KF#mTcPpOu(ejr0*S|(PD|fC%OaJ`YXU~51 z?7yCU`o$0N?~`Z$$~2~*Jp0dQzr~3sUp#*HOPm-e5f>z<4{`C|;L^{&cs$Ubwh<;? zdN^MMOwqwGef4;n;a>j#;t5_o{f|e-rym{7XmF8nl{NFCeJw15(k9gYI#pCXe@7+6^ z)(05eZ1Osl!~6G6hMS*0UhKici?N=Jg6^--Z%~`RU(;`Vfc4w?Pe&SVIQg?p?RI}P zw*Jq#GSGZ#Fz?5-e`C2ovwP!^e^{j(H&@g`URMhbF4aQa8!-d^45EAY!Sr}l9nDr0 z(QNhZJ-&O56fmXF-?N;NsBLCTcK;!jbEOHak3G*5xYKav`=%$$a^HZwMj$*GKkqh4{H{e{bEKOlK3CGywL( zy#sb)VvkSo3`;S&;Bzjl^_bvPo59stSG9Tz$7it>_9BHZjUg@&0DuFTjg~e+y1Lj0dt)1UZ8JEwm8)c1R3A1cTYb) zIy^drmOPq0+H`W}4|(GzFW3Arr<-fJTS@NHe!Cr%0icb&i|24Bw&=81m!87n+%{j} z^A9(O#@DN}xjwtUZRvJH_g|lXa24J@+^*_|`I?Ov_Cl%d0>X=#+=63gTPl#QVAX5j z=om--ap}^oY8j*qLKN3DrOer_Ts47O?G*PaxMGNkLk})+GG1wv5-NpSxO_pMPCSP> z+Txh|iNNV`Jr!$BaWY2H z5;<9lR3L)FRX1PQQ+{w zKH-m2P$o%AW$PhjCaRoeg#>t>zD_CMr1efK={Vd~hAbdsUglUGIez8VsRT~IAFVj4 zJoAHsPgojkMj?wO->Jfbj6<+UE?gjzS_veDmdSFmIgW$r)QRROTBjnjr(B`pIV&H( z*fZ7GPT`?h*<8Ge4UPJ2IN!4|CUSaw>pL--Wyw`rEAdyy!YTd-W>|uXNhQlpBHWbq zjrXDzkl<>Qa;b$PY{}eHpYTwfW3-Za6FRgY4OFq?;v2kcdQsSwu@b7?>x^Z#uDa^c zRjQWFOcI?&;xsuINavirP!+Z-VC{3T)mmXYm5L%6eJZ4}`a%~W$*ba=j@a)ei9XV$ zpt(xO%~q#|jN(!H5)K8Q4`HiF$Qq0D(yA;>Rf>vn5{lRa)n_wmp_8K&Wh4&Z zfVQ$+)JM2vp;$s6-K9l|oZ5lyJ0~%)mMAxcEeQmJYVzRU+p>8C76n#)Bp{ptAY}+HOppu)otUv4lZTv?ZyN^-z3BgCNZ=qeA1m*pDQN@PSJ0X*S5 z5x))jDrEAQ9T6-i!>JJlzbcp)Z8~N42ZGB|Y1LA2q%e@?Ia9q67zWm)j}`{N;&en< z5l*w4DYa@aRi-3P_|U2PsPi!Zm|94cG@`+8Pzi=Hx|$@wcc(Np!g`89H!j}6?5|>B zi+!x#Dh= zB*8qvJ{qUtB$f*4Qg%o(KpOJZr;}WWiqzRD#SCBQVNUDgvt%w!>r@;LW`tc57mc@q zlIBv79?nUm5>x0^&6;^-*1>oQu4Nklg-UA;DnJ>oquQktQ)KnUW*3V|DnNnZfQF@K zPrFm)=zbdvF0ptigfMNq5R85dvp! zA9yCohXCi%8d%E^0acpl6v_$|#F4DU6=wnHJWv<>QK_Nz4OCdCg|CV00s*98wjBQ; zrG)d%*$U(6sE=g~O@#mD?&@0XOpfzkIrusQ{ry28;3z@}!7g5J2)Q!V)m_rroy?dS zX&2?nPU4H?!gq$)kU$8z2qYoKAz2#>UkF34M(cl+r;b*$bB;#RXt!i1L9jb>)O!28 zU0qer^S;$jA)_Mz1D-f-p$VS{z!z}T<;ke^AaEj)i$%&*M41jRrroGQokxW zjSR1=LtC1H@D>4y$ImOlIc)&99v^j`LyKdi(bt&xBx?h@8Zt19(Ev5Iax zqqFzadI~A?iZDq8r>hx!n-+m*(J%^-G(0i(s>=5ur)TZ?T}x0!1V&ghl09n*;u3B| z1@#7I2zemMFRy1~oejkvqgHJLrH?yThRwq!A8SxXQ20Y&!4<9DEnE;G6{Ax39WMUh`vn-Ef6%)n6jd<=_88^y#<|;;lF*|SP zRd^<9+DqOuBgYd$7zeAvk*YqJ{hUj=wbLWAFjABO=$bQth1Dbs0xAIYg<{Jfcd=0Q z9l0`y(L1f#QyD#i1PxG?Ji^p~%zENC#btC-d8!6YYoLvzXtOrpi5Wu9VQOD-BPH0` zYXG;ZJyzkB3W5CSiBIQ|!-g2Ooa+O4CB+6qIG2~6?2j>Z0UnOoNM;3ru?A35SyOWe ztdZlIa7+obtUA7`;4ALM7e77sA&Dh`V}o?7CUCHE#?|11p~EH|Q|aC%c8vfcKv;`2 z5~Wy3OfpkY$qSVTaRmu^##%ifYc&chYXV-A(}%T=!BP@3Vg`a)2>;p(&}b6xNNFQ5 zRzOTCAojj48r+1t5x5iYVQ`0>J{#-l^j()h^1RbCH#!F|!E1Z5AWV*HbgHxDH0P7A zQjPjQ3K(u7RiTQc1is`eE6nji*c5DfE zSe6$R1@uebtS0!7v~1JeX2$s3_{d% z>8XKr>680Vk^4mj$6<7EBO9Aw-4_tI#(&Ve>XB5ONJN$t3T!k9zI%&qM3=#aJ8TpE zjG49RcSjnvNiZ=2txN{)lGLIAw5+*+@v#lqS;>=VO+nK~t6KdbjRl!yh9$@XGfi)U zkwCS;iy9~qa*7s}MSU=pVVDs0VUo!txoMN66CAq7zJvES4BLtpT@>%0B5(Dmy$puGb!~t=%hH}3E->s(St6owa@j~sEfj3sQfmeG z1~ICDM~$lhF4qL`YBNcXNW4ggMGI7^fp4YY6)%G!H*fS%QgSP0Xg8lYNuT7cnMU@J z7Iw5z?3x5rN>l5tRU|v8*q{S?9Qw!*IlzY4!?>zr3#Od{c5|sSXjPF1rpy#=oKcFZ zFz?z&rS2UZzPiypd}fUjixKA@ktBepBpN z1hm^`lCB*LT#N9^MxKKM8%9K~wF5a>fqc)fJ#u5s1Y(*?&|))v$vV8gp)@LcE0wFS!Sld{6Oe1p-68EpeX&!cQF#Lp z7MQ7M$t`A^BHAr70Di@=O1CjQtB7Uv%Y$W0i#?R0T?7ku^F(|xnuJ9bjS2Ltoe#lV zGBpxJ;vu~n<@i}5d0)D=hK$&}g+hxfwv13*qLF+#_HS?tTgsOj^%$k^%I$nfBzmIL zh(dxuN@-5t5ctI^&m41LZBp5*Rf88e3fI+2=)lAb5>{a*-PF~)VC3=3ft5-QMJl2d zvbuUriIBq#9ov<_&J-`@WxSM;}o3*ksLYWp`{C4PNn$U7FlzV*i+d~o}{4-fUB z|7gkfWUH6^TE&A&cDKHo{Dksf8Xy((#waA8+n{Ayu+3^ES>-X<~)Gx^eE@ z`O~Wp7ZGMIo$wpqMQnJXI;XPqC-^qczsLDzd$Ri&*M0cl({+xOJK5YmxqrMpfAC`L z?{BsbpX=J4oj#`H4J;tPxB2wJmLF{76f3>CI>8^(_IUg0mOs`H?mWWv&evlM-#&bR z>zrfVPB!OjH~g4BJ>LvEhe7c*-@~QoL_gf%n_Z5@wU4*-XV^rCi*~)VmC4gi=i(n+ zuaR}@TQ}3f(ye|YEi3?|H)~;Cz1pjlu5^PPF4CTsjopeEsozvRg15SNT0SyLO%<4- z&CpUTz2){Uo|iXv$RAOkY$Z-(rV>*p0d8pAv(H}_F?@LYe{Gu(e7Co56H*b->XG-? z!j!%1?X?NXPJ{U&O!+Oe3Ay~fH)#`c`7M8EZ9*(?OVNhxEe^Lpe{0ZE{-`PgiC3OR z3MomSVuHcTR7F$os$Ln?S`4rXo*Sz+nO;d?lssJ;1j;+azY02i=}?Ez>FVG7KksvK z@9sP4b8-8jQ4}Lyy^9X?Ma^Qi+RwXrx#D2{nfJ{ zUOd@c`~tt=vmfav7ytU~`xn1__PvW=J^R74??3y&fmY`8YdrgF{byhG8gNsX9C%p& zd++)8eth*?@2PFxaM<(v-)=slFNbW-iO$wMkm-Eo$cKl5o?lG5H}Gh8&4&jXo*!?| zwgY?dm~^8Z{N>%_b^gLWfbCcAU{BQZ{q6C3`VZLQN*W$M{RMua`$(Nv#_#ET&PSMQ z^Ymw%xBZ9jKRo5_ixu5o9k!Uk<+aroo@krBknytE2YxOmAIdo;~f-yT=dc z{Mt3#lQEqbbkm{OUw2Q=A04kRjq~3>-uni7il^_NKRi4A~<^VLheM(z3UcO8?yx9cVG+2-?~eE#pBKl#mH;MXS`{ryLuKl%JWe)BgN z@YCIYKRZx-ex1Gd#GIf0t){!nWxv0dxL!_yNBha`2zziHpS+yo{tG$o=NJF-)$`Mf zFMf5l7f*W*M56ERlGCl5C8xbaa&1yN+8c6hrg{3qx6LMB+|BDU!etau*ZPW){vgm_ zhLPT>I_HHV2|q-K<&{r&1GTdZ;>xkrYItIx3NO`c^(k%eXU7W#QM(Ruu-= zSk9%t-aSVNZmqwl}4*SjM&{HcO{xG6SX!F91BkAJhq7v>#!n)f2wk?q?3t^

Up57k6#I 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%0Ar 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�erTdfi9rKSPzsrZmcZ2)qfnupOXd2Ww-hV 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