Project

General

Profile

1
//version compatibility: 1.1.0-SNAPSHOT
2
print("here");
3

    
4
function dropDB(){
5
print("\n\n Drop DB\n\n")
6
	db.dropDatabase()
7
}
8
function createCollections(){
9
print("\n\n Create Collections \n\n")
10
	db.createCollection("community")
11
	db.createCollection("divHelpContent")
12
	db.createCollection("divId")
13
	db.createCollection("entity")
14
	db.createCollection("page")
15
	db.createCollection("pageHelpContent")
16
	db.createCollection("statistics")
17
	db.createCollection("communitySubscribers")
18
	db.createCollection("htmlPageContent")
19
}
20
function initializeEntitiesPagesDivIds(){
21
print("\n\n Initialize entities, pages & divIds \n\n")
22
	db.entity.save({"pid" : "publication", "name" : "Publication"})
23
	db.entity.save({"pid" : "dataset", "name" : "Research Data"})
24
	db.entity.save({"pid" : "software", "name" : "Software"})
25
	db.entity.save({"pid" : "project", "name" : "Project"})
26
	db.entity.save({"pid" : "organization", "name" : "Organization"})
27
	db.entity.save({"pid" : "datasource", "name" : "Content Provider"})
28

    
29
	publicationId = db.entity.find( { pid: "publication" }).map( function(entity) { return entity._id.str; } ).toString()
30
	datasetId = db.entity.find( { pid: "dataset" }).map( function(entity) { return entity._id.str; } ).toString()
31
	softwareId = db.entity.find( { pid: "software" }).map( function(entity) { return entity._id.str; } ).toString()
32
	projectId = db.entity.find( { pid: "project" }).map( function(entity) { return entity._id.str; } ).toString()
33
	organizationId = db.entity.find( { pid: "organization" }).map( function(entity) { return entity._id.str; } ).toString()
34
	datasourceId = db.entity.find( { pid: "datasource" }).map( function(entity) { return entity._id.str; } ).toString()
35

    
36
	db.page.save({"name" : "Publication Landing", "route" : "/search/publication", "type" : "landing", "connect":true,"openaire":true,"entities" : [publicationId]})
37
	db.page.save({"name" : "Research Data Landing", "route" : "/search/dataset", "type" : "landing", "connect":true,"openaire":true,"entities" : [datasetId]})
38
	db.page.save({"name" : "Software Landing", "route" : "/search/software", "type" : "landing", "connect":true,"openaire":true,"entities" : [softwareId]})
39
	db.page.save({"name" : "Project Landing", "route" : "/search/project", "type" : "landing", "connect":true,"openaire":true,"entities" : [projectId]})
40
	db.page.save({"name" : "Organization Landing", "route" : "/search/organization", "type" : "landing", "connect":true,"openaire":true,"entities" : [organizationId]})
41
	db.page.save({"name" : "Content Provider Landing", "route" : "/search/dataprovider", "type" : "landing", "connect":true,"openaire":true,"entities" : [datasourceId]})
42
	db.page.save({"name" : "Project Report", "route" : "/project-report", "type" : "landing", "connect":false,"openaire":true,"entities" : [projectId]})
43

    
44
	db.page.save({"name" : "Search Find", "type" : "search", "connect":false,"openaire":true,"entities" : [], "route" : "/search/find"})
45

    
46
	db.page.save({"name" : "Search Publications", "route" : "/search/find/publications", "type" : "search", "connect":true,"openaire":true,"entities" : [publicationId]})
47
	db.page.save({"name" : "Search Research Data", "route" : "/search/find/datasets", "type" : "search", "connect":true,"openaire":true,"entities" : [datasetId]})
48
	db.page.save({"name" : "Search Software", "route" : "/search/find/software", "type" : "search", "connect":true,"openaire":true,"entities" : [softwareId]})
49
	db.page.save({"name" : "Search Projects", "route" : "/search/find/projects", "type" : "search", "connect":true,"openaire":true,"entities" : [projectId]})
50
	db.page.save({"name" : "Search Organizations", "route" : "/search/find/organizations", "type" : "search", "connect":false,"openaire":true,"entities" : [organizationId]})
51
	db.page.save({"name" : "Search Content Providers", "route" : "/search/find/dataproviders", "type" : "search", "connect":true,"openaire":true,"entities" : [datasourceId]})
52

    
53
	db.page.save({"name" : "Advanced Search Publications", "route" : "/search/advanced/publications", "type" : "search", "connect":true,"openaire":true,"entities" : [publicationId]})
54
	db.page.save({"name" : "Advanced Search Research Data ", "route" : "/search/advanced/datasets", "type" : "search", "connect":true,"openaire":true,"entities" : [datasetId]})
55
	db.page.save({"name" : "Advanced Search Software", "route" : "/search/advanced/software", "type" : "search", "connect":true,"openaire":true,"entities" : [softwareId]})
56
	db.page.save({"name" : "Advanced Search Projects", "route" : "/search/advanced/projects", "type" : "search", "connect":false,"openaire":true,"entities" : [projectId]})
57
	db.page.save({"name" : "Advanced Search Organizations", "route" : "/search/advanced/organizations", "type" : "search", "connect":false,"openaire":true,"entities" : [organizationId]})
58
	db.page.save({"name" : "Advanced Search Content Providers", "route" : "/search/advanced/dataproviders", "type" : "search", "connect":false,"openaire":true,"entities" : [datasourceId]})
59

    
60
	db.page.save({"name" : "Search Journals", "route" : "/search/journals", "type" : "search", "connect":false,"openaire":true,"entities" : [datasourceId]})
61
	db.page.save({"name" : "Search Entity Registries", "route" : "/search/entity-registries", "type" : "search", "connect":false,"openaire":true,"entities" : [datasourceId]})
62
	db.page.save({"name" : "Search Compatible Content Providers", "route" : "/search/content-providers", "type" : "search", "connect":false,"openaire":true,"entities" : [datasourceId]})
63
	db.page.save({"name" : "Search Journals - Table view", "route" : "/search/journals-table", "type" : "search", "connect":false,"openaire":true,"entities" : [datasourceId]})
64
	db.page.save({"name" : "Search Entity Registries - Table view", "route" : "/search/entity-registries-table", "type" : "search", "connect":false,"openaire":true,"entities" : [datasourceId]})
65
	db.page.save({"name" : "Search Compatible Content Providers -Table view", "route" : "/search/content-providers-table", "type" : "search", "connect":false,"openaire":true,"entities" : [datasourceId]})
66

    
67
	db.page.save({"name" : "Deposit Publications", "route" : "/participate/deposit-publications", "type" : "share", "connect":true,"openaire":true,"entities" : [publicationId]})
68
	db.page.save({"name" : "Deposit Research Data", "route" : "/participate/deposit-datasets", "type" : "share", "connect":true,"openaire":true,"entities" : [datasetId]})
69
	db.page.save({"name" : "Deposit Publications Results", "route" : "/participate/deposit-publications-result", "type" : "share", "connect":true,"openaire":true,"entities" : [publicationId]})
70
	db.page.save({"name" : "Deposit Research Data Results", "route" : "/participate/deposit-datasets-result", "type" : "share", "connect":true,"openaire":true,"entities" : [datasetId]})
71
	db.page.save({"name" : "Deposit Research Data subject result", "route" : "/participate/deposit-subject-result", "type" : "share", "connect":true,"openaire":true,"entities" : [datasetId]})
72

    
73
	db.page.save({"name" : "Link", "route" : "/participate/claim", "type" : "link", "connect":true,"openaire":true,"entities" : [projectId]})
74
	db.page.save({"name" : "Direct Link", "route" : "/participate/direct-claim", "type" : "link", "connect":true,"openaire":true,"entities" : []})
75
	db.page.save({"name" : "My claims", "route" : "/myclaims", "type" : "link", "connect":true,"openaire":true,"entities" : []})
76
	db.page.save({"name" : "Administrator claims", "route" : "/claims", "type" : "link", "connect":true,"openaire":true,"entities" : []})
77
	db.page.save({"name" : "Claims Project Manager", "route" : "/claims-project-manager", "type" : "link", "connect":false,"openaire":true,"entities" : []})
78

    
79
	db.page.save({"name" : "Monitor", "route" : "/monitor", "type" : "other", "connect":true,"openaire":false,"entities" : []})
80
	db.page.save({"name" : "Content", "route" : "/content", "type" : "other", "connect":true,"openaire":false,"entities" : []})
81

    
82
	db.page.save({"name" : "About", "route" : "/about", "type" : "html", "connect":true,"openaire":false,"entities" : []})
83
	db.page.save({"name" : "Organizations", "route" : "/organizations", "type" : "html", "connect":true,"openaire":false,"entities" : []})
84

    
85
    link = db.page.find( { route: "/participate/claim" }).map( function(page) { return page._id.str; } ).toString()
86
	directLink = db.page.find( { route: "/participate/direct-claim" }).map( function(page) { return page._id.str; } ).toString()
87

    
88
	db.divId.save({ "name" : "link-context-form", "pages" : [link, directLink]})
89
    db.divId.save({ "name" : "link-project-form", "pages" : [link, directLink]})
90
    db.divId.save({ "name" : "link-result-form", "pages" : [link, directLink]})
91
    db.divId.save({ "name" : "link-result-bulk", "pages" : [link]})
92
    db.divId.save({ "name" : "link-metadata", "pages" : [link, directLink]})
93
}
94
function createCommunity(name,communityPid){
95
    var communitySaved =  db.community.find( { pid: communityPid }).map( function(community) { return community._id.str; } ).toString()
96
    if(communitySaved){
97
        print("\n\n Community \'"+name +"\' exists\n\n");
98
        return ;
99
    }
100
    print("\n\n Create community \n\n");
101
    print("Name:"+name);
102
    print("communityPid:"+communityPid);
103

    
104
	publicationLanding = db.page.find( { route: "/search/publication" }).map( function(page) { return page._id.str; } ).toString()
105
	datasetLanding = db.page.find( { route: "/search/dataset" }).map( function(page) { return page._id.str; } ).toString()
106
	softwareLanding = db.page.find( { route: "/search/software" }).map( function(page) { return page._id.str; } ).toString()
107
	projectLanding = db.page.find( { route: "/search/project" }).map( function(page) { return page._id.str; } ).toString()
108
	organizationLanding = db.page.find( { route: "/search/organization" }).map( function(page) { return page._id.str; } ).toString()
109
	dataproviderLanding = db.page.find( { route: "/search/dataprovider" }).map( function(page) { return page._id.str; } ).toString()
110
	projectReport = db.page.find( { route: "/project-report" }).map( function(page) { return page._id.str; } ).toString()
111

    
112
	searchFind = db.page.find( { route: "/search/find" }).map( function(page) { return page._id.str; } ).toString()
113

    
114
	searchPublications = db.page.find( { route: "/search/find/publications" }).map( function(page) { return page._id.str; } ).toString()
115
	searchDatasets = db.page.find( { route: "/search/find/datasets" }).map( function(page) { return page._id.str; } ).toString()
116
	searchSoftware = db.page.find( { route: "/search/find/software" }).map( function(page) { return page._id.str; } ).toString()
117
	searchProject = db.page.find( { route: "/search/find/projects" }).map( function(page) { return page._id.str; } ).toString()
118
	searchOrganization = db.page.find( { route: "/search/find/organizations" }).map( function(page) { return page._id.str; } ).toString()
119
	searchDataprovider = db.page.find( { route: "/search/find/dataproviders" }).map( function(page) { return page._id.str; } ).toString()
120

    
121
	advancedSearchPublications = db.page.find( { route: "/search/advanced/publications" }).map( function(page) { return page._id.str; } ).toString()
122
	advancedSearchDatasets = db.page.find( { route: "/search/advanced/datasets" }).map( function(page) { return page._id.str; } ).toString()
123
	advancedSearchSoftware = db.page.find( { route: "/search/advanced/software" }).map( function(page) { return page._id.str; } ).toString()
124
	advancedSearchProject = db.page.find( { route: "/search/advanced/projects" }).map( function(page) { return page._id.str; } ).toString()
125
	advancedSearchOrganization = db.page.find( { route: "/search/advanced/organizations" }).map( function(page) { return page._id.str; } ).toString()
126
	advancedSearchDataprovider = db.page.find( { route: "/search/advanced/dataproviders" }).map( function(page) { return page._id.str; } ).toString()
127

    
128
	searchJournals = db.page.find( { route: "/search/journals" }).map( function(page) { return page._id.str; } ).toString()
129
	searchEntityRegistries = db.page.find( { route: "/search/entity-registries" }).map( function(page) { return page._id.str; } ).toString()
130
	searchContentProviders = db.page.find( { route: "/search/content-providers" }).map( function(page) { return page._id.str; } ).toString()
131
	searchJournalsTable = db.page.find( { route: "/search/journals-table" }).map( function(page) { return page._id.str; } ).toString()
132
	searchEntityRegistriesTable = db.page.find( { route: "/search/entity-registries-table" }).map( function(page) { return page._id.str; } ).toString()
133
	searchContentProvidersTable = db.page.find( { route: "/search/content-providers-table" }).map( function(page) { return page._id.str; } ).toString()
134

    
135
	depositPublications = db.page.find( { route: "/participate/deposit-publications" }).map( function(page) { return page._id.str; } ).toString()
136
	depositDatasets = db.page.find( { route: "/participate/deposit-datasets" }).map( function(page) { return page._id.str; } ).toString()
137
	depositPublicationsResults = db.page.find( { route: "/participate/deposit-publications-result" }).map( function(page) { return page._id.str; } ).toString()
138
	depositDatasetsResults = db.page.find( { route: "/participate/deposit-datasets-result" }).map( function(page) { return page._id.str; } ).toString()
139
	depositDatasetSybjectResults = db.page.find( { route: "/participate/deposit-subject-result" }).map( function(page) { return page._id.str; } ).toString()
140

    
141
	link = db.page.find( { route: "/participate/claim" }).map( function(page) { return page._id.str; } ).toString()
142
	directLink = db.page.find( { route: "/participate/direct-claim" }).map( function(page) { return page._id.str; } ).toString()
143
	myClaims = db.page.find( { route: "/myclaims" }).map( function(page) { return page._id.str; } ).toString()
144
	administratorClaims = db.page.find( { route: "/claims" }).map( function(page) { return page._id.str; } ).toString()
145
	claimsProjectManager = db.page.find( { route: "/claims-project-manager" }).map( function(page) { return page._id.str; } ).toString()
146

    
147
	monitor = db.page.find( { route: "/monitor" }).map( function(page) { return page._id.str; } ).toString()
148
	content = db.page.find( { route: "/content" }).map( function(page) { return page._id.str; } ).toString()
149

    
150
	about = db.page.find( { route: "/about" }).map( function(page) { return page._id.str; } ).toString()
151
	organizations = db.page.find( { route: "/organizations" }).map( function(page) { return page._id.str; } ).toString()
152

    
153
	var community_pages = {}
154
	community_pages[publicationLanding] = true;
155
	community_pages[datasetLanding] = true;
156
	community_pages[softwareLanding] = true;
157
	community_pages[projectLanding] = true;
158
	community_pages[organizationLanding] = true;
159
	community_pages[dataproviderLanding] = true;
160
	community_pages[projectReport] = true;
161
	community_pages[searchFind] = true;
162
	community_pages[searchPublications] = true;
163
	community_pages[searchDatasets] = true;
164
	community_pages[searchSoftware] = true;
165
	community_pages[searchProject] = true;
166
	community_pages[searchOrganization] = true;
167
	community_pages[searchDataprovider] = true;
168
	community_pages[advancedSearchPublications] = true;
169
	community_pages[advancedSearchDatasets] = true;
170
	community_pages[advancedSearchSoftware] = true;
171
	community_pages[advancedSearchProject] = true;
172
	community_pages[advancedSearchOrganization] = true;
173
	community_pages[advancedSearchDataprovider] = true;
174
	community_pages[searchJournals] = true;
175
	community_pages[searchEntityRegistries] = true;
176
	community_pages[searchContentProviders] = true;
177
	community_pages[searchJournalsTable] = true;
178
	community_pages[searchEntityRegistriesTable] = true;
179
	community_pages[searchContentProvidersTable] = true;
180
	community_pages[depositPublications] = true;
181
	community_pages[depositDatasets] = true;
182
	community_pages[depositPublicationsResults] = true;
183
	community_pages[depositDatasetsResults] = true;
184
	community_pages[depositDatasetSybjectResults] = true;
185
	community_pages[link] = true;
186
	community_pages[directLink] = true;
187
	community_pages[myClaims] = true;
188
	community_pages[administratorClaims] = true;
189
	community_pages[claimsProjectManager] = true;
190
	community_pages[monitor] = true;
191
	community_pages[content] = true;
192
	community_pages[about] = true;
193
	community_pages[organizations] = true;
194

    
195
	publicationId = db.entity.find( { pid: "publication" }).map( function(entity) { return entity._id.str; } ).toString()
196
	datasetId = db.entity.find( { pid: "dataset" }).map( function(entity) { return entity._id.str; } ).toString()
197
	softwareId = db.entity.find( { pid: "software" }).map( function(entity) { return entity._id.str; } ).toString()
198
	projectId = db.entity.find( { pid: "project" }).map( function(entity) { return entity._id.str; } ).toString()
199
	organizationId = db.entity.find( { pid: "organization" }).map( function(entity) { return entity._id.str; } ).toString()
200
	datasourceId = db.entity.find( { pid: "datasource" }).map( function(entity) { return entity._id.str; } ).toString()
201
	var community_entities = {}
202
	community_entities[publicationId] = true;
203
	community_entities[datasetId] = true;
204
	community_entities[softwareId] = true;
205
	community_entities[projectId] = true;
206
	community_entities[organizationId] = true;
207
	community_entities[datasourceId] = true;
208

    
209
 	db.community.save({	"name" : name, "pid" : communityPid, "pages" : community_pages, "entities" : community_entities})
210

    
211
	openaireCommunity = db.community.find( { pid: communityPid }).map( function(community) { return community._id.str; } ).toString()
212

    
213
    var numbers_map = {};
214
        numbers_map["total"] = { "showInMonitor" : true, "showInDashboard" : false };
215
        numbers_map["project"] = { "showInMonitor" : true, "showInDashboard" : false };
216
        numbers_map["open"] = { "showInMonitor" : true, "showInDashboard" : false };
217
        numbers_map["closed"] = { "showInMonitor" : true, "showInDashboard" : false };
218
        numbers_map["embargo"] = { "showInMonitor" : true, "showInDashboard" : false };
219
        numbers_map["restricted"] = { "showInMonitor" : true, "showInDashboard" : false };
220
    var numbers = {"map":numbers_map};
221
    var charts_map = {};
222
        charts_map["timeline"] = { "showInMonitor" : true, "showInDashboard" : false };
223
        charts_map["graph"] = { "showInMonitor" : true, "showInDashboard" : false };
224
        charts_map["projectTable"] = { "showInMonitor" : true, "showInDashboard" : false };
225
        charts_map["projectColumn"] = { "showInMonitor" : true, "showInDashboard" : false };
226
        charts_map["projectPie"] = { "showInMonitor" : true, "showInDashboard" : false };
227
    var charts = {"map":charts_map};
228

    
229
	var statistics_entities = {"charts":charts,"numbers":numbers}
230
	var entities = {};
231
	entities["publication"]=statistics_entities;
232
	entities["dataset"]=statistics_entities;
233
	entities["software"]=statistics_entities;
234
	var statistics = {"pid" : communityPid, "entities" : entities};
235

    
236
    db.statistics.save(statistics);
237

    
238
    var subscribers = [];
239
    db.communitySubscribers.save({ "pid" : communityPid, "subscribers" : subscribers})
240

    
241
    link_context_form = db.divId.find( { name: "link-context-form" }).map( function(divId) { return divId._id.str; } ).toString();
242
    link_project_form = db.divId.find( { name: "link-project-form" }).map( function(divId) { return divId._id.str; } ).toString();
243
    link_result_form = db.divId.find( { name: "link-result-form" }).map( function(divId) { return divId._id.str; } ).toString();
244
    link_result_bulk = db.divId.find( { name: "link-result-bulk" }).map( function(divId) { return divId._id.str; } ).toString();
245
    link_metadata = db.divId.find( { name: "link-metadata" }).map( function(divId) { return divId._id.str; } ).toString();
246

    
247
    link_context_form_content = '<div> <div><span class="uk-text-bold"><span uk-icon="icon: info">&nbsp;</span> Information:</span> Select a research community and/or a category and search for a community concept, or browse to the community tree through the categories</div> </div>';
248
    link_project_form_content = '<div> <div><span class="uk-text-bold"><span uk-icon="icon: info">&nbsp;</span> Information:</span> Search for projects using project name or grant id. Limit results filtering by funder.</div> </div>';
249
    link_result_form_content = '<div> <div><span class="uk-text-bold"><span uk-icon="icon: info">&nbsp;</span> Information:</span></div> Search for research results in OpenAIRE information space, Datacite, CrossRef or ORCID. <div class="uk-text-small">Use keywords, DOI (more than one - space separated), author&#39;s ORCID</div> </div> ';
250
    link_result_bulk_content = '<div> <div><span class="uk-text-bold"><span uk-icon="icon: info">&nbsp;</span> Information:</span> Upload a csv file containing a list of DOIs. For each DOI found in the file, metadata will be fetched from CrossRef or Datacite and will be added to your selected research results.</div> <div class="uk-margin-top uk-text-small"><span class="uk-text-bold">CSV format:</span> <ul class="uk-list"> <li>The format of CSV file should be &quot;DOI&quot;,&quot;ACCESS_MODE&quot;,&quot;DATE&quot;.</li> <li>The value &quot;DOI&quot; is required</li> <li>Access mode column should have values: &quot;OPEN&quot;,&quot;CLOSED&quot; or &quot;EMBARGO&quot;.</li> <li>Date column valid format is YYYY-MM-DD and is required when access mode has value EMBARGO.</li> <li>In case access mode is not available default value is &quot;OPEN&quot;.</li> </ul> </div> </div> ';
251
    link_metadata_content = '<div> <div><span class="uk-text-bold"><span uk-icon="icon: info">&nbsp;</span> Information:</span> Manage access mode &amp; type of selected research results. For OpenAIRE this functionality isn&#39;t available.</div> </div>';
252

    
253
    communityID = db.community.find({ "pid" : communityPid}).map( function(community) { return community._id.str.toString(); } );
254

    
255
    db.divHelpContent.save({ "divId" : link_context_form, "community" : communityID, "content" : link_context_form_content, "isActive" : false });
256
    db.divHelpContent.save({ "divId" : link_project_form, "community" : communityID, "content" : link_project_form_content, "isActive" : false });
257
    db.divHelpContent.save({ "divId" : link_result_form, "community" : communityID, "content" : link_result_form_content, "isActive" : true });
258
    db.divHelpContent.save({ "divId" : link_result_bulk, "community" : communityID, "content" : link_result_bulk_content, "isActive" : true });
259
    db.divHelpContent.save({ "divId" : link_metadata, "community" : communityID, "content" : link_metadata_content, "isActive" : false });
260

    
261
print("\n\n Done \n\n");
262

    
263
}
264
function createAllCommunities(){
265
    createCommunity("OpenAIRE","openaire");
266
    createCommunity("EGI Federation","egi");
267
    createCommunity("Environment and Economy","ee");
268
    createCommunity("Fisheries and Aquaculture Management","fam");
269
    createCommunity("Instruct-ERIC","instruct");
270
    createCommunity("Elixir","elixir-gr");
271
    createCommunity("Marine Environmental Science","mes");
272
    createCommunity("EC post-grant Open Access Pilot","oa-pg");
273
    createCommunity("Neuroinformatics","ni");
274
    createCommunity("Research Data Alliance","rda");
275
    createCommunity("Digital Humanities and Cultural Heritage","dh-ch");
276
	createCommunity("AGINFRA+","aginfra");
277
	createCommunity("Clarin","clarin");
278
}
279

    
280
function addDefaultHtmlToHtmlPages() {
281
	about = db.page.find( { route: "/about" }).map( function(page) { return page._id.str; } ).toString()
282
	organizations = db.page.find( { route: "/organizations" }).map( function(page) { return page._id.str; } ).toString()
283

    
284
	communities = db.community.find().map( function(community) { return community._id.str.toString(); } );
285

    
286
	for (var i = 0; i < communities.length; i++) {
287
 		db.htmlPageContent.save({"page" : about, "community" : communities[i], "content" : "<div>Build your html page: About</div>"})
288
 		db.htmlPageContent.save({"page" : organizations, "community" : communities[i], "content" : "<div>Build your html page: Organizations</div>"})
289
	}
290
}
291

    
292
use openaire_admin;
293

    
294
dropDB();
295
createCollections();
296
initializeEntitiesPagesDivIds();
297
//createCommunity("OpenAIRE","openaire");
298
createAllCommunities();
299
addDefaultHtmlToHtmlPages();
(1-1/3)