arelle-release 2.37.4__py3-none-any.whl → 2.37.5__py3-none-any.whl
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.
Potentially problematic release.
This version of arelle-release might be problematic. Click here for more details.
- arelle/DisclosureSystem.py +10 -1
- arelle/FileSource.py +19 -7
- arelle/_version.py +2 -2
- arelle/plugin/validate/NL/PluginValidationDataExtension.py +30 -7
- arelle/plugin/validate/NL/ValidationPluginExtension.py +10 -5
- arelle/plugin/validate/NL/rules/nl_kvk.py +107 -3
- {arelle_release-2.37.4.dist-info → arelle_release-2.37.5.dist-info}/METADATA +1 -1
- {arelle_release-2.37.4.dist-info → arelle_release-2.37.5.dist-info}/RECORD +16 -16
- {arelle_release-2.37.4.dist-info → arelle_release-2.37.5.dist-info}/WHEEL +1 -1
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-04-invalid.xbrl +5 -0
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-04-invalid.xbrl +5 -0
- tests/resources/conformance_suites/nl_nt18/fr_nl/1-04-invalid.xbrl +5 -0
- tests/resources/conformance_suites/nl_nt19/fr_nl/1-04-invalid.xbrl +5 -0
- {arelle_release-2.37.4.dist-info → arelle_release-2.37.5.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.4.dist-info → arelle_release-2.37.5.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.4.dist-info → arelle_release-2.37.5.dist-info}/top_level.txt +0 -0
arelle/DisclosureSystem.py
CHANGED
|
@@ -396,7 +396,7 @@ class DisclosureSystem:
|
|
|
396
396
|
level=logging.ERROR)
|
|
397
397
|
etree.clear_error_log()
|
|
398
398
|
|
|
399
|
-
def mappedUrl(self, url):
|
|
399
|
+
def mappedUrl(self, url: str) -> str:
|
|
400
400
|
if url in self.mappedFiles:
|
|
401
401
|
mappedUrl = self.mappedFiles[url]
|
|
402
402
|
else: # handle mapped paths
|
|
@@ -407,6 +407,15 @@ class DisclosureSystem:
|
|
|
407
407
|
break
|
|
408
408
|
return mappedUrl
|
|
409
409
|
|
|
410
|
+
def isMappedUrl(self, url: str) -> bool:
|
|
411
|
+
if url in self.mappedFiles:
|
|
412
|
+
return True
|
|
413
|
+
else: # handle mapped paths
|
|
414
|
+
for mapFrom, mapTo in self.mappedPaths:
|
|
415
|
+
if url.startswith(mapFrom):
|
|
416
|
+
return True
|
|
417
|
+
return False
|
|
418
|
+
|
|
410
419
|
def uriAuthorityValid(self, uri):
|
|
411
420
|
if self.standardTaxonomiesUrl:
|
|
412
421
|
return UrlUtil.authority(uri) in self.standardAuthorities
|
arelle/FileSource.py
CHANGED
|
@@ -191,7 +191,11 @@ class FileSource:
|
|
|
191
191
|
if not self.isZip:
|
|
192
192
|
# Try to detect zip files with unrecognized file extensions.
|
|
193
193
|
try:
|
|
194
|
-
|
|
194
|
+
if self.cntlr is not None and hasattr(self.cntlr, "modelManager"):
|
|
195
|
+
basefile = self.cntlr.webCache.getfilename( # cache remapping
|
|
196
|
+
self.cntlr.modelManager.disclosureSystem.mappedUrl(self.url)) # local remapping
|
|
197
|
+
else:
|
|
198
|
+
basefile = self.url
|
|
195
199
|
if basefile:
|
|
196
200
|
with openFileStream(self.cntlr, basefile, 'rb') as fileStream:
|
|
197
201
|
self.isZip = zipfile.is_zipfile(fileStream)
|
|
@@ -213,7 +217,8 @@ class FileSource:
|
|
|
213
217
|
elif checkIfXmlIsEis:
|
|
214
218
|
try:
|
|
215
219
|
assert self.cntlr is not None
|
|
216
|
-
_filename = self.cntlr.webCache.getfilename(
|
|
220
|
+
_filename = self.cntlr.webCache.getfilename(
|
|
221
|
+
self.cntlr.modelManager.disclosureSystem.mappedUrl(self.url))
|
|
217
222
|
assert _filename is not None
|
|
218
223
|
file = open(_filename, errors='replace')
|
|
219
224
|
l = file.read(256) # may have comments before first element
|
|
@@ -234,7 +239,8 @@ class FileSource:
|
|
|
234
239
|
if self.isValid and not self.isOpen:
|
|
235
240
|
if (self.isZip or self.isTarGz or self.isEis or self.isXfd or self.isRss or self.isInstalledTaxonomyPackage) and self.cntlr:
|
|
236
241
|
assert isinstance(self.url, str)
|
|
237
|
-
self.basefile = self.cntlr.webCache.getfilename(
|
|
242
|
+
self.basefile = self.cntlr.webCache.getfilename(
|
|
243
|
+
self.cntlr.modelManager.disclosureSystem.mappedUrl(self.url), reload=reloadCache)
|
|
238
244
|
else:
|
|
239
245
|
self.basefile = self.url
|
|
240
246
|
self.baseurl = self.url # url gets changed by selection
|
|
@@ -473,8 +479,11 @@ class FileSource:
|
|
|
473
479
|
|
|
474
480
|
def isMappedUrl(self, url: str) -> bool:
|
|
475
481
|
if self.mappedPaths is not None:
|
|
476
|
-
|
|
477
|
-
for mapFrom in self.mappedPaths)
|
|
482
|
+
if any(url.startswith(mapFrom)
|
|
483
|
+
for mapFrom in self.mappedPaths):
|
|
484
|
+
return True
|
|
485
|
+
if self.cntlr and self.cntlr.modelManager.disclosureSystem.isMappedUrl(url):
|
|
486
|
+
return True
|
|
478
487
|
return False
|
|
479
488
|
|
|
480
489
|
def mappedUrl(self, url: str) -> str:
|
|
@@ -483,6 +492,8 @@ class FileSource:
|
|
|
483
492
|
if url.startswith(mapFrom):
|
|
484
493
|
url = mapTo + url[len(mapFrom):]
|
|
485
494
|
break
|
|
495
|
+
if self.cntlr:
|
|
496
|
+
return self.cntlr.modelManager.disclosureSystem.mappedUrl(url)
|
|
486
497
|
return url
|
|
487
498
|
|
|
488
499
|
def fileSourceContainingFilepath(self, filepath: str | None) -> FileSource | None:
|
|
@@ -807,11 +818,12 @@ def openFileStream(
|
|
|
807
818
|
cntlr
|
|
808
819
|
and hasattr(cntlr, "modelManager")
|
|
809
820
|
): # may be called early in initialization for PluginManager
|
|
810
|
-
filepath = cntlr.modelManager.disclosureSystem.mappedUrl(filepath)
|
|
821
|
+
filepath = cntlr.modelManager.disclosureSystem.mappedUrl(filepath)
|
|
811
822
|
if archiveFilenameParts(filepath): # file is in an archive
|
|
812
823
|
return openFileSource(filepath, cntlr).file(filepath, binary='b' in mode, encoding=encoding)[0]
|
|
813
824
|
if isHttpUrl(filepath) and cntlr:
|
|
814
|
-
_cacheFilepath = cntlr.webCache.getfilename(
|
|
825
|
+
_cacheFilepath = cntlr.webCache.getfilename(
|
|
826
|
+
cntlr.modelManager.disclosureSystem.mappedUrl(filepath), normalize=True) # normalize is separate step in ModelDocument retrieval, combined here
|
|
815
827
|
if _cacheFilepath is None:
|
|
816
828
|
raise OSError(_("Unable to open file: {0}.").format(filepath))
|
|
817
829
|
filepath = _cacheFilepath
|
arelle/_version.py
CHANGED
|
@@ -21,22 +21,25 @@ XBRLI_IDENTIFIER_SCHEMA = 'http://www.kvk.nl/kvk-id'
|
|
|
21
21
|
|
|
22
22
|
@dataclass
|
|
23
23
|
class PluginValidationDataExtension(PluginData):
|
|
24
|
-
|
|
25
|
-
financialReportingPeriodCurrentEndDateQn: QName
|
|
26
|
-
financialReportingPeriodPreviousStartDateQn: QName
|
|
27
|
-
financialReportingPeriodPreviousEndDateQn: QName
|
|
28
|
-
formattedExplanationItemTypeQn: QName
|
|
24
|
+
chamberOfCommerceRegistrationNumberQn: QName
|
|
29
25
|
documentAdoptionDateQn: QName
|
|
30
26
|
documentAdoptionStatusQn: QName
|
|
31
27
|
documentResubmissionUnsurmountableInaccuraciesQn: QName
|
|
32
28
|
entrypointRoot: str
|
|
33
29
|
entrypoints: set[str]
|
|
30
|
+
financialReportingPeriodCurrentStartDateQn: QName
|
|
31
|
+
financialReportingPeriodCurrentEndDateQn: QName
|
|
32
|
+
financialReportingPeriodPreviousStartDateQn: QName
|
|
33
|
+
financialReportingPeriodPreviousEndDateQn: QName
|
|
34
|
+
formattedExplanationItemTypeQn: QName
|
|
34
35
|
textFormattingSchemaPath: str
|
|
35
36
|
textFormattingWrapper: str
|
|
36
37
|
|
|
37
38
|
_contextsByDocument: dict[str, list[ModelContext]] | None = None
|
|
39
|
+
_contextsWithImproperContent: list[ModelContext | None] | None = None
|
|
38
40
|
_contextsWithPeriodTime: list[ModelContext | None] | None = None
|
|
39
41
|
_contextsWithPeriodTimeZone: list[ModelContext | None] | None = None
|
|
42
|
+
_contextsWithSegments: list[ModelContext | None] | None = None
|
|
40
43
|
_entityIdentifiers: set[tuple[str, str]] | None = None
|
|
41
44
|
_factsByDocument: dict[str, list[ModelFact]] | None = None
|
|
42
45
|
_unitsByDocument: dict[str, list[ModelUnit]] | None = None
|
|
@@ -51,8 +54,10 @@ class PluginValidationDataExtension(PluginData):
|
|
|
51
54
|
return self._contextsByDocument
|
|
52
55
|
|
|
53
56
|
def checkContexts(self, allContexts: dict[str, list[ModelContext]]) -> None:
|
|
57
|
+
contextsWithImproperContent: list[ModelContext | None] = []
|
|
54
58
|
contextsWithPeriodTime: list[ModelContext | None] = []
|
|
55
59
|
contextsWithPeriodTimeZone: list[ModelContext | None] = []
|
|
60
|
+
contextsWithSegments: list[ModelContext | None] = []
|
|
56
61
|
datetimePattern = lexicalPatterns["XBRLI_DATEUNION"]
|
|
57
62
|
for contexts in allContexts.values():
|
|
58
63
|
for context in contexts:
|
|
@@ -66,8 +71,14 @@ class PluginValidationDataExtension(PluginData):
|
|
|
66
71
|
contextsWithPeriodTime.append(context)
|
|
67
72
|
if m.group(3):
|
|
68
73
|
contextsWithPeriodTimeZone.append(context)
|
|
74
|
+
if context.hasSegment:
|
|
75
|
+
contextsWithSegments.append(context)
|
|
76
|
+
if context.nonDimValues("scenario"): # type: ignore[no-untyped-call]
|
|
77
|
+
contextsWithImproperContent.append(context)
|
|
78
|
+
self._contextsWithImproperContent = contextsWithImproperContent
|
|
69
79
|
self._contextsWithPeriodTime = contextsWithPeriodTime
|
|
70
80
|
self._contextsWithPeriodTimeZone = contextsWithPeriodTimeZone
|
|
81
|
+
self._contextsWithSegments = contextsWithSegments
|
|
71
82
|
|
|
72
83
|
def entityIdentifiersInDocument(self, modelXbrl: ModelXbrl) -> set[tuple[str, str]]:
|
|
73
84
|
if self._entityIdentifiers is not None:
|
|
@@ -84,18 +95,30 @@ class PluginValidationDataExtension(PluginData):
|
|
|
84
95
|
self._factsByDocument = dict(factsByDocument)
|
|
85
96
|
return self._factsByDocument
|
|
86
97
|
|
|
87
|
-
def
|
|
98
|
+
def getContextsWithImproperContent(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
|
|
99
|
+
if self._contextsWithImproperContent is None:
|
|
100
|
+
self.checkContexts(self.contextsByDocument(modelXbrl))
|
|
101
|
+
assert(self._contextsWithImproperContent is not None)
|
|
102
|
+
return self._contextsWithImproperContent
|
|
103
|
+
|
|
104
|
+
def getContextsWithPeriodTime(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
|
|
88
105
|
if self._contextsWithPeriodTime is None:
|
|
89
106
|
self.checkContexts(self.contextsByDocument(modelXbrl))
|
|
90
107
|
assert(self._contextsWithPeriodTime is not None)
|
|
91
108
|
return self._contextsWithPeriodTime
|
|
92
109
|
|
|
93
|
-
def
|
|
110
|
+
def getContextsWithPeriodTimeZone(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
|
|
94
111
|
if self._contextsWithPeriodTimeZone is None:
|
|
95
112
|
self.checkContexts(self.contextsByDocument(modelXbrl))
|
|
96
113
|
assert (self._contextsWithPeriodTimeZone is not None)
|
|
97
114
|
return self._contextsWithPeriodTimeZone
|
|
98
115
|
|
|
116
|
+
def getContextsWithSegments(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
|
|
117
|
+
if self._contextsWithSegments is None:
|
|
118
|
+
self.checkContexts(self.contextsByDocument(modelXbrl))
|
|
119
|
+
assert(self._contextsWithSegments is not None)
|
|
120
|
+
return self._contextsWithSegments
|
|
121
|
+
|
|
99
122
|
def unitsByDocument(self, modelXbrl: ModelXbrl) -> dict[str, list[ModelUnit]]:
|
|
100
123
|
if self._unitsByDocument is not None:
|
|
101
124
|
return self._unitsByDocument
|
|
@@ -23,6 +23,7 @@ class ValidationPluginExtension(ValidationPlugin):
|
|
|
23
23
|
jenvNamespace = 'http://www.nltaxonomie.nl/nt16/jenv/20211208/dictionary/jenv-bw2-data'
|
|
24
24
|
kvkINamespace = 'http://www.nltaxonomie.nl/nt16/kvk/20211208/dictionary/kvk-data'
|
|
25
25
|
nlTypesNamespace = 'http://www.nltaxonomie.nl/nt16/sbr/20210301/dictionary/nl-types'
|
|
26
|
+
titel9Namespace = ''
|
|
26
27
|
entrypointRoot = 'http://www.nltaxonomie.nl/nt16/kvk/20211208/entrypoints/'
|
|
27
28
|
entrypoints = {entrypointRoot + e for e in [
|
|
28
29
|
'kvk-rpt-jaarverantwoording-2021-ifrs-full.xsd',
|
|
@@ -59,6 +60,7 @@ class ValidationPluginExtension(ValidationPlugin):
|
|
|
59
60
|
jenvNamespace = 'http://www.nltaxonomie.nl/nt17/jenv/20221214/dictionary/jenv-bw2-data'
|
|
60
61
|
kvkINamespace = 'http://www.nltaxonomie.nl/nt17/kvk/20221214/dictionary/kvk-data'
|
|
61
62
|
nlTypesNamespace = 'http://www.nltaxonomie.nl/nt17/sbr/20220301/dictionary/nl-types'
|
|
63
|
+
titel9Namespace = ''
|
|
62
64
|
entrypointRoot = 'http://www.nltaxonomie.nl/nt17/kvk/20221214/entrypoints/'
|
|
63
65
|
entrypoints = {entrypointRoot + e for e in [
|
|
64
66
|
'kvk-rpt-jaarverantwoording-2022-ifrs-full.xsd',
|
|
@@ -96,6 +98,7 @@ class ValidationPluginExtension(ValidationPlugin):
|
|
|
96
98
|
jenvNamespace = 'http://www.nltaxonomie.nl/nt18/jenv/20231213/dictionary/jenv-bw2-data'
|
|
97
99
|
kvkINamespace = 'http://www.nltaxonomie.nl/nt18/kvk/20231213/dictionary/kvk-data'
|
|
98
100
|
nlTypesNamespace = 'http://www.nltaxonomie.nl/nt18/sbr/20230301/dictionary/nl-types'
|
|
101
|
+
titel9Namespace = ''
|
|
99
102
|
entrypointRoot = 'http://www.nltaxonomie.nl/nt18/kvk/20231213/entrypoints/'
|
|
100
103
|
entrypoints = {entrypointRoot + e for e in [
|
|
101
104
|
'kvk-rpt-jaarverantwoording-2023-ifrs-full.xsd',
|
|
@@ -133,6 +136,7 @@ class ValidationPluginExtension(ValidationPlugin):
|
|
|
133
136
|
jenvNamespace = 'http://www.nltaxonomie.nl/nt19/jenv/20241211/dictionary/jenv-bw2-data'
|
|
134
137
|
kvkINamespace = 'http://www.nltaxonomie.nl/nt19/kvk/20241211/dictionary/kvk-data'
|
|
135
138
|
nlTypesNamespace = 'http://www.nltaxonomie.nl/nt19/sbr/20240301/dictionary/nl-types'
|
|
139
|
+
titel9Namespace = 'https://www.nltaxonomie.nl/jenv/2024-03-31/bw2-titel9-cor'
|
|
136
140
|
entrypointRoot = 'http://www.nltaxonomie.nl/nt19/kvk/20241211/entrypoints/'
|
|
137
141
|
entrypoints = {entrypointRoot + e for e in [
|
|
138
142
|
'kvk-rpt-jaarverantwoording-2024-ifrs-full.xsd',
|
|
@@ -170,16 +174,17 @@ class ValidationPluginExtension(ValidationPlugin):
|
|
|
170
174
|
raise ValueError(f'Invalid NL disclosure system: {disclosureSystem}')
|
|
171
175
|
return PluginValidationDataExtension(
|
|
172
176
|
self.name,
|
|
173
|
-
|
|
174
|
-
financialReportingPeriodCurrentEndDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodCurrentEndDate'),
|
|
175
|
-
financialReportingPeriodPreviousStartDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodPreviousStartDate'),
|
|
176
|
-
financialReportingPeriodPreviousEndDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodPreviousEndDate'),
|
|
177
|
-
formattedExplanationItemTypeQn=qname(f'{{{nlTypesNamespace}}}formattedExplanationItemType'),
|
|
177
|
+
chamberOfCommerceRegistrationNumberQn=qname(f'{{{titel9Namespace}}}ChamberOfCommerceRegistrationNumber'),
|
|
178
178
|
documentAdoptionDateQn=qname(f'{{{jenvNamespace}}}DocumentAdoptionDate'),
|
|
179
179
|
documentAdoptionStatusQn=qname(f'{{{jenvNamespace}}}DocumentAdoptionStatus'),
|
|
180
180
|
documentResubmissionUnsurmountableInaccuraciesQn=qname(f'{{{kvkINamespace}}}DocumentResubmissionDueToUnsurmountableInaccuracies'),
|
|
181
181
|
entrypointRoot=entrypointRoot,
|
|
182
182
|
entrypoints=entrypoints,
|
|
183
|
+
financialReportingPeriodCurrentStartDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodCurrentStartDate'),
|
|
184
|
+
financialReportingPeriodCurrentEndDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodCurrentEndDate'),
|
|
185
|
+
financialReportingPeriodPreviousStartDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodPreviousStartDate'),
|
|
186
|
+
financialReportingPeriodPreviousEndDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodPreviousEndDate'),
|
|
187
|
+
formattedExplanationItemTypeQn=qname(f'{{{nlTypesNamespace}}}formattedExplanationItemType'),
|
|
183
188
|
textFormattingSchemaPath='sbr-text-formatting.xsd',
|
|
184
189
|
textFormattingWrapper='<formattedText xmlns="http://www.nltaxonomie.nl/2017/xbrl/sbr-text-formatting">{}</formattedText>',
|
|
185
190
|
)
|
|
@@ -4,6 +4,8 @@ See COPYRIGHT.md for copyright information.
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
6
|
from datetime import date, timedelta
|
|
7
|
+
|
|
8
|
+
from arelle.XmlValidateConst import VALID
|
|
7
9
|
from dateutil import relativedelta
|
|
8
10
|
from collections.abc import Iterable
|
|
9
11
|
from typing import Any, cast, TYPE_CHECKING
|
|
@@ -109,7 +111,7 @@ def rule_nl_kvk_3_1_2_1(
|
|
|
109
111
|
"""
|
|
110
112
|
NL-KVK.3.1.2.1: xbrli:startDate, xbrli:endDate, xbrli:instant formatted as yyyy-mm-dd without time.
|
|
111
113
|
"""
|
|
112
|
-
contextsWithPeriodTime = pluginData.
|
|
114
|
+
contextsWithPeriodTime = pluginData.getContextsWithPeriodTime(val.modelXbrl)
|
|
113
115
|
if len(contextsWithPeriodTime) !=0:
|
|
114
116
|
yield Validation.error(
|
|
115
117
|
codes='NL.NL-KVK-3.1.2.1',
|
|
@@ -133,10 +135,112 @@ def rule_nl_kvk_3_1_2_2(
|
|
|
133
135
|
"""
|
|
134
136
|
NL-KVK.3.1.2.1: xbrli:startDate, xbrli:endDate, xbrli:instant format to be formatted as yyyy-mm-dd without time zone.
|
|
135
137
|
"""
|
|
136
|
-
contextsWithPeriodTimeZone = pluginData.
|
|
137
|
-
if len(
|
|
138
|
+
contextsWithPeriodTimeZone = pluginData.getContextsWithPeriodTimeZone(val.modelXbrl)
|
|
139
|
+
if len(contextsWithPeriodTimeZone) !=0:
|
|
138
140
|
yield Validation.error(
|
|
139
141
|
codes='NL.NL-KVK-3.1.2.2',
|
|
140
142
|
msg=_('xbrli:startDate, xbrli:endDate, xbrli:instant must be formatted as yyyy-mm-dd without time zone'),
|
|
141
143
|
modelObject = contextsWithPeriodTimeZone
|
|
142
144
|
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
@validation(
|
|
148
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
149
|
+
disclosureSystems=[
|
|
150
|
+
DISCLOSURE_SYSTEM_INLINE_NT19
|
|
151
|
+
],
|
|
152
|
+
)
|
|
153
|
+
def rule_nl_kvk_3_1_3_1 (
|
|
154
|
+
pluginData: PluginValidationDataExtension,
|
|
155
|
+
val: ValidateXbrl,
|
|
156
|
+
*args: Any,
|
|
157
|
+
**kwargs: Any,
|
|
158
|
+
) -> Iterable[Validation]:
|
|
159
|
+
"""
|
|
160
|
+
NL-KVK.3.1.3.1: xbrli:segment must not be used in contexts.
|
|
161
|
+
"""
|
|
162
|
+
contextsWithSegments = pluginData.getContextsWithSegments(val.modelXbrl)
|
|
163
|
+
if len(contextsWithSegments) !=0:
|
|
164
|
+
yield Validation.error(
|
|
165
|
+
codes='NL.NL-KVK-3.1.3.1',
|
|
166
|
+
msg=_('xbrli:segment must not be used in contexts.'),
|
|
167
|
+
modelObject = contextsWithSegments
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
@validation(
|
|
172
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
173
|
+
disclosureSystems=[
|
|
174
|
+
DISCLOSURE_SYSTEM_INLINE_NT19
|
|
175
|
+
],
|
|
176
|
+
)
|
|
177
|
+
def rule_nl_kvk_3_1_3_2 (
|
|
178
|
+
pluginData: PluginValidationDataExtension,
|
|
179
|
+
val: ValidateXbrl,
|
|
180
|
+
*args: Any,
|
|
181
|
+
**kwargs: Any,
|
|
182
|
+
) -> Iterable[Validation]:
|
|
183
|
+
"""
|
|
184
|
+
NL-KVK.3.1.3.2: xbrli:scenario must only contain content defined in XBRL Dimensions specification.
|
|
185
|
+
"""
|
|
186
|
+
contextsWithImproperContent = pluginData.getContextsWithImproperContent(val.modelXbrl)
|
|
187
|
+
if len(contextsWithImproperContent) !=0:
|
|
188
|
+
yield Validation.error(
|
|
189
|
+
codes='NL.NL-KVK-3.1.3.2',
|
|
190
|
+
msg=_('xbrli:scenario must only contain content defined in XBRL Dimensions specification.'),
|
|
191
|
+
modelObject = contextsWithImproperContent
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@validation(
|
|
196
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
197
|
+
disclosureSystems=[
|
|
198
|
+
DISCLOSURE_SYSTEM_INLINE_NT19
|
|
199
|
+
],
|
|
200
|
+
)
|
|
201
|
+
def rule_nl_kvk_3_1_4_1 (
|
|
202
|
+
pluginData: PluginValidationDataExtension,
|
|
203
|
+
val: ValidateXbrl,
|
|
204
|
+
*args: Any,
|
|
205
|
+
**kwargs: Any,
|
|
206
|
+
) -> Iterable[Validation]:
|
|
207
|
+
"""
|
|
208
|
+
NL-KVK.3.1.4.1: All entity identifiers and schemes must have identical content.
|
|
209
|
+
"""
|
|
210
|
+
entityIdentifierValues = pluginData.entityIdentifiersInDocument(val.modelXbrl)
|
|
211
|
+
if len(entityIdentifierValues) >1:
|
|
212
|
+
yield Validation.error(
|
|
213
|
+
codes='NL.NL-KVK-3.1.4.1',
|
|
214
|
+
msg=_('All entity identifiers and schemes must have identical content.'),
|
|
215
|
+
modelObject = entityIdentifierValues
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
@validation(
|
|
221
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
222
|
+
disclosureSystems=[
|
|
223
|
+
DISCLOSURE_SYSTEM_INLINE_NT19
|
|
224
|
+
],
|
|
225
|
+
)
|
|
226
|
+
def rule_nl_kvk_3_1_4_2 (
|
|
227
|
+
pluginData: PluginValidationDataExtension,
|
|
228
|
+
val: ValidateXbrl,
|
|
229
|
+
*args: Any,
|
|
230
|
+
**kwargs: Any,
|
|
231
|
+
) -> Iterable[Validation]:
|
|
232
|
+
"""
|
|
233
|
+
NL-KVK.3.1.4.2: xbrli:identifier value must be identical to bw2-titel9:ChamberOfCommerceRegistrationNumber fact value.
|
|
234
|
+
"""
|
|
235
|
+
registrationNumberFacts = val.modelXbrl.factsByQname.get(pluginData.chamberOfCommerceRegistrationNumberQn, set())
|
|
236
|
+
if len(registrationNumberFacts) > 0:
|
|
237
|
+
regFact = next(iter(registrationNumberFacts))
|
|
238
|
+
if regFact.xValid >= VALID and regFact.xValue != regFact.context.entityIdentifier[1]:
|
|
239
|
+
yield Validation.error(
|
|
240
|
+
codes='NL-KVK.3.1.4.2',
|
|
241
|
+
msg=_("xbrli:identifier value must be identical to bw2-titel9:ChamberOfCommerceRegistrationNumber fact value.").format(
|
|
242
|
+
regFact.xValue,
|
|
243
|
+
regFact.context.entityIdentifier[1]
|
|
244
|
+
),
|
|
245
|
+
modelObject=regFact
|
|
246
|
+
)
|
|
@@ -20,8 +20,8 @@ arelle/DialogPluginManager.py,sha256=cr7GWNuYttg7H0pM5vaCPuxgDVgtZzR6ZamX957_1w8
|
|
|
20
20
|
arelle/DialogRssWatch.py,sha256=mjc4pqyFDISY4tQtME0uSRQ3NlcWnNsOsMu9Zj8tTd0,13789
|
|
21
21
|
arelle/DialogURL.py,sha256=JH88OPFf588E8RW90uMaieok7A_4kOAURQ8kHWVhnao,4354
|
|
22
22
|
arelle/DialogUserPassword.py,sha256=kWPlCCihhwvsykDjanME9qBDtv6cxZlsrJyoMqiRep4,13769
|
|
23
|
-
arelle/DisclosureSystem.py,sha256=
|
|
24
|
-
arelle/FileSource.py,sha256=
|
|
23
|
+
arelle/DisclosureSystem.py,sha256=g3XXMjuyKJk2eoqvHGqoyIs2bMfcODwOeISDRCcY9gc,24749
|
|
24
|
+
arelle/FileSource.py,sha256=FXqXCd7FZ7p7DH4yAYDHYYZ_43P8H3nreT8LJpoWu1M,46643
|
|
25
25
|
arelle/FunctionCustom.py,sha256=d1FsBG14eykvpLpgaXpN8IdxnlG54dfGcsXPYfdpA9Q,5880
|
|
26
26
|
arelle/FunctionFn.py,sha256=BcZKah1rpfquSVPwjvknM1pgFXOnK4Hr1e_ArG_mcJY,38058
|
|
27
27
|
arelle/FunctionIxt.py,sha256=8JELGh1l4o8Ul4_G7JgwX8Ebch9it2DblI6OkfL33Cw,80082
|
|
@@ -123,7 +123,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
|
|
|
123
123
|
arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
|
|
124
124
|
arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
|
|
125
125
|
arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
126
|
-
arelle/_version.py,sha256=
|
|
126
|
+
arelle/_version.py,sha256=rerVv2bkyHju_24j_qkXddEpdbpWMlSRnKzm4NdB1lc,513
|
|
127
127
|
arelle/typing.py,sha256=Ct5lrNKRow_o9CraMEXNza8nFsJ_iGIKoUeGfPs2dxI,1084
|
|
128
128
|
arelle/api/Session.py,sha256=O8zpg7MJys9uxwwHf8OsSlZxpPdq7A3ONyY39Q4A3Kc,6218
|
|
129
129
|
arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
|
|
@@ -378,8 +378,8 @@ arelle/plugin/validate/FERC/__init__.py,sha256=V4fXcFKBsjFFPs9_1NhvDjWpEQCoQM0tR
|
|
|
378
378
|
arelle/plugin/validate/FERC/config.xml,sha256=bn9b8eCqJA1J62rYq1Nz85wJrMGAahVmmnIUQZyerjo,1919
|
|
379
379
|
arelle/plugin/validate/FERC/resources/ferc-utr.xml,sha256=OCRj9IUpdXATCBXKbB71apYx9kxcNtZW-Hq4s-avsRY,2663
|
|
380
380
|
arelle/plugin/validate/NL/DisclosureSystems.py,sha256=VFMcO8GJ8kIqhOV5McyEejaGJOR5JrmeF8GdFuS9IZw,174
|
|
381
|
-
arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=
|
|
382
|
-
arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=
|
|
381
|
+
arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=WuCXeiCYlDWDrQ--lRkTVTTuD_KTemgYsiWMxs6psxM,6259
|
|
382
|
+
arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=pRnKCXnHzwW3lDDZ_yk5d3Mia4d8a_qhqIvZK6kItTc,15216
|
|
383
383
|
arelle/plugin/validate/NL/__init__.py,sha256=9NkkfosHnAzJhBa84KDAsoyU7vd4_DO3GYKTSvKuOk8,2554
|
|
384
384
|
arelle/plugin/validate/NL/resources/config.xml,sha256=vu5pA-Iw6cgb5aep8LNLNPCkmG1QF6RTw3TCgEIest8,1102
|
|
385
385
|
arelle/plugin/validate/NL/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -387,7 +387,7 @@ arelle/plugin/validate/NL/rules/br_kvk.py,sha256=0SwKieWzTDm3YMsXPS6zTdgbk7_Z9Cz
|
|
|
387
387
|
arelle/plugin/validate/NL/rules/fg_nl.py,sha256=4Puq5wAjtK_iNd4wisH_R0Z_EKJ7MT2OCai5g4t1MPE,10714
|
|
388
388
|
arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=-_BLeWGoZ_f56p5VO4X40S45Ny3Ej-WK6Srei1KVSxU,8170
|
|
389
389
|
arelle/plugin/validate/NL/rules/fr_nl.py,sha256=-M1WtXp06khhtkfOVPCa-b8UbC281gk4YfDhvtAVlnI,31424
|
|
390
|
-
arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=
|
|
390
|
+
arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=_eUzTAFaT_hH3EXW7MPJjM7dmBa-P14TqPMFDw4xVPc,8163
|
|
391
391
|
arelle/plugin/validate/ROS/DisclosureSystems.py,sha256=rJ81mwQDYTi6JecFZ_zhqjjz3VNQRgjHNSh0wcQWAQE,18
|
|
392
392
|
arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
|
|
393
393
|
arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=FBhEp8t396vGdvCbMEimfcxmGiGnhXMen-yVLWnkFaI,758
|
|
@@ -707,7 +707,7 @@ arelle/utils/validate/ValidationPlugin.py,sha256=_WeRPXZUTCcSN3FLbFwiAe_2pAUTxZZ
|
|
|
707
707
|
arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
708
708
|
arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
709
709
|
arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
|
|
710
|
-
arelle_release-2.37.
|
|
710
|
+
arelle_release-2.37.5.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
|
|
711
711
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
712
712
|
tests/integration_tests/download_cache.py,sha256=jVMIVICsZjcVc9DCPPu3fCjF9_cWSS3tqSynhFs3oAM,4097
|
|
713
713
|
tests/integration_tests/integration_test_util.py,sha256=H7mncbv0T9ZeVyrtk9Hohe3k6jgcYykHkt-LGE-Q9aQ,10270
|
|
@@ -1154,7 +1154,7 @@ tests/resources/conformance_suites/nl_nt16/fr_nl/1-02-invalid.xbrl,sha256=Flu8pS
|
|
|
1154
1154
|
tests/resources/conformance_suites/nl_nt16/fr_nl/1-02-testcase.xml,sha256=TINl7JVLw6r6SkjgBagEH1MCFNaIBrnpl--IAoB4OMw,924
|
|
1155
1155
|
tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-invalid-doctype.xbrl,sha256=3Z3i7fLOjOFYj7tuX1w8lueek6bpQhj101Ephb6IVgE,129
|
|
1156
1156
|
tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-testcase.xml,sha256=kmlnCY0ZtdEVrpKyU3oSC_6RM1kKlOoG81sxtwPECwY,926
|
|
1157
|
-
tests/resources/conformance_suites/nl_nt16/fr_nl/1-04-invalid.xbrl,sha256=
|
|
1157
|
+
tests/resources/conformance_suites/nl_nt16/fr_nl/1-04-invalid.xbrl,sha256=9tRI4DoSXd7LHMLWLFnerIyOpxONPSsd-_0FsVozRlQ,1297
|
|
1158
1158
|
tests/resources/conformance_suites/nl_nt16/fr_nl/1-04-testcase.xml,sha256=Nkgds7HDnz7y1b6padzxfbMAMMKp2rNQhrfvlH_IaEs,889
|
|
1159
1159
|
tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-invalid-encoding.xbrl,sha256=dmjvwRnAM3ZiMlF0sDWAxa_Qb19sNtQ369kYEpDG7wU,194
|
|
1160
1160
|
tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-testcase.xml,sha256=dJi2elHTSN2wL3oTnFR3MbhWEmkl00EichkpP4wQLdg,936
|
|
@@ -1252,7 +1252,7 @@ tests/resources/conformance_suites/nl_nt17/fr_nl/1-02-invalid.xbrl,sha256=Flu8pS
|
|
|
1252
1252
|
tests/resources/conformance_suites/nl_nt17/fr_nl/1-02-testcase.xml,sha256=TINl7JVLw6r6SkjgBagEH1MCFNaIBrnpl--IAoB4OMw,924
|
|
1253
1253
|
tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-invalid-doctype.xbrl,sha256=3Z3i7fLOjOFYj7tuX1w8lueek6bpQhj101Ephb6IVgE,129
|
|
1254
1254
|
tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-testcase.xml,sha256=kmlnCY0ZtdEVrpKyU3oSC_6RM1kKlOoG81sxtwPECwY,926
|
|
1255
|
-
tests/resources/conformance_suites/nl_nt17/fr_nl/1-04-invalid.xbrl,sha256=
|
|
1255
|
+
tests/resources/conformance_suites/nl_nt17/fr_nl/1-04-invalid.xbrl,sha256=9tRI4DoSXd7LHMLWLFnerIyOpxONPSsd-_0FsVozRlQ,1297
|
|
1256
1256
|
tests/resources/conformance_suites/nl_nt17/fr_nl/1-04-testcase.xml,sha256=Nkgds7HDnz7y1b6padzxfbMAMMKp2rNQhrfvlH_IaEs,889
|
|
1257
1257
|
tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-invalid-encoding.xbrl,sha256=dmjvwRnAM3ZiMlF0sDWAxa_Qb19sNtQ369kYEpDG7wU,194
|
|
1258
1258
|
tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-testcase.xml,sha256=dJi2elHTSN2wL3oTnFR3MbhWEmkl00EichkpP4wQLdg,936
|
|
@@ -1350,7 +1350,7 @@ tests/resources/conformance_suites/nl_nt18/fr_nl/1-02-invalid.xbrl,sha256=Flu8pS
|
|
|
1350
1350
|
tests/resources/conformance_suites/nl_nt18/fr_nl/1-02-testcase.xml,sha256=TINl7JVLw6r6SkjgBagEH1MCFNaIBrnpl--IAoB4OMw,924
|
|
1351
1351
|
tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-invalid-doctype.xbrl,sha256=3Z3i7fLOjOFYj7tuX1w8lueek6bpQhj101Ephb6IVgE,129
|
|
1352
1352
|
tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-testcase.xml,sha256=kmlnCY0ZtdEVrpKyU3oSC_6RM1kKlOoG81sxtwPECwY,926
|
|
1353
|
-
tests/resources/conformance_suites/nl_nt18/fr_nl/1-04-invalid.xbrl,sha256=
|
|
1353
|
+
tests/resources/conformance_suites/nl_nt18/fr_nl/1-04-invalid.xbrl,sha256=9tRI4DoSXd7LHMLWLFnerIyOpxONPSsd-_0FsVozRlQ,1297
|
|
1354
1354
|
tests/resources/conformance_suites/nl_nt18/fr_nl/1-04-testcase.xml,sha256=Nkgds7HDnz7y1b6padzxfbMAMMKp2rNQhrfvlH_IaEs,889
|
|
1355
1355
|
tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-invalid-encoding.xbrl,sha256=dmjvwRnAM3ZiMlF0sDWAxa_Qb19sNtQ369kYEpDG7wU,194
|
|
1356
1356
|
tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-testcase.xml,sha256=dJi2elHTSN2wL3oTnFR3MbhWEmkl00EichkpP4wQLdg,936
|
|
@@ -1448,7 +1448,7 @@ tests/resources/conformance_suites/nl_nt19/fr_nl/1-02-invalid.xbrl,sha256=Flu8pS
|
|
|
1448
1448
|
tests/resources/conformance_suites/nl_nt19/fr_nl/1-02-testcase.xml,sha256=TINl7JVLw6r6SkjgBagEH1MCFNaIBrnpl--IAoB4OMw,924
|
|
1449
1449
|
tests/resources/conformance_suites/nl_nt19/fr_nl/1-03-invalid-doctype.xbrl,sha256=3Z3i7fLOjOFYj7tuX1w8lueek6bpQhj101Ephb6IVgE,129
|
|
1450
1450
|
tests/resources/conformance_suites/nl_nt19/fr_nl/1-03-testcase.xml,sha256=kmlnCY0ZtdEVrpKyU3oSC_6RM1kKlOoG81sxtwPECwY,926
|
|
1451
|
-
tests/resources/conformance_suites/nl_nt19/fr_nl/1-04-invalid.xbrl,sha256=
|
|
1451
|
+
tests/resources/conformance_suites/nl_nt19/fr_nl/1-04-invalid.xbrl,sha256=9tRI4DoSXd7LHMLWLFnerIyOpxONPSsd-_0FsVozRlQ,1297
|
|
1452
1452
|
tests/resources/conformance_suites/nl_nt19/fr_nl/1-04-testcase.xml,sha256=Nkgds7HDnz7y1b6padzxfbMAMMKp2rNQhrfvlH_IaEs,889
|
|
1453
1453
|
tests/resources/conformance_suites/nl_nt19/fr_nl/1-05-invalid-encoding.xbrl,sha256=dmjvwRnAM3ZiMlF0sDWAxa_Qb19sNtQ369kYEpDG7wU,194
|
|
1454
1454
|
tests/resources/conformance_suites/nl_nt19/fr_nl/1-05-testcase.xml,sha256=dJi2elHTSN2wL3oTnFR3MbhWEmkl00EichkpP4wQLdg,936
|
|
@@ -1555,8 +1555,8 @@ tests/unit_tests/arelle/oim/test_load.py,sha256=NxiUauQwJVfWAHbbpsMHGSU2d3Br8Pki
|
|
|
1555
1555
|
tests/unit_tests/arelle/plugin/test_plugin_imports.py,sha256=bdhIs9frAnFsdGU113yBk09_jis-z43dwUItMFYuSYM,1064
|
|
1556
1556
|
tests/unit_tests/arelle/plugin/validate/ESEF/ESEF_Current/test_validate_css_url.py,sha256=XHABmejQt7RlZ0udh7v42f2Xb2STGk_fSaIaJ9i2xo0,878
|
|
1557
1557
|
tests/unit_tests/arelle/utils/validate/test_decorator.py,sha256=ZS8FqIY1g-2FCbjF4UYm609dwViax6qBMRJSi0vfuhY,2482
|
|
1558
|
-
arelle_release-2.37.
|
|
1559
|
-
arelle_release-2.37.
|
|
1560
|
-
arelle_release-2.37.
|
|
1561
|
-
arelle_release-2.37.
|
|
1562
|
-
arelle_release-2.37.
|
|
1558
|
+
arelle_release-2.37.5.dist-info/METADATA,sha256=4Kw7oBfKyh0aON2AEk16a98SktKugAPZNfo3jey0Oww,9064
|
|
1559
|
+
arelle_release-2.37.5.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
|
|
1560
|
+
arelle_release-2.37.5.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
|
|
1561
|
+
arelle_release-2.37.5.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
|
|
1562
|
+
arelle_release-2.37.5.dist-info/RECORD,,
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE xbrl [
|
|
3
|
+
<!ENTITY reg "®">
|
|
4
|
+
<!ENTITY plus "+">
|
|
5
|
+
]>
|
|
1
6
|
<xbrl xmlns="http://www.xbrl.org/2003/instance" title="Test®"> <!-- CAUSE: disallowed named reference, in attribute -->
|
|
2
7
|
<!-- и й --> <!-- CAUSE: disallowed decimal numeric references, in comment -->
|
|
3
8
|
<!-- � ⃐ --> <!-- CAUSE: disallowed hexadecimal numeric references, in comment -->
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE xbrl [
|
|
3
|
+
<!ENTITY reg "®">
|
|
4
|
+
<!ENTITY plus "+">
|
|
5
|
+
]>
|
|
1
6
|
<xbrl xmlns="http://www.xbrl.org/2003/instance" title="Test®"> <!-- CAUSE: disallowed named reference, in attribute -->
|
|
2
7
|
<!-- и й --> <!-- CAUSE: disallowed decimal numeric references, in comment -->
|
|
3
8
|
<!-- � ⃐ --> <!-- CAUSE: disallowed hexadecimal numeric references, in comment -->
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE xbrl [
|
|
3
|
+
<!ENTITY reg "®">
|
|
4
|
+
<!ENTITY plus "+">
|
|
5
|
+
]>
|
|
1
6
|
<xbrl xmlns="http://www.xbrl.org/2003/instance" title="Test®"> <!-- CAUSE: disallowed named reference, in attribute -->
|
|
2
7
|
<!-- и й --> <!-- CAUSE: disallowed decimal numeric references, in comment -->
|
|
3
8
|
<!-- � ⃐ --> <!-- CAUSE: disallowed hexadecimal numeric references, in comment -->
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE xbrl [
|
|
3
|
+
<!ENTITY reg "®">
|
|
4
|
+
<!ENTITY plus "+">
|
|
5
|
+
]>
|
|
1
6
|
<xbrl xmlns="http://www.xbrl.org/2003/instance" title="Test®"> <!-- CAUSE: disallowed named reference, in attribute -->
|
|
2
7
|
<!-- и й --> <!-- CAUSE: disallowed decimal numeric references, in comment -->
|
|
3
8
|
<!-- � ⃐ --> <!-- CAUSE: disallowed hexadecimal numeric references, in comment -->
|
|
File without changes
|
|
File without changes
|
|
File without changes
|