geonetwork-ui 2.3.0-dev.376e0e90 → 2.3.0-dev.f736344f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/libs/api/metadata-converter/src/index.mjs +5 -5
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +52 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +14 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.mjs +48 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.mjs +18 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.mjs +64 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +130 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +62 -58
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +58 -75
- package/esm2022/libs/api/metadata-converter/src/lib/metadata-base.mapper.mjs +14 -0
- package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +14 -76
- package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +4 -4
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +8 -8
- package/fesm2022/geonetwork-ui.mjs +245 -822
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/api/metadata-converter/src/index.d.ts +4 -4
- package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/{gn4.converter.d.ts → gn4.metadata.mapper.d.ts} +5 -5
- package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts +4 -0
- package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +6 -34
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -39
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/{base.converter.d.ts → metadata-base.mapper.d.ts} +3 -3
- package/libs/api/metadata-converter/src/lib/metadata-base.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +1 -14
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +2 -2
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +4 -6
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/api/metadata-converter/src/index.ts +4 -4
- package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +5 -32
- package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +4 -11
- package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +7 -33
- package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/gn4/{gn4.converter.ts → gn4.metadata.mapper.ts} +2 -2
- package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +196 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +82 -121
- package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +95 -175
- package/src/libs/api/metadata-converter/src/lib/{base.converter.ts → metadata-base.mapper.ts} +2 -2
- package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +16 -84
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +4 -9
- package/src/libs/feature/editor/src/lib/services/editor.service.ts +16 -27
- package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +0 -14
- package/esm2022/libs/api/metadata-converter/src/lib/find-converter.mjs +0 -15
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.converter.mjs +0 -52
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/index.mjs +0 -4
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/index.mjs +0 -2
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +0 -123
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +0 -116
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +0 -138
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/index.mjs +0 -2
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +0 -242
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.mjs +0 -18
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.mjs +0 -14
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.mjs +0 -48
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +0 -18
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.mjs +0 -64
- package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/find-converter.d.ts +0 -3
- package/libs/api/metadata-converter/src/lib/find-converter.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.converter.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/gn4/index.d.ts +0 -4
- package/libs/api/metadata-converter/src/lib/gn4/index.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts +0 -2
- package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +0 -9
- package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +0 -20
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +0 -21
- package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts +0 -2
- package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +0 -11
- package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts +0 -8
- package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.d.ts.map +0 -1
- package/src/libs/api/metadata-converter/src/lib/find-converter.ts +0 -16
- package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +0 -580
- package/src/libs/api/metadata-converter/src/lib/gn4/index.ts +0 -3
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/index.ts +0 -1
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +0 -176
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +0 -329
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +0 -513
- package/src/libs/api/metadata-converter/src/lib/iso19139/index.ts +0 -1
- package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +0 -327
- package/src/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.ts +0 -20
- /package/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/keyword.mapper.d.ts +0 -0
- /package/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/role.mapper.d.ts +0 -0
- /package/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/status.mapper.d.ts +0 -0
- /package/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/update-frequency.mapper.d.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/keyword.mapper.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/role.mapper.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/status.mapper.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{utils → codelists}/update-frequency.mapper.ts +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { createDocument, createElement, getRootElement, parseXmlString, xmlToString, } from '../xml-utils';
|
|
2
|
+
import { writeAbstract, writeContacts, writeDatasetCreated, writeDatasetUpdated, writeDistributions, writeGraphicOverviews, writeKeywords, writeKind, writeLegalConstraints, writeLicenses, writeLineage, writeOnlineResources, writeOtherConstraints, writeOwnerOrganization, writeRecordUpdated, writeSecurityConstraints, writeSpatialRepresentation, writeStatus, writeTopics, writeTitle, writeUniqueIdentifier, writeUpdateFrequency, } from './write-parts';
|
|
3
|
+
import { readAbstract, readContacts, readDatasetCreated, readDatasetUpdated, readDistributions, readIsoTopics, readKeywords, readKind, readLegalConstraints, readLicenses, readLineage, readOnlineResources, readOtherConstraints, readOverviews, readOwnerOrganization, readRecordUpdated, readRecordPublished, readSecurityConstraints, readSpatialExtents, readSpatialRepresentation, readStatus, readTemporalExtents, readTitle, readUniqueIdentifier, readUpdateFrequency, } from './read-parts';
|
|
4
|
+
import { isEqual } from '../convert-utils';
|
|
5
|
+
export function toModel(xml) {
|
|
6
|
+
const doc = parseXmlString(xml);
|
|
7
|
+
const rootEl = getRootElement(doc);
|
|
8
|
+
const uniqueIdentifier = readUniqueIdentifier(rootEl);
|
|
9
|
+
const kind = readKind(rootEl);
|
|
10
|
+
const ownerOrganization = readOwnerOrganization(rootEl);
|
|
11
|
+
const title = readTitle(rootEl);
|
|
12
|
+
const abstract = readAbstract(rootEl);
|
|
13
|
+
const contacts = readContacts(rootEl);
|
|
14
|
+
const recordUpdated = readRecordUpdated(rootEl);
|
|
15
|
+
const recordCreated = recordUpdated;
|
|
16
|
+
const recordPublished = readRecordPublished(rootEl);
|
|
17
|
+
const keywords = readKeywords(rootEl);
|
|
18
|
+
const topics = readIsoTopics(rootEl);
|
|
19
|
+
const legalConstraints = readLegalConstraints(rootEl);
|
|
20
|
+
const otherConstraints = readOtherConstraints(rootEl);
|
|
21
|
+
const securityConstraints = readSecurityConstraints(rootEl);
|
|
22
|
+
const licenses = readLicenses(rootEl);
|
|
23
|
+
const overviews = readOverviews(rootEl);
|
|
24
|
+
if (kind === 'dataset') {
|
|
25
|
+
const status = readStatus(rootEl);
|
|
26
|
+
const datasetCreated = readDatasetCreated(rootEl);
|
|
27
|
+
const datasetUpdated = readDatasetUpdated(rootEl);
|
|
28
|
+
const spatialRepresentation = readSpatialRepresentation(rootEl);
|
|
29
|
+
const spatialExtents = readSpatialExtents(rootEl);
|
|
30
|
+
const temporalExtents = readTemporalExtents(rootEl);
|
|
31
|
+
const lineage = readLineage(rootEl);
|
|
32
|
+
const distributions = readDistributions(rootEl);
|
|
33
|
+
const updateFrequency = readUpdateFrequency(rootEl);
|
|
34
|
+
return {
|
|
35
|
+
uniqueIdentifier,
|
|
36
|
+
kind,
|
|
37
|
+
languages: [],
|
|
38
|
+
recordCreated,
|
|
39
|
+
recordUpdated,
|
|
40
|
+
recordPublished,
|
|
41
|
+
status,
|
|
42
|
+
title,
|
|
43
|
+
abstract,
|
|
44
|
+
ownerOrganization,
|
|
45
|
+
contacts,
|
|
46
|
+
contactsForResource: [],
|
|
47
|
+
keywords,
|
|
48
|
+
topics,
|
|
49
|
+
licenses,
|
|
50
|
+
legalConstraints,
|
|
51
|
+
securityConstraints,
|
|
52
|
+
otherConstraints,
|
|
53
|
+
...(datasetCreated && { datasetCreated }),
|
|
54
|
+
...(datasetUpdated && { datasetUpdated }),
|
|
55
|
+
lineage,
|
|
56
|
+
...(spatialRepresentation && { spatialRepresentation }),
|
|
57
|
+
overviews,
|
|
58
|
+
spatialExtents,
|
|
59
|
+
temporalExtents,
|
|
60
|
+
distributions,
|
|
61
|
+
updateFrequency,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const onlineResources = readOnlineResources(rootEl);
|
|
66
|
+
return {
|
|
67
|
+
uniqueIdentifier,
|
|
68
|
+
kind,
|
|
69
|
+
languages: [],
|
|
70
|
+
recordCreated,
|
|
71
|
+
recordUpdated,
|
|
72
|
+
recordPublished,
|
|
73
|
+
title,
|
|
74
|
+
abstract,
|
|
75
|
+
ownerOrganization,
|
|
76
|
+
contacts,
|
|
77
|
+
keywords,
|
|
78
|
+
topics,
|
|
79
|
+
licenses,
|
|
80
|
+
legalConstraints,
|
|
81
|
+
securityConstraints,
|
|
82
|
+
otherConstraints,
|
|
83
|
+
overviews,
|
|
84
|
+
onlineResources,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function toXml(record, originalXml) {
|
|
89
|
+
const originalDoc = originalXml ? parseXmlString(originalXml) : null;
|
|
90
|
+
const originalRecord = originalXml ? toModel(originalXml) : null;
|
|
91
|
+
const rootEl = originalDoc
|
|
92
|
+
? getRootElement(originalDoc)
|
|
93
|
+
: createElement('gmd:MD_Metadata')();
|
|
94
|
+
function fieldChanged(name) {
|
|
95
|
+
return originalRecord !== null
|
|
96
|
+
? !isEqual(record[name], originalRecord[name])
|
|
97
|
+
: true;
|
|
98
|
+
}
|
|
99
|
+
writeUniqueIdentifier(record, rootEl);
|
|
100
|
+
writeKind(record, rootEl);
|
|
101
|
+
fieldChanged('ownerOrganization') && writeOwnerOrganization(record, rootEl);
|
|
102
|
+
fieldChanged('recordUpdated') && writeRecordUpdated(record, rootEl);
|
|
103
|
+
writeTitle(record, rootEl);
|
|
104
|
+
writeAbstract(record, rootEl);
|
|
105
|
+
fieldChanged('contacts') && writeContacts(record, rootEl);
|
|
106
|
+
fieldChanged('keywords') && writeKeywords(record, rootEl);
|
|
107
|
+
fieldChanged('topics') && writeTopics(record, rootEl);
|
|
108
|
+
fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
|
|
109
|
+
fieldChanged('securityConstraints') &&
|
|
110
|
+
writeSecurityConstraints(record, rootEl);
|
|
111
|
+
fieldChanged('licenses') && writeLicenses(record, rootEl);
|
|
112
|
+
fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
|
|
113
|
+
if (record.kind === 'dataset') {
|
|
114
|
+
writeStatus(record, rootEl);
|
|
115
|
+
fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
|
|
116
|
+
fieldChanged('datasetCreated') && writeDatasetCreated(record, rootEl);
|
|
117
|
+
fieldChanged('datasetUpdated') && writeDatasetUpdated(record, rootEl);
|
|
118
|
+
fieldChanged('spatialRepresentation') &&
|
|
119
|
+
writeSpatialRepresentation(record, rootEl);
|
|
120
|
+
fieldChanged('overviews') && writeGraphicOverviews(record, rootEl);
|
|
121
|
+
fieldChanged('distributions') && writeDistributions(record, rootEl);
|
|
122
|
+
writeLineage(record, rootEl);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
fieldChanged('onlineResources') && writeOnlineResources(record, rootEl);
|
|
126
|
+
}
|
|
127
|
+
const newDocument = createDocument(rootEl);
|
|
128
|
+
return xmlToString(newDocument);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcGkvbWV0YWRhdGEtY29udmVydGVyL3NyYy9saWIvaXNvMTkxMzkvY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFDTCxjQUFjLEVBQ2QsYUFBYSxFQUNiLGNBQWMsRUFDZCxjQUFjLEVBQ2QsV0FBVyxHQUNaLE1BQU0sY0FBYyxDQUFBO0FBQ3JCLE9BQU8sRUFDTCxhQUFhLEVBQ2IsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsU0FBUyxFQUNULHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsMEJBQTBCLEVBQzFCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQix5QkFBeUIsRUFDekIsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLG1CQUFtQixHQUNwQixNQUFNLGNBQWMsQ0FBQTtBQUNyQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JB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SUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDckUsWUFBWSxDQUFDLHVCQUF1QixDQUFDO1lBQ25DLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUM1QyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUkscUJBQXFCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ2xFLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDbkUsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQTtLQUM3QjtTQUFNO1FBQ0wsWUFBWSxDQUFDLGlCQUFpQixDQUFDLElBQUksb0JBQW9CLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0tBQ3hFO0lBRUQsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzFDLE9BQU8sV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDYXRhbG9nUmVjb3JkLFxuICBEYXRhc2V0UmVjb3JkLFxuICBTZXJ2aWNlUmVjb3JkLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9kb21haW4vc3JjL2xpYi9tb2RlbC9yZWNvcmQnXG5pbXBvcnQge1xuICBjcmVhdGVEb2N1bWVudCxcbiAgY3JlYXRlRWxlbWVudCxcbiAgZ2V0Um9vdEVsZW1lbnQsXG4gIHBhcnNlWG1sU3RyaW5nLFxuICB4bWxUb1N0cmluZyxcbn0gZnJvbSAnLi4veG1sLXV0aWxzJ1xuaW1wb3J0IHtcbiAgd3JpdGVBYnN0cmFjdCxcbiAgd3JpdGVDb250YWN0cyxcbiAgd3JpdGVEYXRhc2V0Q3JlYXRlZCxcbiAgd3JpdGVEYXRhc2V0VXBkYXRlZCxcbiAgd3JpdGVEaXN0cmlidXRpb25zLFxuICB3cml0ZUdyYXBoaWNPdmVydmlld3MsXG4gIHdyaXRlS2V5d29yZHMsXG4gIHdyaXRlS2luZCxcbiAgd3JpdGVMZWdhbENvbnN0cmFpbnRzLFxuICB3cml0ZUxpY2Vuc2VzLFxuICB3cml0ZUxpbmVhZ2UsXG4gIHdyaXRlT25saW5lUmVzb3VyY2VzLFxuICB3cml0ZU90aGVyQ29uc3RyYWludHMsXG4gIHdyaXRlT3duZXJPcmdhbml6YXRpb24sXG4gIHdyaXRlUmVjb3JkVXBkYXRlZCxcbiAgd3JpdGVTZWN1cml0eUNvbnN0cmFpbnRzLFxuICB3cml0ZVNwYXRpYWxSZXByZXNlbnRhdGlvbixcbiAgd3JpdGVTdGF0dXMsXG4gIHdyaXRlVG9waWNzLFxuICB3cml0ZVRpdGxlLFxuICB3cml0ZVVuaXF1ZUlkZW50aWZpZXIsXG4gIHdyaXRlVXBkYXRlRnJlcXVlbmN5LFxufSBmcm9tICcuL3dyaXRlLXBhcnRzJ1xuaW1wb3J0IHtcbiAgcmVhZEFic3RyYWN0LFxuICByZWFkQ29udGFjdHMsXG4gIHJlYWREYXRhc2V0Q3JlYXRlZCxcbiAgcmVhZERhdGFzZXRVcGRhdGVkLFxuICByZWFkRGlzdHJpYnV0aW9ucyxcbiAgcmVhZElzb1RvcGljcyxcbiAgcmVhZEtleXdvcmRzLFxuICByZWFkS2luZCxcbiAgcmVhZExlZ2FsQ29uc3RyYWludHMsXG4gIHJlYWRMaWNlbnNlcyxcbiAgcmVhZExpbmVhZ2UsXG4gIHJlYWRPbmxpbmVSZXNvdXJjZXMsXG4gIHJlYWRPdGhlckNvbnN0cmFpbnRzLFxuICByZWFkT3ZlcnZpZXdzLFxuICByZWFkT3duZXJPcmdhbml6YXRpb24sXG4gIHJlYWRSZWNvcmRVcGRhdGVkLFxuICByZWFkUmVjb3JkUHVibGlzaGVkLFxuICByZWFkU2VjdXJpdHlDb25zdHJhaW50cyxcbiAgcmVhZFNwYXRpYWxFeHRlbnRzLFxuICByZWFkU3BhdGlhbFJlcHJlc2VudGF0aW9uLFxuICByZWFkU3RhdHVzLFxuICByZWFkVGVtcG9yYWxFeHRlbnRzLFxuICByZWFkVGl0bGUsXG4gIHJlYWRVbmlxdWVJZGVudGlmaWVyLFxuICByZWFkVXBkYXRlRnJlcXVlbmN5LFxufSBmcm9tICcuL3JlYWQtcGFydHMnXG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnLi4vY29udmVydC11dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIHRvTW9kZWwoeG1sOiBzdHJpbmcpOiBDYXRhbG9nUmVjb3JkIHtcbiAgY29uc3QgZG9jID0gcGFyc2VYbWxTdHJpbmcoeG1sKVxuICBjb25zdCByb290RWwgPSBnZXRSb290RWxlbWVudChkb2MpXG5cbiAgY29uc3QgdW5pcXVlSWRlbnRpZmllciA9IHJlYWRVbmlxdWVJZGVudGlmaWVyKHJvb3RFbClcbiAgY29uc3Qga2luZCA9IHJlYWRLaW5kKHJvb3RFbClcbiAgY29uc3Qgb3duZXJPcmdhbml6YXRpb24gPSByZWFkT3duZXJPcmdhbml6YXRpb24ocm9vdEVsKVxuICBjb25zdCB0aXRsZSA9IHJlYWRUaXRsZShyb290RWwpXG4gIGNvbnN0IGFic3RyYWN0ID0gcmVhZEFic3RyYWN0KHJvb3RFbClcbiAgY29uc3QgY29udGFjdHMgPSByZWFkQ29udGFjdHMocm9vdEVsKVxuICBjb25zdCByZWNvcmRVcGRhdGVkID0gcmVhZFJlY29yZFVwZGF0ZWQocm9vdEVsKVxuICBjb25zdCByZWNvcmRDcmVhdGVkID0gcmVjb3JkVXBkYXRlZFxuICBjb25zdCByZWNvcmRQdWJsaXNoZWQgPSByZWFkUmVjb3JkUHVibGlzaGVkKHJvb3RFbClcbiAgY29uc3Qga2V5d29yZHMgPSByZWFkS2V5d29yZHMocm9vdEVsKVxuICBjb25zdCB0b3BpY3MgPSByZWFkSXNvVG9waWNzKHJvb3RFbClcbiAgY29uc3QgbGVnYWxDb25zdHJhaW50cyA9IHJlYWRMZWdhbENvbnN0cmFpbnRzKHJvb3RFbClcbiAgY29uc3Qgb3RoZXJDb25zdHJhaW50cyA9IHJlYWRPdGhlckNvbnN0cmFpbnRzKHJvb3RFbClcbiAgY29uc3Qgc2VjdXJpdHlDb25zdHJhaW50cyA9IHJlYWRTZWN1cml0eUNvbnN0cmFpbnRzKHJvb3RFbClcbiAgY29uc3QgbGljZW5zZXMgPSByZWFkTGljZW5zZXMocm9vdEVsKVxuICBjb25zdCBvdmVydmlld3MgPSByZWFkT3ZlcnZpZXdzKHJvb3RFbClcblxuICBpZiAoa2luZCA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gcmVhZFN0YXR1cyhyb290RWwpXG4gICAgY29uc3QgZGF0YXNldENyZWF0ZWQgPSByZWFkRGF0YXNldENyZWF0ZWQocm9vdEVsKVxuICAgIGNvbnN0IGRhdGFzZXRVcGRhdGVkID0gcmVhZERhdGFzZXRVcGRhdGVkKHJvb3RFbClcbiAgICBjb25zdCBzcGF0aWFsUmVwcmVzZW50YXRpb24gPSByZWFkU3BhdGlhbFJlcHJlc2VudGF0aW9uKHJvb3RFbClcbiAgICBjb25zdCBzcGF0aWFsRXh0ZW50cyA9IHJlYWRTcGF0aWFsRXh0ZW50cyhyb290RWwpXG4gICAgY29uc3QgdGVtcG9yYWxFeHRlbnRzID0gcmVhZFRlbXBvcmFsRXh0ZW50cyhyb290RWwpXG4gICAgY29uc3QgbGluZWFnZSA9IHJlYWRMaW5lYWdlKHJvb3RFbClcbiAgICBjb25zdCBkaXN0cmlidXRpb25zID0gcmVhZERpc3RyaWJ1dGlvbnMocm9vdEVsKVxuICAgIGNvbnN0IHVwZGF0ZUZyZXF1ZW5jeSA9IHJlYWRVcGRhdGVGcmVxdWVuY3kocm9vdEVsKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVuaXF1ZUlkZW50aWZpZXIsXG4gICAgICBraW5kLFxuICAgICAgbGFuZ3VhZ2VzOiBbXSxcbiAgICAgIHJlY29yZENyZWF0ZWQsXG4gICAgICByZWNvcmRVcGRhdGVkLFxuICAgICAgcmVjb3JkUHVibGlzaGVkLFxuICAgICAgc3RhdHVzLFxuICAgICAgdGl0bGUsXG4gICAgICBhYnN0cmFjdCxcbiAgICAgIG93bmVyT3JnYW5pemF0aW9uLFxuICAgICAgY29udGFjdHMsXG4gICAgICBjb250YWN0c0ZvclJlc291cmNlOiBbXSwgLy8gRklYTUU6IGlzIHRoYXQgcmVhbGx5IHVzZWZ1bD8/XG4gICAgICBrZXl3b3JkcyxcbiAgICAgIHRvcGljcyxcbiAgICAgIGxpY2Vuc2VzLFxuICAgICAgbGVnYWxDb25zdHJhaW50cyxcbiAgICAgIHNlY3VyaXR5Q29uc3RyYWludHMsXG4gICAgICBvdGhlckNvbnN0cmFpbnRzLFxuICAgICAgLi4uKGRhdGFzZXRDcmVhdGVkICYmIHsgZGF0YXNldENyZWF0ZWQgfSksXG4gICAgICAuLi4oZGF0YXNldFVwZGF0ZWQgJiYgeyBkYXRhc2V0VXBkYXRlZCB9KSxcbiAgICAgIGxpbmVhZ2UsXG4gICAgICAuLi4oc3BhdGlhbFJlcHJlc2VudGF0aW9uICYmIHsgc3BhdGlhbFJlcHJlc2VudGF0aW9uIH0pLFxuICAgICAgb3ZlcnZpZXdzLFxuICAgICAgc3BhdGlhbEV4dGVudHMsXG4gICAgICB0ZW1wb3JhbEV4dGVudHMsXG4gICAgICBkaXN0cmlidXRpb25zLFxuICAgICAgdXBkYXRlRnJlcXVlbmN5LFxuICAgIH0gYXMgRGF0YXNldFJlY29yZFxuICB9IGVsc2Uge1xuICAgIGNvbnN0IG9ubGluZVJlc291cmNlcyA9IHJlYWRPbmxpbmVSZXNvdXJjZXMocm9vdEVsKVxuICAgIHJldHVybiB7XG4gICAgICB1bmlxdWVJZGVudGlmaWVyLFxuICAgICAga2luZCxcbiAgICAgIGxhbmd1YWdlczogW10sXG4gICAgICByZWNvcmRDcmVhdGVkLFxuICAgICAgcmVjb3JkVXBkYXRlZCxcbiAgICAgIHJlY29yZFB1Ymxpc2hlZCxcbiAgICAgIHRpdGxlLFxuICAgICAgYWJzdHJhY3QsXG4gICAgICBvd25lck9yZ2FuaXphdGlvbixcbiAgICAgIGNvbnRhY3RzLFxuICAgICAga2V5d29yZHMsXG4gICAgICB0b3BpY3MsXG4gICAgICBsaWNlbnNlcyxcbiAgICAgIGxlZ2FsQ29uc3RyYWludHMsXG4gICAgICBzZWN1cml0eUNvbnN0cmFpbnRzLFxuICAgICAgb3RoZXJDb25zdHJhaW50cyxcbiAgICAgIG92ZXJ2aWV3cyxcbiAgICAgIG9ubGluZVJlc291cmNlcyxcbiAgICB9IGFzIFNlcnZpY2VSZWNvcmRcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9YbWwocmVjb3JkOiBDYXRhbG9nUmVjb3JkLCBvcmlnaW5hbFhtbD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG9yaWdpbmFsRG9jID0gb3JpZ2luYWxYbWwgPyBwYXJzZVhtbFN0cmluZyhvcmlnaW5hbFhtbCkgOiBudWxsXG4gIGNvbnN0IG9yaWdpbmFsUmVjb3JkID0gb3JpZ2luYWxYbWwgPyB0b01vZGVsKG9yaWdpbmFsWG1sKSA6IG51bGxcbiAgY29uc3Qgcm9vdEVsID0gb3JpZ2luYWxEb2NcbiAgICA/IGdldFJvb3RFbGVtZW50KG9yaWdpbmFsRG9jKVxuICAgIDogY3JlYXRlRWxlbWVudCgnZ21kOk1EX01ldGFkYXRhJykoKVxuXG4gIGZ1bmN0aW9uIGZpZWxkQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxSZWNvcmQgIT09IG51bGxcbiAgICAgID8gIWlzRXF1YWwocmVjb3JkW25hbWVdLCBvcmlnaW5hbFJlY29yZFtuYW1lXSlcbiAgICAgIDogdHJ1ZVxuICB9XG5cbiAgd3JpdGVVbmlxdWVJZGVudGlmaWVyKHJlY29yZCwgcm9vdEVsKVxuICB3cml0ZUtpbmQocmVjb3JkLCByb290RWwpXG4gIGZpZWxkQ2hhbmdlZCgnb3duZXJPcmdhbml6YXRpb24nKSAmJiB3cml0ZU93bmVyT3JnYW5pemF0aW9uKHJlY29yZCwgcm9vdEVsKVxuICBmaWVsZENoYW5nZWQoJ3JlY29yZFVwZGF0ZWQnKSAmJiB3cml0ZVJlY29yZFVwZGF0ZWQocmVjb3JkLCByb290RWwpXG4gIHdyaXRlVGl0bGUocmVjb3JkLCByb290RWwpXG4gIHdyaXRlQWJzdHJhY3QocmVjb3JkLCByb290RWwpXG4gIGZpZWxkQ2hhbmdlZCgnY29udGFjdHMnKSAmJiB3cml0ZUNvbnRhY3RzKHJlY29yZCwgcm9vdEVsKVxuICBmaWVsZENoYW5nZWQoJ2tleXdvcmRzJykgJiYgd3JpdGVLZXl3b3JkcyhyZWNvcmQsIHJvb3RFbClcbiAgZmllbGRDaGFuZ2VkKCd0b3BpY3MnKSAmJiB3cml0ZVRvcGljcyhyZWNvcmQsIHJvb3RFbClcbiAgZmllbGRDaGFuZ2VkKCdsZWdhbENvbnN0cmFpbnRzJykgJiYgd3JpdGVMZWdhbENvbnN0cmFpbnRzKHJlY29yZCwgcm9vdEVsKVxuICBmaWVsZENoYW5nZWQoJ3NlY3VyaXR5Q29uc3RyYWludHMnKSAmJlxuICAgIHdyaXRlU2VjdXJpdHlDb25zdHJhaW50cyhyZWNvcmQsIHJvb3RFbClcbiAgZmllbGRDaGFuZ2VkKCdsaWNlbnNlcycpICYmIHdyaXRlTGljZW5zZXMocmVjb3JkLCByb290RWwpXG4gIGZpZWxkQ2hhbmdlZCgnb3RoZXJDb25zdHJhaW50cycpICYmIHdyaXRlT3RoZXJDb25zdHJhaW50cyhyZWNvcmQsIHJvb3RFbClcblxuICBpZiAocmVjb3JkLmtpbmQgPT09ICdkYXRhc2V0Jykge1xuICAgIHdyaXRlU3RhdHVzKHJlY29yZCwgcm9vdEVsKVxuICAgIGZpZWxkQ2hhbmdlZCgndXBkYXRlRnJlcXVlbmN5JykgJiYgd3JpdGVVcGRhdGVGcmVxdWVuY3kocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdkYXRhc2V0Q3JlYXRlZCcpICYmIHdyaXRlRGF0YXNldENyZWF0ZWQocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdkYXRhc2V0VXBkYXRlZCcpICYmIHdyaXRlRGF0YXNldFVwZGF0ZWQocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdzcGF0aWFsUmVwcmVzZW50YXRpb24nKSAmJlxuICAgICAgd3JpdGVTcGF0aWFsUmVwcmVzZW50YXRpb24ocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdvdmVydmlld3MnKSAmJiB3cml0ZUdyYXBoaWNPdmVydmlld3MocmVjb3JkLCByb290RWwpXG4gICAgZmllbGRDaGFuZ2VkKCdkaXN0cmlidXRpb25zJykgJiYgd3JpdGVEaXN0cmlidXRpb25zKHJlY29yZCwgcm9vdEVsKVxuICAgIHdyaXRlTGluZWFnZShyZWNvcmQsIHJvb3RFbClcbiAgfSBlbHNlIHtcbiAgICBmaWVsZENoYW5nZWQoJ29ubGluZVJlc291cmNlcycpICYmIHdyaXRlT25saW5lUmVzb3VyY2VzKHJlY29yZCwgcm9vdEVsKVxuICB9XG5cbiAgY29uc3QgbmV3RG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudChyb290RWwpXG4gIHJldHVybiB4bWxUb1N0cmluZyhuZXdEb2N1bWVudClcbn1cbiJdfQ==
|