Postgresql Anon
Postgresql Anon
Anonymizer
A practical guide
DALIBO
Feb. 2023
Contents
1 ‑ Static Masking 7
The story . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
How it works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Learning Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
The “customer” table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
The “payout” table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Activate the extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Declare the masking rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Apply the rules permanently . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
E101 ‑ Mask the client’s first names . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
E102 ‑ Hide the last 3 digits of the postcode . . . . . . . . . . . . . . . . . . . . . . . . 10
E103 ‑ Count how many clients live in each postcode area? . . . . . . . . . . . . . . . 10
E104 ‑ Keep only the year of each birth date . . . . . . . . . . . . . . . . . . . . . . . 10
E105 ‑ Singling out a customer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
S101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
S102 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
S103 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
i
Feb. 2023 Data Masking with PostgreSQL Anonymizer
S104 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
S105 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3‑ Anonymous Dumps 23
The Story . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
How it works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Learning Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Load the data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Activate the extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Masking a JSON column . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
E301 ‑ Dump the anonymized data into a new database . . . . . . . . . . . . . . . . . 26
E302 ‑ Pseudonymize the meta fields of the comments . . . . . . . . . . . . . . . . . 27
Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
S301 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
S302 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4 ‑ Generalization 29
The Story . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
ii DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
How it works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Learning Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
The ”employee” table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Data suppression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
K‑Anonymity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Range and Generalization functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Declaring the indirect identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
E401 ‑ Simplify v_staff_per_month and decrease granularity . . . . . . . . . . . 34
E402 ‑ Staff progression over the years . . . . . . . . . . . . . . . . . . . . . . . . . . 34
E403 ‑ Reaching 2‑anonymity for the v_staff_per_year view . . . . . . . . . . . 34
Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
S401 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
S402 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
S403 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Conclusion 37
Clean up ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Many Masking Strategies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Many Masking Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Advantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Drawbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Also… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Help Wanted! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
This is a 4 hour workshop! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Questions? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
DALIBO iii
Welcome to Paul’s Boutique !
This is a 4 hours workshop that demonstrates various anonymization techniques using the PostgreSQL
Anonymizer1 extension.
1
https://labs.dalibo.com/postgresql_anonymizer
1
Feb. 2023 Data Masking with PostgreSQL Anonymizer
The Story
Paul’s boutique has a lot of customers. Paul asks his friend Pierre, a Data Scientist, to make some
statistics about his clients : average age, etc…
Pierre wants a direct access to the database in order to write SQL queries.
2 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
Jack is an employee of Paul. He’s in charge of relationship with the various suppliers of the shop.
Paul respects his suppliers privacy. He needs to hide the personnal information to Pierre, but Jack
needs read and write access the real data.
Objectives
The project has a declarative approach of anonymization. This means you can declare the masking
rules3 using the PostgreSQL Data Definition Language (DDL) and specify your anonymization strategy
inside the table definition itself.
2
https://en.wikipedia.org/wiki/Personally_identifiable_information
3
https://postgresql‑anonymizer.readthedocs.io/en/stable/declare_masking_rules
DALIBO 3
Feb. 2023 Data Masking with PostgreSQL Anonymizer
Once the maskings rules are defined, you can access the anonymized data in 4 different ways:
– Anonymous Dumps4 : Simply export the masked data into an SQL file
About GDPR
This presentation does not go into the details of the GPDR act and the general concepts of anonymiza‑
tion.
For more information about it, please refer to the talk below:
Requirements
4
https://postgresql‑anonymizer.readthedocs.io/en/stable/anonymous_dumps
5
https://postgresql‑anonymizer.readthedocs.io/en/stable/static_masking
6
https://postgresql‑anonymizer.readthedocs.io/en/stable/dynamic_masking
8
https://www.youtube.com/watch?v=KGSlp4UygdU
9
https://public.dalibo.com/exports/conferences/_archives/_2019/20191016_anonymisation_beyond_GDPR/anonymisa
tion_beyond_gdpr.pdf
4 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
Check out the INSTALL section11 in the documentation12 to learn how to install the ex‑
b tension in your PostgreSQL instance.
The Roles
Unless stated otherwise, all commands must be executed with the role paul.
b
DALIBO 5
Feb. 2023 Data Masking with PostgreSQL Anonymizer
Authors
This workshop is a collective work from Damien Clochard, Be Hai Tran, Florent Jardin, Frédéric
Yhuel.
License
https://gitlab.com/dalibo/postgresql_anonymizer/‑/tree/master/docs/how‑to
Credits
6 DALIBO
1 ‑ Static Masking
Static Masking is the simplest way to hide personal information! This idea is simply to destroy
the original data or replace it with an artificial one.
The story
Over the years, Paul has collected data about his customers and their purchases in a simple database.
He recently installed a brand new sales application and the old database is now obsolete. He wants
to save it and he would like to remove all personal information before archiving it.
How it works
Learning Objective
7
Feb. 2023 Data Masking with PostgreSQL Anonymizer
SELECT *
FROM customer;
8 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
SELECT anon.init();
SELECT setseed(0);
Paul wants to hide the last name and the phone numbers of his clients. He will use the
fake_last_name() and partial() functions for that:
SECURITY LABEL
FOR anon ON COLUMN customer.lastname IS 'MASKED WITH FUNCTION anon.
fake_last_name()';
SECURITY LABEL
FOR anon ON COLUMN customer.phone IS 'MASKED WITH FUNCTION anon.partial(
phone,2,$$X-XXX-XX$$,2)';
SELECT anon.anonymize_table('customer');
anonymize_table
True
SELECT id,
firstname,
lastname,
phone
FROM customer;
DALIBO 9
Feb. 2023 Data Masking with PostgreSQL Anonymizer
This is called Static Masking because the real data has been permanently replaced. We'll
see later how we can use dynamic anonymization or anonymous exports.
Exercices
Declare a new masking rule and run the static anonymization function again.
Paul realizes that the postcode gives a clear indication of where his customers live. However he would
like to have statistics based on their ”postcode area”.
Paul wants age‑based statistic. But he also wants to hide the real birth date of the customers.
Replace all the birth dates by January 1rst, while keeping the real year.
10 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
Even if the ”customer” is properly anonymized, we can still isolate a given individual based on data
stored outside of the table. For instance, we can identify the best client of Paul's boutique with a query
like this:
WITH best_client AS
(SELECT SUM(amount),
fk_customer_id
FROM payout
GROUP BY fk_customer_id
ORDER BY 1 DESC
LIMIT 1)
SELECT c.*
FROM customer c
JOIN best_client b ON (c.id = b.fk_customer_id)
How can we separate the customers from their payouts while respecting the integrity of the data?
Find a function that will shuffle the column ”fk_company_id” of the ”payout” table
DALIBO 11
Feb. 2023 Data Masking with PostgreSQL Anonymizer
Solutions
S101
SECURITY LABEL
FOR anon ON COLUMN customer.firstname IS 'MASKED WITH FUNCTION anon.
fake_first_name()';
SELECT anon.anonymize_table('customer');
SELECT id,
firstname,
lastname
FROM customer;
S102
SECURITY LABEL
FOR anon ON COLUMN customer.postcode IS 'MASKED WITH FUNCTION anon.partial
(postcode,2,$$xxx$$,0)';
SELECT anon.anonymize_table('customer');
SELECT id,
firstname,
lastname,
postcode
FROM customer;
S103
SELECT postcode,
COUNT(id)
FROM customer
GROUP BY postcode;
postcode count
90xxx 2
12 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
postcode count
04xxx 1
S104
SECURITY LABEL
FOR anon ON COLUMN customer.birth IS 'MASKED WITH FUNCTION make_date(
EXTRACT(YEAR FROM birth)::INT,1,1)';
SELECT anon.anonymize_table('customer');
SELECT id,
firstname,
lastname,
birth
FROM customer;
S105
shuffle_column
True
WITH best_client AS
(SELECT SUM(amount),
fk_customer_id
FROM payout
GROUP BY fk_customer_id
ORDER BY 1 DESC
LIMIT 1)
SELECT c.*
FROM customer c
JOIN best_client b ON (c.id = b.fk_customer_id);
DALIBO 13
Feb. 2023 Data Masking with PostgreSQL Anonymizer
WARNING
Note that the link between a customer and its payout is now completely false. For instance, if a
customer A had 2 payouts. One of these payout may be linked to a customer B, while the second one
is linked to a customer C.
In other words, this shuffling method with respect the foreign key constraint (aka the referential in‑
tegrity) but it will break the data integrity. For some use case, this may be a problem.
In this case, Pierre will not be able to produce a BI report with the shuffle data, because the links
between the customers and their payments are fake.
14 DALIBO
2‑ How to use Dynamic Masking
With Dynamic Masking, the database owner can hide personnal data for some users, while other
users are still allowed to read and write the authentic data.
The Story
– Jack is operating the new sales application, he needs access to the real data. He is what the
GPDR would call a ”data processor”.
– Pierre is a data analyst who runs statistic queries on the database. He should not have access
to any personnal data.
How it works
Objectives
15
Feb. 2023 Data Masking with PostgreSQL Anonymizer
SELECT *
FROM company;
id name vat_id
SELECT *
FROM supplier;
16 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
SELECT anon.init();
SELECT setseed(0);
Dynamic Masking
SELECT anon.start_dynamic_masking();
start_dynamic_masking
True
Masking a role
SECURITY LABEL
FOR anon ON ROLE pierre IS 'MASKED';
GRANT
SELECT ON supplier TO pierre;
DALIBO 17
Feb. 2023 Data Masking with PostgreSQL Anonymizer
SELECT *
FROM supplier;
For the moment, there is no masking rule so Pierre can see the original data in each table.
SECURITY LABEL
FOR anon ON COLUMN supplier.contact IS 'MASKED WITH VALUE $$CONFIDENTIAL$$
';
Now connect as Pierre and try to read the supplier table again:
SELECT *
FROM supplier;
SELECT *
FROM supplier;
18 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
Exercices
Connect as Pierre and write a simple SQL query that would reindentify some suppliers based on
their job and their company.
Company names and job positions are available in many public datasets. A simple search on Linkedin
or Google, would give you the names of the top executives of most companies..
This is called Linkability: the ability to connect multiple records concerning the same data sub‑
ject.
We need to anonymize the ”company” table, too. Even if they don't contain personal information,
some fields can be used to infer the identity of their employees...
Write 2 masking rules for the company table. The first one will replace the ”name” field with a
fake name. The second will replace the ”vat_id” with a random sequence of 10 characters
HINT: Go to the documentationa and look at the faking functionsb and random functionsc !
a
https://postgresql‑anonymizer.readthedocs.io/en/stable/
b
https://postgresql‑anonymizer.readthedocs.io/en/stable/masking_functions#faking
c
https://postgresql‑anonymizer.readthedocs.io/en/stable/masking_functions#randomization
Connect as Pierre and check that he cannot view the real company info:
Because of dynamic masking, the fake values will be different everytime Pierre tries to read the ta‑
ble.
DALIBO 19
Feb. 2023 Data Masking with PostgreSQL Anonymizer
Pierre would like to have always the same fake values for a given company. This is called
pseudonymization.
Write a new masking rule over the ”vat_id” field by generating 10 random characters using the
md5() function.
Write a new masking rule over the ”name” field by using a pseudonymizing function1 .
Solutions
S201
SELECT s.id,
s.contact,
s.job_title,
c.name
FROM supplier s
JOIN company c ON s.fk_company_id = c.id;
S202
SECURITY LABEL
FOR anon ON COLUMN company.name IS 'MASKED WITH FUNCTION anon.fake_company
()';
SECURITY LABEL
FOR anon ON COLUMN company.vat_id IS 'MASKED WITH FUNCTION anon.
random_string(10)';
SELECT *
FROM company;
1
https://postgresql‑anonymizer.readthedocs.io/en/stable/masking_functions#pseudonymization
20 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
id name vat_id
Pierre will see different ”fake data” everytime he reads the table:
SELECT *
FROM company;
id name vat_id
S203
SECURITY LABEL
FOR anon ON COLUMN company.name IS 'MASKED WITH FUNCTION anon.
pseudo_company(id)';
SELECT *
FROM company;
id name vat_id
SELECT *
FROM company;
DALIBO 21
Feb. 2023 Data Masking with PostgreSQL Anonymizer
id name vat_id
22 DALIBO
3‑ Anonymous Dumps
In many situation, what we want is simply to export the anonymized data into another database
(for testing or to produce statistics). This is what pg_dump_anon does!
The Story
Paul has a website and a comment section where customers can express their views.
He hired a web agency to develop a new design for his website. The agency asked for a SQL export
(dump) of the current website database. Paul wants to ”clean” the database export and remove any
personnal information contained in the comment section.
How it works
Learning Objective
23
Feb. 2023 Data Masking with PostgreSQL Anonymizer
COPY website_comment
FROM '/tmp/website_comment.tsv'
name content
SELECT anon.init();
SELECT setseed(0);
24 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
The ”comment” field is filled with personal information and the fact the field does not have a standard
schema makes our tasks harder.
As we can see, web visitors can write any kind of information in the comment section. Our best option
is to remove this key entirely because there's no way to extract personnal data properly.
We can clean the comment column simply by removing the ”content” key!
?column?
First let's create a dedicated schema and declare it as trusted. This means the ”anon” extension will
accept the functions located in this schema as valid masking functions. Only a superuser should be
able to add functions in this schema.
SECURITY LABEL
FOR anon ON SCHEMA my_masks IS 'TRUSTED';
DALIBO 25
Feb. 2023 Data Masking with PostgreSQL Anonymizer
SELECT my_masks.remove_content(message)
FROM website_comment
remove_content
SECURITY LABEL
FOR anon ON COLUMN website_comment.message IS 'MASKED WITH FUNCTION
my_masks.remove_content(message)';
Exercices
Create a database named ”boutique_anon” and transfer the entire database into it.
26 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
Pierre plans to extract general information from the metadata. For instance, he wants to calculate the
number of unique visitors based on the different IP adresses. But an IP adress is an indirect identifier,
so Paul needs to anonymize this field while maintaining the fact that some values appear multiple
times.
Replace the remove_content function with a better one called clean_comment that will:
Solutions
S301
export PGHOST=localhost
export PGUSER=paul
psql boutique_anon -c 'SELECT COUNT(*) FROM company'
S302
SELECT my_masks.clean_comment(message)
FROM website_comment;
DALIBO 27
Feb. 2023 Data Masking with PostgreSQL Anonymizer
clean_comment
SECURITY LABEL
FOR anon ON COLUMN website_comment.message IS 'MASKED WITH FUNCTION
my_masks.clean_comment(message)';
28 DALIBO
4 ‑ Generalization
The main idea of generalization is to ”blur” the original data. For example, instead of saying
”Mister X was born on July 25, 1989”, we can say ”Mister X was born is the 80's”. The information
is still true, but it is less precise and it can't be used to reidentify the subject.
The Story
Paul hired dozens of employees over the years. He kept a record of their hair color, size and medical
condition.
Paul wants to extract weird stats from these details. He provides generalized views to Pierre.
How it works
Learning Objective
29
Feb. 2023 Data Masking with PostgreSQL Anonymizer
COPY employee
FROM '/tmp/employee.tsv'
SELECT count(*)
FROM employee;
count
16
SELECT full_name,
first_day,
hair,
SIZE,
asthma
FROM employee
LIMIT 3;
30 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
Data suppression
Paul wants to find if there's a correlation between asthma and the eyes color.
SELECT *
FROM v_asthma_eyes
LIMIT 3;
eyes asthma
blue True
brown False
blue True
SELECT eyes,
100*COUNT(1) FILTER (
WHERE asthma) / COUNT(1) AS asthma_rate
FROM v_asthma_eyes
GROUP BY eyes;
DALIBO 31
Feb. 2023 Data Masking with PostgreSQL Anonymizer
eyes asthma_rate
green 100
brown 37
blue 33
K‑Anonymity
SECURITY LABEL
FOR anon ON COLUMN v_asthma_eyes.eyes IS 'INDIRECT IDENTIFIER';
SECURITY LABEL
FOR anon ON COLUMN v_asthma_eyes.asthma IS 'INDIRECT IDENTIFIER';
SELECT anon.k_anonymity('v_asthma_eyes');
k_anonymity
The v_asthma_eyes has '2‑anonymity'. This means that each quasi‑identifier combination (the 'eyes‑
asthma' tuples) occurs in at least 2 records for a dataset.
In other words, it means that each individual in the view cannot be distinguished from at least 1 (k‑1)
other individual.
32 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
SELECT *
FROM v_staff_per_month
LIMIT 3;
first_day last_day
Pierre can write a query to find how many employees were hired in november 2021.
count
Now let's check the k‑anonymity of this view by declaring which columns are indirect identifiers.
SECURITY LABEL
FOR anon ON COLUMN v_staff_per_month.first_day IS 'INDIRECT IDENTIFIER';
SECURITY LABEL
FOR anon ON COLUMN v_staff_per_month.last_day IS 'INDIRECT IDENTIFIER';
SELECT anon.k_anonymity('v_staff_per_month');
In this case, the k factor is 1 which means that at least one unique individual can be identified directly
by his/her first and last dates.
DALIBO 33
Feb. 2023 Data Masking with PostgreSQL Anonymizer
Exercices
Generalizing dates per month is not enough. Write another view called 'v_staff_per_year' that will
generalize dates per year.
Also simplify the view by using a range of int to store the years instead of a date range.
How many people worked for Paul for each year between 2018 and 2021?
Solutions
S401
SELECT *
FROM v_staff_per_year
LIMIT 3;
34 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
period
[2018, 2019)
[2020, None)
[2018, 2019)
S402
SELECT YEAR,
COUNT(1) FILTER (
WHERE YEAR <@ period )
FROM generate_series(2018, 2021) YEAR,
v_staff_per_year
GROUP BY YEAR
ORDER BY YEAR ASC;
year count
2018 4
2019 6
2020 9
2021 10
S403
SECURITY LABEL
FOR anon ON COLUMN v_staff_per_year.period IS 'INDIRECT IDENTIFIER';
SELECT anon.k_anonymity('v_staff_per_year');
DALIBO 35
Conclusion
Clean up !
37
Feb. 2023 Data Masking with PostgreSQL Anonymizer
run‑postgres: role “jack” cannot be dropped because some objects depend on it DETAIL:
Á 5 objects in database boutique
Advantages
38 DALIBO
Data Masking with PostgreSQL Anonymizer Feb. 2023
Drawbacks
Also…
Help Wanted!
labs.dalibo.com/postgresql_anonymizer8
Please send us feedback on how you use it, how it fits your needs (or not), etc.
DALIBO 39
Feb. 2023 Data Masking with PostgreSQL Anonymizer
Questions?
:::
40 DALIBO